IAMaîtriser l'IA générative Plan du corpus

05 - Revue de code

Un modele a qui tu demandes "c est bon ?" repondra presque toujours oui ; la technique centrale de ce fichier est de lui demander l inverse.

Temps de lecture : 13 min | Niveau : Intermediaire

Ce que tu sauras faire apres

  • Faire relire ton code sur six dimensions au lieu d une impression generale.
  • Formuler une demande de revue qui cherche a refuter, pas a rassurer.
  • Lancer une revue dans un contexte neuf, non biaise par le code qui vient d etre ecrit.
  • Trier les remarques utiles des remarques de confort.
  • Preparer une pull request propre avant de la soumettre a un humain.

La technique centrale : refuter plutot que valider

Si tu ecris "peux-tu valider mon code ?", tu obtiens une validation. C est un biais mecanique : tu as demande une validation.

La doc Claude Code formule le principe :

"A reviewer running in a fresh subagent context sees only the diff and the criteria you give it, not the reasoning that produced the change, so it evaluates the result on its own terms." -- Best practices

Et elle explique pourquoi la separation compte : "A fresh context improves code review since Claude won't be biased toward code it just wrote."

AVANT / APRES

Mauvais prompt :

tu peux verifier que mon code est correct ?

Prompt ameliore :

Ton objectif est de trouver les cas ou ce code DONNE UN MAUVAIS RESULTAT.

Pour chaque probleme que tu trouves, donne un scenario d echec concret :
- les valeurs d entree exactes
- le resultat attendu
- le resultat que le code produit reellement
- la ligne responsable

Si tu ne trouves aucun scenario d echec concret pour une remarque, ne la
donne pas. Je ne veux pas de preferences de style.

Pourquoi c est mieux : tu changes l objectif. Le modele ne cherche plus a te rassurer, il cherche a casser. Et l exigence "scenario d echec concret" filtre automatiquement les remarques creuses : une remarque sans scenario ne passe pas le filtre.

Le contre-poison

Attention a l effet inverse, que la doc Claude Code signale explicitement :

"A reviewer prompted to find gaps will usually report some, even when the work is sound, because that is what it was asked to do. Chasing every finding leads to over-engineering."

Donc ajoute toujours cette ligne de calibrage :

Signale uniquement ce qui affecte la correction du resultat ou les
exigences que je t ai donnees. Tout le reste, classe-le en "optionnel" et
mets-le a la fin, en une ligne chacun.

La grille de revue en six dimensions

Google publie une grille de revue de reference. Les sections de la page What to Look For In a Code Review sont, dans l ordre : design, fonctionnalite, complexite, tests, nommage, commentaires, style, coherence, documentation, "chaque ligne", contexte, et "les bonnes choses" (ce qui merite d etre salue).

Version condensee en six dimensions utilisables au quotidien, avec un prompt pour chacune.

#DimensionQuestion centrale
1CorrectionLe code fait-il ce qu il est cense faire, sur toutes les entrees ?
2SecuriteUne entree hostile ou inattendue peut-elle causer des degats ?
3PerformanceLe cout tient-il au volume reel de production ?
4TestsLes tests couvrent-ils ce qui peut reellement casser ?
5LisibiliteUn collegue comprend-il sans explication orale ?
6CoherenceLe code ressemble-t-il au reste du repo ?

Fais une passe par dimension, pas une passe globale. Une passe globale donne un avis moyen sur tout ; six passes ciblees donnent six listes exploitables.


Les six prompts de revue

1. Correction

Dimension : CORRECTION uniquement.
Code : @[CHEMIN/FICHIER] (ou le diff ci-dessous)

Cherche les cas ou ce code produit un resultat FAUX. Regarde en particulier :
- les valeurs aux bornes : 0, 1, liste vide, None, chaine vide, NaN
- les comparaisons : <= vs <, >= vs >, egalite sur des flottants
- les conversions de type implicites
- l ordre des operations et les priorites
- les branches jamais prises et les branches manquantes (else absent)
- les retours anticipes qui sautent du nettoyage

Format : un probleme par bloc, avec entree exacte -> resultat attendu ->
resultat reel -> ligne. Pas de remarque sans scenario concret.

2. Securite

Dimension : SECURITE uniquement.
Code : @[CHEMIN/FICHIER]

