- À medida que agentes de IA passam a ocupar o centro da escrita de código, práticas antes “opcionais”, como testes, documentação e tipagem estática, agora se tornam elementos obrigatórios
- A exigência de 100% de cobertura de código garante que cada linha seja de fato verificada e sustentada por exemplos executáveis
- Estrutura de diretórios e nomes de arquivos claros facilitam a navegação da base de código pelo LLM e incentivam a organização em arquivos menores
- É importante construir ambientes de desenvolvimento rápidos, efêmeros e concorrentes, para que vários agentes possam trabalhar em paralelo
- O ponto central é manter um ecossistema de código confiável para a IA por meio de sistemas de tipos estáticos e ferramentas automatizadas de controle de qualidade
IA e a obrigatoriedade do ‘bom código’
- Há muito tempo os desenvolvedores reconhecem testes, documentação, módulos pequenos e tipagem estática como critérios de bom código, mas na prática isso muitas vezes era deixado de lado
- Porém, agentes de IA não conseguem organizar o código sozinhos com tanta competência, então essas boas práticas se tornam indispensáveis
- Para evitar que os agentes sigam na direção errada, é essencial estabelecer guardrails claros e mecanismos de execução obrigatória
- Com guardrails robustos, os LLMs tendem a convergir apenas para o caminho correto; em ambientes incompletos, eles amplificam os problemas
100% de cobertura de código
- As equipes estão tornando 100% de cobertura de código uma exigência, não apenas para evitar bugs, mas para validar o comportamento de todo código escrito por agentes
- Em coberturas de 95% ou 99,99%, a origem do código não testado fica ambígua; com 100%, cada linha não verificada pode ser identificada com clareza
- O relatório de cobertura vira uma lista do que precisa ser testado, e o LLM precisa sempre apresentar exemplos executáveis ao propor mudanças no código
- Essa abordagem também traz efeitos colaterais positivos, como remoção de código inacessível, explicitação de edge cases e maior eficiência em code review
Namespaces e estrutura de arquivos
- Os agentes exploram a base de código pelo sistema de arquivos, então a estrutura de diretórios e os nomes dos arquivos funcionam como uma interface importante
- Um caminho claro como ./billing/invoices/compute.ts transmite muito mais informação do que ./utils/helpers.ts
- Deve-se priorizar arquivos pequenos e bem definidos, o que permite ao LLM carregar o arquivo inteiro no contexto e evitar perda de desempenho
- Essa organização melhora a velocidade e a precisão da exploração feita pelos agentes
Ambientes de desenvolvimento rápidos, efêmeros e concorrentes
- Em vez do ambiente único de desenvolvimento do passado, o desenvolvimento com agentes passa a funcionar como gestão paralela de vários processos
- Fast: testes e validações precisam rodar rapidamente, e as equipes otimizam para concluir mais de 10.000 assertions em menos de 1 minuto
- Velocidade garantida com forte paralelização, isolamento rigoroso e camada de cache para chamadas a terceiros
- Ephemeral: com o comando
new-feature <name>, é possível criar um novo ambiente em 1 a 2 segundos, com configuração automática e execução do agente
- Se houver necessidade de configuração manual, a frequência de uso cai drasticamente; por isso, automação total é essencial
- Concurrent: para executar vários ambientes simultaneamente, são necessárias configurações que evitem conflitos de portas, banco de dados, cache etc.
- Isso pode ser feito com Docker ou com isolamento baseado em variáveis de ambiente
Sistema de tipos end-to-end e controle de qualidade automatizado
- É preciso automatizar o máximo possível de boas práticas, reduzindo a liberdade do LLM e mantendo a qualidade consistente
- Linters e formatadores automáticos devem ser configurados de forma rigorosa, aplicando correções automáticas sempre que o LLM concluir uma tarefa
- Recomenda-se o uso de linguagens com tipagem estática, em especial aproveitando um sistema de tipos forte com TypeScript
- Nomes de tipos significativos como
UserId, WorkspaceSlug e SignedWebhookPayload deixam a intenção do código mais clara
- OpenAPI ajuda a manter a consistência dos tipos entre frontend e backend
- O sistema de tipos e os triggers do Postgres ajudam a garantir a integridade dos dados, enquanto o Kysely gera clientes type-safe
- Todos os clientes de terceiros também devem ter definições de tipos precisas ou ser usados por meio de wrappers
Conclusão: redefinindo a qualidade de código na era da IA
- Agentes são codificadores excelentes e incansáveis, mas seu desempenho depende da qualidade do ambiente
- ‘Bom código’ já não é uma escolha, e sim uma condição prévia para que a IA funcione corretamente
- A configuração inicial pode parecer um fardo, mas é um investimento essencial que foi adiado por tempo demais
- Com apoio da liderança de engenharia, o objetivo deve ser construir bases de código amigáveis para IA
1 comentários
Comentários do Hacker News
A armadilha de alcançar 100% de cobertura é que, se o mesmo agente escreve o código e os testes, pode cair em uma validação auto-contraditória
Se o agente cria uma lógica errada e também escreve testes errados para validá-la, os testes passam, mas o código continua com erro na prática
Esse tipo de cobertura só faz sentido quando os testes são escritos antes do código ou quando uma pessoa faz uma validação rigorosa
Caso contrário, isso apenas cria uma ilusão de confiabilidade
O ponto principal é que pessoas com formas de pensar diferentes validem os pontos cegos umas das outras
Mesmo que existam vários modelos de IA, no fim eles devem ser tratados como uma só “mente”
É melhor fazer testes com IA para código humano, testes humanos para código de IA, ou revisar o código uns dos outros
Ainda assim, mesmo entre humanos, relações de poder podem fazer com que só a opinião de uma pessoa prevaleça, e a IA não impede isso
Deve-se inserir bugs de propósito e verificar se eles falham
Isso não é um problema exclusivo da IA; com humanos acontece o mesmo
Ainda assim, é bom ver que, graças à IA, muitos desenvolvedores estão aprendendo princípios de engenharia de verdade
SQLite e software aeronáutico buscam esse nível
Ainda assim, isso ainda não é uma hipótese validada academicamente
Por isso é preciso validar cenários reais de usuário com testes de integração ou testes automatizados de UI
Dados vindos do ambiente de produção ou testes em ambiente sombra também ajudam
Antes dos LLMs, a configuração era trabalhosa, mas agora o ROI melhorou
Como o Uncle Bob enfatizou, é importante investir na estruturação dos testes
LLMs escrevem testes repetitivos, mas, quando solicitado, também aplicam bem o princípio DRY ou o padrão factory
É um método que comecei a experimentar ontem: primeiro escrevo a especificação em TLA+/PlusCal e depois peço ao Codex para implementá-la exatamente como está na spec
Eu digo para ele seguir apenas a especificação, sem criatividade
O código resultante fica feio, mas correto, e é muito mais rápido do que traduzir isso manualmente
Mas, quando falta otimização ou fica bagunçado demais, faço alguns ajustes
Estou especialmente experimentando estruturas de dados sem lock, mas o Codex ainda tenta usar locks, então preciso corrigir isso manualmente
No fim, eu foco na lógica matemática, e a IA cuida dos detalhes de implementação
Esse é exatamente o fluxo ideal de “especificação primeiro, código depois”
Concordo com o texto de Martin Kleppmann
Nos modelos mais recentes isso funciona bem de verdade, e a eficiência de custo também melhorou de 10 a 100 vezes
Isso parece alucinação ou papo de vendedor
Se bugs reais de produção e o custo de manutenção não conseguem forçar código bom, a IA também não vai conseguir
No nível atual, a IA provavelmente tende mais a piorar o código
Não existe um critério universal de qualidade quando nem o tamanho ideal de um método tem consenso
Métricas como cobertura de testes também são fáceis de manipular e, se aplicadas errado, podem até ser prejudiciais
Especialmente quando a IA escreve os testes, isso pode gerar falsa confiança
Acho que desenvolvimento de software pode ser a única aplicação realmente prática dos LLMs
Dá para criar um loop de feedback mais rápido do que em outras áreas
Você faz um plano com o LLM e, algumas horas depois, vê que deu errado, e o LLM diz “pois é, por isso não devia fazer assim”
É como construir uma casa com padrão elétrico americano e descobrir o problema ao instalar uma lava-louças canadense
Software era relativamente seguro, então desenvolvimento anônimo era possível, mas agora está surgindo uma cultura de assinatura responsável
No futuro, talvez só quem escrever código inovador e de alto risco receba remuneração alta
A IA continua gerando código sem sentido, a gente depura, ela gera outra coisa sem sentido, e ficamos presos num loop infinito
Basta que a especificação de corrente elétrica esteja correta para ser seguro
Ainda assim, acho um alívio poder confirmar o contato com a realidade por meio de testes unitários
Eu estou estudando circuitos RLC e inerter com LLM
Muita gente se impressiona ao ver LLMs gerarem código rapidamente, mas velocidade ou volume não são o gargalo da qualidade
A verdadeira revolução vai acontecer quando a IA produzir código mais preciso do que humanos
O valor de verdade vem de saber como o código funciona
Entre engenheiros que ficam apenas supondo durante uma reunião, o momento mais valioso é quando alguém abre o código real e mostra o que está acontecendo
Talvez “código bom” seja, no fundo, código otimizado para a memória de trabalho limitada dos humanos
O modelo consegue ver todo o contexto de uma vez, então não tem essa limitação
Se a janela de contexto ficar 100 vezes maior, esse debate talvez perca importância
Fico preocupado que exigir 100% de cobertura de um LLM possa cristalizar premissas erradas
Ainda assim, se houver revisão humana, dá para dizer “isso está errado, então vamos apagar os testes e reescrever”?
O LLM ajuda a escrever o PRD como se estivesse entrevistando, para deixar escopo e expectativas claros
“Boas práticas” mudam conforme o ambiente técnico
Agora que escrever código ficou mais fácil, 100% de cobertura pode ser mais útil para LLMs
Testes dão ao LLM um objetivo claro e tornam as interações seguintes mais seguras
Cada teste referencia tickets antigos de bug e garante que as correções continuem preservadas
Se você der cenários ao LLM, na maioria dos casos ele vai gerar código com qualidade semelhante
Diferentemente da arte criativa, software é uma indústria especialmente adequada à automação
Ao ver o título, achei que o texto diria que “para a IA ser eficaz, nós precisamos escrever bom código”
Na prática, o Claude erra com frequência quando há nomes de variáveis ambíguos ou código sem lógica clara
Se a variável se chama “iteration_count” mas guarda uma soma, a IA se confunde
No fim, código limpo ajuda tanto a IA quanto humanos
Como a IA usa documentação interna como recurso de aprendizado, agora documentação atualizada é vista como essencial
Antes isso tinha prioridade baixa, mas hoje afeta diretamente a qualidade do modelo
Ainda assim, com o tempo isso também deve melhorar
Assim, aumenta a chance de o LLM implementar corretamente de primeira
Este texto revela a compreensão rasa de engenharia das empresas de prompt
100% de cobertura não verifica todas as combinações de entrada
Apenas executa todas as linhas com alguns exemplos
No fim, o que seria necessário é prova formal, mas isso custa absurdamente caro e LLMs não servem para isso
Em vez disso, criar um ambiente de desenvolvimento reativo aos testes pode abrir uma nova era de ouro
Se surgir problema de cobertura, dá para expandir depois
O ideal é configurar os testes da forma mais minuciosa possível desde o começo
Já existem muitas tentativas de conectá-los a proof assistants
Mesmo quando a especificação tem pequenos erros, na maioria das vezes eles ainda geram resultados úteis