<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Paulo Teixeira]]></title><description><![CDATA[Engenheiro de software há 15 anos escrevendo sobre carreira em tech, sobre o que separa quem constrói de quem só executa, e sobre por que empreender virou uma resposta racional para quem quer continuar fazendo um trabalho que importa.]]></description><link>https://blog.pauloteixeira.dev</link><image><url>https://blog.pauloteixeira.dev/img/substack.png</url><title>Paulo Teixeira</title><link>https://blog.pauloteixeira.dev</link></image><generator>Substack</generator><lastBuildDate>Thu, 18 Jun 2026 21:30:04 GMT</lastBuildDate><atom:link href="https://blog.pauloteixeira.dev/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Paulo Teixeira]]></copyright><language><![CDATA[pt-br]]></language><webMaster><![CDATA[pcesarteixeira@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[pcesarteixeira@substack.com]]></itunes:email><itunes:name><![CDATA[Paulo Teixeira]]></itunes:name></itunes:owner><itunes:author><![CDATA[Paulo Teixeira]]></itunes:author><googleplay:owner><![CDATA[pcesarteixeira@substack.com]]></googleplay:owner><googleplay:email><![CDATA[pcesarteixeira@substack.com]]></googleplay:email><googleplay:author><![CDATA[Paulo Teixeira]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[IA não gera código legado. Quem gera é você.]]></title><description><![CDATA[O problema nunca foi o modelo. Foi a falta de crit&#233;rio antes do prompt.]]></description><link>https://blog.pauloteixeira.dev/p/ia-nao-gera-codigo-legado-quem-gera</link><guid isPermaLink="false">https://blog.pauloteixeira.dev/p/ia-nao-gera-codigo-legado-quem-gera</guid><dc:creator><![CDATA[Paulo Teixeira]]></dc:creator><pubDate>Tue, 12 May 2026 16:28:10 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!F6hi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec365006-8ed6-450e-84be-c558e15e92a1_2752x1536.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!F6hi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec365006-8ed6-450e-84be-c558e15e92a1_2752x1536.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!F6hi!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec365006-8ed6-450e-84be-c558e15e92a1_2752x1536.png 424w, https://substackcdn.com/image/fetch/$s_!F6hi!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec365006-8ed6-450e-84be-c558e15e92a1_2752x1536.png 848w, https://substackcdn.com/image/fetch/$s_!F6hi!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec365006-8ed6-450e-84be-c558e15e92a1_2752x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!F6hi!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec365006-8ed6-450e-84be-c558e15e92a1_2752x1536.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!F6hi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec365006-8ed6-450e-84be-c558e15e92a1_2752x1536.png" width="728" height="406.5" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ec365006-8ed6-450e-84be-c558e15e92a1_2752x1536.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:813,&quot;width&quot;:1456,&quot;resizeWidth&quot;:728,&quot;bytes&quot;:6872450,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://blog.pauloteixeira.dev/i/197337590?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec365006-8ed6-450e-84be-c558e15e92a1_2752x1536.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!F6hi!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec365006-8ed6-450e-84be-c558e15e92a1_2752x1536.png 424w, https://substackcdn.com/image/fetch/$s_!F6hi!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec365006-8ed6-450e-84be-c558e15e92a1_2752x1536.png 848w, https://substackcdn.com/image/fetch/$s_!F6hi!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec365006-8ed6-450e-84be-c558e15e92a1_2752x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!F6hi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec365006-8ed6-450e-84be-c558e15e92a1_2752x1536.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Tem uma frase que eu ou&#231;o bastante de desenvolvedor mais c&#233;tico: &#8220;IA gera c&#243;digo legado&#8221;. E eu entendo o sentimento. Quem nunca pediu uma feature pro Claude, recebeu duzentas linhas de TypeScript que rodam de primeira, e tr&#234;s semanas depois descobriu que o coitado do c&#243;digo tem tr&#234;s camadas de abstra&#231;&#227;o que ningu&#233;m pediu, um padr&#227;o de erro inconsistente com o resto do projeto e um teste unit&#225;rio que mocka exatamente a coisa que precisava ser testada?</p><p>A quest&#227;o &#233; que esse c&#243;digo n&#227;o foi gerado pela IA. Ele foi pedido por voc&#234;.</p><p>Eu venho usando agente de IA pra codar de forma s&#233;ria h&#225; um bom tempo e, depois de quebrar a cara algumas vezes, cheguei numa conclus&#227;o que parece &#243;bvia mas &#233; desconfort&#225;vel: a IA &#233; uma m&#225;quina de amplificar crit&#233;rio. Se voc&#234; tem crit&#233;rio, ela acelera a entrega de coisa boa. Se voc&#234; n&#227;o tem, ela acelera a entrega de coisa ruim. A velocidade &#233; a mesma. O que muda &#233; o que sai do outro lado.</p><p>O ponto &#233; que existe um trabalho que precisa estar feito antes de voc&#234; abrir o agente. Quando ele n&#227;o est&#225; feito, o modelo escolhe sozinho. E o que ele escolhe sozinho quase sempre &#233; o caminho mais gen&#233;rico poss&#237;vel.</p><h2>Personas antes de qualquer linha</h2><p>Toda vez que eu pulo essa etapa, eu pago depois. Sem exce&#231;&#227;o.</p><p>Quando voc&#234; pede pra IA construir uma feature sem dizer pra quem ela &#233;, o modelo vai resolver o problema t&#233;cnico gen&#233;rico. Vai assumir que o usu&#225;rio &#233; mediano, que vai usar o produto da forma mais &#243;bvia, que entende um pouco de tecnologia mas n&#227;o muito. O resultado &#233; um Frankenstein de UX que serve pra ningu&#233;m em espec&#237;fico.</p><p>Eu mantenho um arquivo de personas no projeto. N&#227;o &#233; um documento de marketing com nome inventado e foto de banco de imagem. &#201; um invent&#225;rio curto: quem usa, qual o n&#237;vel t&#233;cnico, qual o contexto de uso (mobile no metr&#244;? desktop no escrit&#243;rio? voz no carro?), qual a toler&#226;ncia a erro, qual a frequ&#234;ncia de uso. Quando eu pe&#231;o uma feature, esse arquivo entra no contexto e o modelo passa a decidir nuances de implementa&#231;&#227;o a partir disso.</p><p>Um exemplo bobo: valida&#231;&#227;o de formul&#225;rio. Pra uma persona que usa o sistema dez vezes por dia, validar campo por campo &#233; fric&#231;&#227;o desnecess&#225;ria, ela j&#225; sabe os erros que comete. Pra uma persona que vai usar o produto uma vez, validar tudo no submit &#233; cruel. Sem persona definida, o modelo escolhe um padr&#227;o gen&#233;rico. Com persona definida, ele escolhe o padr&#227;o certo.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://blog.pauloteixeira.dev/subscribe?&quot;,&quot;text&quot;:&quot;Assine agora&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://blog.pauloteixeira.dev/subscribe?"><span>Assine agora</span></a></p><h2>Use case diagrams e por que UML voltou a importar</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1YM-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8864f940-cb4f-48e2-be4a-50737a1fb135_3200x1312.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1YM-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8864f940-cb4f-48e2-be4a-50737a1fb135_3200x1312.png 424w, https://substackcdn.com/image/fetch/$s_!1YM-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8864f940-cb4f-48e2-be4a-50737a1fb135_3200x1312.png 848w, https://substackcdn.com/image/fetch/$s_!1YM-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8864f940-cb4f-48e2-be4a-50737a1fb135_3200x1312.png 1272w, https://substackcdn.com/image/fetch/$s_!1YM-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8864f940-cb4f-48e2-be4a-50737a1fb135_3200x1312.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1YM-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8864f940-cb4f-48e2-be4a-50737a1fb135_3200x1312.png" width="1456" height="597" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8864f940-cb4f-48e2-be4a-50737a1fb135_3200x1312.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:597,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:5986045,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.pauloteixeira.dev/i/197337590?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8864f940-cb4f-48e2-be4a-50737a1fb135_3200x1312.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!1YM-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8864f940-cb4f-48e2-be4a-50737a1fb135_3200x1312.png 424w, https://substackcdn.com/image/fetch/$s_!1YM-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8864f940-cb4f-48e2-be4a-50737a1fb135_3200x1312.png 848w, https://substackcdn.com/image/fetch/$s_!1YM-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8864f940-cb4f-48e2-be4a-50737a1fb135_3200x1312.png 1272w, https://substackcdn.com/image/fetch/$s_!1YM-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8864f940-cb4f-48e2-be4a-50737a1fb135_3200x1312.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>UML virou meio palavr&#227;o na &#250;ltima d&#233;cada. Mas a IA mudou o c&#225;lculo. Ela l&#234; diagrama de caso de uso melhor do que l&#234; descri&#231;&#227;o em linguagem natural.</p><p>Quando eu passo um caso de uso pro modelo na forma de uma lista de bullets ou um texto descritivo, ele tem que adivinhar as fronteiras: o que &#233; ator, o que &#233; caso, o que &#233; extens&#227;o, o que &#233; inclus&#227;o. Quando eu passo o mesmo conte&#250;do em PlantUML, com <code>actor</code>, <code>usecase</code>, <code>extends</code>, <code>includes</code>, ele para de adivinhar. A estrutura formal funciona como um esqueleto que o modelo preenche com m&#250;sculo.</p><p>N&#227;o precisa ser bonito. Eu escrevo PlantUML em arquivo <code>.puml</code> direto no reposit&#243;rio, na pasta <code>docs/</code>, e referencio quando estou pedindo uma feature que mexe com fluxo de usu&#225;rio. O modelo entende, e mais importante, eu posso voltar nele daqui a seis meses e entender o que eu queria.</p><h2>Banco de dados &#233; onde o legado realmente nasce</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!v8Fq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbba1dd90-d754-40d7-ab53-e00e246cfdbb_3200x1312.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!v8Fq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbba1dd90-d754-40d7-ab53-e00e246cfdbb_3200x1312.png 424w, https://substackcdn.com/image/fetch/$s_!v8Fq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbba1dd90-d754-40d7-ab53-e00e246cfdbb_3200x1312.png 848w, https://substackcdn.com/image/fetch/$s_!v8Fq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbba1dd90-d754-40d7-ab53-e00e246cfdbb_3200x1312.png 1272w, https://substackcdn.com/image/fetch/$s_!v8Fq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbba1dd90-d754-40d7-ab53-e00e246cfdbb_3200x1312.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!v8Fq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbba1dd90-d754-40d7-ab53-e00e246cfdbb_3200x1312.png" width="1456" height="597" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bba1dd90-d754-40d7-ab53-e00e246cfdbb_3200x1312.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:597,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:4892960,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.pauloteixeira.dev/i/197337590?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbba1dd90-d754-40d7-ab53-e00e246cfdbb_3200x1312.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!v8Fq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbba1dd90-d754-40d7-ab53-e00e246cfdbb_3200x1312.png 424w, https://substackcdn.com/image/fetch/$s_!v8Fq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbba1dd90-d754-40d7-ab53-e00e246cfdbb_3200x1312.png 848w, https://substackcdn.com/image/fetch/$s_!v8Fq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbba1dd90-d754-40d7-ab53-e00e246cfdbb_3200x1312.png 1272w, https://substackcdn.com/image/fetch/$s_!v8Fq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbba1dd90-d754-40d7-ab53-e00e246cfdbb_3200x1312.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>C&#243;digo ruim voc&#234; refatora numa tarde. Banco de dados mal modelado vai te assombrar por anos.</p><p>Esse &#233; o lugar onde eu sou mais rigoroso com a IA. Antes de pedir qualquer migration, eu tenho um diagrama do banco. Pode ser dbdiagram.io, pode ser Mermaid, pode ser um SQL puro com coment&#225;rios. O importante &#233; que o modelo enxergue o estado atual antes de propor o estado futuro.</p><p>Sem isso, o agente vai gerar uma tabela <code>users</code> com <code>email</code>, <code>password</code>, <code>created_at</code> e seguir feliz. O que ele n&#227;o sabe &#233; que voc&#234; j&#225; tem uma tabela <code>accounts</code> que faz exatamente isso, que o login do seu sistema &#233; por OAuth e voc&#234; nem armazena senha, que o <code>created_at</code> no resto do projeto se chama <code>inserted_at</code> por conven&#231;&#227;o do framework. Cada uma dessas decis&#245;es pequenas, repetida ao longo de meses, vira aquele tipo de d&#237;vida que ningu&#233;m quer pagar.</p><p>Eu trato o schema como o ativo mais valioso do projeto. Antes de qualquer prompt que envolva persist&#234;ncia, o diagrama atualizado vai no contexto. Sempre.</p><h2>Arquivos de contexto: o que vai e o que fica de fora</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!LZM7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c07dc4f-0ad7-4ca9-a0e3-e9e75a1ef058_3200x1312.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!LZM7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c07dc4f-0ad7-4ca9-a0e3-e9e75a1ef058_3200x1312.png 424w, https://substackcdn.com/image/fetch/$s_!LZM7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c07dc4f-0ad7-4ca9-a0e3-e9e75a1ef058_3200x1312.png 848w, https://substackcdn.com/image/fetch/$s_!LZM7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c07dc4f-0ad7-4ca9-a0e3-e9e75a1ef058_3200x1312.png 1272w, https://substackcdn.com/image/fetch/$s_!LZM7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c07dc4f-0ad7-4ca9-a0e3-e9e75a1ef058_3200x1312.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!LZM7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c07dc4f-0ad7-4ca9-a0e3-e9e75a1ef058_3200x1312.png" width="1456" height="597" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3c07dc4f-0ad7-4ca9-a0e3-e9e75a1ef058_3200x1312.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:597,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:6325810,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.pauloteixeira.dev/i/197337590?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c07dc4f-0ad7-4ca9-a0e3-e9e75a1ef058_3200x1312.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!LZM7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c07dc4f-0ad7-4ca9-a0e3-e9e75a1ef058_3200x1312.png 424w, https://substackcdn.com/image/fetch/$s_!LZM7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c07dc4f-0ad7-4ca9-a0e3-e9e75a1ef058_3200x1312.png 848w, https://substackcdn.com/image/fetch/$s_!LZM7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c07dc4f-0ad7-4ca9-a0e3-e9e75a1ef058_3200x1312.png 1272w, https://substackcdn.com/image/fetch/$s_!LZM7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c07dc4f-0ad7-4ca9-a0e3-e9e75a1ef058_3200x1312.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Aqui &#233; onde a maioria das pessoas erra, eu inclusive.</p><p>A tenta&#231;&#227;o &#233; jogar tudo no contexto. O codebase inteiro, toda a documenta&#231;&#227;o, os tickets do Jira, os coment&#225;rios do Slack. Mais contexto &#233; melhor, certo?</p><p>Errado. Mais contexto relevante &#233; melhor. Mais contexto qualquer &#233; caro e atrapalha.</p><p>O que eu fa&#231;o &#233; manter arquivos de contexto tem&#225;ticos e curtos. Um <code>CONTEXT_API.md</code> que descreve a conven&#231;&#227;o de endpoints, padr&#245;es de erro, autentica&#231;&#227;o, pagina&#231;&#227;o. Um <code>CONTEXT_FRONTEND.md</code> com a stack, padr&#245;es de componentes, biblioteca de UI, regras de acessibilidade. Um <code>CONTEXT_DOMAIN.md</code> com o vocabul&#225;rio do neg&#243;cio, porque a IA precisa saber que &#8220;rota&#8221; no meu produto significa uma coisa muito espec&#237;fica e n&#227;o a coisa que o Express chama de rota.</p><p>Quando vou pedir uma feature, eu seleciono quais desses arquivos v&#227;o entrar. Feature de frontend n&#227;o precisa do contexto de banco. Feature de relat&#243;rio n&#227;o precisa do contexto de autentica&#231;&#227;o. Cada arquivo tem entre 100 e 300 linhas, &#233; f&#225;cil de manter atualizado, e o agente recebe s&#243; o que precisa.</p><p>Isso economiza tokens, sim, mas o ganho real &#233; outro: o modelo fica mais focado. Quando voc&#234; manda quarenta arquivos pra ele, ele vai puxar refer&#234;ncia de qualquer canto. Quando voc&#234; manda quatro, ele puxa do lugar certo.</p><h2>ADRs: a mem&#243;ria que o agente n&#227;o tem</h2><p>Esse aqui demorei pra absorver. Hoje &#233; uma das coisas que mais me poupa retrabalho.</p><p>ADR &#233; Architecture Decision Record. Um arquivo curto, geralmente Markdown, que descreve uma decis&#227;o t&#233;cnica que foi tomada no projeto, o contexto em que foi tomada, as alternativas consideradas e o que pesou na escolha. N&#227;o &#233; documenta&#231;&#227;o no sentido tradicional. &#201; um registro do &#8220;por que&#8221; das coisas.</p><p>A primeira vez que eu vi valor real foi quando o agente, tr&#234;s meses depois de uma decis&#227;o, sugeriu refatorar algo que tinha sido decidido com motivo. A sugest&#227;o era boa em tese, mas ignorava uma restri&#231;&#227;o de integra&#231;&#227;o com um sistema externo que a gente j&#225; tinha brigado pra acomodar. Sem ADR, eu teria que reabrir a discuss&#227;o, lembrar dos detalhes, talvez aceitar a refatora&#231;&#227;o e descobrir o problema de novo. Com ADR, o modelo l&#234;, entende a restri&#231;&#227;o, e prop&#245;e uma alternativa que respeita a decis&#227;o.</p><p>O formato que eu uso &#233; simples. Numera os arquivos sequencialmente, <code>0001-uso-de-jwt-vs-sessao.md</code>, <code>0002-banco-postgres-vs-mongo.md</code>. Cada um tem cinco se&#231;&#245;es curtas: contexto, decis&#227;o, alternativas, consequ&#234;ncias, status. Status importa porque decis&#227;o antiga pode ser revogada, e voc&#234; quer que o agente saiba quando uma escolha foi superada.</p><p>O ganho vai al&#233;m da IA. Time novo entra no projeto e l&#234; os ADRs em uma hora. Cofundador volta de f&#233;rias e entende o que mudou. Voc&#234; mesmo, daqui a um ano, lembra do racioc&#237;nio sem precisar reconstruir tudo do zero. A IA s&#243; &#233; mais um leitor desse mesmo material, e o melhor &#233; que ela respeita.</p><h2>Testes unit&#225;rios como instrumento de design, n&#227;o de cobertura</h2><p>Eu confesso que durante muito tempo achei que pedir teste unit&#225;rio pra IA era perda de tempo. Ela escrevia teste que testava a implementa&#231;&#227;o, n&#227;o o comportamento. Mockava o que n&#227;o devia. Cobria casos felizes e ignorava as bordas.</p><p>O que mudou foi a ordem. Eu passei a pedir o teste antes do c&#243;digo.</p><p>N&#227;o &#233; TDD no sentido cl&#225;ssico. &#201; mais um TDD conversacional. Eu descrevo o comportamento esperado em linguagem natural, pe&#231;o pro agente escrever os testes primeiro, reviso esses testes com cuidado e s&#243; depois libero a implementa&#231;&#227;o. Quando o teste est&#225; bom, o c&#243;digo que sai pra fazer ele passar &#233; quase sempre bom tamb&#233;m.</p><p>Esse passo de revisar o teste &#233; onde mora o crit&#233;rio. Eu olho cada caso e pergunto: esse teste reflete uma regra de neg&#243;cio real, ou &#233; uma armadilha de implementa&#231;&#227;o? Esse mock est&#225; simulando uma depend&#234;ncia ou est&#225; escondendo um bug? Esse asser&#231;&#227;o verifica o que o usu&#225;rio se importa, ou verifica detalhe interno?</p><p>Quando voc&#234; faz isso, o teste para de ser um custo e vira um documento execut&#225;vel do que o sistema faz. E o agente da pr&#243;xima feature l&#234; esses testes e respeita as decis&#245;es j&#225; tomadas. &#201; assim que o projeto para de virar uma colcha de retalhos.</p><h2>Quando o crit&#233;rio n&#227;o foi aplicado, algu&#233;m paga</h2><p>Recentemente peguei um projeto pra retomar. C&#243;digo entregue por uma consultoria s&#233;ria, rodando em produ&#231;&#227;o, com usu&#225;rios ativos.</p><p>A primeira semana de leitura revelou um problema que n&#227;o era um bug, era estrutural. Uma das entidades centrais do neg&#243;cio tinha sido modelada no n&#237;vel errado. Estava presa ao usu&#225;rio, quando na verdade pertencia &#224; organiza&#231;&#227;o. Funcionava, porque na opera&#231;&#227;o inicial era um usu&#225;rio por organiza&#231;&#227;o e ningu&#233;m tinha encarado o caso de mais de um.</p><p>Acontece que o roadmap do produto pedia evolu&#231;&#227;o pra um modelo onde cada organiza&#231;&#227;o teria v&#225;rios usu&#225;rios, pap&#233;is diferentes, permiss&#245;es por papel. E essa evolu&#231;&#227;o, com a modelagem do jeito que estava, era cirurgia de cora&#231;&#227;o aberto. N&#227;o &#233; uma migration de uma tarde. &#201; reescrever fluxo, reprocessar dado, mexer em integra&#231;&#245;es j&#225; contratadas, e fazer tudo isso sem derrubar quem j&#225; est&#225; usando.</p><p>A consultoria n&#227;o fez nada que um bom desenvolvedor n&#227;o faria. Entregou o que foi pedido, o c&#243;digo est&#225; organizado, os testes existem. O que faltou foi o passo anterior. Faltou algu&#233;m perguntar quem &#233; o ator central de cada fluxo, faltou diagrama de caso de uso que tornasse &#243;bvio onde aquela responsabilidade deveria viver, faltou ADR justificando a decis&#227;o. Faltou, basicamente, o trabalho que eu venho descrevendo o post inteiro.</p><p>E aqui mora a parte que poucos founders querem ouvir. Quem contrata desenvolvimento de software, seja consultoria, seja time interno, seja freelancer, tem que ter vis&#227;o de processo. Tem que exigir os artefatos como parte do entreg&#225;vel, no mesmo n&#237;vel do c&#243;digo. Persona documentada, casos de uso desenhados, diagrama de banco atualizado, ADR das decis&#245;es que afetam o produto a longo prazo. Sem isso, o que voc&#234; compra &#233; um reposit&#243;rio que roda hoje. N&#227;o &#233; um produto que dura cinco anos.</p><p>Essa documenta&#231;&#227;o n&#227;o &#233; zelo de arquiteto, &#233; seguro contra d&#237;vida cara. A diferen&#231;a entre pagar pra fazer certo no in&#237;cio e pagar pra desfazer depois costuma ser de uma ordem de magnitude. &#192;s vezes mais.</p><p>Vamos pagar essa d&#237;vida no projeto que recebemos. N&#227;o tem jeito. Mas estamos pagando documentando primeiro, mapeando atores, redesenhando o modelo, registrando o porqu&#234; das mudan&#231;as. Pra que da pr&#243;xima vez, quando o produto for evoluir de novo, ningu&#233;m precise descobrir do zero o que cada coisa significa.</p><h2>Onde a responsabilidade foi parar</h2><p>Tem uma percep&#231;&#227;o comum de que usar IA pra codar &#233; &#8220;ficar parado vendo o modelo trabalhar&#8221;. N&#227;o &#233; a minha experi&#234;ncia.</p><p>O que aconteceu foi um deslocamento. O tempo que eu gastava digitando c&#243;digo agora eu gasto preparando contexto, revisando teste, refinando diagrama, decidindo arquitetura, recusando sugest&#227;o. O volume de digita&#231;&#227;o caiu, o volume de decis&#227;o subiu.</p><p>E com a decis&#227;o vem a responsabilidade. Documenta&#231;&#227;o, persona, caso de uso, ADR. Antes eram coisas que o gestor cobrava do desenvolvedor, e o desenvolvedor entregava se sobrasse tempo. Agora s&#227;o coisas que o desenvolvedor precisa fazer pra si mesmo, porque sem elas o agente entrega o caminho mais gen&#233;rico poss&#237;vel.</p><p>Quem espera o gestor pedir j&#225; perdeu. Quando o gestor pede, o c&#243;digo ruim j&#225; foi pra produ&#231;&#227;o, a entidade j&#225; foi modelada no n&#237;vel errado, a decis&#227;o j&#225; foi tomada sem registro. A janela onde esse trabalho importa &#233; antes do prompt, e quem est&#225; no teclado &#233; o desenvolvedor.</p><p>Isso muda o que significa ser desenvolvedor s&#234;nior. N&#227;o &#233; mais o cara que escreve c&#243;digo dif&#237;cil mais r&#225;pido. &#201; o cara que sabe parar de codar pra desenhar, mapear, documentar, registrar. Que entende que esses artefatos n&#227;o s&#227;o burocracia imposta de cima, s&#227;o o material que separa um produto que dura de um produto descart&#225;vel.</p><p>A IA n&#227;o gera c&#243;digo legado. Ela acelera a velocidade com que voc&#234; acumula c&#243;digo legado se voc&#234; n&#227;o tem nada al&#233;m do prompt. O rem&#233;dio n&#227;o &#233; parar de usar IA. &#201; reconhecer que as coisas chatas que a gente terceirizava pro gestor exigir agora s&#227;o parte do que significa ser desenvolvedor.</p><p>&#201; menos sexy do que a promessa de &#8220;deixa o agente codar pra voc&#234;&#8221;. Mas &#233; o que separa um projeto que ainda vai estar de p&#233; em dois anos de um projeto que vai ser jogado fora junto com a pr&#243;xima virada de stack.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.pauloteixeira.dev/subscribe?&quot;,&quot;text&quot;:&quot;Inscreva-se&quot;,&quot;language&quot;:&quot;pt-br&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Inscreva-se para receber os pr&#243;ximos artigos diretamente no seu e-mail.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Digite seu e-mail&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Inscreva-se"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[O desenvolvedor como a gente conhece está acabando]]></title><description><![CDATA[Escrever c&#243;digo virou commodity. O que sobra pra quem construiu carreira fazendo isso?]]></description><link>https://blog.pauloteixeira.dev/p/o-desenvolvedor-como-a-gente-conhece</link><guid isPermaLink="false">https://blog.pauloteixeira.dev/p/o-desenvolvedor-como-a-gente-conhece</guid><dc:creator><![CDATA[Paulo Teixeira]]></dc:creator><pubDate>Thu, 30 Apr 2026 01:59:56 GMT</pubDate><enclosure url="https://images.unsplash.com/photo-1774901128215-3549cc686921?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMXx8Y2xhdWRlfGVufDB8fHx8MTc3NzQ3NjI3NXww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://images.unsplash.com/photo-1774901128215-3549cc686921?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMXx8Y2xhdWRlfGVufDB8fHx8MTc3NzQ3NjI3NXww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://images.unsplash.com/photo-1774901128215-3549cc686921?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMXx8Y2xhdWRlfGVufDB8fHx8MTc3NzQ3NjI3NXww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1774901128215-3549cc686921?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMXx8Y2xhdWRlfGVufDB8fHx8MTc3NzQ3NjI3NXww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1774901128215-3549cc686921?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMXx8Y2xhdWRlfGVufDB8fHx8MTc3NzQ3NjI3NXww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1774901128215-3549cc686921?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMXx8Y2xhdWRlfGVufDB8fHx8MTc3NzQ3NjI3NXww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1456w" sizes="100vw"><img src="https://images.unsplash.com/photo-1774901128215-3549cc686921?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMXx8Y2xhdWRlfGVufDB8fHx8MTc3NzQ3NjI3NXww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" width="724.84375" height="483.18745144164365" data-attrs="{&quot;src&quot;:&quot;https://images.unsplash.com/photo-1774901128215-3549cc686921?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMXx8Y2xhdWRlfGVufDB8fHx8MTc3NzQ3NjI3NXww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:3861,&quot;width&quot;:5792,&quot;resizeWidth&quot;:724.84375,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Coding on a dark theme computer screen&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-normal" alt="Coding on a dark theme computer screen" title="Coding on a dark theme computer screen" srcset="https://images.unsplash.com/photo-1774901128215-3549cc686921?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMXx8Y2xhdWRlfGVufDB8fHx8MTc3NzQ3NjI3NXww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1774901128215-3549cc686921?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMXx8Y2xhdWRlfGVufDB8fHx8MTc3NzQ3NjI3NXww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1774901128215-3549cc686921?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMXx8Y2xhdWRlfGVufDB8fHx8MTc3NzQ3NjI3NXww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1774901128215-3549cc686921?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMXx8Y2xhdWRlfGVufDB8fHx8MTc3NzQ3NjI3NXww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Photo by <a href="https://unsplash.com/@hdbernd">Bernd &#128247; Dittrich</a> on <a href="https://unsplash.com">Unsplash</a></figcaption></figure></div><p></p><p>Eu vi o jQuery virar React. Vi deploy manual virar CI/CD. Vi servidor f&#237;sico virar cloud virar serverless virar &#8220;n&#227;o se preocupa com infra&#8221;. Vi ORM, vi container, vi micro servi&#231;o, vi gente voltando pra monolito. Quinze anos nessa &#225;rea e eu j&#225; perdi a conta de quantas vezes algu&#233;m disse que uma nova abstra&#231;&#227;o ia &#8220;mudar tudo.&#8221;</p><p>Na maioria das vezes, n&#227;o mudava. Mudava o como, mas n&#227;o mudava o qu&#234;. Voc&#234; continuava pegando uma demanda, entendendo o problema, escrevendo c&#243;digo, entregando, e voltando pro come&#231;o. O ciclo era o mesmo. As ferramentas novas, algumas boas e outras francamente in&#250;teis, eram camadas novas em cima do mesmo trabalho.</p><p>Dessa vez &#233; diferente. E eu n&#227;o digo isso com entusiasmo. Digo com aquele desconforto de quem entende o que t&#225; vendo.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://blog.pauloteixeira.dev/subscribe?&quot;,&quot;text&quot;:&quot;Assine agora&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://blog.pauloteixeira.dev/subscribe?"><span>Assine agora</span></a></p><h2>O loop quebrou</h2><p>Com a IA, n&#227;o &#233; mais uma abstra&#231;&#227;o nova em cima do mesmo trabalho. &#201; o trabalho em si que t&#225; mudando. O ciclo cl&#225;ssico de pegar demanda, entender, desenvolver, entregar e repetir t&#225; sendo comprimido de uma forma que n&#227;o tem volta.</p><p>Eu olho pra tr&#225;s e vejo quinze anos construindo uma expertise que era, no fundo, sobre traduzir problemas humanos em c&#243;digo. Essa tradu&#231;&#227;o t&#225; ficando cada vez mais barata. Cada vez mais r&#225;pida. Cada vez mais acess&#237;vel pra quem nunca escreveu uma linha de c&#243;digo na vida.</p><p>Escrever c&#243;digo virou commodity. E quando uma coisa vira commodity, o valor migra pra outro lugar.</p><h2>O que sobra quando c&#243;digo vira commodity</h2><p>Sobra crit&#233;rio.</p><p>Sobra a decis&#227;o de o que construir, e n&#227;o s&#243; de como construir. Sobra a habilidade de olhar pra um briefing vago e enxergar o problema real escondido l&#225; dentro. Sobra saber quando uma entrega que &#8220;funciona&#8221; ainda est&#225; longe de estar boa. Sobra ter gosto pra reconhecer arquitetura ruim antes que ela cobre juros. Sobra saber onde a pressa pode rolar e onde ela vai destruir o produto em seis meses.</p><p>Nada disso &#233; novo. Sempre foi o que separava o desenvolvedor s&#234;nior do j&#250;nior. A diferen&#231;a &#233; que, antes, dava pra ter uma carreira inteira sendo excelente tecnicamente sem precisar mostrar muito desse crit&#233;rio, porque o crit&#233;rio estava embutido no c&#243;digo entregue, e o c&#243;digo entregue era o ativo. Hoje o c&#243;digo entregue &#233; barato. Quem n&#227;o consegue tornar o crit&#233;rio vis&#237;vel vira invis&#237;vel.</p><h2>Por que comecei a escrever</h2><p>A pergunta que ficou na minha cabe&#231;a durante meses foi essa: como &#233; que eu mostro crit&#233;rio?</p><p>Curr&#237;culo n&#227;o mostra. Tempo de carreira n&#227;o mostra. Lista de tecnologias n&#227;o mostra. Reposit&#243;rio no GitHub mostra um pouco, mas s&#243; pra quem entende e tem paci&#234;ncia de ler. Crit&#233;rio aparece nas escolhas, nos trade-offs, no jeito de falar sobre os problemas. Aparece quando algu&#233;m te ouve por dez minutos e pensa &#8220;esse cara j&#225; passou por isso umas mil vezes&#8221;. E pra algu&#233;m pensar isso, voc&#234; precisa estar falando.</p><p>Esse blog &#233; onde eu vou falar.</p><p>N&#227;o vai ser tutorial. Tutorial todo mundo j&#225; tem em excesso, e a IA escreve melhor do que eu. Vai ser sobre como eu penso quando preciso decidir alguma coisa dif&#237;cil. Sobre os crit&#233;rios que eu uso pra separar entrega boa de entrega med&#237;ocre. Sobre as decis&#245;es que eu tomo antes de uma linha de c&#243;digo ser escrita. Sobre o que eu desligo o agente pra fazer e por qu&#234;. Sobre o que eu acho que &#233; trabalho de gente e o que eu acho que virou trabalho de m&#225;quina.</p><p>Vai ter convic&#231;&#227;o. Vai ter coisa que eu vou escrever hoje e olhar daqui a um ano com vergonha. Tudo bem. Pensar em p&#250;blico &#233; assim mesmo.</p><h2>O contexto pessoal</h2><p>Vou ser direto sobre o pano de fundo. Eu sou co-fundador da <a href="https://germina.tech">Germina, um startup studio</a>. A decis&#227;o de empreender pra mim n&#227;o foi por ambi&#231;&#227;o cl&#225;ssica de carreira. Foi mais um instinto: se o valor est&#225; migrando de quem executa pra quem define, faz sentido estar do lado de quem define. Ter algo seu. Ser dono do problema, n&#227;o s&#243; do c&#243;digo que resolve ele.</p><p>Esse blog n&#227;o &#233; a Germina, n&#227;o &#233; pitch, n&#227;o &#233; funil. Mas tamb&#233;m n&#227;o &#233; descolado dela. As ideias que aparecem aqui s&#227;o as mesmas ideias que guiam como eu construo l&#225;. Faz sentido isso ficar claro desde o come&#231;o.</p><h2>O que esperar</h2><p>Texto sobre como pensar em decis&#245;es dif&#237;ceis na constru&#231;&#227;o de software. Sobre o que mudou no meu jeito de trabalhar com agentes de IA. Sobre os crit&#233;rios que eu uso pra separar entrega boa de entrega med&#237;ocre. Pouco sobre tend&#234;ncias de mercado, porque o que me interessa mostrar aqui &#233; o of&#237;cio, n&#227;o o setor.</p><p>N&#227;o tenho a pretens&#227;o de fazer engenharia reversa do futuro do desenvolvedor de software. Tenho a pretens&#227;o de fazer um trabalho honesto, mostrar o crit&#233;rio por tr&#225;s dele, e deixar registro. Se daqui a tr&#234;s anos eu olhar pra tr&#225;s e os posts envelhecerem mal, &#243;timo: significa que a ind&#250;stria mudou de novo, e eu mudei com ela.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.pauloteixeira.dev/subscribe?&quot;,&quot;text&quot;:&quot;Inscreva-se&quot;,&quot;language&quot;:&quot;pt-br&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Inscreva-se para receber os pr&#243;ximos artigos direto no seu e-mail</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Digite seu e-mail&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Inscreva-se"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item></channel></rss>