<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Dev Prático: Carreira e Código]]></title><description><![CDATA[Vivências, aprendizados e perrengues da vida dev.]]></description><link>https://devpratico.dev</link><generator>RSS for Node</generator><lastBuildDate>Tue, 14 Apr 2026 03:37:36 GMT</lastBuildDate><atom:link href="https://devpratico.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Docker: O que é, como funciona e por que usar no desenvolvimento de software]]></title><description><![CDATA[O Docker revolucionou a forma como desenvolvedores criam, distribuem e executam aplicações. Com ele, é possível empacotar todo o ambiente de execução — incluindo bibliotecas, dependências e configurações — em containers, garantindo que o software fun...]]></description><link>https://devpratico.dev/docker-guia-pratico-para-iniciantes</link><guid isPermaLink="true">https://devpratico.dev/docker-guia-pratico-para-iniciantes</guid><category><![CDATA[Docker]]></category><category><![CDATA[Devops]]></category><category><![CDATA[Developer]]></category><dc:creator><![CDATA[Matheus Almeida]]></dc:creator><pubDate>Tue, 12 Aug 2025 13:57:43 GMT</pubDate><content:encoded><![CDATA[<p>O <strong>Docker</strong> revolucionou a forma como desenvolvedores criam, distribuem e executam aplicações. Com ele, é possível empacotar todo o ambiente de execução — incluindo bibliotecas, dependências e configurações — em <strong>containers</strong>, garantindo que o software funcione da mesma forma em qualquer lugar.</p>
<p>Neste artigo, vamos entender:</p>
<ul>
<li><p>O que é Docker e como funciona</p>
</li>
<li><p>Diferença entre containers e máquinas virtuais</p>
</li>
<li><p>Vantagens de usar Docker no dia a dia</p>
</li>
<li><p>Como começar a usar Docker</p>
</li>
</ul>
<hr />
<h2 id="heading-o-que-e-docker">🔹 O que é Docker?</h2>
<p>O <strong>Docker</strong> é uma plataforma open source que permite criar, gerenciar e executar <strong>containers</strong>.<br />Um container é como uma “caixa” que contém o código, as bibliotecas e as dependências necessárias para executar uma aplicação.</p>
<p>Isso garante que o ambiente de desenvolvimento, testes e produção seja <strong>idêntico</strong>, evitando o famoso “funciona na minha máquina, mas não no servidor”.</p>
<hr />
<h2 id="heading-containers-vs-maquinas-virtuais">🔹 Containers vs Máquinas Virtuais</h2>
<p>Embora <strong>containers</strong> e <strong>máquinas virtuais (VMs)</strong> pareçam semelhantes, eles funcionam de formas diferentes:</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Característica</td><td>Container Docker</td><td>Máquina Virtual</td></tr>
</thead>
<tbody>
<tr>
<td>Consumo de recursos</td><td>Baixo</td><td>Alto</td></tr>
<tr>
<td>Tempo de inicialização</td><td>Segundos</td><td>Minutos</td></tr>
<tr>
<td>Sistema Operacional</td><td>Compartilhado com host</td><td>Completo e independente</td></tr>
<tr>
<td>Portabilidade</td><td>Alta</td><td>Média</td></tr>
</tbody>
</table>
</div><hr />
<h2 id="heading-vantagens-de-usar-docker">🔹 Vantagens de usar Docker</h2>
<p>✅ <strong>Portabilidade</strong> — Rode sua aplicação no Windows, Linux, Mac, servidor físico ou na nuvem, sem ajustes.<br />✅ <strong>Escalabilidade</strong> — Facilita criar múltiplas instâncias da aplicação para lidar com alta demanda.<br />✅ <strong>Velocidade</strong> — Containers iniciam em segundos, acelerando o desenvolvimento e o deploy.<br />✅ <strong>Padronização</strong> — O ambiente é sempre o mesmo, evitando conflitos de dependências.</p>
<hr />
<h2 id="heading-como-instalar-o-docker">🔹 Como instalar o Docker</h2>
<p>Para começar, baixe e instale o <strong>Docker Desktop</strong> no seu sistema operacional:</p>
<ul>
<li><p><strong>Windows e Mac:</strong> Download aqui</p>
</li>
<li><p><strong>Linux:</strong> Use o gerenciador de pacotes da sua distribuição (apt, yum, dnf, etc.)</p>
</li>
</ul>
<p>Após a instalação, confirme que o Docker está funcionando:</p>
<pre><code class="lang-bash">docker --version
</code></pre>
<hr />
<h2 id="heading-criando-seu-primeiro-container">🔹 Criando seu primeiro container</h2>
<p>Vamos criar um container simples usando o <strong>NGINX</strong>:</p>
<pre><code class="lang-bash">docker run -d -p 8080:80 nginx
</code></pre>
<p>Acesse <code>http://localhost:8080</code> no navegador e pronto — você está rodando um servidor web em um container!</p>
<hr />
<h3 id="heading-docker-compose-gerenciando-multiplos-containers"><strong>Docker Compose: Gerenciando múltiplos containers</strong></h3>
<p>Quando seu projeto precisa de mais de um serviço (ex.: backend, banco de dados, cache), o <strong>Docker Compose</strong> simplifica tudo.</p>
<p>Exemplo <code>docker-compose.yml</code>:</p>
<pre><code class="lang-bash">yamlCopiarEditarversion: <span class="hljs-string">'3'</span>
services:
  web:
    image: nginx
    ports:
      - <span class="hljs-string">"8080:80"</span>
  db:
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: senha123
</code></pre>
<p>Com apenas um comando:</p>
<pre><code class="lang-bash">bashCopiarEditardocker-compose up -d
</code></pre>
<p>Você sobe os dois serviços de uma vez.</p>
<hr />
<h2 id="heading-dicas-para-usar-docker-no-dia-a-dia">📌 Dicas para usar Docker no dia a dia</h2>
<ol>
<li><p><strong>Use Docker Compose</strong> para gerenciar múltiplos containers.</p>
</li>
<li><p><strong>Otimize a imagem</strong> usando imagens base menores, como <code>alpine</code>.</p>
</li>
<li><p><strong>Mantenha imagens atualizadas</strong> para evitar vulnerabilidades.</p>
</li>
<li><p><strong>Use volumes</strong> para persistir dados fora do container.</p>
</li>
</ol>
<hr />
<h2 id="heading-conclusao">🎯 Conclusão</h2>
<p>O <strong>Docker</strong> é uma ferramenta essencial para qualquer desenvolvedor moderno. Ele não apenas facilita a criação de ambientes consistentes, mas também otimiza o fluxo de desenvolvimento e implantação de aplicações.</p>
<p>Se você quer levar seu desenvolvimento para o próximo nível, comece a usar Docker hoje mesmo.</p>
<hr />
<p>💡 <em>Gostou deste conteúdo? Continue acompanhando o blog</em> <strong><em>DevPratico</em></strong> <em>para mais dicas e tutoriais de desenvolvimento de software.</em></p>
]]></content:encoded></item><item><title><![CDATA[Como Funcionam os Sistemas de Mensageria: Entendendo o RabbitMQ na Prática]]></title><description><![CDATA[Entenda o que são sistemas de mensageria, como o RabbitMQ funciona, por que são importantes em aplicações modernas e veja um exemplo prático no contexto de sistemas de pagamento.

🔍 O que são sistemas de mensageria?
Sistemas de mensageria, também ch...]]></description><link>https://devpratico.dev/como-funcionam-os-sistemas-de-mensageria-entendendo-o-rabbitmq-na-pratica</link><guid isPermaLink="true">https://devpratico.dev/como-funcionam-os-sistemas-de-mensageria-entendendo-o-rabbitmq-na-pratica</guid><category><![CDATA[message queue]]></category><category><![CDATA[rabbitmq]]></category><category><![CDATA[Node.js]]></category><category><![CDATA[Developer]]></category><category><![CDATA[Microservices]]></category><dc:creator><![CDATA[Matheus Almeida]]></dc:creator><pubDate>Mon, 21 Jul 2025 03:11:30 GMT</pubDate><content:encoded><![CDATA[<p>Entenda o que são sistemas de mensageria, como o RabbitMQ funciona, por que são importantes em aplicações modernas e veja um exemplo prático no contexto de sistemas de pagamento.</p>
<hr />
<h2 id="heading-o-que-sao-sistemas-de-mensageria">🔍 O que são sistemas de mensageria?</h2>
<p>Sistemas de mensageria, também chamados de <em>message brokers</em>, são componentes que facilitam a comunicação entre serviços em arquiteturas distribuídas. Eles permitem que partes de um sistema se comuniquem de forma <strong>assíncrona, escalável e desacoplada</strong>.</p>
<p>Esses sistemas funcionam como intermediários, recebendo mensagens de um ponto e encaminhando para outro — geralmente utilizando filas.</p>
<hr />
<h2 id="heading-por-que-usar-mensageria">💡 Por que usar mensageria?</h2>
<ul>
<li><p><strong>Desacoplamento</strong>: serviços não precisam estar ativos ao mesmo tempo para trocarem informações.</p>
</li>
<li><p><strong>Escalabilidade</strong>: melhora o desempenho em sistemas com alto volume de requisições.</p>
</li>
<li><p><strong>Resiliência</strong>: evita perda de dados, mesmo que algum serviço esteja temporariamente fora do ar.</p>
</li>
<li><p><strong>Organização de processos</strong>: permite que tarefas pesadas sejam processadas em segundo plano.</p>
</li>
</ul>
<hr />
<h2 id="heading-rabbitmq-um-dos-mensageiros-mais-usados">🛠️ RabbitMQ: um dos mensageiros mais usados</h2>
<p>RabbitMQ é um <em>message broker</em> baseado no protocolo <strong>AMQP (Advanced Message Queuing Protocol)</strong>. Ele trabalha com filas (<em>queues</em>), trocas (<em>exchanges</em>) e mensagens, permitindo controle total do fluxo de dados.</p>
<hr />
<h2 id="heading-como-o-rabbitmq-funciona">🔁 Como o RabbitMQ funciona?</h2>
<p>O fluxo básico envolve:</p>
<ol>
<li><p><strong>Producer</strong>: envia uma mensagem.</p>
</li>
<li><p><strong>Exchange</strong>: recebe a mensagem e decide para qual fila ela deve ir.</p>
</li>
<li><p><strong>Queue</strong>: armazena a mensagem até que ela seja consumida.</p>
</li>
<li><p><strong>Consumer</strong>: consome a mensagem da fila e processa.</p>
</li>
</ol>
<hr />
<h2 id="heading-exemplo-pratico-processamento-de-pagamentos">🧾 Exemplo prático: processamento de pagamentos</h2>
<p>Imagine um sistema onde o usuário faz um pagamento e o sistema precisa:</p>
<ul>
<li><p>Registrar o pagamento.</p>
</li>
<li><p>Enviar e-mail de confirmação.</p>
</li>
<li><p>Notificar terceiros (ex: gateway de pagamento).</p>
</li>
<li><p>Atualizar o saldo do cliente.</p>
</li>
</ul>
<p>Com RabbitMQ, isso pode ser feito assim:</p>
<pre><code class="lang-plaintext">[API Pagamento]
   |
   | ---&gt; Envia mensagem para a Exchange "pagamentos"
                      |
                Exchange "pagamentos"
                      |
      +---------------+---------------+
      |               |               |
[Queue Email]   [Queue Gateway]   [Queue Saldo]
</code></pre>
<p>Cada consumidor atua de forma independente e paralela, evitando lentidão na resposta da API principal.</p>
<hr />
<h2 id="heading-exemplo-de-uso-basico-com-nodejs-e-amqplib">🧰 Exemplo de uso básico com Node.js e amqplib</h2>
<p><strong>publisher.js</strong></p>
<pre><code class="lang-js"><span class="hljs-keyword">const</span> amqp = <span class="hljs-built_in">require</span>(<span class="hljs-string">'amqplib'</span>);

<span class="hljs-keyword">async</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">sendMessage</span>(<span class="hljs-params"></span>) </span>{
  <span class="hljs-keyword">const</span> conn = <span class="hljs-keyword">await</span> amqp.connect(<span class="hljs-string">'amqp://localhost'</span>);
  <span class="hljs-keyword">const</span> channel = <span class="hljs-keyword">await</span> conn.createChannel();
  <span class="hljs-keyword">const</span> queue = <span class="hljs-string">'pagamentos'</span>;

  <span class="hljs-keyword">await</span> channel.assertQueue(queue);
  channel.sendToQueue(queue, Buffer.from(<span class="hljs-string">'Pagamento recebido'</span>));

  <span class="hljs-built_in">console</span>.log(<span class="hljs-string">'Mensagem enviada!'</span>);
  <span class="hljs-built_in">setTimeout</span>(<span class="hljs-function">() =&gt;</span> { conn.close(); process.exit(<span class="hljs-number">0</span>); }, <span class="hljs-number">500</span>);
}

sendMessage();
</code></pre>
<p><strong>consumer.js</strong></p>
<pre><code class="lang-js"><span class="hljs-keyword">const</span> amqp = <span class="hljs-built_in">require</span>(<span class="hljs-string">'amqplib'</span>);

