{"id":1814,"date":"2014-05-13T09:15:42","date_gmt":"2014-05-13T08:15:42","guid":{"rendered":"http:\/\/qualilogy.com\/fr\/?p=1814"},"modified":"2014-05-14T13:10:43","modified_gmt":"2014-05-14T12:10:43","slug":"application-legacy-c-refactoring-reingenierie-1","status":"publish","type":"post","link":"http:\/\/qualilogy.com\/fr\/application-legacy-c-refactoring-reingenierie-1\/","title":{"rendered":"Application Legacy en C &#8211; Refactoring ou r\u00e9ing\u00e9nierie ? (I)"},"content":{"rendered":"<p><a href=\"http:\/\/500px.com\/Vicken\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-1816\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/05\/WordCLegacy_UseCases1.jpg\" alt=\"WordCLegacy_UseCases1\" width=\"360\" height=\"240\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/05\/WordCLegacy_UseCases1.jpg 360w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/05\/WordCLegacy_UseCases1-300x200.jpg 300w\" sizes=\"(max-width: 360px) 100vw, 360px\" \/><\/a>Suite de notre s\u00e9rie sur l\u2019analyse du code source de Word 1.1a, la premi\u00e8re version de ce traitement de texte publi\u00e9 par Microsoft en 1990.<\/p>\n<p>Dans le premier post, nous avons vu <a href=\"http:\/\/qualilogy.com\/fr\/audit-application-legacy-c-microsoft-word-1-1a-1\/\" target=\"_blank\">les m\u00e9triques quantitatives<\/a> de taille (LOCs), de complexit\u00e9 (CC), le niveau de commentaires et de duplication. Le second post \u00e9tait consacr\u00e9 aux diff\u00e9rentes <a href=\"http:\/\/qualilogy.com\/fr\/audit-application-legacy-c-microsoft-word-1-1a-2\/\" target=\"_blank\">Issues\u2019 de type Blocker, Critical, Major et Minor<\/a>. <!--more--><\/p>\n<p>Ces r\u00e9sultats d\u2019analyse semblent indiquer une strat\u00e9gie de d\u00e9veloppement nettement orient\u00e9e vers la fiabilit\u00e9 et la performance logicielle, puisque nous rencontrons peu de violations aux \u2018best practices\u2019 dans ce domaine. Celles-ci sont par contre beaucoup plus nombreuses en mati\u00e8re de lisibilit\u00e9 et de compr\u00e9hension du code, et donc de maintenabilit\u00e9.<\/p>\n<p>Je rappelle que j\u2019ai effectu\u00e9 cette analyse \u2018brute de forme\u2019 : j\u2019ai r\u00e9solu certains probl\u00e8mes de parsing mais je n\u2019ai pas cherch\u00e9 \u00e0 d\u00e9clarer les macros, et j\u2019ai travaill\u00e9 avec le Quality Profile (ensemble de r\u00e8gles) par d\u00e9faut. L\u2019important selon moi pour cette s\u00e9rie n\u2019est pas de rechercher la pr\u00e9cision maximale dans les r\u00e9sultats, car l\u2019objectif n\u2019est pas d\u2019effectuer un audit de code pour cette version de Word, mais de voir comment une simple \u00e9valuation et quelques indicateurs peuvent s\u2019av\u00e9rer utiles en fonction du contexte.<\/p>\n<h2>Cas d\u2019utilisation<\/h2>\n<p>Qui dit contexte dit Use Cases. Lorsque l\u2019on parle d\u2019applications Legacy, les cas d\u2019utilisation les plus fr\u00e9quents seront :<\/p>\n<ul>\n<li>Outsourcing : transf\u00e9rer la maintenance de l\u2019application \u00e0 une nouvelle \u00e9quipe, g\u00e9n\u00e9ralement une soci\u00e9t\u00e9 de services, le plus souvent dans le but de r\u00e9duire les charges de maintenance.<\/li>\n<li>Refactoring : la dette technique pour cette application a cr\u00fb dans de telles proportions que toute modification du code pr\u00e9sente un co\u00fbt de changement excessivement \u00e9lev\u00e9. Un refactoring est n\u00e9cessaire afin de r\u00e9duire les int\u00e9r\u00eats de la dette.<\/li>\n<li>R\u00e9-ing\u00e9nierie : un refactoring signifie tr\u00e8s souvent de repenser le design, c\u2019est-\u00e0-dire la conception voire l\u2019architecture de l\u2019application. Pourquoi ne pas en profiter pour r\u00e9\u00e9crire cette application dans un autre langage, plus r\u00e9cent, moins difficile \u00e0 maintenir ?<\/li>\n<li>Abandon : faut-il jeter cette application ? C\u2019est une question qui se pose fr\u00e9quemment pour une application Legacy, notamment dans le monde Cobol. S\u2019il co\u00fbte moins cher de la remplacer par un progiciel, alors on s\u2019en d\u00e9barrasse.<\/li>\n<\/ul>\n<p>Je vais maintenant me placer dans un contexte bien pr\u00e9cis : vous avez d\u00e9cid\u00e9 de racheter Microsoft. Oui je sais, c\u2019est un peu difficile \u00e0 imaginer mais faites un effort. Votre mission \u2013 si vous l\u2019acceptez \u2013 est de recommander une strat\u00e9gie concernant cette version de Word :<\/p>\n<ol>\n<li>Outsourcing : quel serait le co\u00fbt pour transf\u00e9rer la connaissance de cette application \u00e0 une autre \u00e9quipe R&amp;D ?<\/li>\n<li>Refactoring : quel serait le co\u00fbt de r\u00e9solution des actuels d\u00e9fauts rencontr\u00e9s (re-design inclus), par l\u2019\u00e9quipe actuelle ? Ou par une nouvelle \u00e9quipe, apr\u00e8s transfert de connaissance (donc cas 1 + 2) ?<\/li>\n<li>R\u00e9-\u00e9criture : porter cette application vers une nouvelle technologie, par exemple C++. Par la m\u00eame \u00e9quipe ou une nouvelle \u00e9quipe, encore une fois apr\u00e8s transfert de connaissances (donc cas 1 + 3).<\/li>\n<li>Abandon. D\u00e9cision qui rel\u00e8ve du management. On ne va pas remplacer l\u2019application par un progiciel, mais si cela co\u00fbte plus cher de la maintenir que ce qu\u2019elle rapporte, on laisse le software mourir de sa belle mort, avec un \u00e9quipe r\u00e9duite pour corriger les bugs les plus critiques, et sans travailler sur une \u00e9volution.<\/li>\n<\/ol>\n<p>Afin d\u2019\u00e9valuer les co\u00fbts de ces diff\u00e9rentes strat\u00e9gies, j\u2019ai r\u00e9fl\u00e9chi aux diff\u00e9rentes donn\u00e9es et informations disponibles dans mon tableau de bord, et lesquelles prendre en compte pour chaque cas.<br \/>\nEn commen\u00e7ant par l\u2019estimation du co\u00fbt de transfert de connaissance de cette application Legacy vers une nouvelle \u00e9quipe. Qu\u2019est ce qui fait qu\u2019un programme ou une fonction sera plus ou moins difficile \u00e0 comprendre ?<\/p>\n<ul>\n<li>Sa taille : plus un programme est long, plus il n\u00e9cessite de temps pour savoir ce qu\u2019il fait.<\/li>\n<li>Sa complexit\u00e9 : plus un programme comporte de conditions &#8211; simples tel qu\u2019un if\u2026else, ou multiples (switch) \u2013 et de boucles, plus il est difficile d\u2019appr\u00e9hender le flux des traitements.<\/li>\n<li>Sa structure : plus un programme comporte de blocs de code imbriqu\u00e9s, de goto, de break et autres instructions qui induisent une lecture non lin\u00e9aire du code, plus les algorithmes sont compliqu\u00e9s.<\/li>\n<\/ul>\n<p>Je me suis d\u2019abord int\u00e9ress\u00e9 aux donn\u00e9es dont je disposais sur la complexit\u00e9.<\/p>\n<h2>Complexit\u00e9<\/h2>\n<h3>Fonctions<\/h3>\n<p>Nous avons vu <a href=\"http:\/\/qualilogy.com\/fr\/audit-application-legacy-c-microsoft-word-1-1a-1\/\" target=\"_blank\">dans le premier post<\/a> que cette application comptait quelques fonctions et fichiers avec un nombre \u00e9lev\u00e9 de points de Cyclomatic Complexity. En fait, la r\u00e9partition est la suivante :<\/p>\n<p style=\"text-align: center\"><strong><em>Tableau 1 &#8211; Complexit\u00e9 Cyclomatique des fonctions de l\u2019application Word Opus <\/em><\/strong><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/05\/Word_CCDistribFns.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1824\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/05\/Word_CCDistribFns.jpg\" alt=\"Word_CCDistribFns\" width=\"244\" height=\"272\" \/><\/a><\/p>\n<p style=\"text-align: justify\">On compte 689 fonctions avec une Complexit\u00e9 Cyclomatique \u00e9gale \u00e0 1, puis 870 fonctions avec une CC \u00e9gale \u00e0 2 et inf\u00e9rieure \u00e0 4, etc.<\/p>\n<p style=\"text-align: justify\">On consid\u00e8re que la distribution optimale de la Complexit\u00e9 Cyclomatique d\u2019une application C est comme suit :<\/p>\n<ul>\n<li>Fonctions peu complexes, avec une CC &lt; 4 (Low) : 52% du nombre total de fonctions dans l\u2019application.<\/li>\n<li>Fonctions moyennement complexes, avec une CC &gt; 4 et &lt; 10 (Moderate) : 25%.<\/li>\n<li>Fonctions complexes, avec une CC &gt; 10 et &lt; 20 (High) : 15%.<\/li>\n<li>Fonctions tr\u00e8s complexes, avec une CC &gt; 20 (Very High) : 8%.<\/li>\n<\/ul>\n<p style=\"text-align: justify\">Si l\u2019on calcule la distribution de la complexit\u00e9 dans notre application Word, sur la base du tableau 1, nous obtenons la table suivante :<\/p>\n<p style=\"text-align: center\"><strong><em>Tableau 2 \u2013 Distribution de la complexit\u00e9 dans l\u2019application Word Opus<\/em><\/strong><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/05\/Word_CCDistribFns2.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1828\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/05\/Word_CCDistribFns2.jpg\" alt=\"Word_CCDistribFns2\" width=\"377\" height=\"199\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/05\/Word_CCDistribFns2.jpg 377w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/05\/Word_CCDistribFns2-300x158.jpg 300w\" sizes=\"(max-width: 377px) 100vw, 377px\" \/><\/a><\/p>\n<p>La figure suivante pr\u00e9sente la courbe de distribution de la complexit\u00e9 dans Word, compar\u00e9e \u00e0 la courbe id\u00e9ale.<\/p>\n<p style=\"text-align: center\"><strong><em>Figure 1 \u2013 Courbe de distribution de la complexit\u00e9 (Fonctions)<\/em><\/strong> <a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/05\/Word_CCDistribFnsGraph.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1832\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/05\/Word_CCDistribFnsGraph.jpg\" alt=\"Word_CCDistribFnsGraph\" width=\"518\" height=\"355\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/05\/Word_CCDistribFnsGraph.jpg 518w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/05\/Word_CCDistribFnsGraph-300x205.jpg 300w\" sizes=\"(max-width: 518px) 100vw, 518px\" \/><\/a><\/p>\n<p>On s\u2019aper\u00e7oit que la proportion de fonctions de complexit\u00e9 moyenne ou \u00e9lev\u00e9e est assez en ligne :<\/p>\n<ul>\n<li>29 % de \u2018Moderate\u2019 dans Word contre 25% id\u00e9alement.<\/li>\n<li>16.7 % de \u2018High\u2019 dans Word contre 15% id\u00e9alement.<\/li>\n<\/ul>\n<p>Par contre, les fonctions peu complexes ne sont pas assez nombreuses : 39.7% au lieu de 52%. Et le niveau de fonctions tr\u00e8s complexes est trop \u00e9lev\u00e9 : 14.6% contre 8% dans l\u2019id\u00e9al. Cela devrait donc influer sur les co\u00fbts de transfert de connaissance ou de r\u00e9-engineering de cette application.<\/p>\n<p style=\"text-align: justify\">Je me suis ensuite int\u00e9ress\u00e9 aux fonctions les plus complexes, \u00e0 l\u2019aide de la m\u00e9trique suivante qui nous donne la Complexit\u00e9 Cyclomatique des fonctions au-del\u00e0 de 20 points de CC : <a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/05\/Word_Avoid_Cplx_Fns.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1834\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/05\/Word_Avoid_Cplx_Fns.jpg\" alt=\"Word_Avoid_Cplx_Fns\" width=\"463\" height=\"34\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/05\/Word_Avoid_Cplx_Fns.jpg 463w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/05\/Word_Avoid_Cplx_Fns-300x22.jpg 300w\" sizes=\"(max-width: 463px) 100vw, 463px\" \/><\/a>A noter que nous avions recens\u00e9 573 fonctions avec une CC sup\u00e9rieure ou \u00e9gale \u00e0 20, ce qui signifie que nous comptons 34 fonctions (573 \u2013 539) \u00e0 exactement 20 points.<br \/>\nCes 539 fonctions repr\u00e9sentent une Complexit\u00e9 Cyclomatique de 24 667, soit plus de la moiti\u00e9 de la CC totale de l\u2019application (43 846, comme vu\u00a0<a href=\"http:\/\/qualilogy.com\/fr\/audit-application-legacy-c-microsoft-word-1-1a-1\/\" target=\"_blank\">dans le premier post<\/a> de cette s\u00e9rie) et certaines fonctions sont extr\u00eamement complexes :<\/p>\n<p style=\"text-align: center\"><em><strong>Tableau 3 \u2013 Distribution des fonctions les plus complexes<\/strong><\/em><br \/>\n<a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/05\/Word_CCDistribLargestFns.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1836\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/05\/Word_CCDistribLargestFns.jpg\" alt=\"Word_CCDistribLargestFns\" width=\"405\" height=\"195\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/05\/Word_CCDistribLargestFns.jpg 405w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/05\/Word_CCDistribLargestFns-300x144.jpg 300w\" sizes=\"(max-width: 405px) 100vw, 405px\" \/><\/a><\/p>\n<p style=\"text-align: justify\">Nous comptons :<\/p>\n<ul>\n<li>6 fonctions au-del\u00e0 de 200 points de CC (la plus importante atteint m\u00eame les 355 points), pour un total de 1 513 points de CC. Donc ces 1% des 539 fonctions tr\u00e8s complexes repr\u00e9sentent 6% de la CC de toutes ces fonctions (1 513 \/ 24 667).<\/li>\n<li>30 fonctions entre 100 et 200 points de CC, pour un total de 3 921 points, soit 5.6% des 539 fonctions tr\u00e8s complexes et 15.9% de la CC globale de celles-ci.<\/li>\n<\/ul>\n<p style=\"text-align: justify\">Donc en r\u00e9sum\u00e9, 36 des fonctions au-del\u00e0 de 20 points de CC repr\u00e9sentent 22% de la complexit\u00e9 globale de ces 539 fonctions.<br \/>\nSi on regarde au niveau de l\u2019ensemble de l\u2019application, 36, c\u2019est-\u00e0-dire 0.9% des 3936 fonctions existantes repr\u00e9sentent 12.4% de la Complexit\u00e9 Cyclomatique totale (43 846 points).<\/p>\n<p style=\"text-align: justify\">Inutile de dire que nous porterons une attention toute particuli\u00e8re \u00e0 ces objets, lorsque nous \u00e9tudierons notre plan d\u2019action, que ce soit pour un transfert de connaissances, un refactoring ou un re-engineering.<\/p>\n<p style=\"text-align: justify\">Nous continuerons cet article dans le prochain post, en effectuant ce m\u00eame travail sur la complexit\u00e9, au niveau des fichiers cette fois.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Suite de notre s\u00e9rie sur l\u2019analyse du code source de Word 1.1a, la premi\u00e8re version de ce traitement de texte publi\u00e9 par Microsoft en 1990. Dans le premier post, nous avons vu les m\u00e9triques quantitatives de taille (LOCs), de complexit\u00e9 (CC), le niveau de commentaires et de duplication. Le second post \u00e9tait consacr\u00e9 aux diff\u00e9rentes [&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-1814","post","type-post","status-publish","format-standard","hentry","category-qualite-des-applications"],"_links":{"self":[{"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts\/1814"}],"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=1814"}],"version-history":[{"count":23,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts\/1814\/revisions"}],"predecessor-version":[{"id":1843,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts\/1814\/revisions\/1843"}],"wp:attachment":[{"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/media?parent=1814"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/categories?post=1814"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/tags?post=1814"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}