Dette techniqueArchitectureLivraison logicielle

Comment la dette technique s’accumule sans que personne ne s’en aperçoive

La dette technique naît d’une suite de choix raisonnables que personne ne regarde dans leur ensemble, et d’un mécanisme qui la rend invisible jusqu’à ce qu’il soit trop tard.

QMates· Software Advisory14 avril 20269 min de lecture

Le paradoxe des décisions raisonnables

Rares sont les équipes qui accumulent de la dette technique par négligence. Elles le font en enchaînant des décisions qui, sur le moment, semblent toutes raisonnables. Il y a une échéance, un contexte partiellement connu, une pression légitime. La solution la plus simple fonctionne. On avance.

La même logique s’applique ensuite à la décision suivante, puis à la suivante encore, et encore après : chacune, prise seule, se défend très bien. Leur effet cumulé, lui, ne l’est pas, et personne n’est chargé de l’observer. Les systèmes logiciels ne manquent pourtant pas de signaux : la pipeline de CI, les outils d’analyse statique, le taux d’incidents en production fournissent un retour continu. Ce qui manque, c’est un mécanisme qui convertisse automatiquement le coût agrégé de la dette en un chiffre que la direction puisse comprendre. Le coût cumulé des décisions locales reste invisible jusqu’à ce qu’il soit trop tard.

Comprendre ce mécanisme d’accumulation sert avant tout à repérer où introduire les mécanismes de retour qui font aujourd’hui défaut, avant que le coût ne devienne insoutenable, bien plus qu’à chercher des coupables parmi ceux qui ont décidé par le passé.

Trois schémas de sédimentation

La dette ne s’accumule pas de façon uniforme. D’après notre expérience, elle tend à se sédimenter selon trois dynamiques récurrentes, des schémas que nous retrouvons souvent dans les équipes avec lesquelles nous travaillons. Les reconnaître est utile, car chacun appelle une réponse différente.

Le premier schéma, c’est la compression par la vitesse. Une équipe doit livrer dans un délai serré, une démo, un contrat, une fenêtre de marché. Le raccourci technique est rationnel : on évite le refactoring qui serait nécessaire, on duplique une logique qu’il faudrait extraire, on contourne une abstraction qui ralentit mais garantit la maintenabilité. Le résultat immédiat est correct. Le coût, lui, est différé. Si la compression se répète tous les deux ou trois sprints, ce coût différé s’accumule sans jamais être remboursé, parce qu’il y a toujours une raison urgente de ne pas s’en occuper maintenant.

Le deuxième schéma, c’est la fossilisation par la croissance. Une architecture se dessine à un moment précis de la croissance de l’organisation, pour répondre aux contraintes de cet instant. Six développeurs, un seul produit, trois clients. L’architecture est la bonne, dans ce contexte-là. Le contexte change ensuite – vingt développeurs, quatre produits, cent clients – mais l’architecture, elle, reste en place. Personne n’a décidé de ne pas la mettre à jour ; simplement, personne n’en a jamais reçu le mandat explicite, et le système a continué de fonctionner suffisamment bien pour ne jamais justifier d’intervention urgente. La fossilisation est la dette la plus coûteuse, car c’est la plus invisible : le système fonctionne, mais chaque modification exige des contournements que personne n’avait prévus.

Le troisième schéma, c’est la sédimentation par le turnover. Chaque développeur qui rejoint une équipe hérite de décisions prises par d’autres, dans des contextes qu’il n’a pas connus. Les raisons d’origine restent dans la mémoire des personnes : le code seul ne les conserve pas. Quand ces personnes partent, et elles finissent toujours par partir, les raisons disparaissent avec elles. Ceux qui arrivent ensuite travaillent sur un système qui a une histoire, mais pas de trace écrite de cette histoire. Les décisions suivantes se superposent aux précédentes sans les comprendre. La dette se stratifie.

Le décalage structurel entre qui crée la dette et qui la paie

Un mécanisme organisationnel aggrave ces trois schémas à la fois : ceux qui prennent les décisions créatrices de dette ne sont pas ceux qui en paient le coût, et souvent pas non plus au même moment.

L’équipe qui choisit le raccourci pour tenir le délai de mars ne sera probablement pas celle qui fera la maintenance deux ans plus tard. La direction qui a donné la priorité aux fonctionnalités, au détriment du refactoring, ne verra le ralentissement provoqué par ce choix que lorsqu’il sera trop tard pour l’y rattacher. Le développeur qui a introduit la dépendance circulaire aura peut-être quitté le projet le jour où cette dépendance bloquera une intégration critique.

