Attention, opinion brûlante. Accrochez-vous.

J’ai passé pas mal de temps à écrire sur la dette technique, à prêcher les bonnes pratiques de code propre et à défendre les architectures solides. J’ai expliqué aux développeurs comment l’éviter, comment la rembourser, comment la négocier avec leurs managers.
Voilà le truc : j’avais partiellement tort.
Pas sur les pratiques, elles restent bonnes. Pas même sur toutes les utilisations du terme. Mais sur le fait d’accepter ce cadre conceptuel sans esprit critique.
La dette technique n’est pas juste mal comprise ; c’est une métaphore fondamentalement cassée qui déforme notre façon de penser le développement logiciel. Et le pire ? On continue à l’utiliser parce que c’est la seule métaphore financière que les dirigeants comprennent, ce qui veut dire qu’on est coincés à expliquer des problèmes d’ingénierie dans des termes qui obscurcissent activement ce qui se passe réellement.
Laissez-moi vous expliquer.
Ward Cunningham a créé le terme “dette technique” en 1992 pour décrire un scénario précis : choisir délibérément une implémentation rapide en sachant qu’on la refactorisera plus tard. Comme une dette financière, vous empruntez du temps maintenant avec la promesse de le rembourser avec intérêts.
Mais voilà ce qui se passe réellement dans la plupart des organisations :
Manager : “Pourquoi cette fonctionnalité prend autant de temps ? Je croyais que tu avais dit deux semaines ?”
Ingénieur : “Ben, on a beaucoup de dette technique à contourner…”
Manager : “Pff, pourquoi vous n’avez pas écrit du meilleur code dès le départ ?”
Et comme ça, les ingénieurs deviennent les méchants. Ceux qui ont “accumulé de la dette”. Ceux qui ont pris des “raccourcis”. Ceux qui freinent maintenant l’entreprise.
Sauf que c’est complètement n’importe quoi.
La vraie dette fonctionne comme ça : vous allez voir un prêteur, vous négociez les termes, vous signez des papiers, et vous acceptez de rembourser le capital plus les intérêts. Vous comprenez le deal. Vous y consentez.
La dette technique ? Voilà comment ça se passe vraiment :
Manager : “Il faut que ça soit livré vendredi pour la démo investisseurs.”
Ingénieur : “Ce n’est pas assez de temps pour le faire correctement. On aurait besoin d’au moins trois semaines pour bien le construire.”
Manager : “Fais en sorte que ça marche. Je m’en fous comment.”
[Trois mois plus tard]
Manager : “Cette base de code est un bordel.”
Vous voyez le problème ? L’ingénieur n’a rien “emprunté”. Il n’a pas choisi la dette. On lui a donné des contraintes impossibles et il a fait de son mieux. Et maintenant on le blâme pour les “intérêts”.
Ce n’est pas de la dette technique. Ce sont les conséquences techniques des décisions du management.
Voilà un autre truc qui me rend fou : appeler n’importe quel vieux code “dette technique”.
Votre base de code de 4 ans qui utilise React 16 au lieu de la dernière version n’est pas de la “dette”. Votre API qui retourne du XML au lieu de GraphQL n’est pas de la “dette”. Votre monolithe que tout le monde voudrait maintenant transformer en microservices n’est pas de la “dette”.
C’est juste du code qui existe dans le temps.
Les exigences changent. Les plateformes évoluent. Les bonnes pratiques changent. De nouveaux frameworks émergent. Le contexte dans lequel votre code a été écrit n’est pas le contexte dans lequel il vit aujourd’hui.
Appeler ça de la “dette” implique que quelqu’un a fait une erreur. Ça implique de la négligence. Ça implique que si seulement les ingénieurs avaient été plus intelligents, plus visionnaires, plus compétents, ce ne serait pas un problème.
Mais ce n’est pas comme ça que le logiciel fonctionne. Ce n’est pas comme ça que quoi que ce soit fonctionne. On ne peut pas prédire l’avenir. On ne peut pas construire pour des exigences qui n’existent pas encore. Et même si on le pouvait, on ferait du sur-ingénierie et on perdrait du temps à construire une flexibilité qu’on n’utilisera jamais.
Parlons de ce MVP que vous avez construit il y a deux ans. Celui qui est maintenant “legacy”. Celui qui “doit être réécrit”. Celui qui “vous freine”.
Vous savez ce que ce MVP a aussi fait ? Il a validé votre modèle économique. Il a acquis vos mille premiers utilisateurs. Il a généré le revenu qui vous permet d’avoir cette conversation.
Sans ce “mauvais code”, vous n’auriez rien. Vous auriez fait faillite en attendant “l’architecture parfaite”.
Mais maintenant qu’il a du succès, maintenant qu’il scale, maintenant que vous voulez aller plus vite… soudainement c’est de la “dette technique”. Soudainement les ingénieurs qui ont construit la chose qui a rendu votre entreprise viable sont blâmés pour ne pas l’avoir construite “correctement”.
C’est du biais du survivant et du biais rétrospectif roulés en un seul burrito toxique.
Chaque décision d’ingénierie est un compromis. Pas quelques-unes. Pas la plupart. Toutes.
Il n’y a pas de “bonne” réponse à ces questions. Il y a seulement “bon pour notre contexte actuel, nos contraintes et nos priorités”.
Les bons managers comprennent ça. Ils participent à ces décisions. Ils disent des choses comme :
“On optimise pour la vitesse maintenant parce qu’on doit valider le marché. On revisera l’architecture une fois qu’on aura trouvé notre product-market fit.”
Les mauvais managers disent :
“Fais juste en sorte que ça marche. Démerde-toi.”
Et puis plus tard :
“Pourquoi il y a autant de dette technique ?”
Voilà ce qui se passe vraiment quand les managers ne comprennent pas la nature cumulative des coûts de maintenance :
Année 1 : “Livrez vite ! Ne vous inquiétez pas du code parfait !”
Année 2 : “Pourquoi les nouvelles fonctionnalités prennent plus de temps ? On livrait si vite avant !”
Année 3 : “On doit arrêter tout le travail sur les fonctionnalités et faire une réécriture.”
Ce n’est pas de la dette technique. C’est le management qui ne comprend pas que la maintenance logicielle n’est pas gratuite. Que chaque fonctionnalité ajoute de la surface. Que chaque dépendance doit être mise à jour. Que chaque API nécessite du versioning.
Les ingénieurs le savaient. Ils vous l’ont dit. Vous n’avez pas écouté parce que vous étiez concentré sur le prochain trimestre.
D’accord. Oui. Parfois les ingénieurs coupent vraiment les coins. On saute l’écriture des tests. On code en dur des valeurs. On ne gère pas les erreurs correctement. On fait du copier-coller au lieu d’abstraire.
Mais vous savez quoi ? Ça arrive presque toujours à cause de pression externe.
“On a besoin de ça pour la démo de demain.”
“Le client menace de partir si on ne livre pas cette semaine.”
“On perd de l’argent et on a besoin de revenus maintenant.”
Même les vraiment mauvaises décisions d’ingénierie sont généralement prises sous contrainte, avec un temps limité, des informations incomplètes et une pression immense de… attendez… le management.
Bon, soyons honnêtes. Je ne peux pas écrire tout un article pour défendre les ingénieurs sans reconnaître l’éléphant dans la pièce : parfois le code est vraiment juste mauvais, et ce n’est pas la faute du management.
Parfois vous embauchez un développeur qui :
Et parfois, votre processus de revue de code est tellement cassé que ce truc arrive en production quand même.
Vous connaissez ce pattern. Quelqu’un ouvre une PR à 16h45 un vendredi. C’est 847 lignes de changements sur 23 fichiers. Le reviewer y jette un œil pendant 90 secondes, ne voit pas d’erreurs de syntaxe évidentes, et clique sur “Approve” pour pouvoir commencer son week-end.
Ou pire, vous avez un ingénieur “senior” qui est territorial et sur la défensive, et tout le monde a peur de donner un vrai feedback parce que la dernière fois que quelqu’un a suggéré un refactoring, il a reçu un essai de 2 000 mots expliquant pourquoi il a tort suivi de trois semaines de messages Slack passifs-agressifs.
Certaines équipes n’ont vraiment aucun standard de code. Pas de guide de style. Pas de principes architecturaux. Pas de patterns convenus. Tout le monde fait juste ce qui lui semble bon sur le moment.
Une personne écrit du code fonctionnel avec des structures de données immuables. Une autre écrit de l’OOP avec beaucoup d’héritage. Une troisième a découvert l’injection de dépendances la semaine dernière et injecte maintenant tout y compris l’évier de cuisine. La quatrième veut juste livrer et se fout de tout ça.
Le résultat ? Une base de code Frankenstein où chaque module a l’air d’avoir été écrit par une entreprise différente.
Voilà un scénario plus commun qu’on voudrait l’admettre : vous embauchez un développeur junior, vous lui donnez un ticket, et… personne ne vérifie son travail. Il galère pendant deux semaines, finit par faire marcher quelque chose par essai-erreur, et le livre. Ça marche (plus ou moins), donc ça part en production.
Six mois plus tard, quelqu’un doit modifier ce code et découvre que ça tient avec du scotch et des prières. Pas de tests. Pas de gestion d’erreurs. Des variables nommées temp1, temp2, finalFinal, finalFinalActuel. La logique métier mélangée avec le code UI mélangé avec les requêtes de base de données.
Est-ce de la dette technique ? Est-ce la faute du management ? En quelque sorte oui, en quelque sorte non.
Le management a échoué à fournir du mentorat et de la supervision. Mais aussi, l’ingénieur aurait pu demander de l’aide. Aurait pu regarder le code existant pour les patterns. Aurait pu… vous savez, essayer.
Donc voilà où ça devient compliqué. Parce que même quand le code est vraiment mauvais à cause d’échecs d’ingénierie, le cadre de “dette technique” est toujours faux.
Pourquoi ? Parce qu’appeler ça “dette” :
Si vous avez embauché quelqu’un qui n’est pas assez bon, c’est un problème d’embauche. Si vos revues de code n’attrapent pas les problèmes, c’est un problème de processus. Si votre équipe n’a pas de standards, c’est un problème de leadership. Si les juniors livrent du code impossible à maintenir, c’est un problème de mentorat.
Rien de tout ça n’est de la “dette”. Ce sont des échecs organisationnels qui se manifestent par des problèmes de qualité de code.
Et voilà le truc : même ces échecs remontent souvent aux décisions du management. Qui a décidé de :
Vous voyez comment on revient toujours au management ?
Mais ne nous laissons pas complètement décrocher. En tant qu’ingénieurs, on doit assumer notre métier. On doit :
Si vous avez approuvé une PR sans la lire, vous partagez la responsabilité de ce code. Si vous avez écrit du code bâclé parce que vous n’aviez pas envie de faire attention, c’est sur vous. Si vous écrivez les mêmes mauvais patterns depuis cinq ans et refusez d’apprendre, vous êtes le problème.
La différence ? Quand on assume ces échecs, on peut vraiment les corriger. On peut améliorer notre culture de revue de code. On peut monter en compétences. On peut établir de meilleures pratiques.
Mais quand on se cache derrière “dette technique” comme fourre-tout vague, on ne peut rien corriger parce qu’on n’identifie même pas le vrai problème.
Au lieu de “dette technique”, essayez :
“Conséquences techniques des décisions business passées” – Verbeux, mais précis. Garde la responsabilité là où elle appartient.
“Coût de maintenance” – Chaque base de code en a un. Il grandit avec le temps. Budgétez pour ça.
“Changement de contexte” – Ce qui avait du sens il y a deux ans n’en a plus maintenant. C’est OK.
“Refactoring nécessaire” – Le logiciel évolue. Le refactoring est normal. Arrêtez de le traiter comme une punition.
“Le coût d’apprendre” – Vous ne saviez pas que ce que vous construisiez aurait du succès. Maintenant vous le savez. Il est temps d’optimiser.
La dette technique n’est pas un mythe parce que les raccourcis n’existent pas. C’est un mythe parce que la métaphore a été corrompue au-delà de toute reconnaissance.
Elle est devenue un moyen pour les managers de :
Les bons managers assument les compromis. Ils disent “On a choisi la vitesse plutôt que la flexibilité et maintenant on doit ré-optimiser. Ça prendra du temps et des ressources. J’alloue les deux.”
Les mauvais managers weaponisent le recul. Ils disent “Vous auriez dû bien le construire dès le début. Pourquoi il y a autant de dette technique ?”
Si vous êtes un manager qui lit ceci et que vous vous êtes déjà plaint de dette technique, demandez-vous : avez-vous donné à votre équipe le temps et les ressources pour le construire “correctement” ? Saviez-vous même ce que “correctement” voulait dire ? Ou vouliez-vous juste que ce soit livré ?
Si vous êtes un ingénieur qui lit ceci, arrêtez d’accepter le blâme pour des décisions qui n’étaient pas les vôtres. La prochaine fois que quelqu’un mentionne la dette technique dans une rétro, essayez ça :
“Parlons des contraintes sous lesquelles on travaillait quand on a pris ces décisions. Parce que je suis à peu près sûr qu’on a fait le meilleur choix possible avec l’information et le temps qu’on avait.”
Et s’ils insistent ? S’ils persistent à dire que c’est de la “dette” que vous avez “empruntée” ?
Commencez à passer des entretiens. Parce que vous travaillez pour quelqu’un qui ne comprend pas le développement logiciel et qui vous blâmera toujours quand les choses deviennent difficiles.