<span class="hljs-keyword">async</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">receiveMessage</span>(<span class="hljs-params"></span>) </span>{
  <span class="hljs-keyword">const</span> conn = <span class="hljs-keyword">await</span> amqp.connect(<span class="hljs-string">'amqp://localhost'</span>);
  <span class="hljs-keyword">const</span> channel = <span class="hljs-keyword">await</span> conn.createChannel();
  <span class="hljs-keyword">const</span> queue = <span class="hljs-string">'pagamentos'</span>;

  <span class="hljs-keyword">await</span> channel.assertQueue(queue);
  <span class="hljs-built_in">console</span>.log(<span class="hljs-string">'Aguardando mensagens...'</span>);

  channel.consume(queue, <span class="hljs-function"><span class="hljs-params">msg</span> =&gt;</span> {
    <span class="hljs-keyword">if</span> (msg) {
      <span class="hljs-built_in">console</span>.log(<span class="hljs-string">'Mensagem recebida:'</span>, msg.content.toString());
      channel.ack(msg);
    }
  });
}

receiveMessage();
</code></pre>
<hr />
<h2 id="heading-rabbitmq-vs-outros-sistemas">📊 RabbitMQ vs outros sistemas</h2>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Sistema</td><td>Protocolo</td><td>Escalabilidade</td><td>Casos comuns</td></tr>
</thead>
<tbody>
<tr>
<td>RabbitMQ</td><td>AMQP</td><td>Alta</td><td>Microserviços, filas assíncronas</td></tr>
<tr>
<td>Apache Kafka</td><td>Custom</td><td>Muito alta</td><td>Logs de eventos, analytics</td></tr>
<tr>
<td>Amazon SQS</td><td>AWS</td><td>Alta</td><td>Arquitetura serverless</td></tr>
</tbody>
</table>
</div><hr />
<h2 id="heading-conclusao">✅ Conclusão</h2>
<p>Sistemas de mensageria como o RabbitMQ são <strong>peças-chave</strong> em arquiteturas modernas. Eles permitem construir sistemas escaláveis, resilientes e desacoplados, otimizando desde simples tarefas assíncronas até fluxos de negócios complexos.</p>
<hr />
<h2 id="heading-proximos-passos">🔗 Próximos passos</h2>
<ul>
<li><p>Instale o RabbitMQ localmente ou via Docker.</p>
</li>
<li><p>Crie um pequeno sistema com Node.js ou Java que utilize filas.</p>
</li>
<li><p>Explore padrões como <strong>RPC com RabbitMQ</strong>, <strong>dead-letter queues</strong> e <strong>retry policies</strong>.</p>
</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Como o Agile transforma a vida de um desenvolvedor (e por que você deveria se importar)]]></title><description><![CDATA[O Agile deixou de ser apenas uma metodologia da moda para se tornar parte essencial do dia a dia de quem desenvolve software. Mas afinal, como ele impacta a vida do desenvolvedor na prática? Neste post, vamos explorar por que entender e aplicar os pr...]]></description><link>https://devpratico.dev/como-o-agile-transforma-a-vida-de-um-desenvolvedor-e-por-que-voce-deveria-se-importar</link><guid isPermaLink="true">https://devpratico.dev/como-o-agile-transforma-a-vida-de-um-desenvolvedor-e-por-que-voce-deveria-se-importar</guid><category><![CDATA[agile]]></category><category><![CDATA[Scrum]]></category><category><![CDATA[Desenvolvimento de Software]]></category><category><![CDATA[Productivity]]></category><category><![CDATA[Developer]]></category><category><![CDATA[softskills]]></category><dc:creator><![CDATA[Matheus Almeida]]></dc:creator><pubDate>Sun, 20 Jul 2025 02:36:43 GMT</pubDate><content:encoded><![CDATA[<p>O Agile deixou de ser apenas uma metodologia da moda para se tornar parte essencial do dia a dia de quem desenvolve software. Mas afinal, como ele impacta a vida do desenvolvedor na prática? Neste post, vamos explorar <strong>por que entender e aplicar os princípios ágeis pode mudar a forma como você programa, se relaciona com o time e cresce na carreira</strong>.</p>
<h2 id="heading-o-que-e-agile-e-por-que-ele-importa">🚀 O que é Agile e por que ele importa?</h2>
<p>Agile é um conjunto de valores e princípios que promove <strong>entregas rápidas, feedback contínuo e colaboração constante</strong>. Ele surgiu como resposta a modelos pesados e burocráticos de desenvolvimento, como o famoso waterfall.</p>
<p><strong>Para o desenvolvedor, isso significa:</strong></p>
<ul>
<li><p><strong>Menos retrabalho</strong> e mais foco no que realmente importa;</p>
</li>
<li><p><strong>Entrega contínua</strong>, que permite ver o impacto do seu código mais rápido;</p>
</li>
<li><p><strong>Colaboração real com o time</strong> e com o cliente;</p>
</li>
<li><p><strong>Maior visibilidade sobre o que está sendo feito</strong>, e por quê.</p>
</li>
</ul>
<h2 id="heading-agile-no-dia-a-dia-do-dev">💼 Agile no dia a dia do Dev</h2>
<h3 id="heading-1-daily-meetings-reunioes-diarias">1. <strong>Daily Meetings (reuniões diárias)</strong></h3>
<ul>
<li><p>Curta, direta e objetiva. A daily te ajuda a entender o que cada membro do time está fazendo e identificar rapidamente bloqueios.</p>
</li>
<li><p>Exemplo: se você está esperando uma API para seguir seu trabalho, a daily evita dias perdidos sem comunicação.</p>
</li>
</ul>
<h3 id="heading-2-sprints-e-planejamentos">2. <strong>Sprints e Planejamentos</strong></h3>
<ul>
<li><p>O Sprint planning define o que será entregue nas próximas semanas, o que <strong>dá previsibilidade e foco.</strong></p>
</li>
<li><p>Ajuda a priorizar o que tem mais valor de negócio e técnico.</p>
</li>
</ul>
<h3 id="heading-3-retrospectivas">3. <strong>Retrospectivas</strong></h3>
<ul>
<li><p>Espaço seguro para discutir o que deu certo, o que deu errado e o que pode melhorar.</p>
</li>
<li><p>Como dev, isso te dá voz e promove <strong>melhoria contínua</strong>.</p>
</li>
</ul>
<h2 id="heading-agile-soft-skills-dev-mais-completo">🧩 Agile + Soft Skills = Dev mais completo</h2>
<p>Trabalhar com Agile desenvolve soft skills essenciais:</p>
<ul>
<li><p><strong>Comunicação clara</strong>: você aprende a expressar melhor seus pontos e dificuldades.</p>
</li>
<li><p><strong>Colaboração</strong>: ninguém programa sozinho em ambientes ágeis.</p>
</li>
<li><p><strong>Resiliência e adaptação</strong>: mudanças são esperadas, não temidas.</p>
</li>
</ul>
<h2 id="heading-agile-com-scrum-kanban-ou-xp">🧪 Agile com Scrum, Kanban ou XP?</h2>
<p>Você pode aplicar Agile de várias formas:</p>
<ul>
<li><p><strong>Scrum</strong>: mais estruturado, ótimo para equipes com entregas recorrentes.</p>
</li>
<li><p><strong>Kanban</strong>: mais fluido, ideal para times que lidam com demandas contínuas.</p>
</li>
<li><p><strong>Extreme Programming (XP)</strong>: foco em qualidade de código e boas práticas de engenharia.</p>
</li>
</ul>
<p>Escolha depende da <strong>maturidade do time</strong> e do tipo de projeto.</p>
<h2 id="heading-beneficios-para-sua-carreira">📈 Benefícios para sua carreira</h2>
<p>Adotar Agile no seu modo de trabalhar traz várias vantagens profissionais:</p>
<ul>
<li><p>Você se torna um dev mais produtivo e organizado;</p>
</li>
<li><p>Melhora sua capacidade de <strong>comunicar progresso e problemas</strong>;</p>
</li>
<li><p>Ganha visibilidade no time e abre portas para <strong>liderança técnica</strong>;</p>
</li>
<li><p>Está preparado para trabalhar em empresas modernas que usam Agile como padrão.</p>
</li>
</ul>
<h2 id="heading-conclusao-nao-e-so-sobre-processos-e-sobre-evolucao">✅ Conclusão: não é só sobre processos, é sobre evolução</h2>
<p>Agile não é só sobre post-its, sprints ou reuniões — é sobre <strong>entregar valor real com consistência</strong>, com foco, alinhamento e melhoria constante.</p>
<p>Se você quer crescer como desenvolvedor, <strong>entender e aplicar Agile no seu dia a dia é um diferencial que te coloca à frente.</strong></p>
]]></content:encoded></item><item><title><![CDATA[Monorepos com Nx: Organização e Produtividade em Projetos de Desenvolvimento]]></title><description><![CDATA[Monorepos: O que são e por que usá-los?
Monorepo (ou "monolithic repository") é uma estratégia onde todo o código-fonte de vários projetos relacionados é armazenado em um único repositório.
Vantagens:

Reutilização de código entre apps e libs

Melhor...]]></description><link>https://devpratico.dev/monorepos-com-nx-organizacao-e-produtividade-em-projetos-de-desenvolvimento</link><guid isPermaLink="true">https://devpratico.dev/monorepos-com-nx-organizacao-e-produtividade-em-projetos-de-desenvolvimento</guid><category><![CDATA[repository]]></category><category><![CDATA[monorepo]]></category><dc:creator><![CDATA[Matheus Almeida]]></dc:creator><pubDate>Sun, 20 Jul 2025 02:30:45 GMT</pubDate><content:encoded><![CDATA[<hr />
<h2 id="heading-monorepos-o-que-sao-e-por-que-usa-los">Monorepos: O que são e por que usá-los?</h2>
<p>Monorepo (ou "monolithic repository") é uma estratégia onde todo o código-fonte de vários projetos relacionados é armazenado em um único repositório.</p>
<p><strong>Vantagens:</strong></p>
<ul>
<li><p>Reutilização de código entre apps e libs</p>
</li>
<li><p>Melhoria no versionamento e controle de dependências</p>
</li>
<li><p>Consistência e padronização entre times</p>
</li>
<li><p>Facilidade de refatorações em larga escala</p>
</li>
</ul>
<h2 id="heading-introducao-ao-nx">Introdução ao Nx</h2>
<p><a target="_blank" href="https://nx.dev">Nx</a> é uma ferramenta poderosa de build e gestão de monorepos para projetos modernos em JavaScript/TypeScript, com suporte a frameworks como React, Angular, Node.js e mais.</p>
<p>Ele oferece:</p>
<ul>
<li><p>Estrutura opinativa para escalar com qualidade</p>
</li>
<li><p>Gerador de código, linting, testes, builds otimizados</p>
</li>
<li><p>Caching inteligente e análises de dependências</p>
</li>
</ul>
<h2 id="heading-cenario-pratico-aplicacao-de-pagamentos">Cenário prático: Aplicação de pagamentos</h2>
<p>Imagine um sistema composto por:</p>
<ul>
<li><p><code>app-pagamentos</code>: aplicação React para clientes</p>
</li>
<li><p><code>api-transacoes</code>: API Node.js para processar pagamentos</p>
</li>
<li><p><code>libs/shared</code>: biblioteca com validações, modelos e lógica compartilhada</p>
</li>
</ul>
<pre><code class="lang-bash">npx create-nx-workspace@latest pagamentos-nx
<span class="hljs-built_in">cd</span> pagamentos-nx
</code></pre>
<p>Crie os apps:</p>
<pre><code class="lang-bash">nx generate @nx/react:application app-pagamentos
nx generate @nx/node:application api-transacoes
</code></pre>
<p>E uma lib compartilhada:</p>
<pre><code class="lang-bash">nx generate @nx/js:lib shared
</code></pre>
<p>Agora, tanto a API quanto o front-end podem importar:</p>
<pre><code class="lang-ts"><span class="hljs-keyword">import</span> { validarCartao } <span class="hljs-keyword">from</span> <span class="hljs-string">'@pagamentos-nx/shared'</span>;
</code></pre>
<h2 id="heading-recursos-do-nx-que-fazem-diferenca">Recursos do Nx que fazem diferença</h2>
<ul>
<li><p><strong>Graph de dependências</strong>: visualize como apps e libs se conectam.</p>
</li>
<li><p><strong>Affected</strong>: só builda/testa o que foi alterado.</p>
</li>
<li><p><strong>Executores customizados</strong>: automatize tarefas comuns.</p>
</li>
<li><p><strong>Project.json</strong>: controle granular por projeto.</p>
</li>
</ul>
<h2 id="heading-boas-praticas-com-monorepos-e-nx">Boas práticas com Monorepos e Nx</h2>
<ul>
<li><p>Separe apps e libs por domínio ou funcionalidade.</p>
</li>
<li><p>Use tags e restrições para limitar acoplamentos entre libs.</p>
</li>
<li><p>Mantenha dependências enxutas em cada projeto.</p>
</li>
</ul>
<h2 id="heading-quando-nao-usar-um-monorepo">Quando NÃO usar um monorepo?</h2>
<ul>
<li><p>Se os projetos forem completamente independentes e com times distintos.</p>
</li>
<li><p>Se o repositório crescer demais e o tooling não estiver bem otimizado.</p>
</li>
</ul>
<h2 id="heading-conclusao">Conclusão</h2>
<p>Usar monorepos com Nx pode elevar seu nível de produtividade, facilitar a padronização entre projetos e times, e trazer escalabilidade de verdade.</p>
<p>Explore o <a target="_blank" href="https://nx.dev">site oficial do Nx</a> para mais tutoriais e exemplos avançados!</p>
<hr />
<p>Quer mais conteúdos práticos sobre arquitetura, ferramentas modernas e produtividade no desenvolvimento? Siga o <strong>Dev Prático</strong> 🚀</p>
]]></content:encoded></item><item><title><![CDATA[Dominando React Hooks: Guia Completo para Desenvolvedores Iniciantes e Intermediários]]></title><description><![CDATA[React Hooks revolucionaram a forma como escrevemos componentes funcionais em React. Se você está começando com React ou já programa com ele há um tempo, entender como e quando usar os hooks pode transformar sua produtividade e qualidade de código.
O ...]]></description><link>https://devpratico.dev/dominando-react-hooks-guia-completo-para-desenvolvedores-iniciantes-e-intermediarios</link><guid isPermaLink="true">https://devpratico.dev/dominando-react-hooks-guia-completo-para-desenvolvedores-iniciantes-e-intermediarios</guid><category><![CDATA[Frontend Development]]></category><category><![CDATA[React]]></category><category><![CDATA[hooks in react]]></category><dc:creator><![CDATA[Matheus Almeida]]></dc:creator><pubDate>Fri, 18 Jul 2025 19:53:04 GMT</pubDate><content:encoded><![CDATA[<hr />
<p>React Hooks revolucionaram a forma como escrevemos componentes funcionais em React. Se você está começando com React ou já programa com ele há um tempo, entender como e quando usar os hooks pode transformar sua produtividade e qualidade de código.</p>
<h2 id="heading-o-que-sao-react-hooks">O que são React Hooks?</h2>
<p>React Hooks são funções que permitem <strong>usar o estado e outros recursos do React em componentes funcionais</strong>. Antes deles, apenas componentes de classe tinham acesso a recursos como estado (<code>this.state</code>) e ciclo de vida (<code>componentDidMount</code>, etc).</p>
<h2 id="heading-por-que-usar-hooks">Por que usar Hooks?</h2>
<ul>
<li><p><strong>Código mais limpo e conciso</strong></p>
</li>
<li><p><strong>Maior reutilização de lógica</strong></p>
</li>
<li><p><strong>Melhor organização do projeto</strong></p>
</li>
<li><p><strong>Adequação à abordagem funcional moderna</strong></p>
</li>
</ul>
<h2 id="heading-principais-hooks-do-react">Principais Hooks do React</h2>
<h3 id="heading-1-usestate-para-gerenciar-estado-local">1. <code>useState</code> – Para Gerenciar Estado Local</h3>
<pre><code class="lang-jsx"><span class="hljs-keyword">import</span> { useState } <span class="hljs-keyword">from</span> <span class="hljs-string">'react'</span>;