Ce décalage vient de la façon dont se répartissent les responsabilités et les incitations dans le temps. Les systèmes d’incitation optimisent pour des objectifs à court terme ; les coûts de la dette technique, eux, se manifestent à moyen ou long terme. Tant qu’il n’existe aucun mécanisme pour rendre les coûts futurs visibles dans le présent, la structure des incitations penche toujours vers l’accumulation.

La réponse consiste à créer des mécanismes qui rendent les coûts futurs visibles avant qu’ils ne se matérialisent : blâmer ceux qui ont accumulé la dette ne change rien à la structure d’incitations qui a rendu ce choix rationnel.

La psychologie de l’invisibilité

Au mécanisme organisationnel s’ajoute un mécanisme psychologique, qui rend la dette difficile à voir même pour ceux qui sont à l’intérieur du système.

La dette s’accumule par petits incréments. Aucun commit, à lui seul, ne transforme un système sain en système intenable. La transition se fait graduellement, à travers des centaines de modifications, chacune légèrement pire que la précédente mais jamais alarmante prise isolément. Le cerveau humain est câblé pour repérer les changements brusques ; les dérives lentes restent sous le seuil d’attention. Le mécanisme qui empêche de remarquer qu’on a pris dix kilos en un an est le même qui empêche de remarquer que le cycle time a doublé en douze mois.

Il y a ensuite le problème du contexte local. Chaque développeur a une vision fine de sa propre zone du système, et une vision partielle du reste. La dette qui ralentit la livraison se loge souvent dans les intersections, dans les dépendances entre modules, dans les frontières où la responsabilité reste floue : des zones qui échappent à la vision approfondie de chacun. Personne ne voit le système dans sa totalité : le CTO en perçoit la structure globale, les développeurs en connaissent les parties spécifiques. La dette systémique vit dans les espaces entre les deux.

Il y a enfin l’effet de normalisation. Quand le cycle time moyen a toujours été de trois semaines, trois semaines devient la référence normale. Personne ne se demande s’il pourrait n’en durer qu’une. Quand chaque mise en production exige une journée de coordination manuelle, cela devient le processus normal. Les écarts à la norme se voient ; la norme elle-même cesse d’être remise en question. La dette technique accumulée au fil des années n’est plus perçue comme telle : elle devient simplement « la façon dont les choses fonctionnent ici ».

Les signaux précoces qu’on ignore le plus souvent

La dette envoie des signaux avant de devenir un problème grave. Le souci, c’est que ces signaux sont presque toujours lus comme des problèmes locaux et temporaires. Ils annoncent pourtant quelque chose de systémique.

Le premier signal, c’est la variance dans les estimations. Des estimations ponctuellement fausses sont normales ; ce qui compte, c’est la croissance systématique de l’écart entre estimation et réalisé, sprint après sprint. Quand une équipe sous-estime régulièrement de 40 à 60 %, il y a presque toujours une raison structurelle : le système est moins prévisible qu’il n’y paraît de l’extérieur, parce que les dépendances cachées multiplient les effets de bord de chaque changement. Le problème d’estimation n’est que le symptôme de cette complexité.

Le deuxième signal, ce sont les silos de connaissance. Quand une ou deux personnes seulement connaissent vraiment une partie du système, cette partie est à risque. La connaissance concentrée est à la fois un effet de la dette – les zones les plus complexes demandent des années à comprendre, donc peu de gens y parviennent vraiment – et une cause d’accumulation supplémentaire, car qui ne connaît pas ne peut pas intervenir en confiance. Les nouveaux développeurs mettent des mois avant de contribuer en autonomie : le système est peu lisible, et leurs compétences n’y sont pour rien.

Le troisième signal, c’est l’asymétrie dans les revues de code. Quand certains modules reçoivent des revues superficielles parce que « mieux vaut ne pas trop toucher à cette partie », la dette est déjà bien installée. Les revues superficielles ne font que ralentir l’accumulation, sans jamais l’arrêter ni vraiment protéger le système. Une équipe qui a cessé de faire des revues approfondies sur certaines zones a déjà accepté implicitement que ces zones échappent à tout contrôle.

De la vitesse d’accumulation à la vitesse d’impact

Toute la dette accumulée n’a pas le même impact. Une partie freine à la marge des zones périphériques, une autre bloque le cœur du système. La différence tient à la fréquence à laquelle cette zone du code doit être modifiée, et au nombre de dépendances qui la traversent.

