<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>arquitetura de software Archives - Leonardo Nascimento | Engenheiro de Software</title>
	<atom:link href="https://leonardonascimento.dev/tag/arquitetura-de-software/feed/" rel="self" type="application/rss+xml" />
	<link>https://leonardonascimento.dev/tag/arquitetura-de-software/</link>
	<description>Especializado em backend, APIs e sistemas escaláveis. Experiência em arquitetura de sistemas, integrações, mensageria, performance e aplicações de alta disponibilidade.</description>
	<lastBuildDate>Thu, 29 Jan 2026 16:54:19 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://leonardonascimento.dev/wp-content/uploads/2021/05/cropped-programming-32x32.png</url>
	<title>arquitetura de software Archives - Leonardo Nascimento | Engenheiro de Software</title>
	<link>https://leonardonascimento.dev/tag/arquitetura-de-software/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Arquitetura de uma API REST em Laravel preparada para produção</title>
		<link>https://leonardonascimento.dev/blog/arquitetura-de-uma-api-rest-em-laravel-preparada-para-producao/</link>
					<comments>https://leonardonascimento.dev/blog/arquitetura-de-uma-api-rest-em-laravel-preparada-para-producao/#respond</comments>
		
		<dc:creator><![CDATA[Leonardo]]></dc:creator>
		<pubDate>Wed, 28 Jan 2026 22:44:00 +0000</pubDate>
				<category><![CDATA[API]]></category>
		<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[Backend]]></category>
		<category><![CDATA[Dicas & Truques]]></category>
		<category><![CDATA[Laravel]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[teste]]></category>
		<category><![CDATA[api rest]]></category>
		<category><![CDATA[arquitetura de software]]></category>
		<category><![CDATA[autenticação api]]></category>
		<category><![CDATA[backend]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[ci/cd]]></category>
		<category><![CDATA[clean architecture]]></category>
		<category><![CDATA[desenvolvimento backend]]></category>
		<category><![CDATA[docker]]></category>
		<category><![CDATA[docker compose]]></category>
		<category><![CDATA[documentação api]]></category>
		<category><![CDATA[engenharia de software]]></category>
		<category><![CDATA[github actions]]></category>
		<category><![CDATA[laravel]]></category>
		<category><![CDATA[laravel sanctum]]></category>
		<category><![CDATA[postgresql]]></category>
		<category><![CDATA[projeto para portfólio]]></category>
		<category><![CDATA[redis]]></category>
		<category><![CDATA[repository pattern]]></category>
		<category><![CDATA[service layer]]></category>
		<category><![CDATA[swagger]]></category>
		<category><![CDATA[testes automatizados]]></category>
		<guid isPermaLink="false">https://leonardonascimento.dev/?p=2358</guid>

					<description><![CDATA[<p>Em processos seletivos técnicos, não basta entregar código funcional. Cada vez mais, empresas avaliam arquitetura, decisões técnicas, organização do projeto, automação e capacidade de escalar a solução. Este artigo detalha a arquitetura de uma API REST desenvolvida em Laravel para gerenciamento de tarefas, criada como parte de um teste técnico, mas estruturada como um projeto [&#8230;]</p>
<p>The post <a href="https://leonardonascimento.dev/blog/arquitetura-de-uma-api-rest-em-laravel-preparada-para-producao/">Arquitetura de uma API REST em Laravel preparada para produção</a> appeared first on <a href="https://leonardonascimento.dev">Leonardo Nascimento | Engenheiro de Software</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Em processos seletivos técnicos, não basta entregar código funcional. Cada vez mais, empresas avaliam <strong>arquitetura, decisões técnicas, organização do projeto, automação e capacidade de escalar a solução</strong>.</p>



<p>Este artigo detalha a arquitetura de uma <strong><a href="https://leonardonascimento.dev/blog/como-monitorar-aplicacao-e-servidor-pelo-whatsapp-logs-erros-e-alertas/" type="post" id="2290">API REST</a> desenvolvida em Laravel para gerenciamento de tarefas</strong>, <a href="https://github.com/leonardop21/laravel-task" type="link" id="https://github.com/leonardop21/laravel-task" target="_blank" rel="noreferrer noopener nofollow">criada como parte de um teste técnico,</a> mas estruturada como um projeto <strong>pronto para produção</strong>, seguindo boas práticas amplamente utilizadas em ambientes corporativos.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-visao-geral-da-solucao">Visão geral da solução</h2>



<p>A aplicação consiste em uma <strong>API RESTful para gerenciamento de tarefas</strong>, com suporte a:</p>



<ul class="wp-block-list">
<li>Autenticação via Bearer Token (Laravel Sanctum)</li>



<li>CRUD completo de tarefas</li>



<li>Marcação de tarefas como concluídas</li>



<li>Cache de consultas com Redis</li>



<li>Banco de dados PostgreSQL</li>



<li>Documentação interativa via Swagger</li>



<li>Ambiente Dockerizado (dev, test e prod)</li>



<li>Testes automatizados</li>



<li>Pipeline de CI/CD com GitHub Actions</li>
</ul>



<p>O foco não foi apenas “fazer funcionar”, mas <strong>pensar a aplicação como um produto escalável e previsível</strong>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-decisao-arquitetural-api-stateless-e-autenticacao">Decisão arquitetural: API stateless e autenticação</h2>



<p>A API foi construída como <strong>stateless</strong>, utilizando <strong>Bearer Token via Laravel Sanctum</strong>.</p>



<h3 class="wp-block-heading" id="h-beneficios-dessa-abordagem">Benefícios dessa abordagem:</h3>



<ul class="wp-block-list">
<li>Facilidade de integração com frontends (SPA, mobile, terceiros)</li>



<li>Independência de sessão</li>



<li>Escalabilidade horizontal</li>



<li>Compatibilidade com gateways, load balancers e proxies</li>
</ul>



<p>A autenticação é desacoplada do fluxo de negócio, o que facilita manutenção e evolução futura.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-postgresql-como-banco-principal">PostgreSQL como banco principal</h2>



<p>A escolha do <strong>PostgreSQL</strong> não foi aleatória. Ele é amplamente utilizado em ambientes corporativos por oferecer:</p>



<ul class="wp-block-list">
<li>Confiabilidade transacional</li>



<li>Suporte avançado a índices</li>



<li>Tipos de dados ricos</li>



<li>Excelente desempenho em cenários complexos</li>
</ul>



<p>Isso torna a aplicação preparada para crescer sem precisar trocar a base de dados no curto ou médio prazo.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-redis-como-camada-de-cache">Redis como camada de cache</h2>



<p>Para reduzir carga no banco e melhorar tempo de resposta, foi implementado <strong>cache com Redis</strong>, com TTL de 120 segundos nas consultas mais comuns.</p>



<h3 class="wp-block-heading" id="h-beneficios-diretos">Benefícios diretos:</h3>



<ul class="wp-block-list">
<li>Redução de queries repetitivas</li>



<li>Menor latência</li>



<li>Melhor desempenho sob carga</li>



<li>Escalabilidade em leitura</li>
</ul>



<p>Essa abordagem demonstra preocupação com <strong>performance real</strong>, não apenas com lógica funcional.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-arquitetura-limpa-repository-pattern-service-layer">Arquitetura limpa: Repository Pattern + Service Layer</h2>



<p><a href="https://leonardonascimento.dev/blog/php-alem-do-crud-como-escrever-codigo-que-nao-vira-problema-em-producao/" type="post" id="2348">A aplicação segue princípios de <strong>Clean Architecture</strong></a>, separando responsabilidades de forma clara:</p>



<ul class="wp-block-list">
<li><strong>Controllers</strong>: recebem requisições e retornam respostas</li>



<li><strong>Services</strong>: concentram regras de negócio</li>



<li><strong>Repositories</strong>: isolam o acesso a dados</li>



<li><strong>Models</strong>: representam as entidades</li>
</ul>



<h3 class="wp-block-heading" id="h-vantagens-dessa-separacao">Vantagens dessa separação:</h3>



<ul class="wp-block-list">
<li>Código mais legível</li>



<li>Facilidade de testes</li>



<li>Menor acoplamento</li>



<li>Evolução segura do domínio</li>
</ul>



<p>Essa estrutura é comum em times maduros e projetos de longo prazo.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-docker-como-base-do-ambiente">Docker como base do ambiente</h2>



<p>Toda a aplicação roda em <strong>Docker</strong>, com ambientes bem definidos:</p>



<h3 class="wp-block-heading" id="h-desenvolvimento">Desenvolvimento</h3>



<ul class="wp-block-list">
<li>Código em volume</li>



<li>Hot reload</li>



<li>PostgreSQL + Redis + Nginx</li>



<li>Testes executados automaticamente</li>
</ul>



<h3 class="wp-block-heading" id="h-producao">Produção</h3>



<ul class="wp-block-list">
<li>Build otimizado</li>



<li>Código embutido na imagem</li>



<li>Assets compilados no build</li>



<li>Sem dependência de volume</li>
</ul>



<p>Essa separação reduz o clássico problema de “funciona na minha máquina” e aproxima o ambiente local da produção.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-testes-automatizados-como-parte-do-fluxo">Testes automatizados como parte do fluxo</h2>



<p>A aplicação conta com <strong>testes unitários e de feature</strong>, executados de três formas:</p>



<ul class="wp-block-list">
<li>Localmente no ambiente dev</li>



<li>Isoladamente via Docker</li>



<li>Automaticamente no CI/CD</li>
</ul>



<p>Isso garante:</p>



<ul class="wp-block-list">
<li>Segurança para refatorações</li>



<li>Detecção precoce de bugs</li>



<li>Confiança na entrega contínua</li>
</ul>



<p>Testes não são tratados como opcional, mas como <strong>parte da arquitetura</strong>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-ci-cd-com-github-actions">CI/CD com GitHub Actions</h2>



<p>Cada push ou pull request dispara um workflow que:</p>



<ol class="wp-block-list">
<li>Sobe toda a stack Docker (app, banco, cache)</li>



<li>Executa migrations</li>



<li>Roda a suíte completa de testes</li>



<li>Bloqueia o merge em caso de falha</li>
</ol>



<p>Esse processo simula um pipeline real de empresas que operam com <strong>entrega contínua e qualidade de código como requisito</strong>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-documentacao-com-swagger">Documentação com Swagger</h2>



<p>A API possui <strong>documentação interativa via Swagger</strong>, acessível após subir a aplicação.</p>



<p>Isso permite:</p>



<ul class="wp-block-list">
<li>Testes manuais rápidos</li>



<li>Onboarding mais fácil</li>



<li>Comunicação clara entre backend e frontend</li>



<li>Uso por terceiros sem dependência de documentação externa</li>
</ul>



<p>Documentação é tratada como parte do produto, não como etapa posterior.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-beneficios-dessa-arquitetura-em-um-contexto-profissional">Benefícios dessa arquitetura em um contexto profissional</h2>



<p>Essa abordagem entrega vantagens claras em ambientes reais:</p>



<ul class="wp-block-list">
<li>Código organizado e previsível</li>



<li>Facilidade de manutenção</li>



<li>Escalabilidade técnica</li>



<li>Padronização de ambientes</li>



<li>Menor risco em deploys</li>



<li>Base sólida para crescimento</li>
</ul>



<p>Não se trata apenas de uma API de tarefas, mas de <strong>um modelo replicável para aplicações reais</strong>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-o-que-esse-projeto-demonstra-tecnicamente">O que esse projeto demonstra tecnicamente</h2>



<p>Esse projeto evidencia competências como:</p>



<ul class="wp-block-list">
<li><a href="http://leonardonascimento.dev/categoria/laravel">Domínio de Laravel além do básico</a></li>



<li>Conhecimento de arquitetura backend</li>



<li>Uso consciente de cache e banco</li>



<li>Experiência com Docker e ambientes reais</li>



<li>Cultura de testes</li>



<li>Automação de CI/CD</li>



<li>Pensamento orientado a produto e escala</li>
</ul>



<p>São exatamente esses pontos que diferenciam um desenvolvedor <strong>pleno/sênior</strong> em processos seletivos.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-conclusao">Conclusão</h2>



<p>Mais do que cumprir um teste técnico, o objetivo deste projeto foi demonstrar <strong>capacidade de pensar sistemas como um todo</strong>, indo além do CRUD simples.</p>



<p>Arquitetura, automação, testes e previsibilidade são o que tornam uma aplicação sustentável — e é isso que empresas buscam quando contratam profissionais para projetos de longo prazo.</p>



<p></p>



<p><a href="https://github.com/leonardop21/laravel-task" target="_blank" rel="noreferrer noopener nofollow">Link do teste prático</a></p>
<p>The post <a href="https://leonardonascimento.dev/blog/arquitetura-de-uma-api-rest-em-laravel-preparada-para-producao/">Arquitetura de uma API REST em Laravel preparada para produção</a> appeared first on <a href="https://leonardonascimento.dev">Leonardo Nascimento | Engenheiro de Software</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://leonardonascimento.dev/blog/arquitetura-de-uma-api-rest-em-laravel-preparada-para-producao/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>PHP além do CRUD: como escrever código que não vira problema em produção</title>
		<link>https://leonardonascimento.dev/blog/php-alem-do-crud-como-escrever-codigo-que-nao-vira-problema-em-producao/</link>
					<comments>https://leonardonascimento.dev/blog/php-alem-do-crud-como-escrever-codigo-que-nao-vira-problema-em-producao/#respond</comments>
		
		<dc:creator><![CDATA[Leonardo]]></dc:creator>
		<pubDate>Mon, 26 Jan 2026 11:05:00 +0000</pubDate>
				<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[Backend]]></category>
		<category><![CDATA[Laravel]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[arquitetura de software]]></category>
		<category><![CDATA[backend]]></category>
		<category><![CDATA[boas práticas]]></category>
		<category><![CDATA[código limpo]]></category>
		<category><![CDATA[dto]]></category>
		<category><![CDATA[engenharia de software]]></category>
		<category><![CDATA[php avançado]]></category>
		<category><![CDATA[services layer]]></category>
		<category><![CDATA[sistemas em produção]]></category>
		<guid isPermaLink="false">https://leonardonascimento.dev/?p=2348</guid>

					<description><![CDATA[<p>A maioria dos desenvolvedores PHP sabe fazer CRUD.Isso não te torna pleno. Muito menos sênior. O que diferencia um dev mais experiente não é o que ele sabe fazer, mas o que ele evita fazer. Vou te ensinar aqui um padrão prático, usado em projetos reais, que resolve três problemas clássicos: public function store(Request $request){if [&#8230;]</p>
<p>The post <a href="https://leonardonascimento.dev/blog/php-alem-do-crud-como-escrever-codigo-que-nao-vira-problema-em-producao/">PHP além do CRUD: como escrever código que não vira problema em produção</a> appeared first on <a href="https://leonardonascimento.dev">Leonardo Nascimento | Engenheiro de Software</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>A maioria dos desenvolvedores PHP sabe fazer CRUD.<br>Isso não te torna pleno. Muito menos sênior.</p>



<p>O que diferencia um dev mais experiente não é <em>o que ele sabe fazer</em>, mas <strong>o que ele evita fazer</strong>.</p>



<p>Vou te ensinar aqui <strong>um padrão prático</strong>, usado em projetos reais, que resolve três problemas clássicos:</p>



<ul class="wp-block-list">
<li>Controllers inchados</li>



<li>Regras de negócio espalhadas</li>



<li>Código impossível de testar ou evoluir</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>public function store(Request $request)<br>{<br>if (!$request-&gt;email) {<br>return response()-&gt;json([&#8216;error&#8217; =&gt; &#8216;Email obrigatório&#8217;], 422);<br>}</p>



<pre class="wp-block-code"><code>$user = User::create(&#91;
    'name' =&gt; $request-&gt;name,
    'email' =&gt; $request-&gt;email,
]);

Mail::to($user-&gt;email)-&gt;send(new WelcomeMail($user));

Log::info('Usuário criado', &#91;'id' =&gt; $user-&gt;id]);

return response()-&gt;json($user);</code></pre>



<p>}</p>



<p>Funciona? Funciona.</p>



<p>É bom? Não.</p>



<p>Por quê?</p>



<ul class="wp-block-list">
<li>Controller decide regra de negócio</li>



<li>Controller cria usuário</li>



<li>Controller dispara e-mail</li>



<li>Controller registra log</li>
</ul>



<p>Isso <strong>acopla tudo</strong>.</p>



<h2 class="wp-block-heading" id="h-pensamento-pleno-senior-separar-responsabilidade">Pensamento pleno/sênior: separar responsabilidade</h2>



<p>Controller <strong>não decide regra</strong>.<br>Controller <strong>orquestra</strong>.</p>



<p>Vamos refatorar com um <strong>Service + DTO</strong>, padrão simples e poderoso.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-criando-um-dto-data-transfer-object">Criando um DTO (Data Transfer Object)</h2>



<p>Isso evita Request sendo usado como regra de negócio.</p>



<pre class="wp-block-code"><code>final class CreateUserDTO
{
    public function __construct(
        public readonly string $name,
        public readonly string $email,
    ) {}
}
</code></pre>



<p>Simples, explícito e tipado.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-criando-o-service-onde-a-regra-mora"> Criando o Service (onde a regra mora)</h2>



<pre class="wp-block-code"><code>final class CreateUserService
{
    public function execute(CreateUserDTO $dto): User
    {
        if (!filter_var($dto-&gt;email, FILTER_VALIDATE_EMAIL)) {
            throw new InvalidArgumentException('Email inválido');
        }

        $user = User::create(&#91;
            'name' =&gt; $dto-&gt;name,
            'email' =&gt; $dto-&gt;email,
        ]);

        Mail::to($user-&gt;email)-&gt;send(new WelcomeMail($user));

        Log::info('Usuário criado', &#91;'id' =&gt; $user-&gt;id]);

        return $user;
    }
}
</code></pre>



<p>Agora sim:</p>



<ul class="wp-block-list">
<li>Regra centralizada</li>



<li>Código reutilizável</li>



<li>Fácil de testar</li>



<li>Fácil de evoluir</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-controller-limpo-como-deveria-ser"> Controller limpo (como deveria ser)</h2>



<pre class="wp-block-code"><code>public function store(Request $request, CreateUserService $service)
{
    $dto = new CreateUserDTO(
        name: $request-&gt;name,
        email: $request-&gt;email
    );

    $user = $service-&gt;execute($dto);

    return response()-&gt;json($user);
}
</code></pre>



<p>O controller:</p>



<ul class="wp-block-list">
<li>Recebe request</li>



<li>Constrói DTO</li>



<li>Chama serviço</li>



<li>Retorna resposta</li>
</ul>



<p>Nada além disso.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">O ganho real (que júnior não enxerga)</h2>



<h3 class="wp-block-heading" id="h-testabilidade">Testabilidade</h3>



<p>Agora você testa a regra <strong>sem framework</strong>:</p>



<pre class="wp-block-code"><code>public function test_user_creation()
{
    $service = new CreateUserService();

    $dto = new CreateUserDTO(
        name: 'Leo',
        email: 'leo@email.com'
    );

    $user = $service-&gt;execute($dto);

    $this-&gt;assertEquals('Leo', $user-&gt;name);
}
</code></pre>



<p>Sem Request.<br>Sem Controller.<br>Sem gambiarra.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading" id="h-evolucao-sem-dor"> Evolução sem dor</h3>



<p>Amanhã você precisa:</p>



<ul class="wp-block-list">
<li>Enviar evento para fila</li>



<li>Criar usuário em sistema externo</li>



<li>Validar regra nova</li>
</ul>



<p>Você altera <strong>um lugar só</strong>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Mentalidade sênior (isso vale ouro)</h2>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>&#8221; Código que funciona não é código bom.mCódigo bom é o que aguenta mudança.&#8221; </p>
</blockquote>



<p>Pleno/sênior pensa assim:</p>



<ul class="wp-block-list">
<li>Onde essa regra deve morar?</li>



<li>O que vai mudar daqui 6 meses?</li>



<li>Quem vai dar manutenção nisso?</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Erros clássicos que isso evita</h2>



<ul class="wp-block-list">
<li>Fat models</li>



<li>Controllers gigantes</li>



<li>Services que viram controllers</li>



<li>Regra duplicada</li>



<li>Código impossível de refatorar</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>Esse tipo de abordagem <strong>não aparece em tutorial de YouTube</strong>, mas é exatamente o que mantém sistemas vivos em produção.</p>
<p>The post <a href="https://leonardonascimento.dev/blog/php-alem-do-crud-como-escrever-codigo-que-nao-vira-problema-em-producao/">PHP além do CRUD: como escrever código que não vira problema em produção</a> appeared first on <a href="https://leonardonascimento.dev">Leonardo Nascimento | Engenheiro de Software</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://leonardonascimento.dev/blog/php-alem-do-crud-como-escrever-codigo-que-nao-vira-problema-em-producao/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Erros que já cometi em produção (e o que aprendi com eles)</title>
		<link>https://leonardonascimento.dev/blog/erros-que-ja-cometi-em-producao-e-o-que-aprendi-com-eles/</link>
					<comments>https://leonardonascimento.dev/blog/erros-que-ja-cometi-em-producao-e-o-que-aprendi-com-eles/#respond</comments>
		
		<dc:creator><![CDATA[Leonardo]]></dc:creator>
		<pubDate>Tue, 06 Jan 2026 15:41:00 +0000</pubDate>
				<category><![CDATA[Sem categoria]]></category>
		<category><![CDATA[aprendizado técnico]]></category>
		<category><![CDATA[arquitetura de software]]></category>
		<category><![CDATA[backend]]></category>
		<category><![CDATA[boas práticas]]></category>
		<category><![CDATA[erros em produção]]></category>
		<category><![CDATA[experiência real]]></category>
		<category><![CDATA[produção]]></category>
		<category><![CDATA[sistemas distribuídos]]></category>
		<guid isPermaLink="false">https://leonardonascimento.dev/?p=2259</guid>

					<description><![CDATA[<p>Produção cobra e cobra caro. E quase sempre ensina do jeito mais desconfortável possível. Ao longo do tempo, com sistemas rodando de verdade, usuários usando, integrações acontecendo e volume crescendo, alguns erros deixam de ser teóricos e passam a ter impacto real. Não são erros de sintaxe ou de framework. São erros de decisão, de [&#8230;]</p>
<p>The post <a href="https://leonardonascimento.dev/blog/erros-que-ja-cometi-em-producao-e-o-que-aprendi-com-eles/">Erros que já cometi em produção (e o que aprendi com eles)</a> appeared first on <a href="https://leonardonascimento.dev">Leonardo Nascimento | Engenheiro de Software</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Produção cobra e cobra caro. E quase sempre ensina do jeito mais desconfortável possível.</p>



<p>Ao longo do tempo, com sistemas rodando de verdade, usuários usando, integrações acontecendo e volume crescendo, alguns erros deixam de ser teóricos e passam a ter impacto real. Não são erros de sintaxe ou de framework. São erros de decisão, de suposição e, principalmente, de experiência.</p>



<p>Compartilhar esses erros não é exposição. É maturidade técnica.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>Um dos primeiros erros que cometi foi <strong>assumir que o “funciona local” era suficiente</strong>. O sistema atendia aos requisitos, passava nos testes básicos e parecia estável. O problema é que produção adiciona concorrência, latência, falhas externas e volume. Coisas que simplesmente não existem no ambiente local. Aprendi cedo que testar comportamento é diferente de testar contexto.</p>



<p>Outro erro recorrente foi <strong>confiar demais em serviços externos</strong>. APIs de terceiros pareciam estáveis até o dia em que começaram a responder lentamente ou falhar intermitentemente. Sem timeout bem definido, sem fallback e sem isolamento, o problema externo se transformou em indisponibilidade interna. A lição aqui foi clara: dependência externa precisa ser tratada como ponto de falha, não como extensão do seu sistema.</p>



<p>Também já subestimei o impacto da <strong>concorrência</strong>. Processos rodando em paralelo, filas consumidas por múltiplos workers e requisições simultâneas expuseram condições de corrida que nunca apareceram em teste. Duplicidade de execução, dados inconsistentes e comportamentos estranhos surgiram sem aviso. Foi aí que aprendi, na prática, que idempotência não é detalhe, é requisito.</p>



<p>Houve momentos em que <strong>cache foi usado como solução rápida</strong>, sem critério. Funcionou no início, melhorou performance, mas criou uma nova classe de problema: inconsistência. Dados desatualizados começaram a aparecer e o esforço para entender se o problema estava no código, no banco ou no cache aumentou bastante. Cache resolveu o sintoma, mas atrasou o diagnóstico da causa real.</p>



<p>Outro erro comum foi <strong>logar pouco ou logar demais</strong>. Logs insuficientes tornam qualquer incidente uma investigação no escuro. Logs excessivos, por outro lado, dificultam encontrar o que realmente importa. Com o tempo, aprendi que log bom é aquele que ajuda a responder perguntas, não o que registra tudo.</p>



<p>Já deixei passar também a importância de <strong>monitorar comportamento, não só infraestrutura</strong>. CPU e memória estavam normais, mas usuários reclamavam de lentidão. O problema não era recurso, era fluxo. A partir daí, ficou claro que disponibilidade e latência percebida dizem muito mais sobre a saúde do sistema do que gráficos isolados.</p>



<p>Em alguns momentos, tomei decisões de arquitetura rígidas cedo demais. Abstrações complexas criadas “pensando no futuro” acabaram dificultando mudanças simples. Arquitetura precisa dar suporte à evolução, não impedir. Esse tipo de erro não quebra o sistema imediatamente, mas cobra juros altos com o tempo.</p>



<p>Por fim, talvez o erro mais sutil tenha sido <strong>não tratar operação como parte do desenvolvimento</strong>. Código foi escrito pensando em funcionalidade, não em manutenção, observabilidade ou resposta a incidentes. Produção mostrou que escrever código é apenas uma parte do trabalho. Operar o sistema é a outra metade.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">O que ficou de aprendizado</h2>



<p>Produção não perdoa suposições. Ela expõe decisões frágeis, atalhos técnicos e falta de preparo. Cada erro deixou uma lição clara: sistemas precisam ser pensados para falhar, para escalar e para serem operados por pessoas reais.</p>



<p>Errar faz parte. Repetir os mesmos erros é escolha.</p>
<p>The post <a href="https://leonardonascimento.dev/blog/erros-que-ja-cometi-em-producao-e-o-que-aprendi-com-eles/">Erros que já cometi em produção (e o que aprendi com eles)</a> appeared first on <a href="https://leonardonascimento.dev">Leonardo Nascimento | Engenheiro de Software</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://leonardonascimento.dev/blog/erros-que-ja-cometi-em-producao-e-o-que-aprendi-com-eles/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Pensar arquitetura antes de escrever código ou sair escrevendo e depois ver no que da?</title>
		<link>https://leonardonascimento.dev/blog/pensar-arquitetura-antes-de-escrever-codigo-ou-sair-escrevendo-e-depois-ver-no-que-da/</link>
					<comments>https://leonardonascimento.dev/blog/pensar-arquitetura-antes-de-escrever-codigo-ou-sair-escrevendo-e-depois-ver-no-que-da/#respond</comments>
		
		<dc:creator><![CDATA[Leonardo]]></dc:creator>
		<pubDate>Sun, 04 Jan 2026 17:56:00 +0000</pubDate>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[arquitetura de software]]></category>
		<category><![CDATA[backend]]></category>
		<category><![CDATA[boas práticas]]></category>
		<category><![CDATA[manutenibilidade]]></category>
		<category><![CDATA[produção]]></category>
		<category><![CDATA[qualidade de código]]></category>
		<guid isPermaLink="false">https://leonardonascimento.dev/?p=2254</guid>

					<description><![CDATA[<p>É muito comum começar um sistema abrindo o editor e escrevendo código. Cria um controller, faz uma query, retorna uma resposta e segue o jogo. No começo funciona. E exatamente por isso muita gente continua fazendo assim. O problema é que essa forma de trabalhar escala muito mal. Quando o sistema cresce, quando entra mais [&#8230;]</p>
<p>The post <a href="https://leonardonascimento.dev/blog/pensar-arquitetura-antes-de-escrever-codigo-ou-sair-escrevendo-e-depois-ver-no-que-da/">Pensar arquitetura antes de escrever código ou sair escrevendo e depois ver no que da?</a> appeared first on <a href="https://leonardonascimento.dev">Leonardo Nascimento | Engenheiro de Software</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>É muito comum começar um sistema abrindo o editor e escrevendo código. Cria um controller, faz uma query, retorna uma resposta e segue o jogo. No começo funciona. E exatamente por isso muita gente continua fazendo assim.</p>



<p>O problema é que essa forma de trabalhar escala muito mal.</p>



<p>Quando o sistema cresce, quando entra mais gente no time ou quando surgem novas regras, aquele código que “resolvia” começa a virar um emaranhado difícil de mexer. E aí surge a sensação de que qualquer mudança simples dá trabalho demais.</p>



<p>Isso quase nunca é culpa do código em si. Normalmente é arquitetura que nunca foi pensada.</p>



<p>Código muda o tempo todo. Arquitetura não.</p>



<p>Funções são reescritas, métodos são refatorados, nomes são ajustados. Mas a forma como o sistema foi estruturado lá no começo costuma durar anos. Se a base foi mal pensada, você passa muito tempo brigando com decisões antigas.</p>



<p>É por isso que arquitetura não é detalhe. Ela define o quanto o sistema vai te ajudar ou te atrapalhar no futuro.</p>



<p>Outro erro comum é começar pensando em ferramenta.</p>



<p>“Como faço isso no Laravel?”<br>“Qual padrão eu uso aqui?”<br>“Isso vira um service ou um job?”</p>



<p>Essas perguntas vêm cedo demais.</p>



<p>Antes disso, o que realmente importa é entender o problema. O fluxo. O que entra, o que sai, o que pode falhar, o que precisa ser consistente. Quando isso não está claro, qualquer código escrito vira tentativa e erro.</p>



<p>Framework ajuda, mas não pensa por você.</p>



<p>Misturar responsabilidade quase sempre parece produtivo no início.</p>



<p>Coloca regra no controller, resolve ali mesmo, já retorna a resposta e pronto. Funciona rápido. Até o dia em que você precisa reutilizar aquela lógica, testar isoladamente ou mudar um comportamento sem quebrar outro.</p>



<p>Quando tudo está no mesmo lugar, nada está realmente isolado.</p>



<p>Separar responsabilidade não é academicismo. É o que evita que uma mudança pequena vire um risco desnecessário.</p>



<p>Uma coisa que ajuda muito é pensar no fluxo antes de pensar em classes.</p>



<p>De onde vem o dado?<br>O que valida?<br>Onde a regra acontece?<br>O que persiste?<br>O que retorna?</p>



<p>Quando esse caminho está claro na cabeça, o código flui. Quando não está, você sente que está “programando no escuro”.</p>



<p>Arquitetura ruim costuma esconder dependências.</p>



<p>Você só descobre que uma parte do sistema depende de outra quando tenta mexer em algo e tudo quebra. Isso acontece porque essas dependências nunca foram assumidas, só foram surgindo.</p>



<p>Dependência explícita dói menos do que dependência escondida.</p>



<p>Produção exige previsibilidade.</p>



<p>Não é só sobre funcionar agora, é sobre saber o impacto de uma mudança. Quando a arquitetura é confusa, qualquer ajuste vira medo. Quando é clara, você sabe exatamente onde mexer e o que pode ser afetado.</p>



<p>Esse tipo de tranquilidade não vem do código bonito. Vem de decisões bem pensadas.</p>



<p>Também vale um cuidado importante: decisões irreversíveis cedo demais</p>



<p>Criar abstrações complexas, padrões genéricos ou estruturas “pensando no futuro” costuma travar o sistema antes mesmo dele crescer. Boa arquitetura é flexível. Ela resolve o problema atual sem impedir evolução.</p>



<p>Complexidade prematura cobra juros.</p>



<p>Pensar arquitetura não significa desenhar diagramas enormes nem usar nomes sofisticados. Na maioria das vezes, boa arquitetura é simples o suficiente para ser explicada em poucos minutos.</p>



<p>Se você não consegue explicar como o sistema funciona, provavelmente ele já está mais complexo do que deveria.</p>



<p>No começo, pensar arquitetura parece atrasar. Depois de alguns meses, ela economiza tempo. Menos retrabalho, menos bug colateral, menos receio de mexer no código.</p>



<p>O ganho não é imediato, mas é consistente.</p>



<p><strong>Conclusão</strong></p>



<p>Pensar arquitetura antes de escrever código não é tentar prever tudo. É reduzir incerteza.</p>



<p>É entender o problema antes de sair codando. É isso que separa sistemas que evoluem com tranquilidade daqueles que vão acumulando problemas silenciosos até virar dívida difícil de pagar.</p>
<p>The post <a href="https://leonardonascimento.dev/blog/pensar-arquitetura-antes-de-escrever-codigo-ou-sair-escrevendo-e-depois-ver-no-que-da/">Pensar arquitetura antes de escrever código ou sair escrevendo e depois ver no que da?</a> appeared first on <a href="https://leonardonascimento.dev">Leonardo Nascimento | Engenheiro de Software</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://leonardonascimento.dev/blog/pensar-arquitetura-antes-de-escrever-codigo-ou-sair-escrevendo-e-depois-ver-no-que-da/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Quando usar cache (e quando ele só complica o sistema)</title>
		<link>https://leonardonascimento.dev/blog/quando-usar-cache-e-quando-ele-so-complica-o-sistema/</link>
					<comments>https://leonardonascimento.dev/blog/quando-usar-cache-e-quando-ele-so-complica-o-sistema/#respond</comments>
		
		<dc:creator><![CDATA[Leonardo]]></dc:creator>
		<pubDate>Sat, 03 Jan 2026 16:47:00 +0000</pubDate>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[arquitetura de software]]></category>
		<category><![CDATA[backend]]></category>
		<category><![CDATA[boas práticas]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[performance]]></category>
		<guid isPermaLink="false">https://leonardonascimento.dev/?p=2251</guid>

					<description><![CDATA[<p>Cache costuma entrar na conversa sempre que alguém fala em performance. A ideia é simples: “se está lento, coloca cache”. O problema é que, na prática, cache mal aplicado resolve um problema e cria outros. Não é raro ver sistemas que até funcionam bem sem cache, mas ficam difíceis de manter depois que ele entra [&#8230;]</p>
<p>The post <a href="https://leonardonascimento.dev/blog/quando-usar-cache-e-quando-ele-so-complica-o-sistema/">Quando usar cache (e quando ele só complica o sistema)</a> appeared first on <a href="https://leonardonascimento.dev">Leonardo Nascimento | Engenheiro de Software</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Cache costuma entrar na conversa sempre que alguém fala em performance. A ideia é simples: “se está lento, coloca cache”. O problema é que, na prática, cache mal aplicado resolve um problema e cria outros.</p>



<p>Não é raro ver sistemas que até funcionam bem sem cache, mas ficam difíceis de manter depois que ele entra sem critério.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Cache não é ponto de partida</h2>



<p>Antes de pensar em cache, vale responder uma pergunta básica:<br><strong>onde o sistema está lento?</strong></p>



<p>Muitas vezes o problema não é falta de cache, mas:</p>



<ul class="wp-block-list">
<li>query mal escrita;</li>



<li>lógica duplicada;</li>



<li>processamento desnecessário;</li>



<li>excesso de chamadas externas.</li>
</ul>



<p>Colocar cache sem entender o gargalo real só esconde o problema por um tempo.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Quando cache realmente faz sentido</h2>



<p>Cache funciona bem quando você tem:</p>



<ul class="wp-block-list">
<li>dados lidos muitas vezes;</li>



<li>dados que mudam pouco;</li>



<li>custo alto de processamento ou consulta.</li>
</ul>



<p>Configurações, listas estáticas, resultados agregados e respostas de APIs externas são bons candidatos. Nesse cenário, o cache reduz carga e melhora tempo de resposta de forma consistente.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">O problema começa na invalidação</h2>



<p>Cache quase nunca dá problema na criação. Ele dá problema na invalidação.</p>



<p>Quando não fica claro:</p>



<ul class="wp-block-list">
<li>quando o cache expira;</li>



<li>quem invalida;</li>



<li>o que acontece se falhar;</li>
</ul>



<p>o sistema começa a servir dado errado. E dado errado em produção costuma ser pior que erro explícito.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Cache que vira dependência</h2>



<p>Um sinal claro de problema é quando o sistema <strong>depende</strong> do cache para funcionar corretamente.</p>



<p>Se desligar o cache quebra tudo, isso indica que:</p>



<ul class="wp-block-list">
<li>a lógica base não está saudável;</li>



<li>o cache está mascarando problemas estruturais;</li>



<li>o código ficou acoplado demais a essa camada.</li>
</ul>



<p>Cache deveria acelerar, não sustentar o sistema.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Cuidado com cache em dados muito voláteis</h2>



<p>Cache em dados que mudam o tempo todo geralmente gera:</p>



<ul class="wp-block-list">
<li>inconsistência;</li>



<li>comportamento estranho;</li>



<li>bugs intermitentes.</li>
</ul>



<p>Quanto mais volátil o dado, maior o custo mental e técnico para manter o cache correto. Em muitos casos, o ganho de performance não compensa a complexidade introduzida.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Cache também tem custo</h2>



<p>Cache não é gratuito.</p>



<p>Ele consome memória, adiciona mais uma camada ao sistema e aumenta a complexidade de debug. Quando algo dá errado, você precisa verificar:</p>



<ul class="wp-block-list">
<li>código;</li>



<li>banco;</li>



<li>cache;</li>



<li>estratégia de expiração.</li>
</ul>



<p>Cada camada extra aumenta o esforço para entender o que está acontecendo.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Uma regra simples que ajuda</h2>



<p>Uma regra prática que costuma funcionar bem:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Primeiro, faça o sistema funcionar corretamente sem cache.<br>Depois, use cache para otimizar pontos específicos e bem entendidos.</p>
</blockquote>



<p>Isso evita decisões precipitadas e mantém o sistema mais previsível.</p>



<h2 class="wp-block-heading">Bancos de cache, CDN e cache em borda: onde cada um faz sentido</h2>



<p>Quando se fala em cache, muita gente mistura tudo como se fosse a mesma coisa. Na prática, existem <strong>camadas diferentes de cache</strong>, cada uma com um papel específico. Entender isso evita decisões erradas e expectativas irreais.</p>



<h2 class="wp-block-heading">Cache em memória (Redis, Memcached)</h2>



<p>Bancos de cache em memória, como Redis, são muito usados no backend porque são rápidos e flexíveis. Eles fazem sentido quando você precisa:</p>



<ul class="wp-block-list">
<li>reduzir acesso ao banco de dados;</li>



<li>compartilhar cache entre múltiplos processos;</li>



<li>armazenar dados temporários com expiração controlada;</li>



<li>lidar com alta concorrência.</li>
</ul>



<p>Redis funciona muito bem para:</p>



<ul class="wp-block-list">
<li>resultados de queries pesadas;</li>



<li>locks e controle de concorrência;</li>



<li>sessões;</li>



<li>dados derivados de outras fontes.</li>
</ul>



<p>O erro comum aqui é transformar o Redis em “banco principal”. Cache não é fonte de verdade. Se os dados do Redis forem perdidos, o sistema precisa continuar funcionando.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Cache de aplicação ≠ cache de infraestrutura</h2>



<p>Cache dentro da aplicação resolve problemas diferentes de cache na borda.</p>



<p>Cache de aplicação (Redis, cache local, etc):</p>



<ul class="wp-block-list">
<li>reduz custo de processamento;</li>



<li>protege banco e serviços internos;</li>



<li>atua no backend.</li>
</ul>



<p>Já cache de infraestrutura atua <strong>antes</strong> da requisição chegar no servidor.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">CDN e cache em borda</h2>



<p>CDN (Content Delivery Network) e cache em borda são ideais para:</p>



<ul class="wp-block-list">
<li>conteúdo estático;</li>



<li>respostas públicas;</li>



<li>páginas que não mudam com frequência.</li>
</ul>



<p>Nesse cenário, o cache:</p>



<ul class="wp-block-list">
<li>reduz latência;</li>



<li>diminui carga no servidor;</li>



<li>melhora experiência do usuário.</li>
</ul>



<p>Cloudflare, por exemplo, atua nesse nível, servindo conteúdo direto da borda sem que a requisição chegue no backend.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Cloudflare não substitui cache de backend</h2>



<p>Um erro comum é achar que, usando Cloudflare ou outra CDN, não é mais necessário cache no backend. Isso não é verdade.</p>



<p>Cloudflare:</p>



<ul class="wp-block-list">
<li>ajuda muito com páginas públicas;</li>



<li>protege contra picos de acesso;</li>



<li>reduz tráfego direto no servidor.</li>
</ul>



<p>Mas ele não resolve:</p>



<ul class="wp-block-list">
<li>lógica pesada no backend;</li>



<li>chamadas internas;</li>



<li>processamento de regras de negócio;</li>



<li>APIs autenticadas.</li>
</ul>



<p>As camadas se complementam, não se substituem.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Combinar camadas de cache com consciência</h2>



<p>Em sistemas mais maduros, é comum ter:</p>



<ul class="wp-block-list">
<li>cache em Redis no backend;</li>



<li>cache HTTP para respostas públicas;</li>



<li>CDN para conteúdo estático;</li>



<li>regras claras de expiração e invalidação.</li>
</ul>



<p>O ponto crítico é não perder controle. Quanto mais camadas, maior a necessidade de saber:</p>



<ul class="wp-block-list">
<li>onde o dado está sendo cacheado;</li>



<li>por quanto tempo;</li>



<li>quem invalida.</li>
</ul>



<p>Sem isso, debug vira loteria.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Cache certo no lugar certo</h2>



<p>Não existe “o melhor cache”. Existe cache adequado ao problema.</p>



<p>Usar Redis para tudo, Cloudflare para tudo ou cachear tudo geralmente leva a soluções frágeis. Cada camada resolve um tipo de problema específico, e ignorar isso gera sistemas difíceis de operar.</p>



<h2 class="wp-block-heading">Um exemplo prático de cache bem aplicado em alto volume</h2>



<p>Em um projeto onde trabalhei, o sistema recebia mais de <strong>30 milhões de visualizações por mês</strong>. O volume era alto, os picos eram imprevisíveis e qualquer erro de arquitetura aparecia rápido.</p>



<p>A solução não foi um único tipo de cache, mas a <strong>combinação correta de camadas</strong>, cada uma resolvendo um problema específico.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">Cache no backend</h3>



<p>No backend, utilizávamos cache em memória para reduzir acesso ao banco e evitar processamento repetido. Consultas mais pesadas e dados derivados eram armazenados com tempo de vida bem definido.</p>



<p>Esse cache não era tratado como fonte de verdade. Se fosse limpo ou reiniciado, o sistema continuava funcionando normalmente, apenas com impacto temporário de performance.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">Cache no servidor web</h3>



<p>No nível do servidor web, respostas públicas eram cacheadas diretamente, evitando que requisições idênticas chegassem até a aplicação.</p>



<p>Isso reduzia drasticamente:</p>



<ul class="wp-block-list">
<li>consumo de CPU;</li>



<li>execução de código desnecessário;</li>



<li>abertura de conexões com o backend.</li>
</ul>



<p>Para grande parte do tráfego, a aplicação nem chegava a ser executada.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">Cache em servidor de borda</h3>



<p>Além disso, havia cache em servidores distribuídos geograficamente, entregando conteúdo diretamente próximo ao usuário final.</p>



<p>Essa camada absorvia picos de acesso e reduzia latência, principalmente em horários de maior tráfego. Em muitos casos, a requisição nem chegava ao servidor de origem.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">O ponto mais importante: controle</h3>



<p>O que fez essa estratégia funcionar não foi o volume de cache, mas o <strong>controle sobre ele</strong>.</p>



<p>Cada camada tinha:</p>



<ul class="wp-block-list">
<li>regras claras de expiração;</li>



<li>critérios bem definidos de cache e bypass;</li>



<li>invalidação consciente quando o conteúdo mudava.</li>
</ul>



<p>Nada era “cacheado por padrão”.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">O resultado prático</h3>



<p>Com essa abordagem:</p>



<ul class="wp-block-list">
<li>o sistema se manteve estável mesmo em picos;</li>



<li>o backend ficou protegido;</li>



<li>o banco deixou de ser gargalo;</li>



<li>a operação ficou previsível.</li>
</ul>



<p>Cache não foi usado como remendo, mas como parte da arquitetura.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">Lição aprendida</h3>



<p>Cache funciona quando é pensado como <strong>estratégia</strong>, não como solução emergencial. Em sistemas de alto volume, separar responsabilidades entre backend, servidor web e borda faz toda a diferença.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Conclusão</h2>



<p>Cache é uma ferramenta poderosa, mas perigosa quando usada sem critério. Ele melhora performance quando aplicado com consciência, e cria problemas quando entra apenas como “solução rápida”.</p>



<p>Entender quando <strong>não usar cache</strong> é tão importante quanto saber usá-lo.</p>
<p>The post <a href="https://leonardonascimento.dev/blog/quando-usar-cache-e-quando-ele-so-complica-o-sistema/">Quando usar cache (e quando ele só complica o sistema)</a> appeared first on <a href="https://leonardonascimento.dev">Leonardo Nascimento | Engenheiro de Software</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://leonardonascimento.dev/blog/quando-usar-cache-e-quando-ele-so-complica-o-sistema/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Código em produção: você tem certeza de que ele está pronto?</title>
		<link>https://leonardonascimento.dev/blog/codigo-em-producao-voce-tem-certeza-de-que-ele-esta-pronto/</link>
					<comments>https://leonardonascimento.dev/blog/codigo-em-producao-voce-tem-certeza-de-que-ele-esta-pronto/#respond</comments>
		
		<dc:creator><![CDATA[Leonardo]]></dc:creator>
		<pubDate>Thu, 01 Jan 2026 15:45:00 +0000</pubDate>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[arquitetura de software]]></category>
		<category><![CDATA[backend]]></category>
		<category><![CDATA[boas práticas]]></category>
		<category><![CDATA[manutenibilidade]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[produção]]></category>
		<guid isPermaLink="false">https://leonardonascimento.dev/?p=2245</guid>

					<description><![CDATA[<p>Na minha máquina funciona, isso é o suficiente? Muita gente confunde código que simplesmente funciona com código que está realmente pronto para rodar em produção. A diferença entre um e outro costuma aparecer no pior momento possível: em pico de acesso, durante uma campanha, com cliente reclamando ou com o sistema fora do ar. Funcionar [&#8230;]</p>
<p>The post <a href="https://leonardonascimento.dev/blog/codigo-em-producao-voce-tem-certeza-de-que-ele-esta-pronto/">Código em produção: você tem certeza de que ele está pronto?</a> appeared first on <a href="https://leonardonascimento.dev">Leonardo Nascimento | Engenheiro de Software</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Na minha máquina funciona, isso é o suficiente?</p>



<p>Muita gente confunde código que simplesmente funciona com código que está realmente pronto para rodar em produção. A diferença entre um e outro costuma aparecer no pior momento possível: em pico de acesso, durante uma campanha, com cliente reclamando ou com o sistema fora do ar.</p>



<p>Funcionar significa que o código faz o que foi pedido.<br>Código pronto para produção significa que ele continua funcionando <strong>quando tudo começa a dar errado</strong>.</p>



<p>Na prática, código pronto para produção:</p>



<ul class="wp-block-list">
<li>lida com erros de forma previsível;</li>



<li>escala quando a carga aumenta;</li>



<li>se comporta bem sob concorrência;</li>



<li>é observável;</li>



<li>pode ser mantido sem medo;</li>



<li>não depende de sorte.</li>
</ul>



<p></p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">1) Tratamento de erros</h2>



<p>Produção é um ambiente imprevisível. APIs externas caem. Banco fica lento. Cache expira. Timeouts acontecem.</p>



<p>Se o seu código assume que tudo sempre vai responder corretamente, ele vai quebrar — e rápido.</p>



<p>Código de produção:</p>



<ul class="wp-block-list">
<li>trata exceções;</li>



<li>captura falhas externas;</li>



<li>retorna erros claros;</li>



<li>evita estados quebrados.</li>
</ul>



<p>Ignorar erros não faz eles desaparecerem. Só faz você descobri-los tarde demais.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">2) Concorrência</h2>



<p>Concorrência é real. E não é opcional.</p>



<p>Vários usuários, múltiplos processos, jobs rodando ao mesmo tempo, filas sendo consumidas em paralelo. Se o sistema não foi pensado para isso, os problemas aparecem como:</p>



<ul class="wp-block-list">
<li>condições de corrida;</li>



<li>duplicidade de processamento;</li>



<li>registros inconsistentes;</li>



<li>dados sobrescritos.</li>
</ul>



<p>Código que funciona com um usuário não necessariamente funciona com cem.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">3) Idempotência</h2>



<p>Esse ponto é ignorado por muita gente.</p>



<p>Em produção, requisições podem ser reenviadas, jobs podem ser reprocessados, webhooks podem disparar mais de uma vez. Se sua lógica não for idempotente, você terá:</p>



<ul class="wp-block-list">
<li>registros duplicados;</li>



<li>ações executadas mais de uma vez;</li>



<li>efeitos colaterais difíceis de desfazer.</li>
</ul>



<p>Código de produção precisa assumir que <strong>a mesma ação pode chegar mais de uma vez</strong>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">4) Observabilidade</h2>



<p>Sem logs estruturados, métricas e alertas, você não tem controle — só reação.</p>



<p>Quando algo quebra e você depende de usuário reclamando para descobrir, o problema já escalou.</p>



<p>Código pronto para produção:</p>



<ul class="wp-block-list">
<li>registra eventos relevantes;</li>



<li>gera logs que ajudam a investigar;</li>



<li>permite entender o que aconteceu sem “chutar”.</li>
</ul>



<p>Debug em produção não pode ser baseado em achismo.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">5) Performance previsível</h2>



<p>Performance não é só velocidade. É previsibilidade.</p>



<p>Um endpoint que responde em 50ms hoje e em 5s amanhã é um problema, mesmo que “funcione”.</p>



<p>Código de produção:</p>



<ul class="wp-block-list">
<li>evita queries desnecessárias;</li>



<li>não faz processamento pesado sem controle;</li>



<li>considera impacto de volume e concorrência.</li>
</ul>



<p>O objetivo não é ser rápido no melhor cenário, mas <strong>estável no pior</strong>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">6) Isolamento de responsabilidades</h2>



<p>Misturar regra de negócio, acesso a dados e controle de requisição cria código frágil.</p>



<p>Quando tudo está acoplado:</p>



<ul class="wp-block-list">
<li>mudanças pequenas viram grandes refatorações;</li>



<li>bugs aparecem em lugares inesperados;</li>



<li>testes se tornam difíceis ou impossíveis.</li>
</ul>



<p>Código de produção separa responsabilidades para reduzir impacto de mudanças.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">7) Dependências externas sob controle</h2>



<p>Qualquer integração externa é um ponto de falha.</p>



<p>APIs de terceiros, serviços de pagamento, mensageria, armazenamento. Tudo isso pode falhar.</p>



<p>Código pronto para produção:</p>



<ul class="wp-block-list">
<li>define timeouts;</li>



<li>controla retries;</li>



<li>trata respostas inesperadas;</li>



<li>evita travar o sistema por dependência externa.</li>
</ul>



<p>Assumir que serviços externos “sempre funcionam” é ingenuidade.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">8) Configuração e ambiente</h2>



<p>Código de produção não depende de configuração hardcoded.</p>



<p>Ambientes mudam: local, staging, produção, múltiplos servidores, múltiplos clientes. Se o código não respeita isso, o deploy vira um risco.</p>



<p>Separar configuração de código não é frescura. É requisito básico.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">9) Manutenibilidade</h2>



<p>Se depois de um mês você não entende o que escreveu, o problema não é memória — é o código.</p>



<p>Produção é manutenção contínua. Código precisa ser:</p>



<ul class="wp-block-list">
<li>legível;</li>



<li>previsível;</li>



<li>organizado.</li>
</ul>



<p>Código bom não é o mais curto nem o mais “esperto”. É o que dá menos medo de mexer.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">10) Pensar no impacto futuro</h2>



<p>Código que funciona resolve o agora.<br>Código pronto para produção considera o depois.</p>



<p>Depois de:</p>



<ul class="wp-block-list">
<li>novos usuários;</li>



<li>novas regras;</li>



<li>novas integrações;</li>



<li>novos desenvolvedores no time.</li>
</ul>



<p>Decisões técnicas ruins não quebram tudo na hora — elas cobram juros com o tempo.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Conclusão</h2>



<p>Código pronto para produção não é sobre escrever mais código, usar mais ferramentas ou aplicar padrões complexos.</p>



<p>É sobre responsabilidade técnica.</p>



<p>É pensar no que pode dar errado, assumir que vai dar, e preparar o sistema para continuar funcionando mesmo assim. Essa é a diferença real entre sistemas estáveis e sistemas problemáticos.</p>
<p>The post <a href="https://leonardonascimento.dev/blog/codigo-em-producao-voce-tem-certeza-de-que-ele-esta-pronto/">Código em produção: você tem certeza de que ele está pronto?</a> appeared first on <a href="https://leonardonascimento.dev">Leonardo Nascimento | Engenheiro de Software</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://leonardonascimento.dev/blog/codigo-em-producao-voce-tem-certeza-de-que-ele-esta-pronto/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
