Lors de la Devoxx 2019 se déroulant au Palais des Congrès de Paris, Helen Wallace, développeuse Java, et James Mac Mahon, spécialiste Devops son tout sourires sur la scène qui les élève au-dessus de la petite foule de développeurs venus les écouter. Ils nous expliquent tranquillement qu’il n’y a pas de fatalité à la lourdeur et aux défauts portés par du code legacy, aussi vaste et complexe soit-il. Murex, éditeur logiciel dans le domaine de la finance, a réussi à venir à bout d’une dette technique de plus de 3 000 jours et ce, selon leurs dires, dans la joie et la bonne humeur ! Leur méthode, dont le cœur technologique est SonarQube, est un savant mélange de compétition entre développeurs, analyse rigoureuse de code (Java) et management intelligent. C’est cette solution, baptisée Sonar Smash, qui m’a frappé par sa relative simplicité, son ingéniosité et son efficacité, que je me propose de vous présenter. Nous commencerons par la base, à savoir le produit-clé SonarQube.

SonarQube : quoi, pourquoi, comment ?

               SonarQube (ancien Sonar), développé par l’entreprise SonarSource, est un outil de review automatique de code permettant de détecter les bugs, les vulnérabilités, le test coverage et les codes smells de vos projets. Celui-ci permet une inspection continue du code dans toutes les branches des projets. Et également un suivi de métriques reflétant la qualité du code. Disponible pour plus de 25 langages (Java, C++, C#…), c’est un outil incontournable de la mouvance Clean Code, branche du Software Craftsmanship.

sonar Smash
Exemple de board de suivi SonarQube (copyright SonarSource)

En prenant l’exemple du langage Java, qui est celui utilisé pour les projets Murex concernés par SonarSmash, SonarQube, via l’analyzer particulier SonarJava, permet la mise en évidence, le suivi et même parfois la correction automatique des problèmes suivants :

  • Null pointers
  • Conditions inutiles (ifs imbriqués)
  • Vulnérabilité à l’injection de code
  • Ressources allouées non-utilisées
  • Problématiques de concurrence
  • Non-respect des conventions et syntaxes…

On peut s’appuyer sur plus de 500 règles dédiées au langage Java.

SonarJava couvre aujourd’hui le langage jusqu’à sa version 11, et est compatible avec les frameworks Struts, Spring et Hibernate. Il s’intègre facilement avec Maven, Gradle ou Ant.

            SonarQube s’intègre aussi de façon fluide dans votre IDE (Eclipse ou IntelliJ), via le plugin Sonarlint. Cela vous permet de détecter immédiatement d’éventuels codes smells ou vulnérabilités mises en évidence par Sonarlint dans les classes que vous éditez. Le plugin propose aussi une fenêtre de suivi de problèmes et des vérifications automatiques lors de commits ou pushs, ce qui est très appréciable non seulement pour le refactoring de code défectueux mais également pour la prévention d’ajouts de nouveaux défauts (personne n’est infaillible !).

Sonar smash
Exemple de fenêtre SonarLint intégrée dans IntelliJ (copyright SonarSource)

Pour les détails techniques d’intégration de SonarQube (configuration du server centralisé, de l’analyseur, le couplage Git, Jenkins, Maven/Gradle…), vous pouvez consulter la documentation fournie en bas de l’article. L’installation et le set up de SonarQube est assez simple pour un développeur un tant soit peu expérimenté.

Autres Outils

            Lors de la mise en place de Sonar Smash, les équipes d’Helen Wallace et James Mac Mahon ont utilisé des outils auxiliaires à SonarQube. Lors de la présentation de la Devoxx, ils ne sont pas rentrés dans le détail de l’imbrication et de l’architecture globale de leur solution, on peut comprendre qu’ils aient gardé quelques secrets de fabrication.

            Néanmoins, voici la liste des outils logiciels qu’ils ont cité et rendant possible Sonar Smash chez Murex, avec leur rôle probable dans le projet :

  • JaCoCo : générateur de rapports de code coverage
  • Walkmod : refactoring respectant les conventions de code
  • CodeMaat : analyse de données d’un système de contrôle de versions
  • Semmle : plateforme d’analyse de code
  • Black Duck : intégration sécurisée d’outils dans un framework DevOps

La documentation relative à ces différents outils est disponible en fin d’article.

Sonar Smash

            Le principe de Sonar Smash est, selon ses créateurs, en anglais dans le texte : Fuelling the removal of technical debt through competition. Concrètement, il s’agit de faire participer des équipes de développeurs à un grand concours courant sur une période assez étendue, dont l’objectif est d’améliorer la qualité du code managé par ces équipes. La compétition repose sur un système de scoring lié aux indicateurs de Bug/vulnérabilités/Code Smells/Coverage produits par SonarQube.

            Les équipes de Murex sont parties d’un constat simple et commun à toutes les entreprises développant des projets logiciels internes : leur dette technique, c’est-à-dire les parties de code historique mal documentées ou de mauvaise qualité pèsent de façon démesurées sur le développement de leurs projets en cours. Le code legacy est souvent confus, peu couvert par les tests, bourré de code smells selon SonarQube… Mais corriger des centaines de classes et des milliers de lignes de codes est un long et fastidieux travail auquel aucun développeur ne veut réellement prendre part. On peut penser qu’on a toujours mieux ou plus urgent à faire…

            Pour remédier à ce problème, Helen et James ont créé une compétition, le fameux Sonar Smash. Par équipes de quelques personnes constituées volontairement (souvent de séniorité et de départements différents), les développeurs jouent à celui ou celle qui nettoiera le plus possible le capharnaüm du code legacy. Un système de récompense (trophée, repas…) est mis en place pour motiver les participants. Ceux-ci profitent le plus souvent de temps morts pour s’atteler au refactoring du code. Ils utilisent parfois Sonar Smash comme l’équivalent d’une pause ludique entre deux plages de travail plus intenses.

            S’intégrant dans le cadre de l’agilité, les responsables Sonar Smash publient à la fin de chaque Sprint (2 semaines) les scores de chaque équipe. Le système de points, issu d’un travail d’ajustement assez long, est calculé ainsi :

            (issuesRemoved x 5) + (linesOfCode x changeInCoverage x 2)

Avec : 

  • issuesRemoved : alertes Sonar résolues
  • linesOfCode : lignes de code traitées
  • changeInCoverage : nouvelles zones de code couvertes par les tests unitaires

Ces données sont récoltées grâce aux outils que nous avons décrits précédemment.

            A la fin de chaque sprint, l’équipe ayant obtenu le plus de points se voit attribuer un score de 4 points, la suivante 3 points et ainsi de suite. Ces scores sont enfin cumulés à la fin de la compétition (3 sprints typiquement), et l’équipe avec le plus grand score l’emporte ! Ce double système de points et score permet de ne pas créer un écart trop important dès le début de la compétition, afin de préserver la motivation des équipes en course.

Equipes Round 1 Score Round 2 Score Round 3 Score Total
Spiderman 150 2 255 2 523 3 7
Hulk 260 3 352 4 490 2 9
IronMan 104 1 145 1 650 4 6
Captain America 310 4 311 3 25 1 8

Tableau des scores au bout de 3 sprints (noms d’équipes authentiques)

            Après les premières éditions de Sonar Smash, Helen et James se sont rendus compte que de plus en plus de développeurs s’inscrivaient spontanément à la compétition. En effet, le titre de vainqueur du Sonar Smash était convoité et source de fierté (pour ne pas dire de vantardise !). De plus, la collaboration au sein des équipes a permis un échange des compétences et des savoirs qui a permis à bon nombre de projets en cours d’avancer plus rapidement (sans parler d’une meilleure maîtrise du code legacy). En s’habituant à refactorer régulièrement, les développeurs ont progressé techniquement. Ils ont davantage de plaisir à travailler avec un code plus propre. Et ils ont même mis à jour de vieux bugs perdus dans les poussières du temps… D’un point de vue social, technologique et opérationnel, l’expérience est donc une réussite !

Conclusion

Sonar Smash a été et continue d’être un succès au sein de Murex. En témoignent les résultats à l’issue des premières compétitions :

  • 50 développeurs y ont participé
  • 250 classes ont été refactorées
  • 1208 alertes Sonar résolues
  • 7186 lignes de code traitées

Si ces chiffres vous font rêver, sachez que je pense qu’il est possible de reproduire l’expérience dans beaucoup d’environnements de développement de taille et de configurations variées. Il faudra bien sûr à chaque fois s’adapter aux spécificités du code et des équipes concernés, mais les développeurs comme le code source en ressortiront plus sains et plus efficaces que jamais.

Documentations