Wir haben es alle geschafft, wir haben einen Code (oft geerbtes Zeug) als "Legacy" bezeichnet? Aber es wird immer noch in den Produktionssystemen verwendet - ist es also wirklich ein Erbe? Und was macht es zum Erbe? Sollten wir uns vor dieser ungerechtfertigten Kennzeichnung von perfekt funktionierendem Code scheuen? Wo die Kennzeichnung eine reine Überzeugungsarbeit ist, die es uns ermöglicht, neue Dinge durchzusetzen und das obere Management nett und glücklich zu halten?
Zusammenfassung der Antworten
Wenn ich mir die Antworten ansehe, sehe ich vier allgemeine Themen. Hier ist, wie ich die Aufschlüsselung sehe:
- Jeder gelieferte Code: 6
- Tote Systeme: 2.5
- Keine Komponententests: 2
- Entwickler sind nicht in der Nähe: 1.5
source-code
legacy
Nim
quelle
quelle
Antworten:
Ich bin selbst ziemlich parteiisch bei der Zusammenfassung von Wikipedia :
Vieles, was andere Menschen in ihren Antworten beschreiben, ist der Grund, warum Code "Vermächtnis" wird. Die eigentliche Frage ist jedoch:
Die Tatsache, dass es immer noch in der Produktion verwendet wird, ist genau das, was es zum Erbe macht . Wenn der Code nicht richtig funktioniert oder nicht mehr in der Produktion verwendet wird, ist dieser Code "defekt" bzw. "zurückgezogen". Legacy bedeutet, dass es noch verwendet wird und einwandfrei funktioniert, aber Designs oder Techniken enthält, die nicht mehr allgemein verwendet werden.
Jeder Code oder jedes System, das Sie entweder (a) aktualisieren / aktualisieren möchten, aber nicht können oder (b) sich noch in der Aktualisierungsphase befinden, ist ein Altsystem. Dies bedeutet nicht , Refactoring oder allgemeine Code Bereinigung, bedeutet dies erhebliche Änderungen an die Konstruktion, möglicherweise einen neuen Rahmen oder sogar eine neue Plattform.
Es gibt eine Reihe von Gründen, warum Systeme oder Code zum Erbe werden können:
Fehlende regelmäßige Wartung oder Software verrotten . Wenn die Anwendung nicht regelmäßig gewartet wird, kann sie mit den großen Änderungen in der Software-Welt nicht Schritt halten. Dies kann auf einfache Vernachlässigung zurückzuführen sein oder auf bewusste Entscheidungen, die auf geschäftlichen Prioritäten oder Budgetbeschränkungen beruhen.
Fehlende Tests. Eine andere Antwort bezieht sich auf die hyperbolische Behauptung eines beliebten Autors, dass es sich bei Code, der nicht von Tests abgedeckt wird, um Legacy-Code handelt. Dies ist wirklich keine genaue Definition, aber es ist eine mögliche Grundursache. Ohne gute Tests (automatisiert oder manuell) werden Entwickler schüchtern und fürchten sich vor größeren Änderungen, weil sie sich Sorgen machen, dass etwas kaputt geht.
Rev-Locking, ein oft übersehener Faktor, der bei Projekten mit großen Open-Source-Bibliotheken oder Frameworks besonders heimtückisch ist (obwohl ich es auch mit kommerziellen Tools gesehen habe). Häufig werden umfangreiche Anpassungen an dem Framework / der Bibliothek vorgenommen, wodurch ein Upgrade unangemessen schwierig oder teuer wird. Dadurch wird das System zu einem Legacy-System, da es auf einer älteren (und möglicherweise nicht mehr unterstützten) Plattform ausgeführt wird.
Der Quellcode ist nicht mehr verfügbar, das heißt, das System kann immer nur ergänzt, nie geändert werden. Da diese Systeme neu geschrieben werden müssen, um ein Upgrade durchzuführen - im Gegensatz zu einer schrittweisen / iterativen Überarbeitung -, werden sich viele Unternehmen nicht darum kümmern.
Alles, was die Aktualisierung einer Codebasis verlangsamt oder stoppt, kann dazu führen, dass diese Codebasis zu einem Erbe wird.
Nun lautet die separate, unausgesprochene, aber implizite Frage: Was ist mit Legacy-Code falsch? Es wird oft als abwertender Begriff verwendet, daher die Frage:
Und die Antwort ist nein, wir sollten nicht; Die Kennzeichnung ist gewährleistet und der Begriff selbst impliziert eindeutig einen funktionierenden Code. Der Punkt ist nicht, dass es funktioniert, sondern wie es funktioniert.
In einigen Fällen ist der Legacy-Code nicht fehlerfrei. Es ist kein schlechtes Wort. Legacy-Code / Systeme sind nicht böse. Sie haben nur etwas Staub gesammelt - manchmal ein bisschen, manchmal viel.
Legacy wird obsolet, wenn das System nicht mehr alle Anforderungen des Kunden erfüllen kann. Bei diesem Etikett müssen wir vorsichtig sein. Ansonsten ist es einfach eine Kosten / Nutzen-Gleichung. Wenn die Kosten für das Upgrade niedriger wären als die Kosten für die Vorteile (einschließlich der geringeren zukünftigen Wartungskosten), lassen Sie das Upgrade ansonsten in Ruhe. Sie müssen das Wort "Legacy" nicht in dem Ton ausspucken, den Sie normalerweise für "Tax Audit" reservieren. Es ist vollkommen in Ordnung, in dieser Situation zu sein.
quelle
Normalerweise bedeutet dies, dass es in einer Sprache geschrieben ist oder auf einem System basiert, in dem Sie normalerweise keine Neuentwicklung durchführen.
Beispielsweise schreiben die meisten Orte keine neuen Programme in Cobol. Ein Großteil ihres Geschäfts kann jedoch mit Apps ausgeführt werden, die in Cobol geschrieben wurden. Daher werden diese Apps als "Legacy" bezeichnet.
quelle
Legacy ist jeder Code, den Sie lieber ersetzen als damit arbeiten möchten. In Anbetracht der Einstellung der meisten Programmierer zu den meisten vorhandenen Codes beinhaltet dies normalerweise fast alles außer dem, was Sie gerade aktiv schreiben (und bei einem großen Projekt, bei dem Sie zu einem eingefrorenen Design codieren müssen, auch das, was Sie gerade schreiben) Moment kann auch einbezogen werden).
Der letzte Punkt führt zu zwei weiteren Punkten, von denen ich denke, dass sie oft zutreffen.
Erstens wird Code häufig als Erbe beibehalten, auch wenn dies eigentlich nicht der Fall sein sollte. Übergeordnete Manager gehen im Allgemeinen davon aus, dass die Neuimplementierung eines Systems genauso viel oder mehr kostet als die ursprüngliche Implementierung, was selten der Fall ist.
Zweitens sind Unit-Tests ein zweischneidiges Schwert. Sie machen es allzu leicht zu denken, dass lokalisierte Änderungen in der Implementierung wirklich wichtig sind. Um signifikante Verbesserungen in einem größeren System zu erzielen, müssen Sie häufig (normalerweise?) Genug am Gesamtdesign ändern, dass viele (wenn nicht die meisten) Komponententests irrelevant werden. Leider können die vorhandenen Unit-Tests und die Einstellung, die sie hervorrufen, es allzu leicht machen, die wirklich notwendigen Änderungen zu ignorieren.
Vielleicht hilft ein Beispiel: Nehmen wir an, ein Programm verfügt über eine UI- Bibliothek mit hervorragenden Komponententests und mehrere Programme, die diese Bibliothek verwenden. Jemand aus der oberen Führungsebene ist davon überzeugt, dass "web enabled" wichtig ist (und nehmen wir in diesem Fall aus Gründen der Argumentation an, dass er tatsächlich Recht hat). Nach sorgfältiger Prüfung stellen die mittleren Manager fest, dass ihre aktuellen Komponententests ausreichen, um von einer Benutzeroberfläche, die über die Fensterfunktion des lokalen Betriebssystems angezeigt wird, zu einer Remoteanzeige über HTML / CSS / AJAX zu wechseln, wobei die ursprüngliche Eingabevalidierung beibehalten wird.
Das ist toll, nicht wahr? Es zeigt, wie nützlich Unit-Tests sein können. Wir haben die gesamte Implementierung der gesamten Benutzeroberfläche ausgetauscht, aber sichergestellt, dass das Erscheinungsbild und die Funktionalität praktisch konsistent bleiben und alle Benutzereingaben überprüft werden, um die Datenintegrität sicherzustellen. Unit-Tests haben den Tag gerettet!
Oder nicht! Diese großartige, hochflexible, sorgfältig auf Unit-Tests getestete UI-Bibliothek hat allen Beteiligten vor Augen geführt, dass für dieses Programm auf dem Markt für seine Benutzer eine webbasierte UI absolut falsch ist. Was wirklich benötigt wird, ist ein Webservice mit einer REST-fähigen Schnittstelle und überhaupt keiner eigenen Benutzeroberfläche.
Nun ist es sicherlich wahr, dass Unit-Tests nicht an sich die Fähigkeit der Menschen beeinträchtigen, ihren Markt zu verstehen oder zu erkennen, dass dies wirklich notwendig ist. Gleichzeitig fällt einem die alte Linie um Hämmer und Nägel geradezu ein. Es kann noch schlimmer sein , wenn Sie nicht nur haben einen Hammer, aber eine haben viel Erfahrung mit diesem Hammer, und wissen , es ist ein wirklich ein qualitativ hochwertiges Hammer, unglaublich gut in vielen verschiedenen Situationen funktioniert. Die Tatsache, dass es in so vielen Situationen so gut ist, macht es noch schwieriger zu erkennen, ob es sich um das völlig falsche Werkzeug für den jeweiligen Job handelt.
quelle
Legacy-Code ist normalerweise in irgendeiner Weise verwaist. Der Hauptentwickler, der einzige, der das verstand, wurde von einem Bus angefahren, und seine Notizen wurden in seiner ukrainischen Muttersprache verfasst, die heute eine tote Sprache ist. Oder alternativ alles, was in Visual Basic 6.0 geschrieben wurde .
Ich arbeite die ganze Zeit an altem Code. Ich würde sagen, die Eigenschaften sind:
Wenn es diese Eigenschaften nicht hat, dann ist es wahrscheinlich kein Erbe. Wenn Sie die Perl- Skripte Ihrer Vorgänger nicht mögen , sympathisiere ich, aber ich denke nicht, dass es Vermächtnis ist. Ich habe kürzlich ein 15 Jahre altes Perl-Skript modernisiert, das mit einer veralteten Sybase- Datenbank verbunden war. Das war ein Kinderspiel, verglichen mit der kleinsten Änderung an unserem fürchterlichen COBOL- Abrechnungssystem.
quelle
In seinem Buch Effective Working with Legacy Code definiert Michael Feathers Legacy Code als Code, der nicht in Komponententests behandelt wird. Das ist eine Definition, der ich zustimme. Ich sehe auch Legacy-Code als alt, aber immer noch verwendbar.
quelle
Technisch gesehen ist Legacy jeder Code, der fertig geschrieben ist. Sobald es in Produktion ist, ist es ein Vermächtnis. Da es dort bereits einen Wert gibt, kann man ihn nicht einfach wegwerfen ... Man muss sich damit befassen.
Es ist "vor deiner Zeit", aber "immer noch deine Kopfschmerzen" .
quelle
Legacy-Code ist Code, der nur in der Codebasis verbleibt, da sonst viele Dinge nicht mehr funktionieren. Mit anderen Worten: Es ist nur ein Grund für die Abwärtskompatibilität.
Sie möchten es lieber ändern oder sogar wegwerfen, können es aber nicht, weil Sie den gesamten Code unter Berufung darauf brechen werden (das könnte Code sein, den Sie nicht entsprechend anpassen können). Deshalb müssen Sie es behalten (und manchmal sogar warten), aber Sie möchten, dass kein neuer Code dagegen geschrieben wird.
Ein Beispiel sind veraltete Methoden der API einer Bibliothek. Sie sind immer noch vorhanden, sodass jeder, der die Bibliothek aktualisiert, weiterhin sein Projekt erstellen kann, sie jedoch als veraltet markiert sind und Sie vom Compiler gewarnt werden sollten.
Ein weiteres Beispiel sind all die seltsamen Tricks, die Microsoft unternimmt, um Programme zum Laufen zu bringen, die für Versionen ihres Betriebssystems geschrieben wurden, die vollständig veraltet sind. Der Höhepunkt dieses Wesens:
quelle
Vermächtnis beinhaltet Vererbung. Legacy-Code ist einfach Code, den Sie aus der Vergangenheit erben. Es ist Legacy-Code, auch wenn Sie ihn zuvor selbst geschrieben haben!
Alle anderen Überlegungen beruhen im Wesentlichen darauf, dass Sie es nicht speziell für Ihr aktuelles Projekt geschrieben haben. Es ist nicht unbedingt eine schlechte Sache an sich.
quelle
Meiner Meinung nach hängt das, was als Legacy-Code gilt, von mehreren Dingen ab, und das Tag "Legacy" ist wahrscheinlich organisationsspezifisch.
Wenn die Hardware / das Betriebssystem, auf der / dem es ausgeführt wird, veraltet ist und vom Hersteller eingestellt wurde - Strike 1.
Wenn es mehr Arbeit ist, es zu reparieren, als es neu zu schreiben, aus irgendeinem Grund, weil
um das zu tun
Strike 2.
Ein Zusammenschluss mehrerer Organisationen zu einer - Strike 3 - Seite wird wahrscheinlich als Vermächtnis eingestuft.
Gibt es eine bessere, billigere Alternative, die als Drittanbieteranwendung und / oder -service verkauft wird - strike 4.
Ist die Organisation so etwas wie ein Krankenhaus oder ein Schulbezirk, in dem im täglichen Betrieb Beständigkeit über neue Technologien steht? Es dauert länger, bis eine Anwendung als Legacy betrachtet wird, als dieselbe Anwendung in einer kommerziellen / wettbewerbsorientierten Organisation.
Wenn das Unternehmen ein kleines Entwicklungsunternehmen ist, das die Anwendung ständig erweitert / unterstützt, um die Anforderungen der Kunden zu erfüllen, wird dies als Legacy-Code oder nur als "alter" Code betrachtet. Ich kenne eine Firma namens Mc2Ok - sie haben die Software auf Windows 3.1 entwickelt und sie einfach weiterentwickelt. Es sieht immer noch sehr gut aus wie Windows 3.1, aber es wurde auch ein Webinterface hinzugefügt. Es ist ein Zwei-Mann-Entwicklerunternehmen (meine Vermutung), und ich würde sagen, wenn sie aufhören, daran zu arbeiten, wird es als Vermächtnis betrachtet und es wird Zeit, ein oder zwei Jahre später zu migrieren, wenn sie es verwenden. Aber das könnten noch 10 oder mehr Jahre sein.
Manchmal, wenn sich das Management ändert, kann es sich in Wellen ändern, die viele Trickle-Effekte haben. Abhängig von der Schlagkraft des neuen Managements kann es viele Anwendungen wiedergeben, die ansonsten möglicherweise in Ordnung wären.
Ich glaube, jede Organisation muss definieren, was "Legacy-Code" für sie bedeutet. Ich habe jede Woche in den Kleinanzeigen der Sunday Times nachgeschlagen, wonach Organisationen gesucht haben. Das war früher mein Barometer für das, was nicht mehr relevant war (dh das Erbe). Nun, die Sunday Times ist nicht mehr relevant :-) Und wir können verallgemeinern, dass COBOL ein Vermächtnis ist, ASP Classic ein Vermächtnis usw. Aber ich glaube, dass jede Organisation entscheiden muss, wann eine Anwendung als Vermächtnis dafür betrachtet wird.
quelle
Code ist ein Erbe, wenn man Angst hat, ihn zu ändern, weil er ihn brechen könnte. Es ist noch schmerzhafter, wenn das gesamte System durch Änderungen an diesem Code zerstört wird.
Deshalb stimme ich auch der Definition von Michael Feathers zu. Code, der gute Unit-Tests hat, kann furchtlos geändert werden.
Ich denke auch, dass Legacy-Code nichts damit zu tun hat, wie alt er ist. Man kann von Anfang an Legacy-Code schreiben.
quelle