<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Italo Vinicius</title>
    <description>The latest articles on DEV Community by Italo Vinicius (@it4lo_dev).</description>
    <link>https://dev.to/it4lo_dev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1132429%2F2a9c35e6-a13b-4c11-8011-0617de057c15.jpg</url>
      <title>DEV Community: Italo Vinicius</title>
      <link>https://dev.to/it4lo_dev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/it4lo_dev"/>
    <language>en</language>
    <item>
      <title>System Design: o que é e por onde começar?</title>
      <dc:creator>Italo Vinicius</dc:creator>
      <pubDate>Wed, 16 Sep 2026 17:06:46 +0000</pubDate>
      <link>https://dev.to/it4lo_dev/system-design-o-que-e-e-por-onde-comecar-5g20</link>
      <guid>https://dev.to/it4lo_dev/system-design-o-que-e-e-por-onde-comecar-5g20</guid>
      <description>&lt;p&gt;Nos últimos meses, comecei a estudar um assunto que aparece cada vez mais na rotina de desenvolvedores: &lt;strong&gt;System Design&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Apesar de já trabalhar há alguns anos com desenvolvimento de software, percebi que existe uma diferença importante entre saber implementar funcionalidades e saber projetar um sistema como um todo.&lt;/p&gt;

&lt;p&gt;Foi justamente essa diferença que me motivou a estudar o assunto.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é System Design?
&lt;/h2&gt;

&lt;p&gt;De forma simples, System Design é o processo de definir como diferentes componentes de um sistema vão se organizar e se comunicar para atender determinados requisitos.&lt;/p&gt;

&lt;p&gt;Quando desenvolvemos uma aplicação pequena, podemos pensar principalmente em coisas como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Qual endpoint preciso criar?&lt;/li&gt;
&lt;li&gt;Qual tabela preciso adicionar?&lt;/li&gt;
&lt;li&gt;Qual componente preciso implementar?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Conforme o sistema cresce, outras perguntas começam a aparecer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Quantas requisições o sistema precisa suportar?&lt;/li&gt;
&lt;li&gt;Como os dados serão armazenados?&lt;/li&gt;
&lt;li&gt;Como evitar que um único componente se torne um gargalo?&lt;/li&gt;
&lt;li&gt;O que acontece quando um serviço fica indisponível?&lt;/li&gt;
&lt;li&gt;Como escalar a aplicação?&lt;/li&gt;
&lt;li&gt;Onde utilizar cache?&lt;/li&gt;
&lt;li&gt;Quando utilizar filas?&lt;/li&gt;
&lt;li&gt;Como monitorar o sistema?&lt;/li&gt;
&lt;li&gt;Como garantir consistência dos dados?&lt;/li&gt;
&lt;li&gt;Como lidar com picos de tráfego?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;System Design está muito mais relacionado a essas decisões.&lt;/p&gt;

&lt;h2&gt;
  
  
  Um exemplo simples
&lt;/h2&gt;

&lt;p&gt;Imagine uma aplicação de e-commerce.&lt;/p&gt;

&lt;p&gt;Em uma primeira versão, poderíamos ter algo relativamente simples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Cliente
   ↓
API
   ↓
Banco de Dados
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para uma aplicação pequena, isso pode ser suficiente.&lt;/p&gt;

&lt;p&gt;Mas imagine que a aplicação cresça e passe a receber milhares de requisições simultâneas.&lt;/p&gt;

&lt;p&gt;Agora podemos começar a introduzir novos componentes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                    ┌──→ Cache
                    │
Cliente → Load Balancer → API → Banco de Dados
                    │
                    └──→ Message Queue → Workers
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cada componente resolve um problema específico.&lt;/p&gt;

&lt;p&gt;O &lt;strong&gt;Load Balancer&lt;/strong&gt; pode distribuir as requisições entre diferentes instâncias da aplicação.&lt;/p&gt;

&lt;p&gt;O &lt;strong&gt;Cache&lt;/strong&gt; pode evitar consultas repetitivas ao banco de dados.&lt;/p&gt;

&lt;p&gt;Uma &lt;strong&gt;Message Queue&lt;/strong&gt; pode permitir que determinadas operações sejam processadas de forma assíncrona.&lt;/p&gt;

&lt;p&gt;Os &lt;strong&gt;Workers&lt;/strong&gt; podem consumir essas mensagens e executar tarefas em segundo plano.&lt;/p&gt;

&lt;p&gt;O banco de dados continua sendo importante, mas agora não precisa necessariamente ser responsável por todo o trabalho.&lt;/p&gt;

&lt;h2&gt;
  
  
  System Design não significa simplesmente adicionar tecnologias
&lt;/h2&gt;

&lt;p&gt;Uma coisa que comecei a perceber estudando o assunto é que projetar sistemas não significa simplesmente adicionar Redis, Kafka, Kubernetes ou microsserviços porque são tecnologias populares.&lt;/p&gt;

&lt;p&gt;Cada componente adiciona complexidade.&lt;/p&gt;

&lt;p&gt;Se uma aplicação recebe poucas requisições e possui um domínio relativamente simples, introduzir dezenas de serviços pode criar mais problemas do que resolver.&lt;/p&gt;

