<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Taina Costa</title>
    <description>The latest articles on DEV Community by Taina Costa (@taina_costa_f).</description>
    <link>https://dev.to/taina_costa_f</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3943996%2Fbdbec28d-a623-4e05-90a1-066211db8a41.jpeg</url>
      <title>DEV Community: Taina Costa</title>
      <link>https://dev.to/taina_costa_f</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/taina_costa_f"/>
    <language>en</language>
    <item>
      <title>Estamos treinando nossa própria substituição (e ninguém tem um plano B)</title>
      <dc:creator>Taina Costa</dc:creator>
      <pubDate>Tue, 10 Nov 2026 20:44:26 +0000</pubDate>
      <link>https://dev.to/taina_costa_f/estamos-treinando-nossa-propria-substituicao-e-ninguem-tem-um-plano-b-1nbj</link>
      <guid>https://dev.to/taina_costa_f/estamos-treinando-nossa-propria-substituicao-e-ninguem-tem-um-plano-b-1nbj</guid>
      <description>&lt;p&gt;Semana passada passei três horas debugando um bug que o Copilot gerou. Não foi a primeira vez. E provavelmente não será a última. O que me fez pensar: estamos mesmo construindo ferramentas para nos substituir, ou apenas mudando o tipo de problema que resolvemos?&lt;/p&gt;

&lt;h2&gt;
  
  
  A promessa que não chegou
&lt;/h2&gt;

&lt;p&gt;Lembra de 2022? GPT-3 saindo, todo mundo dizendo que programadores iam virar "prompt engineers" e que código ia sumir. Três anos depois, continuo escrevendo código. Muito código. Só que agora também corrijo o que a IA gera.&lt;/p&gt;

&lt;p&gt;A verdade é que IA não está nos substituindo — está redistribuindo nosso tempo. Menos tempo escrevendo boilerplate, mais tempo fazendo code review de máquina. Menos tempo no Stack Overflow, mais tempo refinando prompts. O trabalho mudou, não sumiu.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que realmente acontece no código
&lt;/h2&gt;

&lt;p&gt;Vou te mostrar um exemplo real. Pedi para o GPT-4 gerar um hook React para debounce de busca:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// O que o GPT-4 gerou&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;useDebounce&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;debouncedValue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;setDebouncedValue&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;handler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nf"&gt;setDebouncedValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nf"&gt;clearTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;debouncedValue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Funciona. Até funciona bem para 80% dos casos. O problema está nos 20% que a IA não vê:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// O que você realmente precisa em produção&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;useDebounce&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;debouncedValue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;setDebouncedValue&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;leading&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;maxWait&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;leading&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;maxWait&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nf"&gt;setDebouncedValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;handler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nf"&gt;setDebouncedValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;maxHandler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;maxWait&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="nb"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nf"&gt;setDebouncedValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;maxWait&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nf"&gt;clearTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;maxHandler&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nf"&gt;clearTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;maxHandler&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;leading&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;maxWait&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;debouncedValue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso você não consegue com um prompt simples. Você precisa saber que existe &lt;code&gt;leading&lt;/code&gt;, que pode precisar de &lt;code&gt;maxWait&lt;/code&gt;, que há edge cases em formulários complexos. A IA gera código que compila — você adiciona código que sobrevive em produção.&lt;/p&gt;

&lt;h2&gt;
  
  
  O jogo mudou, não acabou
&lt;/h2&gt;

&lt;p&gt;Converso com desenvolvedores sênior e a história se repete: ninguém foi substituído, mas todo mundo mudou de função. O junior que antes copiava do Stack Overflow agora copia do ChatGPT (e continua não entendendo closure). O pleno que antes escrevia CRUD manualmente agora revisa CRUD gerado. O sênior que antes arquitetava sistemas agora também valida se a arquitetura sugerida pela IA faz sentido no contexto real.&lt;/p&gt;

&lt;p&gt;Três habilidades que cresceram em importância:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Code review virou skill primária&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Antes você revisava código de humanos duas vezes por semana. Agora revisa código de IA vinte vezes por dia. E código de IA é traiçoeiro — parece certo, tem a estrutura certa, usa os padrões certos, mas tem sutilezas erradas.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// IA adora gerar isso&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nb"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/api/users'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Mas você precisa disso&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nb"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/api/users'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sb"&gt;`HTTP ${res.status}`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Failed to fetch users'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// re-throw ou trate, não engula&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A IA não sabe que seu logger customizado existe. Não sabe que você trata 4xx diferente de 5xx. Não sabe que &lt;code&gt;console.error&lt;/code&gt; não chega no seu monitoring. Você sabe.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Context é o novo código&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Quanto melhor você documenta intenção, requisitos, constraints, melhor a IA performa. Aprendi a escrever comentários melhores não para humanos, mas para aumentar a chance da IA gerar algo útil:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/**
 * Busca usuários com debounce de 300ms.
 * 
 * CONSTRAINTS:
 * - Não fazer request se query &amp;lt; 3 chars
 * - Cancelar requests pendentes (AbortController)
 * - Logar falhas no Sentry, não no console
 * - Retornar [] em caso de erro, nunca null
 * 
 * CONTEXT: usado em autocomplete, usuário pode digitar rápido,
 * API tem rate limit de 10 req/s por IP.
 */&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso não é documentação — é prompt engineering disfarçado de comentário.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Conhecer limites da ferramenta&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;IA é ótima para: boilerplate, conversão de formato, testes unitários simples, refatoração mecânica.&lt;/p&gt;

&lt;p&gt;IA é péssima para: decisões de arquitetura, trade-offs de performance, integrações complexas, qualquer coisa que dependa de context não-escrito.&lt;/p&gt;

&lt;p&gt;Saber quando usar é mais importante que saber usar.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que não te contam
&lt;/h2&gt;

&lt;p&gt;Três verdades inconvenientes que descobri trabalhando com IA no dia a dia:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Débito técnico gerado por IA é mais difícil de pagar.&lt;/strong&gt; Quando você escreve código ruim, você sabe onde está ruim. Quando a IA gera código "quase certo", você demora mais para achar o problema porque parece profissional.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;IA padroniza para a mediana.&lt;/strong&gt; Todo código gerado parece código de tutorial. Isso é ótimo para começar, terrível para escalar. Você acaba com 50 arquivos que seguem o mesmo padrão genérico, quando seu caso de uso pedia algo específico.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O custo cognitivo não sumiu, mudou de lugar.&lt;/strong&gt; Antes: pensar em como escrever o código. Agora: pensar em como descrever o que você quer, validar se o que veio é o que você pediu, debugar quando não é. Diferente, não mais fácil.&lt;/p&gt;

&lt;h2&gt;
  
  
  Então qual é o plano?
&lt;/h2&gt;

&lt;p&gt;Se você está começando agora: aprenda a programar de verdade antes de usar IA como muleta. Você precisa ser capaz de ler o código que a máquina gera e saber se está certo. Isso exige base.&lt;/p&gt;

&lt;p&gt;Se você já programa: invista em habilidades que IA não replica fácil. Entender o domínio do negócio. Comunicação com stakeholders. Debugging de sistemas distribuídos. Arquitetura de longo prazo. Code review criterioso.&lt;/p&gt;

&lt;p&gt;Se você lidera: repense suas contratações. Junior que só sabe usar Copilot não é junior, é risco. Sênior que ignora IA também é risco. Procure quem entende código E sabe usar ferramentas.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;IA não está substituindo desenvolvedores, está mudando o tipo de trabalho que fazemos&lt;/li&gt;
&lt;li&gt;Código gerado por IA funciona, mas raramente está pronto para produção sem ajustes&lt;/li&gt;
&lt;li&gt;Code review virou habilidade primária — você revisa máquina mais que humano&lt;/li&gt;
&lt;li&gt;Contexto e documentação viraram ferramentas de produtividade (são prompts disfarçados)&lt;/li&gt;
&lt;li&gt;Débito técnico de IA é mais traiçoeiro que débito humano&lt;/li&gt;
&lt;li&gt;O plano: aprender fundamentos, dominar code review, focar em skills que IA não replica&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>tutorial</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Palestrar em conferências: o que ninguém te conta antes de você subir no palco</title>
      <dc:creator>Taina Costa</dc:creator>
      <pubDate>Tue, 27 Oct 2026 19:15:27 +0000</pubDate>
      <link>https://dev.to/taina_costa_f/palestrar-em-conferencias-o-que-ninguem-te-conta-antes-de-voce-subir-no-palco-4cmc</link>
      <guid>https://dev.to/taina_costa_f/palestrar-em-conferencias-o-que-ninguem-te-conta-antes-de-voce-subir-no-palco-4cmc</guid>
      <description>&lt;p&gt;Você já assistiu uma talk incrível e pensou "eu também quero fazer isso"? Eu pensei. Mandei minha primeira proposta, foi aceita, e descobri que palestrar é 20% glamour e 80% trabalho invisível que ninguém menciona.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por que todo mundo fala disso agora
&lt;/h2&gt;

&lt;p&gt;O mercado tech brasileiro cresceu, eventos voltaram presencial, e comunidades estão desesperadas por conteúdo local. CFPs (Call for Papers) pipocam todo mês no LinkedIn. Parece o momento perfeito pra estrear como speaker. E é — se você souber no que está se metendo.&lt;/p&gt;

&lt;p&gt;A promessa é tentadora: networking, autoridade técnica, talvez uma viagem paga. A realidade inclui reescrever slides às 2h da manhã, lidar com perguntas que você não sabe responder, e descobrir que o projetor não lê seu formato de arquivo.&lt;/p&gt;

&lt;h2&gt;
  
  
  A parte que você não vê
&lt;/h2&gt;

&lt;p&gt;Palestrar não é "pegar um assunto que você domina e falar por 40 minutos". É mais como: escolher um ângulo que caiba no tempo, validar que ainda é relevante quando o evento rolar (3 meses depois), montar uma narrativa que funcione pra quem nunca viu o assunto e pra quem já usa em produção, ensaiar até decorar as transições, e torcer pra tech não falhar.&lt;/p&gt;

&lt;p&gt;Aqui está o fluxo real, do jeito que ninguém documenta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;speakerJourney&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;week_minus_12&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;escrever abstract de 300 caracteres&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;realidade&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;reescrever 47 vezes porque não cabe&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;week_minus_10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;proposta aceita 🎉&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;realidade&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;pânico porque agora tem que fazer&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;week_minus_6&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;montar outline dos slides&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;realidade&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;mudar de ideia 3 vezes sobre a abordagem&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;week_minus_2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;finalizar apresentação&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;realidade&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;refazer metade porque saiu uma breaking change&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;day_zero&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;subir no palco&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;realidade&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;microfone com feedback + esqueceu a segunda demo&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Como estruturar sua proposta (pra ser aceita)
&lt;/h2&gt;

&lt;p&gt;Organizadores de evento recebem 200+ propostas e aprovam 20. O que passa:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Título que entrega valor, não buzzword:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;❌ "O Futuro da Web: Uma Jornada Transformadora"&lt;/li&gt;
&lt;li&gt;✅ "Como migramos 80 rotas de REST pra tRPC sem derrubar produção"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Abstract com problema + solução + resultado:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Estrutura que funciona (120-250 palavras)&lt;/span&gt;
&lt;span class="p"&gt;
1.&lt;/span&gt; Contexto (1 frase)
   "Nossa API REST tinha 80 endpoints, tipos duplicados e zero type-safety."
&lt;span class="p"&gt;
2.&lt;/span&gt; O que você tentou (2-3 frases)
   "Avaliamos GraphQL, jsonapi, e tRPC. Precisávamos de migração incremental
   e DX que não exigisse reescrever clients."
&lt;span class="p"&gt;
3.&lt;/span&gt; O que você escolheu e por quê (2 frases)
   "tRPC permitiu coexistência com REST via adapter e inferência automática
   de tipos no frontend."
&lt;span class="p"&gt;
4.&lt;/span&gt; Como foi (3-4 frases, aqui mora o valor)
   "Migramos endpoint por endpoint em 6 sprints. Bugs de tipo caíram 90%.
   Developer experience melhorou: autocomplete em query e mutation, sem
   codegen. Vou mostrar a estratégia de migração, armadilhas de cache, e
   como convencer o time a adotar."
