Introdução: por que code review não é sobre "encontrar bugs"
\nCode review (revisão de código) não é apenas uma formalidade ou uma forma de encontrar erros de digitação. No desenvolvimento moderno com JavaScript e Node.js, é a principal ferramenta para manter a qualidade do código, compartilhar conhecimento na equipe e prevenir dívida técnica. No entanto, muitos desenvolvedores reduzem a revisão à verificação de sintaxe, perdendo de vista problemas arquitetônicos, desempenho e legibilidade.
\nNeste artigo, vamos abordar o que exatamente verificar no código JavaScript (usando Node.js como exemplo) e como dar feedback de forma a não ofender um colega, mas sim ajudá-lo a crescer. Exemplos práticos de código ajudarão a fixar o conteúdo.
\n\n1. O que verificar no código JavaScript: checklist prático
\nVamos começar com pontos específicos de verificação. Vamos dividi-los em três níveis: sintaxe/estilo, lógica/segurança e arquitetura.
\n\n1.1. Estilo de código e formatação
\nAqui é simples: use um linter (ESLint) e um formatador (Prettier). Na revisão, não deve haver discussões sobre espaços. Configure os arquivos de configuração no projeto uma vez. Verifique se:
\n- \n
- O código segue as regras do
eslint-config-airbnbou suas configurações personalizadas. \n - Não há
console.logdesnecessários (a menos que seja modo de desenvolvimento). \n - Os nomes das variáveis são significativos:
const userData, nãoconst x. \n
1.2. Lógica de trabalho com assincronia (Promise, async/await)
\nEsta é uma área frequente de erros em Node.js. Verifique:
\n- \n
- Tratamento de erros em funções assíncronas. A ausência de
try/catchpode causar a queda do processo. \n - Uso correto de
awaitdentro de loops. Se as tarefas não dependem umas das outras, usePromise.all. \n
Ruim:
\n// Execução sequencial, embora pudesse ser paralela\nconst results = [];\nfor (const id of ids) {\n const data = await fetchData(id); // Aguarda cada requisição\n results.push(data);\n}\n\nBom:
\n// Execução paralela\nconst promises = ids.map(id => fetchData(id));\nconst results = await Promise.all(promises);\n\n\n1.3. Segurança e vazamentos de memória
\nPara Node.js é crítico:
\n- \n
- Ausência de injeções: não use
evalounew Functionsem necessidade urgente. \n - Fechamento de streams, conexões com banco de dados e descritores de arquivo. \n
- Validação de dados de entrada. Nunca confie no corpo da requisição (
req.body). \n
2. Como dar feedback: psicologia e tática
\nMesmo uma lista de verificação perfeita não funcionará se o feedback fizer o autor do código querer fechar o PR e pedir demissão. Aqui estão algumas regras.
\n\n2.1. Regra do "sanduíche" (opcional, mas funciona)
\nComece com um comentário positivo, depois aponte o problema e termine com apoio. Por exemplo:
\n- \n
- "Ótima solução usando
Mappara cache!" \n - "No entanto, aqui há um problema potencial com a mutação do array original. Vamos usar
.map()em vez de.forEach()com push." \n - "No restante, o código está limpo, obrigado pela correção rápida!" \n
2.2. Comente o código, não a pessoa
\nEm vez de "Você escreveu um loop horrível", diga "Este loop pode ser substituído por Array.reduce para melhorar a legibilidade". Evite o pronome "você" em contextos negativos.
2.3. Dê contexto e alternativas
\nApenas escrever "Isso está errado" é ruim. Explique por que e sugira uma alternativa. Exemplo de comentário ruim:
\n"Não use var."\n
Bom comentário:
\n"Aqui,varcria uma variável no escopo global, o que pode causar bugs. Vamos substituir porconst, já que o valor não é reatribuído."