<?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>Forem: Monest</title>
    <description>The latest articles on Forem by Monest (@monest).</description>
    <link>https://forem.com/monest</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.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F11883%2F0ffa664d-e98c-4286-9fe0-00b4828c7d51.png</url>
      <title>Forem: Monest</title>
      <link>https://forem.com/monest</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/monest"/>
    <language>en</language>
    <item>
      <title>Como Eliminamos 4.041 Erros de TypeScript em 6 Meses</title>
      <dc:creator>Matheus Morett</dc:creator>
      <pubDate>Mon, 10 Nov 2025 20:38:44 +0000</pubDate>
      <link>https://forem.com/monest/como-eliminamos-4041-erros-de-typescript-em-6-meses-320a</link>
      <guid>https://forem.com/monest/como-eliminamos-4041-erros-de-typescript-em-6-meses-320a</guid>
      <description>&lt;p&gt;Quando assumi como Head de Tecnologia da Monest em janeiro de 2025, me deparei com um cenário que muitos times de engenharia conhecem bem: TypeScript configurado com &lt;code&gt;strict: false&lt;/code&gt;. Na prática, isso significava que nosso "TypeScript" era apenas JavaScript com extensão &lt;code&gt;.ts&lt;/code&gt; — sem as verdadeiras garantias de tipo que tornam o TypeScript valioso.&lt;/p&gt;

&lt;p&gt;O problema era simples de identificar: código como &lt;code&gt;object.value&lt;/code&gt; onde &lt;code&gt;object&lt;/code&gt; poderia ser &lt;code&gt;undefined&lt;/code&gt; passava tranquilamente no build, só para explodir em runtime. Mas a solução? Essa era outra história.&lt;/p&gt;

&lt;h2&gt;
  
  
  O Desafio: 4.041 Erros de Uma Vez
&lt;/h2&gt;

&lt;p&gt;Quando finalmente ativamos &lt;code&gt;strict: true&lt;/code&gt; para avaliar a situação, fomos recebidos por uma parede vermelha no VSCode: &lt;strong&gt;4.041 erros de TypeScript&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Ninguém consegue resolver 4.041 erros do dia para a noite. E mesmo que conseguisse, o risco de quebrar funcionalidades críticas em produção — especialmente em uma startup de cobrança por IA como a Monest — era inaceitável.&lt;/p&gt;

&lt;p&gt;Precisávamos de uma estratégia diferente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Nossa Abordagem: Migração Gradual e Sustentável
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Strict em Dev, Permissivo em Prod
&lt;/h3&gt;

&lt;p&gt;A primeira decisão foi aparentemente contraditória, mas fundamental:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;code&gt;strict: true&lt;/code&gt; em desenvolvimento — para que os erros aparecessem na nossa cara enquanto editávamos arquivos&lt;/li&gt;
&lt;li&gt;⚠️ &lt;code&gt;strict: false&lt;/code&gt; em deploy — para que a build funcionasse mesmo com erros pendentes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Isso nos deu visibilidade do problema sem bloquear o time ou comprometer entregas.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Uma GitHub Action para Criar Accountability
&lt;/h3&gt;

&lt;p&gt;Criamos uma GitHub Action que contava os erros de TypeScript a cada PR. A regra era simples: &lt;strong&gt;cada PR precisava reduzir pelo menos 1 erro&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd4vkvbkq6vwkz7izfkx2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd4vkvbkq6vwkz7izfkx2.png" alt="Comentário no GitHub dizendo que foram removidos erros o suficiente" width="800" height="259"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Não importava se você estava trabalhando em uma nova feature ou em um bugfix — você tinha que resolver ao menos um débito técnico de TypeScript. Sem exceções.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. A Regra de Ouro: Produção em Primeiro Lugar
&lt;/h3&gt;

&lt;p&gt;Estabelecemos uma regra de ouro para guiar decisões difíceis:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"O sistema funciona em produção. Na dúvida entre alterar o código ou o tipo, altere o tipo."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Essa diretriz foi crucial. Em vez de tentar "corrigir" código que funcionava (e potencialmente introduzir bugs), priorizamos ajustar as definições de tipo para refletir a realidade do código existente. Refatorações podiam vir depois, quando entendêssemos melhor cada parte do sistema.&lt;/p&gt;

&lt;p&gt;Nem tudo foi perfeito nessa jornada. Tivemos um deploy que acabou quebrando produção — ironicamente, o erro foi justamente fazer o oposto da nossa regra de ouro: confiamos no tipo (que estava errado) em vez do código (que funcionava). Foi um lembrete valioso de que tipos são ferramentas para nos ajudar a entender o código, não verdades absolutas sobre ele.&lt;/p&gt;

&lt;p&gt;Esse incidente reforçou ainda mais a importância da nossa abordagem cautelosa e incremental.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Visibilidade e Celebração do Progresso
&lt;/h3&gt;

&lt;p&gt;Incorporamos na nossa reunião de engineering all-hands o ritual de ver quantos erros tínhamos eliminado no mês. Transformamos o que poderia ser uma tarefa chata em um indicador de progresso coletivo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyb20yyy3plroi79hgzcg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyb20yyy3plroi79hgzcg.png" alt="Gráfico em linha da diminuição de erros de TypeScript" width="800" height="496"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ver aquele número caindo mês a mês criou um senso de conquista compartilhada.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Atenção Especial para Código Crítico
&lt;/h3&gt;

&lt;p&gt;Para arquivos sensíveis — como nossa lógica de geração de acordos, o coração da nossa plataforma — criamos tickets específicos. Essas partes do código mereciam atenção focada e revisão cuidadosa, não podiam ser tratadas como "apenas mais um erro para resolver".&lt;/p&gt;

&lt;h2&gt;
  
  
  Os Resultados
&lt;/h2&gt;

&lt;p&gt;Mantivemos uma média de &lt;strong&gt;800 erros removidos por mês&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Em &lt;strong&gt;6 meses&lt;/strong&gt;, chegamos a &lt;strong&gt;zero erros de TypeScript&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Hoje, em novembro de 2025, arquivos vermelhos com erros de TypeScript são coisa do passado na Monest. Mais importante: ganhamos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Confiança&lt;/strong&gt; — refatorações são menos arriscadas&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Produtividade&lt;/strong&gt; — o autocomplete realmente funciona&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Qualidade&lt;/strong&gt; — pegamos erros em tempo de desenvolvimento, não em produção&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Onboarding&lt;/strong&gt; — novos engenheiros entendem o código mais rapidamente&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Lições Aprendidas
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Débito técnico não se resolve em um sprint heroico
&lt;/h3&gt;

&lt;p&gt;Tentativas de "resolver tudo de uma vez" geralmente falham. Progresso consistente e incremental vence.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Automação cria disciplina
&lt;/h3&gt;

&lt;p&gt;A GitHub Action transformou a resolução de débito técnico de "quando der tempo" para "sempre, um pouco por vez".&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Visibilidade gera engajamento
&lt;/h3&gt;

&lt;p&gt;Compartilhar o progresso publicamente nas all-hands criou senso de propriedade coletiva.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Produção não pode esperar perfeição
&lt;/h3&gt;

&lt;p&gt;A configuração híbrida (strict em dev, permissivo em prod) nos deu o melhor dos dois mundos: visibilidade sem bloqueio.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Tipos servem o código, não o contrário
&lt;/h3&gt;

&lt;p&gt;Nosso único incidente em produção nos ensinou: quando os tipos contradizem código que funciona, questione os tipos primeiro.&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>backend</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