Cherche :
- injection SQL : requete construite par concatenation ou f-string au lieu
  de parametres lies
- injection de commande : appel shell avec une valeur qui vient de
  l exterieur
- secrets en dur : mot de passe, token, cle d API, URL de connexion
- chemins de fichiers construits a partir d une entree externe
- donnees personnelles ecrites dans les logs
- desserialisation non sure (pickle, yaml.load sans Loader)
- absence de verification des droits avant une operation sensible

Pour chaque point : la ligne, l exploitation possible en une phrase, le
correctif exact.

Exemple de ce que ca attrape en data engineering, cas tres frequent :

# PROBLEME : injection SQL par f-string
query = f"SELECT * FROM orders WHERE client_id = '{client_id}'"
cursor.execute(query)

# CORRECT : parametre lie, la valeur ne devient jamais du code SQL
cursor.execute("SELECT * FROM orders WHERE client_id = %s", (client_id,))

3. Performance

Dimension : PERFORMANCE uniquement.
Volume reel en production : [NOMBRE_DE_LIGNES] lignes, [FREQUENCE] fois par jour
Code : @[CHEMIN/FICHIER]

Cherche, en te basant sur CE volume, pas sur un volume theorique :
- les boucles imbriquees et leur complexite
- les appels reseau ou base a l interieur d une boucle (probleme N+1)
- le chargement complet en memoire d un jeu de donnees qui pourrait etre
  traite par morceaux
- en pandas : apply ligne a ligne la ou une operation vectorisee existe
- en SQL : absence de filtre sur la colonne de partition, SELECT *,
  jointure sans condition, fonction appliquee a une colonne dans le WHERE
  (ce qui empeche l usage de l index)

Pour chaque point : le cout estime a ce volume, et le gain attendu du
correctif. Si l impact est negligeable a ce volume, dis-le.

La derniere ligne evite l optimisation inutile. Un apply sur 500 lignes n est pas un probleme.

4. Tests

Dimension : TESTS uniquement.
Code : @[CHEMIN/SOURCE]
Tests : @[CHEMIN/TEST]

Reponds a :
1. Quel comportement du code source n est couvert par AUCUN test ?
2. Quels tests passeraient meme si le code etait casse ? (tests sans assert
   significatif, assert sur une constante recopiee, mock qui remplace la
   logique testee)
3. Quels cas limites reels manquent ?
4. Si je supprime la ligne [NUMERO], quel test echoue ? Si aucun, c est un
   trou de couverture.

Ne reecris pas les tests. Donne-moi seulement la liste.

La question 4 est le meilleur detecteur de trou de couverture : c est le principe du test de mutation, en version manuelle.

5. Lisibilite

Dimension : LISIBILITE uniquement.
Code : @[CHEMIN/FICHIER]

Cherche :
- les noms qui ne disent pas ce que la chose est (df, tmp, data, x, res,
  process, handle)
- les fonctions qui font plusieurs choses (indice : leur nom contient "et"
  ou "and")
- les valeurs magiques non expliquees (3600, 0.15, "FR-01")
- les commentaires qui repetent le code au lieu d expliquer POURQUOI
- les imbrications profondes qui pourraient devenir des retours anticipes

Pour chaque point, propose le remplacement exact. Ne change pas le
comportement.

Rappel utile de la grille Google : "Usually comments are useful when they explain why some code exists, and should not be explaining what some code is doing."

6. Coherence avec le repo

Dimension : COHERENCE uniquement.
Mon code : @[CHEMIN/NOUVEAU_FICHIER]
Fichiers de reference du repo : @[CHEMIN/FICHIER_EXEMPLAIRE_1],
@[CHEMIN/FICHIER_EXEMPLAIRE_2]

Compare mon code aux fichiers de reference et liste :
- ce qui ne suit pas les conventions de nommage du repo
- ce qui ne suit pas la facon dont le repo gere les erreurs
- ce qui ne suit pas la facon dont le repo gere la configuration
- ce qui reinvente quelque chose qui existe deja dans le repo (cherche
  avant d affirmer)

Le dernier point est le plus important : cite le fichier et la fonction
existante que j aurais du reutiliser.

Lancer la revue dans un contexte neuf

Quatre facons, de la plus simple a la plus outillee.

