Na semana passada estive numa imersão presencial, uma hack week, com o time de produto onde sou Engineering Manager. Somos um time global e distribuído remotamente, então foi divertido ver todos reunidos, e principalmente assustar os gringos com histórias (reais) do Brasil.
Mais interessante que essa experiência antropológica, no entanto, foi observar as mudanças paradigmáticas do processo de desenvolvimento de software. No último team retreat que fizemos, em Janeiro de 2024, o modelo mais avançado do ChatGPT era o 4 turbo, não havia Cursor e o Claude Code nem sonhava em nascer. Sendo assim, foi a primeira vez que vi uma equipe de 10 pessoas cooperar com as IAs não mais na qualidade de coadjuvantes, mas de protagonistas.
Compartilhei em detalhes essa experiência em meu canal no YouTube:
Voltando para casa e refletindo sobre essa semana intensa, gravei o vídeo acima e gostaria de expandir um pouco o assunto, uma vez que algo ficou claro para mim: chegou a hora de programar para a IA.
Antes dos adventos dos agentes, o uso tradicional da IA generativa (quase que exclusivamente através do ChatGPT) era como um substituto do Stack Overflow. Se você programa há mais de 3 anos, certamente deve muito a esse site. O fluxo normal durante o desenvolvimento era o seguinte: copiar e colar uma mensagem de erro, jogar no Google, torcer para alguém já ter tido o mesmo problema e que uma boa alma tenha ajudado a resolver. À medida que os modelos foram evoluindo, tornou-se possível criar scripts personalizados, copiar e colar código do seu editor, pedir para o ChatGPT melhorar algo aqui e ali, e copiar e colar de volta. Só isso já parecia mágica.
Porém, quando ferramentas como o Cursor e o Claude Code trouxeram os agentes de IA para dentro das IDEs (ou terminal), tudo ficou ainda mais conveniente. Não é mais necessário copiar e colar, com alguns comandos você adicionar contexto à sua pergunta, e os modelos podem executar tarefas de forma autônoma: buscar mais informação na base de código, buscar a documentação mais atualizada na web, criar arquivos, executar comandos… a integração ficou tão perfeita que termos como vibe coding deixaram de ser piada e viraram realidade.
Tudo que você precisa saber sobre Vibe Coding
Não é novidade para ninguém que a popularização da Inteligência Artificial chacoalhou muitos setores da sociedade; em especial, aqueles que trabalham com tecnologia tem sido fortemente afetados.
Pois bem, inspirado pelo excelente artigo Field Notes From Shipping Real Code With Claude, planejei nossa hack week presencial de modo que pudéssemos tirar o máximo de proveito desse novo paradigma de desenvolvimento.
O plano para a semana seria realizar um brainstorming na segunda, eleger alguns projetos e trabalhar neles até sexta, quando realizaríamos as apresentações. Não havia tema específico: o único requisito era conseguir encaixar um deliverable dentro desse período.
Como exemplo, um dos projetos escolhido foi desenvolver uma CLI – comandos que pudéssemos executar do terminal para nos ajudar principalmente em testes: criar usuários, atualizar perfil, esse tipo de coisa. Ora, como as IAs são notoriamente boas em seguir padrões, o plano então foi discutir a arquitetura, decidir como a CLI funcionaria, criar o primeiro comando e a partir dali estender as funcionalidades com o Claude Code servindo de motor principal.
Claude Code é caro, caótico mas divertido
Quando a Anthropic anunciou sua nova CLI, o Claude Code, eu não fiquei nem um pouco empolgado. Sinceramente, não entendi o sentido. Por que programar via CLI se já temos algo decente dentro de uma IDE completa como o Cursor?
O resultado? Ao final desses dias intensos, não só a CLI foi tirada do papel, como implementamos um total de 19 comandos, todos integrados com o banco de dados (de testes, para que pudéssemos acelerar o desenvolvimento sem risco de afetar o ambiente de produção), além de permitirmos a distribuição via GitHub Releases, instalável via homebrew, e autenticável utilizando uma API key integrada diretamente no backend. Tudo isso foi feito em paralelo com outros 4 ou 5 projetos.
Evidente que uma parte grande do sucesso da hack week foi estarmos todos imersos e juntos, de modo que o trabalho fluía de modo bem mais rápido. Mas isso eu já sabia que aconteceria. O que eu ainda não tinha dimensão era de como programar para a IA, e não com a IA, teria um impacto tão grande na produtividade do time.
Mas existem detalhes muito importantes para que isso seja possível. Em primeiro lugar, é cada vez mais fundamental que o stack técnico seja end-to-end type-safe. Ou seja: tipado em todas as pontas: banco de dados, backend e frontend. Nesse projeto, alcançamos isso com um backend TypeScript utilizando oRPC, um query builder chamado Kysely, e um CLI builder chamado citty.
A importância principal de um stack end-to-end type safe é que os agentes de IA conseguem distinguir quais os tipos dos requests e responses feitos entre cada integração no sistema. Em sistemas complexos a maior fragilidade está na interface entre seus módulos. Uma vez que essa interface é tipada, a IA consegue de forma autônoma entender como se comunicar, e qualquer erro cometido é facilmente autocorrigido ao se rodar um type check.
Note que ao ser capaz de se autocorrigir sempre que houver um erro de compilação, reduz-se drasticamente a relevância das alucinações da IA, ou seja, de quando ela invoca um método, função, variável, etc, que não existe no código. Esse problema, que era fundamental e grave quando o ChatGPT se popularizou, hoje está praticamente resolvido. Isso pois o agente não irá terminar o trabalho se propriamente instruído a verificar todos os type errors, e qualquer alucinação nesse caso será capturada.
Além de um zelo maior com a tipagem do código, também é necessário um conjunto de instruções bem definido para os agentes. No nosso caso, como utilizamos primariamente o Claude Code, isso é feito através de um arquivo chamado CLAUDE.md
. Esse markdown descreve todas as boas práticas que o agente deve seguir, comandos a serem executados, descrição da arquitetura do código, etc.1
Combinando um brainstorming bem feito com a definição das melhoras ferramentas para a tarefa, um stack que permita à IA se autocorrigir através de linters e type checks, e um conjunto de instruções inicial que orquestre tudo isso, é incrível como os agentes conseguem ser autônomos e realizar tarefas muitas vezes de forma one-shot, ou seja, com uma única instrução. Não era incomum observar o Claude Code trabalhar por 10 minutos ininterruptos, escrevendo código, lendo o contexto, autocorrigindo-se, até finalmente devolver a bola para o programador.
Sendo assim, a impressão que fiquei é que é preciso programar com a IA em mente. Ela não deve mais ser uma assistente que ajuda em tarefas isoladas (“revise essa função para mim”, “reescreva esse código em TypeScript”, “adicione testes a esse arquivo”), mas o driver principal do desenvolvimento de código.
É cada vez mais indispensável que a codebase apresente bons padrões de programação, e que o software seja extremamente bem arquitetado. Isso não exime a sua responsabilidade como humano, mas reforça-a.
Evidentemente que essa mudança de paradigma traz consequências importantes: é cada vez mais indispensável que a codebase apresente bons padrões de programação, e que o software seja extremamente bem arquitetado. Isso não exime a sua responsabilidade como humano, mas reforça-a. Mais do que nunca, o que irá te diferenciar não é sua capacidade de gerar código, mas de arquitetar o sistema.
Gostaria de frisar que embora esse projeto em particular tenha sido parte de uma hack week, essa abordagem como um todo é aplicável a qualquer contexto, mesmo aqueles que demandam padrões rigorosos de controle de qualidade. Veja: não estou falando de algo que se aplique apenas a um programador solo ou a um projetinho de final de semana, mas também a uma empresa com um processo formal de desenvolvimento, múltiplos engenheiros e milhões de usuários.
Por fim, é claro que você é livre para escolher não utilizar tais ferramentas de IA – entendo que muitos ainda possuem certa resistência. Se esse é seu caso, é possível que você tenha ficado até um pouco ofendido com minha proposta de programar para a IA primeiro. O meu ponto é que, dado que você aceite o auxílio dessas ferramentas no seu dia a dia, é absolutamente natural tentar extrair o máximo delas.
Toda essa reflexão me deixa ainda mais confiante do que tenho cansado de repetir a quem me acompanha por aqui ou no YouTube: cada vez mais temos que trazer o aspecto humano para a programação, usar aquilo que nos diferencia das máquinas: capacidade de abstração, validação, planejamento, etc. Deixemos a execução para elas, facilitemos o seu trabalho ao máximo, mas não esqueçamos que supervisionar o desenvolvimento, como um maestro que rege uma orquestra, é algo que jamais deveremos abrir mão.
Novamente recomendo a leitura do artigo Field Notes From Shipping Real Code With Claude para exemplos reais de como utilizá-lo da melhor forma.