Nguyen Le Phong

Une ingénierie bienveillante et efficacePartie 1 sur 5

L'Art de la Revue de Code : Critiquer le Code Sans Blesser les Personnes

La revue de code est le moment où la culture d'équipe se forge ou se brise. Un guide pratique pour réviser le code afin qu'il soit meilleur ET que l'auteur en ressorte plus fort — des formulations concrètes, une checklist pour le relecteur, et les habitudes qui rendent les revues toxiques en silence.

Imaginez la scène : vous ouvrez votre pull request un lundi matin, fier du code le plus propre que vous ayez écrit depuis des mois. Dans l'après-midi, un seul commentaire vous donne envie de redouter chaque déploiement à venir. Non pas parce que le retour était faux — il ne l'était pas — mais à cause de la façon dont il a été formulé. « C'est inutilement complexe. Pourquoi feriez-vous ça ainsi ? » Sept mots. Zéro conseil concret. Et d'une façon ou d'une autre, toute votre semaine en est gâchée.

La revue de code est le rituel à plus fort levier dans toute équipe d'ingénierie. Bien faite, elle livre un meilleur logiciel, fait progresser les ingénieurs plus vite et cimente silencieusement une culture de confiance. Mal faite, elle épuise les gens, ralentit la livraison et pousse vos meilleurs ingénieurs vers des équipes où ils n'ont pas l'impression de se défendre à chaque pull request. Ce guide est consacré à la faire bien — des formulations concrètes, une checklist pour le relecteur, les habitudes qui rendent les revues toxiques en silence, et ce que vous devez faire quand c'est vous qui recevez les commentaires.

La revue de code, c'est la culture — pas seulement la chasse aux bugs

Il existe un malentendu courant sur l'objet de la revue de code. L'objectif technique — trouver les bugs avant qu'ils n'atteignent la production — est réel et précieux. Mais ce n'est qu'une partie de l'histoire.

Chaque commentaire que vous laissez enseigne quelque chose. Il enseigne à l'auteur des choses sur la base de code, sur les compromis, sur les standards auxquels l'équipe tient. Au fil de centaines de revues, vous êtes la mémoire collective de l'équipe, rendue explicite. Les nouveaux ingénieurs apprennent ce que « bon » signifie ici en lisant vos commentaires. Les ingénieurs juniors deviennent seniors en intériorisant les questions que les relecteurs posent systématiquement. Les seniors restent affûtés en articulant le « pourquoi » derrière leurs instincts.

Les revues fixent aussi les normes de manière invisible. Une équipe qui laisse systématiquement des commentaires bienveillants, précis et curieux devient un endroit où il est psychologiquement sûr de livrer quelque chose d'imparfait et d'en tirer des leçons. Une équipe qui laisse des commentaires secs, condescendants ou cryptiques devient un endroit où les gens sur-ingénient en silence pour éviter les critiques, retardent l'ouverture des PRs ou cessent de poser des questions.

Le coût réel d'une culture de revue toxique

Quand les ingénieurs redoutent d'ouvrir des pull requests, ils regroupent le travail en ensembles de changements de plus en plus grands pour minimiser le nombre de revues. Les PRs plus grandes sont plus difficiles à réviser correctement, la qualité des revues baisse, les retours deviennent plus durs, et le cycle s'approfondit. L'antidote n'est pas moins de rigueur — c'est plus de bienveillance à côté de la rigueur.

Rien de tout cela ne signifie que la revue de code doit être molle ou sans mordant. Les relecteurs les plus efficaces sont profondément honnêtes. Ils signalent clairement les problèmes. Ils tiennent la ligne sur ce qui compte vraiment. Mais ils le font d'une manière qui laisse l'auteur avec le sentiment d'avoir gagné un collaborateur, et non affronté un juge.

Ce qu'il faut vraiment réviser — et ce qu'il faut laisser de côté

