{"id":2123,"date":"2014-10-15T17:17:05","date_gmt":"2014-10-15T16:17:05","guid":{"rendered":"http:\/\/qualilogy.com\/fr\/?p=2123"},"modified":"2014-10-17T12:01:41","modified_gmt":"2014-10-17T11:01:41","slug":"application-legacy-refactoring-plugin-sqale-2","status":"publish","type":"post","link":"http:\/\/qualilogy.com\/fr\/application-legacy-refactoring-plugin-sqale-2\/","title":{"rendered":"Application Legacy \u2013 Refactoring avec le plugin SQALE (II)"},"content":{"rendered":"<p><a href=\"http:\/\/500px.com\/Vicken\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-2126\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtRefactoring3.jpg\" alt=\"LegacyTechDebtRefactoring3\" width=\"367\" height=\"543\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtRefactoring3.jpg 367w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtRefactoring3-202x300.jpg 202w\" sizes=\"(max-width: 367px) 100vw, 367px\" \/><\/a>Comme je l\u2019ai expliqu\u00e9 dans le post pr\u00e9c\u00e9dent, nous n\u2019avons pas personnalis\u00e9 le profile SonarQube et le mod\u00e8le SQALE en fonction de notre application Legacy et de son contexte. En fait, nous utilisons les r\u00e9sultats \u2018out of the box\u2019 afin d\u2019illustrer une d\u00e9marche possible d\u2019estimation du co\u00fbt de refactoring de celle-ci, et de pr\u00e9senter quelques pistes d\u2019action \u00e0 approfondir avec l\u2019\u00e9quipe de projet et le management \u2013 ou \u00e9ventuellement \u00e0 voir ceux-ci les rejeter.<\/p>\n<p>En d&rsquo;autres termes, c&rsquo;est la d\u00e9marche qui nous int\u00e9resse plus que les r\u00e9sultats sur notre application, tout au moins dans le cadre de ces articles.<\/p>\n<p>Je vais pr\u00e9senter ces actions, des plus simples au plus avanc\u00e9es. <!--more--><\/p>\n<h2>Corriger les d\u00e9fauts les plus critiques<\/h2>\n<p>La premi\u00e8re chose que je peux voir avec le widget que je me suis configur\u00e9 (cf. <a title=\"Application Legacy \u2013 Refactoring avec le plugin SQALE (I)\" href=\"http:\/\/qualilogy.com\/fr\/application-legacy-refactoring-plugin-sqale-1\/\" target=\"_blank\">Figure 1 \u2013 Donn\u00e9es SQALE sur la Dette Technique<\/a>), c\u2019est qu\u2019il nous en co\u00fbte :<\/p>\n<ul>\n<li>59.6 jours pour rem\u00e9dier aux issues de type Critical et au-del\u00e0, c\u2019est-\u00e0-dire Critical et Blockers.<\/li>\n<li>1 115.6 jours pour rem\u00e9dier aux issues Major, Critical et Blocker.<\/li>\n<\/ul>\n<p>La m\u00eame information m\u2019est fournie par le widget suivant :<\/p>\n<p style=\"text-align: center\"><em><strong>Figure 1 \u2013 SQALE Remediation Cost par criticit\u00e9<\/strong><\/em><\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtCriticity.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2132\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtCriticity.jpg\" alt=\"Legacy Technical Debt Criticity\" width=\"583\" height=\"179\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtCriticity.jpg 583w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtCriticity-300x92.jpg 300w\" sizes=\"(max-width: 583px) 100vw, 583px\" \/><\/a><\/p>\n<p>La partie bleue fonc\u00e9e sur chacune des barres horizontales de ce graphique correspond \u00e0 la barre pr\u00e9c\u00e9dente, afin de calculer un co\u00fbt par criticit\u00e9 et un co\u00fbt total, tel qu\u2019affich\u00e9 dans les deux colonnes de droite.<\/p>\n<p><a title=\"Audit d\u2019une application Legacy en C \u2013 Microsoft Word 1.1a (II)\" href=\"http:\/\/qualilogy.com\/fr\/audit-application-legacy-c-microsoft-word-1-1a-2\/\" target=\"_blank\">Nous avions d\u00e9j\u00e0 vu<\/a> que nous n\u2019avions aucun d\u00e9faut sur les r\u00e8gles de type Blocker, et 753 d\u00e9fauts de type Critical, la plupart d\u2019entre eux concentr\u00e9s sur 2 r\u00e8gles.<\/p>\n<p style=\"text-align: center\"><em><strong>Figure 2 \u2013 Violations aux r\u00e8gles Critical<\/strong><\/em><\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/C_World_Crticals.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1797\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/C_World_Crticals.jpg\" alt=\"C_World_Crticals\" width=\"583\" height=\"207\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/C_World_Crticals.jpg 583w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/C_World_Crticals-300x106.jpg 300w\" sizes=\"(max-width: 583px) 100vw, 583px\" \/><\/a><\/p>\n<p>La figure suivante liste les fichiers comportant ces d\u00e9fauts et leur co\u00fbt de rem\u00e9diation :<\/p>\n<p style=\"text-align: center\"><em><strong>Figure 3 \u2013 SQALE Remediation Cost \u2013 Critical et Blockers<\/strong><\/em><\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtFilesCriticalIssues.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2134\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtFilesCriticalIssues.jpg\" alt=\"Legacy Technical Debt Files Critical Issues\" width=\"352\" height=\"327\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtFilesCriticalIssues.jpg 352w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtFilesCriticalIssues-300x278.jpg 300w\" sizes=\"(max-width: 352px) 100vw, 352px\" \/><\/a><\/p>\n<p>Je peux ouvrir chacun de ces fichiers dans SonarQube, et choisir de ne visualiser que certaines \u2018Issues\u2019. La figure suivante pr\u00e9sente le programme \u2018fltexp.c\u2019 et ses diff\u00e9rentes Issues critiques.<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechfltexpCritical.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2137\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechfltexpCritical.jpg\" alt=\"LegacyTechfltexpCritical\" width=\"833\" height=\"342\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechfltexpCritical.jpg 833w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechfltexpCritical-300x123.jpg 300w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechfltexpCritical-624x256.jpg 624w\" sizes=\"(max-width: 833px) 100vw, 833px\" \/><\/a><\/p>\n<p>Pour chacun des 16 d\u00e9fauts de type Critical dans ce programme, je peux voir :<\/p>\n<ul>\n<li>La ligne de code correspondante.<\/li>\n<li>Le co\u00fbt de rem\u00e9diation de cette issue, tel que configur\u00e9 dans le plugin SQALE par d\u00e9faut : 1 heure dans le premier cas (MISRA C++ 6-6-1) et 15 minutes dans le second (MISRA C++ 5-14-1).<\/li>\n<\/ul>\n<p>Sur la base de ces chiffres, je peux donc proposer une premi\u00e8re action de refactoring portant sur les composants avec des d\u00e9fauts critiques, pour un total d\u2019environ 60 jours, ou encore 12 jours pour une \u00e9quipe de 5 personnes.<\/p>\n<p>Dans la r\u00e9alit\u00e9, je travaillerai avec l\u2019\u00e9quipe de projet afin d\u2019estimer avec eux les d\u00e9fauts qu\u2019ils consid\u00e8rent ou non Critical (ou Blocker), le temps qu\u2019ils estiment n\u00e9cessaire pour r\u00e9soudre chaque Issue, et ainsi configurer le \u2018profile\u2019 (ensemble de r\u00e8gles SonarQube) en fonction de leurs remarques.<\/p>\n<h2>Ramener le SQALE Rating au niveau A<\/h2>\n<p>Avec le widget que je me suis configur\u00e9 (cf. <a title=\"Application Legacy \u2013 Refactoring avec le plugin SQALE (I)\" href=\"http:\/\/qualilogy.com\/fr\/application-legacy-refactoring-plugin-sqale-1\/\" target=\"_blank\">Figure 1 \u2013 Donn\u00e9es SQALE sur la Dette Technique<\/a>), je peux voir \u00e9galement qu\u2019il nous en co\u00fbte 291.9 jours afin de ramener le SQALE Rating de B, son niveau actuel, \u00e0 A. Le SQALE Rating mesure <a href=\"http:\/\/www.sonarsource.com\/products\/plugins\/governance\/sqale\/installation-and-usage\/#understandingSqaleRatings\" target=\"_blank\">le poids de la dette dans l\u2019application<\/a>, de la mani\u00e8re suivante dans notre cas :<\/p>\n<ul>\n<li>B : entre 10% et 20%.<\/li>\n<li>A : inf\u00e9rieur ou \u00e9gal \u00e0 10%.<\/li>\n<\/ul>\n<p>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>, ces 291.9 jours repr\u00e9sentent 15.8 mois au total, ou 3 mois et 3 jours par d\u00e9veloppeur pour une \u00e9quipe de 5 personnes. Si j\u2019ajoute une charge de gestion de projet de 20%, ce qui est le chiffre par d\u00e9faut pour toute pr\u00e9vision de planning, nous passons \u00e0 3 mois et 15 jours par d\u00e9veloppeur.<\/p>\n<p>Nous avons vu que <a title=\"Application Legacy \u2013 Refactoring ou reengineering? (VII)\" href=\"http:\/\/qualilogy.com\/fr\/application-legacy-refactoring-reengineering-7\/\" target=\"_blank\">l\u2019\u00e9criture de tests de caract\u00e9risation n\u00e9cessitait environ 3 mois<\/a>, avec un peu de marge de man\u0153uvre pour la gestion de projet ce qui est acceptable dans le cadre d\u2019un transfert de connaissances. Si nous ajoutons \u00e0 nouveau 3 mois et quelques jours, notre projet de refactoring passe \u00e0 6 mois ou 7 mois, ce qui me semble acceptable pour fiabiliser notre application avec des tests et la ramener \u00e0 un niveau tr\u00e8s correct de dette technique.<\/p>\n<p>Dans la r\u00e9alit\u00e9, il est tr\u00e8s difficile pour le management de justifier aupr\u00e8s des utilisateurs de paralyser toute \u00e9volution \u2013 et surtout toute correction \u2013 pendant une telle p\u00e9riode. J\u2019ignore tout du backlog en mati\u00e8re de demandes utilisateurs, modifications et tickets, ainsi que des charges moyennes de correction par mois qu\u2019il faudrait prendre en compte dans un planning de refactoring : je me contenterai donc de ces 292 jours et je vais essayer de les optimiser au mieux afin de construire un plan sinon recevable, du moins envisageable pour les d\u00e9cideurs.<\/p>\n<p>La pyramide Sqale va nous aider \u00e0 choisir, parmi les diff\u00e9rentes cat\u00e9gories de violations aux best practices.<\/p>\n<p style=\"text-align: center\"><em><strong>Figure 4 \u2013 SQALE Tecnical Debt Pyramid<\/strong><\/em><\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtPyramid.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2139\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtPyramid.jpg\" alt=\"Legacy Technical Debt SQALE Pyramid\" width=\"583\" height=\"250\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtPyramid.jpg 583w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtPyramid-300x128.jpg 300w\" sizes=\"(max-width: 583px) 100vw, 583px\" \/><\/a><\/p>\n<p>Chaque facteur de plus haut niveau poss\u00e8de un certain nombre de \u2018caract\u00e9ristiques\u2019 qui vont rassembler chacune les m\u00e9triques relevant de cette cat\u00e9gorie. La figure suivante montre l\u2019\u00e9cran de configuration SQALE dans SonarQube, qui permet de param\u00e9trer le co\u00fbt de rem\u00e9diation pour chaque violation \u00e0 une &lsquo;best practice&rsquo; de programmation, au sein de chaque cat\u00e9gorie, en l\u2019esp\u00e8ce dans notre exemple, les \u2018Characteristics\u2019 de \u2018Testability\u2019.<\/p>\n<p style=\"text-align: center\"><strong><em>Figure 5 \u2013 Configuration des r\u00e8gles dans le mod\u00e8le SQALE<\/em><\/strong><\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtSQALEQualityProfile.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2140\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtSQALEQualityProfile.jpg\" alt=\"Legacy Technical Debt SQALE Quality Profile Configuration\" width=\"552\" height=\"384\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtSQALEQualityProfile.jpg 552w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtSQALEQualityProfile-300x208.jpg 300w\" sizes=\"(max-width: 552px) 100vw, 552px\" \/><\/a><\/p>\n<p>Je n\u2019ai pas de r\u00e8gles pour la \u2018Reusability\u2019 dans ce Profile pour ce langage, ce qui explique la dette technique \u00e0 0 sur ce facteur (cf. Figure 4 ci-dessus).<\/p>\n<p>La \u2018Portability\u2019 voit une r\u00e8gle unique enfreinte, pour une dette technique de 3.5 jours, mais elle ne se r\u00e9v\u00e8le importante que dans le cas d\u2019une r\u00e9\u00e9criture de l\u2019application en C++. A prendre en compte dans le cadre d\u2019un reengineering donc, mais pas d\u2019un refactoring.<\/p>\n<p style=\"text-align: center\"><em><strong>Figure 6 \u2013 R\u00e8gle de \u2018Portability\u2019<\/strong><\/em><\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtPortability.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-2141\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtPortability.jpg\" alt=\"Legacy Technical Debt SQALE Characteristic Portability\" width=\"764\" height=\"81\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtPortability.jpg 764w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtPortability-300x31.jpg 300w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtPortability-624x66.jpg 624w\" sizes=\"(max-width: 764px) 100vw, 764px\" \/><\/a><\/p>\n<p>Il en va de m\u00eame pour les r\u00e8gles concernant la Testability (voir la figure 5 pr\u00e9c\u00e9dente), comme \u2018Avoid too complex file\u2019, \u2018Avoid too complex function\u2019, le nombre de param\u00e8tres d\u2019une fonction ou l\u2019utilisation de \u2018Goto\u2019 et de \u2018Continue\u2019 : un refactoring de ce type de d\u00e9fauts n\u00e9cessite un redesign de l\u2019application, donc encore une fois, \u00e0 envisager dans le cadre d\u2019un reengineering. Car si vous devez repenser le design et l\u2019architecture de votre application afin de mieux r\u00e9partir la complexit\u00e9, alors vous pouvez en profiter pour r\u00e9\u00e9crire celle-ci dans un langage orient\u00e9 objet, comme le C++, et b\u00e9n\u00e9ficier ainsi de l\u2019h\u00e9ritage, de l\u2019encapsulation et du polymorphisme.<\/p>\n<p>Pareil pour la Changeability. La figure suivante pr\u00e9sente le SQALE Sunburst avec :<\/p>\n<ul>\n<li>Au niveau 1, les diff\u00e9rents facteurs de Maintainability, Testability, Reliability, etc.<\/li>\n<li>Au niveau 2, les caract\u00e9ristiques au sein de ces facteurs, comme Undestandibility et Readibility pour la Maintainability.<\/li>\n<li>Au niveau 3, les r\u00e8gles au sein de chaque caract\u00e9ristique.<\/li>\n<\/ul>\n<p style=\"text-align: center\"><em><strong>Figure 7 \u2013 R\u00e8gle de \u2018Changeability\u2019 dans le SQALE Sunburst<br \/>\n<\/strong><\/em><\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtSQALESunburstChangeability.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2142\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtSQALESunburstChangeability.jpg\" alt=\"Legacy Technical Debt SQALE Sunburst Changeability\" width=\"579\" height=\"598\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtSQALESunburstChangeability.jpg 579w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtSQALESunburstChangeability-290x300.jpg 290w\" sizes=\"(max-width: 579px) 100vw, 579px\" \/><\/a><\/p>\n<p>Nous pouvons voir dans cette figure que les 13.7 jours de dette technique en mati\u00e8re de Changeability porte sur une unique r\u00e8gle concernant des \u2018if\u2019 imbriqu\u00e9s. Plus vous avez de \u2018if\u2019 au sein de \u2018if\u2019, plus le code devient difficile \u00e0 comprendre, et plus le risque d\u2019introduire un bug \u00e0 l\u2019occasion d\u2019une modification du code sera \u00e9lev\u00e9.<\/p>\n<p>Remarque : une telle r\u00e8gle pourrait tr\u00e8s bien se retrouvait \u00e9galement sous la \u2018characteristic\u2019 de Understandibility. En fait, nombre de r\u00e8gles en mati\u00e8re de Maintainability sont souvent candidates au groupe des r\u00e8gles en mati\u00e8re de Changeability. Raison pour laquelle encore une fois, il est recommand\u00e9 de personnaliser le mod\u00e8le SQALE en fonction de ses propres cas d\u2019utilisation, et non pas de l\u2019utiliser \u2018out of the box\u2019 comme je l\u2019ai fait pour cet article.<\/p>\n<p>En tout cas, ces d\u00e9fauts en mati\u00e8re de \u2018if\u2019 imbriqu\u00e9s sont tout \u00e0 fait dans la cible d\u2019un refactoring, et donc nous pouvons inclure ces 13.7 jours dans notre plan d\u2019actions.<br \/>\nDans la figure suivante, j\u2019ai ins\u00e9r\u00e9 par copi\u00e9-coll\u00e9 diff\u00e9rentes mesures pour :<\/p>\n<ul>\n<li>La Maintainability : 738 jours de refactoring au total, qui se d\u00e9composent en \u2026<\/li>\n<li>505.6 jours pour la Understandibility et 232.3 jours pour la Readability.<\/li>\n<\/ul>\n<p style=\"text-align: center\"><em><strong>Figure 8 \u2013 SQALE Sunburst pour la Maintainability<\/strong><\/em><\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtSQALESunburstMaintainability2.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2144\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtSQALESunburstMaintainability2.jpg\" alt=\"Legacy Technical Debt SQALE Sunburst Maintainability\" width=\"808\" height=\"562\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtSQALESunburstMaintainability2.jpg 808w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtSQALESunburstMaintainability2-300x208.jpg 300w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtSQALESunburstMaintainability2-624x434.jpg 624w\" sizes=\"(max-width: 808px) 100vw, 808px\" \/><\/a><\/p>\n<p>On constate que les co\u00fbts de rem\u00e9diation les plus \u00e9lev\u00e9s sont sur des r\u00e8gles qui ne sont pas forc\u00e9ment critiques. Que Microsoft n\u2019ait pas utilis\u00e9 il y a 20 ans les conventions de nommage de macro aujourd&rsquo;hui usuelles n\u2019est ni \u00e9tonnant, ni vraiment tr\u00e8s important, et la r\u00e9solution de ces d\u00e9fauts pour un co\u00fbt de refactoring de 128.1 jours ne repr\u00e9sente pas un gain r\u00e9ellement suffisant pour envisager une telle action.<\/p>\n<p>Il en va de m\u00eame pour l\u2019utilisation des accolades avec des \u2018if..else\u2019 qui liste \u00e9norm\u00e9ment de \u2018if\u2019 sur une seule ligne, donc tr\u00e8s lisibles et tr\u00e8s compr\u00e9hensibles. Peu de b\u00e9n\u00e9fices pour un co\u00fbt tr\u00e8s \u00e9lev\u00e9.<\/p>\n<p>Non, il y a mieux que les d\u00e9fauts de Maintainability pour optimiser les 291 jours nous permettant de ramener la Technical Debt de cette application \u00e0 un niveau A. Nous pouvons voir dans la pyramide SQALE (figure 4) que les d\u00e9fauts en mati\u00e8re de Reliability n\u00e9cessitent un refactoring de 291.8 jours, et donc collent parfaitement avec notre enveloppe de jours disponibles.<\/p>\n<p>De surcro\u00eet, il s\u2019agit de d\u00e9fauts qui impactent la fiabilit\u00e9 et la robustesse de l\u2019application, donc pr\u00e9sentent un risque pour l\u2019utilisateur ou le client final, par opposition aux d\u00e9fauts en mati\u00e8re de Maintainability qui vont certes peser sur les co\u00fbts de maintenance mais ne causeront jamais de bugs. Evidemment, cela d\u00e9pend encore une fois de l\u2019orientation que vous souhaitez donner au mod\u00e8le SQALE, en le personnalisant plut\u00f4t vers la satisfaction des utilisateurs ou plut\u00f4t en faveur de la pr\u00e9servation de vos budgets.<\/p>\n<p>D\u2019abord je peux voir que les 59.6 jours n\u00e9cessaires pour r\u00e9gler les violations de type \u2018Critical\u2019 (cf. figure 2 pr\u00e9c\u00e9dente) concernent des r\u00e8gles au sein de la Reliability. Le tableau suivant pr\u00e9sente ces diff\u00e9rentes r\u00e8gles et leur co\u00fbt de rem\u00e9diation.<\/p>\n<p style=\"text-align: center\"><em><strong>Table 1 \u2013 Co\u00fbts de rem\u00e9diation des d\u00e9fauts en mati\u00e8re de Reliability<\/strong><\/em><\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtReliabilityCost.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2146\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtReliabilityCost.jpg\" alt=\"Legacy Technical Debt Reliability Cost\" width=\"586\" height=\"305\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtReliabilityCost.jpg 586w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtReliabilityCost-300x156.jpg 300w\" sizes=\"(max-width: 586px) 100vw, 586px\" \/><\/a><\/p>\n<p>Toutes ces r\u00e8gles visent \u00e1 am\u00e9liorer la robustesse de l\u2019application et \u00e0 diminuer les risques de bug. Si j\u2019ajoute les 13.7 jours en mati\u00e8re de Changeabilit\u00e9, pour supprimer les \u2018if\u2019 imbriqu\u00e9s, nous passons \u00e0 305.5 jours, soit 16.5 mois ou 3 mois et 6 jours par d\u00e9veloppeur (hors charges de projet).<\/p>\n<p>Cela dit, la charge de projet ne devrait pas \u00eatre \u00e9norme, puisque le plan d\u2019action, d\u2019un point de vue op\u00e9rationnel, est d\u00e9j\u00e0 dans le plugin SQALE. Nous avons vu (<a title=\"Application Legacy \u2013 Refactoring avec le plugin SQALE (II)\" href=\"http:\/\/qualilogy.com\/fr\/application-legacy-refactoring-plugin-sqale-2\/\" target=\"_blank\">figure 2 du post pr\u00e9c\u00e9dent<\/a>) que celui-ci nous donnait la distribution des programmes sur l\u2019\u00e9chelle du rating SQALE. Dans la figure suivante, je peux voir la liste des fichiers avec le rating le plus bas.<\/p>\n<p style=\"text-align: center\"><em><strong>Figure 9 \u2013 SQALE Rating des fichiers<a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtRateBFiles.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2147\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtRateBFiles.jpg\" alt=\"Legacy Technical Debt Rate Files\" width=\"469\" height=\"203\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtRateBFiles.jpg 469w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtRateBFiles-300x129.jpg 300w\" sizes=\"(max-width: 469px) 100vw, 469px\" \/><\/a> <\/strong><\/em><\/p>\n<p style=\"text-align: left\">On remarquera qu\u2019il s\u2019agit de fichiers .h, en fait avec une notre tr\u00e8s basse \u00e0 cause du nombre tr\u00e8s important de violations \u00e0 la r\u00e8gle \u2018Macro names should comply with a naming convention\u2019. D\u2019o\u00f9 l\u2019importance encore une fois de personnaliser le Quality Profile et le mod\u00e8le SQALE sur les r\u00e8gles qui nous int\u00e9ressent.<\/p>\n<h2 style=\"text-align: left\">Gestion de la dette technique au fil de l\u2019eau<\/h2>\n<p style=\"text-align: left\">Corriger les d\u00e9fauts les plus critiques nous co\u00fbte 59.5 jours, soit environ 12 jours pour une \u00e9quipe de 5 d\u00e9veloppeurs.<\/p>\n<p style=\"text-align: left\">Ramener la dette technique de notre application sur un SQALE Rating A n\u00e9cessite pr\u00e8s de 300 jours, et un peu plus de 3 mois pour notre \u00e9quipe, ce que les managers ou les stakeholders vont probablement consid\u00e9rer un effort maximal, voire trop \u00e9lev\u00e9.<\/p>\n<p style=\"text-align: left\">Une solution interm\u00e9diaire consisterait en une gestion de la dette technique au fil de l\u2019eau, c\u2019est-\u00e0-dire en parall\u00e8le aux actions de maintenance de l\u2019application. Chaque fois qu\u2019un d\u00e9veloppeur devra effectuer une \u00e9volution ou une correction sur un programme, il utilisera \u00e9galement le plugin SQALE afin de v\u00e9rifier :<\/p>\n<ul>\n<li style=\"text-align: left\">Si la dette technique augmente. C\u2019est l\u2019utilisation principale pour un d\u00e9veloppeur d\u2019un plugin tel que SQALE, comme nous en avons parl\u00e9 dans le post pr\u00e9c\u00e9dent : \u00e9viter l\u2019inflation r\u00e9guli\u00e8re de la dette technique et de se retrouver au bout de quelques ann\u00e9es avec une application inmaintenable.<\/li>\n<li style=\"text-align: left\">S\u2019il lui est possible de r\u00e9duire celle-ci \u00e0 l\u2019occasion des modifications qu\u2019il doit r\u00e9aliser, en se centrant sur les r\u00e8gles que nous aurons d\u00e9finies comme critiques dans le plugin SQALE.<\/li>\n<li style=\"text-align: left\">S\u2019il n\u2019a pas augment\u00e9 la dette technique apr\u00e8s avoir impl\u00e9ment\u00e9 ses modifications.<\/li>\n<\/ul>\n<p style=\"text-align: left\">Inutile de demander au d\u00e9veloppeur de respecter plus de 10 best practices : au-del\u00e0, cela devient trop compliqu\u00e9 de toutes les retenir. Cela d\u00e9pend \u00e9galement de l\u2019exp\u00e9rience des d\u00e9veloppeurs et de leur niveau de connaissances, pour ne pas dire de maturit\u00e9 en mati\u00e8re de best practices. Mais m\u00eame\u00a0 les d\u00e9veloppeurs les plus exp\u00e9riment\u00e9s commettent des erreurs d\u2019inattention et laisseront passer des d\u00e9fauts. D\u2019o\u00f9 l\u2019importance d\u2019un suivi r\u00e9gulier de la dette technique.<\/p>\n<p style=\"text-align: left\">Evidemment, le choix entre ces diff\u00e9rentes propositions de plans d\u2019action va d\u00e9pendre, non seulement de l\u2019effort \u00e0 fournir, mais \u00e9galement de leur rentabilit\u00e9. Pouvons-nous proposer au management une hypoth\u00e8se de retour sur investissement ?<\/p>\n<p>Comme ce post est d\u00e9j\u00e0 tr\u00e8s long, je terminerai sur ce th\u00e8me du \u2018Refactoring avec SQALE&rsquo; par une synth\u00e8se de nos propositions et une tentative de calcul de ROI. Dans le prochain post.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Comme je l\u2019ai expliqu\u00e9 dans le post pr\u00e9c\u00e9dent, nous n\u2019avons pas personnalis\u00e9 le profile SonarQube et le mod\u00e8le SQALE en fonction de notre application Legacy et de son contexte. En fait, nous utilisons les r\u00e9sultats \u2018out of the box\u2019 afin d\u2019illustrer une d\u00e9marche possible d\u2019estimation du co\u00fbt de refactoring de celle-ci, et de pr\u00e9senter quelques [&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-2123","post","type-post","status-publish","format-standard","hentry","category-qualite-des-applications"],"_links":{"self":[{"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts\/2123"}],"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=2123"}],"version-history":[{"count":17,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts\/2123\/revisions"}],"predecessor-version":[{"id":2157,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts\/2123\/revisions\/2157"}],"wp:attachment":[{"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/media?parent=2123"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/categories?post=2123"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/tags?post=2123"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}