À proposExpertiseProjetsParcoursBlogContact
Discuter
À proposExpertiseProjetsParcoursBlogContactDiscuter

Yao David Logan

Software Engineer fullstack spécialisé en SaaS, automatisation métier et plateformes web/mobile scalables.

NavigationExpertiseProjetsParcoursBlogContact
LiensGitHubLinkedInEmail
© 2026 Yao David Logan. Tous droits réservés.
Clean code et dette technique — REX neuf mois de formation fullstack
Retour au blog

Retour d'experience

Xin@

Clean code et dette technique — REX neuf mois de formation fullstack

YDLYao David Logan9 min de lecture23 mai 2026

CatégorieRetour d'experience

Lecture9 min de lecture

Publié23 mai 2026

Vues60

Partages0

Commentaires0

Sommaire
  1. 011. Le contexte
  2. 022. Ce qu'on raconte n'est pas ce qu'on fait
  3. 033. La règle qui a tout changé : "ton code sera lu 10 fois"
  4. 044. Les anti-patterns qui sont revenus le plus souvent
  5. 055. La discipline de Git
  6. 066. Le pair-programming systématique
  7. 077. L'évaluation par projet
  8. 088. La dette technique vue par un débutant
  9. 099. Les outils qui ont compté
  10. 1010. Ce qui m'a fait changer ma propre pratique
  11. 1111. Pièges à éviter en formation
  12. 1212. Conclusion

Nommer précis, early returns, fonctions courtes, daily refactor, pair-programming et évaluation par projet : ce que neuf mois à former 18 apprenants m'ont appris sur mon propre code.

Neuf mois à enseigner le développement fullstack à des apprenants en reconversion. Ce que j'ai appris sur le clean code, la dette technique et la pédagogie réelle.

1. Le contexte

De juillet 2024 à mars 2025, j'ai formé une promotion de 18 apprenants à l'IAFP La Pyramide (institut de formation modulaire accrédité au Togo). Programme : fondamentaux algorithmiques, JavaScript, TypeScript, Dart, Next.js, Flutter, React Native, Git. Objectif : qu'ils soient capables de livrer des applications fullstack autonomes à la sortie.

Taux de certification final : 85 %. Mais ce n'est pas ce qui m'a marqué le plus. Ce qui m'a marqué, c'est ce que j'ai appris moi sur le code et la dette technique en regardant des débutants l'écrire pour la première fois.

2. Ce qu'on raconte n'est pas ce qu'on fait

Premier choc : ce que je croyais "instinctif" dans mon code ne l'est pas. Quand je nomme une fonction fetchUserPortfolio, je sais pourquoi je n'ai pas mis getData. Mais cette connaissance est implicite. Un apprenant écrit getData et ne voit pas le problème — parce que ça marche.

Le clean code n'est pas un ensemble de règles esthétiques. C'est un contrat de communication entre le code et le futur lecteur (qui sera vous dans 6 mois). Ce contrat n'est pas inné. Il s'apprend en regardant le code des autres se casser en production.

J'ai dû verbaliser des choses que je n'avais jamais expliquées : pourquoi un nom de variable de 3 lettres dans une fonction de 80 lignes est un drame, pourquoi un if imbriqué à 5 niveaux est une dette, pourquoi un commentaire qui paraphrase le code est du bruit.

3. La règle qui a tout changé : "ton code sera lu 10 fois"

Première chose que j'ai martelée : le code est lu 10 fois plus qu'il est écrit. Pas par marketing — par calcul mathématique.

Un projet vit 2 à 5 ans en production. Pendant ce temps, vous le relisez :

  • Pour ajouter une fonctionnalité
  • Pour fixer un bug
  • Pour expliquer à un collègue
  • Pour le porter sur une nouvelle techno
  • Pour rendre compte au PO

Si écrire une fonction prend 10 minutes mais la rendre lisible en prend 12, le surcoût initial est récupéré dès le premier débogage.

J'ai forcé cette discipline avec une règle pratique : chaque PR doit pouvoir être expliquée à voix haute en 2 minutes. Si l'apprenant n'arrivait pas, c'est que le code était trop dense, trop confus, ou faisait trop de choses. On refactorait avant de merger.

4. Les anti-patterns qui sont revenus le plus souvent

4.1 Les noms vagues

data, info, result, temp, val. Symptômes de "je sais pas comment l'appeler, mais ça marche".