L'une des erreurs de revue les plus courantes consiste à tout réviser avec le même poids. Le relecteur qui bloque une PR pour une virgule de fin manquante détient le même droit de veto que celui qui signale une injection SQL. Cette asymétrie érode la confiance rapidement. Commencez par être clair dans votre tête sur ce qui compte vraiment :

  • Exactitude : Ce code fait-il ce qu'il est censé faire ? Les cas limites sont-ils gérés ? Pourrait-il échouer en production d'une façon que les tests ne couvrent pas ?
  • Conception : Ce changement s'intègre-t-il naturellement dans l'architecture existante ? Introduit-il un couplage inutile ? Existe-t-il une approche plus simple qui résoudrait le même problème ?
  • Lisibilité : Un coéquipier qui n'a pas écrit ce code le comprendra-t-il dans six mois ? Les noms sont-ils clairs ? Le flux est-il facile à suivre ?
  • Tests : Les tests sont-ils significatifs ? Couvrent-ils le chemin heureux, les cas limites et les modes d'échec ? Un échec de test dirait-il vraiment quelque chose d'utile ?
  • Sécurité : Les entrées utilisateur sont-elles validées ? Cela pourrait-il introduire une fuite de données, une élévation de privilèges ou une injection ? (Si oui, traitez-le comme un bloquant.)

Ce sur quoi il ne faut pas dépenser l'énergie de revue :

  • Le formatage et le style que votre linter ou formateur applique automatiquement. Si votre CI le détecte, vous n'avez pas besoin de le faire. Le créneau de revue humaine est précieux — ne le dépensez pas pour ce qu'une machine gère.
  • Les préférences personnelles qui ne sont pas des standards d'équipe. « J'aurais nommé ça différemment » n'est pas un commentaire de revue. « Ce nom ne correspond pas au langage omniprésent dans le reste du domaine » l'est parfois.
  • Les débats d'architecture dans un fil de commentaires PR. Si vous avez un désaccord fondamental sur la direction, c'est une conversation de conception, pas une revue de code. Ayez-la séparément et de manière collaborative avant que la prochaine PR ne commence.
Un filtre utile

Avant d'écrire un commentaire, demandez-vous : « Si l'auteur faisait exactement ce changement, le code serait-il significativement meilleur ? » Si la réponse est « un peu » ou « peut-être », demandez-vous si ça vaut leur temps et le vôtre. Si la réponse est « oui, et voici pourquoi », écrivez-le — mais écrivez-le avec bienveillance.

Comment formuler les commentaires avec bienveillance — et quand même honnêtement

Le levier le plus important dans la revue de code, c'est le choix des mots. La même préoccupation, exprimée de deux façons différentes, produit des réactions entièrement différentes chez la personne qui la lit. Voici la boîte à outils pratique :

  • Posez des questions plutôt que de rendre des verdicts. « Pourquoi avez-vous choisi X plutôt que Y ici ? » invite à la conversation. « Vous auriez dû utiliser Y » la ferme. La question peut révéler un contexte que vous n'aviez pas — et même si ce n'est pas le cas, l'auteur arrive à la même conclusion sans se sentir accusé.
  • Expliquez le pourquoi, pas seulement le quoi. « Peut-on déplacer cette logique dans un service ? » est moins fort que « Peut-on déplacer cette logique dans un service ? La garder dans le contrôleur rend plus difficile son test en isolation, et nous devrions la dupliquer si un cron job avait jamais besoin du même comportement. » Le pourquoi enseigne ; le quoi se contente de diriger.
  • Proposez une suggestion, pas seulement une critique. Si vous voyez un problème, montrez ce que vous feriez à la place — ou au moins la forme de la solution. « Je ne suis pas sûr, mais quelque chose comme… » est bien plus utile que « ça ne semble pas juste ».
  • Félicitez explicitement le bon code. « Cette gestion des erreurs est vraiment propre — je vais voler ce pattern » prend dix secondes à taper et ne coûte rien. Ça ancre la confiance de l'auteur, ça renforce le pattern comme standard d'équipe, et ça fait mieux atterrir les commentaires critiques quand ils viennent.
  • Utilisez « nous » et « notre » quand c'est honnête. « Notre convention est de garder ceci près du repository » est plus doux que « vous avez mis ça au mauvais endroit » sans être moins précis.