&lt;span class="p"&gt;
5.&lt;/span&gt; Pra quem é (1 frase)
   "Útil pra quem mantém APIs REST grandes e quer type-safety sem big bang."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;O que você NÃO precisa:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bio estendida (organizador lê depois)&lt;/li&gt;
&lt;li&gt;Todos os slides prontos (outline basta)&lt;/li&gt;
&lt;li&gt;Ser referência mundial no assunto (experiência real &amp;gt; autoridade)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Preparação: quanto tempo você vai gastar de verdade
&lt;/h2&gt;

&lt;p&gt;Primeira talk: 40-60 horas. Não, eu não estou exagerando.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Research + validação:&lt;/strong&gt; 8h (ler docs, confirmar que o approach ainda é atual)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Outline + narrativa:&lt;/strong&gt; 6h (estruturar história, decidir o que cortar)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Slides:&lt;/strong&gt; 12-20h (fazer, refazer, simplificar, refazer de novo)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Demos:&lt;/strong&gt; 10-15h (montar, testar, ter plano B pra quando falhar)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ensaio:&lt;/strong&gt; 8-12h (sozinho, pra alguém, cronometrado, ajustar ritmo)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;E isso assumindo que você já domina o assunto. Se for algo que você aprendeu recentemente "pra poder palestrar sobre", adicione mais 20h de estudo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Calculadora honesta de horas&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;horasReaisPraPalestrar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;experiencia&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;complexidade&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;base&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;experiencia&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;primeira&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;demoCost&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;complexidade&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;live-coding&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ansiolitico&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// horas perdidas reescrevendo por insegurança&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;base&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;demoCost&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;ansiolitico&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;horasReaisPraPalestrar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;primeira&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;live-coding&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 75h&lt;/span&gt;
&lt;span class="c1"&gt;// É um projeto paralelo de médio porte. Planeje.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  O que pode dar errado (e vai)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Tech vai falhar.&lt;/strong&gt; Sempre. Projetor não aceita seu USB-C, Wi-Fi cai no meio da demo, microfone apita. Solução: slides exportados em PDF, demos gravadas como fallback, hotspot no celular.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Você vai esquecer uma parte.&lt;/strong&gt; Ensaiei 8 vezes, esqueci a transição do slide 12 pro 13 toda vez. No dia, pulei sem perceber. Ninguém notou (exceto eu). Audiência não tem o roteiro na cabeça.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Perguntas que você não sabe responder.&lt;/strong&gt; Acontece. "Ótima pergunta, não testamos esse cenário. Me passa teu contato que eu valido e te retorno" é resposta válida. Inventar na hora é pior.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tempo.&lt;/strong&gt; Você ensaiou em 35 minutos, no palco levou 28 (nervosismo acelera) ou 48 (alguém perguntou no meio). Marque os slides de "corte opcional" antes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por que fazer mesmo assim
&lt;/h2&gt;

&lt;p&gt;Porque quando funciona, funciona muito. Você força a si mesmo a organizar conhecimento que tava disperso. Conhece gente que resolve problemas parecidos. E sim, tem empresa que contrata porque viu sua talk.&lt;/p&gt;

&lt;p&gt;Mas principalmente: você contribui pra comunidade de um jeito que post no blog não consegue. Tem algo em assistir alguém vivo, errando, se corrigindo, respondendo perguntas, que cria conexão.&lt;/p&gt;

&lt;p&gt;Só não espere que seja fácil.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Proposta boa tem problema concreto + solução validada + resultado mensurável&lt;/li&gt;
&lt;li&gt;Prepare 50-75h pra primeira talk, 25-40h pras seguintes&lt;/li&gt;
&lt;li&gt;Tech vai falhar: PDF, demo gravada, hotspot são obrigatórios&lt;/li&gt;
&lt;li&gt;Esqueceu algo no palco? Audiência não percebe se você não fizer cara de pânico&lt;/li&gt;
&lt;li&gt;"Não sei, me passa teu contato" é resposta aceitável&lt;/li&gt;
&lt;li&gt;Vale a pena, mas não é glamour — é trabalho&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>tutorial</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Por que seu portfólio web ainda importa (mesmo que a IA escreva o código por você)</title>
      <dc:creator>Taina Costa</dc:creator>
      <pubDate>Tue, 13 Oct 2026 20:06:49 +0000</pubDate>
      <link>https://dev.to/taina_costa_f/por-que-seu-portfolio-web-ainda-importa-mesmo-que-a-ia-escreva-o-codigo-por-voce-d0d</link>
      <guid>https://dev.to/taina_costa_f/por-que-seu-portfolio-web-ainda-importa-mesmo-que-a-ia-escreva-o-codigo-por-voce-d0d</guid>
      <description>&lt;p&gt;Você já viu aqueles vídeos onde alguém pede para o ChatGPT ou Cursor construir um site inteiro e em 5 minutos está no ar? Eu vi. E não é impressionante pela técnica — é impressionante porque expõe uma verdade desconfortável: a parte difícil de ter um portfólio nunca foi escrever o HTML.&lt;/p&gt;

&lt;p&gt;O hard skill de montar um site virou commodity. Mas o que você coloca nele? Como você conta sua história sem parecer mais um template genérico? Isso nenhuma IA resolve por você.&lt;/p&gt;

&lt;h2&gt;
  
  
  O problema não é fazer, é decidir o que mostrar
&lt;/h2&gt;

&lt;p&gt;Em 2026, qualquer pessoa pode gerar um portfólio responsivo, acessível e otimizado em minutos. O Cursor autocompleta seus componentes React. O v0 da Vercel monta layouts a partir de prompts. O GitHub Copilot praticamente escreve o CSS por você.&lt;/p&gt;

&lt;p&gt;Mas aqui está o ponto: &lt;strong&gt;100 desenvolvedores usando as mesmas ferramentas vão produzir 100 sites parecidos — a menos que tenham algo único para dizer.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O portfólio não é uma prova de que você sabe fazer um site. É a prova de que você sabe o que vale a pena mostrar.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que mudou (e o que não mudou)
&lt;/h2&gt;

&lt;p&gt;Antes, o portfólio era um sinal técnico: "Veja, eu sei CSS Grid. Veja, eu sei fazer um fade suave." Hoje, todo mundo sabe — ou pelo menos tem acesso a quem sabe (a IA).&lt;/p&gt;

&lt;p&gt;O que não mudou:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Curadoria.&lt;/strong&gt; Você tem 8 projetos no GitHub. Qual deles conta a melhor história? Qual mostra que você entende o problema do usuário, não só a solução técnica?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contexto.&lt;/strong&gt; Um link para o repo não explica por que você tomou aquela decisão de arquitetura, ou como você lidou com aquela limitação do cliente.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Priorização.&lt;/strong&gt; O recrutador vai gastar 30 segundos no seu site. O que você quer que ele veja primeiro?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A IA pode montar a estrutura, mas essas decisões são suas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Um portfólio que funciona em 2026
&lt;/h2&gt;

&lt;p&gt;Aqui está o que eu coloco no meu (e o que eu procuro quando estou contratando):&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Casos, não catálogo
&lt;/h3&gt;

&lt;p&gt;Não liste todos os seus projetos. Escolha 3-4 e explique &lt;strong&gt;o problema que você resolveu&lt;/strong&gt;, não a stack que você usou.&lt;/p&gt;

&lt;p&gt;Exemplo ruim:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;E-commerce em React&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Frontend em React, backend em Node, deploy na Vercel.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Exemplo bom:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Checkout em 2 cliques para loja de nicho&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Reduzi o abandono de carrinho de 68% para 34% removendo campos desnecessários e implementando autofill inteligente. React + Stripe. Ver case&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A diferença é que o segundo mostra impacto. Stack é footnote.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Code samples que você comentaria em code review
&lt;/h3&gt;

&lt;p&gt;Se você vai mostrar código, mostre o tipo de código que você escreveria em produção, não um exercício de algoritmo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ❌ Não mostre isso&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;reverseString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;str&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;reverse&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// ✅ Mostre isso&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;validateCPF&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cpf&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Remove não-dígitos&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cleaned&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;cpf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\D&lt;/span&gt;&lt;span class="sr"&gt;/g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// CPF deve ter 11 dígitos&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cleaned&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// Rejeita sequências conhecidas (111.111.111-11, etc)&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/^&lt;/span&gt;&lt;span class="se"&gt;(\d)\1{10}&lt;/span&gt;&lt;span class="sr"&gt;$/&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cleaned&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// Valida dígitos verificadores&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;digits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;cleaned&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;validators&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="nf"&gt;calcValidator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;digits&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nf"&gt;calcValidator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;digits&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;];&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;validators&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;digits&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;validators&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;digits&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;calcValidator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;weight&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;acc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;acc&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;d&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;weight&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;remainder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;remainder&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;remainder&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse segundo exemplo mostra que você pensa em edge cases, documenta com comentários úteis (não redundantes), e escreve código que outro dev consegue ler. Isso vale mais do que saber inverter uma string.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Um link que funciona
&lt;/h3&gt;

&lt;p&gt;Parece óbvio, mas metade dos portfólios que eu vejo tem projetos com links quebrados, repos privados ou deploys que expiraram.&lt;/p&gt;

&lt;p&gt;Se o projeto não está mais no ar, coloque um screenshot ou um vídeo. Se o repo é privado, escreva um README público explicando o contexto. Não force o recrutador a adivinhar.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que a IA não faz (e você precisa fazer)
&lt;/h2&gt;

&lt;p&gt;A IA pode gerar o código, mas ela não vai:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Decidir que aquele projeto freelance de 2023 é mais relevante que o bootcamp de 2021&lt;/li&gt;
&lt;li&gt;Escrever o parágrafo explicando por que você escolheu SSR em vez de CSR naquele caso específico&lt;/li&gt;
&lt;li&gt;Remover aquele projeto "to-do list em Vue" que todo mundo tem e que não te diferencia de ninguém&lt;/li&gt;
&lt;li&gt;Atualizar o portfólio quando você aprender algo novo ou mudar de direção&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O portfólio é um documento vivo. A IA pode acelerar a parte braçal, mas a curadoria é humana.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quando você realmente não precisa de um
&lt;/h2&gt;

&lt;p&gt;Honestamente? Se você está aplicando para uma vaga júnior e tem um GitHub ativo com READMEs bem escritos, talvez você não precise. O GitHub &lt;strong&gt;é&lt;/strong&gt; o portfólio.&lt;/p&gt;

&lt;p&gt;Mas se você está:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Procurando vaga remota internacional (onde o recrutador não te conhece e precisa de contexto rápido)&lt;/li&gt;
&lt;li&gt;Transicionando de carreira (e precisa explicar o gap ou a mudança de área)&lt;/li&gt;
&lt;li&gt;Freelancer (e precisa mostrar que você entende o problema do cliente, não só código)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Então sim, você precisa de um lugar onde você controla a narrativa. E esse lugar é o seu site.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como eu fiz o meu (com ajuda da IA, claro)
&lt;/h2&gt;

