
Engenharia de Software
Escopo, evidências, comunicação, testes e aprendizado em revisões de código.
Uma mudança não está pronta apenas porque o código foi escrito. Ela está pronta quando o time possui contexto e evidências suficientes para compreender, revisar e assumir responsabilidade pelo que será entregue.
Revisão de código não é caça a estilo. É uma decisão de engenharia antes do merge.
Mas essa decisão não acontece somente quando alguém abre a aba Files changed. Ela começa na forma como o problema é explicado, passa pelo tamanho da mudança, pela qualidade dos testes e pela clareza da conversa entre autor e reviewers.
Durante minhas contribuições ao projeto open source awslabs/aidlc-workflows, tive Pull Requests incorporados ao projeto e acompanhei revisões detalhadas, com mais de uma rodada de ajustes em alguns casos.
O principal aprendizado não foi uma técnica específica. Foi perceber que um bom review depende de disciplina dos dois lados:
Este artigo reúne as práticas que mais se destacaram nessas contribuições.
Um Pull Request conecta diferentes perspectivas:
Por isso, ele não deveria ser apenas um pacote de arquivos aguardando aprovação.
Um PR profissional precisa permitir que outra pessoa responda, sem depender de uma reunião paralela:
Quando esse contexto não está presente, o reviewer precisa reconstruir a intenção a partir do código. Isso aumenta o tempo de revisão e também o risco de interpretar a mudança de forma incorreta.
O Google Engineering Practices apresenta o Code Review como um mecanismo para melhorar continuamente a saúde do código, sem exigir que cada mudança seja perfeita. Essa ideia ajuda a equilibrar qualidade e progresso: o objetivo é melhorar o sistema com segurança, não transformar cada PR em uma revisão infinita de toda a aplicação.
O guia Small CLs, do Google Engineering Practices explica que mudanças pequenas e simples tendem a ser revisadas mais rapidamente e com maior profundidade, além de serem menos propensas a introduzir bugs e mais fáceis de integrar.
Mas “pequena” não significa apenas ter poucas linhas.
Uma mudança revisável normalmente:
A pergunta mais útil não é:
Quantas linhas foram modificadas?
É:
Quantas decisões diferentes o reviewer precisa compreender para aprovar esta mudança?
Um PR com poucas linhas pode alterar uma regra importante. Outro, maior, pode ser uma atualização mecânica. O tamanho deve ser avaliado junto com o risco e a quantidade de decisões envolvidas.
O trabalho do autor não termina quando o código compila.
Um bom Pull Request prepara o caminho para a revisão. A descrição pode incluir:
Um modelo simples:
## Problema
O que estava acontecendo?
## Mudança
O que foi alterado e por quê?
## Como validar
- Testes automatizados:
- Verificação manual:
- Evidências:
## Riscos e limitações
- Risco residual:
- O que não foi validado:
- Follow-ups:
Uma das melhores práticas que observei nas discussões foi a transparência sobre validação.
Em vez de afirmar genericamente que “todos os testes passaram”, é melhor registrar:
Evidência profissional também inclui dizer claramente o que ainda não foi verificado.
O guia What to look for in a code review, do Google Engineering Practices orienta o reviewer a avaliar design, funcionalidade, complexidade, testes, nomenclatura, comentários, estilo, documentação e o contexto mais amplo da mudança.
Um comentário útil responde a três perguntas:
issue: existe um problema;suggestion: há uma melhoria possível;question: o reviewer precisa de contexto;nitpick: detalhe não bloqueante;blocking: precisa ser resolvido antes do merge;non-blocking: pode ser tratado depois.Exemplo:
issue (blocking): este comando depende de o usuário estar em outro diretório,
mas a documentação não informa essa mudança de contexto.
Ao seguir os passos literalmente, o comando falha. Antes do merge, indique
explicitamente em qual diretório ele deve ser executado.
Compare com:
Isso está errado.
O primeiro comentário cria uma base objetiva para a correção. O segundo transfere para o autor o trabalho de descobrir o problema e a expectativa do reviewer.
O padrão Conventional Comments ajuda a diferenciar tipos de feedback:
issue: existe um problema;suggestion: há uma melhoria possível;question: o reviewer precisa de contexto;nitpick: detalhe não bloqueante;blocking: precisa ser resolvido antes do merge;non-blocking: pode ser tratado depois.O valor desses rótulos não está na formalidade. Está em reduzir ambiguidade.
Quando o time não diferencia gravidade, qualquer comentário pode virar uma negociação longa.
Uma classificação simples pode ajudar:
| Nível | Significado | Bloqueia? |
|---|---|---|
| P0 | risco crítico imediato | sim |
| P1 | bug ou risco relevante | sim |
| P2 | problema importante | depende |
| P3 | melhoria | normalmente não |
| Nit | preferência local | não |
Essa nomenclatura não é universal. Cada organização pode usar outra.
O importante é o reviewer deixar claro:
Isso evita dois extremos:
Uma das práticas mais valiosas que observei foi reproduzir os findings antes de responder.
O fluxo pode ser:
Uma resposta forte não precisa ser longa, mas deve ser verificável:
## Reprodução
Consegui reproduzir o comportamento no commit indicado.
## Causa
A mudança não considerava o cenário em que...
## Correção
Ajustei...
## Validação
- Teste adicionado:
- Regressões executadas:
- Limitação ainda existente:
Essa prática muda o tom da conversa.
Em vez de:
“Acho que isso não acontece.”
A resposta passa a ser:
“Reproduzi o cenário, identifiquei a causa e adicionei uma verificação para impedir a regressão.”
Também é importante admitir quando a primeira solução estava incompleta. Em revisões maduras, mudar de direção depois de uma boa evidência não é fraqueza. É engenharia.
Selecionei três Pull Requests já mergeados porque eles representam aprendizados diferentes e complementares.
No PR #642, a proposta adicionava às instruções de instalação um passo que estava faltando: clonar o repositório e acessar a branch correta.
A primeira mudança resolvia o problema principal, mas o review identificou outros pontos dentro do mesmo fluxo:
A lição não é apenas sobre documentação.
Revise o caminho que a pessoa percorre, não apenas o parágrafo modificado.
Uma alteração pode estar correta isoladamente e ainda falhar quando alguém segue o processo completo.
Boas perguntas para esse tipo de review:
No PR #644, uma parte do processo que dependia de cálculo em texto foi transformada em uma execução previsível e testável.
O Pull Request passou por várias rodadas de review. Os comentários encontraram problemas diferentes ao longo do tempo:
O aprendizado mais importante foi o processo:
A aprovação deve considerar a versão atual do PR, não apenas a versão que iniciou a conversa.
Esse caso também mostrou que Code Review não é uma etapa única. Em mudanças relevantes, cada rodada pode revelar uma nova camada: primeiro o comportamento principal, depois os casos de borda, depois a integração com o estado mais recente do repositório.
No PR #645, a proposta corrigia uma divergência entre documentação e o local real de determinados artefatos.
Durante o review, algumas frases foram consideradas amplas demais. A documentação dizia, em essência, que algo “nunca” acontecia em determinado local, mas havia uma exceção legítima. Também descrevia reutilização onde o comportamento real era de atualização e sobrescrita.
Em outra rodada, o changelog foi revisado porque parecia descrever uma mudança de runtime que, na prática, nunca havia existido daquela forma.
A boa prática aprendida foi:
Antes de fortalecer uma afirmação, siga o comportamento real do sistema.
Palavras como estas merecem cuidado:
Documentação e changelog fazem parte da entrega. Eles precisam descrever exatamente o que mudou, sem diminuir a importância da contribuição e sem prometer mais do que ela realiza.
Esse PR também mostrou uma boa decisão de escopo: um problema relacionado, mas maior, foi separado em uma issue própria em vez de ampliar indefinidamente a mudança atual.
Um bom review melhora o PR sem transformar cada finding em obrigação de resolver todo o sistema.
Apesar de tratarem de problemas diferentes, as melhores práticas se repetiram.
O reviewer conseguia comparar a proposta com o comportamento esperado.
Os comentários eram acompanhados de caminhos, exemplos, comandos ou cenários reproduzíveis.
Os reviews deixavam claro o que precisava mudar antes do merge e o que poderia virar follow-up.
As correções eram explicadas a partir do comportamento observado, não apenas de opinião.
Quando um teste completo não podia ser executado localmente, isso era registrado.
Código, testes, documentação, changelog e arquivos gerados eram tratados como partes da mesma mudança.
O PR era reavaliado quando a branch base mudava, porque o contexto de integração também muda.
Em desenvolvimento assistido por IA, boas práticas não deveriam depender apenas de instruções repetidas em cada conversa.
O Amazon Q Developer permite manter regras em arquivos Markdown dentro de:
Essas regras podem ser usadas como contexto nas conversas do projeto, conforme a documentação oficial sobre project rules.
Exemplo:
# Pull Requests
- Mantenha uma intenção principal por PR.
- Explique o comportamento anterior e o comportamento esperado.
- Registre testes executados e limitações de ambiente.
- Diferencie comentários bloqueantes de sugestões.
- Findings reproduzidos devem gerar teste de regressão quando aplicável.
- Não declare uma garantia maior do que a implementação demonstra.
Isso ajuda agentes e pessoas a trabalharem com os mesmos princípios.
Mas há uma distinção importante:
Regras orientam. Checks automatizados verificam. Reviewers exercem julgamento.
Uma regra pode pedir testes. O CI confirma se eles passam. Uma regra pode pedir documentação. O reviewer avalia se ela está correta e suficiente.
A abordagem do AI-DLC reforça essa combinação entre assistência da IA, artefatos persistentes e validação humana.
Um bom Pull Request não é aquele que recebe aprovação rapidamente ou que não recebe comentários.
É aquele que permite uma decisão de merge consciente.
As contribuições ao awslabs/aidlc-workflows reforçaram para mim que boas revisões dependem de:
Code Review profissional não é uma disputa entre autor e reviewer. É uma investigação colaborativa para reduzir incerteza antes do merge.
Quando essa cultura existe, o review deixa de ser uma cerimônia de aprovação e se transforma em uma das melhores ferramentas de aprendizado, qualidade e compartilhamento de conhecimento de um time.
As respostas da comunidade chegam em breve.