Code Review Checklist: What I Look for After 10 Years of PRs \u2014 TXT1.ai

March 2026 · 16 min read · 3,695 words · Last Updated: March 31, 2026Advanced

💡 Key Takeaways

  • The First 30 Seconds: What the PR Description Tells Me
  • The Logic Layer: Does This Actually Solve the Problem?
  • The Data Layer: Following the Information Flow
  • The Security Lens: Thinking Like an Attacker

Il y a trois ans, j'ai approuvé une demande de fusion qui a coûté à mon entreprise 47 000 $ de revenus perdus en un seul week-end. Le code avait l'air correct. Les tests ont réussi. La logique était solide. Mais j'ai manqué quelque chose de subtil dans la façon dont nous avons géré les conversions de fuseau horaire pour nos clients européens, et lorsque l'heure d'été a commencé, notre système de traitement des paiements a commencé à échouer silencieusement pour 18 % de notre base d'utilisateurs.

💡 Points Clés

  • Les 30 Premières Secondes : Ce Que La Description du PR Me Dit
  • La Couche Logique : Cela Résout-Il Réellement le Problème ?
  • La Couche de Données : Suivre le Flux d'Information
  • Le Filtre de Sécurité : Penser Comme un Attaquant

Cet incident a changé ma façon d'examiner le code pour toujours. Je suis Sarah Chen, et j'ai été responsable d'ingénierie senior dans trois entreprises SaaS différentes au cours de la dernière décennie, examinant en moyenne 15 à 20 demandes de fusion par semaine. Cela représente environ 8 000 PR dans ma carrière, allant de correctifs en une seule ligne à d'énormes refacturations architecturales s'étendant sur plus de 50 fichiers. J'ai vu du code brillant qui a expédié des bugs, et du code désordonné qui a fonctionné parfaitement en production pendant des années.

Ce que j'ai appris, c'est que la révision du code ne consiste pas vraiment à trouver des bugs—bien que cela soit important. Il s'agit de construire des systèmes qui survivent au contact de la réalité. Il s'agit de créer un code que le prochain développeur (souvent vous-même, six mois plus tard) peut comprendre et modifier sans crainte. Et il s'agit de repérer les problèmes invisibles qui ne se révèlent que lorsque votre application évolue, lorsque des cas particuliers émergent, ou lorsque ce client en Australie fait quelque chose que vous n'aviez jamais anticipé.

Ceci est ma liste de contrôle. Pas celle théorique des manuels, mais celle éprouvée que j'ai raffinée à travers d'innombrables incidents en production, des sessions de débogage nocturnes, et ce sentiment de malaise lorsque vous réalisez qu'un bug que vous avez approuvé affecte maintenant de vrais utilisateurs.

Les 30 Premières Secondes : Ce Que La Description du PR Me Dit

Avant de regarder une seule ligne de code, je passe 30 secondes à lire la description du PR. Cela peut sembler trivial, mais une description mal rédigée est souvent le premier signal d'alarme que le code lui-même pourrait avoir des problèmes. D'après mon expérience, les développeurs qui ne peuvent pas clairement articuler ce que leur code fait n'ont souvent pas entièrement réfléchi à l'implémentation.

Je recherche trois choses spécifiques : le problème à résoudre, l'approche adoptée, et les compromis effectués. Une bonne description de PR se lit comme un mini-document de conception. "Correction de bug dans l'authentification de l'utilisateur" ne m'apprend rien. "Correction d'une condition de course dans le rafraîchissement du jeton JWT qui a causé la déconnexion inattendue de 0,3 % des utilisateurs pendant les périodes de forte affluence en implémentant un verrou distribué à l'aide de Redis" indique que le développeur comprend profondément le problème.

Je vérifie également si le PR est de taille appropriée. Ma règle générale : si un PR touche plus de 400 lignes de code (hors tests et fichiers générés), il est probablement trop grand pour être examiné efficacement. Des recherches sur les pratiques d'ingénierie de Google suggèrent que l'efficacité de l'examen diminue considérablement après 200-400 lignes. J'ai constaté que cela est exact—après avoir examiné environ 300 lignes, mon attention commence à faiblir, et je commence à manquer des problèmes subtils.