&lt;p&gt;Usei o Astro para geração estática, Tailwind para estilo, e deploy na Cloudflare Pages. O Cursor escreveu ~70% do código. Eu escrevi 100% do conteúdo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// src/content/config.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;defineCollection&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;astro:content&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;projects&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;defineCollection&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;object&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="na"&gt;impact&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="c1"&gt;// &amp;lt;- isso a IA não preenche&lt;/span&gt;
    &lt;span class="na"&gt;stack&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt;
    &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;url&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;optional&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="na"&gt;featured&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;boolean&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;}),&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;collections&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;projects&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cada projeto é um markdown file em &lt;code&gt;src/content/projects/&lt;/code&gt;. O Astro gera as páginas. A IA escreveu o layout. Eu decidi o que colocar em &lt;code&gt;impact&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Caveats
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Não caia na armadilha do over-engineering.&lt;/strong&gt; Seu portfólio não precisa de animações em Three.js ou um sistema de design customizado. Precisa carregar rápido e contar sua história. Se você gastou mais tempo no site do que nos projetos dentro dele, repense.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Não minta.&lt;/strong&gt; A IA facilitou inflar o portfólio com projetos que você "supervisionou" (leia-se: pediu para o ChatGPT fazer). Qualquer tech lead com 2 anos de experiência identifica isso em 30 segundos de conversa técnica.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Não esqueça de atualizar.&lt;/strong&gt; Um portfólio de 2022 com skills de 2022 é pior do que não ter portfólio. Se você não vai manter, melhor só o LinkedIn + GitHub.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A IA democratizou a construção de sites, mas não a curadoria do que mostrar&lt;/li&gt;
&lt;li&gt;Portfólio em 2026 é sobre &lt;strong&gt;contexto e impacto&lt;/strong&gt;, não sobre provar que você sabe HTML&lt;/li&gt;
&lt;li&gt;Mostre 3-4 casos bem explicados, não 15 repos sem contexto&lt;/li&gt;
&lt;li&gt;Code samples devem parecer código de produção, não exercício de leetcode&lt;/li&gt;
&lt;li&gt;Se você não vai manter atualizado, só GitHub + LinkedIn já resolve&lt;/li&gt;
&lt;li&gt;Use IA para acelerar o código, mas escreva o conteúdo você mesmo&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>tutorial</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Como virei blogueira sem querer (e por que você deveria fazer o mesmo)</title>
      <dc:creator>Taina Costa</dc:creator>
      <pubDate>Tue, 06 Oct 2026 19:20:15 +0000</pubDate>
      <link>https://dev.to/taina_costa_f/como-virei-blogueira-sem-querer-e-por-que-voce-deveria-fazer-o-mesmo-3gko</link>
      <guid>https://dev.to/taina_costa_f/como-virei-blogueira-sem-querer-e-por-que-voce-deveria-fazer-o-mesmo-3gko</guid>
      <description>&lt;p&gt;Eu não acordei um dia pensando "vou virar tech writer". Na verdade, comecei escrevendo para mim mesma — anotações de bugs que resolvi, comandos que sempre esqueço, aquele padrão React que usei três vezes e na quarta vez já não lembrava mais.&lt;/p&gt;

&lt;p&gt;Três meses depois, essas anotações viraram artigos. Seis meses depois, recrutadores começaram a me achar pelo que eu escrevi, não pelo currículo. Um ano depois, eu tinha construído uma reputação que nenhum bootcamp ou certificado me daria.&lt;/p&gt;

&lt;p&gt;Se você programa, você já tem metade do trabalho pronto. Vou te mostrar como a outra metade acontece sozinha.&lt;/p&gt;

&lt;h2&gt;
  
  
  O truque está na ferramenta errada
&lt;/h2&gt;

&lt;p&gt;A maioria dos devs que tentam blogar começam abrindo o Medium ou o dev.to e encarando a página em branco. Erro. Você não começa a escrever &lt;em&gt;para&lt;/em&gt; internet — você começa escrevendo &lt;em&gt;enquanto&lt;/em&gt; trabalha.&lt;/p&gt;

&lt;p&gt;Eu uso um repo privado no GitLab chamado &lt;code&gt;dev-notes&lt;/code&gt;. Estrutura básica:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dev-notes/
├── bugs/
│   ├── 2026-09-react-effect-loop.md
│   └── 2026-10-postgres-deadlock.md
├── snippets/
│   ├── debounce-hook.js
│   └── redis-rate-limit.js
└── til/ &lt;span class="c"&gt;# Today I Learned&lt;/span&gt;
    ├── 2026-09-28-optional-chaining.md
    └── 2026-10-02-css-has-selector.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cada arquivo é markdown puro. Quando resolvo um bug irritante, abro &lt;code&gt;bugs/YYYY-MM-problema.md&lt;/code&gt; e escrevo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Problema&lt;/span&gt;
useEffect rodando em loop infinito mesmo com array de dependências

&lt;span class="gu"&gt;## Causa&lt;/span&gt;
O objeto &lt;span class="sb"&gt;`config`&lt;/span&gt; estava sendo recriado a cada render:
const config = { theme: userTheme } // novo objeto toda vez

&lt;span class="gu"&gt;## Solução&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
js&lt;br&gt;
const config = useMemo(&lt;br&gt;
  () =&amp;gt; ({ theme: userTheme }), &lt;br&gt;
  [userTheme]&lt;br&gt;
)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
## Por que funcionou
Identidade referencial. Arrays/objetos literais sempre falham `===`.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
markdown&lt;/p&gt;

&lt;p&gt;Pronto. Levou 2 minutos. Não é um artigo — é documentação funcional do meu dia.&lt;/p&gt;
&lt;h2&gt;
  
  
  De nota privada para post público
&lt;/h2&gt;

&lt;p&gt;Dois meses depois, topo com o mesmo loop em outro projeto. Abro minhas notas, acho a solução em 10 segundos. Economia de 40 minutos de debug.&lt;/p&gt;

&lt;p&gt;Aí vem o pulo: &lt;strong&gt;se salvou seu tempo duas vezes, vai salvar o tempo de outra pessoa&lt;/strong&gt;. Esse é o momento de publicar.&lt;/p&gt;

&lt;p&gt;Pego aquele markdown, adiciono contexto (por que alguém bateria nesse problema?) e exemplos (como reproduzir?). Vira isso:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# useEffect em loop: o problema da identidade de objetos&lt;/span&gt;

Você já viu seu componente React renderizar infinitamente mesmo
com &lt;span class="sb"&gt;`useEffect`&lt;/span&gt; tendo dependências declaradas? O culpado costuma
ser um objeto ou array recriado a cada render.

&lt;span class="gu"&gt;## Reproduzindo o bug&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
js&lt;br&gt;
function Dashboard() {&lt;br&gt;
  const [data, setData] = useState(null)&lt;/p&gt;

&lt;p&gt;const config = { theme: 'dark' } // ← problema aqui&lt;/p&gt;

&lt;p&gt;useEffect(() =&amp;gt; {&lt;br&gt;
    fetchData(config).then(setData)&lt;br&gt;
  }, [config]) // loop infinito&lt;/p&gt;

&lt;p&gt;return &lt;/p&gt;{data?.title}&lt;br&gt;
}&lt;br&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
A cada render, `config` é um objeto *novo* (referência diferente),
então `[config]` nunca é igual ao array anterior. React dispara
o effect de novo, que causa render, que recria `config`...

## A solução: useMemo para identidade estável

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;&lt;br&gt;
js&lt;br&gt;
const config = useMemo(&lt;br&gt;
  () =&amp;gt; ({ theme: 'dark' }), &lt;br&gt;
  [] // só cria uma vez&lt;br&gt;
)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
Agora `config` mantém a mesma referência entre renders, e o loop para.

## Quando NÃO usar

Se `theme` vem de props/state, declare como dependência:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
js&lt;br&gt;
const config = useMemo(&lt;br&gt;
  () =&amp;gt; ({ theme: userTheme }), &lt;br&gt;
  [userTheme] // recria só quando theme muda&lt;br&gt;
)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
## TL;DR
- Objetos literais em dependências do useEffect causam loops
- Use `useMemo` para manter identidade referencial
- Liste as dependências reais do objeto no array do `useMemo`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse artigo levou 15 minutos. Não porque escrevi rápido — porque a parte difícil (entender o problema e testar a solução) já estava feita quando eu resolvi o bug pela primeira vez.&lt;/p&gt;

&lt;h2&gt;
  
  
  O sistema que funciona sem esforço
&lt;/h2&gt;

&lt;p&gt;Meu fluxo hoje:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Trabalho normal&lt;/strong&gt;: resolvo bugs, implemento features, topo com comportamento inesperado&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anoto&lt;/strong&gt;: 2 minutos no &lt;code&gt;dev-notes&lt;/code&gt;, formato problema-causa-solução&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reviso semanal&lt;/strong&gt;: abro o repo, vejo o que anotei nos últimos 7 dias&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Publico o útil&lt;/strong&gt;: se usei a nota duas vezes, expando para artigo e posto no dev.to&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Zero planejamento de conteúdo. Zero bloqueio criativo. Escrevo sobre o que &lt;em&gt;já fiz&lt;/em&gt;, não sobre o que &lt;em&gt;vou fazer&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Os efeitos colaterais (bons)
&lt;/h2&gt;

&lt;p&gt;Três coisas que não esperava:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Entrevistas técnicas ficaram fáceis&lt;/strong&gt;. Quando você documenta problemas reais que resolveu, não precisa inventar resposta na hora. "Me fala de um bug difícil" → abro mental o índice de &lt;code&gt;bugs/&lt;/code&gt; e escolho um caso.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Recrutadores te acham&lt;/strong&gt;. Dois dos últimos três trabalhos que recebi vieram de gente que leu algo que escrevi. Não porque o artigo era genial — porque provava que eu &lt;em&gt;faço&lt;/em&gt; o que digo que sei.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Você aprende melhor&lt;/strong&gt;. Forçar seu cérebro a explicar em texto expõe buracos no entendimento. Se não consigo escrever "por que X funciona", é porque não entendi X direito.&lt;/p&gt;

&lt;h2&gt;
  
  
  Caveats reais
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Escrever demais logo no início&lt;/strong&gt;. Eu comecei querendo postar 3x por semana, queimei em um mês. O sistema que funciona é postar &lt;em&gt;quando tem o que dizer&lt;/em&gt;, não por cota.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Achar que precisa ser original&lt;/strong&gt;. 90% dos meus posts são sobre problemas comuns. Não importa — sua explicação, seu exemplo, seu contexto são únicos. Alguém vai bater no seu artigo e entender do &lt;em&gt;seu&lt;/em&gt; jeito.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Não linkar código real&lt;/strong&gt;. Snippets inventados na hora costumam ter bugs. Eu sempre copio de código que roda, mesmo que simplifique depois. Se o exemplo não compila, perde credibilidade.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Comece com notas privadas, não com blog público&lt;/li&gt;
&lt;li&gt;Use um repo git simples: markdown + estrutura por tipo (bugs, TIL, snippets)&lt;/li&gt;
&lt;li&gt;Publique só o que você reutilizou pelo menos duas vezes&lt;/li&gt;
&lt;li&gt;Formato problema-causa-solução é suficiente — não precisa de narrativa elaborada&lt;/li&gt;
&lt;li&gt;Recrutadores e entrevistas ficam mais fáceis quando você tem portfólio escrito&lt;/li&gt;
&lt;li&gt;Qualidade &amp;gt; frequência: poste quando tiver algo real, não por cota semanal&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>tutorial</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Agentes de IA que nunca saem do navegador</title>
      <dc:creator>Taina Costa</dc:creator>
      <pubDate>Tue, 29 Sep 2026 19:08:42 +0000</pubDate>
      <link>https://dev.to/taina_costa_f/agentes-de-ia-que-nunca-saem-do-navegador-23hm</link>
      <guid>https://dev.to/taina_costa_f/agentes-de-ia-que-nunca-saem-do-navegador-23hm</guid>
      <description>&lt;p&gt;Você já se cansou de copiar e colar dados entre tabs porque sua ferramenta de IA&lt;br&gt;
não consegue "ver" o sistema que você está usando? WebMCP resolve isso deixando&lt;br&gt;
sites exporem ferramentas que agentes podem chamar — sem sair do browser, sem&lt;br&gt;
mandar seus dados pra nuvem.&lt;/p&gt;
&lt;h2&gt;
  
  
  Por que isso importa agora
&lt;/h2&gt;

&lt;p&gt;A maioria dos agentes de IA hoje funciona assim: você descreve o que quer,&lt;br&gt;
o agente manda o pedido pra um servidor na nuvem, processa, e te devolve&lt;br&gt;
uma resposta genérica. Se o agente precisa interagir com um app web que você&lt;br&gt;
está usando, ele não consegue — a menos que você exponha uma API pública&lt;br&gt;
ou construa integrações customizadas.&lt;/p&gt;

&lt;p&gt;WebMCP (Model Context Protocol para a Web) vira esse modelo de cabeça pra baixo:&lt;br&gt;
sites podem declarar explicitamente quais ações um agente pode executar,&lt;br&gt;
e agentes locais — rodando direto no seu navegador — conseguem chamar essas&lt;br&gt;
ferramentas sem round-trip pra nuvem.&lt;/p&gt;
&lt;h2&gt;
  
  
  A ideia central
&lt;/h2&gt;

&lt;p&gt;WebMCP é uma API experimental que permite que sites exponham tools que agentes&lt;br&gt;
descobrem e chamam. A diferença crítica pro MCP tradicional: tudo acontece&lt;br&gt;
no contexto do browser. O site precisa estar aberto, você precisa estar logado,&lt;br&gt;
e o agente opera sobre o estado atual da página.&lt;/p&gt;

