Legacy Code: So gehen Sie optimal mit Altcode um
Der Quellcode ist das Herzstück einer Software. Ob das Programm in gewünschter Weise funktioniert und welche Funktionen möglich sind, hängt von den Anweisungen und Befehlen ab, die in diesem Code verzeichnet sind. Programmierer bearbeiten, warten und pflegen diesen Code regelmäßig, um Nutzern die bestmögliche Usability zu bieten. Jede Veränderung am Code kann mitunter Software-Fehler nach sich ziehen oder die Lauffähigkeit des Programms gefährden.
Für Entwickler und Programmierer sind die Wartung und das Updaten von Software immer dann besonders problematisch, wenn sie mit Codes arbeiten müssen, die sie nicht selbst geschrieben haben oder die für ältere, nicht länger unterstützte Betriebssysteme in ebenso alten Versionen der zugrundeliegenden Programmiersprache geschrieben wurden. Was genau hinter solchem Legacy Code steckt und wie am besten damit umzugehen ist, erfahren Sie hier.
Definition von Legacy Code
Der Begriff „Legacy Code“ wird in der Software-Technik verwendet und bedeutet übersetzt so viel wie „Altcode“. Dabei handelt es sich um älteren Code, der in der Regel nicht mehr aktiv weiterentwickelt wird. Legacy Code ist in gewisser Weise das Gegenstück zum „Clean Code“, der intuitiv verständlich, besonders wartungsfreundlich und leicht anpassbar ist. Legacy Code ist sperriger, überholter und unaufgeräumter Code, der zu zahlreichen Problemen führen kann. Was genau der Begriff meint, hängt stark von der Sicht des Entwicklers und der jeweiligen Situation ab. Prinzipiell zeichnet sich Legacy Code aber durch folgende Aspekte aus:
- Der Code wird nicht mehr vom ursprünglichen Entwickler instandgehalten.
- Der Code wurde ursprünglich für nicht mehr unterstützte Betriebssysteme geschrieben.
- Der Code lässt sich nicht automatisiert auf Bugs testen.
Was sind die Nachteile von Legacy Code?
Warum wird Legacy Code überhaupt verwendet, wenn er doch eine ganze Reihe von Nachteilen mit sich bringt? Ganz einfach aus dem Grund, dass er sich nicht immer vermeiden lässt: Es kommt häufig vor, dass im Laufe eines Projekts ein neuer Programmierer die Instandhaltung und Weiterentwicklung des Codes übernimmt. Während der ursprüngliche Entwickler den Code wohl in den meisten Fällen intuitiv verstanden hat, müssen sich neue Team-Mitglieder dieses Verständnis erst erarbeiten. Dabei kann es vorkommen, dass Teile des Codes übergangen werden oder nicht komplett verstanden werden.
Wenn ein Code über viele Jahre von vielen verschiedenen Programmierern gepflegt, verbessert und anderweitig bearbeitet wird, kann aus dem Code im Laufe der Zeit ein Flickenteppich werden, der immer schwerer zu verstehen und zu verändern ist. Das Problem dabei: Ab einem gewissen Punkt können nötige Aktualisierungen oder Veränderungen nicht durchgeführt werden, wenn der Code und seine Auswirkung von niemanden mehr verstanden werden.
Ein weiterer Nachteil von Legacy Code: Regressionstests, also automatisierte Tests, lassen sich aufgrund der zu sperrigen, unhandlichen und flickenhaften Programmierung nicht durchführen. Entwickler, die es mit Altcode zu tun bekommen, haben also einen wesentlich höheren manuellen Prüfungsaufwand. Fehler sind schwieriger zu beheben, Updates komplizierter umzusetzen.
Refactoring: Die passende Antwort auf Legacy Code
Legacy Code ist etwas, mit dem sich Entwickler aus verschiedenen Gründen nur ungern beschäftigen. Eines der größten Probleme ist dabei der Fakt, dass sich der Code nicht automatisiert auf Bugs bzw. Fehler testen lässt. Was können Entwickler also tun, wenn sie im Zuge eines neuen Projekts plötzlich mit Legacy Code konfrontiert sind?
Die wohl beste Antwort lautet: Refactoring (dt. „Restrukturierung“). Bei diesem Entwicklungsansatz wird Code neu strukturiert, ohne seine ursprüngliche Funktion zu verändern. Bevor aber die tatsächliche Restrukturierung passiert, müssen Programmierer erst verstanden haben, wofür die einzelnen Code-Bestandteile verantwortlich sind. Außerdem müssen sämtliche Funktionen durch Tests abgesichert werden.
Erst wenn klar ist, wie der Code funktioniert, geht es an das tatsächliche Refactoring. Dabei wird der Code Stück für Stück optimiert. Überflüssige Codierungen werden entfernt oder umgeschrieben, Code-Klassen und Variablen vereinfacht und zusammengeführt, Befehlsmethoden angepasst und umgeschrieben. Letztlich kommt das Refactoring einer Generalüberholung des Legacy Codes gleich. Im Ergebnis steht ein Code, der leichter zu verstehen, einfacher zu pflegen und schneller anzupassen ist.