Disclaimer
Este texto foi inicialmente concebido pela IA Generativa em função da transcrição de uma live do Dev Eficiente. Se preferir acompanhar por vídeo, é só dar o play.
Introdução
No desenvolvimento de software atual, as ferramentas de LLM (Large Language Models) estão se tornando cada vez mais importantes para acelerar a produtividade. Mas como usar essas ferramentas de forma eficaz sem perder o controle sobre a qualidade do código? Neste post, vou compartilhar meu fluxo prático de desenvolvimento usando Claude Code para implementar um serviço de e-mails.
O Contexto: Implementando um Serviço de E-mails
O desafio proposto foi implementar um serviço de e-mails que expõe uma API HTTP para enviar e-mails. O sistema deve escolher automaticamente o provedor de e-mail baseado na configuração do cliente e respeitar prioridades em caso de falha.
Principais funcionalidades:
- Endpoint para disparo de e-mail
- Endpoint para configuração de provedores por cliente
- Suporte a múltiplos provedores (Mailgun, SendGrid, SMTP)
- Sistema de prioridades com fallback
- Armazenamento de configurações e histórico de envios
Por Que Escolhi o Claude Code
Optei pelo Claude Code por algumas características específicas:
Transparência de uso: Funciona direto no terminal, permitindo ver exatamente quais "tools" (extensões) estão sendo utilizadas. Isso me ajuda a entender melhor o funcionamento do agente e, como consequência, posso tentar tomar ações que ajudem no funcionamento dele.
Controle de contexto: Oferece a possibilidade de sumarizar o contexto atual, diminuindo o nível de alucinação do modelo.
Facilidade de configuração: Não precisa de configurações extras, funciona diretamente pelo terminal. Para deixar claro, não é muito diferente de instalar um plugin na IDE. Só prefiro usar pelo terminal neste momento.
Meu Fluxo de Trabalho com LLM
1. Bootstrap, Não Automação Completa
O ponto mais importante do meu fluxo é entender que o LLM é para bootstrap, não para fazer o trabalho completo. Eu sei o que quero implementar e uso o LLM para materializar rapidamente a estrutura inicial.
De vez em quando essa estrutura já está quase completa.
2. Manter o Controle das Decisões de Design
Quando o LLM gerou código que feria minhas práticas de desenvolvimento, eu intervinha imediatamente. Por exemplo:
Problema identificado: O LLM criou um método que alterava o estado de um parâmetro passado por referência.
Minha solução: Mantive a prática de funções mais puras, adicionando um comentário para explicar a alteração de estado quando necessário.
3. Proximidade Operacional
Um princípio que sigo é manter as decisões sobre um dado o mais próximo possível da origem do dado. Quando o LLM sugeriu uma solução que colocava configurações distantes dos dados relacionados, eu refatorei para aproximar comportamento e estado.
4. Fluxo de implementação
Prefiro começar sempre do lado externo (controllers) para dentro (entidades), testando frequentemente. O LLM às vezes gera tudo de uma vez, o que pode complicar o troubleshooting quando algo dá errado.
Reforço do que Considero Importante
O LLM Não Substitui Conhecimento
Durante todo o processo, foi meu conhecimento técnico que guiou as decisões. O LLM acelerou a escrita do código, mas eu mantive controle sobre:
- Arquitetura da solução
- Práticas de código
- Decisões de design
- Tratamento de edge cases
Cuide do Tamanho do Contexto
À medida que o contexto do LLM crescia, percebi que ele começava a tomar decisões inconsistentes com o que havia sido estabelecido anteriormente. É importante limpar o contexto ou ser mais específico nas instruções.
Para mim é algo muito similar as relações humanas. Pouco contexto pode deixar sem direção, mas exagero pode trazer confusão. Precisa batalhar constantemente para fornecer o nível suficiente de informação.
Troubleshooting Diferente
Quando você usa LLM para gerar código, o troubleshooting muda. Em vez de construir incrementalmente e testar a cada passo, você recebe blocos maiores de código que podem ter problemas em múltiplas camadas.
Este é um ponto que eu sinto que preciso achar um caminho melhor. Gosto de codar de maneira bem iterativa, executando o código o máximo de vezes que posso. Só que controlar isso no LLM exigiria um esforço extra que não considero valer a pena no momento.
Práticas Recomendadas
1. Mantenha Suas Práticas de Código
Não abandone seus princípios de desenvolvimento só porque o LLM sugeriu algo diferente. Use-o como acelerador, não como substituto do seu julgamento.
2. Teste Frequentemente
Mesmo com código gerado por LLM, rode e teste constantemente. Quanto mais cedo você pegar um problema, mais fácil será identificar a causa.
3. Seja Específico nas Instruções
Quando o LLM não gerar o que você quer, seja mais específico. Em alguns momentos é mais rápido escrever na mão do que ensinar o LLM.
Aconteceu especificamente no caso onde tive que implementar o código para suportar múltiplos provedores de maneira facilitada.
4. Revise e Refatore
Código gerado por LLM precisa de revisão. Aplique suas práticas de refatoração normalmente.
Você não querer assumir responsabilidade por algo que você nem viu, não é?
Métricas do Experimento
O custo total do desenvolvimento foi de $2.50. Um investimento que considero muito baixo para a quantidade de código gerado.
Conclusão
Usar LLM no desenvolvimento pode ser extremamente produtivo quando você mantém o controle das decisões importantes. O segredo está em encontrar o equilíbrio entre acelerar a escrita de código e manter a qualidade e coerência da solução.
A ferramenta é excelente para bootstrap e estruturação inicial, mas sua experiência e conhecimento técnico continuam sendo fundamentais para guiar as decisões de design e garantir que o código final atenda aos requisitos de qualidade.
Dev+ Eficiente
Se você gostou deste conteúdo, conheça a Jornada Dev + Eficiente, nosso treinamento focado em fazer com que você se torne uma pessoa cada vez mais capaz de entregar software que gera valor na ponta final, com máximo de qualidade e eficiência.
Acesse https://deveficiente.com/oferta-20-por-cento para conhecer tudo que oferecemos.
Top comments (1)
Some comments may only be visible to logged-in visitors. Sign in to view all comments.