Legacy Code
Wissen kompakt: Legacy Code ist ein Synonym für technologisch veralteten, ungenügend dokumentierten, nicht getesteten, unsauber implementierten oder “geerbten” Quellcode.
Legacy Code – ein Erbe mit Nachteilen
Das Wort Legacy bedeutet ins Deutsche übersetzt: Erbe. Bei Legacy Code handelt es sich also um “geerbten”, von anderen Entwicklern (oftmals vor längerer Zeit) programmierten Code. Da die Weiterentwicklung von Quellcode anderer Programmierer an sich nichts ungewöhnliches ist, wird unter dem Ausdruck aber auch
- unsauberer,
- schlecht dokumentierter,
- technologisch veralteter,
- schlecht designter und/oder
- nicht getesteter Code
verstanden. Es handelt sich also um ein Erbe mit zahlreichen Nachteilen.
Einen besonderen Fokus auf fehlende Tests legt Michael Feathers in seinem Buch Working Effectively with Legacy Code¹:
“Code without tests is bad code. It doesn’t matter how well written it is; it doesn’t matter how pretty or object-oriented or well-encapsulated it is. With tests, we can change the behavior of our code quickly and verifiably. Without them, we really don’t know if our code is getting better or worse”.
Frei ins Deutsche übersetzt:
“Code ohne Tests ist schlechter Code. Es spielt keine Rolle, wie gut er geschrieben ist; es es spielt keine Rolle, wie hübsch oder objektorientiert oder gut gekapselt er ist. Mit Tests können wir das Verhalten unseres Codes schnell und überprüfbar ändern. Ohne wissen wir wirklich nicht, ob unser Code besser oder schlechter wird.
Die Clean Code Developer Initiative versteht unter Legacy Code Quellcode, der “nicht nach den Regeln der Kunst erstellt wurde, bei dem typischerweise automatisierte Tests fehlen und wichtige Prinzipien wie DRY – Don’t Repeat Yourself – oder SRP – Single Responsibility Principle – nicht beachtet wurden”.²
Woran erkennen Sie Legacy Code?
Nur weil eine Software vor einigen Jahren programmiert wurde, muss ihre Codebasis nicht automatisch veraltet sein. Woran lässt sich also Legacy Code – manchmal auch despektierlich als Alt-Code bezeichnet – erkennen? Einige Indikatoren helfen bei der Beantwortung:
- Der Code wird nicht mehr von den ursprünglichen Entwicklern instandgehalten oder gepflegt.
- Der Code wurde für ein abgekündigtes oder nicht mehr unterstütztes Betriebssystem implementiert.
- Der Code wurde in einer inzwischen veralteten Programmiersprache oder für eine nicht mehr nachgefragte Plattform implementiert.
- Der Code lässt sich nicht mehr und nur mit viel Aufwand verändern. Er ist schwer zu verstehen, nachzuvollziehen oder zu erweitern.
- Für den Code gibt es keine automatisierten Tests und keine (aktuelle) Dokumentation.
Clean Code und Refactoring als Antworten auf Legacy Code
Das Hauptziel der Softwareentwicklung ist es, mit wenig Aufwand nützliche Software zu erstellen.³ Software sollte für andere Softwareentwickler lesbar, änderbar, erweiterbar und wartbar sein. Es geht um
- Wandelbarkeit,
- Korrektheit,
- Produktionseffizienz und
- kontinuierliche Verbesserung.
Dieses Fundament an Werten ist die Grundlage für die Entwicklung von Clean Code. Und Clean Code ist eine mögliche Antwort auf Technische Schulden und Legacy Code, denn er hilft beim Entwurf, der Programmierung und dem automatisierten Testen von neuem Code.
Eine weitere Antwort ist Refactoring. Refactoring bezeichnet die Restrukturierung einer Software unter Beibehaltung des Funktionsangebots, mit dem Ziel die Performance der Software zu steigern und die Weiterentwicklung zu erleichtern. Es hilft dabei, die Lesbarkeit des Codes zu verbessern, Klassen und Methoden zu extrahieren, Parameter einzuführen, Abhängigkeiten zu reduzieren und die Testbarkeit zu verbessern. Schritt für Schritt wird so die Qualität des Legacy Codes erhöht.
Generell ergibt es natürlich Sinn,
- Code Reviews durchzuführen,
- per Dokumentenanalyse Informationen über Anforderungen, Schnittstellen, Architektur etc. zu finden,
- bei Anpassungen nicht zu viele Änderungen auf einmal durchzuführen,
- Code nur umzuschreiben, wenn es sinnvoll ist (einerseits ist ein Umschreiben naheliegend, andererseits kann er dazu führen, dass Funktionen unbeabsichtigt überschrieben und so neue Fehler implementiert werden),
- und sich mit den Entwicklern auszutauschen, die früher den Code programmiert haben, oder die Erfahrung im Umgang mit Legacy Code haben.
Wenn es schwierig ist, eine Software vollkommen unabhängig von ihrer Umgebung zu implementieren, ist es dann überhaupt möglich, Legacy Code zu vermeiden?
Hinweise:
Haben Sie Lust auf einen neuen Lieblings-Newsletter?
Die Inhalte auf dieser Seite dürfen Sie gerne teilen oder verlinken.
Interessanterweise wird die Legacy als Ausdruck fernab der Softwareentwicklung eher positiv als negativ betrachtet. “That’s my legacy” ist bspw. ein Ausruf voller Stolz auf das Erreichte und die Hinterlassenschaft an nachfolgende Generationen.
[1] Michael C. Feathers: Working Effectively with Legacy Code
[2] Durch Refactoring von Legacy Code zu Clean Code
[3] Ziele der Softwareentwicklung
Hier finden Sie einen englischsprachigen Podcast, in dem verschiedene Ebenen von Legacy Code und wirksame Strategien für den Umgang mit Altsoftware gesprochen werden.
Und hier finden Sie ergänzende Informationen aus unserer Rubrik Wissen kompakt: