{"id":2093,"date":"2014-10-07T09:20:39","date_gmt":"2014-10-07T08:20:39","guid":{"rendered":"http:\/\/qualilogy.com\/fr\/?p=2093"},"modified":"2014-10-17T11:55:12","modified_gmt":"2014-10-17T10:55:12","slug":"application-legacy-refactoring-plugin-sqale-1","status":"publish","type":"post","link":"http:\/\/qualilogy.com\/fr\/application-legacy-refactoring-plugin-sqale-1\/","title":{"rendered":"Application Legacy &#8211; Refactoring avec le plugin SQALE (I)"},"content":{"rendered":"<p><a href=\"http:\/\/500px.com\/Vicken\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-2095\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtRefactoring.jpg\" alt=\"Application Legacy - Refactoring Technical Debt with the plugin SQALE SonarQube\" width=\"288\" height=\"360\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtRefactoring.jpg 288w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtRefactoring-240x300.jpg 240w\" sizes=\"(max-width: 288px) 100vw, 288px\" \/><\/a>Afin de proc\u00e9der \u00e0 une estimation du co\u00fbt de refactoring de notre application Legacy, je vais utiliser le plugin SQALE de SonarQube, employ\u00e9 habituellement pour mesurer la Dette Technique.<\/p>\n<p>Nous avons <a title=\"Analyse PL\/SQL avec SonarQube \u2013 Evaluer la qualit\u00e9 (3\/3)\" href=\"http:\/\/qualilogy.com\/fr\/analyse-plsql-avec-sonarqube-evaluer-la-qualite-33\/\" target=\"_blank\">d\u00e9j\u00e0 pr\u00e9sent\u00e9<\/a> ce plugin avec une application Legacy PL\/SQL. Rappelons donc simplement que le plugin SQALE est bas\u00e9 sur <a title=\"The SQALE Model\" href=\"http:\/\/www.sqale.org\/details\" target=\"_blank\">le mod\u00e8le SQALE de la qualit\u00e9<\/a>, et j\u2019ajouterai \u00e9galement, sur une m\u00e9thode permettant d\u2019adapter le mod\u00e8le en l\u2019alignant avec les diff\u00e9rents objectifs m\u00e9tiers, la technologie utilis\u00e9e pour l\u2019application, ou le contexte applicatif. <!--more--><\/p>\n<h2>SQALE et les applications Legacy<\/h2>\n<p>Aujourd\u2019hui, toute application de plus de 3 ans est consid\u00e9r\u00e9e comme \u2018Legacy\u2019, surtout si elle ne dispose pas d\u2019une couverture de tests unitaires. Dans ce cas, <a title=\"Application Legacy \u2013 Refactoring ou reengineering? (IV)\" href=\"http:\/\/qualilogy.com\/fr\/application-legacy-refactoring-reengineering-4\/\" target=\"_blank\">\u2018Edit and Pray\u2019<\/a> ou encore \u2018Modifie \u00e0 tes risques\u2019, comme l\u2019explique Michael Feathers dans son livre \u00ab Working Effectively with Legacy Code \u00bb.<\/p>\n<p>Or, on comprend bien que nous n\u2019allons pas utiliser le mod\u00e8le SQALE de la m\u00eame mani\u00e8re pour une application J2EE de 3 ans, notre application World 1.1a en C d\u2019il ya 20 ans, ou une application Cobol encore plus ancienne, et\/ou qui est pass\u00e9e entre les mains de plusieurs \u00e9quipes diff\u00e9rentes, \u00e9ventuellement en offshore.<\/p>\n<p>Il faut \u00e9galement prendre en compte le type d\u2019application : ici nous avons un logiciel bureautique vendu par un \u00e9diteur de software, ce n\u2019est pas du tout la m\u00eame chose qu\u2019une application J2EE d\u00e9velopp\u00e9e en interne pour r\u00e9pondre \u00e0 des besoins m\u00e9tier, ou une application bas\u00e9e sur un progiciel comme SAP. Par exemple, notre application est \u00e9crite en C et n\u2019utilise pas de bases de donn\u00e9es : les facteurs \u2018performance\u2019 et \u2018s\u00e9curit\u00e9\u2019 n\u2019auront pas du tout le m\u00eame poids que pour une application de gestion classique.<\/p>\n<h2>SQALE et le suivi de la dette technique<\/h2>\n<p>Autre \u00e9l\u00e9ment \u00e0 prendre en compte : comme l\u2019explique Freddy Mallet de SonarQube dans <a href=\"https:\/\/www.youtube.com\/watch?v=d3XYhUikeIA\" target=\"_blank\">cette vid\u00e9o<\/a> (en fran\u00e7ais) : \u00ab la dette technique,\u00a0 c\u2019est pour \u00e9viter de se r\u00e9veiller au bout de 5 ans avec un code avec lequel on ne peut plus rien faire sans que cela co\u00fbte un bras \u00bb. Ou encore, comme expliqu\u00e9 dans <a href=\"http:\/\/www.sonarqube.org\/using-differentials-to-move-the-team-in-the-right-direction\/\" target=\"_blank\">cet article<\/a> : \u00ab inutile de commencer \u00e0 \u00e9ponger le sol tant que vous n\u2019avez pas r\u00e9par\u00e9 la fuite d\u2019eau \u00bb.<\/p>\n<p>Une des principales utilisations du plugin SQALE consiste \u00e0 suivre et contr\u00f4ler la dette technique au fil des versions, afin d\u2019\u00e9viter qu\u2019elle ne s\u2019accroisse au-del\u00e0 d\u2019un seuil o\u00f9 elle commence \u00e0 devenir insupportable et trop co\u00fbteuse.<\/p>\n<p>Dans notre cas, nous n\u2019avons qu\u2019une seule et unique version, donc je vais \u00e0 nouveau signaler que notre utilisation du plugin SQALE est particuli\u00e8re \u00e0 notre objectif d\u2019\u00e9valuation d\u2019un effort de refactoring, sans que nous ayons personnalis\u00e9 le mod\u00e8le, et en proc\u00e9dant directement \u00e0 partir des r\u00e9sultats \u2018out of the box\u2019.<\/p>\n<p>Dans le cadre de cet article, je pr\u00e9sente ces r\u00e9sultats simplement afin d&rsquo;illustrer la d\u00e9marche pour estimer le co\u00fbt de refactoring d\u2019une application Legacy. Estimation \u2018a priori\u2019, avant m\u00eame d&rsquo;aller consulter l&rsquo;\u00e9quipe de projet ou le management, mais avec quelques pistes pr\u00e9alables pour ce faire.<\/p>\n<h2>SQALE dans le dashboard SonarQube<\/h2>\n<p>Je me suis constitu\u00e9 mon propre dashboard dans SonarQube, avec un widget pour afficher les donn\u00e9es suivantes du plugin SQALE :<\/p>\n<p style=\"text-align: center\"><strong><em>Figure 1 \u2013 Donn\u00e9es SQALE sur la Dette Technique de notre application Legacy<\/em><\/strong><\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtSyntesis.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2105\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtSyntesis.jpg\" alt=\"Donn\u00e9es SQALE sur la Dette Technique de notre application Legacy\" width=\"349\" height=\"168\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtSyntesis.jpg 349w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtSyntesis-300x144.jpg 300w\" sizes=\"(max-width: 349px) 100vw, 349px\" \/><\/a><\/p>\n<p>1 238.7 jours pour r\u00e9sorber la dette technique. A raison de <a title=\"Application Legacy \u2013 Refactoring ou reengineering? (VII)\" href=\"http:\/\/qualilogy.com\/fr\/application-legacy-refactoring-reengineering-7\/\" target=\"_blank\">18.5 jours travaill\u00e9s par mois<\/a>, cela repr\u00e9sente 69.4 mois ou, pour une \u00e9quipe de 5 personnes, 13.9 mois\/hommes.<\/p>\n<p>Donc il faut pratiquement 14 mois \u00e0 notre \u00e9quipe de projet pour venir \u00e0 bout de cette dette technique. Inutile d\u2019imaginer que ce soit acceptable pour le management : cela signifie stopper toute \u00e9volution, interdire toute nouvelle version pendant plus d\u2019un an. Aucun client, aucun utilisateur ne consentirait \u00e0 une telle d\u00e9cision.<\/p>\n<p>Cela dit, notre objectif n\u2019est pas de supprimer 100% de cette dette, mais de fournir un effort de r\u00e9duction de celle-ci afin que le poids de la dette soit acceptable, et que la r\u00e9duction correspondante des co\u00fbts de maintenance soit sup\u00e9rieure au co\u00fbt de refactoring. En effet, la d\u00e9cision d\u2019effectuer ou non un refactoring se base habituellement sur un ROI, une esp\u00e9rance de gain ou en l\u2019esp\u00e8ce, de r\u00e9duction de co\u00fbts de maintenabilit\u00e9.<\/p>\n<p>Est-il possible d\u2019envisager un effort raisonnable, avec des actions de refactoring limit\u00e9es mais pr\u00e9cises, pour un retour sur investissement optimal ? C\u2019est ce que je vais regarder avec les autre donn\u00e9es configur\u00e9es dans mon widget.<\/p>\n<p>Tout d\u2019abord, je vois que le \u2018SQALE Rating\u2019 est \u00e9gal \u00e0 B. Celui-ci montre le poids de la dette technique par rapport \u00e0 l\u2019ensemble de l\u2019application. Un autre widget SQALE du portail de SonarQube me donne la distribution de la dette technique sur les diff\u00e9rents fichiers.<\/p>\n<p style=\"text-align: center\"><strong><em>Figure 2 \u2013 Distribution du SQALE Rating par fichier<\/em><\/strong><\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtRating.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2106\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtRating.jpg\" alt=\"Distribution du SQALE Rating par fichier\" width=\"458\" height=\"112\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtRating.jpg 458w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtRating-300x73.jpg 300w\" sizes=\"(max-width: 458px) 100vw, 458px\" \/><\/a><\/p>\n<p>Nous avons 12 fichiers avec une dette technique tr\u00e8s importante, et si je liste ces fichiers, je vais retrouver certains programmes <a title=\"Application Legacy en C \u2013 Refactoring ou r\u00e9ing\u00e9nierie ? (II)\" href=\"http:\/\/qualilogy.com\/fr\/application-legacy-c-refactoring-reingenierie-2\/\" target=\"_blank\">d\u00e9j\u00e0 identifi\u00e9s auparavant<\/a> comme les plus complexes, les plus volumineux en nombre de lignes de code (LOC) et\/ou avec des fonctions elles-m\u00eames tr\u00e8s complexes et de grande taille.<\/p>\n<p style=\"text-align: center\"><strong><em>Figure 3 \u2013 Highest SQALE remediation costs<\/em><\/strong><\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtFiles.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2107\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtFiles.jpg\" alt=\"Highest SQALE remediation costs\" width=\"350\" height=\"323\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtFiles.jpg 350w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtFiles-300x276.jpg 300w\" sizes=\"(max-width: 350px) 100vw, 350px\" \/><\/a><\/p>\n<p>Autre mani\u00e8re de v\u00e9rifier la distribution de la dette technique sur l\u2019ensemble des fichiers de l\u2019application : le Bubble Chart. J\u2019ai la possibilit\u00e9 de choisir quelles m\u00e9triques je souhaite croiser :<\/p>\n<ul>\n<li>la dette technique en nombre de jours sur l\u2019axe Y (ordonn\u00e9es) ;<\/li>\n<li>le nombre de lignes de code pour l\u2019axe X (abcisse) ;<\/li>\n<li>la Complexit\u00e9 Cyclomatique pour la taille de la bulle.<\/li>\n<\/ul>\n<p style=\"text-align: center\"><strong><em>Figure 4 \u2013 Technical Debt x Cyclomatic Complexity x Lines of Code<\/em><\/strong><\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtBubbles.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2109\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtBubbles.jpg\" alt=\"Technical Debt x Cyclomatic Complexity x Lines of Code\" width=\"815\" height=\"517\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtBubbles.jpg 815w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtBubbles-300x190.jpg 300w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtBubbles-624x395.jpg 624w\" sizes=\"(max-width: 815px) 100vw, 815px\" \/><\/a><\/p>\n<p>On peut voir sur cette figure, le fichier &lsquo;fltexp.c&rsquo; avec la dette technique maximale pour un programme &#8211; 23 jours de refactoring &#8211; r\u00e9partie sur 2 600 lignes de code et 740 points de Complexit\u00e9 Cyclomatique.<\/p>\n<p>Certains vont encore me dire que le nombre de lignes de code (LOC) n\u2019est pas une mesure fiable de la taille d\u2019une application, mais apr\u00e8s avoir jou\u00e9 avec diff\u00e9rentes combinaisons de m\u00e9triques, celle-ci reste encore la plus corr\u00e9l\u00e9e avec la dette technique, et donc un facteur \u00e0 prendre en compte pour comprendre cette derni\u00e8re.<\/p>\n<p>Par exemple, dans le Bubble Chart suivant, j\u2019ai choisi la Complexit\u00e9 Cyclomatique (CC) par fonction comme mesure de la taille de la bulle.<\/p>\n<p style=\"text-align: center\"><strong><em>Figure 5 \u2013 Technical Debt x Cyclomatic Complexity\/Function x Lines of Code<\/em><\/strong> <a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtBubbles3.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2111\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtBubbles3.jpg\" alt=\"Technical Debt x Cyclomatic Complexity\/Function x Lines of Code\" width=\"833\" height=\"518\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtBubbles3.jpg 833w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtBubbles3-300x186.jpg 300w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtBubbles3-624x388.jpg 624w\" sizes=\"(max-width: 833px) 100vw, 833px\" \/><\/a><\/p>\n<p>Le fichier \u2018RTFOUT.C\u2019 dont <a title=\"Application Legacy \u2013 Refactoring ou reengineering? (V)\" href=\"http:\/\/qualilogy.com\/fr\/application-legacy-refactoring-reengineering-5\/\" target=\"_blank\">nous avons tant parl\u00e9 pr\u00e9c\u00e9demment<\/a>, poss\u00e8de la fonction la plus complexe avec 355 points de CC, mais compte \u00e9galement une autre fonction avec seulement 2 points de CC. La complexit\u00e9 moyenne pour ce fichier sera donc de (355 + 2) \/ 2 = 178.5 points de CC, comme affich\u00e9 au-dessus du graphique.<\/p>\n<p>J\u2019ai \u00e9galement affich\u00e9 (copi\u00e9-coll\u00e9) dans cette figure les mesures pour le fichier \u2018fltexp.c\u2019 dont nous avons vu pr\u00e9c\u00e9demment (figure 3 ant\u00e9rieure) qu\u2019il poss\u00e9dait la dette technique la plus \u00e9lev\u00e9e et 740 points de CC, mais r\u00e9partis sur un plus grand nombre de fonctions, puisque la CC moyenne par fonction est d\u2019environ 16 points.<\/p>\n<p>M\u00eame s&rsquo;il est int\u00e9ressant, je pense que ce graphique reste moins utile que le pr\u00e9c\u00e9dent, plus significatif et repr\u00e9sentatif de l&rsquo;effort de refactoring \u00e0 consentir sur chaque programme et sur l&rsquo;ensemble de l&rsquo;application. Mais nous pouvons voir que nous disposons dans SonarQube de nombre d&rsquo;outils et de widgets afin d&rsquo;imaginer et investiguer diff\u00e9rentes pistes d&rsquo;action.<\/p>\n<p>Avec ces diff\u00e9rents widgets du portail SonarQube, je connais :<\/p>\n<ul>\n<li>Les fichiers qui pr\u00e9sentent la dette technique la plus \u00e9lev\u00e9e : sans aucune surprise, les fichiers les plus lourds et les plus complexes de notre application, tels que nous les avions identifi\u00e9s auparavant.<\/li>\n<li>L\u2019effort de refactoring afin de supprimer la dette technique pour chacun de ces fichiers.<\/li>\n<\/ul>\n<p>Mais encore, une fois, cet effort est trop important pour \u00eatre envisag\u00e9 tel quel, et pas forc\u00e9ment n\u00e9cessaire puisque nous ne souhaitons pas la suppression totale de la dette technique, sinon un refactoring bas\u00e9 sur des actions avec un co\u00fbt de r\u00e9duction de la dette le plus bas possible, pour un maximum d\u2019avantages.<\/p>\n<p>Notre prochaine post sera consacr\u00e9 \u00e0 la pr\u00e9sentation des ces diff\u00e9rentes actions et une estimation de leur co\u00fbt.<\/p>\n<p>A tr\u00e8s bient\u00f4t.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Afin de proc\u00e9der \u00e0 une estimation du co\u00fbt de refactoring de notre application Legacy, je vais utiliser le plugin SQALE de SonarQube, employ\u00e9 habituellement pour mesurer la Dette Technique. Nous avons d\u00e9j\u00e0 pr\u00e9sent\u00e9 ce plugin avec une application Legacy PL\/SQL. Rappelons donc simplement que le plugin SQALE est bas\u00e9 sur le mod\u00e8le SQALE de la [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[],"class_list":["post-2093","post","type-post","status-publish","format-standard","hentry","category-qualite-des-applications"],"_links":{"self":[{"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts\/2093"}],"collection":[{"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/comments?post=2093"}],"version-history":[{"count":22,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts\/2093\/revisions"}],"predecessor-version":[{"id":2159,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts\/2093\/revisions\/2159"}],"wp:attachment":[{"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/media?parent=2093"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/categories?post=2093"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/tags?post=2093"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}