Lorsque je rencontre un PR massif, je demande au développeur de le diviser en morceaux plus petits et logiques. Oui, cela prend plus de temps au départ, mais cela prévient le scénario où j'applique un tampon à un PR de 2 000 lignes parce que je suis submergé et que je veux juste en passer. J'ai approuvé trop de PR problématiques de cette manière tôt dans ma carrière.

La description doit également renvoyer à un contexte pertinent : le ticket ou le problème traité, les documents de conception, et les PR connexes. Si je dois fouiller dans Jira ou Slack pour comprendre pourquoi ce changement est apporté, c'est une friction qui ralentit tout le processus de révision. Dans ma société actuelle, nous avons établi la politique que les PR sans contexte approprié ne sont pas examinés tant que la description n'est pas mise à jour. Cette simple règle a amélioré notre qualité d'examen de manière mesurable.

La Couche Logique : Cela Résout-Il Réellement le Problème ?

Une fois que je comprends ce que le PR est censé faire, je vérifie qu'il le fait réellement. Cela semble évident, mais vous seriez surpris de voir combien de fois le code passe des tests mais ne traite pas pleinement le problème sous-jacent. J'ai vu des développeurs corriger le symptôme tout en laissant la cause profonde intacte, créant une bombe à retardement qui explosera plus tard.

"La révision du code ne consiste pas vraiment à trouver des bugs—il s'agit de construire des systèmes qui survivent au contact de la réalité et de créer un code que le prochain développeur peut comprendre sans crainte."

Je commence par parcourir mentalement le chemin heureux. S'il s'agit d'une nouvelle fonctionnalité pour le traitement des remboursements, j'imagine un client demandant un remboursement et je retrace le chemin du code depuis le point de terminaison API à travers la logique métier jusqu'à la mise à jour de la base de données. Chaque étape a-t-elle du sens ? Traitez-vous les données correctement ? Mettons-nous à jour tous les enregistrements nécessaires ?

Mais le chemin heureux est facile. Ce qui différencie un bon code d'un code prêt pour la production, c'est la manière dont il gère les chemins malheureux. Que se passe-t-il si le passerelle de paiement est en panne ? Que se passe-t-il si le montant du remboursement est négatif ? Que se passe-t-il si l'utilisateur demande un remboursement pour une commande qui a déjà été remboursée ? J'ai appris à être presque paranoïaque à propos des cas particuliers parce que les environnements de production sont des moteurs de chaos qui trouveront chaque cas particulier que vous n'avez pas envisagé.

Je recherche des modèles de programmation défensive : vérifications nulles, validation des entrées, gestion des conditions limites. Mais je recherche également le surdéveloppement. Chaque fonction n'a pas besoin de gérer chaque cas particulier possible. Si une méthode privée n'est appelée qu'à un seul endroit avec des entrées validées, l'ajout de validations redondantes n'est que du bruit. La clé est de comprendre le contrat de chaque fonction et de s'assurer qu'il est respecté aux frontières.

Un modèle que j'ai vu causer des problèmes à plusieurs reprises est la "mise à jour optimiste". Un développeur suppose qu'une opération réussira et met à jour l'interface utilisateur ou l'état de la base de données avant de confirmer le succès. Cela fonctionne 99 % du temps, mais ce 1 % crée des bugs incroyablement déroutants où l'état du système devient incohérent. Je signale toujours ces modèles et demande : que se passe-t-il si cette opération échoue en cours de route ?

La Couche de Données : Suivre le Flux d'Information

Les bugs de données sont les pires bugs parce qu'ils sont souvent silencieux et cumulatifs. Une erreur logique pourrait faire crash votre application immédiatement, mais une erreur de données pourrait corrompre votre base de données lentement au fil des semaines, et au moment où vous le remarquez, vous avez des milliers de mauvais enregistrements et aucun moyen propre de les réparer.

