Nous l'avons tous fait, nous avons étiqueté du code (souvent des éléments dont nous avons hérité) comme "hérité"? Mais il est toujours utilisé dans les systèmes de production - est-ce vraiment un héritage? Et qu'est-ce qui en fait un héritage? Devons-nous éviter cet étiquetage injustifié de code qui fonctionne parfaitement; où l’étiquetage est une pure affaire qui nous permet de faire avancer les choses et de garder les cadres supérieurs agréables et heureux?
Résumé des réponses
En regardant à travers les réponses, je vois quatre thèmes généraux. Voici ce que je vois la ventilation:
- N'importe quel code qui a été livré: 6
- Systèmes morts: 2.5
- Pas de tests unitaires: 2
- Les développeurs ne sont pas autour: 1.5
Réponses:
Je suis plutôt partial au résumé de Wikipedia moi-même:
Une grande partie de ce que d'autres personnes décrivent dans leurs réponses sont les raisons pour lesquelles le code devient "hérité". Mais la question essentielle elle-même est la suivante:
Le fait qu'il soit encore utilisé dans la production est précisément ce qui en fait l'héritage . Si le code ne fonctionne pas correctement ou s'il n'est plus utilisé en production, il est respectivement "cassé" ou "retiré". Legacy signifie qu'il est toujours utilisé et fonctionne correctement, mais qu'il intègre des conceptions ou des techniques qui ne sont plus d'usage courant.
Tout code ou système que vous souhaitez (a) mettre à niveau / mettre à jour, mais ne le pouvez pas, ou (b) sont en cours de mise à niveau, est un système hérité. Cela ne signifie pas une refactorisation ou un nettoyage général du code, mais des modifications significatives de la conception, en utilisant éventuellement un nouveau cadre ou même une nouvelle plate-forme.
Les systèmes ou le code peuvent devenir hérités pour un certain nombre de raisons :
Manque de maintenance régulière ou de logiciels pourris . Clairement, si l'application n'est pas maintenue régulièrement, elle ne suivra pas les changements majeurs du monde des logiciels. Cela peut être dû à une simple négligence ou à des choix délibérés fondés sur des priorités commerciales ou des contraintes budgétaires.
Manque de test. Une autre réponse fait référence à la revendication hyperbolique d'un auteur populaire selon laquelle tout code non couvert par des tests est un code hérité. Ceci est vraiment pas une définition précise , mais il est une cause possible de la racine; sans de bons tests (automatisés ou manuels), les développeurs deviennent timides et craignent d’apporter des modifications majeures car ils craignent de casser quelque chose, menant ainsi la "pourriture logicielle" décrite ci-dessus.
Le verrouillage des revêtements est un facteur souvent négligé qui est particulièrement insidieux dans les projets utilisant de grandes bibliothèques ou frameworks open-source (même si je l'ai déjà vu se produire avec des outils commerciaux). Souvent, des modifications importantes sont apportées au framework / bibliothèque, rendant une mise à niveau prohibitive ou difficile. Ainsi, le système devient hérité du fait qu’il fonctionne sur une plate-forme plus ancienne (et éventuellement non plus prise en charge).
Le code source n'est plus disponible, ce qui signifie que le système ne peut jamais être ajouté, jamais modifié. Etant donné que ces systèmes doivent être réécrits pour pouvoir être mis à niveau - et non mis à jour progressivement / de manière itérative - de nombreuses entreprises ne s’embêtent pas.
Tout ce qui ralentit ou arrête les mises à jour d'une base de code peut entraîner l'héritage de cette base de code.
Maintenant, la question distincte, non explicite mais implicite, est: qu'est-ce qui ne va pas avec le code hérité? Il est souvent utilisé comme terme péjoratif, d'où la question:
Et la réponse est non, nous ne devrions pas; l'étiquetage est justifié et le terme lui-même implique clairement un code fonctionnel. L’important n’est pas que cela fonctionne, mais comment cela fonctionne.
Dans certains cas, il n'y a rien de mal avec le code hérité. Ce n'est pas un mauvais mot. Les codes / systèmes hérités ne sont pas diaboliques. Ils ont juste collecté de la poussière - parfois un peu, parfois beaucoup.
Legacy devient obsolète lorsque le système ne peut plus répondre à tous les besoins du client. Il faut faire attention à cette étiquette. Sinon, c'est simplement une équation coûts / avantages; si le coût de la mise à niveau est inférieur au coût de ses avantages (y compris les coûts de maintenance futurs moins élevés), mettez à niveau, sinon, laissez-le tranquille. Nul besoin de cracher le mot "héritage" dans le même ton que vous réservez normalement pour "audit fiscal". C'est une situation parfaitement convenable.
la source
Cela signifie généralement que cela est écrit dans un langage ou basé sur un système dans lequel vous ne faites généralement pas de nouveau développement.
Par exemple, la plupart des endroits n'écrivent pas de nouveaux programmes en Cobol. Cependant, une grande partie de leurs activités peut s'exécuter sur des applications écrites en Cobol. Par conséquent, ces applications sont étiquetées "Legacy".
la source
Héritage signifie tout code que vous souhaitez plutôt remplacer que le travail avec. Étant donné l'attitude de la plupart des programmeurs envers la plupart des codes existants, cela inclut généralement presque tout, à l'exception de ce que vous écrivez activement en ce moment (et d'un grand projet où vous devez coder pour une conception figée, même ce que vous écrivez au début). moment peut être inclus aussi).
Le dernier point mène à deux autres points qui, à mon avis, sont souvent vrais.
Premièrement, le code est souvent conservé en héritage, même s'il ne devrait vraiment pas l'être. Les gestionnaires de niveau supérieur supposent généralement que la ré-implémentation d'un système coûtera autant, voire plus, que l'implémentation initiale, ce qui est rarement le cas.
Deuxièmement, les tests unitaires sont une arme à double tranchant. Ils font trop facilement croire que des changements localisés dans la mise en œuvre sont ce qui compte vraiment. Pour apporter des améliorations significatives à un système plus vaste, vous devez souvent (généralement?) Modifier suffisamment la conception globale de sorte qu'un grand nombre (sinon la plupart) des tests unitaires deviennent inutiles. Malheureusement, la présence de tests unitaires et l'attitude qu'ils engendrent peuvent rendre trop facile l'ignorance des changements réellement nécessaires.
Un exemple de cela pourrait peut-être aider: supposons qu'un programme possède une bibliothèque d' interface utilisateur avec d'excellents tests unitaires, ainsi que plusieurs programmes utilisant cette bibliothèque. Un membre de la haute direction devient convaincu que le "Web activé" est important (et, pour les besoins de l’argumentation, supposons qu’il ait raison dans ce cas-là). Après un examen attentif, les cadres intermédiaires estiment que les tests unitaires actuels suffisent pour pouvoir passer d’une interface utilisateur affichée via la fonction de fenêtrage du système d’exploitation local à un affichage à distance via HTML / CSS / AJAX, tout en conservant toute la validation d’entrée initiale.
C'est génial n'est ce pas? Cela montre à quel point les tests unitaires peuvent être utiles. Nous avons échangé l'intégralité de la mise en œuvre de l'ensemble de l'interface utilisateur, mais nous nous sommes assurés que l'apparence, la fonctionnalité et les fonctionnalités restent pratiquement cohérentes, et toutes les entrées utilisateur sont validées pour garantir l'intégrité des données. Les tests unitaires ont sauvé la journée!
Ou pas! Cette bibliothèque d’interface utilisateur extrêmement flexible et extrêmement bien testée a permis de faire comprendre à toutes les personnes impliquées que pour ce programme qui se trouve sur son marché avec ses utilisateurs, une interface utilisateur basée sur le Web est tout à fait une mauvaise chose. Ce qui est vraiment nécessaire, c'est un service Web avec une interface RESTful et aucune interface utilisateur absolue .
Maintenant, il est certainement vrai que les tests unitaires ne suppriment pas, en soi, la capacité des personnes à comprendre leur marché ou à se rendre compte que cela est vraiment nécessaire. En même temps, la vieille ligne sur les marteaux et les clous me fait presque penser. Il peut être encore pire quand vous non seulement avoir un marteau, mais ont beaucoup d'expérience avec ce marteau, et de savoir c'est vraiment un marteau de haute qualité qui fonctionne très bien dans de nombreuses situations différentes. Le fait même qu'il soit si bon dans tant de domaines dans tant de situations rend encore plus difficile la reconnaissance du fait qu'il s'agit d'un mauvais outil pour le travail à accomplir.
la source
Le code hérité est généralement orphelin d'une manière ou d'une autre. Le développeur principal, le seul à l'avoir compris, a été heurté par un bus et ses notes ont été écrites dans son dialecte ukrainien, qui est maintenant une langue morte. Ou, alternativement, tout ce qui est écrit dans Visual Basic 6.0 .
Je travaille tout le temps sur le code hérité. Je dirais que les caractéristiques sont:
S'il ne présente pas ces caractéristiques, il ne s'agit probablement pas d'un héritage. Si vous n'aimez pas les scripts Perl de vos prédécesseurs , je sympathise avec vous, mais je ne pense pas que ce soit un héritage. J'ai récemment modernisé un script Perl datant de 15 ans, lié à une base de données Sybase obsolète . C'était un gâteau comparé à la moindre modification apportée à notre terrible système comptable COBOL .
la source
Dans son livre, Travailler efficacement avec le code hérité , Michael Feathers définit le code hérité comme un code non couvert par les tests unitaires. C'est une définition avec laquelle je suis d'accord. Je considère également que le code existant est ancien, mais toujours utilisable.
la source
Techniquement, l'héritage est tout code prêt à être écrit. Donc, dès qu’elle est en production, elle est un héritage. Parce qu'il y a déjà de la valeur là-bas, vous ne pouvez pas simplement le jeter ... Vous devez le gérer.
C'est "avant votre temps" mais "toujours votre mal de tête" .
la source
Le code hérité est un code qui ne reste que dans la base de code car beaucoup de choses cesseraient de fonctionner autrement. En d'autres termes: la seule raison d'être est la compatibilité ascendante.
Vous préférez le changer ou même le jeter, mais vous ne pouvez pas, car vous allez casser tout le code en vous fondant dessus (ce qui pourrait être du code que vous ne pourrez pas adapter en conséquence). Par conséquent, vous devez le conserver (et parfois même le maintenir), mais vous souhaitez que tout nouveau code ne soit pas écrit en conséquence.
Un exemple sont les méthodes obsolètes de l'API d'une bibliothèque. Ils sont toujours là, donc si ceux qui mettent à jour la bibliothèque peuvent toujours construire son projet, mais ils sont marqués comme obsolètes et votre compilateur devrait vous en avertir.
Un autre exemple concerne toutes ces astuces étranges que fait Microsoft pour exécuter des programmes écrits pour des versions de leur système d’exploitation totalement obsolètes. Le summum de cet être:
la source
L'héritage implique l'héritage. Le code hérité est simplement du code hérité du passé. C'est un code hérité même si vous l'avez écrit vous-même auparavant!
Toutes les autres considérations découlent essentiellement du fait que vous ne l'avez pas écrit spécifiquement pour votre projet actuel. Ce n'est pas nécessairement une mauvaise chose en soi.
la source
Mon opinion est que ce qui est considéré comme un code hérité dépend de plusieurs choses et que la balise 'héritage' est probablement spécifique à une organisation.
Si le matériel / système d’exploitation sur lequel il s’exécute est ancien et n’a plus été arrêté par le fournisseur (frappe 1).
S'il est plus difficile d'essayer de le réparer que de le réécrire, pour une raison quelconque,
faire cela
Frappe 2.
Une fusion de plusieurs organisations en une seule, Strike 3, va probablement devenir un héritage.
Existe-t-il une alternative plus avantageuse et moins chère vendue en tant qu'application et / ou service tiers - grève 4.
L’organisation ressemble-t-elle à un hôpital ou à un district scolaire où la cohérence est plus importante que les nouvelles technologies dans les opérations quotidiennes? Cela prendra plus de temps pour qu'une application soit considérée comme héritée par rapport à la même application dans une organisation commerciale / compétitive.
Si la société est une petite société de développement qui continue à améliorer / à soutenir l'application pour qu'elle réponde aux besoins des clients, le considère-t-il comme un code hérité ou simplement du «vieux» code? Je connais une société nommée Mc2Ok - ils ont développé le logiciel sur ce qui semble avoir été Windows 3.1 et ils ne cessent de le faire évoluer. Il a toujours beaucoup l'apparence de Windows 3.1, mais ils ont également ajouté une interface Web. Il s’agit d’une société de développement composée de deux personnes (à mon avis), et je dirais qu’en cessant de travailler dessus, ce sera considéré comme un héritage et il est temps de migrer un ou deux ans plus tard si vous l’utilisez. Mais cela pourrait être encore 10 ans ou plus.
Parfois, lorsque la gestion change, cela peut entraîner des vagues qui ont de nombreux effets de ruissellement ... En fonction de l’influence de la nouvelle gestion, il peut restituer de nombreuses applications qui pourraient autrement être héritées.
Je pense que chaque organisation doit définir ce que «code hérité» signifie pour elle. J'avais l'habitude de parcourir les petites annonces du Sunday Times chaque semaine pour voir ce que les organisations cherchaient. C'était mon baromètre de ce qui n'était plus d'actualité (l'héritage). Et bien, le Sunday Times n'est plus pertinent :-) Et nous pouvons généraliser que COBOL est un héritage, ASP Classic est un héritage, etc. Mais je pense que chaque organisation doit décider quand une application est considérée comme un héritage.
la source
Le code est un héritage quand on a peur de le changer, car il peut le casser. C’est encore plus pénible lorsque l’ensemble du système risque d’être endommagé par des modifications de ce code.
C'est pourquoi je suis également d'accord avec la définition de Michael Feathers. Le code comportant de bons tests unitaires peut être modifié sans crainte.
Je pense aussi que ce code hérité n'a rien à voir avec son âge. On peut écrire le code hérité depuis le début.
la source