Dur vs bienveillant : le même point, deux façons

Dur (mais techniquement correct) Bienveillant — et quand même honnête
« C'est faux. Vous devez gérer le cas null. » « Ça va lever une exception si user est null — peut-on ajouter une garde ici ou documenter que l'appelant garantit que c'est non-null ? »
« Pourquoi feriez-vous ça ainsi ? C'est inutilement complexe. » « J'ai du mal à suivre — y a-t-il un moyen plus simple d'exprimer ça ? Il me manque peut-être du contexte, heureux d'en discuter si c'est utile. »
« Cette fonction fait trop de choses. Divisez-la. » « Cette fonction gère à la fois la validation et la persistance — séparer ces responsabilités rendrait peut-être chaque partie plus facile à tester indépendamment. Qu'en pensez-vous ? »
« Vous n'avez manifestement pas testé ça. » « Je n'ai pas vu de test pour le cas d'entrée vide — est-ce intentionnel, ou faut-il ouvrir un ticket de suivi pour ça ? »
« Utilisez const ici, pas let. » « nit : const ici puisque la valeur n'est jamais réassignée — l'intention est plus claire. »
« C'est une faille de sécurité. » « bloquant : cette entrée est fournie par l'utilisateur et va directement dans la requête — c'est un risque d'injection. Peut-on la paramétrer avant de merger ? »
« Mauvaise abstraction. » « Je me demande si cette abstraction tire dans la bonne direction — j'ai l'impression qu'elle pourrait rendre la prochaine fonctionnalité plus difficile. Ça vaut une rapide synchronisation ? »

Remarquez ce que la colonne « bienveillant » n'est pas : molle, vague ou malhonnête. Le problème de sécurité est toujours signalé comme bloquant. Le cas null doit toujours être corrigé. La fonction doit toujours être divisée. La bienveillance ici signifie : précis, expliqué, et livré comme une personne qui parle à une autre personne, et non comme un juge qui rend une décision.

Nitpicks, suggestions et bloquants — étiquetez-les

L'une des choses les plus pratiques que vous puissiez faire pour votre culture de revue est d'étiqueter la gravité de chaque commentaire. Sans étiquettes, l'auteur doit deviner si chaque commentaire signifie « le merge est bloqué » ou « juste une pensée ». Cette incertitude coûte de l'énergie et produit souvent la mauvaise réponse.

Une convention simple utilisée par de nombreuses équipes (popularisée sous le nom de Conventional Comments) :

  • nit : un point de style ou de préférence mineur — à corriger ou non, l'auteur décide. « nit : la virgule de fin ici correspond au reste du fichier. »
  • suggestion : quelque chose qui améliorerait le code mais n'est pas un bloquant. « suggestion : pourrait extraire ceci dans un helper — pas requis pour cette PR cependant. »
  • bloquant : la PR ne doit pas merger avant que cela soit résolu. Réservez cela aux bugs d'exactitude, aux problèmes de sécurité et aux violations claires des standards d'équipe.
  • question : vous demandez vraiment, sans sous-entendre qu'un changement est nécessaire. « question : est-ce que ça tourne sur le worker de fond aussi, ou seulement sur le processus web ? »
  • éloge : un retour positif explicite et sincère. Ça compte. Ne le sautez pas.

Quand tous vos problèmes bloquants sont résolus, approuvez avec des commentaires. C'est une habitude qui compte. Ça signifie : « Je vous fais confiance pour gérer les nits restants ; vous n'avez pas besoin d'un autre tour de ma part. » Ça débloque votre collègue, ça signale la confiance, et ça empêche la boucle de revue de devenir un goulot d'étranglement. L'alternative — retenir l'approbation jusqu'à ce que chaque point mineur soit adressé — est l'un des poisons lents de la culture de revue.

L'habitude « approuver avec commentaires »

Une fois que tous les éléments bloquants sont résolus, approuvez et laissez l'auteur décider du reste. Retenir une PR en otage pour des nits apprend aux gens que les revues sont un obstacle, pas une collaboration. Si vous tenez vraiment à un point non bloquant, dites-le explicitement — « Je tiens à celui-ci, mais c'est votre choix » — pour que l'auteur ait toutes les informations.

Du côté de l'auteur : recevoir les retours sans les prendre personnellement

Être relu est une compétence à part entière, et la plupart des écrits sur la culture d'ingénierie ne se concentrent que sur le relecteur. Mais le comportement de l'auteur façonne la culture de revue tout autant.

Supposez la bonne foi par défaut. Un commentaire sec est presque toujours celui d'une personne occupée qui a écrit vite, pas quelqu'un qui cherche à vous blesser. Avant de lire un ton dans un commentaire, demandez-vous s'il existe une interprétation neutre ou positive. Il y en a généralement une.

Répondez à chaque commentaire. Même si vous n'êtes pas d'accord. Un ✅ ou « fait » sur les retours implémentés, et une explication sur tout ce que vous contestez, ferme la boucle et montre au relecteur que son temps a été valorisé. Le silence est interprété comme de l'agressivité passive, que vous le souhaitiez ou non.

Poussez en retour quand vous êtes sincèrement en désaccord — clairement et calmement. « Je vois la préoccupation, mais voici pourquoi j'ai fait ce choix : [raison]. Heureux d'en discuter si vous vous sentez encore fortement. » Ce n'est pas la même chose que défendre chaque décision réflexivement. L'objectif est d'avoir une vraie conversation, pas de gagner. Parfois le relecteur a raison. Parfois c'est vous. Parfois la bonne réponse est « prenons ça avec l'équipe ».

Ne sur-expliquez pas votre propre code dans la description de la PR. Si votre code nécessite un mur de texte pour justifier chaque décision, c'est un signal pour améliorer le code, les noms ou les commentaires en ligne — pas pour écrire des descriptions de PR plus longues. Les meilleures PRs sont évidentes avec une bonne description du contexte et de l'intention.

Un quadrant 2x2 cartographiant la qualité des retours de revue. Le quadrant idéal est Bienveillant et Précis. KIND UNKIND VAGUE SPECIFIC Bienveillant + Vague C'est agréable mais ça n'aide pas à progresser. « Ça a l'air bien dans l'ensemble ! » Bienveillant + Précis ✦ L'objectif ✦ Clair, actionnable, respectueux. Enseigne et livre plus vite. « nit : extraire ce helper — plus facile à tester en isolation. » Peu bienveillant + Vague Le plus dommageable. Démoralise sans guider. « C'est du bazar. » Peu bienveillant + Précis Techniquement utile mais érode la confiance avec le temps. « Vous auriez dû utiliser X, c'est évidemment faux. »
Le 2×2 des retours de revue. Bienveillant + Précis (en haut à droite, en surbrillance) est l'objectif : un retour à la fois honnête et respectueux. Bienveillant + Vague est rassurant mais n'enseigne rien. Peu bienveillant + Précis fonctionne à court terme mais érode la confiance. Peu bienveillant + Vague — le pire quadrant — démoralise sans guider.

Vitesse de revue et taille des PRs — deux leviers à fort impact

La qualité d'une revue de code est fortement prédite par deux choses qui n'ont rien à voir avec la compétence du relecteur : la rapidité de la revue et la taille de la PR.

Révisez promptement. Une pull request en attente de revue, c'est une personne en attente de passer à la suite. Quand les revues prennent des jours, le travail s'accumule — les ingénieurs ouvrent la tâche suivante pour rester productifs, les changements de contexte se multiplient, et quand la revue revient finalement, l'auteur a oublié ce qu'il avait en tête. Une bonne règle empirique : accusez réception d'une PR dans les quelques heures suivant votre mention (même juste « Je m'en occupe avant la fin de journée »), et finalisez la revue dans la journée ouvrable suivante dans la mesure du possible.