&lt;p&gt;Um exemplo concreto: um simulador de startup com métricas (caixa, receita mensal,&lt;br&gt;
quantidade de funcionários, felicidade do time, nível de hype). Você pode&lt;br&gt;
interagir clicando nos botões normalmente, &lt;strong&gt;ou&lt;/strong&gt; pode dizer pro agente&lt;br&gt;
"contrata 5 pessoas e adota IA no produto". O agente descobre as ferramentas&lt;br&gt;
disponíveis (&lt;code&gt;hireEmployees&lt;/code&gt;, &lt;code&gt;adoptAI&lt;/code&gt;) e executa a sequência.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Site expõe ferramentas via WebMCP&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;tools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;hireEmployees&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hire new employees&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;number&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;consequentialHint&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;medium&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="c1"&gt;// aviso de impacto&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;adoptAI&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Adopt AI in product&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;consequentialHint&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;high&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O agente roda localmente via extensão Chrome. Três modos de provider:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Google Prompt API&lt;/strong&gt; — Gemini Nano gerenciado pelo próprio Chromium,
inferência 100% local&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ollama&lt;/strong&gt; — execução local (testado com Llama 3.1)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloud fallback&lt;/strong&gt; — Gemini Flash quando os anteriores não estão disponíveis&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Loop de execução: recebe intenção do usuário → checa ferramentas WebMCP&lt;br&gt;
disponíveis → chama as apropriadas → recebe resultados → decide próximos passos.&lt;br&gt;
Por padrão, máximo 10 iterações.&lt;/p&gt;
&lt;h2&gt;
  
  
  Hands-on: safety em ações consequentes
&lt;/h2&gt;

&lt;p&gt;WebMCP não é anarquia. Ferramentas podem declarar &lt;code&gt;consequentialHint&lt;/code&gt; (low,&lt;br&gt;
medium, high). A extensão intercepta chamadas marcadas como high e pede&lt;br&gt;
confirmação manual antes de executar.&lt;/p&gt;

&lt;p&gt;Cenário real no demo: você pede "corta custos agressivamente". O agente identifica&lt;br&gt;
&lt;code&gt;fireEmployees&lt;/code&gt; como ferramenta relevante, mas antes de demitir metade do time,&lt;br&gt;
um modal aparece: "Agent wants to fire 10 employees. Confirm?"&lt;/p&gt;

&lt;p&gt;Isso mantém controle humano sobre decisões irreversíveis, mesmo em fluxos&lt;br&gt;
totalmente automatizados.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Antes de executar ação consequente&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tool&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;consequentialHint&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;high&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;confirmed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;showConfirmationModal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tool&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;confirmed&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;cancelled&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Caveats
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Não é revolucionário.&lt;/strong&gt; A própria autora do post chama isso de "faster horses" —&lt;br&gt;
uma melhoria incremental, não uma mudança arquitetural. Você continua precisando&lt;br&gt;
de uma UI tradicional; WebMCP só adiciona uma camada de acesso programático.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Requer que o site coopere.&lt;/strong&gt; Se o app não expõe ferramentas WebMCP, o agente&lt;br&gt;
não funciona. Não é scraping, não é automação genérica tipo Playwright — é um&lt;br&gt;
contrato explícito entre site e agente.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Privacidade tem tradeoffs.&lt;/strong&gt; Rodar Gemini Nano localmente é ótimo pra dados&lt;br&gt;
sensíveis, mas modelos pequenos erram mais. Ollama te dá controle total, mas&lt;br&gt;
você precisa instalar e gerenciar. Cloud funciona sempre, mas manda tudo pra fora.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Suporte limitado.&lt;/strong&gt; É experimental. Google Prompt API ainda não está disponível&lt;br&gt;
em todos os browsers/regiões. Ollama exige setup local. Pra produção hoje,&lt;br&gt;
você provavelmente vai acabar no fallback cloud.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;WebMCP permite que sites exponham ferramentas que agentes de IA chamam,
direto no browser, sem servidor intermediário&lt;/li&gt;
&lt;li&gt;Extensão Chrome roda agentes localmente via Gemini Nano, Ollama ou cloud fallback&lt;/li&gt;
&lt;li&gt;Ações de alto impacto exigem confirmação manual via &lt;code&gt;consequentialHint&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Não substitui UI tradicional — adiciona camada de automação sobre apps existentes&lt;/li&gt;
&lt;li&gt;Útil pra regiões com conectividade limitada ou casos que exigem privacidade local&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>tutorial</category>
      <category>beginners</category>
    </item>
    <item>
      <title>IA escreve código melhor que você — e daí?</title>
      <dc:creator>Taina Costa</dc:creator>
      <pubDate>Tue, 15 Sep 2026 17:58:27 +0000</pubDate>
      <link>https://dev.to/taina_costa_f/ia-escreve-codigo-melhor-que-voce-e-dai-15ml</link>
      <guid>https://dev.to/taina_costa_f/ia-escreve-codigo-melhor-que-voce-e-dai-15ml</guid>
      <description>&lt;p&gt;Tem um debate rolando que eu acho meio desonesto: "IA já programa melhor que a maioria dos devs". É verdade. Mas estamos medindo a coisa errada.&lt;/p&gt;

&lt;p&gt;Pega o ChatGPT, Claude, Copilot — todos conseguem cuspir um componente React funcional, um CRUD em Express, uma query SQL otimizada. Melhor que um dev júnior? Provavelmente. Melhor que um pleno distraído numa sexta às 17h? Com certeza. Mas se você acha que isso muda alguma coisa sobre o que faz alguém ser um bom desenvolvedor, você não entendeu o trabalho.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que a IA faz bem (e você deveria deixar)
&lt;/h2&gt;

&lt;p&gt;Vou ser direta: se o seu valor como dev é escrever um &lt;code&gt;for&lt;/code&gt; loop bonitinho ou lembrar a sintaxe de &lt;code&gt;Array.prototype.reduce&lt;/code&gt;, você já era substituível antes da IA chegar. &lt;/p&gt;

&lt;p&gt;A IA é excelente em:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Boilerplate e código repetitivo&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Você descreve o que quer&lt;/span&gt;
&lt;span class="c1"&gt;// "Create a React hook for debounced search with abort controller"&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useRef&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;useDebouncedSearch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;delay&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setQuery&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;abortControllerRef&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useRef&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;timeoutId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// Cancel previous request&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;abortControllerRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;abortControllerRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;abort&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="nx"&gt;abortControllerRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;AbortController&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

      &lt;span class="nf"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;abortControllerRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="nx"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nf"&gt;clearTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;timeoutId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;abortControllerRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;abortControllerRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;abort&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setQuery&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso funciona. É limpo. Eu não teria escrito melhor na primeira tentativa — e você provavelmente também não. &lt;strong&gt;E tá tudo bem.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Tradução entre paradigmas&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;"Converte esse callback hell pra async/await" — a IA faz isso dormindo. Refatorar de class components pra hooks? Mesma coisa. Ela não cansa, não esquece edge cases óbvios, não mistura estilos por acidente.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Código que você sabe que precisa mas não quer escrever&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Validação de formulário. Parsing de CSV. Retry logic com exponential backoff. É aquele código chato, testado mil vezes pela humanidade, que você copia do Stack Overflow mesmo. A IA só automatizou o ctrl+C ctrl+V.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que a IA não faz (e é onde você importa)
&lt;/h2&gt;

&lt;p&gt;Agora a parte que separa um script kiddie de um engenheiro de verdade:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Entender o problema antes de escrever código&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A IA vai te dar código. Sempre. Você pediu? Ela entrega. Mas ela não vai te perguntar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Esse endpoint realmente precisa ser real-time ou você só quer feedback instantâneo no UI?"&lt;/li&gt;
&lt;li&gt;"Você tá tentando resolver latência de rede ou problema de UX?"&lt;/li&gt;
&lt;li&gt;"Por que você tá fazendo cache no client se o dado muda a cada 10 segundos?"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Eu já vi dev júnior (e LLM) implementar websockets pra uma feature que um &lt;code&gt;setInterval&lt;/code&gt; de 30 segundos resolveria. O código tava perfeito. A solução tava errada.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Fazer tradeoffs conscientes&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Option A: Cache agressivo, UX rápida, risco de dados stale&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;CACHE_TTL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// 5 min&lt;/span&gt;

&lt;span class="c1"&gt;// Option B: Sempre busca fresh data, UX mais lenta, sempre correto&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;CACHE_TTL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Option C: Optimistic UI + background revalidation (SWR pattern)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;CACHE_TTL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;Infinity&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// but: revalidate on focus, revalidate on interval&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A IA não escolhe. Ela te dá a opção A porque é a que aparece mais em exemplos de blog. &lt;strong&gt;Você&lt;/strong&gt; precisa saber que pro seu caso específico — um dashboard financeiro — a opção C é a única aceitável.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Debugar problemas de integração&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;IA é ótima pra debugar um algoritmo isolado. Mas quando o bug é:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Request tá sendo enviado duas vezes porque o React renderiza em StrictMode no dev&lt;/li&gt;
&lt;li&gt;CORS só quebra em produção porque nginx tá strippando o header&lt;/li&gt;
&lt;li&gt;Race condition que só acontece em mobile 3G&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;...você precisa de contexto do sistema inteiro, conhecimento de infra, experiência com "já vi isso antes". A IA não tem nada disso. Ela vai te dar 10 sugestões genéricas e você vai perder uma tarde.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Comunicar com não-técnicos&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O PM pede "um filtro avançado". Você precisa:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Descobrir se é autocomplete, multi-select, range slider ou busca full-text&lt;/li&gt;
&lt;li&gt;Explicar que "tempo real" vai custar 10x mais de infra&lt;/li&gt;
&lt;li&gt;Negociar MVP: "e se a gente lançar com 3 filtros agora e adiciona os outros depois conforme uso?"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;IA não senta numa call. IA não lê a cara do stakeholder e percebe que ele não entendeu. IA não fala "essa feature vai atrasar o lançamento em 2 sprints, vale a pena?".&lt;/p&gt;

&lt;h2&gt;
  
  
  O desenvolvedor que a IA substitui
&lt;/h2&gt;

&lt;p&gt;Se a sua rotina é:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pegar ticket do Jira&lt;/li&gt;
&lt;li&gt;Implementar exatamente o que tá escrito&lt;/li&gt;
&lt;li&gt;Fazer passar no CI&lt;/li&gt;
&lt;li&gt;Jogar pra QA&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;...você já tá competindo com ferramentas. E vai perder.&lt;/p&gt;

&lt;p&gt;A IA substitui o dev que é &lt;strong&gt;executor&lt;/strong&gt;. Ela não substitui quem é &lt;strong&gt;arquiteto de soluções&lt;/strong&gt;, mesmo que a arquitetura seja "decidir usar Postgres em vez de MongoDB porque os relacionamentos são óbvios".&lt;/p&gt;

&lt;h2&gt;
  
  
  O que eu faço diferente agora
&lt;/h2&gt;

&lt;p&gt;Eu uso IA todo dia. Mas mudei como eu trabalho:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Antes:&lt;/strong&gt; Pensava no código enquanto escrevia código&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Agora:&lt;/strong&gt; Penso no problema, esboço a solução em comentários, deixo a IA escrever a primeira versão&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Fetch user posts with:&lt;/span&gt;
&lt;span class="c1"&gt;// - pagination (cursor-based, not offset)&lt;/span&gt;
&lt;span class="c1"&gt;// - filter by status (draft | published)&lt;/span&gt;
&lt;span class="c1"&gt;// - include author data (join, not N+1)&lt;/span&gt;
&lt;span class="c1"&gt;// - cache per user (5min TTL)&lt;/span&gt;