&lt;p&gt;Por isso, uma parte importante de System Design é entender &lt;strong&gt;trade-offs&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Por exemplo:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Devemos utilizar cache?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A resposta não é simplesmente “sim”.&lt;/p&gt;

&lt;p&gt;Precisamos considerar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O dado é consultado frequentemente?&lt;/li&gt;
&lt;li&gt;Ele muda com muita frequência?&lt;/li&gt;
&lt;li&gt;Podemos aceitar dados temporariamente desatualizados?&lt;/li&gt;
&lt;li&gt;Qual será a estratégia de invalidação?&lt;/li&gt;
&lt;li&gt;O custo de manter o cache compensa?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A mesma lógica vale para bancos SQL vs. NoSQL, monólito vs. microsserviços, processamento síncrono vs. assíncrono e diversas outras decisões.&lt;/p&gt;

&lt;h2&gt;
  
  
  Requisitos funcionais e não funcionais
&lt;/h2&gt;

&lt;p&gt;Outro conceito importante é separar os requisitos do sistema.&lt;/p&gt;

&lt;p&gt;Os &lt;strong&gt;requisitos funcionais&lt;/strong&gt; descrevem o que o sistema precisa fazer.&lt;/p&gt;

&lt;p&gt;Por exemplo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Usuários podem criar uma conta.&lt;/li&gt;
&lt;li&gt;Usuários podem realizar pedidos.&lt;/li&gt;
&lt;li&gt;Administradores podem cancelar pedidos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Já os &lt;strong&gt;requisitos não funcionais&lt;/strong&gt; descrevem características relacionadas ao funcionamento do sistema.&lt;/p&gt;

&lt;p&gt;Por exemplo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Suportar 10.000 requisições por segundo.&lt;/li&gt;
&lt;li&gt;Ter disponibilidade de 99,9%.&lt;/li&gt;
&lt;li&gt;Responder às requisições em menos de 200 ms.&lt;/li&gt;
&lt;li&gt;Permitir crescimento horizontal.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Essa distinção é importante porque os requisitos não funcionais influenciam diretamente as decisões de arquitetura.&lt;/p&gt;

&lt;h2&gt;
  
  
  Escalabilidade
&lt;/h2&gt;

&lt;p&gt;Um dos conceitos mais associados a System Design é escalabilidade.&lt;/p&gt;

&lt;p&gt;Existem duas formas comuns de pensar sobre isso.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Escalabilidade vertical&lt;/strong&gt; significa aumentar os recursos de uma máquina:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;4 CPU / 8 GB RAM
        ↓
16 CPU / 32 GB RAM
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Já a &lt;strong&gt;escalabilidade horizontal&lt;/strong&gt; significa adicionar mais máquinas ou instâncias:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;             ┌→ API 1
Load Balancer├→ API 2
             └→ API 3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A escalabilidade horizontal costuma ser especialmente importante quando precisamos distribuir carga e evitar depender de uma única instância.&lt;/p&gt;

&lt;p&gt;Mas novamente: isso não significa que horizontal seja sempre melhor. A decisão depende dos requisitos e das características do sistema.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que estou estudando
&lt;/h2&gt;

&lt;p&gt;Estou começando a organizar meus estudos de System Design em alguns conceitos fundamentais:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Arquitetura:&lt;/strong&gt; monólitos, microsserviços e componentes distribuídos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bancos de dados:&lt;/strong&gt; SQL, NoSQL, índices, replicação, particionamento e consistência.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Performance:&lt;/strong&gt; caching, CDN, load balancing e otimização de consultas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Comunicação:&lt;/strong&gt; APIs, filas, eventos e processamento assíncrono.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Confiabilidade:&lt;/strong&gt; redundância, tolerância a falhas, disponibilidade e recuperação.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Observabilidade:&lt;/strong&gt; logs, métricas, tracing e monitoramento.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Segurança:&lt;/strong&gt; autenticação, autorização, rate limiting e proteção de APIs.&lt;/p&gt;

&lt;p&gt;Ainda estou no processo de aprofundar esses conceitos, mas uma das coisas que mais chamou minha atenção é que System Design não é sobre encontrar uma arquitetura perfeita.&lt;/p&gt;

&lt;p&gt;É sobre entender os requisitos, identificar restrições e tomar decisões conscientes considerando os trade-offs envolvidos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Para mim, estudar System Design representa uma mudança de perspectiva.&lt;/p&gt;

&lt;p&gt;Como desenvolvedor, é natural pensar primeiro em código: classes, funções, endpoints, componentes e bancos de dados.&lt;/p&gt;

&lt;p&gt;System Design força uma visão mais ampla.&lt;/p&gt;

