L’objectif de cette présentation est nous faire partager un retour sur expérience d’un projet de refactoring d’une application de gestion classique en Java. Présenté par Sibylle Peter et Sven Ehrke de Canoo Engineering AG, la présentation était intéressante car très ancrée dans la réalité.
Prenons tout d’abord un constat simple : dans la vraie vie, notre travail d’architecte senior et de consultant n’est pas toujours d’apporter de l’innovation. Nous sommes souvent mandatés par un client pour revoir une architecture, introduire de meilleurs pratiques, bref faire de la chirurgie esthétique, voir parfois de la chirurgie lourde.
La présentation nous a montré la démarche de l’équipe. Tout d’abord un point pour comprendre la démarche projet: cette équipe de consultants est venue de l’extérieure pour auditer puis refactorer une grosse application. Refactorer, en utilisant le verbe, signifie appliquer un ensemble d’opération visant à revoir le code d’une application dans le but de l’améliorer.
Concernant le pourquoi de ce refactoring, les 2 speakers citent tout d’abord la dette technique. 8 ans de code, 140 entités, un énorme ensemble de code Java, un turn-over important dans l’équipe qui fait que personne ne sait plus pourquoi telle classe fait telle chose… bref tout ceci me parle.
Une courbe nous montre le cycle de vie d’un logiciel. Il y a un point d’inflexion où le coût de maintenance excède le coût de développement d’une nouvelle fonctionnalité. Trop de code, cela fragilise forcément un produit. Introduire une nouvelle fonction devient de plus en plus risqué et complexe.
Le projet étudié comprend 320 JSP, 1800 classes Java, très peu de documentation. A cause du turn-over des prestataires, peu de personne connaissent l’ensemble du produit. Les tests unitaires ne sont pas nombreux, et lorsqu’ils sont là, ils ne sont pas toujours écrits pour les parties les plus critiques. Bref un sacré projet.
La démarche a constitué à prendre le code dans une branche séparée, à introduire des patterns de refactorisation, afin de découper le code. Cela a permis ensuite de retirer le framework Web propriétaire pour le remplacer par un framework moderne. Le découpage en couche, l’introduction de Facade et de DTOs, bref de la chirurgie plastique classique.
L’ajout d’objet métier léger a aussi permis de remplacer des paquets de « String toto » par des objets léger intelligents, des BaseTypes Objects. Ces objets ont permis aux développeurs de faire de la validation légère au lieu de se trainer des String, relativement bêtes. Une classe simple déclarée permet par exemple de limiter la taille d’un champ à 10 caractères, de s’assurer que les 2 premiers caractères sont des chiffres. Pour cela un BaseTypes Object avec des expressions régulières permet de valider à la construction les objets. C’est du design orienté par le modèle.
La couche Service sera structurée avec des points d’entrées et de sorties. Elle permet aussi d’agréger différents services. Je ne suis pas forcément d’accord avec la présentation, mais n’ayant pas le contexte complet il est difficile de juger de la pertinence de la solution présentée.
Concernant la gestion de projet et d’équipe, les 2 speakers ont exposé quelques principes Agile, sans citer XP ou Scrum. Mais là encore, la remise en question du processus a permis de développer une nouvelle version plus rapidement.
Une petite phrase :
« Without changing it’s observable behavior »
Enfin les présentateurs parlent de l’industrialisation du projet. Installation d’un moteur d’intégration continue, mise en place de construction toutes les nuits, gestion des tests, deploiement chaque nuit, etc.
En conclusion, pour réussir un projet de refactoring il faut un plan général, la confiance du client, un ingénieur connaissant l’ancienne version, une approche pragmatique et itérative, de bons outils, un peu de bol aussi, et du temps.
J’ai bien aimé cette présentation qui nous parle, à nous les petits vieux appelés en mission chez des clients pour faire du bouche-à-bouche à du code de 95 ans.
Refactorer une application demande un sacré paquet de compétences : honnêteté, vision, courage, esprit pragmatique, confiance, engagement…