Un module legacy qui fait une seule chose, stable depuis des années et hors du chemin critique de la croissance, peut rester tel quel indéfiniment sans que sa dette devienne urgente. Le même niveau de complexité dans un module qui doit changer à chaque sprint, que traverse chaque nouvelle fonctionnalité et dont dépendent dix autres modules, constitue déjà un blocage opérationnel aujourd’hui.

La bonne question pour évaluer l’urgence est « à quelle fréquence devons-nous modifier cette zone, et combien coûte chaque changement par rapport à ce qu’il devrait coûter ? » Se demander seulement « combien de dette avons-nous dans cette zone ? » laisse de côté la variable qui détermine l’urgence : la fréquence de modification. L’écart entre le coût réel et le coût attendu est le chiffre qui mesure l’impact de la dette sur cette zone précise. Le calculer sur toutes les zones critiques du système est le premier pas pour arrêter d’estimer la dette et commencer à la piloter.

Il vaut la peine d’expliciter une distinction qui change la façon d’évaluer l’urgence d’une intervention : la dette technique a un coût qui ne se manifeste qu’au moment du changement. Un système avec une dette élevée mais une faible fréquence de modification porte une dette latente : présente mais silencieuse, sans impact opérationnel immédiat. La dette devient active chaque fois que l’équipe doit intervenir sur cette zone : c’est là que le coût réel se manifeste. Seuls les systèmes qui cumulent dette élevée et fréquence de modification élevée exigent une attention immédiate. L’écart décrit plus haut est l’outil qui permet de distinguer les zones où la dette est déjà active de celles où elle dort encore.

Ce qu’il faut faire concrètement

Trois actions pour commencer à rendre visible l’accumulation avant qu’elle ne devienne intenable.

  1. Mesurez l’évolution du cycle time trimestre après trimestre sur les six derniers mois : une croissance progressive, sans hausse correspondante de la complexité des fonctionnalités, est le signal le plus fiable d’une accumulation en cours. Si vous n’avez pas l’historique, demandez à l’équipe : « combien de temps prenait ce type de changement il y a six mois ? » La mémoire collective est moins précise qu’une donnée instrumentée, mais elle vaut mieux que rien comme point de départ.
  2. Cartographiez les zones de connaissance concentrée : dans quelle partie du système le savoir repose-t-il sur une ou deux personnes ? Ce sont des zones à haut risque, quelle que soit la qualité du code. La connaissance concentrée est à la fois un symptôme de dette et un multiplicateur de risque : dès que cette personne n’est pas disponible, cette partie du système devient opaque pour tous les autres.
  3. Instaurez un rendez-vous périodique sur l’effet cumulé, distinct d’une revue de code qui évalue des changements isolés. Un moment dédié, tous les deux ou trois mois, pour observer l’évolution des indicateurs dans le temps et se demander où l’écart entre estimation et réalisé s’est creusé. Les raccourcis restent inévitables, même dans les organisations qui gèrent bien leur dette ; ce qui les distingue, c’est qu’elles font régulièrement une pause pour évaluer le chemin parcouru.

Le regard de QMates

Le schéma le plus fréquent que nous rencontrons concerne une équipe compétente, qui a bien travaillé dans un contexte donné, pendant que ce contexte changeait sans que le système ne suive. L’architecture est restée celle dessinée deux ans plus tôt ; l’organisation, elle, a triplé de taille. Des bounded contexts pensés pour un seul produit servent désormais trois produits différents. Des processus de mise en production conçus pour une équipe de six personnes sont gérés par vingt personnes, avec les mêmes procédures manuelles.

Quand nous entrons dans une organisation, la première chose que nous mesurons, c’est le désalignement : entre la façon dont le système est structuré et la façon dont le métier fonctionne aujourd’hui, entre l’organisation des équipes et la répartition des responsabilités dans le code, entre la vitesse que le système permettait et celle que l’organisation exige désormais. La dette technique qui compte, c’est l’écart entre le système que vous avez et celui dont vous avez besoin pour grandir au rythme où vous grandissez.

Ce deuxième article de la série a décrit le mécanisme d’accumulation. Le troisième aborde les signaux concrets qui permettent de repérer où la dette a déjà commencé à ralentir la livraison, avant que cela ne devienne une urgence.

Dites-nous où vous êtes bloqué

Prototype fragile, legacy lourd ou livraison imprévisible, c’est notre point de départ

Nous utilisons vos données pour répondre à votre demande. Consultez notre Politique de confidentialité.