&lt;span class="c1"&gt;// [IA escreve isso em 10 segundos]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Antes:&lt;/strong&gt; Escrevia testes depois (quando lembrava)&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Agora:&lt;/strong&gt; Peço pra IA gerar testes baseado no código que ela escreveu — e eu reviso se os cenários fazem sentido&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Antes:&lt;/strong&gt; Gastava tempo refatorando syntax&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Agora:&lt;/strong&gt; Foco em refatorar &lt;strong&gt;arquitetura&lt;/strong&gt; — extrair abstrações, separar responsabilidades, nomear coisas direito&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;IA escreve código sintático melhor que 70% dos devs — &lt;strong&gt;e isso não importa&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;O trabalho de verdade é: entender problema, fazer tradeoffs, debugar sistemas, comunicar com pessoas&lt;/li&gt;
&lt;li&gt;Se você se sente ameaçado pela IA, você tá medindo seu valor pela métrica errada&lt;/li&gt;
&lt;li&gt;Use IA pra acelerar execução; use seu cérebro pra decidir &lt;strong&gt;o quê&lt;/strong&gt; executar e &lt;strong&gt;por quê&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;O dev que só escreve código sempre foi substituível — a IA só tornou isso óbvio&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>tutorial</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Por que você deveria parar de chamar tudo de "agente de IA"</title>
      <dc:creator>Taina Costa</dc:creator>
      <pubDate>Tue, 08 Sep 2026 17:47:36 +0000</pubDate>
      <link>https://dev.to/taina_costa_f/por-que-voce-deveria-parar-de-chamar-tudo-de-agente-de-ia-5hj2</link>
      <guid>https://dev.to/taina_costa_f/por-que-voce-deveria-parar-de-chamar-tudo-de-agente-de-ia-5hj2</guid>
      <description>&lt;p&gt;Se você trabalha com IA há mais de seis meses, já deve ter notado: todo mundo virou "agente". Chatbot com duas funções? Agente. Script que chama GPT em loop? Agente autônomo. Marketing de produto SaaS? "Nossa plataforma usa agentes inteligentes."&lt;/p&gt;

&lt;p&gt;Esse fenômeno tem até nome: &lt;strong&gt;agent washing&lt;/strong&gt;. Mas por baixo do hype, existe uma mudança real acontecendo — e se você vai construir sistemas desse tipo (ou apenas entender o que seu colega de trabalho está propondo na sprint), vale a pena separar o que é buzzword do que é arquitetura.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que separa um agente de um chatbot
&lt;/h2&gt;

&lt;p&gt;A diferença não está no modelo. Está no &lt;strong&gt;loop&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Um chatbot tradicional funciona assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;llm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Me ajude com isso&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Um agente faz isso:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;goal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Encontre todos os bugs críticos no repositório&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;done&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;done&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;action&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;decide&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;goal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// pode ser grep, API call, etc&lt;/span&gt;
  &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;done&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;checkIfGoalReached&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A diferença está no &lt;strong&gt;agent loop&lt;/strong&gt;: o sistema age, observa o resultado, decide o próximo passo. Repete até atingir o objetivo ou bater em um limite (tokens, tempo, tentativas).&lt;/p&gt;

&lt;p&gt;Não é "IA que responde". É "IA que &lt;strong&gt;faz&lt;/strong&gt;".&lt;/p&gt;

&lt;h2&gt;
  
  
  Tool calling: a primitiva que muda tudo
&lt;/h2&gt;

&lt;p&gt;Se você usou Claude, GPT ou Gemini recentemente, já viu tool calling em ação — mesmo sem perceber.&lt;/p&gt;

&lt;p&gt;Antes, quando você perguntava "Quanto é 127 * 843?", o modelo &lt;strong&gt;adivinhava&lt;/strong&gt;. Agora ele faz isso:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"assistant"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tool_calls"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"calculator"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"arguments"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"expression"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"127 * 843"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Você executa a função, devolve o resultado, o modelo continua. Simples, mas é isso que permite que agentes &lt;strong&gt;usem ferramentas reais&lt;/strong&gt; em vez de alucinar respostas.&lt;/p&gt;

&lt;p&gt;A sacada: tool calling não é "o agente". É a interface que permite construir um.&lt;/p&gt;

&lt;h2&gt;
  
  
  Agent harness: a infraestrutura invisível
&lt;/h2&gt;

&lt;p&gt;Se o LLM é o cérebro, o &lt;strong&gt;agent harness&lt;/strong&gt; é o corpo. É tudo que fica em volta:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gerenciamento de ferramentas (quais o agente pode usar, quando, com quais permissões)&lt;/li&gt;
&lt;li&gt;Controle de estado (memória entre iterações)&lt;/li&gt;
&lt;li&gt;Tratamento de erro (quando a API falha, quando o modelo trava, quando ele tenta algo proibido)&lt;/li&gt;
&lt;li&gt;Limites (budget de tokens, timeout, retry policy)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Você raramente vê isso documentado porque é código de infraestrutura — mas é onde 80% do trabalho está. O modelo decide &lt;em&gt;o que fazer&lt;/em&gt;. O harness decide &lt;em&gt;se deixa&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Exemplo real: um agente tenta rodar &lt;code&gt;rm -rf /&lt;/code&gt; porque interpretou mal uma instrução. O harness bloqueia, loga, e devolve "permission denied" pro modelo tentar outra coisa.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Guardrails&lt;/strong&gt; são a parte do harness que impõe regras: não pode acessar certos arquivos, não pode gastar mais de X tokens, não pode tomar ação Y sem aprovação humana.&lt;/p&gt;

&lt;h2&gt;
  
  
  Context engineering: o timing importa mais que o volume
&lt;/h2&gt;

&lt;p&gt;Você tem 10 mil linhas de documentação relevante. Joga tudo no prompt?&lt;/p&gt;

&lt;p&gt;Má ideia. O modelo vai gastar atenção (literal — attention mechanism) em partes irrelevantes, e você vai estourar o contexto antes de terminar.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Context engineering&lt;/strong&gt; é a arte de dar a informação certa &lt;strong&gt;na hora certa&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Ruim: joga tudo logo no início&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;todaADocumentacao&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;\n\n&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;perguntaDoUsuario&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Melhor: busca o que é relevante sob demanda&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;question&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Como funciona autenticação?&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;relevantDocs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;searchDocs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;question&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;topK&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;relevantDocs&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;\n\n&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;question&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Em sistemas multi-agente, isso fica ainda mais crítico. Você não quer que o agente de frontend veja os logs do backend a cada iteração. Quer que ele &lt;em&gt;peça&lt;/em&gt; quando precisar.&lt;/p&gt;

&lt;h2&gt;
  
  
  MCP: porque cada ferramenta não deveria ser um caso especial
&lt;/h2&gt;

&lt;p&gt;Se você já integrou um LLM com ferramentas externas, sabe o problema: cada API é um floco de neve. OAuth aqui, API key ali, webhook acolá. Você acaba com um Frankenstein de integrações.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Model Context Protocol (MCP)&lt;/strong&gt; é uma tentativa da Anthropic de padronizar isso. A ideia:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Agente] &amp;lt;--MCP--&amp;gt; [Servidor de Ferramentas] &amp;lt;--&amp;gt; [GitHub, Jira, DB, etc]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O agente fala MCP. O servidor expõe ferramentas via MCP. Você troca de ferramenta sem reescrever o agente.&lt;/p&gt;

&lt;p&gt;Ainda está em adoção (e tem concorrência), mas a direção é essa: &lt;strong&gt;ferramentas como protocolo, não como código custom&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Agentic RAG: quando o agente escolhe o que buscar
&lt;/h2&gt;

&lt;p&gt;RAG tradicional:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;docs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;vectorDB&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;answer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;llm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;docs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Agentic RAG&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;findings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
&lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;satisfied&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;nextQuery&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;decideWhatToSearchNext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;findings&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;docs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;vectorDB&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;nextQuery&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;findings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;docs&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;satisfied&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hasEnoughInfo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;findings&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;answer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;synthesize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;findings&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O agente &lt;strong&gt;dirige a busca&lt;/strong&gt;. Se a primeira query não trouxe o que ele precisa, ele refina, tenta outro ângulo, cruza fontes.&lt;/p&gt;

&lt;p&gt;Útil quando a pergunta é complexa e você não sabe de antemão qual chunk vai ter a resposta.&lt;/p&gt;

&lt;h2&gt;
  
  
  Multi-agente: quando um não basta
&lt;/h2&gt;

&lt;p&gt;Você tem um sistema que precisa:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ler issues do GitHub&lt;/li&gt;
&lt;li&gt;Analisar o código relacionado&lt;/li&gt;
&lt;li&gt;Gerar um report técnico&lt;/li&gt;
&lt;li&gt;Postar no Slack&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Opção A: um agente faz tudo. Opção B: quatro agentes especializados, com um &lt;strong&gt;orchestrator&lt;/strong&gt; coordenando.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;issues&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;githubAgent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fetchCriticalIssues&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;analysis&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;codeAgent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;analyze&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;issues&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;report&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;reportAgent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;analysis&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;slackAgent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;report&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cada agente tem ferramentas, contexto e prompt próprios. O orchestrator gerencia a pipeline.&lt;/p&gt;

&lt;p&gt;Desvantagem: complexidade. Vantagem: cada agente fica pequeno, testável, e você pode trocar um sem quebrar os outros.&lt;/p&gt;

&lt;h2&gt;
  
  
  Human-in-the-loop: o freio de mão
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;HITL&lt;/strong&gt; é simples: antes de fazer algo crítico, o agente pede aprovação.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isDestructive&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;approved&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;askHuman&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;approved&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Parece óbvio, mas você ficaria surpreso com quantos "agentes autônomos" em produção não têm isso. Até o sistema estar maduro (e mesmo depois), HITL é sua rede de segurança.&lt;/p&gt;

&lt;h2&gt;
  
  
  Evals: porque "parece funcionar" não é teste
&lt;/h2&gt;

&lt;p&gt;Como você testa um agente? Rodar uma vez e ver se deu certo?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Evals&lt;/strong&gt; (evaluations) são datasets de casos de teste onde você sabe o resultado esperado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;testCases&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;goal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Encontre o arquivo de config&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;expectedTool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;grep&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;expectedResult&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;config.json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;test&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;testCases&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;test&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;goal&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nf"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tool&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;test&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;expectedTool&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nf"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;output&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;test&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;expectedResult&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Você roda evals antes de deploy, depois de mudar o prompt, depois de trocar de modelo. É a única forma de saber se você quebrou algo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Computer use: quando não existe API
&lt;/h2&gt;

&lt;p&gt;Última fronteira: agentes que &lt;strong&gt;controlam interfaces visuais&lt;/strong&gt;. Tipo Selenium, mas dirigido por IA.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Pseudo-código&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;openBrowser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://example.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;click&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Login&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#username&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#password&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;pass&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;click&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Submit&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;extractTable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;.results&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Útil quando você precisa integrar com sistemas legados que não têm API. Frágil (qualquer mudança de UI quebra), lento, mas às vezes é a única opção.&lt;/p&gt;

&lt;p&gt;Anthropic lançou isso como &lt;strong&gt;computer use&lt;/strong&gt; (literalmente "uso do computador"). Outros estão seguindo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quando &lt;em&gt;não&lt;/em&gt; usar agentes
&lt;/h2&gt;

