Legacy-Code modernisieren ohne Produktionsausfall

Veraltete Steuerungssoftware ist ein Sicherheitsrisiko. Unsere Strategie für schrittweise Modernisierung ohne Unterbrechung.

Legacy-Code modernisieren ohne Produktionsausfall

Legacy-Code ist in der Industrie allgegenwärtig. Steuerungssysteme, die seit zwanzig Jahren im Einsatz sind, Kommunikationsprotokolle auf proprietären Schnittstellen und Softwarearchitekturen, die niemand mehr vollständig überblickt – das ist die Realität in vielen produzierenden Betrieben. Die Herausforderung liegt nicht im Erkennen des Problems, sondern im kontrollierten Umgang damit: Wie modernisiert man kritische Systeme, ohne den laufenden Betrieb zu gefährden?

Der erste Schritt ist eine ehrliche Bestandsaufnahme. Welche Module sind wirklich kritisch? Welche Teile des Systems sind gut dokumentiert, welche nicht? Und vor allem: Wo liegen die tatsächlichen Risiken – nicht nur technisch, sondern auch betrieblich? Auf Basis dieser Analyse lässt sich ein Modernisierungsplan entwickeln, der klare Prioritäten setzt und machbare Etappenziele definiert.

Bewährt hat sich ein modularer Ansatz: Statt das gesamte System auf einmal zu ersetzen, werden einzelne Komponenten schrittweise migriert. Neue Module kommunizieren über definierte Schnittstellen mit dem Altsystem, bis dieses vollständig abgelöst ist. Das reduziert das Risiko erheblich – und ermöglicht es, jeden Schritt zu testen, bevor der nächste erfolgt.

Zwei Ingenieure erfassen den Zustand einer bestehenden Maschinensteuerung vor der Legacy-Modernisierung

Ein zentrales Werkzeug bei der Legacy-Migration ist das Strangler-Fig-Pattern: Die neue Implementierung wächst um das Altsystem herum, übernimmt nach und nach dessen Funktionen und ersetzt es am Ende vollständig – ohne dass das System jemals komplett abgeschaltet werden muss. Dieses Muster hat sich besonders in eingebetteten Umgebungen bewährt, wo Ausfallzeiten schlicht nicht akzeptabel sind.

Entscheidend ist dabei die Schnittstellenstrategie. Jede Schnittstelle zwischen altem und neuem Code muss sauber definiert und versioniert sein. Automatisierte Tests, die das Verhalten der Schnittstellen kontinuierlich prüfen, sind unverzichtbar. Nur so lässt sich sicherstellen, dass eine Änderung im neuen Modul nicht unbemerkt Auswirkungen auf das Altsystem hat.

Moderne Toolchains bieten hier gute Unterstützung: Statische Analysetools helfen, versteckte Abhängigkeiten im Legacy-Code zu identifizieren. Code-Coverage-Werkzeuge zeigen, welche Teile überhaupt durch Tests abgedeckt sind. Und CI/CD-Pipelines sorgen dafür, dass jede Änderung automatisch validiert wird, bevor sie in die Produktion gelangt.

Infografik: Strangler-Fig-Pattern in vier Etappen, das neue System löst das Altsystem schrittweise ab

Besondere Aufmerksamkeit verdienen Echtzeitanforderungen. Viele Legacy-Systeme in der Industrie basieren auf RTOS-Lösungen oder Bare-Metal-Implementierungen mit handoptimierten Interrupt-Routinen. Wer diese migriert, muss sicherstellen, dass die Timing-Charakteristik erhalten bleibt – oder bewusst verändert und neu validiert wird.

Praktisch bedeutet das: Bereits vor der Migration müssen alle relevanten Timing-Parameter gemessen und dokumentiert werden. Interrupt-Latenzen, Task-Zykluszeiten, Kommunikationsverzögerungen – all das wird zur Baseline, gegen die die neue Implementierung später gemessen wird. Abweichungen müssen erklärt und bewertet werden, nicht einfach akzeptiert.