Focalisation de l'Examen Examinteur Junior Examinteur Senior Impact sur la Production
Syntaxe & Style Focalisation principale Automatisé/minimum d'attention Faible
Cas Particuliers Scénarios évidents uniquement Problèmes de fuseau horaire, de locale, d'échelle Élevé
Couverture de Test Des tests existent et réussissent Des tests couvrent les modes d'échec Critique
Performance Le code fonctionne correctement Comportement sous charge/échelle Élevé
Documentation Commentaires présents Pourquoi des décisions ont été prises Moyen

Lors de l'examen d'un code qui touche aux données, je trace tout le cycle de vie de ces données. D'où viennent-elles ? Comment sont-elles validées ? Comment sont-elles transformées ? Où sont-elles stockées ? Qui peut y accéder ? C'est particulièrement critique pour le contenu généré par l'utilisateur ou les données financières où les erreurs ont de réelles conséquences.

Je fais particulièrement attention aux conversions de types de données. Une fois, j'ai approuvé un code qui convertissait un prix d'un float à un entier pour un calcul, puis de nouveau à un float. Cela semblait inoffensif. Mais en raison des problèmes de précision des nombres flottants, des prix comme 10,99 $ devenaient parfois 10,98 $ ou 11,00 $ après le tour. Nous ne l'avions pas remarqué jusqu'à ce que les clients commencent à se plaindre de frais incorrects. Maintenant, je scrute chaque conversion de type, en particulier celles impliquant de l'argent ou des mesures.

Les migrations de bases de données sont un autre domaine où je suis particulièrement prudent. Je cherche plusieurs choses : La migration est-elle réversible ? Que se passe-t-il si elle échoue à mi-chemin ? Combien de temps cela prendra-t-il sur notre base de données de production ? J'ai vu des migrations qui fonctionnaient bien sur une base de données de développement avec 1 000 enregistrements mais bloquaient des tables pendant 20 minutes sur une base de données de production avec 50 millions d'enregistrements, mettant à terre l'application entière.

Pour tout code qui modifie des données existantes, je demande : y a-t-il un plan de sauvegarde ? Pouvons-nous revenir en arrière si quelque chose tourne mal ? Dans ma précédente entreprise, nous avions une politique stipulant que toute migration de données affectant plus de 10 000 enregistrements nécessitait un essai à sec sur un instantané de production et une procédure de retour en arrière explicite documentée dans le PR. Cela nous a déjà sauvés plusieurs fois.

Je regarde également les modèles d'accès aux données. Ce code effectue-t-il des requêtes N+1 ? Charge-t-il des collections entières en mémoire alors qu'il n'a besoin que de quelques champs ? Ces problèmes de performance peuvent ne pas être évidents dans le développement, mais deviennent critiques à grande échelle. Une fois, j'ai examiné un code qui semblait parfaitement correct mais qui aurait provoqué une montée en flèche de l'UC de notre base de données à 100 % s'il avait été expédié en production, simplement parce qu'il était

T

Written by the Txt1.ai Team

Our editorial team specializes in writing, grammar, and language technology. We research, test, and write in-depth guides to help you work smarter with the right tools.

Share This Article

Twitter LinkedIn Reddit HN

Related Tools

SQL Formatter — Format SQL Queries Free Developer Statistics & Trends 2026 txt1.ai API — Free Code Processing API

Related Articles

Git Commands Cheat Sheet: The 20 Commands You Actually Need — txt1.ai 10 TypeScript Tips That Reduce Bugs by 50% — txt1.ai Professional Email Writing: Tips That Get Responses - TXT1.ai

Put this into practice

Try Our Free Tools →

🔧 Explore More Tools

How To Format JsonHtml To PdfSitemap HtmlRegex TesterAi Database DesignerPassword Generator

📬 Stay Updated

Get notified about new tools and features. No spam.