&lt;p&gt;Antes de perguntar &lt;strong&gt;“como vou implementar isso?”&lt;/strong&gt;, começamos a perguntar:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;“Como esse sistema precisa funcionar?”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;“Quais problemas podem aparecer quando ele crescer?”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;“Quais decisões arquiteturais fazem sentido para esses requisitos?”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;System Design não é apenas desenhar caixas e setas. É entender o problema e tomar boas decisões técnicas diante das restrições existentes.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>systemdesign</category>
      <category>architecture</category>
      <category>backend</category>
      <category>programming</category>
    </item>
    <item>
      <title>How I'm Using AI Agents in My Daily Dev Workflow</title>
      <dc:creator>Italo Vinicius</dc:creator>
      <pubDate>Mon, 04 May 2026 02:03:04 +0000</pubDate>
      <link>https://dev.to/it4lo_dev/how-im-using-ai-agents-in-my-daily-dev-workflow-20f0</link>
      <guid>https://dev.to/it4lo_dev/how-im-using-ai-agents-in-my-daily-dev-workflow-20f0</guid>
      <description>&lt;p&gt;I was skeptical at first.&lt;/p&gt;

&lt;p&gt;Not about AI in general — but about whether it would actually fit into my workflow. I work mostly with legacy PHP and jQuery. The kind of codebase that was written before half the frameworks people talk about today even existed. Some Vue.js here and there in newer parts, but a lot of the core is raw PHP, procedural logic, and jQuery doing things you probably don't want to know about.&lt;/p&gt;

&lt;p&gt;It's not glamorous. But it's real work, and it has its own kind of complexity.&lt;/p&gt;

&lt;p&gt;When I started using Claude more seriously, I wasn't expecting much. Turns out I was wrong.&lt;/p&gt;




&lt;h2&gt;
  
  
  Reviewing code before committing
&lt;/h2&gt;

&lt;p&gt;Before I push anything, I paste the relevant code and ask: &lt;em&gt;does this look right? What am I missing?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Nine times out of ten, it finds something. Not always a bug — sometimes just a cleaner way to write something, a missing edge case, a condition that could silently fail with unexpected input. The kind of thing your brain skips when you've been inside the same file for two hours.&lt;/p&gt;

&lt;p&gt;It's become a habit. Faster than asking a coworker, and it never makes you feel dumb for asking.&lt;/p&gt;




&lt;h2&gt;
  
  
  Writing tests for code that never had any
&lt;/h2&gt;

&lt;p&gt;This one I started more recently.&lt;/p&gt;

&lt;p&gt;Legacy codebases and test coverage don't usually go together. Ours was no different. I'd write the occasional test, but it was never a priority because, well, it takes time and the code wasn't exactly built with testability in mind.&lt;/p&gt;

&lt;p&gt;What changed: I started pasting functions into Claude and asking it to write the test cases — happy path, edge cases, what happens when the input is garbage. I review, adjust where needed, and move on.&lt;/p&gt;

&lt;p&gt;Coverage is actually growing now. That feels like a win.&lt;/p&gt;




&lt;h2&gt;
  
  
  Making sense of code nobody remembers writing
&lt;/h2&gt;

&lt;p&gt;This is probably the one I use most in my day-to-day.&lt;/p&gt;

&lt;p&gt;Legacy PHP is full of functions that made sense to someone at some point. No comments, variable names like &lt;code&gt;$tmp2&lt;/code&gt;, business logic baked into places it shouldn't be. You spend more time figuring out what something &lt;em&gt;does&lt;/em&gt; than actually changing it.&lt;/p&gt;

&lt;p&gt;I paste the function and ask Claude to walk me through it — not just what it does, but why it might have been written that way, what could break, what assumptions it's making. It doesn't always get it perfectly, but it gets me 80% of the way there in 30 seconds instead of 20 minutes of archaeological digging.&lt;/p&gt;




&lt;h2&gt;
  
  
  Killing the repetitive stuff
&lt;/h2&gt;

&lt;p&gt;Over time I've built up a set of prompts for things I do constantly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Converting raw SQL queries to something more readable&lt;/li&gt;
&lt;li&gt;Writing docblock comments for functions that have none&lt;/li&gt;
&lt;li&gt;Generating boilerplate for repetitive patterns in the codebase&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Individually, none of this is impressive. But it adds up. There's a certain type of low-effort, high-friction work that quietly drains your day, and removing it makes a real difference.&lt;/p&gt;




&lt;h2&gt;
  
  
  A few things I've noticed along the way
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The quality of your output depends on the quality of your input.&lt;/strong&gt; Vague prompts get vague answers. The more context you give — the stack, the constraints, what you've already tried — the more useful the response. It sounds obvious but it took me a while to internalize.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Explaining your code to AI makes you understand it better.&lt;/strong&gt; There's something about having to describe a problem clearly enough for a language model that forces you to actually think it through. I've solved bugs mid-prompt just by writing the question.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It's slow to notice, then hard to imagine going back.&lt;/strong&gt; The first week felt marginal. A few months in, I catch myself reaching for it automatically.&lt;/p&gt;




&lt;p&gt;I'm still learning — recently started digging into the Claude API and AI subagents, curious where that leads. But even at the most basic level, having AI as part of my daily workflow has made me faster and, honestly, a bit less frustrated with legacy code.&lt;/p&gt;

&lt;p&gt;Which is saying something.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What does your AI workflow look like? Drop it in the comments — always curious how other devs are using these tools.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>php</category>
      <category>ai</category>
      <category>productivity</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