&lt;p&gt;Agora a parte que ninguém fala: &lt;strong&gt;a maioria dos problemas não precisa de um agente&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Se você pode resolver com:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uma chamada de LLM (&lt;code&gt;llm.generate(prompt)&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Um script determinístico&lt;/li&gt;
&lt;li&gt;Uma pipeline de dados tradicional&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;...use isso. Agentes são caros (tokens, latência, complexidade), imprevisíveis, e difíceis de debugar.&lt;/p&gt;

&lt;p&gt;Use agentes quando:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O problema é &lt;strong&gt;aberto&lt;/strong&gt; (você não sabe os passos de antemão)&lt;/li&gt;
&lt;li&gt;Precisa de &lt;strong&gt;adaptação&lt;/strong&gt; (o próximo passo depende do resultado anterior)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ferramentas variadas&lt;/strong&gt; são necessárias&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Caso contrário, você está usando uma britadeira pra pendurar um quadro.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Agent loop&lt;/strong&gt;: agir → observar → decidir → repetir. Isso que separa agentes de chatbots.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tool calling&lt;/strong&gt;: primitiva que permite agentes usarem funções reais em vez de alucinarem.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent harness&lt;/strong&gt;: toda a infraestrutura invisível (permissões, retry, logging, limites).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context engineering&lt;/strong&gt;: informação certa na hora certa, não tudo de uma vez.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP&lt;/strong&gt;: protocolo pra padronizar como agentes falam com ferramentas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agentic RAG&lt;/strong&gt;: agente dirige a busca de informação, não só recebe resultado pronto.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-agente&lt;/strong&gt;: vários agentes especializados coordenados por um orchestrator.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HITL&lt;/strong&gt;: aprovação humana antes de ações críticas. Sempre.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evals&lt;/strong&gt;: testes automatizados pra garantir que o agente ainda funciona.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Computer use&lt;/strong&gt;: agente controla UI visual quando não tem API.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Regra de ouro&lt;/strong&gt;: se dá pra resolver sem agente, resolva sem agente.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>tutorial</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Produtividade que parece errada (mas funciona para dev)</title>
      <dc:creator>Taina Costa</dc:creator>
      <pubDate>Tue, 25 Aug 2026 14:43:41 +0000</pubDate>
      <link>https://dev.to/taina_costa_f/produtividade-que-parece-errada-mas-funciona-para-dev-528p</link>
      <guid>https://dev.to/taina_costa_f/produtividade-que-parece-errada-mas-funciona-para-dev-528p</guid>
      <description>&lt;p&gt;Semana passada cancelei três reuniões, commitei código com TODOs de propósito e fechei o VS Code às 15h numa terça-feira. Entreguei mais naquela semana do que no mês anterior.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por que isso importa agora
&lt;/h2&gt;

&lt;p&gt;O burnout em tech está em alta. A cultura do "sempre produtivo" nos empurra pra fazer mais code review, mais commits, mais horas. O problema? Produtividade não é linearmente proporcional a esforço. Às vezes, fazer menos é o atalho.&lt;/p&gt;

&lt;p&gt;Aqui vão sete táticas que usei e que soam completamente erradas — mas que mudaram como entrego software.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Commite código ruim (de propósito)
&lt;/h2&gt;

&lt;p&gt;Não estou falando de commitar qualquer porcaria em &lt;code&gt;main&lt;/code&gt;. Mas parar de buscar o commit perfeito logo de cara libera momentum.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// First pass - just make it work&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;processUserData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;active&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="c1"&gt;// TODO: add email normalization&lt;/span&gt;
        &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;
      &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Commita isso. Funciona. Depois você refatora:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Second pass - clean it up&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;processUserData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; 
  &lt;span class="nx"&gt;users&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;u&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;active&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(({&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;normalizeEmail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tentar escrever a versão "certa" de primeira paralisa. O código ruim te dá tração. Refatoração vem depois.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Batch seu code review (não faça na hora)
&lt;/h2&gt;

&lt;p&gt;Toda notificação de PR é uma context switch. Eu costumava revisar na hora — achava que era ser "bom colega de time". Resultado? Zero deep work.&lt;/p&gt;

&lt;p&gt;Agora tenho dois slots de code review por dia: 11h e 16h. Reviso tudo de uma vez. Meu time sabe disso. Urgências vão pro Slack.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// .github/workflows/review-reminder.yml&lt;/span&gt;
&lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="nx"&gt;Automation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;remind&lt;/span&gt; &lt;span class="nx"&gt;me&lt;/span&gt; &lt;span class="nx"&gt;only&lt;/span&gt; &lt;span class="nx"&gt;at&lt;/span&gt; &lt;span class="nx"&gt;review&lt;/span&gt; &lt;span class="nx"&gt;time&lt;/span&gt;
&lt;span class="nx"&gt;on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="nx"&gt;schedule&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;cron&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0 11,16 * * 1-5&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;  &lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt; &lt;span class="nx"&gt;AM&lt;/span&gt; &lt;span class="nx"&gt;and&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="nx"&gt;PM&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Mon&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;Fri&lt;/span&gt;
&lt;span class="nx"&gt;jobs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="nx"&gt;notify&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nx"&gt;runs&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ubuntu&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;latest&lt;/span&gt;
    &lt;span class="nx"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Check&lt;/span&gt; &lt;span class="nx"&gt;pending&lt;/span&gt; &lt;span class="nx"&gt;PRs&lt;/span&gt;
        &lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;gh&lt;/span&gt; &lt;span class="nx"&gt;pr&lt;/span&gt; &lt;span class="nx"&gt;list&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nx"&gt;assignee&lt;/span&gt; &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;me&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Batch processing reduz sobrecarga cognitiva. Você entra no "modo revisor" e sai dele — não fica pingando entre contextos.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Não resolva o bug agora
&lt;/h2&gt;

&lt;p&gt;Achei um bug no meio de uma feature? Anoto e &lt;strong&gt;não conserto&lt;/strong&gt;. Parece irresponsável, mas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Instead of fixing immediately:&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;calculateTotal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// BUG: breaks with empty array - fix in #1234&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;price&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Crio uma issue, linko no comentário, volto pra feature. Consertar bugs no meio de outra coisa é garantia de:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Commit misturado (feature + bugfix)&lt;/li&gt;
&lt;li&gt;Perder o fio da meada na feature&lt;/li&gt;
&lt;li&gt;Gastar 20min num rabbit hole&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A não ser que seja critical, o bug espera. Foco &amp;gt; multitarefa.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Deixe TODOs no código (intencionalmente)
&lt;/h2&gt;

&lt;p&gt;TODOs têm má fama. Mas eu uso como marcador de iteração:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// components/UserProfile.tsx&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;UserProfile&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;userId&lt;/span&gt; &lt;span class="p"&gt;}:&lt;/span&gt; &lt;span class="nx"&gt;Props&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="c1"&gt;// TODO: add loading skeleton&lt;/span&gt;
  &lt;span class="c1"&gt;// TODO: add error boundary&lt;/span&gt;
  &lt;span class="c1"&gt;// TODO: add avatar upload&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Entrego a versão mínima funcionando. Os TODOs viram tasks depois. Isso evita over-engineering na primeira passada. Você descobre o que realmente precisa quando a feature está rodando.&lt;/p&gt;

&lt;p&gt;Automatizo a coleta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# List all TODOs in current branch&lt;/span&gt;
git diff main &lt;span class="nt"&gt;--name-only&lt;/span&gt; | xargs &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s2"&gt;"TODO"&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"No TODOs"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  5. Não leia a doc inteira (scan até achar o exemplo)
&lt;/h2&gt;

&lt;p&gt;Gastei anos lendo documentação de ponta a ponta. Descobri que 80% do que preciso está num example de quickstart.&lt;/p&gt;

&lt;p&gt;Quando preciso integrar uma API nova:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Vou direto pro "Getting Started"&lt;/li&gt;
&lt;li&gt;Copio o exemplo&lt;/li&gt;
&lt;li&gt;Rodo&lt;/li&gt;
&lt;li&gt;Quebrou? Aí leio a seção específica do erro
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// I don't read all of Stripe docs. I copy this:&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;stripe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;stripe&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;STRIPE_KEY&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;paymentIntent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;stripe&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;paymentIntents&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;currency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;brl&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="c1"&gt;// Then I iterate from here&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aprender fazendo &amp;gt; aprender lendo. Você absorve a doc conforme precisa, não antes.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Faça menos reuniões (mesmo as "importantes")
&lt;/h2&gt;

&lt;p&gt;Cancelei standups assíncronos. Trocamos por thread no Slack:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;📅 Daily async - 24/08
@channel drop your update:
✅ Done yesterday
🚧 Doing today  
🚨 Blockers
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Leva 2min pra escrever vs. 15min de call. Eu leio quando quero. Time remoto agradece.&lt;/p&gt;

&lt;p&gt;Reunião só quando precisa de decisão síncrona ou pair programming. O resto? Assíncrono.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Pare de trabalhar no meio (não no final limpo)
&lt;/h2&gt;

&lt;p&gt;Parece contra-intuitivo, mas parar no meio de uma função facilita retomar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;migrateUserData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;validated&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;u&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="c1"&gt;// STOPPED HERE - next: transform to new schema&lt;/span&gt;
  &lt;span class="c1"&gt;// const transformed = validated.map(u =&amp;gt; ...)&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;validated&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quando volto no dia seguinte, sei exatamente onde estava. Se paro num "ponto limpo", gasto 10min relembrando contexto.&lt;/p&gt;

&lt;p&gt;Hemingway fazia isso com escrita. Funciona com código também.&lt;/p&gt;

&lt;h2&gt;
  
  
  Caveats
&lt;/h2&gt;

&lt;p&gt;Essas táticas não são universais:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Código ruim intencional&lt;/strong&gt; não funciona se você não tem disciplina pra refatorar depois&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Batch review&lt;/strong&gt; só rola se o time concorda com a latência&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bugs adiados&lt;/strong&gt; precisam de tracking (senão somem)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TODOs&lt;/strong&gt; viram dívida técnica se ninguém cobra&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pular doc&lt;/strong&gt; é arriscado em sistemas complexos (tipo OAuth flows)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Menos reunião&lt;/strong&gt; exige comunicação assíncrona forte&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Parar no meio&lt;/strong&gt; não funciona em pair programming ou prazos apertados&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Commite código ruim primeiro, refatora depois — tração &amp;gt; perfeição&lt;/li&gt;
&lt;li&gt;Faça code review em batch (2x/dia) pra preservar deep work
&lt;/li&gt;
&lt;li&gt;Não conserte bugs no meio de features — anote e volte depois&lt;/li&gt;
&lt;li&gt;Use TODOs como marcadores de iteração, não vergonha&lt;/li&gt;
&lt;li&gt;Scan docs até achar exemplo, aprenda fazendo&lt;/li&gt;
&lt;li&gt;Troque reuniões por async quando possível&lt;/li&gt;
&lt;li&gt;Pare de trabalhar no meio pra facilitar retomada no dia seguinte&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>tutorial</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Por que comunidades de dev importam (e o que você está perdendo)</title>
      <dc:creator>Taina Costa</dc:creator>
      <pubDate>Tue, 18 Aug 2026 14:32:28 +0000</pubDate>
      <link>https://dev.to/taina_costa_f/por-que-comunidades-de-dev-importam-e-o-que-voce-esta-perdendo-fh1</link>
      <guid>https://dev.to/taina_costa_f/por-que-comunidades-de-dev-importam-e-o-que-voce-esta-perdendo-fh1</guid>
      <description>&lt;p&gt;DEV acabou de anunciar Jem Young como Community Program Coordinator. Pode parecer só mais uma contratação, mas diz muito sobre onde o ecossistema de desenvolvimento está indo: comunidades estruturadas, com pessoas dedicadas full-time a fazer elas funcionarem.&lt;/p&gt;

&lt;p&gt;Se você ainda trata comunidade como "aquele lugar onde eu copio código do Stack Overflow", está deixando muito valor na mesa.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por que isso importa agora
&lt;/h2&gt;

&lt;p&gt;Desenvolvimento web virou um jogo de ritmo insano. Frameworks mudam a cada trimestre, padrões evoluem, melhores práticas de ontem são antipadrões de hoje. Você não consegue acompanhar sozinho.&lt;/p&gt;

&lt;p&gt;Comunidades estruturadas — DEV, fóruns especializados, Discords focados — viraram infraestrutura crítica. Não só para tirar dúvidas, mas para:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Entender contexto&lt;/strong&gt; que docs oficiais não dão (por que essa lib existe, qual problema real resolve)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ver código em produção&lt;/strong&gt; de gente que já quebrou a cara&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Antecipar mudanças&lt;/strong&gt; antes de virarem trending topic no Twitter&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Networking real&lt;/strong&gt; com quem contrata, ensina, ou está resolvendo problemas parecidos com os seus&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O DEV colocar alguém full-time nisso é sinal: comunidade não é chat bagunçado, é produto.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como comunidades estruturadas funcionam
&lt;/h2&gt;

&lt;p&gt;Uma comunidade que funciona tem três camadas invisíveis:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Moderação consistente&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Regras claras, aplicadas sem viés. Código de conduta não é decoração — define se o espaço vai ser construtivo ou tóxico.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Programas de engajamento&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Challenges, AMAs, série de artigos temáticos. Algo que transforma lurking passivo em participação ativa.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Incentivos para contribuir&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Badges, destaque, ou só reconhecimento público. Parece bobo, mas gamification funciona quando bem feita.&lt;/p&gt;

&lt;p&gt;O DEV já tinha 1 e 3. Trazer um coordinator de programa sugere que vão investir pesado em 2 — mais estrutura, menos caos.&lt;/p&gt;
&lt;h2&gt;
  
  
  Como participar (de verdade)
&lt;/h2&gt;

&lt;p&gt;Tem jeito certo e jeito inútil de estar em comunidades. Jeito inútil: lurking eterno, esperando alguém resolver seu problema exato. Jeito certo: contribuir antes de pedir.&lt;/p&gt;

&lt;p&gt;Aqui está um padrão que funciona:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Semana 1-2: Observe o tom&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Leia por uma semana. Entenda que tipo de pergunta funciona, como as pessoas respondem, qual o nível de profundidade esperado.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ❌ Pergunta que vai ser ignorada&lt;/span&gt;
&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Alguém sabe React?&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;// ✅ Pergunta que vai ter resposta&lt;/span&gt;
&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Estou tentando fazer lazy loading de um componente que depende de 
context externo. Quando envolvo com Suspense, o context vem undefined. 
Alguém já resolveu isso sem mover o provider pra dentro do Suspense?&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Semana 3-4: Contribua primeiro&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Responda uma pergunta que você sabe. Compartilhe um artigo relevante. Comente em algo que te ajudou. Construa reputação antes de pedir ajuda complexa.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Depois: Seja consistente&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Apareça regularmente. Comunidades funcionam por reciprocidade. Se você some por três meses e volta só quando precisa, ninguém vai te conhecer.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que evitar
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;FOMO induzido por comunidade&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Você vai ver gente usando 15 libs que você nunca ouviu falar. Resista ao impulso de sair instalando tudo. A maioria não vai sobreviver seis meses.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Toxic positivity&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Comunidades às vezes viram câmara de eco. "Adorei esse framework!" sem crítica nenhuma. Procure espaços onde as pessoas falam dos tradeoffs, não só das vantagens.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Participação performática&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Postar por postar, só pra ter presença. Ninguém ganha nada com isso. Qualidade &amp;gt; frequência.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Esquecer que humanos existem do outro lado&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Você não está conversando com usernames. Tem gente real lendo. Seja direto, mas não seja grosso.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;DEV contratou coordinator de comunidade full-time — sinal de que comunidades viraram infraestrutura crítica&lt;/li&gt;
&lt;li&gt;Comunidades estruturadas têm moderação consistente, programas de engajamento, e incentivos para contribuir&lt;/li&gt;
&lt;li&gt;Participar bem: observe o tom → contribua primeiro → seja consistente&lt;/li&gt;
&lt;li&gt;Evite FOMO, toxic positivity, e participação performática&lt;/li&gt;
&lt;li&gt;Comunidade não é rede social — é ferramenta de trabalho. Use como tal.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>tutorial</category>
      <category>beginners</category>
    </item>
    <item>
      <title>TypeScript 7 "foi nativo" — o que isso significa de verdade</title>
      <dc:creator>Taina Costa</dc:creator>
      <pubDate>Tue, 11 Aug 2026 14:56:37 +0000</pubDate>
      <link>https://dev.to/taina_costa_f/typescript-7-foi-nativo-o-que-isso-significa-de-verdade-2a59</link>
      <guid>https://dev.to/taina_costa_f/typescript-7-foi-nativo-o-que-isso-significa-de-verdade-2a59</guid>
      <description>&lt;p&gt;Todo mundo já ouviu: o TypeScript "foi nativo". E aí vem a conclusão errada: "Oba, agora o navegador roda TypeScript direto!" Não. Seu código continua sendo transpilado pra JavaScript. O que mudou foi &lt;strong&gt;quem faz a checagem de tipos&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Antes, o compilador &lt;code&gt;tsc&lt;/code&gt; era um programa JavaScript rodando no Node.js. Agora ele foi reescrito em Go e compila pra um binário nativo. A pipeline ficou assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Antes: TypeScript 7&lt;/span&gt;
&lt;span class="nx"&gt;seus&lt;/span&gt; &lt;span class="nx"&gt;arquivos&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ts&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="nx"&gt;compilador&lt;/span&gt; &lt;span class="nx"&gt;JS&lt;/span&gt; &lt;span class="nx"&gt;no&lt;/span&gt; &lt;span class="nx"&gt;Node&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="nx"&gt;erros&lt;/span&gt; &lt;span class="nx"&gt;de&lt;/span&gt; &lt;span class="nx"&gt;tipo&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;JS&lt;/span&gt;

&lt;span class="c1"&gt;// Depois: TypeScript 7&lt;/span&gt;
&lt;span class="nx"&gt;seus&lt;/span&gt; &lt;span class="nx"&gt;arquivos&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ts&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="nx"&gt;binário&lt;/span&gt; &lt;span class="nx"&gt;nativo&lt;/span&gt; &lt;span class="nx"&gt;em&lt;/span&gt; &lt;span class="nx"&gt;Go&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="nx"&gt;mesmos&lt;/span&gt; &lt;span class="nx"&gt;erros&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;mesmo&lt;/span&gt; &lt;span class="nx"&gt;JS&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A entrada e a saída são &lt;strong&gt;idênticas&lt;/strong&gt;. Só o meio mudou.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que ganhou performance
&lt;/h2&gt;

&lt;p&gt;Os benchmarks são agressivos. A codebase do VS Code caiu de 125.7s pra 10.6s de type-check. Isso é &lt;strong&gt;11.9x mais rápido&lt;/strong&gt;. A Slack cortou o tempo de CI de 7.5 minutos pra 1.25 minuto.&lt;/p&gt;

&lt;p&gt;De onde vem essa diferença?&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Código nativo elimina JIT warmup e garbage collection.&lt;/strong&gt; Node.js precisa aquecer a V8 e pausar pra coleta de lixo. O binário Go não tem esse overhead.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Paralelização real com threads e memória compartilhada.&lt;/strong&gt; Você pode rodar &lt;code&gt;tsc --checkers 8&lt;/code&gt; em CI com máquinas potentes e distribuir a checagem entre workers simultâneos.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Isso não é otimização marginal — é mudança de categoria.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que &lt;strong&gt;não&lt;/strong&gt; mudou
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Navegador ainda não roda TypeScript direto&lt;/li&gt;
&lt;li&gt;Node.js ainda precisa de transpilação&lt;/li&gt;
&lt;li&gt;O build step continua existindo&lt;/li&gt;
&lt;li&gt;O JavaScript gerado é idêntico ao da versão 6&lt;/li&gt;
&lt;li&gt;As regras do sistema de tipos não mudaram&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se você tinha um erro de tipo antes, vai ter o mesmo erro agora. Se &lt;code&gt;tsc&lt;/code&gt; emitia um &lt;code&gt;.js&lt;/code&gt; específico, continua emitindo o mesmo código.&lt;/p&gt;

&lt;h2&gt;
  
  
  Impacto prático no seu dia a dia
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Editor mais responsivo&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Abrir projeto grande no VS Code era sinônimo de "Initializing TypeScript..." travado por minutos. Agora isso cai pra segundos. Autocomplete, go-to-definition, verificação inline — tudo fica instantâneo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. CI mais rápida&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Pipelines onde o gargalo era &lt;code&gt;tsc --noEmit&lt;/code&gt; agora correm em fração do tempo. Menos espera, mais deploy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Workarounds podem ser descontinuados&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Muita gente ativou &lt;code&gt;skipLibCheck: true&lt;/code&gt; só pra aliviar a performance, mesmo sabendo que isso desliga checagens importantes. Agora dá pra voltar atrás sem penalidade de velocidade.&lt;/p&gt;

&lt;h2&gt;
  
  
  Migração
&lt;/h2&gt;

&lt;p&gt;TypeScript 7.0 saiu em 8 de julho de 2026. A API estável do compilador vem na 7.1, e aí o ecossistema (typescript-eslint, checadores de framework) migra de vez. Até lá, times podem rodar as duas versões em paralelo.&lt;/p&gt;

&lt;p&gt;No fim: quem prometeu "TypeScript nativo no navegador" mentiu. Mas quem prometeu performance brutal entregou.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;O &lt;strong&gt;compilador&lt;/strong&gt; foi reescrito em Go e compila pra binário nativo&lt;/li&gt;
&lt;li&gt;Seu código TypeScript continua virando JavaScript, nada mudou aí&lt;/li&gt;
&lt;li&gt;Performance ganhou 10-12x em projetos grandes (VS Code, Slack)&lt;/li&gt;
&lt;li&gt;Paralelização real com &lt;code&gt;--checkers&lt;/code&gt; pra CI potente&lt;/li&gt;
&lt;li&gt;Editor e pipeline de CI ficam drasticamente mais rápidos&lt;/li&gt;
&lt;li&gt;Navegador ainda não roda &lt;code&gt;.ts&lt;/code&gt; direto — esse nunca foi o plano&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>tutorial</category>
      <category>beginners</category>
    </item>
    <item>
      <title>A IA quebrou o pipeline de devs juniores (e ninguém tá falando disso)</title>
      <dc:creator>Taina Costa</dc:creator>
      <pubDate>Tue, 04 Aug 2026 16:11:33 +0000</pubDate>
      <link>https://dev.to/taina_costa_f/a-ia-quebrou-o-pipeline-de-devs-juniores-e-ninguem-ta-falando-disso-285l</link>
      <guid>https://dev.to/taina_costa_f/a-ia-quebrou-o-pipeline-de-devs-juniores-e-ninguem-ta-falando-disso-285l</guid>
      <description>&lt;p&gt;Nos últimos dois anos, vi três empresas brasileiras congelarem contratações de júnior. Não por crise — os times seniors estavam contratando. O motivo? "Com Copilot, um pleno faz o trabalho de dois juniores." Parece eficiência. Mas se você parar pra pensar cinco minutos, percebe que acabamos de serrar o galho onde a gente tá sentado.&lt;/p&gt;

&lt;h2&gt;
  
  
  O problema não é a ferramenta, é o modelo mental
&lt;/h2&gt;

&lt;p&gt;A IA de fato multiplica produtividade de quem já sabe o que tá fazendo. Um senior com ChatGPT escreve testes mais rápido, scaffolding vira commodity, refactor massivo acontece em minutos. Mas o pulo do gato é justamente esse "já sabe o que tá fazendo".&lt;/p&gt;

&lt;p&gt;Um júnior não sabe. E as tasks que ele fazia pra aprender — ajustes de CSS, bugs óbvios de lógica, escrever CRUD pela décima vez até virar músculo — agora são delegadas pra IA. O problema: &lt;strong&gt;essas tasks chatas eram o tutorial do mundo real&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que a gente perdeu no caminho
&lt;/h2&gt;

&lt;p&gt;Quando eu comecei (2018, React 16 era novidade), passei seis meses só fazendo forms. Parecia perder tempo. Mas foi ali que internalizei:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Estado local vs global&lt;/li&gt;
&lt;li&gt;Side effects (aprendi useEffect errando, não lendo doc)&lt;/li&gt;
&lt;li&gt;Como lidar com async sem travar a UI&lt;/li&gt;
&lt;li&gt;Performance (renderizações desnecessárias doem quando você causa elas)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Meu primeiro form "de verdade" — parece simples, mas tinha&lt;/span&gt;
&lt;span class="c1"&gt;// que entender controlled components, validação, submit assíncrono&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;LoginForm&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setEmail&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;loading&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setLoading&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleSubmit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;preventDefault&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nf"&gt;setLoading&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;login&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
      &lt;span class="c1"&gt;// Como lidar com sucesso? Redirect? Toast? Context?&lt;/span&gt;
      &lt;span class="c1"&gt;// Essas perguntas só aparecem quando você tá fazendo.&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// E erro? Mostrar onde? Como?&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;finally&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nf"&gt;setLoading&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt; &lt;span class="na"&gt;onSubmit&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleSubmit&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt; 
        &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; 
        &lt;span class="na"&gt;onChange&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setEmail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="na"&gt;disabled&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;loading&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;disabled&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;loading&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;loading&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Carregando...&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Entrar&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hoje, um júnior pede pro Copilot e recebe isso pronto. Ele comita. Funciona. Mas ele não sabe &lt;em&gt;por que&lt;/em&gt; funciona. E quando quebra em produção (loading state não reseta após erro de rede), ele não tem o mapa mental pra debugar.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que acontece quando pulamos o tutorial
&lt;/h2&gt;

&lt;p&gt;Conheci um dev recém-formado que usava IA pra tudo. Brilhante, rápido, entregava. Até o dia que o Copilot sugeriu um &lt;code&gt;useEffect&lt;/code&gt; sem array de dependências. Ele aceitou. O componente entrou em loop infinito. Ele não entendia por quê — afinal, "a IA sempre funciona".&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Copilot sugeriu isso (e tá sintaticamente correto!)&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;UserProfile&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;userId&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setUser&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;fetchUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;setUser&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="c1"&gt;// ⚠️ Falta o array de dependências. Isso dispara a cada render.&lt;/span&gt;
    &lt;span class="c1"&gt;// Que causa um setUser. Que causa outro render. Loop infinito.&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Um pleno vê isso e corrige no code review. Mas se você nunca causou esse bug sozinho, nunca debugou um componente travando o browser, &lt;strong&gt;você não desenvolve o reflexo&lt;/strong&gt;. Vira conhecimento teórico, não operacional.&lt;/p&gt;

&lt;h2&gt;
  
  
  A ilusão da senioridade precoce
&lt;/h2&gt;

&lt;p&gt;A IA cria uma falsa sensação de domínio. Você entrega código que parece profissional porque a IA escreve bem. Mas quando precisa:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Decidir entre Context API, Zustand ou Redux (a IA gera qualquer um)&lt;/li&gt;
&lt;li&gt;Otimizar um re-render pesado (a IA mostra &lt;code&gt;useMemo&lt;/code&gt;, mas onde?)&lt;/li&gt;
&lt;li&gt;Arquitetar um sistema novo (a IA segue padrões genéricos, não o seu contexto)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;...você empaca. Porque essas decisões exigem ter errado antes. Ter escolhido Context pra tudo e visto o app virar spaghetti. Ter esquecido &lt;code&gt;useMemo&lt;/code&gt; e visto a lista de 10k itens travar.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que fazer? (spoiler: não é "parar de usar IA")
&lt;/h2&gt;

&lt;p&gt;Três coisas que tenho visto funcionar:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Code review como mentoria explícita&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Não aceite "funciona" como métrica. Pergunte: "Por que você usou &lt;code&gt;useCallback&lt;/code&gt; aqui? O que acontece se tirar?" Se a resposta for "o Copilot sugeriu", é red flag. O júnior precisa re-implementar do zero pra entender.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Tasks intencionalmente sem IA&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Reserve bugs pequenos e peça: "resolve sem IA, manda perguntas no Slack". Parece cruel. Mas é nesses 40 minutos debugando um &lt;code&gt;undefined&lt;/code&gt; que você internaliza como runtime funciona.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Pair programming assíncrono&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Grave sua tela enquanto codifica. Mostra o processo: como você lê a stack trace, que log você adiciona, por que testou aquele edge case. Júnior copia o &lt;em&gt;processo&lt;/em&gt;, não só o código.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Exemplo: meu flow de debug que eu gravo e compartilho&lt;/span&gt;
&lt;span class="c"&gt;# 1. Reproduzir o bug localmente&lt;/span&gt;
npm run dev
&lt;span class="c"&gt;# abrir devtools, Network tab&lt;/span&gt;

&lt;span class="c"&gt;# 2. Adicionar logs estratégicos (não console.log aleatório)&lt;/span&gt;
// antes &lt;span class="k"&gt;do &lt;/span&gt;fetch
console.log&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'fetchUser called with:'&lt;/span&gt;, userId&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
// depois &lt;span class="k"&gt;do &lt;/span&gt;fetch
console.log&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'fetchUser returned:'&lt;/span&gt;, data&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c"&gt;# 3. Ver o que tá diferente do esperado&lt;/span&gt;
&lt;span class="c"&gt;# 4. Formar hipótese ("tá chamando duas vezes?")&lt;/span&gt;
&lt;span class="c"&gt;# 5. Validar hipótese (adicionar breakpoint)&lt;/span&gt;
&lt;span class="c"&gt;# 6. Fixar&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse flow não sai de prompt do ChatGPT. Vem de repetição.&lt;/p&gt;

&lt;h2&gt;
  
  
  O elefante na sala: vagas
&lt;/h2&gt;

&lt;p&gt;A parte incômoda: empresas de fato precisam de menos juniores agora. Mas se &lt;em&gt;todo mundo&lt;/em&gt; parar de contratar, de onde vêm os seniors de 2030? Não existe dev senior que não foi júnior antes.&lt;/p&gt;

&lt;p&gt;A solução não é romantizar sofrimento ("na minha época fazíamos tudo na mão"). É reconhecer que &lt;strong&gt;aprender a programar é diferente de aprender a usar ferramentas&lt;/strong&gt;. A IA é uma ferramenta absurda. Mas se você nunca aprendeu a programar sem ela, você não programa — você delega.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;IA multiplica produtividade de quem já sabe; não ensina quem não sabe.&lt;/li&gt;
&lt;li&gt;Tasks "chatas" de júnior eram o tutorial do mundo real — e sumiram.&lt;/li&gt;
&lt;li&gt;Copilot gera código correto, mas não te ensina &lt;em&gt;por que&lt;/em&gt; tá correto.&lt;/li&gt;
&lt;li&gt;Sem os bugs de júnior, você não desenvolve reflexos de debug.&lt;/li&gt;
&lt;li&gt;Solução: code review educativo, tasks sem IA, pair programming gravado.&lt;/li&gt;
&lt;li&gt;Se ninguém treina júnior, de onde vêm os seniors de amanhã?&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>tutorial</category>
      <category>beginners</category>
    </item>
    <item>
      <title>IA no desenvolvimento web: de escrever código para orquestrar sistemas</title>
      <dc:creator>Taina Costa</dc:creator>
      <pubDate>Tue, 07 Jul 2026 14:18:12 +0000</pubDate>
      <link>https://dev.to/taina_costa_f/ia-no-desenvolvimento-web-de-escrever-codigo-para-orquestrar-sistemas-2dhf</link>
      <guid>https://dev.to/taina_costa_f/ia-no-desenvolvimento-web-de-escrever-codigo-para-orquestrar-sistemas-2dhf</guid>
      <description>&lt;p&gt;Passei os últimos meses integrando APIs de IA em projetos reais e percebi uma mudança que ninguém está falando: não é sobre substituir desenvolvedores, é sobre mudar fundamentalmente o que a gente faz no dia a dia.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que mudou de verdade
&lt;/h2&gt;

&lt;p&gt;Todo mundo fala de ChatGPT escrevendo código. Mas o que importa mesmo é que agora você pode adicionar capacidades cognitivas nas suas aplicações tão facilmente quanto você adiciona um banco de dados. Precisa classificar texto? Gerar conteúdo? Extrair estrutura de dados não estruturados? Antes você treinava um modelo ou usava regex insanos. Hoje você chama uma API.&lt;/p&gt;

&lt;p&gt;Isso muda o jogo porque você para de escrever lógica complexa e começa a orquestrar comportamentos. É arquitetura, não algoritmo.&lt;/p&gt;

&lt;h2&gt;
  
  
  O padrão que você vai usar toda hora
&lt;/h2&gt;

&lt;p&gt;Aqui está o código que eu mais escrevo ultimamente - uma edge function que pega input do usuário e retorna JSON estruturado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// app/api/analyze/route.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Anthropic&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@anthropic-ai/sdk&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;POST&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;content&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;anthropic&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Anthropic&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ANTHROPIC_API_KEY&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;anthropic&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;claude-3-5-sonnet-20241022&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;max_tokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
      &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Extract key points from this text as JSON with keys: topic, sentiment, actionItems. Text: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;
    &lt;span class="p"&gt;}]&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Simples, mas repara: você não escreveu nenhuma lógica de análise. Você descreveu o que queria e a IA fez. Isso funciona para 80% dos casos de processamento de texto que você encontra.&lt;/p&gt;

&lt;h2&gt;
  
  
  Streaming: a parte que ninguém mostra
&lt;/h2&gt;

&lt;p&gt;O problema do código acima? Latência. Modelos de IA demoram. A mágica moderna é streaming - você vai renderizando a resposta conforme ela chega:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;POST&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;prompt&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;anthropic&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Anthropic&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ANTHROPIC_API_KEY&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;stream&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;anthropic&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;claude-3-5-sonnet-20241022&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;max_tokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;prompt&lt;/span&gt; &lt;span class="p"&gt;}]&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;encoder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;TextEncoder&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;readable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ReadableStream&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;await &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;chunk&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;content_block_delta&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;delta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text_delta&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="nx"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;enqueue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;encoder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;delta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="nx"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;readable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text/plain; charset=utf-8&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No frontend, você consome com um loop simples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/analyze&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;userInput&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;reader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getReader&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;decoder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;TextDecoder&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;done&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;done&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;decoder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nf"&gt;setContent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prev&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;prev&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// React state update&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso transforma a experiência. Em vez de spinner por 5 segundos, o usuário vê a resposta se formando. Parece detalhe, mas é a diferença entre "lento" e "mágico".&lt;/p&gt;