Les PRs plus petites obtiennent des revues nettement meilleures. C'est bien documenté et aussi tout simplement évident en pratique. Une PR de 100 lignes reçoit une attention soutenue sur chaque ligne. Une PR de 1 000 lignes est validée à la va-vite, survolée, ou révisée si lentement qu'elle devient une source de conflits. La discipline de garder les PRs petites — « un changement logique par PR » est une bonne heuristique — rapporte plus que presque n'importe quelle autre amélioration de l'hygiène de revue. Cela rend aussi chaque PR plus facile à écrire, parce que vous devez penser clairement à ce que signifie un changement.

Taille de la PR (lignes modifiées) Qualité de revue typique Temps de revue
< 200 lignes Élevée — le relecteur peut la garder en mémoire de travail 15–45 min
200–500 lignes Moyenne — la fatigue s'installe sur les problèmes subtils 45–90 min
500–1 000 lignes En baisse — les relecteurs survolent ou divisent en sessions Des heures à une journée
> 1 000 lignes Surtout de la figuration — les problèmes critiques sont régulièrement manqués Des jours (ou jamais totalement)

Si une fonctionnalité nécessite vraiment des milliers de lignes, envisagez des PRs empilées : une série de petits changements autonomes qui s'appuient les uns sur les autres, chacun révisable sur ses propres mérites. La surcharge de l'ouverture de plus de PRs en vaut presque toujours la peine.

Comment la culture de revue diffère selon la taille de l'équipe

La bonne approche de la revue de code change substantiellement à mesure qu'une équipe grandit. Ce qui fonctionne pour trois ingénieurs s'effondre souvent activement à trente, et les équipes à l'échelle de l'entreprise ont besoin d'outils entièrement différents.

Seul ou startup précoce (1–5 ingénieurs). À cette échelle, il peut n'y avoir aucune revue du tout, ce qui est parfois bien et parfois catastrophique selon les enjeux. Quand vous révisez, la relation est généralement assez forte pour que les retours directs passent bien — mais c'est aussi le stade où les mauvaises habitudes se cimentent avant que quiconque ne pense à les nommer. Établissez tôt l'habitude d'étiqueter la gravité des commentaires ; ça ne coûte rien et devient inestimable plus tard.

Petite équipe en croissance (5–20 ingénieurs). C'est là où la culture de revue se forge. L'équipe est assez grande pour que le raccourci du « on se connaît tous » commence à s'estomper, mais assez petite pour que les normes puissent encore être fixées par quelques voix influentes. Un seul ingénieur senior qui modèle des revues bienveillantes, précises et étiquetées va faire évoluer toute la culture de l'équipe en quelques mois. C'est aussi le moment où un guide de revue d'équipe — même d'une page — rapporte des dividendes : qu'est-ce qu'un bloquant, qu'est-ce qu'un nit, combien de temps une revue doit-elle prendre.

Équipe de taille moyenne (20–100 ingénieurs). Les revues se font maintenant entre squads qui se connaissent à peine. Le travail de construction de la confiance qui se produit naturellement dans les petites équipes doit être fait délibérément. Les revues inter-équipes deviennent une source majeure de friction si les normes ne sont pas partagées. Les propriétaires de code, la rotation des revues et les checklists de revue légères aident. Tout comme faire de la qualité des revues un sujet lors des rétrospectives d'ingénierie — pas seulement « avons-nous livré vite » mais « avons-nous bien révisé ».

Grande ou entreprise (100+ ingénieurs). À cette échelle, la revue est autant une fonction de gouvernance et de conformité qu'une fonction qualité. Les outils comptent énormément : vérifications automatisées, relecteurs requis, SLAs de revue et métriques sur le temps de cycle de revue. Le créneau de revue humaine est précieux et doit être réservé à ce que seul un humain peut faire — le jugement de conception, la connaissance du domaine, l'impact inter-équipes. Tout ce qu'un linter ou un analyseur statique peut détecter doit l'être avant l'ouverture de la PR, pas dans un fil de commentaires.