<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">Pagamento</span>(<span class="hljs-params"></span>) </span>{
  <span class="hljs-keyword">const</span> [valor, setValor] = useState(<span class="hljs-number">0</span>);

  <span class="hljs-keyword">return</span> (
    <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>Valor do pagamento: R${valor}<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">onClick</span>=<span class="hljs-string">{()</span> =&gt;</span> setValor(valor + 10)}&gt;Adicionar R$10<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span></span>
  );
}
</code></pre>
<h3 id="heading-2-useeffect-para-efeitos-colaterais">2. <code>useEffect</code> – Para Efeitos Colaterais</h3>
<pre><code class="lang-jsx"><span class="hljs-keyword">import</span> { useEffect, useState } <span class="hljs-keyword">from</span> <span class="hljs-string">'react'</span>;

<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">Transacao</span>(<span class="hljs-params"></span>) </span>{
  <span class="hljs-keyword">const</span> [transacoes, setTransacoes] = useState([]);

  useEffect(<span class="hljs-function">() =&gt;</span> {
    fetch(<span class="hljs-string">'/api/pagamentos'</span>)
      .then(<span class="hljs-function"><span class="hljs-params">res</span> =&gt;</span> res.json())
      .then(<span class="hljs-function"><span class="hljs-params">data</span> =&gt;</span> setTransacoes(data));
  }, []); <span class="hljs-comment">// Executa apenas uma vez</span>

  <span class="hljs-keyword">return</span> (
    <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">ul</span>&gt;</span>
      {transacoes.map((t) =&gt; (
        <span class="hljs-tag">&lt;<span class="hljs-name">li</span> <span class="hljs-attr">key</span>=<span class="hljs-string">{t.id}</span>&gt;</span>{t.descricao} - R${t.valor}<span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
      ))}
    <span class="hljs-tag">&lt;/<span class="hljs-name">ul</span>&gt;</span></span>
  );
}
</code></pre>
<h3 id="heading-3-usecontext-para-compartilhar-estado-global">3. <code>useContext</code> – Para Compartilhar Estado Global</h3>
<p>Ideal para autenticação ou dados de sessão de pagamento:</p>
<pre><code class="lang-jsx"><span class="hljs-keyword">const</span> PagamentoContext = React.createContext();

<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">PagamentoProvider</span>(<span class="hljs-params">{ children }</span>) </span>{
  <span class="hljs-keyword">const</span> [usuario, setUsuario] = useState(<span class="hljs-literal">null</span>);

  <span class="hljs-keyword">return</span> (
    <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">PagamentoContext.Provider</span> <span class="hljs-attr">value</span>=<span class="hljs-string">{{</span> <span class="hljs-attr">usuario</span>, <span class="hljs-attr">setUsuario</span> }}&gt;</span>
      {children}
    <span class="hljs-tag">&lt;/<span class="hljs-name">PagamentoContext.Provider</span>&gt;</span></span>
  );
}

<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">Dashboard</span>(<span class="hljs-params"></span>) </span>{
  <span class="hljs-keyword">const</span> { usuario } = useContext(PagamentoContext);
  <span class="hljs-keyword">return</span> <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">h1</span>&gt;</span>Bem-vindo, {usuario?.nome}<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span></span>;
}
</code></pre>
<h3 id="heading-4-useref-para-referencias-mutaveis">4. <code>useRef</code> – Para Referências Mutáveis</h3>
<p>Útil para capturar input de valor de pagamento, sem renderizar novamente:</p>
<pre><code class="lang-jsx"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">InputValor</span>(<span class="hljs-params"></span>) </span>{
  <span class="hljs-keyword">const</span> inputRef = useRef();

  <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">handleEnviar</span>(<span class="hljs-params"></span>) </span>{
    alert(<span class="hljs-string">"Valor enviado: "</span> + inputRef.current.value);
  }

  <span class="hljs-keyword">return</span> (
    <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"number"</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">{inputRef}</span> /&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">onClick</span>=<span class="hljs-string">{handleEnviar}</span>&gt;</span>Enviar<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span></span>
  );
}
</code></pre>
<h2 id="heading-hooks-customizados">Hooks Customizados</h2>
<p>Você pode <strong>criar seus próprios hooks</strong> para reutilizar lógica. Exemplo: hook para formatação de valores:</p>
<pre><code class="lang-jsx"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">useFormatoReal</span>(<span class="hljs-params">valor</span>) </span>{
  <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Intl</span>.NumberFormat(<span class="hljs-string">'pt-BR'</span>, {
    <span class="hljs-attr">style</span>: <span class="hljs-string">'currency'</span>,
    <span class="hljs-attr">currency</span>: <span class="hljs-string">'BRL'</span>,
  }).format(valor);
}
</code></pre>
<h2 id="heading-conclusao">Conclusão</h2>
<p>Hooks são essenciais no desenvolvimento moderno com React. Dominar <code>useState</code>, <code>useEffect</code>, <code>useContext</code> e <code>useRef</code> é o primeiro passo para escrever aplicações robustas, especialmente em cenários reais como <strong>gestão de pagamentos</strong>.</p>
<hr />
<p><strong>Gostou do conteúdo?</strong> Compartilhe e siga o blog <em>Dev Prático</em> para mais dicas práticas de desenvolvimento! 🚀</p>
]]></content:encoded></item><item><title><![CDATA[Design System com React: O Guia Inicial para Desenvolvedores]]></title><description><![CDATA[Introdução
Se você já criou mais de uma tela em uma aplicação React, provavelmente percebeu a repetição de componentes visuais — botões, inputs, cards, modais... E se em cada nova tela esses componentes forem reinventados ou ajustados individualmente...]]></description><link>https://devpratico.dev/design-system-com-react-o-guia-inicial-para-desenvolvedores</link><guid isPermaLink="true">https://devpratico.dev/design-system-com-react-o-guia-inicial-para-desenvolvedores</guid><category><![CDATA[Developer]]></category><category><![CDATA[React]]></category><category><![CDATA[Design Systems]]></category><dc:creator><![CDATA[Matheus Almeida]]></dc:creator><pubDate>Thu, 17 Jul 2025 20:17:22 GMT</pubDate><content:encoded><![CDATA[<h2 id="heading-introducao">Introdução</h2>
<p>Se você já criou mais de uma tela em uma aplicação React, provavelmente percebeu a repetição de componentes visuais — botões, inputs, cards, modais... E se em cada nova tela esses componentes forem reinventados ou ajustados individualmente, o caos se instala rapidamente.</p>
<p>É aqui que entra o <strong>Design System</strong>. Ele não é apenas uma biblioteca de componentes. É uma linguagem visual padronizada, com guias de estilo, tokens, regras de uso e componentes reutilizáveis, com foco em consistência e escalabilidade.</p>
<p>Este artigo é um <strong>ponto de partida</strong> para desenvolvedores que desejam entender, criar ou manter um Design System utilizando <strong>React</strong>.</p>
<hr />
<h2 id="heading-o-que-e-um-design-system">O que é um Design System?</h2>
<p>Um <strong>Design System</strong> é um conjunto de padrões reutilizáveis de design e componentes, documentados e aplicáveis a múltiplas aplicações.</p>
<p>Ele normalmente inclui:</p>
<ul>
<li><p>Guia de cores (tokens)</p>
</li>
<li><p>Tipografia</p>
</li>
<li><p>Espaçamentos e grid</p>
</li>
<li><p>Estilo de ícones</p>
</li>
<li><p>Componentes reutilizáveis (UI Kit)</p>
</li>
<li><p>Documentação</p>
</li>
</ul>
<hr />
<h2 id="heading-por-que-criar-um-design-system">Por que criar um Design System?</h2>
<p><strong>Benefícios práticos:</strong></p>
<ul>
<li><p>Consistência visual e de UX</p>
</li>
<li><p>Aumento da produtividade da equipe</p>
</li>
<li><p>Redução de bugs visuais</p>
</li>
<li><p>Facilidade de manutenção</p>
</li>
<li><p>Comunicação mais fluida entre designers e desenvolvedores</p>
</li>
</ul>
<hr />
<h2 id="heading-como-estruturar-um-design-system-com-react">Como estruturar um Design System com React</h2>
<h3 id="heading-1-tokens-de-design">1. Tokens de Design</h3>
<p>Os <strong>design tokens</strong> são as unidades fundamentais do seu sistema. Em React, normalmente são criados em arquivos de constantes ou usando ferramentas como Style Dictionary.</p>
<pre><code class="lang-js"><span class="hljs-comment">// tokens/colors.js</span>
<span class="hljs-keyword">export</span> <span class="hljs-keyword">const</span> colors = {
  <span class="hljs-attr">primary</span>: <span class="hljs-string">"#0070f3"</span>,
  <span class="hljs-attr">secondary</span>: <span class="hljs-string">"#1c1c1e"</span>,
  <span class="hljs-attr">background</span>: <span class="hljs-string">"#ffffff"</span>,
};
</code></pre>
<hr />
<h3 id="heading-2-componentes-base">2. Componentes Base</h3>
<p>Construa <strong>componentes desacoplados</strong>, reusáveis e com boas práticas de acessibilidade. Exemplo de botão:</p>
<pre><code class="lang-jsx"><span class="hljs-comment">// components/Button.jsx</span>
<span class="hljs-keyword">export</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">Button</span>(<span class="hljs-params">{ children, variant = <span class="hljs-string">"primary"</span>, ...props }</span>) </span>{
  <span class="hljs-keyword">return</span> (
    <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">button</span>
      <span class="hljs-attr">className</span>=<span class="hljs-string">{</span>`<span class="hljs-attr">btn</span> ${<span class="hljs-attr">variant</span>}`}
      {<span class="hljs-attr">...props</span>}
    &gt;</span>
      {children}
    <span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span></span>
  );
}
</code></pre>
<h3 id="heading-3-estilizacao">3. Estilização</h3>
<p>Você pode utilizar CSS Modules, Tailwind, Styled-components, Stitches ou Vanilla Extract. Exemplo com Tailwind:</p>
<pre><code class="lang-jsx">&lt;button className=<span class="hljs-string">"bg-blue-600 text-white px-4 py-2 rounded"</span>&gt;
  Comprar
