Code review : rituel quotidien qui peut faire progresser l’équipe… ou créer de la frustration. Voici comment en faire un outil de croissance plutôt qu’un goulot d’étranglement.
Le problème : Code Review frustrantes
Symptômes classiques
Pour l’auteur :
09h00 : Crée PR
16h30 : Pas de review
Lendemain 14h : Enfin review
16h00 : Corrige commentaires
Lendemain 11h : 2ème review avec nouveaux comments
...
5 jours pour merger 200 lignes
Pour le reviewer :
PR à reviewer : 1500 lignes
- "Où commencer ?"
- "Trop gros pour comprendre"
- "Approve en diagonale"
Résultat :
- Vélocité ralentie
- Frustration des deux côtés
- Quality compromise
Principes fondamentaux
1. Code review ≠ Code perfection
Mauvais mindset :
"Ce code doit être parfait avant merge"
→ 47 commentaires sur naming
→ PR bloquée 1 semaine
Bon mindset :
"Ce code améliore-t-il la codebase ?"
→ Focus sur vrais problèmes
→ Merge en 1 jour, itération continue
2. Bienveillance par défaut
Mauvais feedback :
❌ "Ce code est nul"
❌ "Pourquoi t'as fait ça ?"
❌ "C'est évident qu'il faut faire autrement"
Bon feedback :
✅ "Je pense qu'on pourrait améliorer X parce que Y"
✅ "As-tu considéré l'approche Z ?"
✅ "Je ne comprends pas cette partie, peux-tu expliquer ?"
3. Automatiser ce qui peut l’être
Ne PAS commenter en review :
- Formatting (Prettier, Black)
- Linting (ESLint, Ruff)
- Types (TypeScript, mypy)
- Security basic (Snyk, Dependabot)
Commenter en review :
- Architecture
- Logic bugs
- Performance
- Maintainability
Checklist review efficace
Pour l’auteur (avant de créer la PR)
✅ Size : Keep it small
Optimal : < 400 lignes
Acceptable : < 800 lignes
Too big : > 800 lignes → Split
✅ Description claire
## What
Ajoute validation email sur signup
## Why
65% des signups avaient email invalide → bounces
## How
- Regex validation
- DNS MX check
- Disposable email blacklist
## Testing
- Unit tests ajoutés
- Testé manuellement avec 10+ scénarios
## Screenshots
[Avant] [Après]
✅ Self-review
Relire sa propre PR avant de demander review :
- Supprimer console.log oubliés
- Fixer typos évidents
- Vérifier tests passent
Pour le reviewer
✅ Prioriser
P0 (bloquant) :
- Security vulnerability
- Data loss risk
- Breaking change non documenté
P1 (important) :
- Logic bug
- Performance regression
- Missing tests critiques
P2 (nice to have) :
- Naming suggestions
- Refactoring ideas
- Documentation improvements
✅ Timeboxing
PR < 200 lignes : 15 minutes max
PR 200-500 lignes : 30 minutes max
PR > 500 lignes : "Trop gros, split please"
✅ Feedback constructif
# Template comment
## Issue
[Décrire le problème]
## Impact
[Pourquoi c'est important]
## Suggestion
[Proposition concrète]
## Example
```code
[Code proposé]
## Feedback patterns
### Pattern 1 : Ask, don't tell
❌ “Change ça en Promise.all”
✅ “As-tu considéré Promise.all ici ? Ça pourrait paralléliser les appels et réduire la latency de 60% à 20ms. Qu’en penses-tu ?”
### Pattern 2 : Explain the why
❌ “N’utilise pas var”
✅ “Je recommande const/let au lieu de var car :
- Block scope (évite bugs)
- Immutabilité avec const (intent clair)
- Standard moderne (ESLint flag)”
### Pattern 3 : Link to resources
❌ “Mauvaise gestion d’erreur”
✅ “La gestion d’erreur pourrait être améliorée. Voir notre guide : Error Handling Best Practices Notamment la section sur error boundaries.”
### Pattern 4 : Propose, don't impose
❌ “Change ce nom de variable”
✅ “Suggestion (non-bloquant) : userEmail serait plus explicite
que email ici, car on manipule aussi orderEmail.
Ton avis ?”
### Pattern 5 : Celebrate good code
✅ “Nice! Cette abstraction rend le code beaucoup plus lisible 👍” ✅ “Excellente idée d’ajouter ce guard clause” ✅ “J’aime l’utilisation de ce pattern ici”
**Impact :** Renforce culture positive, encourage bonnes pratiques.
## Gérer les désaccords
### Situation : Débat naming qui s'éternise
Review comment (30 messages):
- “Variable devrait s’appeler X”
- “Non, Y est mieux”
- “Pourquoi pas Z ?”
- … (continues for hours)
**Solution : Decision framework**
```markdown
## Naming disagreement
### Options
A. `userAccount`
B. `account`
C. `user`
### Decision criteria
1. Clarity (pas d'ambiguïté)
2. Consistency (with existing code)
3. Brevity (short but clear)
### Vote
@alice: B (existing code uses `account`)
@bob: A (more explicit)
@charlie: B (consistency > explicitness)
### Decision: B (`account`)
Rationale: Consistency with 90% of existing codebase
Situation : Désaccord architectural
Reviewer: "Cette feature devrait utiliser event sourcing"
Author: "C'est overkill pour ce use case"
Solution : Escalade constructive
## Architectural decision needed
### Context
Feature: User notification preferences
### Approaches
1. Simple DB update (proposed)
2. Event sourcing (reviewer suggests)
### Trade-offs discussed
[Summary of discussion]
### Request
@tech-lead Can you arbitrate?
Timeline: Need decision by EOD for sprint deadline
Process : SLA Review
Team Agreement
Code Review SLA:
First response: < 4 hours
(Even just "I'll review tomorrow")
Full review: < 24 hours
(For PRs < 400 lines)
Approval or explicit blockers: < 48 hours
Large PRs (>800 lines):
Pre-split or schedule dedicated review session
Enforce with automation
// GitHub Action
on:
pull_request:
types: [opened, ready_for_review]
jobs:
review-reminder:
runs-on: ubuntu-latest
steps:
- name: Assign reviewers
run: |
# Auto-assign based on code ownership
gh pr edit ${{ github.event.pull_request.number }} \
--add-reviewer @team-backend
- name: Reminder after 4h
run: |
sleep 14400 # 4 hours
gh pr comment --body "👋 Reminder: Please review this PR"
- name: Escalate after 24h
run: |
sleep 86400 # 24 hours
gh pr comment --body "⚠️ Escalating: No review after 24h"
# Notify team lead
Async vs Sync Review
Async (défaut)
PR créée
→ Reviewer commente (à son rythme)
→ Author répond/corrige
→ Iterate jusqu'à approval
Pros :
- Pas de meeting
- Deep thinking time
- Documentation written
Cons :
- Peut être lent
- Misunderstandings
Sync (pour cas spécifiques)
PR complexe
→ Schedule 30min review call
→ Screen share, walk through code
→ Décisions immédiates
Quand utiliser :
- PR > 500 lignes
- Architecture complexe
- Désaccords à résoudre
- Onboarding nouveau dev
Reviewer assignment strategies
Strategy 1 : Round robin
// Rotate reviewers équitablement
const reviewers = ['alice', 'bob', 'charlie'];
let currentIndex = 0;
function assignReviewer() {
const reviewer = reviewers[currentIndex];
currentIndex = (currentIndex + 1) % reviewers.length;
return reviewer;
}
Strategy 2 : Code ownership
# CODEOWNERS file
/frontend/** @frontend-team
/backend/** @backend-team
/infra/** @devops-team
# Auto-assign based on files changed
Strategy 3 : Expertise-based
// Assigner expert du domaine
const expertise = {
'database': ['alice', 'david'],
'frontend': ['bob', 'emma'],
'security': ['charlie', 'alice']
};
function assignByExpertise(prLabels) {
if (prLabels.includes('database')) {
return randomPick(expertise.database);
}
// ...
}
Strategy 4 : Buddy system
Junior dev → Always 1 senior reviewer
Senior dev → Peer review OK
Benefits:
- Mentoring built-in
- Knowledge transfer
- Quality maintained
Metrics : Mesurer l’efficacité
Metrics à tracker
┌─────────────────────────────────────┐
│ Code Review Health Dashboard │
├─────────────────────────────────────┤
│ Time to First Review │
│ Median: 3.2h ✅ (target: < 4h) │
│ │
│ Time to Merge │
│ Median: 18h ✅ (target: < 24h) │
│ │
│ PR Size │
│ Median: 280 lines ✅ (target: <400)│
│ │
│ Review Comments per PR │
│ Median: 4 ✅ (healthy discussion) │
│ │
│ Approval Rate First Review │
│ 45% ✅ (not too high, not too low) │
└─────────────────────────────────────┘
Red flags
🚨 Time to first review > 48h
→ Reviewers surchargés ou désengagés
🚨 PR size median > 600 lines
→ PRs trop grosses, encourager split
🚨 Comments per PR > 20
→ Process review trop nitpicky
🚨 Approval rate first review > 90%
→ Rubber stamping (pas de vraie review)
Outils
GitHub / GitLab
# PR Template (.github/pull_request_template.md)
## What changed
<!-- Describe your changes -->
## Why
<!-- Business/technical rationale -->
## Testing
- [ ] Unit tests added/updated
- [ ] Manual testing performed
- [ ] Edge cases considered
## Checklist
- [ ] Code follows style guide
- [ ] Documentation updated
- [ ] Breaking changes documented
- [ ] Performance impact considered
Review tools
- Reviewable : Advanced GitHub review
- Gerrit : Google-style review
- Phabricator : Facebook-style review
- Codecov : Coverage in PR
- SonarCloud : Quality metrics
Culture : Senior reviewer mindset
Ce qu’un senior reviewer fait
✅ Teach, don't just criticize
✅ Ask questions to understand intent
✅ Suggest improvements with context
✅ Approve when "good enough"
✅ Celebrate good code
✅ Focus on architecture, not syntax
Ce qu’un senior reviewer évite
❌ Bikeshedding (débat sur détails)
❌ Perfectionism (bloquer sur détails mineurs)
❌ Imposing personal style
❌ Reviewing code they don't understand
❌ Ghosting PRs (pas de feedback)
Cas réel : Startup tech (15 devs)
Avant
- Time to merge : 3-5 jours
- PRs size moyenne : 650 lignes
- Review comments : 25/PR
- Frustration dev : 🔥🔥🔥
Changements
- PR size limit : 400 lignes (CI block si > 400)
- SLA review : 24h
- Review checklist (focus architecture)
- Celebrate good code (culture positive)
Après (3 mois)
- Time to merge : 18h (-80%)
- PRs size moyenne : 280 lignes (-57%)
- Review comments : 6/PR (-76%)
- Satisfaction dev : 8.5/10 (+90%)
Conclusion
Code review n’est pas un goulot.
C’est un accelerator si bien fait :
- Knowledge sharing
- Quality improvement
- Team cohesion
Keys :
- Small PRs (<400 lines)
- Fast feedback (<24h)
- Constructive comments
- Celebrate good code
Commencez aujourd’hui :
- Définir SLA review
- Template PR
- Review checklist
Et vous, comment sont vos code reviews ?