42 commits em uma sessão e eu não revisei nenhum
42 commits em uma sessão e eu não revisei nenhum
42 次提交,一次会话,我一次都没审查
Disclaimer: Este texto foi inicialmente concebido pela IA Generativa em função da transcrição de um vídeo do canal Dev Eficiente, apresentado por Alberto Souza. Se preferir acompanhar por vídeo, é só dar o play. 免责声明: 本文最初由生成式人工智能根据 Alberto Souza 在 Dev Eficiente 频道发布的视频转录而成。如果您更喜欢观看视频,请直接点击播放。
Introdução: Nos últimos meses codei um sistema de ponta a ponta, em parceria com uma empresa que queria colocar um produto no ar. Fiz tudo com Claude Code, em sessões longas de trabalho, que variaram de duas horas e meia a quatro horas. Na última sessão, de pouco mais de quatro horas em auto mode, o agente fez 42 commits na main e codou um módulo inteiro, com oito casos de uso, que saiu quase totalmente funcional. Fiz um único ajuste, em um dos casos de uso. 引言: 在过去的几个月里,我与一家希望上线产品的公司合作,从头到尾编写了一个系统。我全程使用 Claude Code,在两到四个小时不等的长会话中完成。在最后一次四个多小时的“自动模式”(auto mode)会话中,AI 代理在主分支(main)上进行了 42 次提交,并编写了一个包含八个用例的完整模块,且几乎完全可用。我只对其中一个用例做了一次微调。
Este é o primeiro texto de uma série sobre esse produto. Aqui eu conto como estruturei o ambiente, como conduzi cada iteração e quais decisões tomei ao longo do caminho. Nos próximos, entro na qualidade do código que saiu desse fluxo, no que eu inspecionei e no que eu não inspecionei. Uma dessas decisões atravessa o texto inteiro e merece ser dita logo de início: eu não revisei o código gerado. O esforço foi todo para a entrada. 这是关于该产品系列文章的第一篇。在这里,我将讲述如何构建环境、如何进行每次迭代以及沿途做出的决策。在接下来的文章中,我将深入探讨该流程产出的代码质量,以及我检查了什么、没检查什么。其中一个贯穿全文的决定值得在开头就说明:我没有审查生成的代码。所有的精力都花在了输入端(提示词和上下文)。
O sistema: O produto é composto por três serviços. Um core em Java, que concentra as regras do negócio. Um agente em JavaScript, construído com o SDK do Claude Code, que sustenta as conversas com o usuário e o uso de tools padrões e customizadas. E um front-end em React, sem nada fora do padrão. Ao final da última sessão, o back-end estava com pouco mais de 1300 testes e o agente com pouco mais de 800. Volto a esses testes mais adiante, porque eles têm um papel curioso nessa história. 系统架构: 该产品由三个服务组成。一个基于 Java 的核心服务,集中处理业务规则;一个使用 Claude Code SDK 构建的 JavaScript 代理,负责维持用户对话以及调用标准和自定义工具;以及一个标准的 React 前端。在最后一次会话结束时,后端拥有 1300 多个测试,代理拥有 800 多个测试。我稍后会回到这些测试,因为它们在这个故事中扮演着有趣的角色。
Vale dizer também o que esse projeto não é. Não é um experimento controlado. É um sistema que vai para o ar, que pessoas vão usar, e que já recebeu feedback de quem estava testando dentro da empresa parceira. A gente iterou em cima desse feedback para ir deixando o produto mais certo. 还需要说明的是,这个项目并非受控实验。这是一个即将上线、供人使用的真实系统,并且已经收到了来自合作伙伴公司内部测试人员的反馈。我们根据这些反馈进行了迭代,以使产品更加完善。
Como conduzi cada iteração: A primeira parte do sistema tinha dez casos de uso, e eu fiz um por um. A segunda parte tinha oito casos de uso principais, que na ponta do lápis viram uns quinze ou dezesseis quando se contam os menores. E foi essa segunda parte que o agente codou inteira em quatro horas. Para chegar lá, mantive uma pasta com o contexto de cada iteração. Foram quinze iterações no total, e a última, que gerou o módulo inteiro, concentrou bastante contexto. 我是如何进行每次迭代的: 系统第一部分有十个用例,我是一个接一个完成的。第二部分有八个主要用例,算上细分功能,总数大约有十五或十六个。正是这第二部分,代理在四个小时内全部编写完成。为了实现这一点,我维护了一个包含每次迭代上下文的文件夹。总共进行了十五次迭代,最后一次生成整个模块的迭代集中了大量的上下文信息。
O padrão que segui em todas foi o mesmo. Primeiro, eu entrego o contexto. Em geral é composto por arquivos explicando o que é necessário com a linguagem da empresa. Segundo, peço que ele leia tudo e me diga o que entendeu, sem fazer nada ainda. Ele descreve o que leu, aponta como aquilo se encaixa no que já existe e lista os pontos em aberto. 我在所有迭代中遵循的模式都是一样的。首先,我提供上下文。通常由解释需求的文件组成,并使用公司内部的术语。其次,我要求它阅读所有内容并告诉我它的理解,此时不进行任何操作。它会描述所读内容,指出其如何融入现有架构,并列出待解决的问题。
Terceiro, peço que, antes de partirmos para o planejamento, ele me diga quais perguntas quer ver respondidas. Ele gera um arquivo com uma rodada de perguntas e eu respondo uma a uma. Teve pergunta que eu não entendi e pedi que ele explicasse melhor. Teve pergunta que me fez perceber que eu mesmo não estava entendendo o módulo direito. Isso vira uma segunda rodada, uma terceira, uma quarta. Um sinal simples de que a conversa está convergindo é a barra de rolagem do arquivo ficando cada vez menor a cada rodada. 第三,在开始规划之前,我要求它提出想要解答的问题。它会生成一个包含一轮问题的文档,我逐一回答。有些问题我没听懂,就要求它进一步解释;有些问题让我意识到连我自己都没完全理解该模块。这会演变成第二轮、第三轮甚至第四轮对话。对话正在收敛的一个简单信号是:随着每一轮的进行,文件的滚动条变得越来越短。
Quarto, quando as dúvidas acabam, mando um prompt curto: pode seguir até o final da implementação, confio em você. E deixo rodando. Esse bate-bola de perguntas e respostas não é invenção minha. A própria Anthropic recomenda esse tipo de rodada com o agente. Faço bastante isso porque, do meu ponto de vista, o agente é o time que vai executar o trabalho. Entrego o contexto e pergunto: quais dúvidas você tem para fazer isso direito? 第四,当疑问消除后,我发送一个简短的提示词:“可以继续完成实现,我相信你。”然后让它运行。这种问答互动并非我的发明,Anthropic 本身就建议与代理进行这种轮次的沟通。我经常这样做,因为在我看来,代理就是执行工作的团队。我提供上下文并问:“为了正确完成这项工作,你有什么疑问吗?”
Não vou dizer que existe um prompt certo nem um playbook para trabalhar com Claude Code, Codex ou qualquer outra ferramenta do gênero. Acho que não existe. O que eu faço é ler a documentação da ferramenta que mais uso, ler os materiais publicados pela Anthropic e pela OpenAI, que são as referências, e formar a minha opinião. E a minha opinião cabe em uma frase: dá contexto, tira as dúvidas, solta para o jogo. 我不会说使用 Claude Code、Codex 或任何类似工具存在所谓的“正确提示词”或“操作手册”。我认为不存在。我所做的是阅读我最常使用的工具的文档,阅读 Anthropic 和 OpenAI(这些参考源)发布的材料,并形成我自己的观点。我的观点可以用一句话概括:提供上下文,消除疑问,放手让它去干。
O agente como o time que eu liderava: A maneira como eu entendo o uso de um agente de código hoje me lembra muito a maneira como eu lidava com as equipes que liderei. Eu sempre liderei com um viés técnico. O que as pessoas estavam fazendo, em alguma escala, eu era capaz de fazer. Não tudo, tinha coisa que eu não tinha ideia de como resolver. Mas em tudo que eu sabia fazer, eu tentava entender se elas estavam fazendo melhor ou pior do que eu queria. 将代理视为我领导的团队: 我今天理解使用代码代理的方式,非常像我过去管理团队的方式。我一直是以技术导向进行领导的。团队成员在做的事情,在某种程度上,我也有能力完成。虽然不是全部,有些东西我也不知道怎么解决。但在我力所能及的范围内,我会尝试评估他们做得比我预期的更好还是更差。
O meu papel era trazer o time, inicialmente, para o nível que eu considerava adequado. Depois disso, as pessoas iam estudar, praticar, refletir e, eventualmente, estavam trabalhando com bastante autonomia. Para mim, era assim que fazia sentido ter um time: um grupo de pessoas que em algum momento seria mais eficiente do que eu sozinho. 我的角色是首先将团队提升到我认为合适的水平。之后,成员们会通过学习、实践、反思,最终实现高度自主工作。对我来说,这就是团队的意义所在:一群在某个时刻比我单打独斗更高效的人。
Com o agente é a mesma coisa. Ele é o time, só que uma máquina. Ele foi treinado em muitas práticas de como fazer as coisas, e o modelo por baixo vai fazer as análises e gerar os próximos passos. O que eu preciso fazer é direcionar: dizer o que eu acho importante, o que eu quero e o que eu não quero. Uma vez direcionado, o meu papel é não atrapalhar. 对于代理来说也是一样。它就是团队,只不过是一台机器。它接受过许多实践训练,底层的模型会进行分析并生成后续步骤。我需要做的是引导:告诉它我认为什么是重要的,我想要什么,以及我不想要什么。一旦指明方向,我的角色就是不要去干扰它。
Claro, se tiver alguma restrição forte, preciso fazer de tudo para ser respeitada. Por isso não fiquei escrevendo especificações à mão. Usei o plugin Superpowers, que gera especificação, plano de execução e registra a saída de cada execução. Não parei para inspecionar os detalhes do que ele gerou. Se eu tivesse feito sem o plugin, teria chegado no mesmo resultado? Acredito que sim. Mas esse é um experimento que não vou fazer, porque não vou gerar tudo de novo para comparar. 当然,如果有严格的限制,我必须确保其得到遵守。这就是为什么我没有手动编写规范。我使用了 Superpowers 插件,它能生成规范、执行计划并记录每次执行的输出。我没有停下来去检查它生成的细节。如果我不使用插件,能达到同样的结果吗?我相信可以。但这实验我不会做,因为我不会为了比较而重新生成一遍。
A decisão de não revisar: Chegamos ao ponto central. Nesse produto eu não revisei o código. Mal olhei o que estava sendo gerado. Eu testava a funcionalidade como usuário, liberava para a empresa parceira testar e seguia para a próxima iteração. A resposta comum para essa decisão é que o gargalo está na revisão e que a… 关于不审查的决定: 我们来到了核心点。在这个产品中,我没有审查代码。我几乎没看它生成了什么。我以用户的身份测试功能,发布给合作伙伴公司进行测试,然后继续进行下一次迭代。对于这个决定的常见回应是:瓶颈在于审查,而……