Systeme neu geschrieben
Softwaremodernisierung: VB6, Delphi, PHP und ColdFusion nach Go
PHP 5.6, VB6, Delphi, ColdFusion, Classic ASP, Perl, Oracle Forms, ein Java-Monolith auf einem Server, den niemand neu zu starten wagt. Wir schreiben sie Modul für Modul nach Go, Rust und TypeScript um, während das alte System weiter den Produktivbetrieb trägt, und ein Paritätsprüfstand vergleicht alt gegen neu auf Ihrem eigenen aufgezeichneten Verkehr. Dreißig Tage für ein System von rund einer Million Zeilen, in Phasen, nach denen Sie aufhören können.
30 Tage für rund eine Million Zeilen, aufgeteilt in Phasen
Die Klartext-Ablage ist durchgestrichen, weil ein Teil jedes Legacy-Systems gelöscht statt portiert wird, und das ist meist die billigste Arbeit im Projekt.
Heute
Vier Laufzeitumgebungen, zwei davon ohne Support, und eine Dateiablage, die keiner ansehen will.
- app.phpPHP 5.6
- legacy.dllVB6
- reports.cfmColdFusion
- crystal reportsunsupported
- ftp-dropplaintext
Nach der Umstellung
Go für Kern und Auswertung, TypeScript vorne, eine Übergabe, die unterschrieben ist.
- coreGo
- reportingGo · read replica
- webTypeScript
- transferSFTP · signed
30 Tage für rund eine Million Zeilen, aufgeteilt in Phasen
Wie die Arbeit läuft
- 01Tag 1–4
Kartieren
Aufrufgraph, geplante Jobs, externe Schnittstellen und eine gemessene Liste dessen, was tot ist. Schätzungen gehen schief, weil jemand Zeilen gezählt hat, statt herauszufinden, welche davon noch ausgeführt werden.
- 02Tag 3–9
Die Naht einziehen
Eine Grenze, durch die der Verkehr läuft, damit alte und neue Implementierung nebeneinander laufen und verglichen werden können. Für Benutzer ändert sich in diesem Schritt nichts.
- 03der Großteil des Projekts
Modul für Modul portieren
Jedes Modul geht hinter die Naht, wird gegen aufgezeichneten Produktivverkehr abgespielt und nimmt echten Verkehr, sobald die Ausgaben übereinstimmen. Fehler eingeschlossen, denn welche davon behoben werden, ist ein eigenes Gespräch mit dem Fachbereich.
- 043–7 Tage je Teilsystem
Abschalten
Alter Code gelöscht, Lizenzen gekündigt, Server aus. Eine Migration, die das alte System laufen lässt, hat verdoppelt, was Sie pflegen, statt fertig zu werden.
Was die Plattform macht, was ein Mensch macht
| Was die Plattform macht, was ein Mensch macht | Wer macht was | Anmerkungen |
|---|---|---|
| Die ganze Codebasis lesen und den Aufrufgraphen bauen | Plattform | Auch den Dialekt, den niemand unterstützt, und die Datei, die seit 2009 generiert wird. |
| Toten Code finden | Plattform | Statische Erreichbarkeit, dazu Produktiv-Traces, wenn Sie uns einen Zeitraum davon geben können. |
| Ein Modul übersetzen | Plattform | Der erste Durchgang ist Maschinenausgabe, wird als Pull Request geprüft und von Hand neu geschrieben, wo ein Prüfer ihm nicht folgen kann. |
| Entscheiden, was Fehler ist und was Regel | Entwickler | Das System rundet seit zwölf Jahren gleich, und jemand weiter hinten hat darauf gebaut. |
| Der Paritätsprüfstand | Gemeinsam | Aufzeichnen und Abspielen sind unsere Arbeit. Welche Abweichungen zulässig sind, unterschreibt Ihre Seite. |
| Datenmigration und Abgleich | Gemeinsam | Die Zeilen, die in der alten Datenbank nie aufgingen, gehen in der neuen auch nicht auf. |
| Umstellung und Rückweg | Entwickler | Termine, Bereitschaft und der Punkt, an dem wir uns einig sind zurückzugehen. |
Was wir schon umgezogen haben
Dutzende Migrationen und über zehn Jahre in Legacy-Code. VB6- und Delphi-Clients in den Browser, Classic ASP und ColdFusion nach Go, PHP-4- und PHP-5-Monolithen in typisierte Services, Perl-Cronjobs und PL/SQL-Pakete in Services mit Tests darauf, Oracle Forms ins Web, Java aus der Zeit vor Maven in etwas, das ein neuer Kollege am ersten Morgen bauen kann. Ihren Dialekt haben unsere Entwickler schon getroffen, auch die Teile davon, die nie jemand aufgeschrieben hat.
Die erste Phase ist klein genug, um eine Prüfung von uns zu sein: ein Modul durch die Naht, gegen Ihren eigenen Verkehr abgespielt, mit dem Abweichungsbericht vor Ihnen. Sie sehen unsere Arbeitsweise zum Preis einer Phase statt zum Preis eines Jahres.
Fragen, die Entwickler uns stellen
- Können wir während des Neuschreibens weiter Features liefern?
- Ja, und das ist der Hauptgrund, warum es länger dauert als ein Neubau auf der grünen Wiese. Feature-Arbeit geht in die alten Module, bis jedes portiert ist, und der Paritätsprüfstand fängt die, die sich unter uns geändert haben.
- Warum nicht refaktorieren, was wir haben?
- Manchmal ist das die richtige Antwort, und Sie hören sie im ersten Gespräch. Für ein Neuschreiben spricht es, wenn die Laufzeitumgebung aus dem Support ist, die Toolchain nur auf einer Maschine existiert oder Sie niemanden mehr einstellen können, der das anfasst. Wir machen beide Arten von Arbeit, die Antwort ist also keine Verkaufsposition.
- Was, wenn wir auf halber Strecke aufhören?
- Dann bleibt ein System, das zum Teil Go ist und zum Teil das, was Sie hatten, mit einer dokumentierten Grenze dazwischen. In diesem Zustand kann man leben, und manche Kunden sitzen dort ein Jahr, bis Budget frei wird.
- Erzeugt maschinelle Übersetzung Code, den wir annehmen würden?
- Zeile für Zeile übersetzt nicht, deshalb liefern wir das nicht aus. Jedes Modul wird in idiomatischem Go neu erzeugt, wie jeder Pull Request geprüft und von Hand umgeschrieben, wenn der Prüfer ihm nicht folgen kann. Sie dürfen das erste Modul selbst prüfen, bevor wir weitermachen.
- Wie schätzen Sie das?
- Aus gemessenen Modulgrößen, Kopplung und dem Anteil des erreichbaren Codes. Die Analyse gibt Ihnen in drei bis fünf Tagen eine Spanne, einen Phasenplan und Preise dazu.
Fangen Sie mit einem Modul an
Eine grobe Beschreibung reicht für den Anfang: was das System ist, wie groß und was den Termin erzwingt. Zurück kommt ein Phasenplan, und die erste Phase ist klein genug, um sie ohne Gremium freizugeben.
Zehn Minuten, wenn Sie die Antworten parat haben. Sie können es abschicken, bevor Sie irgendetwas entschieden haben.