Zum Inhalt springen
Maximilian Vogl – zur Startseite
Kontakt

Leistung

Legacy-Modernisierung

Legacy-Modernisierung bedeutet, eine bestehende Anwendung in überschaubaren Etappen auf einen aktuellen technischen Stand zu bringen, während sie weiter produktiv genutzt wird.

Der Ausgangspunkt ist fast immer derselbe. Es gibt eine Anwendung, die seit Jahren läuft und Geld verdient. Der ursprüngliche Entwickler ist längst weg. Niemand traut sich mehr an den Code, weil unklar ist, was beim Anfassen kaputtgeht. Sicherheitsupdates bleiben liegen, weil die PHP-Version nicht mehr unterstützt wird.

Der naheliegende Reflex ist der Neubau. Der ist in den meisten Fällen die teuerste und riskanteste Lösung: Er dauert länger als geplant, das alte System muss parallel weiterlaufen, und am Ende fehlen genau die Details, die über Jahre eingebaut wurden und die keiner mehr dokumentiert hat.

Am Anfang steht eine Bestandsaufnahme

Am Anfang steht Lesen. Dafür gibt es die Bestandsaufnahme zum Festpreis. Ich hole das Projekt lokal in einen Docker-Container, bringe es zum Laufen und suche, wo die fachliche Logik tatsächlich liegt. Bei gewachsenen PHP-Anwendungen ist sie selten an einer Stelle versammelt. Üblich sind Controller mit mehreren hundert Zeilen, ein Cronjob-Skript außerhalb des Frameworks, Datenbank-Trigger und gelegentlich eine Stored Procedure, von der niemand mehr weiß, wer sie angelegt hat. Danach bekommen Sie eine schriftliche Einschätzung mit Aufwand und Reihenfolge. Darin steht auch, welche Teile ich anfassen würde und welche man besser in Ruhe lässt, weil sie stabil laufen und niemand sie ändern will.

Tests kommen vor dem ersten Umbau

Jede Änderung an einer Anwendung ohne Testabdeckung ist ein Blindflug. Deshalb ziehe ich zuerst ein Sicherheitsnetz ein, und zwar gezielt an den Stellen, deren Ausfall echtes Geld kostet. Das sind meistens Bestellstrecke, Abrechnung, Anmeldung und die Übergabe von Daten an ein Drittsystem. Dafür eignen sich zu Beginn Tests, die einen kompletten Ablauf gegen eine Kopie der Datenbank durchspielen, von der Bestellung bis zur fertigen Rechnung (Integrationstests mit Pest oder PHPUnit). Tests für einzelne Bauteile kommen später, sobald der Code die dafür nötige Struktur überhaupt hat (Unit-Tests). Parallel dazu läuft die Anwendung in einem Container, damit die Entwicklungsumgebung dieselbe PHP-Version und dieselben Erweiterungen hat wie der Server. Allein dieser Schritt räumt eine ganze Klasse von Fehlern ab, die sonst erst beim Ausrollen auffallen.

Was überschaubare Etappen konkret heißt

Eine Etappe dauert zwei bis vier Wochen und endet mit etwas, das auf dem Produktivsystem stehen kann. Das ist die harte Vorgabe, an der ich den Zuschnitt ausrichte. Wenn Sie nach der dritten Etappe entscheiden, dass es vorerst genug ist, haben Sie ein System, das besser dasteht als vorher, und keine halbfertige Baustelle. Diese Arbeitsweise ist etwas langsamer als ein durchgezogener Umbau. Sie hat dafür den Vorteil, dass es keinen Zeitpunkt gibt, an dem das alte System schon abgeschaltet und das neue noch nicht fertig ist.

Wenn eine Oracle-Datenbank dahintersteht

Im Mittelstand trifft man häufiger auf Oracle, als es die PHP-Welt vermuten lässt. Meist stammt die Entscheidung aus einer Zeit, in der ohnehin schon ein Oracle-System im Haus stand, und sie wird aus gutem Grund nicht angetastet. Für die Modernisierung heißt das: Die Datenbank bleibt, die Anwendung darüber wird erneuert.