&lt;/button&gt;
</code></pre>
<hr />
<h3 id="heading-4-documentacao">4. Documentação</h3>
<p>Utilize ferramentas como <strong>Storybook</strong>, <strong>Ladle</strong>, <strong>Docsify</strong> ou até uma Wiki com exemplos e guidelines. Um Design System sem documentação <strong>não escala</strong>.</p>
<hr />
<h2 id="heading-boas-praticas">Boas Práticas</h2>
<ul>
<li><p><strong>Componentização clara</strong>: evite criar componentes acoplados a lógica de negócio.</p>
</li>
<li><p><strong>Consistência</strong>: mantenha nomenclatura e estilo padronizados.</p>
</li>
<li><p><strong>Acessibilidade</strong>: todos os componentes devem seguir normas como WCAG.</p>
</li>
<li><p><strong>Versão e pacotes</strong>: publique seu design system como um pacote npm privado ou público.</p>
</li>
</ul>
<hr />
<h2 id="heading-ferramentas-uteis">Ferramentas úteis</h2>
<ul>
<li><p><strong>Storybook</strong>: documentação interativa</p>
</li>
<li><p><strong>Figma</strong>: design com tokens e bibliotecas compartilhadas</p>
</li>
<li><p><strong>Style Dictionary</strong>: tokens centralizados</p>
</li>
<li><p><strong>Ladle</strong>: alternativa leve ao Storybook</p>
</li>
</ul>
<hr />
<h2 id="heading-conclusao">Conclusão</h2>
<p>Criar um Design System com React não é apenas um luxo para grandes empresas. É um investimento estratégico para qualquer equipe que deseja ganhar velocidade, consistência e confiança no produto.</p>
<p>Comece simples: defina tokens, crie componentes básicos e documente tudo com clareza. A evolução será natural e incremental.</p>
<hr />
<h2 id="heading-seo-tags">SEO Tags</h2>
<ul>
<li><p>design system react</p>
</li>
<li><p>como criar design system react</p>
</li>
<li><p>design system com storybook</p>
</li>
<li><p>componentização react</p>
</li>
<li><p>tokens de design em react</p>
</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Staff Engineer: O Papel Estratégico do Engenheiro Sênior que Vai Além do Código]]></title><description><![CDATA[Você chegou no topo da carreira técnica como sênior e se pergunta: e agora, o que vem depois? A resposta pode estar em um dos cargos mais estratégicos e influentes da engenharia de software: Staff Engineer.
Neste post, você vai entender:

O que é um ...]]></description><link>https://devpratico.dev/staff-engineer-o-papel-estrategico-do-engenheiro-senior-que-vai-alem-do-codigo</link><guid isPermaLink="true">https://devpratico.dev/staff-engineer-o-papel-estrategico-do-engenheiro-senior-que-vai-alem-do-codigo</guid><category><![CDATA[Software Engineering]]></category><category><![CDATA[Developer]]></category><dc:creator><![CDATA[Matheus Almeida]]></dc:creator><pubDate>Wed, 16 Jul 2025 17:41:48 GMT</pubDate><content:encoded><![CDATA[<p>Você chegou no topo da carreira técnica como sênior e se pergunta: <em>e agora, o que vem depois?</em> A resposta pode estar em um dos cargos mais estratégicos e influentes da engenharia de software: <strong>Staff Engineer</strong>.</p>
<p>Neste post, você vai entender:</p>
<ul>
<li><p>O que é um Staff Engineer</p>
</li>
<li><p>Qual a diferença para um Tech Lead ou Engenheiro Sênior</p>
</li>
<li><p>Quais habilidades são necessárias</p>
</li>
<li><p>Como se preparar para assumir esse papel</p>
</li>
</ul>
<hr />
<h2 id="heading-o-que-e-um-staff-engineer">O que é um Staff Engineer?</h2>
<p>O Staff Engineer é um profissional técnico de altíssimo nível que atua com <strong>influência técnica profunda</strong>, <strong>visão estratégica</strong> e <strong>liderança transversal</strong>, sem necessariamente gerenciar pessoas.</p>
<p>Ele é responsável por <strong>resolver os maiores desafios técnicos da empresa</strong>, liderar decisões arquiteturais críticas e servir como referência técnica para vários times.</p>
<hr />
<h2 id="heading-staff-engineer-vs-tech-lead">Staff Engineer vs Tech Lead</h2>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Papel</td><td>Tech Lead</td><td>Staff Engineer</td></tr>
</thead>
<tbody>
<tr>
<td>Liderança</td><td>Lidera um time</td><td>Influencia vários times</td></tr>
<tr>
<td>Responsabilidade técnica</td><td>Planejamento e execução técnica</td><td>Estratégia, arquitetura, visão</td></tr>
<tr>
<td>Visão de negócio</td><td>Tática</td><td>Estratégica</td></tr>
<tr>
<td>Escopo</td><td>Local (squad)</td><td>Global (domínio ou plataforma)</td></tr>
</tbody>
</table>
</div><hr />
<h2 id="heading-o-que-faz-um-staff-engineer-na-pratica">O que faz um Staff Engineer na prática?</h2>
<p>✔️ Define diretrizes técnicas e padrões de arquitetura<br />✔️ Avalia riscos técnicos em escala de produto<br />✔️ Atua como ponte entre áreas de produto, engenharia e infraestrutura<br />✔️ Faz mentoria de engenheiros de todos os níveis<br />✔️ Participa de decisões de longo prazo e evolução técnica da empresa</p>
<h3 id="heading-exemplo">Exemplo:</h3>
<p>Imagine que a empresa está com problemas de escalabilidade no sistema de pagamentos. O Staff Engineer:</p>
<ul>
<li><p>Mapeia os gargalos técnicos com observabilidade e benchmark</p>
</li>
<li><p>Projeta uma nova arquitetura assíncrona baseada em filas</p>
</li>
<li><p>Coordena a evolução técnica com os times afetados</p>
</li>
<li><p>Documenta e defende a proposta para diretoria técnica</p>
</li>
</ul>
<hr />
<h2 id="heading-habilidades-chave-de-um-staff-engineer">Habilidades-chave de um Staff Engineer</h2>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Técnica</td><td>Estratégica e Comportamental</td></tr>
</thead>
<tbody>
<tr>
<td>Arquitetura de sistemas</td><td>Comunicação com stakeholders</td></tr>
<tr>
<td>Sistemas distribuídos</td><td>Influência sem autoridade direta</td></tr>
<tr>
<td>Segurança e performance</td><td>Visão de produto e de negócio</td></tr>
<tr>
<td>Engenharia de confiabilidade (SRE)</td><td>Pensamento de longo prazo</td></tr>
<tr>
<td>Profundo conhecimento técnico</td><td>Escrita e documentação técnica</td></tr>
</tbody>
</table>
</div><hr />
<h2 id="heading-como-se-tornar-um-staff-engineer">Como se tornar um Staff Engineer?</h2>
<ol>
<li><p><strong>Domine profundamente o funcionamento da sua stack e sistemas</strong></p>
</li>
<li><p><strong>Atue além do seu time atual: proponha melhorias que impactem a engenharia como um todo</strong></p>
</li>
<li><p><strong>Escreva propostas técnicas com clareza e estrutura</strong></p>
</li>
<li><p><strong>Mentore devs de outros squads e compartilhe conhecimento</strong></p>
</li>
<li><p><strong>Trabalhe sua comunicação para influenciar decisões estratégicas</strong></p>
</li>
</ol>
<hr />
<h2 id="heading-dica-pratica-comece-a-pensar-como-staff-hoje">Dica prática: comece a pensar como Staff hoje</h2>
<p>🔍 Enxergue problemas sistêmicos além da sua sprint<br />🧠 Proponha soluções técnicas com impacto duradouro<br />✍️ Documente decisões e compartilhe com a engenharia<br />📣 Torne-se referência técnica no seu domínio<br />🎯 Esteja por dentro das metas de produto e negócio</p>
<hr />
<h2 id="heading-conclusao">Conclusão</h2>
<p>O Staff Engineer não é só um “dev sênior ++”. É um papel de altíssimo impacto técnico e estratégico, essencial em empresas que escalam. Se você quer crescer <strong>sem sair da trilha técnica</strong>, esse é um caminho de liderança e realização profissional.</p>
<hr />
<h2 id="heading-curtiu-o-conteudo">Curtiu o conteúdo?</h2>
<p>Se quiser ver uma comparação com Principal Engineer, dicas para entrevistas ou como preparar um tech doc de impacto, comenta aqui no post!</p>
<hr />
<p><em>Publicado por Dev Prático — onde código, carreira e café se encontram.</em></p>
]]></content:encoded></item><item><title><![CDATA[Tech Lead: O que Faz, Como se Tornar e Quais Habilidades São Essenciais]]></title><description><![CDATA[Você já se perguntou o que faz exatamente um Tech Lead? Será que é apenas um desenvolvedor sênior promovido? Ou será que existe algo além da técnica?
Neste post, vamos explorar de forma prática e objetiva:

O que é a função de Tech Lead

Qual o papel...]]></description><link>https://devpratico.dev/tech-lead-o-que-faz-como-se-tornar-e-quais-habilidades-sao-essenciais</link><guid isPermaLink="true">https://devpratico.dev/tech-lead-o-que-faz-como-se-tornar-e-quais-habilidades-sao-essenciais</guid><category><![CDATA[Developer]]></category><category><![CDATA[tech leadership]]></category><dc:creator><![CDATA[Matheus Almeida]]></dc:creator><pubDate>Wed, 16 Jul 2025 17:37:59 GMT</pubDate><content:encoded><![CDATA[<p>Você já se perguntou o que faz exatamente um <strong>Tech Lead</strong>? Será que é apenas um desenvolvedor sênior promovido? Ou será que existe algo além da técnica?</p>
<p>Neste post, vamos explorar de forma prática e objetiva:</p>
<ul>
<li><p>O que é a função de Tech Lead</p>
</li>
<li><p>Qual o papel no time e na empresa</p>
</li>
<li><p>Como se tornar um</p>
</li>
<li><p>Habilidades técnicas e comportamentais essenciais</p>
</li>
</ul>
<hr />
<h2 id="heading-o-que-e-um-tech-lead">O que é um Tech Lead?</h2>
<p>O Tech Lead (ou Líder Técnico) é o profissional responsável por <strong>guiar tecnicamente o time de desenvolvimento</strong>. Ele atua como ponte entre a equipe e outras áreas do projeto, garantindo que as decisões técnicas estejam alinhadas aos objetivos do produto e da empresa.</p>
<hr />
<h2 id="heading-responsabilidades-de-um-tech-lead">Responsabilidades de um Tech Lead</h2>
<p>✔️ <strong>Tomada de decisão técnica</strong><br />✔️ <strong>Mentoria e suporte técnico ao time</strong><br />✔️ <strong>Code reviews, arquitetura e padrões de projeto</strong><br />✔️ <strong>Planejamento técnico de sprints e entregas</strong><br />✔️ <strong>Comunicação com PMs, POs e stakeholders</strong><br />✔️ <strong>Atenção à qualidade e performance do sistema</strong></p>
<h3 id="heading-exemplo-pratico">Exemplo prático:</h3>
<p>Imagine um time trabalhando em uma plataforma de pagamentos. O Tech Lead deve:</p>
<ul>
<li><p>Escolher entre REST ou GraphQL para a API</p>
</li>
<li><p>Avaliar a escalabilidade da arquitetura</p>
</li>
<li><p>Orientar um dev júnior sobre validação de cartões</p>
</li>
<li><p>Garantir testes automatizados nas integrações</p>
</li>
</ul>
<hr />
<h2 id="heading-tech-lead-e-gerente">Tech Lead é gerente?</h2>
<p>Não. O Tech Lead é um <strong>líder técnico</strong>, não um gestor de pessoas (embora em algumas empresas acumule funções). Seu foco principal é <strong>decidir e orientar tecnicamente</strong>. O acompanhamento de performance, salários e carreira geralmente fica com o Engineering Manager.</p>
<hr />
<h2 id="heading-como-se-tornar-um-tech-lead">Como se tornar um Tech Lead?</h2>
<ol>
<li><p><strong>Domine bem a stack da sua equipe</strong></p>
</li>
<li><p><strong>Comunique-se com clareza, principalmente com não técnicos</strong></p>
</li>
<li><p><strong>Aprenda a delegar e confiar no time</strong></p>
</li>
<li><p><strong>Tenha visão de produto e negócios</strong></p>
</li>
<li><p><strong>Comece assumindo pequenas lideranças e responsabilidades técnicas</strong></p>
</li>
</ol>
<hr />
<h2 id="heading-habilidades-essenciais-para-um-tech-lead">Habilidades essenciais para um Tech Lead</h2>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Técnica</td><td>Comportamental</td></tr>
</thead>
<tbody>
<tr>
<td>Arquitetura de software</td><td>Comunicação clara</td></tr>
<tr>
<td>Clean Code e boas práticas</td><td>Empatia e escuta ativa</td></tr>
<tr>
<td>Testes automatizados</td><td>Gestão de conflitos</td></tr>
<tr>
<td>DevOps e CI/CD</td><td>Mentoria e liderança</td></tr>
<tr>
<td>Design de APIs</td><td>Visão estratégica de produto</td></tr>
</tbody>
</table>
</div><hr />
<h2 id="heading-dica-pratica-como-se-preparar">Dica prática: como se preparar</h2>
<p>👨‍💻 Participe de decisões técnicas<br />🧠 Estude arquitetura e padrões como SOLID, DDD, Clean Architecture<br />📚 Leia livros como <em>The Manager’s Path</em> e <em>Staff Engineer</em><br />🎙️ Pratique explicar soluções para não técnicos</p>
<hr />
<h2 id="heading-conclusao">Conclusão</h2>
<p>Ser Tech Lead é muito mais do que saber codar bem. É sobre <strong>influenciar tecnicamente</strong>, <strong>colaborar com outras áreas</strong> e <strong>desbloquear o potencial do time</strong>. Se você tem perfil de liderança e paixão por tecnologia, esse pode ser o seu próximo passo.</p>
<hr />
<h2 id="heading-curtiu-o-conteudo">Curtiu o conteúdo?</h2>
<p>Se quiser ver uma série sobre liderança técnica, transição de carreira para Tech Lead ou dicas para entrevistas, comenta aqui que posso produzir os próximos posts!</p>
<hr />
<p><em>Publicado por Dev Prático — onde código, carreira e café se encontram.</em></p>
]]></content:encoded></item><item><title><![CDATA[Blockchain na Prática: O que é, Como Funciona e Onde se Aplica]]></title><description><![CDATA[Você já ouviu falar de blockchain, mas acha que é só sobre criptomoedas? Na verdade, essa tecnologia vai muito além do Bitcoin e pode transformar desde pagamentos até contratos e logística.
Neste post, você vai entender o que é blockchain, como ela f...]]></description><link>https://devpratico.dev/blockchain-na-pratica-o-que-e-como-funciona-e-onde-se-aplica</link><guid isPermaLink="true">https://devpratico.dev/blockchain-na-pratica-o-que-e-como-funciona-e-onde-se-aplica</guid><category><![CDATA[Developer]]></category><category><![CDATA[Blockchain]]></category><dc:creator><![CDATA[Matheus Almeida]]></dc:creator><pubDate>Mon, 14 Jul 2025 02:21:40 GMT</pubDate><content:encoded><![CDATA[<p>Você já ouviu falar de <strong>blockchain</strong>, mas acha que é só sobre criptomoedas? Na verdade, essa tecnologia vai muito além do Bitcoin e pode transformar desde pagamentos até contratos e logística.</p>
<p>Neste post, você vai entender o que é blockchain, como ela funciona na prática, e onde desenvolvedores como você podem aplicar esse conhecimento com segurança e criatividade.</p>
<hr />
<h2 id="heading-o-que-e-blockchain">O que é Blockchain?</h2>
<p><strong>Blockchain</strong> é uma estrutura de dados que funciona como um livro-razão digital, onde as informações são registradas em blocos interligados de forma segura e imutável.</p>
<p>Cada bloco contém:</p>
<ul>
<li><p>Um conjunto de transações</p>
</li>
<li><p>Um timestamp</p>
</li>
<li><p>Um hash do bloco anterior</p>
</li>
</ul>
<p>Isso garante integridade e rastreabilidade sem precisar de uma autoridade central (como um banco ou governo).</p>
<hr />
<h2 id="heading-por-que-blockchain-e-revolucionaria">Por que blockchain é revolucionária?</h2>
<p>Porque ela permite: ✅ <strong>Transparência total</strong> — todas as transações são públicas (em blockchains abertas)<br />✅ <strong>Segurança</strong> — os dados não podem ser alterados sem consenso da rede<br />✅ <strong>Descentralização</strong> — ninguém tem controle absoluto<br />✅ <strong>Rastreabilidade</strong> — cada operação pode ser auditada</p>
<hr />
<h2 id="heading-como-blockchain-funciona-na-pratica">Como blockchain funciona na prática?</h2>
<p>Vamos a um exemplo usando <strong>pagamentos entre usuários</strong>.</p>
<h3 id="heading-passo-a-passo-de-uma-transacao">Passo a passo de uma transação:</h3>
<ol>
<li><p>João envia 1 token para Maria.</p>
</li>
<li><p>Essa transação é transmitida à rede.</p>
</li>
<li><p>Mineradores (ou validadores) confirmam a transação.</p>
</li>
<li><p>A transação é adicionada a um novo bloco.</p>
</li>
<li><p>O bloco é vinculado ao anterior, formando uma cadeia.</p>
</li>
</ol>
<h3 id="heading-exemplo-visual-simplificado">Exemplo visual simplificado:</h3>
<pre><code class="lang-json">{
  <span class="hljs-attr">"bloco"</span>: <span class="hljs-number">2456</span>,
  <span class="hljs-attr">"transacoes"</span>: [
    {
      <span class="hljs-attr">"de"</span>: <span class="hljs-string">"João"</span>,
      <span class="hljs-attr">"para"</span>: <span class="hljs-string">"Maria"</span>,
      <span class="hljs-attr">"valor"</span>: <span class="hljs-number">1</span>
    }
  ],
  <span class="hljs-attr">"hashAnterior"</span>: <span class="hljs-string">"0000xabc123..."</span>,
  <span class="hljs-attr">"hashAtual"</span>: <span class="hljs-string">"0000xdef456..."</span>
}
</code></pre>
<hr />
<h2 id="heading-exemplo-pratico-com-smart-contracts">Exemplo prático com smart contracts</h2>
<p>Um <strong>smart contract</strong> é um programa que executa regras automaticamente, sem intermediários.</p>
<h3 id="heading-cenario-pagamento-de-freelancer">Cenário: pagamento de freelancer</h3>
<pre><code class="lang-solidity"><span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">PagamentoFreelancer</span> </span>{
    <span class="hljs-keyword">address</span> <span class="hljs-keyword">public</span> contratante;
    <span class="hljs-keyword">address</span> <span class="hljs-keyword">public</span> freelancer;

    <span class="hljs-function"><span class="hljs-keyword">constructor</span>(<span class="hljs-params"><span class="hljs-keyword">address</span> _freelancer</span>) </span>{
        contratante <span class="hljs-operator">=</span> <span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>;
        freelancer <span class="hljs-operator">=</span> _freelancer;
    }

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">pagar</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">payable</span></span> </span>{
        <span class="hljs-built_in">require</span>(<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span> <span class="hljs-operator">=</span><span class="hljs-operator">=</span> contratante, <span class="hljs-string">"Apenas o contratante pode pagar"</span>);
        <span class="hljs-keyword">payable</span>(freelancer).<span class="hljs-built_in">transfer</span>(<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">value</span>);
    }
}
</code></pre>
<p>O pagamento é feito com segurança, sem precisar de intermediários como plataformas ou bancos.</p>
<hr />
<h2 id="heading-onde-blockchain-esta-sendo-usada-alem-de-cripto">Onde blockchain está sendo usada além de cripto?</h2>
<ul>
<li><p><strong>Pagamentos internacionais</strong> (Ripple, Stellar)</p>
</li>
<li><p><strong>Logística e rastreamento de alimentos</strong> (IBM Food Trust)</p>
</li>
<li><p><strong>Jogos com ativos digitais (NFTs)</strong></p>
</li>
<li><p><strong>Sistemas de identidade digital</strong></p>
</li>
<li><p><strong>Votação eletrônica segura</strong></p>
</li>
</ul>
<hr />
<h2 id="heading-blockchain-vs-banco-tradicional">Blockchain vs Banco Tradicional</h2>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Característica</td><td>Banco Tradicional</td><td>Blockchain</td></tr>
</thead>
<tbody>
<tr>
<td>Transparência</td><td>Limitada</td><td>Alta</td></tr>
<tr>
<td>Custos de operação</td><td>Altos</td><td>Reduzidos</td></tr>
<tr>
<td>Intermediários</td><td>Muitos</td><td>Nenhum</td></tr>
<tr>
<td>Velocidade</td><td>1-3 dias úteis</td><td>Segundos/minutos</td></tr>
<tr>
<td>Acesso global</td><td>Limitado</td><td>Aberto a todos</td></tr>
</tbody>
</table>
</div><hr />
<h2 id="heading-conclusao">Conclusão</h2>
<p>Blockchain não é só sobre cripto. É sobre <strong>confiança sem intermediários</strong>, <strong>segurança distribuída</strong> e <strong>inovação real</strong>. Se você é dev e quer se preparar para o futuro, entender como blockchain funciona pode abrir portas para projetos incríveis.</p>
<hr />
<h2 id="heading-curtiu-o-conteudo">Curtiu o conteúdo?</h2>
<p>Se quiser ver tutoriais com Solidity, criar tokens ou integrar blockchain com sistemas existentes, comenta aqui no post!</p>
<hr />
<p><em>Publicado por Dev Prático — onde código, carreira e café se encontram.</em></p>
]]></content:encoded></item><item><title><![CDATA[GraphQL na Prática: Como Usar em Sistemas de Pagamento]]></title><description><![CDATA[Você já teve que lidar com APIs REST cheias de endpoints, chamadas encadeadas e dados desnecessários? Se sim, o GraphQL pode ser a solução que você estava procurando.
Neste post, vou te mostrar como funciona o GraphQL com um exemplo real de sistema d...]]></description><link>https://devpratico.dev/graphql-na-pratica-como-usar-em-sistemas-de-pagamento</link><guid isPermaLink="true">https://devpratico.dev/graphql-na-pratica-como-usar-em-sistemas-de-pagamento</guid><category><![CDATA[Developer]]></category><category><![CDATA[GraphQL]]></category><dc:creator><![CDATA[Matheus Almeida]]></dc:creator><pubDate>Mon, 14 Jul 2025 02:07:15 GMT</pubDate><content:encoded><![CDATA[<p>Você já teve que lidar com APIs REST cheias de endpoints, chamadas encadeadas e dados desnecessários? Se sim, o <strong>GraphQL</strong> pode ser a solução que você estava procurando.</p>
<p>Neste post, vou te mostrar como funciona o GraphQL com um exemplo real de <strong>sistema de pagamentos</strong>, explicando vantagens, estrutura e como aplicar no dia a dia. Vamos juntos?</p>
<hr />
<h2 id="heading-o-que-e-graphql">O que é GraphQL?</h2>
<p><strong>GraphQL</strong> é uma linguagem de consulta para APIs criada pelo Facebook. Com ela, você pode <strong>buscar exatamente os dados que precisa</strong>, evitando requisições longas ou sobrecarregadas.</p>
<p>Diferente do REST, onde cada recurso geralmente tem um endpoint separado (<code>/pagamentos</code>, <code>/usuarios</code>, <code>/pedidos</code>), no GraphQL tudo é acessado por um único endpoint com uma linguagem de consulta altamente flexível.</p>
<hr />
<h2 id="heading-por-que-usar-graphql-em-um-sistema-de-pagamentos">Por que usar GraphQL em um sistema de pagamentos?</h2>
<p>Sistemas de pagamento lidam com múltiplos dados relacionados:</p>
<ul>
<li><p>Usuário que fez a compra</p>
</li>
<li><p>Produto comprado</p>
</li>
<li><p>Status do pagamento</p>
</li>
<li><p>Data da transação</p>
</li>
<li><p>Método de pagamento</p>
</li>
</ul>
<p>Com GraphQL, é possível obter todos esses dados em uma única requisição, com controle total sobre <strong>o que</strong> você quer receber.</p>
<hr />
<h2 id="heading-exemplo-pratico-consulta-de-pagamentos">Exemplo prático: Consulta de pagamentos</h2>
<h3 id="heading-cenario">Cenário</h3>
<p>Queremos exibir uma lista de pagamentos com:</p>
<ul>
<li><p>Nome do usuário</p>
</li>
<li><p>Valor pago</p>
</li>
<li><p>Status</p>
</li>
<li><p>Método utilizado</p>
</li>
</ul>
<h3 id="heading-requisicao-graphql">Requisição GraphQL:</h3>
<pre><code class="lang-graphql"><span class="hljs-keyword">query</span> {
  pagamentos {
    id
    valor
    status
    metodo
    usuario {
      nome
      email
    }
  }
}
</code></pre>
<h3 id="heading-resposta-da-api">Resposta da API:</h3>
<pre><code class="lang-json">{
  <span class="hljs-attr">"data"</span>: {
    <span class="hljs-attr">"pagamentos"</span>: [
      {
        <span class="hljs-attr">"id"</span>: <span class="hljs-string">"001"</span>,
        <span class="hljs-attr">"valor"</span>: <span class="hljs-number">250.0</span>,
        <span class="hljs-attr">"status"</span>: <span class="hljs-string">"Aprovado"</span>,
        <span class="hljs-attr">"metodo"</span>: <span class="hljs-string">"Cartão de Crédito"</span>,
        <span class="hljs-attr">"usuario"</span>: {
          <span class="hljs-attr">"nome"</span>: <span class="hljs-string">"João Silva"</span>,
          <span class="hljs-attr">"email"</span>: <span class="hljs-string">"joao@email.com"</span>
        }
      }
    ]
  }
}
</code></pre>
<hr />
<h2 id="heading-vantagens-do-graphql-nesse-cenario">Vantagens do GraphQL nesse cenário</h2>
<p>✅ <strong>Consulta personalizada</strong>: você define os campos que quer.<br />✅ <strong>Menos requisições</strong>: busca dados relacionados em uma só chamada.<br />✅ <strong>Documentação automática</strong>: o schema define tudo que está disponível.<br />✅ <strong>Evolução sem quebra</strong>: você pode adicionar novos campos sem impactar quem usa a API.</p>
<hr />
<h2 id="heading-como-criar-um-schema-de-pagamentos">Como criar um schema de pagamentos</h2>
<h3 id="heading-exemplo-de-schema-graphql">Exemplo de schema GraphQL:</h3>
<pre><code class="lang-graphql"><span class="hljs-keyword">type</span> Usuario {
  <span class="hljs-symbol">id:</span> ID!
  <span class="hljs-symbol">nome:</span> String!
  <span class="hljs-symbol">email:</span> String!
}

