Introduction : pourquoi la code review ne consiste pas à "trouver des bugs"
\nLa code review (revue de code) n'est pas une simple formalité ou un moyen de trouver des fautes de frappe. Dans le développement moderne en JavaScript et Node.js, c'est l'outil principal pour maintenir la qualité du code, partager les connaissances au sein de l'équipe et prévenir la dette technique. Cependant, de nombreux développeurs réduisent la revue à une vérification de la syntaxe, négligeant les problèmes architecturaux, les performances et la lisibilité.
\nDans cet article, nous allons voir ce qu'il faut exactement vérifier dans le code JavaScript (avec l'exemple de Node.js), et comment donner un retour d'expérience (feedback) sans offenser un collègue, mais en l'aidant à progresser. Des exemples pratiques de code vous aideront à assimiler le contenu.
\n\n1. Que vérifier dans le code JavaScript : une checklist pratique
\nCommençons par des points de vérification concrets. Divisons-les en trois niveaux : syntaxe/style, logique/sécurité et architecture.
\n\n1.1. Style de code et formatage
\nIci, c'est simple : utilisez un linter (ESLint) et un formateur (Prettier). Il ne devrait pas y avoir de débats sur les espaces lors de la revue. Configurez les fichiers de configuration dans le projet une fois pour toutes. Vérifiez que :
\n- \n
- Le code respecte les règles
eslint-config-airbnbou vos paramètres personnalisés. \n - Il n'y a pas de
console.logsuperflus (sauf en mode dev). \n - Les noms de variables sont explicites :
const userData, et nonconst x. \n
1.2. Logique de gestion de l'asynchrone (Promise, async/await)
\nC'est une zone d'erreurs fréquente dans Node.js. Vérifiez :
\n- \n
- La gestion des erreurs dans les fonctions asynchrones. L'absence de
try/catchpeut entraîner un crash du processus. \n - L'utilisation correcte de
awaitdans les boucles. Si les tâches ne dépendent pas les unes des autres, utilisezPromise.all. \n
Mauvais :
\n// Exécution séquentielle alors qu'elle pourrait être parallèle\nconst results = [];\nfor (const id of ids) {\n const data = await fetchData(id); // On attend chaque requête\n results.push(data);\n}\n\nBon :
\n// Exécution parallèle\nconst promises = ids.map(id => fetchData(id));\nconst results = await Promise.all(promises);\n\n\n1.3. Sécurité et fuites de mémoire
\nPour Node.js, il est critique :
\n- \n
- Absence d'injections : n'utilisez pas
evalounew Functionsans nécessité impérieuse. \n - Fermeture des flux (streams), des connexions à la base de données et des descripteurs de fichiers. \n
- Validation des données d'entrée. Ne faites jamais confiance au corps de la requête (
req.body). \n
2. Comment donner un retour d'expérience : psychologie et tactique
\nMême une liste de vérifications idéale ne fonctionnera pas si le feedback donne à l'auteur du code l'envie de fermer la PR et de démissionner. Voici quelques règles.
\n\n2.1. La règle du "sandwich" (facultative mais efficace)
\nCommencez par un commentaire positif, puis indiquez le problème, et terminez par un soutien. Par exemple :
\n- \n
- "Excellente solution avec l'utilisation de
Mappour la mise en cache !" \n - "Cependant, il y a ici un problème potentiel de mutation du tableau d'origine. Utilisons
.map()au lieu de.forEach()avec push." \n - "Pour le reste, le code est propre, merci pour le correctif rapide !" \n
2.2. Commentez le code, pas la personne
\nAu lieu de "Tu as écrit une boucle horrible", dites "Cette boucle peut être remplacée par Array.reduce pour améliorer la lisibilité". Évitez le pronom "tu" dans un contexte négatif.
2.3. Donnez du contexte et des alternatives
\nÉcrire simplement "C'est faux" est mauvais. Expliquez pourquoi et proposez une alternative. Exemple de mauvais commentaire :
\n"N'utilise pas var."\n
Bon commentaire :
\n"Ici,varcrée une variable dans la portée globale, ce qui peut entraîner des bugs. Remplaçons-la parconst, car la valeur n'est pas réaffectée."