Correction : toujours nommer par ce que c'est, pas par ce que c'est techniquement. Pas array, mais activeUsers. Pas fn, mais computeMonthlyRevenue.

TypeScript
1// ❌ Vague
2function getData(id: string) {
3 const res = await fetch(`/api/users/${id}`);
4 const data = await res.json();
5 return data;
6}
7 
8// ✅ Précis
9async function fetchUserProfile(userId: string): Promise<UserProfile> {
10 const response = await fetch(`/api/users/${userId}`);
11 return response.json();
12}

4.2 Les fonctions qui font tout

J'ai vu des fonctions de 200 lignes qui validaient, fetchaient, transformaient, enregistraient et notifiaient. Toutes en une seule.

Règle : une fonction = un verbe = une responsabilité. Si le nom contient un "et", c'est suspect. Si on doit faire défiler pour voir la fin, c'est cassé.

Limite pratique enseignée : 30 lignes pour une fonction, refactor obligatoire à 50. Pas une règle dogmatique, un signal d'alerte.

4.3 Le if qui pyramide

TypeScript
1// ❌ Pyramide
2function processOrder(order) {
3 if (order) {
4 if (order.items.length > 0) {
5 if (order.payment) {
6 if (order.payment.status === "valid") {
7 // ... 40 lignes de logique
8 }
9 }
10 }
11 }
12}
13 
14// ✅ Early returns
15function processOrder(order: Order): OrderResult {
16 if (!order) return { ok: false, reason: "no_order" };
17 if (order.items.length === 0) return { ok: false, reason: "empty_cart" };
18 if (!order.payment) return { ok: false, reason: "no_payment" };
19 if (order.payment.status !== "valid") return { ok: false, reason: "invalid_payment" };
20 
21 // logique principale, à plat
22}

La pyramide de if est un sucre lent qui s'accumule. Les early returns sortent le code de la pyramide. Toujours rejeter d'abord, traiter ensuite.

4.4 Les commentaires qui paraphrasent

TypeScript
1// ❌ Bruit
2// On incrémente le compteur
3counter += 1;
4 
5// ❌ Faux ami : ce commentaire devient faux quand le code change
6// Récupère les utilisateurs actifs des 30 derniers jours
7const users = await User.findAll({ where: { lastSeen: { [Op.gt]: thirtyDaysAgo } } });
8 
9// ✅ Commente le pourquoi, pas le quoi
10// Cache 5 min pour réduire la charge sur la base — voir incident 2025-01-14
11const users = await User.findAll({ ... });

La règle enseignée : le commentaire doit expliquer ce que le code ne peut pas dire. Pas paraphraser. Si le code est confus au point qu'il demande un commentaire pour être compris, refactor d'abord, commente ensuite.

4.5 Les paramètres sans nom

TypeScript
1// ❌ Quel est ce true ? Et ce 30 ?
2createUser("Alice", "alice@test.com", true, 30);
3 
4// ✅ Objet avec champs explicites
5createUser({
6 name: "Alice",
7 email: "alice@test.com",
8 isAdmin: true,
9 ageYears: 30,
10});

Règle pratique : 3 paramètres maximum, au-delà on prend un objet. Le call-site devient auto-documenté.

5. La discipline de Git

90 % des apprenants arrivaient avec un compte GitHub vide ou un seul commit "Initial commit". J'ai imposé tôt :

  • Branches par fonctionnalité, jamais en main direct
  • Commits atomiques (un commit = un changement cohérent)
  • Messages descriptifs au présent (add login form, pas added login form)
  • PR avec description : "qu'est-ce que ça change, pourquoi"
  • Review entre apprenants avant merge

Le but n'était pas la perfection git. Le but était d'ancrer la culture du code public. Une fois qu'ils ont compris que leur code serait lu, les habitudes ont basculé.

6. Le pair-programming systématique

Une heure par jour de pair-programming forcé (driver/navigator). Au début, douloureux. Après 2 semaines, transformation visible :

  • Les apprenants verbalisent leur raisonnement
  • Les erreurs sont rattrapées en 30 secondes au lieu de 30 minutes
  • Le vocabulaire technique s'aligne dans la promotion
  • La culture de "demander n'est pas une faiblesse" s'installe

C'est aussi le moment où j'ai vu naître les meilleurs développeurs : pas forcément ceux qui codaient le plus vite, mais ceux qui posaient les meilleures questions.

7. L'évaluation par projet