In einem konkreten Projekt migrierten wir einen Motorcontroller, dessen Interrupt-Service-Routine über zehn Jahre gewachsen war und keinerlei Dokumentation mehr besaß. Der Schlüssel war, zuerst ein vollständiges Verhaltensmodell aus dem bestehenden Code abzuleiten – durch Messung, nicht durch Interpretation – und dieses Modell dann als Spezifikation für die Neuimplementierung zu verwenden.

Oszilloskop-Messung der Interrupt-Latenz an einem Motorcontroller vor der Migration der Steuerungssoftware

Legacy-Modernisierung ist kein einmaliges Projekt, sondern ein kontinuierlicher Prozess. Wer heute ein System modernisiert, muss gleichzeitig sicherstellen, dass die neue Architektur wartbar bleibt und spätere Änderungen nicht wieder in die gleiche Sackgasse führen. Das bedeutet: Dokumentation von Anfang an, konsequente Modularisierung und klare Verantwortlichkeiten im Code.

Ein oft unterschätzter Faktor ist das Wissen der Menschen, die mit dem Legacy-System gearbeitet haben. Dieses implizite Wissen – über undokumentierte Eigenheiten, über Randbedingungen, die nie in einer Spezifikation standen – muss systematisch erfasst werden, bevor es verloren geht. Workshops mit erfahrenen Entwicklern und Inbetriebnahme-Ingenieuren sind hier genauso wertvoll wie die technische Analyse des Codes selbst.

Das Fazit ist pragmatisch: Legacy-Code lässt sich modernisieren, ohne den Betrieb zu gefährden – wenn man methodisch vorgeht, die richtigen Prioritäten setzt und das Risikomanagement ernst nimmt. Der Aufwand lohnt sich: Ein modernisiertes System ist wartbarer, erweiterbarer und bildet die Grundlage für die nächste Generation industrieller Automatisierung.

Firmware-Projekt geplant?
Wir steigen auch in laufende Systeme ein — direkt mit dem Ingenieur, kein Pitch.
Beratung anfragen →
FAQ zum Artikel

Häufige Fragen.

Was ist Legacy-Code und ab wann wird er zum Risiko?

+

Legacy-Code ist gewachsene Software, die weiter produktiv läuft, aber kaum noch dokumentiert, getestet oder von aktiven Entwicklern vollständig verstanden wird. Zum Risiko wird er in dem Moment, in dem niemand mehr sicher sagen kann, welche Nebenwirkung eine Änderung hat. Typische Warnsignale sind fehlende automatisierte Tests, proprietäre Schnittstellen und Wissen, das nur bei einzelnen Personen liegt.

Wie lässt sich ein Legacy-System modernisieren, ohne die Produktion anzuhalten?

+
In Etappen statt im großen Wurf. Am Anfang steht eine Bestandsaufnahme: Welche Module sind wirklich kritisch, wo liegen die technischen und betrieblichen Risiken? Danach werden einzelne Komponenten migriert, die über klar definierte und versionierte Schnittstellen mit dem Altsystem kommunizieren. Jede Etappe wird automatisiert getestet, bevor die nächste startet. So bleibt die Anlage durchgehend lauffähig.

Was ist das Strangler-Fig-Pattern?

+
Ein Migrationsmuster, bei dem die neue Implementierung um das Altsystem herum wächst, dessen Funktionen nach und nach übernimmt und es am Ende vollständig ablöst. Der Vorteil liegt darin, dass das System nie komplett abgeschaltet werden muss. Gerade in eingebetteten Umgebungen mit hohen Verfügbarkeitsanforderungen ist das der pragmatischste Weg.

Refactoring oder Neuentwicklung: Was ist bei alter Steuerungssoftware sinnvoller?

+
Das entscheidet der Zustand der Architektur, nicht das Alter des Codes. Ist die Struktur grundsätzlich tragfähig, ist schrittweises Refactoring meist günstiger und risikoärmer. Eine Neuentwicklung lohnt sich, wenn Hardware, Echtzeitverhalten oder Sicherheitsanforderungen ohnehin neu spezifiziert werden müssen. In beiden Fällen gilt: Timing-Parameter wie Interrupt-Latenzen und Zykluszeiten vorher messen und als Baseline dokumentieren.
Alle FAQs ansehen →