Laravel bringt keinen offiziellen Oracle-Treiber mit. Die Anbindung läuft über die PHP-Erweiterung OCI8 und ein Community-Paket, das Query Builder und Eloquent auf Oracle übersetzt. Die praktischen Stolperstellen sind bekannt, wenn man sie einmal gesehen hat. In Datenbanken vor Version 12.2 sind Bezeichner auf 30 Byte begrenzt, bei Umlauten also auf weniger Zeichen, was bei automatisch erzeugten Index- und Fremdschlüsselnamen aus Laravel-Migrationen schnell knapp wird. Oracle behandelt einen leeren String in Textspalten wie NULL, was Prüfungen im Anwendungscode verändert. Vor Version 12.1 gibt es keine Identity-Spalten, Autoinkrement wird über Sequenz und Trigger nachgebaut. Wer diese Punkte kennt, verliert damit wenig Zeit. Wer sie zum ersten Mal trifft, sucht tagelang.

Wann ich vom schrittweisen Vorgehen abrate

Es gibt Fälle, in denen ein Neubau die richtige Entscheidung ist. Wenn sich die fachlichen Anforderungen so weit verschoben haben, dass die alte Datenstruktur nichts davon mehr sinnvoll abbildet, wird jeder Umbauschritt teurer als ein sauberer Neuanfang. Das sage ich Ihnen im Erstgespräch, auch wenn der Auftrag dann anders aussieht als gedacht.

Das übernehme ich nicht

Dafür kenne ich passendere Adressen. Fragen Sie gern.

  • Notfallhilfe bei einem gerade laufenden Ausfall
  • Betrieb und Überwachung Ihrer Server
  • Schulung der Anwender am modernisierten System

Die PHP-Version steigt in Sprüngen

Von 5.6 auf 8.5 liegen mehrere Hauptversionen, jede bringt eigene Brüche mit. In der Entwicklung nehme ich sie einzeln, weil sich Brüche so leichter abarbeiten lassen als alle auf einmal. Auf Ihrem Server landen davon nur zwei Stände, denn jede Umstellung am laufenden System kostet ein eigenes Ausrollen mit eigenem Risiko.

In der Entwicklung bei mir

  1. Ausgangsstand 5.6
  2. 7.4
  3. 8.0, ohne Sicherheitsupdates, aufwendigster Schritt
  4. 8.1, ohne Sicherheitsupdates
  5. 8.2
  6. 8.3
  7. 8.4 oder 8.5

Auf Ihrem Server

  1. 7.4
  2. 8.4 oder 8.5
  • Geht auf Ihrem Server in Betrieb
  • Arbeitsschritt bei mir, geht nie in Betrieb
  • Bekommt keine Sicherheitsupdates mehr
  • Aufwendigster Schritt: Dort wurden die Vergleichsregeln und die Fehlerbehandlung interner Funktionen umgestellt

Den immer gleichen mechanischen Teil schreibt ein Werkzeug automatisch um (Rector), ein zweites durchsucht den Code nach Stellen, die mit den strengeren Typprüfungen kollidieren, ohne ihn auszuführen (PHPStan). Den Rest macht Lesen. Diese Stolpersteine wiederholen sich von Projekt zu Projekt:

  • mysql_*-Aufrufe aus PHP-4-Zeiten
  • Argumente mit falschem Typ, die interne Funktionen ab 8.0 mitTypeError zurückweisen statt mit einer Warnung
  • each() in Schleifen
  • Bibliotheken ohne Update seit 2016, für die ein Ersatz zu finden ist

Was dazugehört

  • Bestandsaufnahme mit ehrlicher Einschätzung, was sich lohnt und was nicht
  • Schrittweise Anhebung der PHP-Version bis auf 8.5
  • Automatisierte Tests dort einziehen, wo bisher keine waren
  • Ablösung veralteter Abhängigkeiten
  • Umgang mit Oracle-Datenbanken im Laravel-Umfeld
  • Aufbau von Docker und automatisierter Auslieferung

Zuletzt aktualisiert am

Nächster Schritt

Passt Legacy-Modernisierung zu Ihrem Vorhaben?

Schildern Sie kurz, was vorhanden ist und was erreicht werden soll. Im Erstgespräch von 20 Minuten klären wir, ob und wie sich das umsetzen lässt. Antwort in der Regel innerhalb eines Werktages.

Weitere Leistungen

  • Webanwendungen

    Von der ersten Idee bis zum Livegang. Die Architektur wähle ich so, dass sie mitwächst, statt nach dem ersten Wachstumsschub im Weg zu stehen.

    Mehr dazu

  • SaaS-Entwicklung

    Mandantenfähige Produkte mit Abrechnung und Rollenverwaltung, die mit der Kundenzahl mitwachsen statt bei Kunde fünfzig zu bremsen.

    Mehr dazu

  • APIs und Schnittstellen

    Systeme miteinander sprechen lassen, auch ältere. Sauber dokumentiert, versioniert und mit Tests abgesichert.

    Mehr dazu