J'ai supprimé les QCM théoriques. À la place : un projet de fin de module, défendu à l'oral devant la promotion.

Critères :

  1. Le code tourne et fait ce qu'il prétend faire (50 %)
  2. Le code est lisible par un dev qui ne l'a pas écrit (25 %)
  3. Le code gère les erreurs prévisibles (15 %)
  4. Le code a un README et un déploiement (10 %)

Aucun bonus pour la "performance pure" ou les "techniques avancées". Juste la livrable et sa qualité de communication.

Ce barème a tué l'apprentissage par cœur et forcé la compréhension. Les meilleurs apprenants n'étaient pas ceux qui avaient retenu le plus de syntaxe, mais ceux qui livraient le code le plus clair.

8. La dette technique vue par un débutant

Le plus étonnant : les débutants voient la dette technique mieux qu'on ne le croit. Ils ne savent juste pas la nommer.

Quand un apprenant arrive et dit "je comprends pas mon propre code d'hier", c'est qu'il a écrit de la dette. Quand il dit "ça marche mais je sais pas pourquoi", c'est un signal qu'il faut refactor avant de continuer.

J'ai institutionnalisé le "daily refactor" : tous les matins, 30 minutes, chaque apprenant relit le code de la veille et le rend meilleur. Cette pratique seule a changé le niveau moyen de la promotion en 6 semaines.

9. Les outils qui ont compté

  • ESLint + Prettier : automatisation de l'esthétique pour ne pas avoir à en discuter
  • TypeScript strict : pour qu'erreur de logique devienne erreur de compilation
  • VS Code + GitHub Copilot : surtout pour les boilerplate, ne JAMAIS pour la logique métier (sinon ils n'apprennent pas)
  • Cypress / Playwright pour les tests E2E sur les projets de fin
  • Vercel / Railway pour le déploiement (gratuit, rapide, motivant)

10. Ce qui m'a fait changer ma propre pratique

Trois choses que j'ai changées dans mon code après cette mission :

  1. Je nomme mieux — la verbalisation devant des apprenants m'a forcé à voir mes mauvais noms
  2. Je refactor plus tôt — voir la dette s'accumuler en accéléré chez des débutants m'a rendu allergique à laisser un fichier dégrader
  3. J'écris moins de commentaires — je préfère un nom explicite à un commentaire descriptif

11. Pièges à éviter en formation

PiègeSymptômeCorrection
Théorie sans pratiqueApprenants qui récitent sans comprendre70 % pratique minimum
Frameworks sans fondationsBloqués dès que le framework changeCommencer par JS pur, ajouter ensuite
Évaluation théoriqueApprentissage par cœurÉvaluation par projet livré
Pas de Git tôtHabitudes solo dangereusesBranches dès le jour 3
Tutos copiés sans compréhensionBloqués hors du chemin baliséForcer à débugger seul avant aide
Pas de pair-programmingSolitude + dette accumuléeSessions quotidiennes forcées

12. Conclusion

Enseigner m'a rendu meilleur développeur, plus que n'importe quelle formation suivie. Verbaliser des choix tacites, expliquer pourquoi un nom est mauvais, regarder la dette se créer en temps réel — tout ça change la manière dont vous écrivez votre propre code.

Si vous avez l'occasion de former, prenez-la. Pas pour la rémunération (souvent faible), pas pour le statut (souvent ignoré). Pour ce que ça vous apprend sur votre propre métier.

Le clean code n'est pas une exigence du code. C'est une exigence du futur lecteur. Et le futur lecteur, c'est vous.

Commentaires

Réactions des lecteurs

Aucun commentaire pour l'instant

Aucun spam — l'email sert uniquement à vérifier votre identité.

·

Soyez le premier à réagir à cet article.

←PrécédentDu MVP à la traction — 8 patterns pour ne pas livrer un SaaS B2B qui dortBusiness · 8 min de lecture
Prochain échange

Transformer cette lecture en décision produit.

Si ce sujet ressemble à un problème réel dans votre produit, je peux intervenir sur le diagnostic, l'architecture, le backend, l'interface et les automatisations qui rendent une plateforme exploitable.

Format
CDI, freelance, mission longue
Focus
SaaS, API, back-office, automatisation
Discuter du sujetTélécharger le CV

Newsletter

Recevoir les prochaines notes techniques.

Une sélection courte sur SaaS, architecture backend, automatisation métier et qualité produit. Pas de bruit, seulement des idées applicables.