{"id":73,"date":"2021-11-16T10:40:00","date_gmt":"2021-11-16T13:40:00","guid":{"rendered":"https:\/\/dcoder.io\/blog\/systeme-legacy-reecrire-ou-refactoriser\/"},"modified":"2021-11-16T10:40:00","modified_gmt":"2021-11-16T13:40:00","slug":"systeme-legacy-reecrire-ou-refactoriser","status":"publish","type":"post","link":"https:\/\/dcoder.io\/blog\/fr\/systeme-legacy-reecrire-ou-refactoriser\/","title":{"rendered":"Syst\u00e8me h\u00e9rit\u00e9 : tout r\u00e9\u00e9crire ou refactoriser par \u00e9tapes ?"},"content":{"rendered":"<p><strong>Dans la plupart des cas, remplacez par morceaux.<\/strong> La r\u00e9\u00e9criture compl\u00e8te ne se justifie que si la plateforme sous-jacente n&#8217;est plus maintenue en s\u00e9curit\u00e9, ou si le mod\u00e8le de donn\u00e9es d&#8217;origine emp\u00eache l&#8217;activit\u00e9 de cro\u00eetre. En dehors de cela, vous passerez deux ans \u00e0 reconstruire des fonctionnalit\u00e9s qui marchaient d\u00e9j\u00e0.<\/p>\n<p>La demande arrive toujours avec la m\u00eame phrase : \u00ab ce syst\u00e8me est un d\u00e9sastre, autant tout refaire \u00bb. Parfois c&#8217;est vrai. La plupart du temps, c&#8217;est la r\u00e9action naturelle de quelqu&#8217;un qui d\u00e9couvre du code qu&#8217;il n&#8217;a pas \u00e9crit, et la r\u00e9\u00e9criture compl\u00e8te est la d\u00e9cision la plus co\u00fbteuse que l&#8217;on puisse prendre sur un syst\u00e8me en production.<\/p>\n<h2>Ce que co\u00fbte r\u00e9ellement une r\u00e9\u00e9criture<\/h2>\n<p>Le budget pr\u00e9voit toujours de reconstruire ce que l&#8217;on voit. Il ne pr\u00e9voit jamais les cinq ann\u00e9es de correctifs invisibles incorpor\u00e9s au syst\u00e8me actuel.<\/p>\n<p>Ce <code>if<\/code> bizarre dans le calcul des frais de port n&#8217;est pas du mauvais code. C&#8217;est l&#8217;exception du contrat avec ce gros client, r\u00e9gl\u00e9e un vendredi apr\u00e8s-midi de 2019. Le nouveau syst\u00e8me, propre et bien architectur\u00e9, n&#8217;aura pas ce <code>if<\/code>. Il aura le m\u00eame probl\u00e8me dont ce client s&#8217;est plaint en 2019.<\/p>\n<p>Ajoutez le d\u00e9tail qui tue les plannings : pendant la r\u00e9\u00e9criture, l&#8217;ancien syst\u00e8me ne peut pas cesser d&#8217;\u00e9voluer. L&#8217;activit\u00e9 continue de demander des choses. Soit vous gelez le produit pendant deux ans, ce qu&#8217;aucune entreprise ne supporte, soit vous impl\u00e9mentez tout en double.<\/p>\n<h2>Quand la r\u00e9\u00e9criture se justifie vraiment<\/h2>\n<p>Il existe des cas l\u00e9gitimes, et ils sont reconnaissables :<\/p>\n<ul>\n<li><strong>La plateforme n&#8217;est plus maintenue en s\u00e9curit\u00e9.<\/strong> Une version de langage ou de framework sans correctifs de vuln\u00e9rabilit\u00e9 n&#8217;est pas une dette technique. C&#8217;est un risque juridique et op\u00e9rationnel.<\/li>\n<li><strong>Le mod\u00e8le de donn\u00e9es bloque l&#8217;activit\u00e9.<\/strong> Le syst\u00e8me a \u00e9t\u00e9 con\u00e7u pour une entit\u00e9 et une devise, et il y a d\u00e9sormais cinq filiales dans trois pays. Si chaque nouvelle exigence bute sur la m\u00eame limite structurelle, le probl\u00e8me est dans les fondations.<\/li>\n<li><strong>Plus personne ne peut y toucher.<\/strong> Non parce que c&#8217;est laid, mais parce que la technologie ne se trouve plus sur le march\u00e9 et qu&#8217;aucun test ne donne \u00e0 quiconque la confiance n\u00e9cessaire pour modifier quoi que ce soit.<\/li>\n<\/ul>\n<p>Notez que \u00ab le code est laid \u00bb et \u00ab nous n&#8217;aimons pas ce langage \u00bb ne figurent pas dans cette liste.<\/p>\n<h2>L&#8217;alternative : \u00e9trangler l&#8217;existant progressivement<\/h2>\n<p>L&#8217;approche qui fonctionne porte le nom de figuier \u00e9trangleur, en r\u00e9f\u00e9rence \u00e0 l&#8217;arbre qui pousse autour de son h\u00f4te jusqu&#8217;\u00e0 le remplacer enti\u00e8rement. En pratique :<\/p>\n<ol>\n<li>Placez un routeur devant l&#8217;ancien syst\u00e8me. Tout continue de fonctionner comme avant.<\/li>\n<li>Choisissez une fonctionnalit\u00e9 \u00e0 fronti\u00e8re nette et \u00e0 forte valeur. Reconstruisez-la seule, dans le nouvel environnement.<\/li>\n<li>Redirigez les requ\u00eates de cette fonctionnalit\u00e9 vers le nouveau syst\u00e8me. En cas de probl\u00e8me, redirigez-les en arri\u00e8re en une minute.<\/li>\n<li>Recommencez. \u00c0 chaque cycle, l&#8217;existant r\u00e9tr\u00e9cit.<\/li>\n<\/ol>\n<p>L&#8217;avantage ici n&#8217;est m\u00eame pas technique, il est politique. Le projet livre de la valeur visible chaque mois au lieu de demander deux ans de confiance. Cela change le regard de la direction sur l&#8217;investissement et, en pratique, c&#8217;est ce qui permet au projet d&#8217;aller au bout.<\/p>\n<h2>Avant de choisir, placez un filet sous l&#8217;existant<\/h2>\n<p>Quelle que soit la d\u00e9cision, faites ceci d&#8217;abord, car cela sert les deux strat\u00e9gies :<\/p>\n<ul>\n<li><strong>Une sauvegarde restaur\u00e9e.<\/strong> Pas \u00ab les sauvegardes sont configur\u00e9es \u00bb. Restaur\u00e9e, dans un autre environnement, avec une date consign\u00e9e.<\/li>\n<li><strong>Des tests sur les parcours qui g\u00e9n\u00e8rent du chiffre.<\/strong> Ne visez pas une couverture large. Couvrez les cinq chemins qui ne doivent pas casser.<\/li>\n<li><strong>De la journalisation et de la supervision.<\/strong> Il faut savoir ce que fait le syst\u00e8me avant de le modifier. Beaucoup d&#8217;\u00e9quipes d\u00e9couvrent \u00e0 ce stade que la moiti\u00e9 des \u00e9crans ne sert jamais, ce qui r\u00e9duit de moiti\u00e9 le p\u00e9rim\u00e8tre de la r\u00e9\u00e9criture.<\/li>\n<li><strong>Un environnement de test fid\u00e8le.<\/strong> Sans lui, chaque modification est un pari.<\/li>\n<\/ul>\n<p>Ce travail prend trois \u00e0 six semaines et change fr\u00e9quemment la conclusion. J&#8217;ai vu plusieurs syst\u00e8mes qui \u00ab devaient \u00eatre refaits \u00bb devenir parfaitement acceptables une fois dot\u00e9s de supervision, d&#8217;index et d\u00e9barrass\u00e9s de ce que personne n&#8217;utilisait.<\/p>\n<h2>La question qui tranche<\/h2>\n<p>Une seule : le syst\u00e8me actuel emp\u00eache-t-il l&#8217;entreprise de faire quelque chose dont elle a besoin pour cro\u00eetre ?<\/p>\n<p>Si la r\u00e9ponse est non, il est p\u00e9nible, il est lent, il est laid, mais l&#8217;activit\u00e9 tourne, alors am\u00e9liorez-le par morceaux. Si la r\u00e9ponse est oui et que vous pouvez nommer pr\u00e9cis\u00e9ment ce qui est bloqu\u00e9, il existe un dossier concret. Et m\u00eame dans ce cas, le remplacement progressif arrive g\u00e9n\u00e9ralement plus vite.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>La r\u00e9\u00e9criture compl\u00e8te est la d\u00e9cision la plus co\u00fbteuse qu&#8217;une entreprise prenne sur un logiciel, et elle est presque toujours prise pour des raisons \u00e9motionnelles. Comment juger froidement, et l&#8217;alternative qui fonctionne.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-73","post","type-post","status-publish","format-standard","hentry","category-sem-categoria"],"_links":{"self":[{"href":"https:\/\/dcoder.io\/blog\/wp-json\/wp\/v2\/posts\/73","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dcoder.io\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dcoder.io\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dcoder.io\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dcoder.io\/blog\/wp-json\/wp\/v2\/comments?post=73"}],"version-history":[{"count":0,"href":"https:\/\/dcoder.io\/blog\/wp-json\/wp\/v2\/posts\/73\/revisions"}],"wp:attachment":[{"href":"https:\/\/dcoder.io\/blog\/wp-json\/wp\/v2\/media?parent=73"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dcoder.io\/blog\/wp-json\/wp\/v2\/categories?post=73"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dcoder.io\/blog\/wp-json\/wp\/v2\/tags?post=73"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}