<span class="hljs-keyword">type</span> Pagamento {
  <span class="hljs-symbol">id:</span> ID!
  <span class="hljs-symbol">valor:</span> Float!
  <span class="hljs-symbol">status:</span> String!
  <span class="hljs-symbol">metodo:</span> String!
  <span class="hljs-symbol">usuario:</span> Usuario!
}

<span class="hljs-keyword">type</span> Query {
  <span class="hljs-symbol">pagamentos:</span> [Pagamento!]!
}
</code></pre>
<p>Com esse schema, já conseguimos fazer consultas como a anterior. Em projetos maiores, é possível integrar com bancos de dados, aplicar autenticação, paginação e filtros com facilidade.</p>
<hr />
<h2 id="heading-graphql-vs-rest-qual-usar">GraphQL vs REST: qual usar?</h2>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Situação</td><td>REST</td><td>GraphQL</td></tr>
</thead>
<tbody>
<tr>
<td>App simples com poucas mudanças</td><td>✅</td><td>—</td></tr>
<tr>
<td>Precisa de controle sobre os dados</td><td>—</td><td>✅</td></tr>
<tr>
<td>Evitar overfetching/underfetching</td><td>—</td><td>✅</td></tr>
<tr>
<td>Requisições complexas e interligadas</td><td>—</td><td>✅</td></tr>
</tbody>
</table>
</div><p>Se seu projeto cresce rápido e exige <strong>flexibilidade</strong> nas respostas da API, o GraphQL tende a ser uma escolha mais robusta.</p>
<hr />
<h2 id="heading-conclusao">Conclusão</h2>
<p>O GraphQL pode ser um divisor de águas para projetos que demandam performance e flexibilidade, como sistemas de <strong>pagamento</strong>. Ele reduz a complexidade do frontend e melhora a experiência de desenvolvimento como um todo.</p>
<p>Se você trabalha com integrações entre múltiplos serviços ou precisa entregar dados precisos em apps móveis/web, <strong>vale muito a pena considerar o uso de GraphQL</strong>.</p>
<hr />
<h2 id="heading-curtiu-o-conteudo">Curtiu o conteúdo?</h2>
<p>Quer ver uma implementação prática com Apollo Server ou integração com backend Java? Deixa aqui nos comentários!</p>
<hr />
<p><em>Publicado por Dev Prático — onde código, carreira e café se encontram.</em></p>
]]></content:encoded></item><item><title><![CDATA[Você Está Quebrando o SOLID e Nem Sabe: Entenda os 5 Princípios que Todo Dev Precisa Dominar]]></title><description><![CDATA[Você já abriu um código seu de semanas atrás e pensou: “Quem escreveu isso?” Spoiler: foi você mesmo.
Essa situação é mais comum do que parece. E, muitas vezes, ela acontece porque estamos quebrando — sem perceber — os princípios do SOLID, um conjunt...]]></description><link>https://devpratico.dev/voce-esta-quebrando-o-solid-e-nem-sabe-entenda-os-5-principios-que-todo-dev-precisa-dominar</link><guid isPermaLink="true">https://devpratico.dev/voce-esta-quebrando-o-solid-e-nem-sabe-entenda-os-5-principios-que-todo-dev-precisa-dominar</guid><category><![CDATA[SOLID principles]]></category><category><![CDATA[Developer]]></category><dc:creator><![CDATA[Matheus Almeida]]></dc:creator><pubDate>Fri, 18 Apr 2025 16:54:20 GMT</pubDate><content:encoded><![CDATA[<p>Você já abriu um código seu de semanas atrás e pensou: <em>“Quem escreveu isso?”</em> Spoiler: foi você mesmo.</p>
<p>Essa situação é mais comum do que parece. E, muitas vezes, ela acontece porque estamos quebrando — sem perceber — os princípios do <strong>SOLID</strong>, um conjunto de boas práticas que ajudam a manter seu código <strong>limpo</strong>, <strong>flexível</strong> e <strong>escalável</strong>.</p>
<p>Neste post, vou te mostrar:</p>
<ul>
<li><p>O que significa cada letra do SOLID</p>
</li>
<li><p>Explicações práticas com exemplos simples</p>
</li>
<li><p>Como aplicar esses conceitos no seu dia a dia como dev</p>
</li>
</ul>
<hr />
<h2 id="heading-o-que-e-solid">O que é SOLID?</h2>
<p><strong>SOLID</strong> é um acrônimo criado por Robert C. Martin (Uncle Bob) que representa cinco princípios fundamentais do design de software orientado a objetos. Eles ajudam a criar sistemas mais organizados, coesos e fáceis de manter.</p>
<hr />
<h2 id="heading-s-single-responsibility-principle-srp">S — Single Responsibility Principle (SRP)</h2>
<p><strong>Princípio da Responsabilidade Única</strong></p>
<blockquote>
<p><em>Uma classe deve ter apenas um motivo para mudar.</em></p>
</blockquote>
<p>Isso significa que cada classe, módulo ou função deve ter uma única responsabilidade bem definida. Quando uma classe tem várias responsabilidades, qualquer alteração em uma delas pode impactar negativamente outras partes da aplicação.</p>
<h3 id="heading-problema-comum">Problema comum:</h3>
<p>Classes que fazem muitas coisas ao mesmo tempo, como lógica de negócio, persistência e envio de notificações.</p>
<h3 id="heading-exemplo-ruim">Exemplo ruim:</h3>
<pre><code class="lang-java"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">UsuarioService</span> </span>{
  <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">registrar</span><span class="hljs-params">(Usuario user)</span> </span>{
    validar(user);
    salvarNoBanco(user);
    enviarEmailBoasVindas(user);
  }
}
</code></pre>
<h3 id="heading-solucao">Solução:</h3>
<p>Crie classes especializadas para cada ação:</p>
<pre><code class="lang-java"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ValidadorUsuario</span> </span>{ <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">validar</span><span class="hljs-params">(Usuario u)</span> </span>{ ... } }
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">UsuarioRepository</span> </span>{ <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">salvar</span><span class="hljs-params">(Usuario u)</span> </span>{ ... } }
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">EmailService</span> </span>{ <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">enviarBoasVindas</span><span class="hljs-params">(Usuario u)</span> </span>{ ... } }
</code></pre>
<hr />
<h2 id="heading-o-openclosed-principle-ocp">O — Open/Closed Principle (OCP)</h2>
<p><strong>Aberto para extensão, fechado para modificação</strong></p>
<blockquote>
<p><em>Você deve ser capaz de adicionar novos comportamentos ao sistema sem alterar o código existente.</em></p>
</blockquote>
<p>Esse princípio incentiva o uso de abstrações (interfaces ou classes base) para que você possa estender funcionalidades sem tocar no que já funciona.</p>
<h3 id="heading-exemplo">Exemplo:</h3>
<p>Ao invés de usar <code>if</code> ou <code>switch</code> para tratar múltiplas regras, use polimorfismo com subclasses.</p>
<pre><code class="lang-java"><span class="hljs-class"><span class="hljs-keyword">interface</span> <span class="hljs-title">Desconto</span> </span>{
  <span class="hljs-function"><span class="hljs-keyword">double</span> <span class="hljs-title">calcular</span><span class="hljs-params">(<span class="hljs-keyword">double</span> valor)</span></span>;
}