&lt;h2&gt;
  
  
  O padrão de composição que você precisa dominar
&lt;/h2&gt;

&lt;p&gt;Aqui está onde fica interessante. Você não chama IA uma vez - você compõe chamadas. Exemplo real que implementei: um sistema de sugestões de código que primeiro analisa o contexto, depois gera sugestões, depois filtra as irrelevantes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;generateContextualSuggestions&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;code&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Step 1: Understand context&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;anthropic&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;claude-3-5-haiku-20241022&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// fast model for analysis&lt;/span&gt;
    &lt;span class="na"&gt;max_tokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;512&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
      &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`What is the user trying to do at cursor position &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;? Code: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;code&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;
    &lt;span class="p"&gt;}]&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;intent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Step 2: Generate suggestions based on intent&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;suggestions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;anthropic&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;claude-3-5-sonnet-20241022&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// powerful model for generation&lt;/span&gt;
    &lt;span class="na"&gt;max_tokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2048&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
      &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Generate 5 code completions for: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;intent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;description&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;
    &lt;span class="p"&gt;}]&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;suggestions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Repara que usei Haiku para análise (mais rápido, mais barato) e Sonnet para geração (mais capaz). Você orquestra modelos diferentes para partes diferentes do problema. É como escolher entre PostgreSQL e Redis - cada ferramenta tem seu uso.&lt;/p&gt;

&lt;h2&gt;
  
  
  Os problemas que você vai enfrentar
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Custo&lt;/strong&gt;. Cada chamada custa dinheiro. Você precisa cachear agressivamente. Eu uso um padrão simples: hash do input como chave de cache, TTL de 24h para respostas determinísticas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cacheKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createHash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;sha256&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;digest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;hex&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cached&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;redis&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cacheKey&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cached&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cached&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// ... make API call ...&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;redis&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cacheKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;86400&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Latência&lt;/strong&gt;. Mesmo com streaming, é mais lento que lógica tradicional. Use IA para o que humanos fariam devagar (análise de contexto, geração criativa), não para o que código faz rápido (validação, cálculos).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Consistência&lt;/strong&gt;. LLMs não são determinísticos. Se você precisa de output previsível toda vez, passe &lt;code&gt;temperature: 0&lt;/code&gt; e valide o schema da resposta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;topic&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isArray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;actionItems&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Invalid response format&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  O que isso significa para você
&lt;/h2&gt;

&lt;p&gt;Seu trabalho está mudando de "implementar algoritmos" para "desenhar fluxos". Você vai passar mais tempo decidindo quando usar IA (caro, lento, flexível) vs quando usar código tradicional (barato, rápido, rígido).&lt;/p&gt;

&lt;p&gt;A skill que importa agora é arquitetura de sistemas: saber decompor problemas, escolher as ferramentas certas para cada parte, e fazer tudo funcionar junto. O código em si? Cada vez menos importante.&lt;/p&gt;

&lt;p&gt;Não é sobre IA escrever seu código. É sobre você usar IA como mais uma ferramenta na stack - junto com banco de dados, cache, filas, e tudo mais que você já orquestra.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;IA em produção não é sobre substituir devs, é adicionar capacidades cognitivas via API&lt;/li&gt;
&lt;li&gt;O padrão fundamental: edge function + LLM API + streaming para UX fluida&lt;/li&gt;
&lt;li&gt;Componha múltiplas chamadas com modelos diferentes (rápido vs poderoso) para cada etapa&lt;/li&gt;
&lt;li&gt;Cache agressivo, valide schemas, use &lt;code&gt;temperature: 0&lt;/code&gt; quando precisar de consistência&lt;/li&gt;
&lt;li&gt;Seu trabalho está virando orquestração de sistemas, não escrita de algoritmos&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>tutorial</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
