{"id":1955,"date":"2014-08-31T09:58:13","date_gmt":"2014-08-31T08:58:13","guid":{"rendered":"http:\/\/qualilogy.com\/fr\/?p=1955"},"modified":"2014-09-01T08:24:24","modified_gmt":"2014-09-01T07:24:24","slug":"application-legacy-refactoring-reengineering-4","status":"publish","type":"post","link":"http:\/\/qualilogy.com\/fr\/application-legacy-refactoring-reengineering-4\/","title":{"rendered":"Application Legacy \u2013 Refactoring ou reengineering? (IV)"},"content":{"rendered":"<p><a href=\"http:\/\/500px.com\/Vicken\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-1971\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/08\/Qualilogy_Legacy_EditAndPray2.jpg\" alt=\"Qualilogy-Legacy-Reengineering-Refactoring\" width=\"239\" height=\"360\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/08\/Qualilogy_Legacy_EditAndPray2.jpg 239w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/08\/Qualilogy_Legacy_EditAndPray2-199x300.jpg 199w\" sizes=\"(max-width: 239px) 100vw, 239px\" \/><\/a>Au retour des vacances estivales, je reprends cette s\u00e9rie de posts sur l\u2019utilisation de SonarQube avec une application Legacy en C, en l\u2019esp\u00e8ce la premi\u00e8re version de Word publi\u00e9e par Microsoft en 1990.<\/p>\n<p class=\"wp-more-tag mce-wp-more\" title=\"Read More...\">Nous avons pos\u00e9 l\u2019hypoth\u00e8se suivante : Microsoft vient de se faire racheter et son nouveau propri\u00e9taire vous demande, en tant que consultant Qualit\u00e9, de recommander une strat\u00e9gie concernant cette version de Word.<\/p>\n<p class=\"wp-more-tag mce-wp-more\" title=\"Read More...\">Ne croyez pas que cela n\u2019arrive jamais : des bo\u00eetes de software se font racheter tous les jours, et la R&amp;D et le code de ces logiciels sont au c\u0153ur de ces acquisitions.<\/p>\n<p class=\"wp-more-tag mce-wp-more\" title=\"Read More...\"><!--more--><\/p>\n<p class=\"wp-more-tag mce-wp-more\" title=\"Read More...\">Plus pr\u00e9cis\u00e9ment, vous devez r\u00e9pondre \u00e0 ces trois questions :<\/p>\n<ul>\n<li>Quel serait le co\u00fbt pour transf\u00e9rer cette application \u00e0 une nouvelle \u00e9quipe de R&amp;D ? C\u2019est la question qui se pose chaque fois que l\u2019on souhaite outsourcer une application Legacy \u00e0 une soci\u00e9t\u00e9 de services.<\/li>\n<li>Quel serait le co\u00fbt d\u2019un refactoring de cette application, afin d\u2019en am\u00e9liorer la qualit\u00e9 et r\u00e9duire ainsi les co\u00fbts de maintenance ? Toute application Legacy se caract\u00e9rise g\u00e9n\u00e9ralement par une dette technique \u00e9lev\u00e9e. Un refactoring permettrait de r\u00e9duire les int\u00e9r\u00eats de cette derni\u00e8re, et donc les co\u00fbts de transfert de connaissances vers un outsourcer et\/ou les co\u00fbts de maintenance par celui-ci.<\/li>\n<li>Quel serait le co\u00fbt de reengineering de cette application ? 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 la porter dans un autre langage, plus r\u00e9cent, moins difficile \u00e0 maintenir ?<\/li>\n<\/ul>\n<p class=\"wp-more-tag mce-wp-more\" title=\"Read More...\">Evidemment, il vous faut non seulement tenter de r\u00e9pondre \u00e0 ces 3 questions, mais \u00e9galement proposer un plan d\u2019action pour chacune de ses strat\u00e9gies.<\/p>\n<p class=\"wp-more-tag mce-wp-more\" title=\"Read More...\">Nous avons vu <a title=\"Comment analyser ce code Legacy avec SonarQube\" href=\"http:\/\/qualilogy.com\/fr\/audit-application-legacy-c-microsoft-word-1-1a-1\/\" target=\"_blank\">comment analyser ce code Legacy avec SonarQube<\/a>, et les r\u00e9sultats obtenus en mati\u00e8re de m\u00e9triques \u2013 taille (LOCs), complexit\u00e9 (CC), commentaires et duplications \u2013 ainsi que\u00a0 <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\">les diff\u00e9rentes \u2018Issues\u2019<\/a> de type Blocker, Critical, Major et Minor.<br \/>\nNous avons \u00e9galement v\u00e9rifi\u00e9 l\u2019existence de <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\">composants \u2018monstres\u2019<\/a> : fonctions et programmes volumineux et complexes, comportant un nombre \u00e9lev\u00e9 de violations aux bonnes pratiques de programmation, notamment en mati\u00e8re de lisibilit\u00e9 et de compr\u00e9hension du code.<\/p>\n<h2 class=\"wp-more-tag mce-wp-more\" title=\"Read More...\">Legacy code<\/h2>\n<p class=\"wp-more-tag mce-wp-more\" title=\"Read More...\">Qu\u2019est ce que du code Legacy ?<\/p>\n<p class=\"wp-more-tag mce-wp-more\" title=\"Read More...\">A l\u2019origine, il s\u2019agit d\u2019une application \u2018h\u00e9rit\u00e9e\u2019 d\u2019une g\u00e9n\u00e9ration pr\u00e9c\u00e9dente de programmeurs, d\u00e9velopp\u00e9e dans un langage d\u2019une g\u00e9n\u00e9ration ant\u00e9rieure et s\u2019ex\u00e9cutant sur une plateforme (hardware, OS, \u2026) \u00e9galement ancienne, voire non support\u00e9e. L\u2019expression d\u00e9signait essentiellement du code Mainframe Cobol.<\/p>\n<p class=\"wp-more-tag mce-wp-more\" title=\"Read More...\">Aujourd\u2019hui, les jeunes g\u00e9n\u00e9rations vont plus souvent l\u2019utiliser pour d\u00e9signer des applications anciennes (plus de 5 \u00e0 10 ans) et\/ou sans interface web et\/ou \u00e9crites dans des langages non orient\u00e9s-objet (C, Forms, Powerbuilder, Visual Basic, etc.)<\/p>\n<p class=\"wp-more-tag mce-wp-more\" title=\"Read More...\">Dans tous les cas, le terme \u2018Legacy\u2019 \u00e9voque un code difficilement compr\u00e9hensible, avec une dette technique importante et une documentation souvent \u00e9parse et pas \u00e0 jour.<\/p>\n<h2 class=\"wp-more-tag mce-wp-more\" title=\"Read More...\">Edit and Pray<\/h2>\n<p class=\"wp-more-tag mce-wp-more\" title=\"Read More...\">Selon Michael Feathers, auteur tr\u00e8s connu d\u2019un livre tr\u00e8s recommand\u00e9 \u2013 \u00ab\u00a0Working Effectively with Legacy Code\u00a0\u00bb \u2013 le code Legacy se caract\u00e9rise par l\u2019absence de tests.<\/p>\n<p class=\"wp-more-tag mce-wp-more\" title=\"Read More...\">Dans le chapitre \u20182 \u2013 Working with Feedback\u2019 de son livre, il d\u00e9crit un processus tr\u00e8s courant, notamment chez les R&amp;D des \u00e9diteurs de software : \u00ab\u00a0Edit and Pray\u00a0\u00bb, qui peut se traduire par \u2018Change et Prie\u2019 (pour que cela marche). Face \u00e0 une demande d\u2019\u00e9volution, le d\u00e9veloppeur va planifier soigneusement sa t\u00e2che, s\u2019assurer au pr\u00e9alable qu\u2019il comprend parfaitement le code \u00e0 modifier et les \u00e9ventuels impacts, impl\u00e9menter l\u2019\u00e9volution, compiler et v\u00e9rifier que celle-ci fonctionne correctement, et effectuer quelques tests suppl\u00e9mentaires, ici et l\u00e0, dans les zones \u00e9ventuellement impact\u00e9es, afin de s\u2019assurer qu\u2019il n\u2019a rien cass\u00e9. Ensuite, il va passer son \u00e9volution \u00e0 une \u00e9quipe de testeurs qui va r\u00e9aliser une batterie de tests de r\u00e9gression et autres tests plus ou moins automatis\u00e9s, afin de s\u2019assurer du bon comportement de l\u2019application.<\/p>\n<p class=\"wp-more-tag mce-wp-more\" title=\"Read More...\">Dans le meilleur des cas, ces tests seront effectu\u00e9s durant la nuit, et notre d\u00e9veloppeur en conna\u00eetra les r\u00e9sultats le lendemain, et donc si son code est valide, ou tout au moins valid\u00e9. Le plus souvent, l\u2019ensemble des \u00e9volutions de la semaine sera test\u00e9 en fin de semaine, avec quelques tests manuels additionnels, et cette validation n\u2019interviendra que la semaine suivante. Une autre pratique encore tr\u00e8s courante aujourd\u2019hui chez les \u00e9diteurs logiciels consiste \u00e0 d\u00e9finir :<\/p>\n<ul>\n<li>une date de sortie d\u2019une nouvelle version du software, par exemple le 15 octobre ;<\/li>\n<li>une p\u00e9riode de d\u00e9veloppement pendant laquelle les \u00e9volutions sont impl\u00e9ment\u00e9es, par exemple jusqu\u2019au 20 septembre ;<\/li>\n<li>une p\u00e9riode de QA (entre le 20 septembre et le 15 octobre) pendant lesquelles toutes les demandes d\u2019\u00e9volution sont gel\u00e9es, la nouvelle version passe dans les mains de l\u2019\u00e9quipe de QA, plus aucun nouveau d\u00e9veloppement n\u2019est lanc\u00e9 et les d\u00e9veloppeurs se d\u00e9dient uniquement \u00e0 la correction des probl\u00e8mes d\u00e9couverts par la QA.<\/li>\n<\/ul>\n<h2 class=\"wp-more-tag mce-wp-more\" title=\"Read More...\">Cover and Modify<\/h2>\n<p class=\"wp-more-tag mce-wp-more\" title=\"Read More...\">Une autre mani\u00e8re de travailler selon Michael Feathers consiste en une couverture de tests unitaires afin de prot\u00e9ger notre code des cons\u00e9quences de toute modification, comme un filet de s\u00e9curit\u00e9. Quels sont les avantages d\u2019une bonne couverture de tests ?<\/p>\n<ul>\n<li>Vous disposez d\u2019une batterie de tests que vous lancez chaque fois que vous r\u00e9alisez une modification, avec succ\u00e8s la plupart du temps. Parfois, vous commettez une erreur, par exemple de logique m\u00e9tier dans une condition, et un ou plusieurs des tests \u00e9choue(nt). Vous corrigez votre erreur dans la minute qui suit : le feedback est instantan\u00e9, pas besoin d\u2019attendre le lendemain, la semaine suivante ou la p\u00e9riode de QA pour savoir si le changement effectu\u00e9 dans le code a introduit un bug ou une r\u00e9gression.<\/li>\n<li>Vous devez modifier cette m\u00e9thode ou cette fonction vraiment tr\u00e8s volumineuse et complexe. C\u2019est l\u2019occasion d\u2019effectuer un refactoring et splitter (s\u00e9parer) celle-ci en plusieurs autres m\u00e9thodes plus simples. Mais vous craignez qu\u2019un tel changement \u2018casse\u2019 ce qui fonctionnait jusqu\u2019alors. \u00ab\u00a0Don\u2019t fix it if it ain\u2019t broke\u00a0\u00bb dit-on souvent : c\u2019est malheureusement le meilleur moyen de d\u00e9velopper du nouveau code Legacy au-dessus du code Legacy existant. Si vous disposez de tests, non seulement vous-m\u00eame mais aussi toute l\u2019\u00e9quipe, aurez une meilleure confiance dans les changements effectu\u00e9s. Vous pouvez am\u00e9liorer l\u2019existant au fur et \u00e0 mesure, \u00e9viter l\u2019inflation de la dette technique, et surtout travailler avec l\u2019agr\u00e9able sentiment de d\u00e9velopper un code de qualit\u00e9 au lieu d\u2019ajouter un nouveau poids \u00e0 la charge qui p\u00e8se d\u00e9j\u00e0 lourdement sur vos \u00e9paules.<\/li>\n<li>Vous d\u00e9veloppez quelques nouveaux tests unitaires afin de couvrir votre \u00e9volution et tester celle-ci. Toute prochaine modification que devra r\u00e9aliser un membre de votre \u00e9quipe sera plus facile, plus rapide et plus s\u00fbre.<\/li>\n<\/ul>\n<p class=\"wp-more-tag mce-wp-more\" title=\"Read More...\">Contrairement \u00e0 ce que l\u2019on pourrait croire, d\u00e9velopper des tests unitaires ne signifie pas d\u00e9velopper deux fois plus ou plus lentement. Le code de ces tests est g\u00e9n\u00e9ralement tr\u00e8s simple, et si elle repr\u00e9sente une charge de travail additionnelle, celle-ci est n\u2019est finalement pas si importante au regard des b\u00e9n\u00e9fices. Il s\u2019agit d\u2019ailleurs d\u2019une pratique de plus en plus courante, au point que l\u2019absence de tests unitaire est consid\u00e9r\u00e9e comme un des <a title=\"Les 7 p\u00e9ch\u00e9s capitaux\" href=\"http:\/\/docs.codehaus.org\/display\/SONAR\/Lack+of+Unit+Tests\" target=\"_blank\">7 p\u00e9ch\u00e9s capitaux du d\u00e9veloppement<\/a>.<\/p>\n<p class=\"wp-more-tag mce-wp-more\" title=\"Read More...\">De toutes fa\u00e7ons, l\u2019\u00e9criture de code n\u2019est pas non plus le co\u00fbt le plus important : un d\u00e9veloppeur passe plus de temps \u00e0 essayer de comprendre le code qu\u2019il doit modifier plut\u00f4t qu\u2019\u00e0 d\u00e9velopper cette modification. En fait, vous ne pouvez m\u00eame pas estimer le temps n\u00e9cessaire \u00e0 l\u2019impl\u00e9mentation d\u2019une \u00e9volution si vous ne connaissez pas d\u00e9j\u00e0 le code existant et ce qu\u2019il fait.<\/p>\n<p class=\"wp-more-tag mce-wp-more\" title=\"Read More...\">La raison pour laquelle la lisibilit\u00e9 et l\u2019intelligibilit\u00e9 du code est une des sources les plus importantes de co\u00fbts de maintenance \u00e9lev\u00e9s r\u00e9side dans le fait que le temps pass\u00e9 \u00e0 programmer est n\u00e9gligeable par rapport au temps n\u00e9cessaire \u00e0 comprendre ce que fait le code et comment impl\u00e9menter tout changement.<br \/>\nPar contre, si vous disposez d\u00e9j\u00e0 de tests unitaires, g\u00e9n\u00e9ralement tr\u00e8s simples et tr\u00e8s lisibles, vous r\u00e9duisez \u00e9norm\u00e9ment cette charge.<\/p>\n<p class=\"wp-more-tag mce-wp-more\" title=\"Read More...\">Mais qu\u2019en est-il dans notre cas, lorsque notre application Legacy ne dispose pas d\u00e9j\u00e0 de tests unitaires ? C\u2019est ce que nous verrons dans le prochain post.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Au retour des vacances estivales, je reprends cette s\u00e9rie de posts sur l\u2019utilisation de SonarQube avec une application Legacy en C, en l\u2019esp\u00e8ce la premi\u00e8re version de Word publi\u00e9e par Microsoft en 1990. Nous avons pos\u00e9 l\u2019hypoth\u00e8se suivante : Microsoft vient de se faire racheter et son nouveau propri\u00e9taire vous demande, en tant que consultant [&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":[17,19,18],"class_list":["post-1955","post","type-post","status-publish","format-standard","hentry","category-qualite-des-applications","tag-legacy","tag-reengineering","tag-refactoring"],"_links":{"self":[{"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts\/1955"}],"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=1955"}],"version-history":[{"count":31,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts\/1955\/revisions"}],"predecessor-version":[{"id":1989,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts\/1955\/revisions\/1989"}],"wp:attachment":[{"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/media?parent=1955"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/categories?post=1955"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/tags?post=1955"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}