<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">DescontoBlackFriday</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Desconto</span> </span>{
  <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">double</span> <span class="hljs-title">calcular</span><span class="hljs-params">(<span class="hljs-keyword">double</span> valor)</span> </span>{
    <span class="hljs-keyword">return</span> valor * <span class="hljs-number">0.9</span>;
  }
}
</code></pre>
<p>Você pode adicionar novos descontos sem alterar a lógica principal.</p>
<hr />
<h2 id="heading-l-liskov-substitution-principle-lsp">L — Liskov Substitution Principle (LSP)</h2>
<p><strong>Subtipos devem ser substituíveis por seus tipos base</strong></p>
<blockquote>
<p><em>Se S é um subtipo de T, objetos do tipo T devem poder ser substituídos por objetos do tipo S sem afetar a funcionalidade.</em></p>
</blockquote>
<p>Se uma subclasse quebra o comportamento esperado da superclasse, você está violando o LSP.</p>
<h3 id="heading-exemplo-ruim-1">Exemplo ruim:</h3>
<pre><code class="lang-java"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Pato</span> </span>{
  <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">voar</span><span class="hljs-params">()</span> </span>{ ... }
}

<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">PatoDeBorracha</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Pato</span> </span>{
  <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">voar</span><span class="hljs-params">()</span> </span>{
    <span class="hljs-comment">// não faz sentido: pato de borracha não voa!</span>
  }
}
</code></pre>
<h3 id="heading-solucao-1">Solução:</h3>
<p>Evite herança quando não há relação de comportamento real. Use composição ou interfaces específicas.</p>
<hr />
<h2 id="heading-i-interface-segregation-principle-isp">I — Interface Segregation Principle (ISP)</h2>
<p><strong>Muitos contratos específicos são melhores que um único contrato genérico</strong></p>
<blockquote>
<p><em>Os clientes não devem ser forçados a depender de interfaces que não usam.</em></p>
</blockquote>
<p>Interfaces grandes demais causam implementações infladas. Divida-as em interfaces menores e mais focadas.</p>
<h3 id="heading-exemplo-ruim-2">Exemplo ruim:</h3>
<pre><code class="lang-java"><span class="hljs-class"><span class="hljs-keyword">interface</span> <span class="hljs-title">OperacoesConta</span> </span>{
  <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">sacar</span><span class="hljs-params">()</span></span>;
  <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">depositar</span><span class="hljs-params">()</span></span>;
  <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">pedirEmprestimo</span><span class="hljs-params">()</span></span>; <span class="hljs-comment">// nem toda conta permite isso!</span>
}
</code></pre>
<h3 id="heading-exemplo-bom">Exemplo bom:</h3>
<pre><code class="lang-java"><span class="hljs-class"><span class="hljs-keyword">interface</span> <span class="hljs-title">SaqueDeposito</span> </span>{
  <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">sacar</span><span class="hljs-params">()</span></span>;
  <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">depositar</span><span class="hljs-params">()</span></span>;
}

