Introducción: por qué el code review no se trata de "encontrar errores"
\nEl code review (revisión de código) no es solo una formalidad o una forma de encontrar errores tipográficos. En el desarrollo moderno con JavaScript y Node.js, es la herramienta principal para mantener la calidad del código, compartir conocimientos en el equipo y prevenir la deuda técnica. Sin embargo, muchos desarrolladores reducen la revisión a verificar la sintaxis, pasando por alto problemas arquitectónicos, rendimiento y legibilidad.
\nEn este artículo, analizaremos qué revisar exactamente en el código JavaScript (usando Node.js como ejemplo) y cómo dar retroalimentación para no ofender a un colega, sino ayudarlo a crecer. Ejemplos prácticos de código ayudarán a afianzar el material.
\n\n1. Qué revisar en el código JavaScript: lista de verificación práctica
\nComencemos con puntos de verificación concretos. Los dividiremos en tres niveles: sintaxis/estilo, lógica/seguridad y arquitectura.
\n\n1.1. Estilo de código y formato
\nAquí es simple: use un linter (ESLint) y un formateador (Prettier). En la revisión no debería haber discusiones sobre espacios. Configure los archivos de configuración en el proyecto una vez. Verifique que:
\n- \n
- El código cumpla con las reglas de
eslint-config-airbnbo sus configuraciones personalizadas. \n - No haya
console.loginnecesarios (a menos que sea modo de desarrollo). \n - Los nombres de las variables tengan sentido:
const userData, noconst x. \n
1.2. Lógica de trabajo con asincronía (Promise, async/await)
\nEsta es un área común de errores en Node.js. Verifique:
\n- \n
- El manejo de errores en funciones asíncronas. La falta de
try/catchpuede provocar la caída del proceso. \n - El uso correcto de
awaitdentro de bucles. Si las tareas no dependen entre sí, usePromise.all. \n
Mal:
\n// Ejecución secuencial, aunque podría ser paralela\nconst results = [];\nfor (const id of ids) {\n const data = await fetchData(id); // Esperamos cada solicitud\n results.push(data);\n}\n\nBien:
\n// Ejecución paralela\nconst promises = ids.map(id => fetchData(id));\nconst results = await Promise.all(promises);\n\n\n1.3. Seguridad y fugas de memoria
\nPara Node.js es crítico:
\n- \n
- Ausencia de inyecciones: no use
evalonew Functiona menos que sea estrictamente necesario. \n - Cierre de flujos (streams), conexiones a la base de datos y descriptores de archivos. \n
- Validación de datos de entrada. Nunca confíe en el cuerpo de la solicitud (
req.body). \n
2. Cómo dar retroalimentación: psicología y táctica
\nIncluso la lista de verificación perfecta no funcionará si la retroalimentación (feedback) hace que el autor del código quiera cerrar el PR y renunciar. Aquí hay algunas reglas.
\n\n2.1. La regla del "sándwich" (opcional pero efectiva)
\nComience con un comentario positivo, luego señale el problema y termine con apoyo. Por ejemplo:
\n- \n
- "¡Excelente solución usando
Mappara el almacenamiento en caché!" \n - "Sin embargo, aquí hay un problema potencial con la mutación del array original. Usemos
.map()en lugar de.forEach()con push." \n - "Por lo demás, el código está limpio, ¡gracias por la rápida corrección!" \n
2.2. Comente el código, no a la persona
\nEn lugar de "Escribiste un bucle horrible", diga "Este bucle se puede reemplazar con Array.reduce para mejorar la legibilidad". Evite el pronombre "tú" en un contexto negativo.
2.3. Proporcione contexto y alternativas
\nSimplemente escribir "Esto está mal" es malo. Explique por qué y sugiera una alternativa. Ejemplo de mal comentario:
\n"No uses var."\n
Buen comentario:
\n"Aquívarcrea una variable en el ámbito global, lo que puede provocar errores. Cambiémoslo porconst, ya que el valor no se reasigna."