Points clés à retenir

  • La revue de code, c'est la culture avant d'être la chasse aux bugs. Chaque commentaire enseigne, et les patterns de commentaires construisent ou érodent la sécurité psychologique au fil des mois.
  • Concentrez l'énergie de revue sur ce qui compte : exactitude, conception, lisibilité, tests et sécurité. Laissez votre linter gérer le formatage.
  • Bienveillant + Précis est l'objectif. Expliquez le pourquoi, posez des questions plutôt que de rendre des verdicts, et félicitez explicitement le bon code.
  • Étiquetez vos commentaires : nit / suggestion / bloquant / question / éloge. Ça supprime l'ambiguïté et respecte le temps de l'auteur.
  • Approuvez avec des commentaires une fois les bloquants résolus. Ne retenez pas une PR en otage pour des nitpicks.
  • En tant qu'auteur : supposez la bonne foi, répondez à chaque commentaire, poussez en retour calmement si vous n'êtes pas d'accord, et ne sur-expliquez pas dans la description de la PR.
  • PRs plus petites, revues plus rapides. Moins de 200 lignes obtient la meilleure attention. Les PRs empilées gèrent les grandes fonctionnalités.
  • Les normes de revue doivent être délibérées — surtout quand les équipes dépassent 10–20 personnes. Écrivez-les, revisitez-les dans les rétros.

Si cela vous a parlé, le prochain article de cette série va plus loin — de la façon dont vous révisez le code à la façon dont vous vous présentez en tant qu'ingénieur au quotidien : Kind Engineering.

Questions fréquentes

Combien de temps devrait prendre une revue de code ?
Pour une PR bien délimitée de moins de 200 lignes, prévoyez 15 à 45 minutes d'attention soutenue. Accuser réception d'une demande de revue dans les quelques heures et la terminer dans la journée ouvrable suivante est un objectif sain. Les revues qui s'étirent au-delà de 48 heures deviennent un goulot d'étranglement qui ralentit toute l'équipe — la ponctualité fait partie de la qualité de la revue.
Que dois-je rechercher dans une revue de code ?
Concentrez-vous sur l'exactitude (est-ce que ça fonctionnera en production, y compris les cas limites ?), la conception (s'intègre-t-il proprement dans l'architecture ?), la lisibilité (un coéquipier comprendra-t-il cela dans six mois ?), les tests (sont-ils significatifs et couvrent-ils les cas importants ?) et la sécurité (les entrées utilisateur sont-elles validées, y a-t-il un risque d'injection ?). Ignorez les problèmes de formatage que votre linter détecte déjà — cette attention est mieux dépensée sur ce que seul un humain peut juger.
Comment donner des retours de revue de code sans paraître dur ?
La technique la plus efficace est de poser des questions plutôt que de rendre des verdicts, et d'expliquer toujours pourquoi quelque chose compte. « Pourquoi avez-vous choisi X ici ? » invite au dialogue ; « vous devriez utiliser Y » le ferme. Étiqueter la gravité des commentaires (nit / suggestion / bloquant) aide aussi — ça sépare « c'est un bloquant » de « c'est une préférence », pour que l'auteur n'ait pas à deviner.
Faut-il bloquer une pull request pour des nitpicks de style ?
Non. Bloquer une PR signifie un bug d'exactitude, un problème de sécurité ou une violation claire des standards d'équipe convenus — des choses qui causeraient de vrais problèmes si mergées. Les préférences de style et les points de formatage mineurs doivent être étiquetés comme nit et laissés à la discrétion de l'auteur. Une fois que tous les commentaires bloquants sont résolus, approuvez avec des commentaires et laissez l'auteur gérer le reste.
Quelle taille devrait avoir une pull request ?
Moins de 200 lignes modifiées est le point idéal pour des revues de haute qualité. À cette taille, un relecteur peut garder le changement en mémoire de travail et repérer les problèmes subtils. Les PRs de plus de 500 lignes connaissent une qualité de revue fortement déclinante — les relecteurs survolent, la fatigue s'installe et les problèmes critiques passent inaperçus. Pour les grandes fonctionnalités, utilisez des PRs empilées : une série de petits changements autonomes qui racontent chacun une histoire claire.