<span class="hljs-class"><span class="hljs-keyword">interface</span> <span class="hljs-title">ContaComEmprestimo</span> </span>{
  <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">pedirEmprestimo</span><span class="hljs-params">()</span></span>;
}
</code></pre>
<hr />
<h2 id="heading-d-dependency-inversion-principle-dip">D — Dependency Inversion Principle (DIP)</h2>
<p><strong>Dependa de abstrações, não de implementações concretas</strong></p>
<blockquote>
<p><em>Módulos de alto nível não devem depender de módulos de baixo nível. Ambos devem depender de abstrações.</em></p>
</blockquote>
<p>Ao invés de criar dependências diretas em uma classe, use interfaces para injetar comportamentos. Isso facilita testes, mudanças e reutilização.</p>
<h3 id="heading-exemplo-1">Exemplo:</h3>
<pre><code class="lang-java"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">PedidoService</span> </span>{
  <span class="hljs-keyword">private</span> EmailService email;

  PedidoService(EmailService email) {
    <span class="hljs-keyword">this</span>.email = email;
  }
}
</code></pre>
<p>Você pode facilmente trocar <code>EmailService</code> por um mock ou outro tipo de serviço.</p>
<hr />
<h2 id="heading-conclusao">Conclusão</h2>
<p>Aplicar o SOLID na prática evita que seu projeto vire um monstro difícil de entender e manter. Comece aos poucos, especialmente com os princípios <strong>SRP</strong> e <strong>DIP</strong>, e você verá a diferença no dia a dia.</p>
<hr />
<h2 id="heading-curtiu-o-conteudo">Curtiu o conteúdo?</h2>
<p>Deixe um comentário se quiser ver mais exemplos aplicados em outras linguagens como PL/SQL, Java ou Python!</p>
<hr />
<p><em>Publicado por Dev Prático — onde código, carreira e café se encontram.</em></p>
]]></content:encoded></item><item><title><![CDATA[Como documentar um endpoint REST de forma clara e objetiva (com exemplo real)]]></title><description><![CDATA[A documentação de uma API REST pode ser a diferença entre um sistema fácil de integrar e um verdadeiro pesadelo. Muitas vezes negligenciada, uma boa documentação economiza tempo, evita retrabalho e melhora a comunicação entre equipes.
Neste post, vou...]]></description><link>https://devpratico.dev/como-documentar-um-endpoint-rest-de-forma-clara-e-objetiva-com-exemplo-real</link><guid isPermaLink="true">https://devpratico.dev/como-documentar-um-endpoint-rest-de-forma-clara-e-objetiva-com-exemplo-real</guid><category><![CDATA[REST]]></category><category><![CDATA[REST API]]></category><category><![CDATA[backend]]></category><dc:creator><![CDATA[Matheus Almeida]]></dc:creator><pubDate>Sun, 13 Apr 2025 03:00:00 GMT</pubDate><content:encoded><![CDATA[<p>A documentação de uma API REST pode ser a diferença entre um sistema fácil de integrar e um verdadeiro pesadelo. Muitas vezes negligenciada, uma boa documentação economiza tempo, evita retrabalho e melhora a comunicação entre equipes.</p>
<p>Neste post, vou mostrar um modelo direto de como documentar endpoints REST — com base em exemplos reais e cobrindo os principais métodos: <code>GET</code>, <code>POST</code>, <code>PUT</code>, <code>PATCH</code> e <code>DELETE</code>.</p>
<hr />
<h2 id="heading-visao-geral-dos-metodos-http">🧭 Visão geral dos métodos HTTP</h2>
<table><tbody><tr><td><p><strong>Método</strong></p></td><td><p><strong>Finalidade</strong></p></td></tr><tr><td><p><code>GET</code></p></td><td><p>Buscar informações</p></td></tr><tr><td><p><code>POST</code></p></td><td><p>Criar um novo recurso</p></td></tr><tr><td><p><code>PUT</code></p></td><td><p>Atualizar um recurso inteiro</p></td></tr><tr><td><p><code>PATCH</code></p></td><td><p>Atualizar parcialmente um recurso</p></td></tr><tr><td><p><code>DELETE</code></p></td><td><p>Remover um recurso</p></td></tr></tbody></table>

<hr />
<h2 id="heading-exemplo-api-de-consulta-de-processos">🧪 Exemplo: API de Consulta de Processos</h2>
<p>Vamos usar uma API fictícia chamada <code>/api/processos</code> para ilustrar cada um dos métodos.</p>
<hr />
<h2 id="heading-1-get-apiprocessosid">1. 🔍 <code>GET /api/processos/{id}</code></h2>
<h3 id="heading-buscar-detalhes-de-um-processo-especifico">Buscar detalhes de um processo específico</h3>
<h4 id="heading-url">📍 URL</h4>
<p><code>GET /api/processos/0001234-56.2023.8.26.0001</code></p>
<h4 id="heading-resposta">🔼 Resposta</h4>
<pre><code class="lang-json">{
  <span class="hljs-attr">"numeroProcesso"</span>: <span class="hljs-string">"0001234-56.2023.8.26.0001"</span>,
  <span class="hljs-attr">"classe"</span>: <span class="hljs-string">"Ação Cível"</span>,
  <span class="hljs-attr">"assunto"</span>: <span class="hljs-string">"Cobrança"</span>,
  <span class="hljs-attr">"dataDistribuicao"</span>: <span class="hljs-string">"2023-08-15"</span>,
  <span class="hljs-attr">"partes"</span>: [
    { <span class="hljs-attr">"nome"</span>: <span class="hljs-string">"Maria da Silva"</span>, <span class="hljs-attr">"tipo"</span>: <span class="hljs-string">"AUTOR"</span> },
    { <span class="hljs-attr">"nome"</span>: <span class="hljs-string">"João de Souza"</span>, <span class="hljs-attr">"tipo"</span>: <span class="hljs-string">"RÉU"</span> }
  ]
}
</code></pre>
<hr />
<h2 id="heading-2-post-apiprocessos">2. 📝 <code>POST /api/processos</code></h2>
<h3 id="heading-criar-um-novo-processo">Criar um novo processo</h3>
<h4 id="heading-requisicao">📤 Requisição</h4>
<pre><code class="lang-json">{
  <span class="hljs-attr">"numeroProcesso"</span>: <span class="hljs-string">"0001234-56.2023.8.26.0001"</span>,
  <span class="hljs-attr">"classe"</span>: <span class="hljs-string">"Ação Cível"</span>,
  <span class="hljs-attr">"assunto"</span>: <span class="hljs-string">"Cobrança"</span>
}
</code></pre>
<h4 id="heading-resposta-1">🔼 Resposta</h4>
<ul>
<li><code>201 Created</code> com o corpo criado ou o ID do recurso</li>
</ul>
<hr />
<h2 id="heading-3-put-apiprocessosid">3. 🔄 <code>PUT /api/processos/{id}</code></h2>
<h3 id="heading-atualizar-totalmente-um-processo-existente">Atualizar totalmente um processo existente</h3>
<h4 id="heading-requisicao-1">📤 Requisição</h4>
<pre><code class="lang-json">{
  <span class="hljs-attr">"classe"</span>: <span class="hljs-string">"Ação Penal"</span>,
  <span class="hljs-attr">"assunto"</span>: <span class="hljs-string">"Furto qualificado"</span>
}
</code></pre>
<h4 id="heading-resposta-2">🔼 Resposta</h4>
<ul>
<li><code>200 OK</code> com os dados atualizados</li>
</ul>
<hr />
<h2 id="heading-4-patch-apiprocessosid">4. 🩹 <code>PATCH /api/processos/{id}</code></h2>
<h3 id="heading-atualizar-parcialmente-um-processo">Atualizar parcialmente um processo</h3>
<h4 id="heading-requisicao-2">📤 Requisição</h4>
<pre><code class="lang-json">{
  <span class="hljs-attr">"assunto"</span>: <span class="hljs-string">"Atualização cadastral"</span>
}
</code></pre>
<h4 id="heading-resposta-3">🔼 Resposta</h4>
<ul>
<li><code>200 OK</code> com os dados atualizados</li>
</ul>
<hr />
<h2 id="heading-5-delete-apiprocessosid">5. 🗑️ <code>DELETE /api/processos/{id}</code></h2>
<h3 id="heading-remover-um-processo">Remover um processo</h3>
<h4 id="heading-url-1">📍 URL</h4>
<p><code>DELETE /api/processos/0001234-56.2023.8.26.0001</code></p>
<h4 id="heading-resposta-4">🔼 Resposta</h4>
<ul>
<li><code>204 No Content</code></li>
</ul>
<hr />
<h2 id="heading-boas-praticas-ao-documentar-endpoints">🧠 Boas práticas ao documentar endpoints</h2>
<ol>
<li><p><strong>Seja específico</strong>: mostre exemplos reais de entrada e saída.</p>
</li>
<li><p><strong>Liste os códigos de status possíveis</strong>: isso evita dúvidas sobre como tratar a resposta.</p>
</li>
<li><p><strong>Explique os métodos</strong>: muitos devs confundem <code>PUT</code> e <code>PATCH</code>.</p>
</li>
<li><p><strong>Padronize tudo</strong>: headers, estrutura dos campos, nomes das rotas.</p>
</li>
</ol>
<hr />
<h2 id="heading-conclusao">Conclusão</h2>
<p>Uma documentação clara é um presente que você dá para o seu "eu do futuro" — e para toda a equipe que vai consumir sua API. Com um modelo bem definido, tudo flui melhor.</p>
<hr />
<p><strong>Curtiu o exemplo? Tem alguma dúvida ou sugestão? Comenta aqui ou me chama no LinkedIn — vou trazer mais conteúdos sobre APIs e práticas reais de backend!</strong></p>
]]></content:encoded></item><item><title><![CDATA[TYPES em PL/SQL: o que são, como funcionam e quando usar?]]></title><description><![CDATA[Se você já se deparou com TYPE em um código PL/SQL e não entendeu muito bem pra que servia, fica tranquilo! Neste post vou te mostrar, com exemplos, como os TYPES funcionam, quando eles fazem diferença e como usar com segurança em sistemas reais.

🧠...]]></description><link>https://devpratico.dev/types-em-plsql-o-que-sao-como-funcionam-e-quando-usar</link><guid isPermaLink="true">https://devpratico.dev/types-em-plsql-o-que-sao-como-funcionam-e-quando-usar</guid><category><![CDATA[Types]]></category><category><![CDATA[SQL]]></category><category><![CDATA[Oracle]]></category><category><![CDATA[PL/SQL]]></category><dc:creator><![CDATA[Matheus Almeida]]></dc:creator><pubDate>Sat, 12 Apr 2025 00:11:23 GMT</pubDate><content:encoded><![CDATA[<p>Se você já se deparou com <code>TYPE</code> em um código PL/SQL e não entendeu muito bem pra que servia, fica tranquilo! Neste post vou te mostrar, com exemplos, como os TYPES funcionam, quando eles fazem diferença e como usar com segurança em sistemas reais.</p>
<hr />
<h2 id="heading-o-que-sao-types-em-plsql">🧠 O que são TYPES em PL/SQL?</h2>
<p><code>TYPE</code> é uma forma de <strong>definir um tipo de dado personalizado</strong>. Pode ser usado para:</p>
<ul>
<li><p>Criar <strong>tipos escalares</strong> (como alias para tipos simples)</p>
</li>
<li><p>Definir <strong>registros (records)</strong> com múltiplos campos</p>
</li>
<li><p>Criar <strong>coleções (arrays)</strong>, como tabelas ou listas</p>
</li>
</ul>
<p>Eles ajudam a <strong>organizar dados</strong>, deixar o código mais legível e facilitar a manipulação de conjuntos de informações.</p>
<hr />
<h2 id="heading-tipos-mais-comuns">📦 Tipos mais comuns</h2>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Tipo</td><td>Para que serve</td><td>Exemplo</td></tr>
</thead>
<tbody>
<tr>
<td>Escalar</td><td>Alias para tipo simples</td><td><code>TYPE t_id IS NUMBER;</code></td></tr>
<tr>
<td>Record</td><td>Conjunto de campos (como um struct)</td><td><code>TYPE t_pessoa IS RECORD (...)</code></td></tr>
<tr>
<td>TABLE ou VARRAY</td><td>Lista de registros ou valores</td><td><code>TYPE t_lista IS TABLE OF ...</code></td></tr>
</tbody>
</table>
</div><hr />
<h2 id="heading-exemplo-1-type-escalar">✅ Exemplo 1: TYPE escalar</h2>
<pre><code class="lang-sql"><span class="hljs-keyword">DECLARE</span>
  <span class="hljs-keyword">TYPE</span> t_codigo <span class="hljs-keyword">IS</span> <span class="hljs-built_in">NUMBER</span>(<span class="hljs-number">5</span>);
  v_cod t_codigo;
<span class="hljs-keyword">BEGIN</span>
  v_cod := <span class="hljs-number">101</span>;
<span class="hljs-keyword">END</span>;
</code></pre>
<p>🔹 Útil quando você quer reaproveitar um tipo com mais clareza e consistência.</p>
<hr />
<h2 id="heading-exemplo-2-type-record-tipo-registro">✅ Exemplo 2: TYPE RECORD (tipo registro)</h2>
<pre><code class="lang-sql"><span class="hljs-keyword">DECLARE</span>
  <span class="hljs-keyword">TYPE</span> t_usuario <span class="hljs-keyword">IS</span> <span class="hljs-built_in">RECORD</span> (
    id_usuario   <span class="hljs-built_in">NUMBER</span>,
    nome         <span class="hljs-built_in">VARCHAR2</span>(<span class="hljs-number">100</span>),
    email        <span class="hljs-built_in">VARCHAR2</span>(<span class="hljs-number">100</span>)
  );

  v_user t_usuario;
<span class="hljs-keyword">BEGIN</span>
  v_user.id_usuario := <span class="hljs-number">1</span>;
  v_user.nome := 'João';
  v_user.email := 'joao@email.com';
<span class="hljs-keyword">END</span>;
</code></pre>
<p>🔹 Ótimo para <strong>representar uma linha de tabela</strong> ou dados compostos.</p>
<hr />
<h2 id="heading-exemplo-3-type-table-colecao-de-registros">✅ Exemplo 3: TYPE TABLE (coleção de registros)</h2>
<pre><code class="lang-sql"><span class="hljs-keyword">DECLARE</span>
  <span class="hljs-keyword">TYPE</span> t_lista_nomes <span class="hljs-keyword">IS</span> <span class="hljs-keyword">TABLE</span> <span class="hljs-keyword">OF</span> <span class="hljs-built_in">VARCHAR2</span>(<span class="hljs-number">50</span>);
  v_nomes t_lista_nomes := t_lista_nomes('Ana', 'Bruno', 'Carlos');
