Dette technique et Entropie des Systèmes
Nous entendons souvent parler de dette technique au sein de notre métier et nous catégorisons à peu près tout ce qui ressemble à du code legacy ou du mauvais code comme en faisant partie.
Mais d’où vient ce concept et quel rapport avec l’entropie de nos systèmes ? D’ailleurs qu’est ce que l’entropie d’un système ?
Et encore plus important, comment pouvons nous nous emparer de ces concepts pour améliorer la qualité de nos productions techniques et en faire des objets durables dans le temps ?
Chapter 1. Dette Technique
Concept
Le concept de dette technique a été théorisé par Ward Cunningham en 1992. A cette époque Cunningham travaillait pour une entreprise de la finance, un beau jour il a eu besoin d’expliquer à son responsable métier la nécessité de prendre du temps pour « nettoyer » le code existant avant de pouvoir mettre en place une nouvelle fonctionnalité. Assez naturellement et pour pouvoir communiquer avec ses responsables du monde de la finance, le terme de dette a été utilisé. Il va permettre de définir l’achat d’un gain à court terme (ex : évolution critique/urgente pour le business) mais en introduisant une notion d’intérêt (baisse de qualité du code). Si les intérêts ne sont pas remboursés, ils s’accumulent jusqu’à ne plus pouvoir être remboursables, cela peut s’apparenter au concept de subprimes. La dette technique représente ce choix et les conséquences qui y sont associées. La conception de Ward Cunningham définit la dette technique comme étant un écart entre le système (base de code) et le métier. Lors de la mise en place d’une application et durant son évolution plusieurs facteurs (sur lesquels nous reviendrons) peuvent créer un écart entre la conception technique de l’application et son adéquation vis à vis du métier qu’elle est censée représenter. A ce jour certains outils existent pour essayer de mesurer le coût de la dette technique. Ce coût étant défini par le temps nécessaire pour réaligner notre système sur notre métier. Cast, par exemple, a évalué à un coût moyen de 3,61$ par ligne de code. Son analyse se base sur plusieurs indicateurs : complexité, couverture, duplication, conformité, code mort et taux de commentaire.
Répartition de la dette technique selon CAST
Bien évidemment ce ne sont que des indicateurs et une analyse plus fine de leurs pertinences est nécessaire avant d’assurer avec certitude que nous avons bien à faire de la dette technique au sens de Cunningham. La dette générée se doit d’être remboursée dès que possible et selon le choix de l’équipe technique.Création de la dette
Mais comment fait-on pour créer de la Dette Technique ? Comme nous avons pu l’énoncer, la dette technique représente l’écart que peuvent avoir nos systèmes vis à vis du métier qu’ils doivent représenter. Cela peut se faire de façon volontaire ou non et de façon risquée ou prudente. Prudent et volontaire : Cette configuration apparait souvent par des contraintes externes. Imaginons une évolution à réaliser avec une deadline de deux semaines. Dans un fonctionnement que nous qualifierons de « classique » nous fonctionnerons de cette façon : Conception → Développement → Livraison (j’omets volontairement la notion de test à ce niveau). Nous pourrions donc imaginer que sur ces deux semaines nous passions une semaine sur la conception de cette évolution et la deuxième sur le développement « pur ». Seulement au milieu de la deuxième semaine (phase de développement) nous apercevons une problématique que nous n’eussions pas détectée lors de la conception. Nous pourrions prendre du temps pour peaufiner la conception en prenant en compte cette nouvelle contrainte mais l’évolution doit absolument être livrée à la fin de la deuxième semaine pour le lancement qui est critique. Nous allons donc choisir de finir le développement pour la fin de cette deuxième semaine en baissant volontairement la qualité de notre code pour répondre à un besoin urgent et important. Le fait de faire ce choix de façon consciente et en ayant conscience des impacts possibles permet de limiter le poids que pourrait avoir cette baisse de qualité de code sur nos futurs développements et nous permettra de plus rapidement rembourser cette dette. Nous faisons un emprunt en ayant conscience du montant des intérêts. Risqué et volontaire : Pour ce cas-là nous prendrons l’exemple d’une urgence en production critique pour le business. L’anomalie doit être résolue le plus rapidement possible pour éviter un impact trop considérable sur le business. Une décision va être de ne pas réaliser de conception et de développer à tout va et de livrer dès que possible. N’ayant pas eu le temps d’effectuer de conception, nous n’avons pas de vision sur la pertinence du code ajouté vis à vis du métier. Nous avons donc très peu de vision sur le poids de la dette que nous venons de créer. Nous venons de faire un emprunt mais sans vision claire sur la grandeur des intérêts. Prudent et involontaire : Ce contexte pourrait plutôt s’exprimer dans le temps. Nous pourrions imaginer un nouvel arrivant sur le projet à qui il est demandé de réaliser une évolution. Deux semaines pour la réaliser, une semaine de conception et une semaine de développement. Malgré toute la bonne foi de notre développeur, son arrivée récente sur le projet ne lui permettra sûrement pas d’avoir la vision nécessaire sur le métier pour proposer une conception adaptée et donc des développements associés qui seront alignés. Cependant sa vigilance (notamment sur les tests) lui permettra sûrement de limiter autant que possible le poids de cette dette, et au fur et à mesure que ses connaissances augmenteront il sera en mesure de visualiser la portée de la dette technique, de l’écart entre son système et son métier et donc d’y remédier. Risqué et involontaire : Ce cas-là est sûrement le plus dangereux et consisterait, toujours dans le contexte d’une évolution sur deux semaines à dire, « Hum je ne comprends pas trop comment ce besoin s’inscrit dans mon métier mais tant pis allons coder ». Le problème qui me semble évident étant que nous aurons un code qui n’aura sûrement aucune cohérence vis à vis du reste du système et du métier et dont la mesure risque d’être fortement compliquée. Cette évolution risque aussi d’être réalisée sans garde-fous qui pourraient empêcher de plus facilement revenir sur cette évolution.Une bonne dette technique est une dette choisie, pesée et contractualisée.
Impact
Maintenant que nous avons bien créé toute notre dette technique que va-t-il se passer ? Est-ce que c’est si grave ? Une dette technique non traitée aura tendance à en créer d’autres plus importantes : si nous revenons sur notre exemple, nous avons réalisé notre évolution dans les deux semaines imparties (HOURA !) mais nous avons, pour cela, introduit de la dette technique. Pas le temps de se reposer le client à une nouvelle demande d’évolution à réaliser pour dans deux semaines et qui ne peut pas être retardée. De plus cette évolution se base sur celle précédemment réalisée ! Nous nous retrouvons donc dans la même situation mais avec le poids d’une dette déjà existante. Les choix que nous ferons seront donc soumis à cette contrainte et nous forcerons sûrement à tordre encore plus notre système pour pouvoir répondre à l’attente du client dans les temps. Nous allons créer une dette sur une autre déjà existante. Et cette situation ne semble pas tendre vers une augmentation linéaire. Retournons à notre première évolution. Notre système est bien aligné avec notre métier : nous sommes dans des conditions optimales. Suite aux choix que nous avons effectués pour répondre aux besoins nous avons introduit une dette que nous estimons à deux jours (deux jours de travail nécessaires pour réaligner notre système). Si nous redéveloppons par-dessus nous serons donc des conditions qui ne seront pas optimales. Nous allons sûrement devoir tordre un peu plus le modèle, dupliquer un peu plus de code, etc… et au final nous aurons rajouté une dette que nous estimerons, pour le besoin de l’exercice, à six jours. Nous avons donc réussi avec une nouvelle évolution de même acabit à tripler notre dette ! Cet exemple est volontairement exagéré et je n’ai pas de chiffres précis à fournir car ils dépendront du contexte. Si nous imaginons une nouvelle demande sur deux semaines mais pour un module totalement indépendant et sur lequel aucune autre évolution n’est prévue (prenons un POC par exemple) l’introduction de dette ne serait pas un problème car elle n’aurait aucun impact sur les développements futurs ca étant non existant. Mais cela demande une certaine certitude du but de l’évolution/application. A partir de là, nous allons avoir une succession de problèmes. Comme nous le pressentons déjà, le fait d’augmenter la dette va aussi augmenter la complexité de notre code. Tordre un peu plus le modèle, dupliquer etc… tant d’éléments qui vont rendre les interventions futures de plus en plus difficiles. Et des interventions de plus en longues, car là où il nous fallait deux semaines pour développer notre évolution il nous en faut désormais trois et puis bientôt cinq et ainsi de suite. Malheureusement (ou heureusement tout dépend du point de vue) tous ces développements ont un coût. Ce coût absorbé par notre client qui, s’il n’a pas connaissance de la dette et que nous n’avons pas négocié son remboursement, risque de le contrarier. En effet, comment se fait-il que pour une demande d’évolution similaire nous prenions désormais trois fois plus de temps et donc d’argent ? Tant de questions qui risquent de dégrader les relations avec notre client et nous mener petit à petit vers un point de non-retour.Chapter 2. Entropie des Systèmes
Concept
« L’entropie désigne la tendance naturelle d’un système à se désorganiser » C’est sur cette simple définition que nous allons travailler. Nous intervenons tous sur des systèmes, qui se modélisent de différentes façons, soumis à cette loi. L’entropie va donc décrire la rapidité avec laquelle notre code va se détériorer de lui- même avec le temps qui passe. J’aime faire le parallèle avec l’image des écouteurs. Si vous rangez vos écouteurs dans votre poche (et qu’ils ont encore des fils), vous aurez beau les ranger proprement ils finiront quasi-systématiquement (dépendant du temps passé) par sortir emmêlés. Mais bien que cette tendance soit naturelle nous pouvons la maitriser.
L’entropie au naturel
Evolution de l’entropie
Comme nous venons de le voir nous avons affaire à un phénomène naturel que nous ne pouvons donc pas éviter. Mais nous pouvons le comprendre. Tout d’abord revenons un peu sur la complexité. Nous pouvons en distinguer trois types (basés sur la conception d’A. Lemaire)- La complexité essentielle : qui va définir le cœur de notre métier.
- La complexité obligatoire : qui va être due à une nécessité pour répondre à une contrainte fondamentale du système
- La complexité accidentelle : qui va résulter de l’entropie, de mauvaise pratique, .