<?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>essencia.dev</title>
	<atom:link href="https://essencia.dev/feed/" rel="self" type="application/rss+xml" />
	<link>https://essencia.dev/</link>
	<description>Tecnologia, desenvolvimento e arquitetura de software com profundidade</description>
	<lastBuildDate>Sat, 10 Jan 2026 18:02:33 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9</generator>

<image>
	<url>https://essencia.dev/wp-content/uploads/2025/12/essencia.dev-laranja-caneca-150x150.png</url>
	<title>essencia.dev</title>
	<link>https://essencia.dev/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Overengineering as a Service: O custo oculto da facilidade na nuvem</title>
		<link>https://essencia.dev/overengineering-as-a-service-o-custo-oculto-da-facilidade-na-nuvem/</link>
					<comments>https://essencia.dev/overengineering-as-a-service-o-custo-oculto-da-facilidade-na-nuvem/#respond</comments>
		
		<dc:creator><![CDATA[Bernardo Lobato]]></dc:creator>
		<pubDate>Sat, 10 Jan 2026 17:54:03 +0000</pubDate>
				<category><![CDATA[Arquitetura de Software]]></category>
		<category><![CDATA[Cloud]]></category>
		<guid isPermaLink="false">https://essencia.dev/?p=1237</guid>

					<description><![CDATA[<p>Descubra por que a dependência extrema de serviços gerenciados pode ser o maior risco estratégico para o seu projeto e para a sua evolução como engenheiro de software. Muitos desenvolvedores hoje caem na armadilha de resolver problemas simples com soluções absurdamente complexas só porque elas estão a um clique de distância. É o que chamamos [&#8230;]</p>
<p>The post <a href="https://essencia.dev/overengineering-as-a-service-o-custo-oculto-da-facilidade-na-nuvem/">Overengineering as a Service: O custo oculto da facilidade na nuvem</a> appeared first on <a href="https://essencia.dev">essencia.dev</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Descubra por que a dependência extrema de serviços gerenciados pode ser o maior <strong>risco estratégico</strong> para o seu projeto e para a sua evolução como engenheiro de software.</p>
</blockquote>



<p>Muitos desenvolvedores hoje caem na armadilha de resolver problemas simples com soluções absurdamente complexas só porque elas estão a um clique de distância. É o que chamamos de <strong>Overengineering as a Service (OaaS)</strong>. O problema não é a automação, mas sim como a facilidade dos painéis coloridos da AWS, Azure ou Google Cloud nos faz ignorar os <strong>fundamentos da infraestrutura</strong>, criando sistemas caros, difíceis de manter e totalmente dependentes de um único fornecedor.</p>



<h2 class="wp-block-heading">A ilusão do Dashboard: Por que o console é uma faca de dois gumes</h2>



<p>Provedores de nuvem são mestres em esconder a complexidade. Ao clicar em um botão para criar um banco de dados gerenciado, você ignora a criação de <strong>regras de firewall</strong>, subnets, volumes de disco e gestão de instâncias.</p>



<ul class="wp-block-list">
<li><strong>O risco do &#8220;Next, Next, Finish&#8221;:</strong> Essa simplicidade cria uma sensação falsa de controle. Profissionais que se apoiam apenas na interface visual muitas vezes não sabem como agir quando o console está fora do ar ou quando precisam debugar problemas de <strong>latência</strong> e rede via linha de comando.</li>



<li><strong>A pergunta de ouro:</strong> Se você precisasse reconstruir seu ambiente do zero em um data center local hoje, você conseguiria? Se a resposta for não, você não domina sua infraestrutura; você é apenas um operador de ferramenta.</li>
</ul>



<h2 class="wp-block-heading">Overengineering as a Service (OaaS) e a Arquitetura Frankenstein</h2>



<p>A facilidade de provisionamento leva ao excesso. É comum ver projetos que ainda nem foram validados pelo mercado sendo desenhados para suportar milhões de usuários simultâneos com 15 serviços diferentes se comunicando.</p>



<ul class="wp-block-list">
<li><strong>Complexidade desnecessária:</strong> Troca-se o <strong>monolito bem feito</strong> por uma arquitetura serverless ou de microserviços que gera custos de latência e pontos de falha que o projeto ainda não precisava.</li>



<li><strong>Custo de conveniência:</strong> Muitas vezes, uma simples <strong>VPS (Virtual Private Server)</strong> com um banco de dados local resolveria o problema com 10% do custo e da complexidade.</li>
</ul>



<h2 class="wp-block-heading">O Efeito &#8220;Tatuagem de Casal&#8221; (Vendor Lock-in)</h2>



<p>O uso de serviços proprietários da nuvem começa de forma inocente, mas evolui para uma dependência perigosa.</p>



<ol start="1" class="wp-block-list">
<li>Você começa com uma máquina virtual básica.</li>



<li>Adiciona um serviço de mensageria proprietário.</li>



<li>Implementa um sistema de autenticação que só existe naquele provedor.</li>



<li>Quando percebe, sua aplicação não é mais escrita em Python ou Node; ela é escrita em &#8220;AWS-ês&#8221;.</li>
</ol>



<p>Mudar essa arquitetura quando a conta chega a valores astronômicos dói e custa caro, exatamente como remover uma tatuagem feita no auge de uma paixão inconsequente.</p>



<h2 class="wp-block-heading">O Pulo do Gato: O Teste da VPS de 20 Dólares</h2>



<p>Para saber se você está exagerando na engenharia ou se tornando refém, faça-se a seguinte pergunta: <strong>&#8220;Minha aplicação funcionaria em uma VPS de 20 reais com Linux?&#8221;</strong> Se a resposta for não devido a dependências extremas de serviços específicos do provedor, cuidado: você está perdendo a visão agnóstica do software. O segredo é o <strong>caminho do meio</strong>: use a nuvem estrategicamente, mas mantenha o core da sua aplicação independente o suficiente para que ela possa ser migrada sem traumas.</p>



<h3 class="wp-block-heading">Como evitar a atrofia técnica</h3>



<p>Para se manter relevante nos próximos 20 anos, você precisa dominar o que acontece &#8220;debaixo do capô&#8221;:</p>



<ul class="wp-block-list">
<li><strong>Aprenda a tecnologia base:</strong> Em vez de focar apenas em como configurar um RDS, entenda como o <strong>PostgreSQL</strong> gerencia memória e conexões.</li>



<li><strong>Domine o &#8220;Como&#8221; antes do &#8220;Onde&#8221;:</strong> Antes de usar uma Function, tente subir a mesma solução em um servidor Linux usando <strong>Docker</strong> ou configurando um <strong>Nginx</strong> manualmente.</li>



<li><strong>Foque em Fundamentos:</strong> Protocolo HTTP, gatilhos de eventos e tráfego de dados são universais; dashboards mudam de cor a cada trimestre.</li>
</ul>



<h3 class="wp-block-heading">Recursos Mencionados</h3>



<ul class="wp-block-list">
<li><strong>Conceitos Históricos:</strong> Utility Computing (John McCarthy) e Rede Intergalática de Computadores (Joseph Licklider).</li>



<li><strong>Playlist Recomendada:</strong> Arquitetura de Software e Fundamentos de Infraestrutura.</li>



<li><strong>Tecnologias Base para Estudo:</strong> Linux (WSL/Ubuntu), Enginex, PostgreSQL e Protocolo HTTP.</li>
</ul>



<p>Assista a seguir o vídeo que deu origem a esse artigo:</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="Overengineering as Service: O perigo de tratar sua infraestrutura em nuvem como uma caixa preta" width="500" height="281" src="https://www.youtube.com/embed/e-CKhPEGuRs?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>
<p>The post <a href="https://essencia.dev/overengineering-as-a-service-o-custo-oculto-da-facilidade-na-nuvem/">Overengineering as a Service: O custo oculto da facilidade na nuvem</a> appeared first on <a href="https://essencia.dev">essencia.dev</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://essencia.dev/overengineering-as-a-service-o-custo-oculto-da-facilidade-na-nuvem/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Vertical Slice: Quando a Funcionalidade Dita a Forma</title>
		<link>https://essencia.dev/vertical-slice-quando-a-funcionalidade-dita-a-forma/</link>
					<comments>https://essencia.dev/vertical-slice-quando-a-funcionalidade-dita-a-forma/#respond</comments>
		
		<dc:creator><![CDATA[Bernardo Lobato]]></dc:creator>
		<pubDate>Thu, 08 Jan 2026 00:25:00 +0000</pubDate>
				<category><![CDATA[Arquitetura de Software]]></category>
		<guid isPermaLink="false">https://essencia.dev/?p=1206</guid>

					<description><![CDATA[<p>Uma mudança de perspectiva: organizando o software pela intenção do negócio em vez da estrutura da tecnologia. No desenvolvimento de software, fomos ensinados quase por instinto a organizar nosso código em camadas técnicas: controllers em uma pasta, services em outra, repositórios em uma terceira. Essa separação horizontal parece lógica e organizada no papel, mas no [&#8230;]</p>
<p>The post <a href="https://essencia.dev/vertical-slice-quando-a-funcionalidade-dita-a-forma/">Vertical Slice: Quando a Funcionalidade Dita a Forma</a> appeared first on <a href="https://essencia.dev">essencia.dev</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Uma mudança de perspectiva: organizando o software pela intenção do negócio em vez da estrutura da tecnologia.</p>
</blockquote>



<p>No desenvolvimento de software, fomos ensinados quase por instinto a organizar nosso código em camadas técnicas: controllers em uma pasta, services em outra, repositórios em uma terceira. Essa separação horizontal parece lógica e organizada no papel, mas no dia a dia, ela frequentemente nos força a um &#8220;turismo de arquivos&#8221;. Para implementar uma mudança simples, precisamos navegar por quatro ou cinco camadas diferentes, muitas das quais servem apenas como meros passadores de dados — o que chamamos de antipadrão Architecture Sinkhole.</p>



<p>A Arquitetura Vertical Slice propõe um caminho inverso. Em vez de fatiar o sistema por tecnologia, nós o fatiamos por intenção. Cada funcionalidade — ou &#8220;fatia&#8221; — contém tudo o que precisa para existir: do ponto de entrada da requisição à persistência no banco de dados.</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="Os SEGREDOS da Arquitetura VERTICAL SLICE: Nem Sempre as CAMADAS Bastam | Arquitetura Ágil" width="500" height="281" src="https://www.youtube.com/embed/1Fh8ojkOgUw?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div><figcaption class="wp-element-caption">Vídeo que deu origem ao artigo.</figcaption></figure>



<h2 class="wp-block-heading">O Fim do Domínio Centralizado</h2>



<p>Uma das reflexões mais profundas que esse padrão traz é o questionamento sobre a necessidade de um modelo de domínio único e centralizado. Na orientação a objetos tradicional, tendemos a inflar uma classe como a de &#8220;Usuário&#8221; para que ela atenda a todos os casos de uso: autenticação, gestão de perfil, seguidores e entregas.</p>



<p>O resultado? Um acoplamento perigoso. Uma alteração no campo de endereço para o módulo de perfil pode, acidentalmente, quebrar a lógica do módulo de login.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Não precisamos de um único domínio representando uma classe no sistema. No Vertical Slice, cada fatia pode ter sua própria representação do que é necessário para aquela funcionalidade específica.</p>
</blockquote>



<p>Ao permitir que cada fatia tenha sua própria visão do domínio, ganhamos uma liberdade rara: a de evoluir uma parte do sistema sem o medo constante de efeitos colaterais em módulos que, teoricamente, não têm nada a ver com a mudança.</p>



<p>[Sugestão de Imagem] Gráfico Conceitual: Uma comparação visual entre a &#8220;Pilha de Camadas&#8221; (horizontal) e as &#8220;Fatias de Bolo&#8221; (vertical), onde cada fatia atravessa todas as camadas técnicas de forma independente.</p>



<h2 class="wp-block-heading">A Jornada para a Independência</h2>



<p>Adotar fatias verticais não é apenas uma escolha estética de pastas. É uma preparação estratégica para a escalabilidade. Se o seu sistema cresce organicamente e você percebe que certas funcionalidades precisam de tratamentos diferenciados — ou até mesmo de tecnologias diferentes — o isolamento das fatias torna essa transição natural.</p>



<p>Esse modelo é, inclusive, o melhor caminho intermediário para quem planeja migrar de um monolito para microsserviços. Uma fatia vertical bem isolada e testada é muito mais fácil de ser extraída para um serviço externo do que um código espalhado por diversas camadas horizontais acopladas.</p>



<h2 class="wp-block-heading">Disciplina sobre a Conveniência</h2>



<p>Apesar dos benefícios de alta coesão e baixo acoplamento, o Vertical Slice exige uma disciplina rigorosa. O maior desafio é resistir à tentação de &#8220;reunificar&#8221; modelos em nome de uma falsa economia de código. Para desenvolvedores acostumados com a centralização, ver entidades similares em pastas diferentes pode parecer redundância, mas na verdade é autonomia.</p>



<p>Manter o isolamento entre as fatias requer vigilância constante nas revisões de código. O objetivo não é criar silos intransponíveis, mas garantir que a comunicação entre fatias seja intencional e não acidental.</p>



<p>[Sugestão de Imagem] Destaque Visual: Um ícone de lupa sobre uma fatia específica, simbolizando o foco total do desenvolvedor em uma única funcionalidade por vez, sem distrações com o resto do sistema.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>O Equilíbrio da Escolha</p>
</blockquote>



<p>Nem todo projeto precisa ser 100% Vertical Slice, e nem toda funcionalidade exige esse nível de isolamento. O segredo da boa arquitetura é o discernimento: saber quando o &#8220;feijão com arroz&#8221; das camadas basta e quando a complexidade de negócio exige a clareza e o foco que apenas as fatias verticais podem proporcionar.</p>



<p>No final, a arquitetura deve servir à velocidade do negócio e à sanidade do time técnico. Se o seu projeto está se tornando um labirinto de camadas inúteis, talvez seja hora de mudar o ângulo do corte.</p>



<p>Este artigo reflete sobre a mudança de paradigma proposta pelo Vertical Slice, focando em como a organização por funcionalidade pode simplificar a manutenção e a evolução de sistemas complexos.</p>
<p>The post <a href="https://essencia.dev/vertical-slice-quando-a-funcionalidade-dita-a-forma/">Vertical Slice: Quando a Funcionalidade Dita a Forma</a> appeared first on <a href="https://essencia.dev">essencia.dev</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://essencia.dev/vertical-slice-quando-a-funcionalidade-dita-a-forma/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Modularizando seu sistema: A Entropia do Código e a Arte de Dividir para Conquistar</title>
		<link>https://essencia.dev/a-entropia-do-codigo-e-a-arte-de-dividir-para-conquistar/</link>
					<comments>https://essencia.dev/a-entropia-do-codigo-e-a-arte-de-dividir-para-conquistar/#respond</comments>
		
		<dc:creator><![CDATA[Bernardo Lobato]]></dc:creator>
		<pubDate>Thu, 08 Jan 2026 00:09:33 +0000</pubDate>
				<category><![CDATA[Arquitetura de Software]]></category>
		<guid isPermaLink="false">https://essencia.dev/?p=1201</guid>

					<description><![CDATA[<p>Entendendo a luta constante entre a organização do design e a desordem natural dos sistemas em evolução. Todo desenvolvedor já sentiu, em algum momento, que estava trabalhando dentro de um labirinto. Aquele tipo de sistema onde uma alteração simples em um validador de datas acaba, inexplicavelmente, quebrando o módulo de exportação de PDFs do outro [&#8230;]</p>
<p>The post <a href="https://essencia.dev/a-entropia-do-codigo-e-a-arte-de-dividir-para-conquistar/">Modularizando seu sistema: A Entropia do Código e a Arte de Dividir para Conquistar</a> appeared first on <a href="https://essencia.dev">essencia.dev</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Entendendo a luta constante entre a organização do design e a desordem natural dos sistemas em evolução.</p>
</blockquote>



<p>Todo desenvolvedor já sentiu, em algum momento, que estava trabalhando dentro de um labirinto. Aquele tipo de sistema onde uma alteração simples em um validador de datas acaba, inexplicavelmente, quebrando o módulo de exportação de PDFs do outro lado da aplicação. Esse fenômeno tem nome na física, e ele se aplica perfeitamente ao nosso dia a dia: entropia.</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="Seu Código Está Virando uma Bagunça? Hora de Modularizar! O Guia Que Todo Dev Deveria Ver" width="500" height="281" src="https://www.youtube.com/embed/dRlaLUkt7Wc?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div><figcaption class="wp-element-caption">Vídeo que deu origem ao artigo.</figcaption></figure>



<p>Em um sistema de software, a desorganização tende a aumentar conforme o tempo passa. Novas funcionalidades, prazos apertados e a rotatividade da equipe são forças que empurram o código para o caos. A modularização é a energia que investimos para lutar contra essa tendência natural. Não se trata apenas de criar pastas ou pacotes; é uma decisão consciente sobre como as partes do sistema devem interagir e, mais importante, como elas devem se ignorar.</p>



<h2 class="wp-block-heading">O Equilíbrio entre a União e a Independência</h2>



<p>Muitas vezes, exaltamos os benefícios da modularidade sem entender como alcançá-la de fato. O segredo reside no equilíbrio entre dois conceitos fundamentais: coesão e acoplamento.</p>



<p>A coesão é a medida de quanto as partes dentro de um módulo pertencem uma à outra. Um módulo coeso é focado; ele sabe exatamente o que deve fazer e contém tudo o que é necessário para essa tarefa. Já o acoplamento é a medida da dependência entre esses módulos. O ideal é o que chamamos de &#8220;baixo acoplamento&#8221;: módulos que se comunicam através de interfaces claras, sem precisar conhecer as entranhas um do outro.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Modularizar significa dividir um sistema em partes independentes e coesas, com responsabilidades tão bem definidas que o todo se torna maior que a soma das partes.</p>
</blockquote>



<p>É comum pensarmos que, se um pouco de divisão é bom, muita divisão é melhor. Mas há um perigo aqui. Quebrar demais um sistema pode aumentar o acoplamento, forçando os módulos a conversarem excessivamente entre si para realizar uma tarefa simples. O objetivo não é a fragmentação, mas a organização lógica.</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="925" height="615" src="https://essencia.dev/wp-content/uploads/2026/01/image-11.png" alt="" class="wp-image-1202" srcset="https://essencia.dev/wp-content/uploads/2026/01/image-11.png 925w, https://essencia.dev/wp-content/uploads/2026/01/image-11-300x199.png 300w, https://essencia.dev/wp-content/uploads/2026/01/image-11-768x511.png 768w" sizes="auto, (max-width: 925px) 100vw, 925px" /><figcaption class="wp-element-caption">Entropia</figcaption></figure>



<h2 class="wp-block-heading">Conescência: O Mapa das Dependências Ocultas</h2>



<p>Para quem deseja ir além do básico, existe um conceito poderoso chamado conescência. Enquanto o acoplamento nos diz que dois módulos dependem um do outro, a conescência nos ajuda a entender a natureza e a força dessa dependência.</p>



<p>Existem dependências óbvias, como dois componentes que precisam concordar com o nome de um campo (conescência de nome) ou o tipo de um dado (conescência de tipo). Mas há também as dinâmicas e sutis: quando a ordem de execução de duas funções importa (conescência de execução) ou quando dois valores precisam mudar simultaneamente em bancos de dados diferentes para manter a consistência.</p>



<p>Entender a conescência é como ter um mapa de riscos. Quanto mais forte e &#8220;distante&#8221; for a conescência, mais difícil será mudar o sistema sem causar danos colaterais. O papel do arquiteto é transformar dependências fortes e dinâmicas em dependências fracas e estáticas.</p>



<h2 class="wp-block-heading">Investindo no Futuro do Sistema</h2>



<p>Nenhum requisito funcional dirá explicitamente: &#8220;o sistema deve ser bem modularizado&#8221;. Essa é uma característica implícita, um compromisso técnico com a sustentabilidade a longo prazo.</p>



<p>Modularizar exige esforço inicial e uma disciplina constante de refatoração e testes. No entanto, é esse investimento que permite que o sistema sobreviva às mudanças inevitáveis do mercado e da tecnologia. No fim das contas, a modularidade não é sobre como o código parece hoje, mas sobre quão fácil será alterá-lo amanhã.</p>
<p>The post <a href="https://essencia.dev/a-entropia-do-codigo-e-a-arte-de-dividir-para-conquistar/">Modularizando seu sistema: A Entropia do Código e a Arte de Dividir para Conquistar</a> appeared first on <a href="https://essencia.dev">essencia.dev</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://essencia.dev/a-entropia-do-codigo-e-a-arte-de-dividir-para-conquistar/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>A Camada de Conforto: Quando a Simplicidade se Torna um Limite</title>
		<link>https://essencia.dev/a-camada-de-conforto-quando-a-simplicidade-se-torna-um-limite/</link>
					<comments>https://essencia.dev/a-camada-de-conforto-quando-a-simplicidade-se-torna-um-limite/#respond</comments>
		
		<dc:creator><![CDATA[Bernardo Lobato]]></dc:creator>
		<pubDate>Wed, 07 Jan 2026 23:54:45 +0000</pubDate>
				<category><![CDATA[Arquitetura de Software]]></category>
		<guid isPermaLink="false">https://essencia.dev/?p=1191</guid>

					<description><![CDATA[<p>Uma reflexão sobre como a arquitetura em camadas equilibra a agilidade da familiaridade técnica com o risco oculto de se tornar um obstáculo ao crescimento do sistema. Se você já abriu um projeto e encontrou pastas nomeadas como controllers, services e repositories, você já pisou em terreno familiar. A arquitetura em camadas é, para o [&#8230;]</p>
<p>The post <a href="https://essencia.dev/a-camada-de-conforto-quando-a-simplicidade-se-torna-um-limite/">A Camada de Conforto: Quando a Simplicidade se Torna um Limite</a> appeared first on <a href="https://essencia.dev">essencia.dev</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Uma reflexão sobre como a arquitetura em camadas equilibra a agilidade da familiaridade técnica com o risco oculto de se tornar um obstáculo ao crescimento do sistema.</p>
</blockquote>



<p>Se você já abriu um projeto e encontrou pastas nomeadas como <code>controllers</code>, <code>services</code> e <code>repositories</code>, você já pisou em terreno familiar. A arquitetura em camadas é, para o desenvolvimento de software, o que o &#8220;feijão com arroz&#8221; é para a culinária: é a base, é o que sustenta a maioria das aplicações comerciais e é, acima de tudo, familiar.</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="Os segredos da Arquitetura em Camadas I: Simples, Popular e Cheia de Armadilhas!" width="500" height="281" src="https://www.youtube.com/embed/4TW6vttwfio?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<p>Essa onipresença não é por acaso. Em um mercado que exige entregas rápidas e onde as equipes mudam com frequência, a familiaridade é um ativo valioso. Um desenvolvedor novo consegue se situar em um projeto em camadas em minutos, simplesmente porque ele já viu aquela estrutura dezenas de vezes antes.</p>



<h2 class="wp-block-heading">O Acordo Silencioso da Organização</h2>



<p>A arquitetura em camadas nasceu como uma resposta à &#8220;crise do software&#8221; entre as décadas de 70 e 80. O objetivo era simples: separar as responsabilidades horizontalmente. Temos quem cuida da interface, quem dita as regras de negócio e quem lida com os dados.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>A arquitetura em camadas é um monolito por natureza, movido pela simplicidade e pelo baixo custo de implementação.</p>
</blockquote>



<p>Trabalhamos com o conceito de <strong>camadas fechadas</strong>, onde uma requisição obrigatoriamente deve atravessar cada nível, do topo à base. É um design que preza pelo isolamento. Quando bem feita, essa estrutura permite que você altere o banco de dados sem que a interface sequer perceba. É o princípio das camadas de isolamento em sua forma mais pura.</p>



<h2 class="wp-block-heading">A Armadilha da &#8220;Linha Expressa&#8221;</h2>



<figure class="wp-block-image alignleft size-full is-resized"><img loading="lazy" decoding="async" width="490" height="457" src="https://essencia.dev/wp-content/uploads/2026/01/image-10.png" alt="" class="wp-image-1193" style="aspect-ratio:1.0722668313773935;width:198px;height:auto" srcset="https://essencia.dev/wp-content/uploads/2026/01/image-10.png 490w, https://essencia.dev/wp-content/uploads/2026/01/image-10-300x280.png 300w" sizes="auto, (max-width: 490px) 100vw, 490px" /></figure>



<p>O problema surge quando a teoria encontra a pressa do dia a dia. Às vezes, para ganhar tempo ou &#8220;evitar código repetitivo&#8221;, surge a tentação de abrir uma camada. É o que chamamos de <em>Fast Lane Reader Pattern</em> — quando a interface chama diretamente o banco de dados, pulando a lógica de negócio.</p>



<p>Embora pareça eficiente no curto prazo, essa prática destrói o propósito da arquitetura. O acoplamento se torna excessivo. Uma mudança simples em uma coluna de tabela agora exige alterações em lugares que não deveriam ter conhecimento sobre o esquema do banco. É aqui que o antipadrão começa a cobrar juros.</p>



<h2 class="wp-block-heading">O Sinais de Esgotamento</h2>



<p>Como saber se o seu projeto superou a arquitetura em camadas?</p>



<p>A arquitetura em camadas brilha em projetos pequenos e médios, ou quando o time ainda está encontrando seu ritmo. Mas ela tem um teto de vidro. Se o seu sistema precisa de múltiplas portas de entrada — como uma API HTTP e, simultaneamente, um consumidor de mensagens de uma fila — a hierarquia rígida das camadas começa a sofrer.</p>



<p>Outro sinal vermelho é a regra do 80/20. Em um sistema saudável, pelo menos 80% das requisições devem envolver lógica de negócio real. Se 90% do seu código é apenas um &#8220;passa-fome&#8221; que leva dados do banco para o JSON sem transformar nada, você está lidando com o antipadrão <em>Sinkhole</em>. Nesse ponto, a estrutura que deveria organizar está apenas adicionando latência e complexidade desnecessária.</p>



<figure class="wp-block-image aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="512" src="https://essencia.dev/wp-content/uploads/2026/01/camadas-4-1024x512.jpg" alt="" class="wp-image-1198" style="width:660px;height:auto" srcset="https://essencia.dev/wp-content/uploads/2026/01/camadas-4-1024x512.jpg 1024w, https://essencia.dev/wp-content/uploads/2026/01/camadas-4-300x150.jpg 300w, https://essencia.dev/wp-content/uploads/2026/01/camadas-4-768x384.jpg 768w, https://essencia.dev/wp-content/uploads/2026/01/camadas-4-1536x768.jpg 1536w, https://essencia.dev/wp-content/uploads/2026/01/camadas-4.jpg 1696w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading">Além do Horizonte das Camadas</h2>



<p>Decidir pela arquitetura em camadas é um compromisso com a agilidade inicial. É a escolha ideal quando o objetivo é validar uma ideia ou quando a equipe precisa de um terreno comum e seguro.</p>



<p>No entanto, o papel do arquiteto e do desenvolvedor sênior é olhar para além do conforto. É preciso reconhecer o momento em que a aplicação pede mais do que o feijão com arroz. A arquitetura deve servir ao sistema, e não o contrário. Quando as camadas começam a parecer paredes que impedem o crescimento, é sinal de que a fundação cumpriu seu papel e o sistema está pronto para evoluir para novas formas de organização.</p>



<p>Afinal, a melhor arquitetura não é a mais complexa, mas a que melhor gerencia o peso das decisões que tomamos hoje para o sistema que teremos amanhã.</p>
<p>The post <a href="https://essencia.dev/a-camada-de-conforto-quando-a-simplicidade-se-torna-um-limite/">A Camada de Conforto: Quando a Simplicidade se Torna um Limite</a> appeared first on <a href="https://essencia.dev">essencia.dev</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://essencia.dev/a-camada-de-conforto-quando-a-simplicidade-se-torna-um-limite/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>O Vocabulário Invisível: Por que Padrões Arquiteturais são o Alicerce do Código</title>
		<link>https://essencia.dev/o-vocabulario-invisivel-por-que-padroes-arquiteturais-sao-o-alicerce-do-codigo/</link>
					<comments>https://essencia.dev/o-vocabulario-invisivel-por-que-padroes-arquiteturais-sao-o-alicerce-do-codigo/#respond</comments>
		
		<dc:creator><![CDATA[Bernardo Lobato]]></dc:creator>
		<pubDate>Wed, 07 Jan 2026 23:25:03 +0000</pubDate>
				<category><![CDATA[Arquitetura de Software]]></category>
		<guid isPermaLink="false">https://essencia.dev/?p=1182</guid>

					<description><![CDATA[<p>Uma exploração reflexiva sobre como os padrões arquiteturais funcionam como o vocabulário essencial que transforma o código técnico em sistemas organizados e comunicáveis. Existe um fenômeno curioso nas reuniões de engenharia: alguém menciona que um sistema será um &#8220;monolito em camadas&#8221; ou baseado em &#8220;microsserviços&#8221;, e instantaneamente todos na sala parecem compartilhar o mesmo mapa [&#8230;]</p>
<p>The post <a href="https://essencia.dev/o-vocabulario-invisivel-por-que-padroes-arquiteturais-sao-o-alicerce-do-codigo/">O Vocabulário Invisível: Por que Padrões Arquiteturais são o Alicerce do Código</a> appeared first on <a href="https://essencia.dev">essencia.dev</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Uma exploração reflexiva sobre como os padrões arquiteturais funcionam como o vocabulário essencial que transforma o código técnico em sistemas organizados e comunicáveis.</p>
</blockquote>



<p>Existe um fenômeno curioso nas reuniões de engenharia: alguém menciona que um sistema será um &#8220;monolito em camadas&#8221; ou baseado em &#8220;microsserviços&#8221;, e instantaneamente todos na sala parecem compartilhar o mesmo mapa mental. Não é apenas uma convenção de nomes; são atalhos cognitivos que carregam consigo uma densidade enorme de informações sobre infraestrutura, banco de dados e até sobre como o time será organizado.</p>



<p>Padrões arquiteturais, ou estilos, são mais do que desenhos em um quadro branco. Eles são soluções estruturadas para problemas que a indústria vem resolvendo — e errando — há décadas. Entender essa gramática é o que diferencia quem apenas escreve código de quem projeta sistemas.</p>



<figure class="wp-block-embed aligncenter is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="O que são os PADRÕES ARQUITETURAIS e por que são ESSENCIAIS no trabalho do DEV e do Arquiteto" width="500" height="281" src="https://www.youtube.com/embed/5YpH6ILjjlY?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div><figcaption class="wp-element-caption">O vídeo que deu origem ao artigo.</figcaption></figure>



<h2 class="wp-block-heading">A Anatomia do Caos e a &#8220;Big Ball of Mud&#8221;</h2>



<p>Antes de falarmos de estrutura, precisamos encarar o seu oposto: o antipadrão conhecido como <em>The Big Ball of Mud</em> (a grande bola de lama). É aquele sistema onde tudo está conectado a tudo. Você altera uma validação de CPF e, por um motivo inexplicável, o módulo de integração com a transportadora para de funcionar.</p>



<p>Esse estado de entropia não costuma nascer de uma decisão deliberada. Ele é, quase sempre, o resultado de uma entrega apressada, de um protótipo que &#8220;virou produto&#8221; sem passar pelo filtro da arquitetura, ou de uma equipe que não domina os limites do sistema. A bola de lama é o custo de ignorar os padrões.</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="512" src="https://essencia.dev/wp-content/uploads/2026/01/big-ball-of-mud-1024x512.jpg" alt="" class="wp-image-1183" srcset="https://essencia.dev/wp-content/uploads/2026/01/big-ball-of-mud-1024x512.jpg 1024w, https://essencia.dev/wp-content/uploads/2026/01/big-ball-of-mud-300x150.jpg 300w, https://essencia.dev/wp-content/uploads/2026/01/big-ball-of-mud-768x384.jpg 768w, https://essencia.dev/wp-content/uploads/2026/01/big-ball-of-mud-1536x768.jpg 1536w, https://essencia.dev/wp-content/uploads/2026/01/big-ball-of-mud.jpg 1696w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading">O Peso da Tradição: Do Unitário às Camadas</h2>



<p>Muitas vezes, olhamos para arquiteturas mais antigas com um certo desdém, mas a engenharia de software é um processo evolutivo. A arquitetura unitária, por exemplo — onde tudo reside em um único recurso — pode parecer obsoleta para quem vive no mundo da nuvem. No entanto, ela continua sendo o padrão ouro para sistemas embarcados de missão crítica, como marca-passos ou monitores de UTI, onde a tolerância a falhas de rede simplesmente não pode existir.</p>



<p>Com a evolução das redes, migramos para o modelo cliente-servidor e, eventualmente, para o clássico modelo em três camadas. Este último tornou-se o alicerce de quase tudo o que entendemos como software moderno. Mesmo quando falamos de microsserviços, a estrutura interna de cada serviço frequentemente ainda respeita essa divisão entre apresentação, lógica de negócio e persistência.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Padrões arquiteturais não são dogmas, mas ferramentas de comunicação. Eles existem para que o time não precise reinventar a roda a cada nova funcionalidade.</p>
</blockquote>



<h2 class="wp-block-heading">A Escolha do Contexto</h2>



<p>Um dos maiores erros que um arquiteto pode cometer é escolher um padrão pela &#8220;estética&#8221; ou pelo <em>hype</em>. Não existe estilo arquitetural inerentemente correto; existe o estilo que melhor se adapta às restrições do seu projeto.</p>



<p>Arquiteturas distribuídas trazem escalabilidade e resiliência, mas cobram um preço alto em latência, sincronização de dados e complexidade de depuração. Por outro lado, um monolito bem estruturado pode levar uma empresa muito mais longe do que dez microsserviços mal projetados.</p>



<p>O segredo está em entender que a arquitetura é um exercício constante de <em>trade-offs</em>.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="337" src="https://essencia.dev/wp-content/uploads/2026/01/image-9-1024x337.png" alt="" class="wp-image-1185" srcset="https://essencia.dev/wp-content/uploads/2026/01/image-9-1024x337.png 1024w, https://essencia.dev/wp-content/uploads/2026/01/image-9-300x99.png 300w, https://essencia.dev/wp-content/uploads/2026/01/image-9-768x253.png 768w, https://essencia.dev/wp-content/uploads/2026/01/image-9.png 1322w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading">O Legado da Comunicação</h2>



<p>No fim do dia, dominar padrões arquiteturais é sobre eficiência na comunicação. Quando um time sênior discute a estrutura do sistema usando esses termos, eles estão economizando horas de explicações técnicas. Eles estão falando sobre como o sistema respira, como ele cresce e, principalmente, como ele sobrevive ao tempo.</p>



<p>Projetar software é, essencialmente, gerenciar complexidade. E os padrões são a nossa melhor defesa contra o caos.</p>
<p>The post <a href="https://essencia.dev/o-vocabulario-invisivel-por-que-padroes-arquiteturais-sao-o-alicerce-do-codigo/">O Vocabulário Invisível: Por que Padrões Arquiteturais são o Alicerce do Código</a> appeared first on <a href="https://essencia.dev">essencia.dev</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://essencia.dev/o-vocabulario-invisivel-por-que-padroes-arquiteturais-sao-o-alicerce-do-codigo/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Arquitetura de Software: Sobre as Coisas que Realmente Importam</title>
		<link>https://essencia.dev/arquitetura-de-software-sobre-as-coisas-que-realmente-importam/</link>
					<comments>https://essencia.dev/arquitetura-de-software-sobre-as-coisas-que-realmente-importam/#respond</comments>
		
		<dc:creator><![CDATA[Bernardo Lobato]]></dc:creator>
		<pubDate>Wed, 07 Jan 2026 21:50:35 +0000</pubDate>
				<category><![CDATA[Arquitetura de Software]]></category>
		<guid isPermaLink="false">https://essencia.dev/?p=1152</guid>

					<description><![CDATA[<p>Você já trabalhou em um projeto onde cada nova funcionalidade parecia transformar o código em uma bola de neve de problemas? Aquele sentimento de que, a cada commit, o sistema ficava mais frágil, e a vontade real era apagar tudo e recomeçar do zero? Se esse cenário soa familiar, talvez o problema não esteja na [&#8230;]</p>
<p>The post <a href="https://essencia.dev/arquitetura-de-software-sobre-as-coisas-que-realmente-importam/">Arquitetura de Software: Sobre as Coisas que Realmente Importam</a> appeared first on <a href="https://essencia.dev">essencia.dev</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Você já trabalhou em um projeto onde cada nova funcionalidade parecia transformar o código em uma bola de neve de problemas? Aquele sentimento de que, a cada <em>commit</em>, o sistema ficava mais frágil, e a vontade real era apagar tudo e recomeçar do zero?</p>



<p>Se esse cenário soa familiar, talvez o problema não esteja na qualidade do código isolado, mas nas decisões tomadas (ou ignoradas) muito antes da primeira linha ser escrita.</p>



<p>Quando começamos a explorar o universo da arquitetura de software, é comum cairmos na tentação de compará-la à arquitetura tradicional — a planta baixa de um prédio, desenhada milimetricamente antes da construção. É uma analogia confortável, mas perigosa.</p>



<p>Software não é concreto. Ele é vivo, mutável e, idealmente, evolutivo.</p>



<h2 class="wp-block-heading">Mais do que Desenhos e Diagramas</h2>



<p>A definição formal da IEEE para arquitetura de software fala sobre a organização fundamental de um sistema, seus componentes e relacionamentos. É uma definição precisa, mas talvez um pouco fria para o dia a dia de quem está com a mão no código.</p>



<p>Martin Fowler oferece uma visão mais humana e pragmática que merece nossa reflexão: <strong>arquitetura é sobre as coisas importantes do projeto. O que quer que elas sejam.</strong></p>



<p>Essa simplicidade esconde uma profundidade imensa. Se o seu sistema precisa responder em tempo real, a latência é uma &#8220;coisa importante&#8221;. Se ele lida com dados bancários, a consistência e a segurança são as &#8220;coisas importantes&#8221;.</p>



<p>O papel da arquitetura não é gerar burocracia, mas garantir que essas prioridades sejam protegidas. É o conhecimento compartilhado entre os desenvolvedores, aquilo que, se for difícil de mudar depois, precisa ser muito bem pensado agora.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="is-style-default">&#8220;Arquitetura é o conhecimento compartilhado entre os desenvolvedores mais experientes. É sobre as decisões difíceis de reverter.&#8221;</p>
</blockquote>



<h2 class="wp-block-heading">A Alquimia dos Requisitos</h2>



<figure class="wp-block-image alignleft size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="576" src="https://essencia.dev/wp-content/uploads/2026/01/Requisitos-Funcionais-1-2-1024x576.png" alt="" class="wp-image-1175" style="width:454px;height:auto" srcset="https://essencia.dev/wp-content/uploads/2026/01/Requisitos-Funcionais-1-2-1024x576.png 1024w, https://essencia.dev/wp-content/uploads/2026/01/Requisitos-Funcionais-1-2-300x169.png 300w, https://essencia.dev/wp-content/uploads/2026/01/Requisitos-Funcionais-1-2-768x432.png 768w, https://essencia.dev/wp-content/uploads/2026/01/Requisitos-Funcionais-1-2.png 1280w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Diagrama de Venn mostrando onde se encontram os requisitos arquiteturais</figcaption></figure>



<p>Muitas vezes, olhamos para requisitos como uma lista de tarefas no Jira. Mas, sob a ótica arquitetural, eles são as forças que moldam o sistema.</p>



<p>Temos o &#8220;o quê&#8221; (requisitos funcionais: o sistema deve ter um cadastro de usuários) e o &#8220;como&#8221; técnico (requisitos não funcionais: o cadastro deve suportar 500 usuários simultâneos).</p>



<p>A mágica — ou a dor de cabeça — acontece quando esses dois mundos colidem. O requisito arquitetural nasce dessa intersecção.</p>



<p>Se preciso autenticar usuários (funcional) e preciso aguentar alta carga (não funcional), a decisão arquitetural pode ser separar a autenticação em um serviço dedicado e escalável. Perceba que não estamos falando de <em>frameworks</em> ou bibliotecas ainda. Estamos falando de estrutura e estratégia.</p>



<h2 class="wp-block-heading">O Mito da Arquitetura &#8220;Escrita em Pedra&#8221;</h2>



<p>Existe um medo paralisante no início de grandes projetos: a ideia de que precisamos prever o futuro.</p>



<p>Muitos arquitetos e desenvolvedores caem na armadilha de desenhar uma solução para 1 milhão de usuários quando a startup ainda nem validou o produto. O resultado? Desperdício de recursos, complexidade desnecessária e um sistema &#8220;over-engineered&#8221; que é difícil de manter.</p>



<p>Uma arquitetura saudável não é aquela que nasce pronta para tudo, mas a que é <strong>adaptativa</strong>.</p>



<p>O segredo não é adivinhar os problemas de performance que você terá daqui a três anos, mas construir o sistema de forma que, quando esses problemas chegarem, você tenha a liberdade de mudar a estrutura sem derrubar o castelo todo.</p>



<p>Comece otimizando para a realidade atual, mas deixe as portas abertas para a evolução.</p>



<h2 class="wp-block-heading">Arquitetura não é Implementação</h2>



<p>Este é talvez o ponto onde a confusão é mais comum. Decidir se vamos usar React, Angular, Java ou Python raramente é uma decisão de arquitetura pura. Isso é implementação.</p>



<p>Arquitetura é sobre limites, responsabilidades e comunicação entre módulos. É decidir que o módulo de pagamentos não deve saber detalhes de como o estoque funciona. É garantir que o sistema seja testável e que o acoplamento seja baixo.</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="512" src="https://essencia.dev/wp-content/uploads/2026/01/limites-1024x512.jpg" alt="" class="wp-image-1176" srcset="https://essencia.dev/wp-content/uploads/2026/01/limites-1024x512.jpg 1024w, https://essencia.dev/wp-content/uploads/2026/01/limites-300x150.jpg 300w, https://essencia.dev/wp-content/uploads/2026/01/limites-768x384.jpg 768w, https://essencia.dev/wp-content/uploads/2026/01/limites-1536x768.jpg 1536w, https://essencia.dev/wp-content/uploads/2026/01/limites.jpg 1696w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Módulos isolados comunicando-se através de interfaces claras, em contraste com um código espaguete.</figcaption></figure>



<p>Claro, existem momentos em que a tecnologia escolhida impacta a arquitetura, mas o dia a dia do pensamento arquitetural é sobre organização e, principalmente, sobre <strong>trade-offs</strong>.</p>



<p>Toda decisão técnica tem um preço. Ganha-se em performance, perde-se em simplicidade. Ganha-se em consistência, perde-se em disponibilidade. O arquiteto (ou o desenvolvedor com chapéu de arquiteto) é quem negocia essas trocas.</p>



<h2 class="wp-block-heading">O Investimento de Longo Prazo</h2>



<p>Por que gastar tempo pensando nisso tudo se podemos apenas sair codando?</p>



<p>Porque as decisões baratas do início cobram juros altos no futuro. Uma arquitetura ruim se manifesta na dificuldade de escrever testes, na demora para integrar um novo desenvolvedor na equipe e no medo de fazer <em>deploy</em> na sexta-feira.</p>



<p>Pensar em arquitetura é um ato de empatia com o seu &#8220;eu&#8221; do futuro e com o time que vai manter aquele código. É garantir que o software amadureça sem apodrecer.</p>



<p>No fim das contas, seja você um Arquiteto de Soluções, de Software ou um desenvolvedor Sênior, o objetivo é o mesmo: construir sistemas que resolvam problemas reais, hoje e amanhã, sem que a complexidade nos engula no processo.</p>
<p>The post <a href="https://essencia.dev/arquitetura-de-software-sobre-as-coisas-que-realmente-importam/">Arquitetura de Software: Sobre as Coisas que Realmente Importam</a> appeared first on <a href="https://essencia.dev">essencia.dev</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://essencia.dev/arquitetura-de-software-sobre-as-coisas-que-realmente-importam/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>A programação ficou mais barulhenta &#8211; Reflexões sobre o mercado dev e Inteligência Artificial</title>
		<link>https://essencia.dev/a-programacao-nao-morreu-ela-so-ficou-mais-barulhenta/</link>
					<comments>https://essencia.dev/a-programacao-nao-morreu-ela-so-ficou-mais-barulhenta/#respond</comments>
		
		<dc:creator><![CDATA[Bernardo Lobato]]></dc:creator>
		<pubDate>Tue, 06 Jan 2026 11:35:40 +0000</pubDate>
				<category><![CDATA[IA]]></category>
		<category><![CDATA[Mercado e Carreira]]></category>
		<guid isPermaLink="false">https://essencia.dev/?p=1015</guid>

					<description><![CDATA[<p>A IA tende a tornar o bom programador mais relevante, e não substituí-lo, à medida que o software se torna cada vez mais presente em tudo. Se você abrir hoje o LinkedIn ou o Twitter, a sensação é quase sempre a mesma: a programação morreu, a IA vai escrever todo o código, o programador virou [&#8230;]</p>
<p>The post <a href="https://essencia.dev/a-programacao-nao-morreu-ela-so-ficou-mais-barulhenta/">A programação ficou mais barulhenta &#8211; Reflexões sobre o mercado dev e Inteligência Artificial</a> appeared first on <a href="https://essencia.dev">essencia.dev</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>A IA tende a tornar o bom programador mais relevante, e não substituí-lo, à medida que o software se torna cada vez mais presente em tudo.</p>
</blockquote>



<p>Se você abrir hoje o LinkedIn ou o Twitter, a sensação é quase sempre a mesma: a programação morreu, a IA vai escrever todo o código, o programador virou obsoleto e, a partir de agora, basta uma boa ideia, um prompt bem escrito e algum crédito disponível para que sistemas inteiros surjam quase por geração espontânea.</p>



<p>Para quem está chegando agora na área, esse discurso pode até soar convincente. Para quem já viveu alguns ciclos tecnológicos, ele soa familiar.</p>



<p>Ao longo das últimas décadas, surgiram inúmeras tecnologias anunciadas como definitivas e incontestáveis, enquanto linguagens consolidadas eram tratadas como ultrapassadas ou fadadas ao desaparecimento. </p>



<p>O PHP morreria em dez anos, o Java estaria em queda irreversível e agora, em 2026, chegou a vez do próprio programador ser apontado como dispensável.</p>



<p>A realidade costuma ser menos dramática.</p>



<p>PHP continua sustentando a maior parte da web, java segue extremamente presente em grandes empresas e projetos críticos. E o que se vê no dia a dia é que os profissionais estão, na verdade, adotando a IA com bastante entusiasmo, mas sem entregar completamente o volante.</p>



<p>O que sobrevive ao tempo tende a continuar sobrevivendo</p>



<p>A reflexão proposta aqui parte justamente desse ponto: e se, ao contrário do discurso dominante, o avanço da tecnologia, incluindo a IA, tornar o bom programador ainda mais relevante?</p>



<p>Essa ideia não surge do otimismo ingênuo, mas de observar como tecnologias, conceitos e práticas realmente se comportam ao longo do tempo.</p>



<h2 class="wp-block-heading">Efeito Lindy</h2>



<p>Um dos conceitos que ajuda a olhar para isso com mais calma é o chamado efeito Lindy, que sugere que ideias, tecnologias e práticas que já sobreviveram por muito tempo tendem a continuar existindo por um período proporcional à sua idade.</p>



<p>Linguagens como SQL e Java atravessaram diversas ondas de automação, abstração e simplificação sem perder relevância, porque o ato de estruturar lógica para resolver problemas é, em si, um conceito não perecível.</p>



<p>Já a IA generativa, da forma como a utilizamos hoje, é extremamente recente. Ainda imatura em muitos aspectos. Ainda distante de ter provado sua durabilidade no longo prazo.</p>



<p>Isso não a torna inútil, mas torna perigoso confiar nela como <em>fundação</em>.</p>



<h2 class="wp-block-heading">Lei de Gall e os sistemas complexos</h2>



<figure class="wp-block-image aligncenter size-full" style="margin-top:var(--wp--preset--spacing--30);margin-bottom:var(--wp--preset--spacing--30)"><img loading="lazy" decoding="async" width="857" height="292" src="https://essencia.dev/wp-content/uploads/2026/01/image-5.png" alt="" class="wp-image-1081" srcset="https://essencia.dev/wp-content/uploads/2026/01/image-5.png 857w, https://essencia.dev/wp-content/uploads/2026/01/image-5-300x102.png 300w, https://essencia.dev/wp-content/uploads/2026/01/image-5-768x262.png 768w" sizes="auto, (max-width: 857px) 100vw, 857px" /><figcaption class="wp-element-caption">Sistemas complexos que funcionam evoluiram invariavelmente a partir de sistemas simples que funcionavam</figcaption></figure>



<p>Outro ponto essencial dessa discussão aparece na lei de Gall, que afirma que sistemas complexos que funcionam invariavelmente evoluíram a partir de sistemas simples que também funcionavam.</p>



<p>Sistemas complexos criados do zero raramente sobrevivem ao contato com o mundo real.</p>



<p>Eles não passaram pelo processo natural de adaptação, erros, correções e amadurecimento; não enfrentaram restrições reais. Não sofreram as consequências das próprias decisões.</p>



<p>A IA é excelente para gerar código, acelerar tarefas repetitivas e remover trabalho braçal. Mas ela não possui memória evolutiva, não entende contexto organizacional, não lida com restrições políticas ou orçamentárias e não carrega o histórico de decisões técnicas ao longo do tempo.</p>



<p>E é justamente nesse espaço que o programador humano continua sendo indispensável.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Complexidade gerada não é o mesmo que complexidade amadurecida.</p>
</blockquote>



<h2 class="wp-block-heading">O Paradoxo de Jevons &#8211; Quando eficiência não reduz trabalho, ela cria mais</h2>



<figure class="wp-block-image alignleft size-full" style="margin-top:var(--wp--preset--spacing--30);margin-bottom:var(--wp--preset--spacing--30)"><img loading="lazy" decoding="async" width="448" height="320" src="https://essencia.dev/wp-content/uploads/2026/01/image-4.png" alt="" class="wp-image-1076" srcset="https://essencia.dev/wp-content/uploads/2026/01/image-4.png 448w, https://essencia.dev/wp-content/uploads/2026/01/image-4-300x214.png 300w" sizes="auto, (max-width: 448px) 100vw, 448px" /><figcaption class="wp-element-caption">Paradoxo de Jevons: eficiência não quer dizer redução</figcaption></figure>



<p>Há ainda um terceiro conceito que ajuda a desmontar a ideia de que tornar algo mais eficiente necessariamente reduz seu uso: o paradoxo de Jevons.</p>



<p>Quando a produção de algo se torna mais barata e eficiente, o consumo total tende a aumentar, não a diminuir. Aplicando isso ao nosso contexto, quando produzir código fica mais rápido e acessível, o mundo não pede menos software, ele pede mais.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Quanto mais código mais rápido, mais código legado mais rápido.</p>
</blockquote>



<p>E, inevitavelmente, mais necessidade de pessoas capazes de manter, evoluir e impedir que tudo isso colapse sob o próprio peso.</p>



<p>Se a IA produz código dez vezes mais rápido, isso significa que criamos código legado dez vezes mais rápido também.</p>



<h2 class="wp-block-heading">Quem realmente não será substituído</h2>



<p>Diante disso, a pergunta deixa de ser se o programador será substituído e passa a ser qual tipo de programador continuará relevante.</p>



<p>Não se trata do mero codificador que transforma requisitos simples em operações triviais. Trata-se de quem entende profundamente os fundamentos, compreende o problema real, sabe usar a IA como ferramenta e não como muleta, e consegue guiar a evolução de sistemas de forma sustentável.</p>



<p>É muito mais plausível que esse profissional seja substituído por outro programador mais preparado do que por uma IA operando sozinha.</p>



<p>Engenharia de software continua sendo, acima de tudo, uma disciplina sobre lógica, responsabilidade e tomada de decisão. Protocolos, APIs, fundamentos de arquitetura e princípios básicos seguem sendo ativos que o tempo tende a valorizar, não a descartar.</p>



<p>Tecnologias mudam. Ferramentas evoluem.<br>Mas a necessidade de pessoas capazes de pensar, estruturar e sustentar sistemas complexos permanece.</p>



<p>Talvez agora, mais evidente do que nunca.</p>
<p>The post <a href="https://essencia.dev/a-programacao-nao-morreu-ela-so-ficou-mais-barulhenta/">A programação ficou mais barulhenta &#8211; Reflexões sobre o mercado dev e Inteligência Artificial</a> appeared first on <a href="https://essencia.dev">essencia.dev</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://essencia.dev/a-programacao-nao-morreu-ela-so-ficou-mais-barulhenta/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Como identificar recursos em APIs modernas sem cair em armadilhas</title>
		<link>https://essencia.dev/como-identificar-recursos-em-apis-modernas-sem-cair-em-armadilhas/</link>
					<comments>https://essencia.dev/como-identificar-recursos-em-apis-modernas-sem-cair-em-armadilhas/#comments</comments>
		
		<dc:creator><![CDATA[Bernardo Lobato]]></dc:creator>
		<pubDate>Tue, 30 Dec 2025 22:21:21 +0000</pubDate>
				<category><![CDATA[API]]></category>
		<category><![CDATA[Microsserviços]]></category>
		<guid isPermaLink="false">https://essencia.dev/?p=42</guid>

					<description><![CDATA[<p>Você já se pegou debugando uma API ou fuçando o banco de dados de um projeto novo e se deparou com aqueles IDs gigantes, cheios de letras, números e hífens? E aí bate aquela pergunta clássica: “Cadê o ID sequencial bonitinho e ordenado?” Mais do que isso:Será que esses IDs são performáticos mesmo?Será que não [&#8230;]</p>
<p>The post <a href="https://essencia.dev/como-identificar-recursos-em-apis-modernas-sem-cair-em-armadilhas/">Como identificar recursos em APIs modernas sem cair em armadilhas</a> appeared first on <a href="https://essencia.dev">essencia.dev</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Você já se pegou debugando uma API ou fuçando o banco de dados de um projeto novo e se deparou com aqueles <strong>IDs gigantes</strong>, cheios de letras, números e hífens?</p>



<p>E aí bate aquela pergunta clássica:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>“Cadê o ID sequencial bonitinho e ordenado?”</p>
</blockquote>



<p>Mais do que isso:<br>Será que esses IDs são performáticos mesmo?<br>Será que não vão explodir meus índices?<br>Isso é arquitetura… ou só modinha?</p>



<p>Se essas perguntas já passaram pela sua cabeça, esse artigo é pra você.</p>



<p>Hoje vamos falar sobre <strong>identificação de recursos em APIs modernas</strong>, com foco em duas estratégias muito comuns:</p>



<ul class="wp-block-list">
<li><strong>IDs sequenciais</strong></li>



<li><strong>UUIDs (ou UIDs)</strong></li>
</ul>



<p>Mais importante do que decorar vantagens e desvantagens é entender <strong>o impacto arquitetural</strong> dessa escolha — porque ela muda, de forma significativa, como seu sistema se comporta, escala e se protege.</p>



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



<h2 class="wp-block-heading">O que é um ID, afinal?</h2>



<p>Antes de comparar estratégias, vale alinhar o conceito.</p>



<p>Um <strong>ID (identificador)</strong> é um valor único usado para diferenciar um registro dos outros.<br>Em uma API, ele é essencial para:</p>



<ul class="wp-block-list">
<li>Buscar recursos</li>



<li>Atualizar dados</li>



<li>Referenciar entidades com segurança e precisão</li>
</ul>



<p>Uma boa analogia é pensar em um <strong>CPF ou RG</strong>: não importa quantas pessoas tenham o mesmo nome, aquele número identifica uma única pessoa.</p>



<p>Dentro de sistemas, existem várias formas de gerar esse identificador. Neste artigo, vamos focar nas duas mais comuns no dia a dia de quem desenvolve APIs.</p>



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



<h2 class="wp-block-heading">IDs sequenciais: o clássico que todo mundo conhece</h2>



<p>O ID sequencial é o velho conhecido de quem começou estudando bancos de dados relacionais.</p>



<p>Normalmente ele é:</p>



<ul class="wp-block-list">
<li>Um número inteiro</li>



<li>Gerenciado pelo próprio banco</li>



<li>Gerado automaticamente com <em>auto increment</em></li>
</ul>



<p>Você insere um registro e pronto: o banco cuida de atribuir o próximo número disponível.</p>



<h3 class="wp-block-heading">Por que eles são tão populares?</h3>



<p>Porque têm vantagens muito claras:</p>



<ul class="wp-block-list">
<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f680.png" alt="🚀" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Alta performance</strong></li>



<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4da.png" alt="📚" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Índices extremamente eficientes</strong></li>



<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cf.png" alt="📏" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Ordenação natural</strong></li>



<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f9e0.png" alt="🧠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Fáceis de entender</strong></li>



<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4be.png" alt="💾" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Leves em termos de armazenamento (4 a 8 bytes)</strong></li>
</ul>



<p>Em sistemas grandes, com milhões ou bilhões de registros, isso faz muita diferença.</p>



<p>Então… se eles são tão bons, por que não usar sempre?</p>



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



<h2 class="wp-block-heading">Onde os IDs sequenciais começam a falhar</h2>



<p>Muitas das qualidades dos IDs sequenciais se tornam <strong>problemas sérios</strong> quando entramos no mundo das APIs públicas e dos sistemas distribuídos.</p>



<h3 class="wp-block-heading">1. Exposição de informação sensível</h3>



<p>Imagine que você cria um usuário e recebe o ID <code>1234</code>.<br>Só com isso já dá para inferir muita coisa.</p>



<p>Se a URL for algo como:</p>



<pre class="wp-block-code"><code>/users/1234
</code></pre>



<p>Um atacante pode simplesmente tentar:</p>



<pre class="wp-block-code"><code>/users/1235
/users/1236
/users/1237
</code></pre>



<p>Se a API estiver mal protegida, você acabou de facilitar:</p>



<ul class="wp-block-list">
<li><strong>ID Enumeration Attacks</strong></li>



<li><strong>Scraping massivo de dados</strong></li>



<li>Vazamento de informações sensíveis</li>
</ul>



<p>Mesmo que exista autenticação, esse padrão já entrega mais informação do que deveria.</p>



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



<h3 class="wp-block-heading">2. Inteligência competitiva indesejada</h3>



<p>Com IDs sequenciais, alguém consegue inferir:</p>



<ul class="wp-block-list">
<li>Quantos usuários existem</li>



<li>Quantos pedidos foram feitos</li>



<li>Ritmo de crescimento do negócio</li>
</ul>



<p>Isso pode parecer detalhe técnico, mas vira <strong>dado estratégico</strong> quando exposto.</p>



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



<h3 class="wp-block-heading">3. Problemas em sistemas distribuídos</h3>



<p>Agora pense em um cenário mais arquitetural.</p>



<p>Você tem:</p>



<ul class="wp-block-list">
<li>Várias instâncias da API</li>



<li>Todas gravando no mesmo banco</li>



<li>Alto volume de requisições simultâneas</li>
</ul>



<p>Nesse cenário, o banco precisa:</p>



<ul class="wp-block-list">
<li>Coordenar quem pega qual ID</li>



<li>Criar locks</li>



<li>Sincronizar inserts concorrentes</li>
</ul>



<p>Isso gera:</p>



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



<li>Perda de performance</li>



<li>Menos ganho real com escalabilidade horizontal</li>
</ul>



<p>Ou seja: o banco vira o gargalo do sistema.</p>



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



<h2 class="wp-block-heading">UUIDs: identificadores pensados para sistemas distribuídos</h2>



<p>Os <strong>UUIDs</strong> existem desde a década de 80, mas foram padronizados para a internet com a RFC 4122 e evoluíram ao longo do tempo.</p>



<p>A ideia central é simples e poderosa:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Cada sistema pode gerar IDs <strong>sem precisar se coordenar com ninguém</strong>.</p>
</blockquote>



<h3 class="wp-block-heading">Características principais</h3>



<ul class="wp-block-list">
<li>128 bits</li>



<li>Representação hexadecimal</li>



<li>Extremamente baixa chance de colisão</li>



<li>Geração local, inclusive offline</li>
</ul>



<p>Isso muda completamente o jogo.</p>



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



<h2 class="wp-block-heading">Por que UUIDs funcionam tão bem em APIs modernas?</h2>



<p>Vamos revisitar alguns problemas dos IDs sequenciais.</p>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f539.png" alt="🔹" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Colisão em ambientes distribuídos? Praticamente inexistente</h3>



<p>Cada instância gera seu próprio ID, sem depender do banco.</p>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f539.png" alt="🔹" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Geração offline</h3>



<p>Perfeito para aplicações que precisam sincronizar dados depois.</p>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f539.png" alt="🔹" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Segurança por obscuridade (bem aplicada)</h3>



<p>Não dá para “chutar” o próximo ID.</p>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f539.png" alt="🔹" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Ideal para logs, eventos e mensageria</h3>



<p>Cada evento pode ser identificado globalmente, sem conflito.</p>



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



<h2 class="wp-block-heading">Mas… UUIDs são todos iguais?</h2>



<p>Não. Existem <strong>várias versões</strong>, cada uma com características diferentes.</p>



<h3 class="wp-block-heading">UUID v1</h3>



<ul class="wp-block-list">
<li>Baseado em timestamp + MAC address</li>



<li>Ordenável</li>



<li><strong>Problema:</strong> expõe informações sensíveis</li>
</ul>



<h3 class="wp-block-heading">UUID v2</h3>



<ul class="wp-block-list">
<li>Inclui ID de usuário e grupo do sistema operacional</li>



<li>Quase ninguém usa (com razão)</li>
</ul>



<h3 class="wp-block-heading">UUID v3 e v5 (determinísticos)</h3>



<ul class="wp-block-list">
<li>Baseados em namespace + hash</li>



<li>Úteis quando você quer gerar sempre o mesmo ID a partir dos mesmos dados</li>



<li>V3 usa MD5, V5 usa SHA-1</li>
</ul>



<h3 class="wp-block-heading">UUID v4 (o mais usado)</h3>



<ul class="wp-block-list">
<li>Totalmente aleatório</li>



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



<li>Amplamente suportado</li>



<li><strong>Problema:</strong> não é ordenável → impacta índices</li>
</ul>



<h3 class="wp-block-heading">UUID v7 (o novo queridinho)</h3>



<ul class="wp-block-list">
<li>Timestamp + aleatoriedade</li>



<li>Ordenável</li>



<li>Ótimo para bancos e eventos</li>



<li>Retrocompatível com versões anteriores</li>
</ul>



<p>A v7 traz o famoso “melhor dos dois mundos”.</p>



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



<h2 class="wp-block-heading">Então UUIDs são sempre melhores?</h2>



<p>Não.</p>



<p>Eles também têm <strong>trade-offs importantes</strong>:</p>



<ul class="wp-block-list">
<li>São maiores (128 bits)</li>



<li>Impactam índices se mal utilizados</li>



<li>URLs ficam menos amigáveis</li>



<li>Mais custo de storage</li>



<li>Nem todo cenário precisa dessa complexidade</li>
</ul>



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



<h2 class="wp-block-heading">Quando usar UUIDs?</h2>



<ul class="wp-block-list">
<li>APIs públicas</li>



<li>Sistemas distribuídos</li>



<li>Microsserviços</li>



<li>Identificação de eventos e logs</li>



<li>Sincronização entre sistemas</li>



<li>Geração de IDs offline</li>



<li>Quando segurança e escalabilidade importam</li>
</ul>



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



<h2 class="wp-block-heading">Quando IDs sequenciais ainda fazem sentido?</h2>



<ul class="wp-block-list">
<li>Sistemas pequenos e centralizados</li>



<li>Dados internos que não são expostos</li>



<li>Tabelas de domínio</li>



<li>Conjuntos de dados controlados</li>



<li>Quando slugs fazem mais sentido (SEO, URLs legíveis)</li>
</ul>



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



<h2 class="wp-block-heading">Conclusão: não existe ID perfeito</h2>



<p>A escolha do identificador diz muito sobre o <strong>tipo de sistema que você está construindo</strong>.</p>



<p>IDs sequenciais são simples, rápidos e eficientes — até o momento em que começam a limitar segurança e escalabilidade.</p>



<p>UUIDs resolvem problemas reais de sistemas modernos, mas trazem novos desafios.</p>



<p>No fim das contas, o papel do arquiteto e do desenvolvedor é entender o <strong>domínio</strong>, o <strong>contexto</strong> e os <strong>trade-offs</strong>.</p>



<p>Não existe bala de prata.<br>Existe <strong>a escolha certa para o seu caso de uso</strong>.</p>
<p>The post <a href="https://essencia.dev/como-identificar-recursos-em-apis-modernas-sem-cair-em-armadilhas/">Como identificar recursos em APIs modernas sem cair em armadilhas</a> appeared first on <a href="https://essencia.dev">essencia.dev</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://essencia.dev/como-identificar-recursos-em-apis-modernas-sem-cair-em-armadilhas/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Snowflake IDs: por que grandes APIs evitam UUIDs como identificadores públicos</title>
		<link>https://essencia.dev/snowflake-ids-por-que-grandes-apis-evitam-uuids-como-identificadores-publicos/</link>
					<comments>https://essencia.dev/snowflake-ids-por-que-grandes-apis-evitam-uuids-como-identificadores-publicos/#respond</comments>
		
		<dc:creator><![CDATA[Bernardo Lobato]]></dc:creator>
		<pubDate>Tue, 30 Dec 2025 19:27:10 +0000</pubDate>
				<category><![CDATA[API]]></category>
		<category><![CDATA[Sem categoria]]></category>
		<guid isPermaLink="false">https://essencia.dev/?p=35</guid>

					<description><![CDATA[<p>Plataformas como X, Discord e Instagram expõem identificadores numéricos longos, aparentemente aleatórios — mas que, na prática, seguem uma lógica muito bem definida. Neste artigo, vamos entender: Unicidade é só o requisito mínimo Quando falamos em identificadores, quase todo mundo concorda em um ponto: Um ID precisa ser único. Mas em sistemas reais, distribuídos e [&#8230;]</p>
<p>The post <a href="https://essencia.dev/snowflake-ids-por-que-grandes-apis-evitam-uuids-como-identificadores-publicos/">Snowflake IDs: por que grandes APIs evitam UUIDs como identificadores públicos</a> appeared first on <a href="https://essencia.dev">essencia.dev</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="is-style-text-display has-x-large-font-size is-style-text-display--2">Plataformas como X, Discord e Instagram expõem identificadores numéricos longos, aparentemente aleatórios — mas que, na prática, seguem uma lógica muito bem definida.</p>



<p>Neste artigo, vamos entender:</p>



<ul class="wp-block-list is-style-checkmark-list">
<li>Por que unicidade não é o único requisito de um ID</li>



<li>As limitações de IDs sequenciais e UUIDs em sistemas distribuídos</li>



<li>O que são Snowflake IDs e como eles funcionam</li>



<li>Por que grandes APIs adotam esse modelo</li>



<li>Quando essa estratégia faz sentido (e quando não faz)</li>
</ul>



<h2 class="wp-block-heading">Unicidade é só o requisito mínimo</h2>



<p>Quando falamos em identificadores, quase todo mundo concorda em um ponto:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>Um ID precisa ser único.</strong></p>
</blockquote>



<p>Mas em sistemas reais, distribuídos e em produção, isso está longe de ser suficiente.</p>



<p>Em APIs modernas, bons identificadores também precisam:</p>



<ul class="wp-block-list">
<li>Ser gerados sem coordenação central</li>



<li>Funcionar bem com múltiplas instâncias</li>



<li>Não virar gargalo de performance</li>



<li>Permitir paralelismo</li>



<li>Não vazar informações sensíveis do negócio</li>



<li>Ajudar (e não atrapalhar) observabilidade e operação</li>
</ul>



<p>Ou seja: <strong>unicidade é o requisito mínimo, não o objetivo final</strong>.</p>



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



<h2 class="wp-block-heading">O problema dos sistemas distribuídos</h2>



<p>Em arquiteturas distribuídas lidamos com:</p>



<ul class="wp-block-list">
<li>Auto scaling</li>



<li>Múltiplos serviços</li>



<li>Concorrência real</li>



<li>Execução paralela</li>



<li>Múltiplas regiões</li>



<li>Infraestrutura dinâmica</li>
</ul>



<p>Nesse cenário, deixar a geração de IDs:</p>



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



<li>dependente de sequência</li>



<li>ou altamente acoplada a um único ponto</li>
</ul>



<p>é pedir para criar gargalos.</p>



<p>IDs sequenciais funcionam muito bem… <strong>até deixarem de funcionar</strong>.</p>



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



<h2 class="wp-block-heading">UUIDs resolvem tudo? Mais ou menos</h2>



<p>UUIDs (ou GUIDs) são extremamente populares — e com bons motivos.</p>



<p>Eles oferecem:</p>



<ul class="wp-block-list">
<li>Unicidade global</li>



<li>Geração totalmente descentralizada</li>



<li>Suporte nativo em praticamente todas as linguagens</li>



<li>Facilidade para geração no frontend, backend ou offline</li>
</ul>



<p>Isso os torna uma excelente escolha para:</p>



<ul class="wp-block-list">
<li>Integrações externas</li>



<li>Sistemas sem controle rígido de infraestrutura</li>



<li>Sincronizações offline</li>



<li>Casos onde flexibilidade é mais importante que controle</li>
</ul>



<p>Mas essa flexibilidade vem com um custo.</p>



<p>UUIDs:</p>



<ul class="wp-block-list">
<li>Não carregam significado operacional</li>



<li>São ruins para ordenação temporal (especialmente V4)</li>



<li>Geram índices grandes (128 bits)</li>



<li>Podem degradar performance em tabelas massivas</li>



<li>Não ajudam na observabilidade</li>
</ul>



<p>Em muitos casos, <strong>unicidade global não é tudo o que o negócio precisa</strong>.</p>



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



<h2 class="wp-block-heading">Quando você quer mais controle que o UUID oferece</h2>



<p>Agora imagine que você queira:</p>



<ul class="wp-block-list">
<li>Saber quando um registro foi criado apenas olhando o ID</li>



<li>Garantir ordenação temporal forte</li>



<li>Evitar gargalo no banco</li>



<li>Melhorar eficiência de índices</li>



<li>Facilitar particionamento</li>



<li>Ter previsibilidade operacional</li>
</ul>



<p>É nesse ponto que entra o <strong>Snowflake ID</strong>.</p>



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



<h2 class="wp-block-heading">O que é um Snowflake ID?</h2>



<p>Snowflake IDs são identificadores numéricos de <strong>64 bits</strong>, criados originalmente pelo Twitter por volta de 2010 para identificar tweets em um sistema altamente distribuído.</p>



<p>A ideia central não é apenas gerar um ID único, mas <strong>controlar como ele é gerado</strong>.</p>



<p>A estrutura clássica do Snowflake é:</p>



<ul class="wp-block-list">
<li><strong>1 bit</strong>: sempre zero (sinal)</li>



<li><strong>41 bits</strong>: timestamp (baseado em uma época customizada)</li>



<li><strong>10 bits</strong>: identificador do nó / instância</li>



<li><strong>12 bits</strong>: sequência local naquele nó</li>
</ul>



<p>Isso permite:</p>



<ul class="wp-block-list">
<li>Até <strong>4.096 IDs por milissegundo por nó</strong></li>



<li>Milhões de IDs por segundo em escala horizontal</li>



<li>Geração totalmente local, sem coordenação central</li>
</ul>



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



<h2 class="wp-block-heading">IDs que já nascem distribuídos</h2>



<p>Uma característica fundamental do Snowflake é que:</p>



<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f449.png" alt="👉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>cada nó é responsável por gerar seus próprios IDs</strong>.</p>



<p>Isso elimina:</p>



<ul class="wp-block-list">
<li>Locks globais</li>



<li>Dependência do banco</li>



<li>Gargalos de sequência</li>



<li>Contenção em ambientes paralelos</li>
</ul>



<p>O banco deixa de ser o “gerador de IDs” e passa a ser apenas um consumidor deles.</p>



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



<h2 class="wp-block-heading">IDs que contam uma história</h2>



<p>Um efeito colateral (positivo) dessa estrutura é que os Snowflake IDs são <strong>temporalmente ordenáveis</strong>.</p>



<p>Isso significa que:</p>



<ul class="wp-block-list">
<li>Você pode ordenar registros pelo ID</li>



<li>Extrair data e hora de criação</li>



<li>Identificar picos de tráfego</li>



<li>Analisar padrões operacionais</li>
</ul>



<p>Tudo isso <strong>sem metadados adicionais</strong>.</p>



<p>O próprio ID já carrega essas informações.</p>



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



<h2 class="wp-block-heading">Por que grandes APIs usam Snowflakes?</h2>



<p>Agora fica mais fácil entender por que grandes plataformas adotam esse modelo.</p>



<p>Entre os principais benefícios:</p>



<ul class="wp-block-list">
<li>Menor acoplamento ao banco de dados</li>



<li>Melhor eficiência de índices (64 bits)</li>



<li>Ordenação temporal natural</li>



<li>Excelente suporte a particionamento</li>



<li>Melhor observabilidade</li>



<li>Geração previsível e controlada</li>
</ul>



<p>No Instagram, por exemplo, os bits que representariam o nó físico são usados para identificar <strong>shards lógicos</strong>.<br>No Discord, esses bits são divididos entre <strong>worker</strong> e <strong>processo</strong>.</p>



<p>Ou seja: o conceito é o mesmo, mas a implementação se adapta à infraestrutura.</p>



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



<h2 class="wp-block-heading">Os custos e riscos dessa estratégia</h2>



<p>Snowflake IDs <strong>não são uma bala de prata</strong>.</p>



<p>Eles exigem:</p>



<ul class="wp-block-list">
<li>Configuração correta de infraestrutura</li>



<li>Garantia absoluta de unicidade do ID do nó</li>



<li>Disciplina arquitetural</li>



<li>Sincronização de relógio (clock drift)</li>



<li>Estratégia clara de deploy e autoscaling</li>
</ul>



<p>Além disso:</p>



<ul class="wp-block-list">
<li>Snowflake <strong>não é um padrão formal</strong></li>



<li>Não existe uma RFC</li>



<li>Cada implementação é uma variação</li>
</ul>



<p>Isso traz flexibilidade, mas também responsabilidade.</p>



<p>Outro ponto importante:<br><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f449.png" alt="👉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Snowflakes <strong>vazam informação temporal</strong>.<br>Se isso for um problema para o seu negócio, essa estratégia pode não ser adequada.</p>



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



<h2 class="wp-block-heading">Snowflake vs UUID: um resumo honesto</h2>



<p><strong>UUIDs</strong></p>



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



<li>Amplamente suportados</li>



<li>Flexíveis</li>



<li>Ótimos para começar</li>



<li>Pouco controle</li>



<li>Pior performance em escala extrema</li>
</ul>



<p><strong>Snowflake IDs</strong></p>



<ul class="wp-block-list">
<li>Controle explícito</li>



<li>Excelente para sistemas distribuídos</li>



<li>Melhores índices</li>



<li>Ordenação temporal</li>



<li>Mais complexidade</li>



<li>Forte dependência da infraestrutura</li>
</ul>



<p>Não existe “melhor ID universal”.<br>Existe <strong>o ID certo para o seu contexto</strong>.</p>



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



<h2 class="wp-block-heading">Identificadores são decisão arquitetural</h2>



<p>Talvez o ponto mais importante de todo esse artigo seja este:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>A escolha do identificador não é detalhe de implementação.</strong></p>
</blockquote>



<p>Ela impacta:</p>



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



<li>Observabilidade</li>



<li>Performance</li>



<li>Segurança</li>



<li>Evolução do sistema</li>
</ul>



<p>Escolher entre ID sequencial, UUID ou Snowflake é escolher <strong>como seu sistema cresce, opera e se mantém</strong>.</p>



<p>E isso é, por definição, uma decisão arquitetural.</p>



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



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



<p>Grandes APIs não escolhem Snowflake IDs por moda ou acaso.</p>



<p>Elas escolhem porque:</p>



<ul class="wp-block-list">
<li>Precisam de controle</li>



<li>Precisam de escala</li>



<li>Precisam de previsibilidade</li>



<li>Precisam operar sistemas distribuídos reais</li>
</ul>



<p>UUIDs continuam sendo excelentes ferramentas.<br>Snowflakes são ferramentas mais especializadas.</p>



<p>Saber <strong>quando usar cada uma</strong> é o que separa uma decisão técnica de uma decisão arquitetural.</p>



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



<p>Se quiser, no próximo artigo a gente pode explorar:</p>



<ul class="wp-block-list">
<li>UUID V7 vs Snowflake</li>



<li>NanoID, KSUID, ULID</li>



<li>IDs naturais</li>



<li>Estratégias híbridas</li>



<li>Impacto direto em bancos relacionais</li>
</ul>



<p>Se esse tema te fez repensar a forma como você cria IDs nas suas APIs, comenta lá no blog ou compartilha com o time.<br>Essa discussão vale muito a pena continuar.</p>



<p></p>
<p>The post <a href="https://essencia.dev/snowflake-ids-por-que-grandes-apis-evitam-uuids-como-identificadores-publicos/">Snowflake IDs: por que grandes APIs evitam UUIDs como identificadores públicos</a> appeared first on <a href="https://essencia.dev">essencia.dev</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://essencia.dev/snowflake-ids-por-que-grandes-apis-evitam-uuids-como-identificadores-publicos/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Idempotência: como lidar corretamente com chamadas duplicadas em APIs e backends</title>
		<link>https://essencia.dev/ola-mundo/</link>
					<comments>https://essencia.dev/ola-mundo/#respond</comments>
		
		<dc:creator><![CDATA[Bernardo Lobato]]></dc:creator>
		<pubDate>Tue, 30 Dec 2025 17:38:15 +0000</pubDate>
				<category><![CDATA[Sem categoria]]></category>
		<guid isPermaLink="false">http://essencia.dev/?p=1</guid>

					<description><![CDATA[<p>Se você trabalha com backend, APIs ou sistemas distribuídos, existe uma verdade inevitável que cedo ou tarde aparece em produção: 👉 Chamadas duplicadas vão acontecer. Elas surgem por retry automático, timeout de rede, instabilidade de internet, falhas intermediárias, consumidores paralelos ou, simplesmente, pelo famoso “dedo nervoso” do usuário clicando várias vezes no mesmo botão. E [&#8230;]</p>
<p>The post <a href="https://essencia.dev/ola-mundo/">Idempotência: como lidar corretamente com chamadas duplicadas em APIs e backends</a> appeared first on <a href="https://essencia.dev">essencia.dev</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Se você trabalha com backend, APIs ou sistemas distribuídos, existe uma verdade inevitável que cedo ou tarde aparece em produção:</p>



<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f449.png" alt="👉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Chamadas duplicadas vão acontecer.</p>



<p>Elas surgem por retry automático, timeout de rede, instabilidade de internet, falhas intermediárias, consumidores paralelos ou, simplesmente, pelo famoso “dedo nervoso” do usuário clicando várias vezes no mesmo botão.</p>



<p>E o problema não é a duplicação em si — o problema é o que o seu sistema faz quando ela acontece.</p>



<p>Neste artigo, vamos entender:</p>



<p>O que é idempotência (de verdade, sem buzzword)</p>



<p>Por que chamadas duplicadas são a regra, não a exceção</p>



<p>Exemplos reais de problemas causados por falta de idempotência</p>



<p>Estratégias para tratar duplicidade corretamente</p>



<p>Quando idempotência é obrigatória, desejável ou overengineering</p>



<p>O problema das chamadas duplicadas</p>



<p>Vamos começar com alguns exemplos comuns do mundo real.</p>



<ol class="wp-block-list">
<li>Retry e timeout no frontend</li>
</ol>



<p>Imagine um endpoint POST /pagamentos.</p>



<p>O fluxo é simples:</p>



<p>O cliente chama a API</p>



<p>O backend processa o pagamento</p>



<p>O banco é atualizado</p>



<p>O cliente recebe a resposta</p>



<p>Agora adicione uma variável muito comum: internet instável.</p>



<p>O pagamento é processado com sucesso, mas o cliente não recebe a resposta por causa de um timeout. O frontend, bem programado, aplica uma política de retry e dispara a mesma requisição novamente.</p>



<p>Resultado:</p>



<p>O sistema “funcionou”</p>



<p>Não houve erro técnico</p>



<p>Mas o usuário pode ser cobrado duas vezes</p>



<p>Tecnicamente resiliente. Arquiteturalmente frágil.</p>



<ol start="2" class="wp-block-list">
<li>Confirmação de e-mail e tokens inválidos</li>
</ol>



<p>Outro exemplo clássico: POST /usuarios/confirmar-email.</p>



<p>O usuário clica no botão para receber o token.<br>Clica de novo.<br>Clica de novo.<br>Clica de novo.</p>



<p>Cada clique gera um novo token, invalidando o anterior.</p>



<p>Resultado:</p>



<p>O usuário recebe vários e-mails</p>



<p>Nenhum token funciona</p>



<p>A experiência degrada</p>



<p>O suporte recebe chamados</p>



<p>Tudo isso porque o sistema assumiu que a chamada aconteceria uma única vez.</p>



<ol start="3" class="wp-block-list">
<li>Geração de relatórios pesados</li>
</ol>



<p>Agora imagine um endpoint que gera um relatório complexo:</p>



<p>Várias queries</p>



<p>Processamento pesado</p>



<p>Geração de PDF</p>



<p>Se múltiplas requisições iguais chegam ao mesmo tempo, você pode:</p>



<p>Saturar o banco</p>



<p>Travar o sistema</p>



<p>Gerar o mesmo relatório várias vezes desnecessariamente</p>



<p>O erro conceitual por trás de tudo isso</p>



<p>Esses exemplos têm algo em comum:</p>



<p>Assumem que a chamada acontece uma única vez</p>



<p>Geram efeitos colaterais indesejados quando isso não acontece</p>



<p>Em ambientes distribuídos, isso nunca é uma premissa válida.</p>



<p>É aqui que entra o conceito de idempotência.</p>



<p>O que é idempotência?</p>



<p>O termo vem da matemática, mais especificamente da álgebra abstrata.</p>



<p>Uma operação idempotente é aquela que:</p>



<p>não importa quantas vezes seja aplicada com as mesmas entradas, o resultado final é sempre o mesmo.</p>



<p>Exemplos do mundo real:</p>



<p>Botão de elevador</p>



<p>Botão de emergência</p>



<p>Botão de “parar” de uma máquina</p>



<p>A expectativa é simples:<br><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f449.png" alt="👉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> apertar uma vez ou dez vezes produz o mesmo efeito.</p>



<p>Em APIs e backends, deveria ser exatamente assim.</p>



<p>Idempotência em sistemas</p>



<p>Aplicar idempotência significa garantir que:</p>



<p>Chamadas duplicadas não quebram o sistema</p>



<p>Efeitos colaterais não se repetem</p>



<p>O estado só muda quando realmente precisa mudar</p>



<p>Gerar um token?<br><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/27a1.png" alt="➡" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Apenas uma vez dentro da regra definida.</p>



<p>Criar um pagamento?<br><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/27a1.png" alt="➡" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Apenas uma vez para aquela transação.</p>



<p>Gerar um relatório?<br><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/27a1.png" alt="➡" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Apenas uma vez para aquele conjunto de parâmetros.</p>



<p>Como identificar chamadas duplicadas?</p>



<p>Antes de tratar duplicidade, precisamos responder uma pergunta fundamental:</p>



<p>Como saber que duas chamadas são, de fato, a mesma operação?</p>



<p>Existem várias estratégias, mas duas são as mais comuns.</p>



<ol class="wp-block-list">
<li>Identidade lógica (baseada no domínio)</li>
</ol>



<p>Aqui, usamos dados do próprio negócio para garantir unicidade.</p>



<p>Exemplos:</p>



<p>E-mail</p>



<p>CPF</p>



<p>Data/hora</p>



<p>Tipo de operação</p>



<p>Estado atual</p>



<p>Exemplo prático:</p>



<p>Um token de confirmação só pode ser gerado a cada 5 minutos para o mesmo e-mail</p>



<p>Se uma nova requisição chega dentro desse intervalo, reutilizamos o token existente</p>



<p>Vantagens:</p>



<p>Simples de entender</p>



<p>Alinhada ao domínio</p>



<p>Pode usar índices únicos no banco</p>



<p>Pouca ou nenhuma mudança no payload</p>



<p>Desvantagens:</p>



<p>Regras precisam estar muito bem alinhadas entre sistemas</p>



<p>Mudanças exigem coordenação entre times</p>



<p>Acoplamento forte ao domínio</p>



<ol start="2" class="wp-block-list">
<li>Chave de idempotência</li>
</ol>



<p>Aqui, o cliente gera um identificador único e envia junto com a requisição.</p>



<p>Essa chave:</p>



<p>Identifica a operação</p>



<p>Independe dos dados de negócio</p>



<p>É armazenada no backend junto com o estado da operação</p>



<p>Fluxo típico:</p>



<p>O cliente gera uma chave</p>



<p>Envia a requisição com essa chave</p>



<p>O backend verifica se ela já existe</p>



<p>Decide se processa, reutiliza ou ignora</p>



<p>Vantagens:</p>



<p>Menos acoplamento ao domínio</p>



<p>Muito comum em APIs públicas e pagamentos</p>



<p>Excelente para retrys automáticos</p>



<p>Cuidados:</p>



<p>A chave precisa ser persistida</p>



<p>O cliente precisa armazená-la corretamente</p>



<p>Exige storage, locks e controle de estado</p>



<p>Quando idempotência é obrigatória?</p>



<p>Idempotência não é “nice to have” em alguns cenários — é requisito de negócio.</p>



<p>Ela é obrigatória quando:</p>



<p>Há efeitos colaterais relevantes</p>



<p>Envolve dinheiro, contratos ou confiança</p>



<p>O sistema é distribuído</p>



<p>Existe mensageria, filas, eventos e consumidores paralelos</p>



<p>Se repetir a operação causa prejuízo ou caos, idempotência é obrigatória.</p>



<p>Quando idempotência é desejável?</p>



<p>Ela é altamente recomendada quando:</p>



<p>Existe retry automático</p>



<p>O sistema lida com redes instáveis</p>



<p>O estado final não pode ser repetido</p>



<p>A operação representa uma transição de estado</p>



<p>Exemplos:</p>



<p>Confirmação de e-mail</p>



<p>Ativação de conta</p>



<p>Finalização de pedido</p>



<p>Cancelamento de assinatura</p>



<p>Quando idempotência pode ser overengineering?</p>



<p>Nem tudo precisa ser idempotente.</p>



<p>Alguns exemplos:</p>



<p>Operações somente leitura</p>



<p>Geração de logs</p>



<p>Métricas</p>



<p>Auditoria</p>



<p>Eventos que devem ser repetidos</p>



<p>Se:</p>



<p>O impacto da duplicação é baixo</p>



<p>O custo de implementação é alto</p>



<p>Não há identidade clara da operação</p>



<p>Talvez o risco seja aceitável.</p>



<p>Arquitetura também é saber onde não colocar complexidade.</p>



<p>E quanto ao REST?</p>



<p>De forma geral:</p>



<p>GET → naturalmente idempotente</p>



<p>PUT → geralmente idempotente</p>



<p>POST → geralmente não idempotente</p>



<p>Mas isso não é regra escrita em pedra.</p>



<p>Tudo depende:</p>



<p>Do domínio</p>



<p>Dos efeitos colaterais</p>



<p>Das garantias que seu sistema precisa oferecer</p>



<p>Conclusão</p>



<p>Chamadas duplicadas não são exceção.<br>Elas são a regra em sistemas reais.</p>



<p>Retry, timeout, instabilidade, falhas intermediárias e comportamento humano fazem parte do jogo.</p>



<p>Nosso papel como arquitetos e desenvolvedores é:</p>



<p>Antecipar esse cenário</p>



<p>Tratar duplicidade corretamente</p>



<p>Proteger o estado do sistema</p>



<p>Evitar efeitos colaterais indesejados</p>



<p>Idempotência é uma decisão de arquitetura, não um detalhe de implementação.</p>



<p>Ela tem custo.<br>Ela tem complexidade.<br>E exatamente por isso não deve ser aplicada cegamente.</p>



<p>Garantir idempotência é garantir que o estado do sistema só muda quando realmente precisa mudar.</p>



<p></p>
<p>The post <a href="https://essencia.dev/ola-mundo/">Idempotência: como lidar corretamente com chamadas duplicadas em APIs e backends</a> appeared first on <a href="https://essencia.dev">essencia.dev</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://essencia.dev/ola-mundo/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