<span class="hljs-keyword">BEGIN</span>
  <span class="hljs-keyword">FOR</span> i <span class="hljs-keyword">IN</span> <span class="hljs-number">1</span> .. v_nomes.COUNT <span class="hljs-keyword">LOOP</span>
    DBMS_OUTPUT.PUT_LINE(v_nomes(i));
  <span class="hljs-keyword">END</span> <span class="hljs-keyword">LOOP</span>;
<span class="hljs-keyword">END</span>;
</code></pre>
<p>🔹 Muito útil para <strong>passar listas como parâmetro</strong> para procedures ou para processar coleções em loops.</p>
<hr />
<h2 id="heading-onde-usar-types">⚙️ Onde usar TYPES?</h2>
<ul>
<li><p>Dentro de procedures, functions ou packages</p>
</li>
<li><p>Para <strong>representar linhas de cursor</strong></p>
</li>
<li><p>Para <strong>devolver coleções</strong> de dados</p>
</li>
<li><p>Para <strong>organizar parâmetros de entrada e saída</strong></p>
</li>
</ul>
<hr />
<h2 id="heading-dica-real-de-uso">🧩 Dica real de uso</h2>
<p>Se você tem procedures que recebem muitos parâmetros, considere usar um <code>RECORD TYPE</code> para agrupá-los. Fica mais limpo, legível e fácil de manter.</p>
<hr />
<h2 id="heading-cuidados-ao-usar-types">🚫 Cuidados ao usar TYPES</h2>
<ul>
<li><p><strong>TYPES locais</strong> (dentro de procedures) <strong>não podem ser usados fora delas</strong></p>
</li>
<li><p>Se quiser reutilização global, declare no <code>PACKAGE SPEC</code></p>
</li>
<li><p>Evite tipos complexos desnecessários se um simples <code>VARCHAR2</code> resolver</p>
</li>
</ul>
<hr />
<h2 id="heading-conclusao">Conclusão</h2>
<p>Usar <code>TYPE</code> em PL/SQL é uma forma poderosa de escrever código mais organizado, seguro e reutilizável. Eles facilitam a leitura, reduzem erros e são ideais para trabalhar com dados estruturados e coleções.</p>
<hr />
<p>Se você curtiu esse conteúdo e quer mais dicas práticas de PL/SQL, me segue aqui ou no LinkedIn. E compartilha com aquele colega que vive fazendo <code>SELECT *</code> sem <code>TYPE</code> 😅</p>
]]></content:encoded></item><item><title><![CDATA[Procedures vs Functions em PL/SQL: quando usar cada uma?]]></title><description><![CDATA[Se você trabalha com PL/SQL, já deve ter se perguntado: qual a diferença entre uma procedure e uma function? E mais importante: quando usar cada uma?
Neste post, vou te mostrar as diferenças práticas com exemplos reais — sem enrolação.

🔍 Diferença ...]]></description><link>https://devpratico.dev/procedures-vs-functions-em-plsql-quando-usar-cada-uma</link><guid isPermaLink="true">https://devpratico.dev/procedures-vs-functions-em-plsql-quando-usar-cada-uma</guid><category><![CDATA[SQL]]></category><category><![CDATA[Oracle]]></category><category><![CDATA[PL/SQL]]></category><dc:creator><![CDATA[Matheus Almeida]]></dc:creator><pubDate>Fri, 11 Apr 2025 19:07:54 GMT</pubDate><content:encoded><![CDATA[<p>Se você trabalha com PL/SQL, já deve ter se perguntado: <strong>qual a diferença entre uma procedure e uma function?</strong> E mais importante: <strong>quando usar cada uma?</strong></p>
<p>Neste post, vou te mostrar as diferenças práticas com exemplos reais — sem enrolação.</p>
<hr />
<h2 id="heading-diferenca-principal">🔍 Diferença principal</h2>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Característica</td><td>Procedure</td><td>Function</td></tr>
</thead>
<tbody>
<tr>
<td>Retorno direto</td><td>Não retorna valor</td><td>Retorna obrigatoriamente um valor</td></tr>
<tr>
<td>Chamada</td><td>Executada com <code>EXEC</code> ou em bloco</td><td>Pode ser chamada em SELECTs</td></tr>
<tr>
<td>Uso em queries</td><td>❌ Não pode</td><td>✅ Pode</td></tr>
<tr>
<td>Finalidade comum</td><td>Realizar ações</td><td>Calcular e retornar algo</td></tr>
</tbody>
</table>
</div><hr />
<h2 id="heading-quando-usar-procedure">✅ Quando usar <strong>procedure</strong>?</h2>
<p>Use procedures quando você quiser <strong>executar uma ação</strong> que pode envolver várias operações, como:</p>
<ul>
<li><p>Inserções em múltiplas tabelas</p>
</li>
<li><p>Atualizações em massa</p>
</li>
<li><p>Envio de logs ou notificações</p>
</li>
<li><p>Execuções agendadas (jobs)</p>
</li>
</ul>
<h3 id="heading-exemplo">📌 Exemplo:</h3>
<pre><code class="lang-sql"><span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">OR</span> <span class="hljs-keyword">REPLACE</span> <span class="hljs-keyword">PROCEDURE</span> registrar_log(p_mensagem <span class="hljs-keyword">IN</span> <span class="hljs-built_in">VARCHAR2</span>) <span class="hljs-keyword">AS</span>
<span class="hljs-keyword">BEGIN</span>
  <span class="hljs-keyword">INSERT</span> <span class="hljs-keyword">INTO</span> <span class="hljs-keyword">logs</span> (mensagem, data_registro)
  <span class="hljs-keyword">VALUES</span> (p_mensagem, <span class="hljs-keyword">SYSDATE</span>);
<span class="hljs-keyword">END</span>;
</code></pre>
<h2 id="heading-quando-usar-function">✅ Quando usar <strong>function</strong>?</h2>
<p>Use functions quando precisar <strong>calcular e retornar um valor</strong>, especialmente se for usar dentro de queries.</p>
<ul>
<li><p>Calcular diferença de datas</p>
</li>
<li><p>Transformar ou formatar dados</p>
</li>
<li><p>Verificar regras (validações simples)</p>
</li>
</ul>
<h3 id="heading-exemplo-1">📌 Exemplo:</h3>
<pre><code class="lang-sql"><span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">OR</span> <span class="hljs-keyword">REPLACE</span> <span class="hljs-keyword">FUNCTION</span> idade_em_anos(p_data_nascimento <span class="hljs-keyword">IN</span> <span class="hljs-built_in">DATE</span>) <span class="hljs-keyword">RETURN</span> <span class="hljs-built_in">NUMBER</span> <span class="hljs-keyword">AS</span> 
<span class="hljs-keyword">BEGIN</span> 
    <span class="hljs-keyword">RETURN</span> TRUNC(MONTHS_BETWEEN(<span class="hljs-keyword">SYSDATE</span>, p_data_nascimento) / <span class="hljs-number">12</span>); 
<span class="hljs-keyword">END</span>;
</code></pre>
<h2 id="heading-cuidados-ao-usar-functions">⚠️ Cuidados ao usar functions</h2>
<ul>
<li><p>Evite funções com <strong>inserções, updates ou deletes</strong> (efeitos colaterais)</p>
</li>
<li><p>Não use funções pesadas em grandes SELECTs — pode impactar a performance</p>
</li>
<li><p>Functions usadas em WHERE ou JOIN precisam ser otimizadas</p>
</li>
</ul>
<hr />
<h2 id="heading-dica-pratica">🧠 Dica prática</h2>
<p>Se a rotina <strong>modifica dados ou só executa comandos</strong>, vá de <strong>procedure</strong>.</p>
<p>Se a rotina <strong>precisa ser usada dentro de uma query ou retornar um valor</strong>, vá de <strong>function</strong>.</p>
<hr />
<h2 id="heading-conclusao">Conclusão</h2>
<p>Entender quando usar procedure ou function melhora a performance, a organização do código e a legibilidade do seu PL/SQL. Use cada uma no seu contexto ideal — e seu sistema agradece!</p>
<hr />
<p>Se curtiu esse conteúdo, me segue aqui ou no LinkedIn! Em breve trago mais dicas práticas de PL/SQL e desenvolvimento backend real-oficial.</p>
]]></content:encoded></item><item><title><![CDATA[3 erros comuns ao escrever procedures em PL/SQL (e como corrigir)]]></title><description><![CDATA[Procedures são parte fundamental do desenvolvimento com PL/SQL — mas é comum ver códigos que, com o tempo, se tornam difíceis de entender, testar ou manter. Neste post, vou mostrar 3 erros comuns que vejo com frequência (e já cometi também), junto co...]]></description><link>https://devpratico.dev/3-erros-comuns-ao-escrever-procedures-em-plsql-e-como-corrigir</link><guid isPermaLink="true">https://devpratico.dev/3-erros-comuns-ao-escrever-procedures-em-plsql-e-como-corrigir</guid><category><![CDATA[Developer]]></category><category><![CDATA[PL/SQL]]></category><dc:creator><![CDATA[Matheus Almeida]]></dc:creator><pubDate>Thu, 10 Apr 2025 02:28:27 GMT</pubDate><content:encoded><![CDATA[<p>Procedures são parte fundamental do desenvolvimento com PL/SQL — mas é comum ver códigos que, com o tempo, se tornam difíceis de entender, testar ou manter. Neste post, vou mostrar 3 erros comuns que vejo com frequência (e já cometi também), junto com soluções simples pra evitá-los.</p>
<hr />
<h2 id="heading-erro-1-nao-isolar-a-logica-de-negocio">Erro 1: Não isolar a lógica de negócio</h2>
<p>É comum ver procedures que fazem "de tudo um pouco": validam dados, executam inserts, chamam outras procedures, retornam resultados... tudo junto.</p>
<p><strong>Problema:</strong> Isso dificulta testes, manutenção e reaproveitamento.</p>
<p><strong>Solução:</strong> Quebre a lógica em blocos reutilizáveis. Extraia validações para funções específicas, isole acessos ao banco quando possível.</p>
<pre><code class="lang-plaintext">-- Em vez de:
PROCEDURE processa_pedido(p_id IN NUMBER) IS
BEGIN
  IF p_id IS NULL THEN
    RAISE_APPLICATION_ERROR(-20001, 'ID inválido');
  END IF;
  -- lógica de negócio + insert + notificações etc...
END;

-- Faça:
FUNCTION valida_pedido(p_id IN NUMBER) RETURN BOOLEAN IS
BEGIN
  RETURN p_id IS NOT NULL;
END;

PROCEDURE processa_pedido(p_id IN NUMBER) IS
BEGIN
  IF NOT valida_pedido(p_id) THEN
    RAISE_APPLICATION_ERROR(-20001, 'ID inválido');
  END IF;
  -- lógica mais limpa aqui
END;
</code></pre>
<hr />
<h2 id="heading-erro-2-nao-tratar-excecoes-de-forma-adequada">Erro 2: Não tratar exceções de forma adequada</h2>
<p>Muita gente usa <code>WHEN OTHERS THEN NULL</code> sem pensar nas consequências.</p>
<p><strong>Problema:</strong> Isso engole erros críticos e torna o debug impossível.</p>
<p><strong>Solução:</strong> Sempre registre o erro ou, ao menos, retorne um código de erro claro.</p>
<pre><code class="lang-plaintext">-- Evite:
EXCEPTION
  WHEN OTHERS THEN
    NULL;

-- Melhor:
EXCEPTION
  WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE('Erro: ' || SQLERRM);
    RAISE;
</code></pre>
<hr />
<h2 id="heading-erro-3-nao-padronizar-nomes-e-estrutura">Erro 3: Não padronizar nomes e estrutura</h2>
<p>Procedures com nomes confusos, parâmetros inconsistentes ou organização despadronizada viram um pesadelo a longo prazo.</p>
<p><strong>Solução:</strong> Defina um padrão (mesmo que simples). Exemplo:</p>
<ul>
<li><p><code>proc_nomeDaFuncionalidade_acao</code> (ex: <code>proc_cliente_atualiza</code>)</p>
</li>
<li><p>Sempre declare parâmetros com modo (<code>IN</code>, <code>OUT</code>) e tipo explícito</p>
</li>
<li><p>Comente blocos maiores</p>
</li>
</ul>
<hr />
<h2 id="heading-conclusao">Conclusão</h2>
<p>Escrever PL/SQL limpo é uma habilidade que se desenvolve com prática e atenção aos detalhes. Evitar esses três erros já melhora bastante a qualidade das suas procedures. Se você curte esse tipo de conteúdo mais prático, me segue aqui no Hashnode — vou postar mais dicas de PL/SQL, APIs e testes em breve!</p>
<hr />
<p><strong>Ficou com dúvida ou tem outro erro comum pra compartilhar? Comenta aqui ou me chama no LinkedIn!</strong></p>
]]></content:encoded></item></channel></rss>