1. Un sous-agent de revue. La doc Claude Code donne le prompt type :

Use a subagent to review the rate limiter diff against PLAN.md. Check that
every requirement is implemented, the listed edge cases have tests, and
nothing outside the task's scope changed. Report gaps, not style
preferences.

2. La commande fournie. Claude Code embarque une skill /code-review qui "reviews the current diff for bugs in a fresh subagent and returns findings to the session".

3. Le motif Writer / Reviewer sur deux sessions. La doc le presente sous forme de tableau : une session ecrit, une autre relit le fichier produit sans connaitre le raisonnement qui l a produit.

4. Un sous-agent de revue permanent. Tu peux definir un relecteur reutilisable dans .claude/agents/. Exemple tire de la doc :

---
name: security-reviewer
description: Reviews code for security vulnerabilities
tools: Read, Grep, Glob, Bash
model: opus
---
You are a senior security engineer. Review code for:
- Injection vulnerabilities (SQL, XSS, command injection)
- Authentication and authorization flaws
- Secrets or credentials in code
- Insecure data handling

Provide specific line references and suggested fixes.

Les champs name et description sont obligatoires ; tools et model sont optionnels (Subagents).


Le template de revue avant pull request

A lancer juste avant d ouvrir la PR. GitHub decrit la meme habitude cote Copilot : "Before I mark a pull request as ready for review, I'll use Copilot to do a quick pass over my changes by requesting a code review from Copilot. It often catches things I might have missed or suggests a better way to write something." (Copilot code reviews and pull requests)

Relis le diff ci-dessous comme un relecteur senior hostile, avant que je
l envoie en revue humaine.

Ce que la modification est censee faire : [OBJECTIF_EN_UNE_PHRASE]
Ce qui est explicitement HORS PERIMETRE : [CE_QUE_TU_N_AS_PAS_VOULU_TOUCHER]
Volume de donnees concerne en prod : [VOLUME]
Comment je verifie : [COMMANDE_DE_TEST]

Produis 4 sections :

BLOQUANT - ce qui produit un resultat faux, une faille, ou casse l existant.
  Pour chaque point : scenario d echec concret + ligne + correctif.

A DISCUTER - ce qui est defendable mais merite une decision explicite.

HORS PERIMETRE - ce que j ai modifie sans que ce soit demande, ou ce qui
  aurait du etre modifie et ne l a pas ete.

OPTIONNEL - style et confort, une ligne chacun, a la fin.

Regles :
- aucune remarque sans scenario concret dans la section BLOQUANT
- si tu ne trouves rien de bloquant, dis-le clairement, n invente pas
- ne reecris pas le code, decris les corrections

DIFF :
[COLLE_LE_RESULTAT_DE_git_diff]

La ligne "si tu ne trouves rien de bloquant, dis-le clairement, n invente pas" est le contre-poison indispensable.


Le cycle complet

  1. Tu ecris le code.
  2. Revue correction et tests -> tu corriges.
  3. Revue securite et performance -> tu corriges.
  4. Revue lisibilite et coherence -> tu corriges.
  5. Template avant PR dans un contexte neuf.
  6. Tu ouvres la PR (voir fichier 06 pour la description).
  7. Revue humaine.

L etape 7 ne disparait pas. GitHub le rappelle noir sur blanc : "GitHub Copilot is not designed to replace your expertise and skills. Remember that you are in charge, and Copilot is a powerful tool at your service." (Best practices for using GitHub Copilot)

Traduction : c est toi qui signes. L IA prepare la revue, elle ne porte pas la responsabilite du code.


A retenir

  • Demande de refuter, jamais de valider : "trouve les cas ou ce code donne un mauvais resultat".
  • Exige un scenario d echec concret pour chaque remarque bloquante ; sinon, la remarque tombe.
  • Une passe par dimension : correction, securite, performance, tests, lisibilite, coherence.
  • Lance la revue dans un contexte neuf, pas dans la session qui a ecrit le code.
  • Ajoute toujours le calibrage "signale seulement ce qui affecte la correction" pour eviter la sur-ingenierie.
  • La revue humaine reste obligatoire ; l IA la prepare, elle ne la remplace pas.

Sources

Corpus personnel de formation · genere le 26/09/2026 · source : 05-revue-de-code.md