Artikel
Revolutionierung der Anwendungsmodernisierung mit GenAI und AWS

Eine der größten Herausforderungen für Unternehmen in der sich ständig weiterentwickelnden digitalen Landschaft ist Legacy-Software. Trotz des rasanten technologischen Fortschritts ist ein großer Teil des Unternehmenscodes immer noch in Legacy-Sprachen wie COBOL, Fortran und VB6 gespeichert. Diese Legacy-Codebasis stellt eine große Belastung dar: Sie ist nicht nur teuer in der Wartung, sondern behindert auch Innovation, Agilität und Skalierbarkeit.
Herkömmliche Modernisierungsansätze - manuelle Neuformulierungen oder Neuarchitekturen - sind zeitaufwändig, kostspielig und riskant. Allerdings schwappt eine neue Welle der Transformation durch die IT-Welt: Generative KI (GenAI)-gestützte Modernisierung.
Die Definition von Vermächtnis
Die größte Herausforderung besteht darin, zu definieren, was genau "Legacy-Software" oder "Legacy-Code" bedeutet. In zahlreichen Gesprächen mit meinen Kollegen und Kunden wurden verschiedene Eigenschaften von Legacy-Code genannt:
- Legacy bedeutet, dass der Code in einer alten Sprache, einer veralteten Sprachversion oder einem alten Framework geschrieben wurde. Nach dieser Definition ist eine COBOL-, VB6-, PHP 5 oder .NET Windows Forms-Anwendung eine Legacy-Anwendung.
- Legacy bedeutet, dass niemand im Unternehmen den Code versteht. Diese Definition ist einfach: Sobald Sie das Gefühl haben, dass es an Fachwissen fehlt, um die Anwendung effizient zu pflegen, wird sie zur Legacy-Anwendung.
- Legacy bedeutet, dass das Framework oder die Technologie hinter dem Anwendungscode nicht mehr gepflegt wird. In diesem Zusammenhang bedeutet eine veraltete und nicht gewartete Version eines bestimmten Frameworks, dass die Anwendung veraltet ist.
- Legacy bedeutet, dass die allgemeine Benutzerfreundlichkeit, Skalierbarkeit, Verfügbarkeit, Infrastruktur oder allgemeine Attraktivität der Anwendung nicht ausreichend oder nicht vorhanden ist.
- Muster, die in Legacy-Software verwendet werden, könnten vor vielen Jahren gute Praktiken gewesen sein, sind aber heute nicht mehr erwünscht. Zum Beispiel war es vor 25 Jahren eine gute Wahl, die Logik in der Datenbank zu belassen und gespeicherte Prozeduren zu verwenden, aber heute wird dies aus Sicht der Wartbarkeit und Testbarkeit als problematisch angesehen.
Es gibt möglicherweise noch viele weitere Faktoren, die den Code als Legacy definieren, aber selbst diese kurze Liste zeigt, dass hier verschiedene Aspekte entscheidend sein können. So kann beispielsweise COBOL-Code je nach den verwendeten Kriterien als Legacy- oder Nicht-Legacy-Code betrachtet werden.
Die Schmerzpunkte von Altsystemen
Die Modernisierung ist seit langem ein Thema für Unternehmen. Altsysteme bringen eine Menge betrieblicher Ineffizienzen und Geschäftsrisiken mit sich:
- Mangel an qualifizierten Entwicklern für veraltete Sprachen - Sie können keine Legacy-Software pflegen, wenn Sie keine Entwickler haben, die das tun können. Für alte, überholte Technologien will niemand mehr arbeiten.
- Exorbitante Wartungskosten-dashängt mit dem ersten Punkt zusammen. Wenn Sie keine Leute finden, die Ihre Legacy-App pflegen wollen, müssen Sie wahrscheinlich mehr bezahlen. Aber auch, wenn Ihr Produkt erfolgreich ist, müssen Sie Möglicherweise müssen Sie sie skalieren, was bei Legacy-Software aufgrund von Lizenzkosten oder der Unfähigkeit zur horizontalen Skalierung in der Regel teuer ist.
- Engpässe bei Leistung und Skalierbarkeit-Leistungkann aufgrund des internen Softwaredesigns schlecht sein. Bei alten monolithischen Anwendungen ist Skalierbarkeit oft keine Option, und die Verbesserung der Leistungskennzahlen erfordert viel Geld für Geräte und Lizenzen, und Software-Updates.
- Sicherheitsschwachstellen-Wenndie Software alt ist, kann sie auch auf nicht gewarteten Technologien basieren. Das muss natürlich kein Problem sein, ist es aber in der Regel - nicht nur wegen des realen Risikos sondern ganz oft wegen der Einhaltung von Kriterien.
- Anhäufung technischer Schulden-Nun, wenn die Anwendung alt ist, wurde sie wahrscheinlich viele Male aktualisiert und viele neue Funktionen wurden hinzugefügt. Wenn Sie ein Softwareentwickler sind, wissen Sie wahrscheinlich, wie dieser Prozess bei älterer Software aussieht: Fügen wir den neuen Code an der neuen Stelle ein, um nicht etwas zu zerstören, das bereits funktioniert, aber der neue Code ähnelt dem alten, wodurch sich die technischen Schulden erhöhen.
Infolgedessen verlieren Unternehmen viel Zeit damit, technische Schulden zu verwalten, anstatt innovativ zu sein. Veraltete Software, die zwar geschäftskritisch ist, wird zum Engpass, anstatt das Geschäft voranzubringen.
Traditionelle Modernisierung: Langsam und riskant
In der Vergangenheit war die Modernisierung mit einer von drei Hauptstrategien verbunden:
- Rip and Replace - Bauen Sie die Anwendung von Grund auf neu auf. Dies bietet zwar einen Neuanfang, birgt aber das Risiko von Wissensverlust, Kostenüberschreitungen und Ausfallzeiten. Um ehrlich zu sein, ist dies manchmal die einzig mögliche Strategie, z. B. wenn die Altsoftware in der Technologie entwickelt wurde, die Sie aus Ihrer Landschaft entfernen möchten.
- Lift and Shift - Verschieben Sie Anwendungen auf eine neue Infrastruktur oder Plattform, ohne sie neu zu schreiben. Schnell, aber ohne Ineffizienzen und technische Schulden. Lift & Shift kann auch mit einem Modernisierungsprozess in Verbindung gebracht werden, bei dem die Technologie im Rahmen eines einfachen Rewriting-Prozesses geändert wird, bei dem die Architektur und die Codestruktur beibehalten, aber der Tech-Stack geändert wird. In der Regel handelt es sich dabei um eine relativ einfache Art der Modernisierung, aber dieser Prozess beseitigt die technischen Schulden nicht - sie sind immer noch vorhanden, nur in einer anderen Technologie.
- Manuelle Neufassung oder Neuarchitektur - Arbeitsintensiv, risikoreich und oft Monate oder Jahre lang. Es ist ähnlich wie Rip & Replace, konzentriert sich aber in der Regel auf die Beibehaltung des gesamten Anwendungsstapels (Datenbanktechnologie, Datenschichten, Ereignisbus usw.), während die Kernarchitektur der Anwendung neu gestaltet wird.
Jeder dieser Ansätze wird durch eine grundlegende Einschränkung begrenzt: die menschliche Bandbreite. Millionen von Codezeilen zu analysieren, undokumentierte Logik zu verstehen und Funktionen sicher zu migrieren, ist eine äußerst schwierige und riskante Aufgabe. Was wäre, wenn wir dies ein wenig automatisieren könnten?
Enter GenAI: Ein Paradigmenwechsel in der Modernisierung
GenAI - angetrieben von leistungsstarken großen Sprachmodellen (LLMs) - verändert die Software-Modernisierung durch die Einführung intelligenter Automatisierung in jedem Schritt des Prozesses. Anstatt sich allein auf die menschliche Arbeit zu verlassen, unterstützt GenAI die Entwickler durch:
- Skalierbares Verständnis von Codebasen- Waswäre, wenn wir verstehen könnten, worum es bei Legacy-Software wirklich geht, wie sie funktioniert, wo sich die kritischen Komponenten im Code befinden, usw.?
- Extrahieren von nicht vorhandener Dokumentation - Bei Legacy-Anwendungen fehlt in der Regel jegliche Dokumentation. Was wäre, wenn wir sie zurückentwickeln könnten?
- Generierung von Code-Empfehlungen und Vorlagen - GenAImacht es relativ einfach, Modernisierungsempfehlungenund Boilerplate-Code zu generieren. Wir können diese Funktion nutzen, um die langweilige Arbeit zu beschleunigen.
- Code semantisch, nicht nur syntaktisch, umgestaltensteht im Zusammenhang mit dem oben beschriebenen Szenario "Umstrukturierung/manuelle Umschreibung". Diese Prozess ist normalerweise syntaktisch. Wir können GenAI stattdessen für die semantische Migration verwenden.
- Verringerung menschlicher Fehler und des berüchtigten Problems der "leeren Seite"- "der Fluch der leeren Seite"- könnte leicht vermieden werden. Niemand fängt gerne bei Null an, aber GenAI kann helfen beginnen Sie mit etwas Nützlichem.
Durch die Automatisierung der Analyse, Dokumentation und Umwandlung von Legacy-Code verringert GenAI das Projektrisiko, beschleunigt die Lieferzeiten und ermöglicht es menschlichen Teams, sich auf hochwertige Entscheidungen zu konzentrieren. Lassen Sie uns diese Aufgaben explizit aufzählen:
Erste Ermittlungen
Einer der ersten Erfolge von GenAI ist die Beschleunigung der ersten Code-Analyse. Durch die automatische Identifizierung von Frameworks, Abhängigkeiten und verwendeten Technologien minimiert GenAI den Zeitaufwand für die Erkennung und ermöglicht es den Teams, schnell mit der Planung zu beginnen.
Dokumentation Wiederherstellung
Älteren Anwendungen fehlt es oft an Dokumentation. GenAI kann qualitativ hochwertige Dokumentationen erstellen, von Architekturübersichten auf hoher Ebene bis hin zu detaillierten Modulbeschreibungen - für ein besseres Verständnis und reibungslosere Übergänge.
Erkennung von technischer Verschuldung
GenAI kann versteckte technische Schulden aufdecken, indem es schlechte Code-Praktiken, Sicherheitsrisiken und architektonische Engpässe identifiziert und dabei hilft, Prioritäten für die Modernisierung zu setzen.
Strategische Empfehlungen
Durch die Analyse von Altsystemen im Kontext der geschäftlichen Anforderungen kann GenAI Modernisierungsstrategien vorschlagen, die auf Ziele wie Kostensenkung, Skalierbarkeit oder Compliance ausgerichtet sind.
Boilerplate-Code-Generierung
Sich wiederholender grundlegender Code - wie z.B. API-Gerüste, Repositories und Serviceklassen - kann automatisch generiert werden, was den Entwicklern mühsame Aufgaben erspart und die Konsistenz verbessert.
Automatisierte Code-Umwandlung
Ob bei der Migration von einer Legacy-Datenbank, einem Monolithen zu Microservices oder einem Framework zu einem anderen, GenAI kann große Teile des Codes intelligent refaktorisieren und übersetzen und dabei die Semantik erhalten. Natürlich ist dies fast nie perfekt und erfordert menschliches Eingreifen.
Der neue GenAI-gestützte Modernisierungs-Workflow
Wir müssen auch den typischen SDLC ändern, wenn wir mit GenAI modernisieren. Der Prozess muss GenAI-unterstützte Teile und menschliche Validierung beinhalten. So könnte der GenAI-erweiterte Arbeitsablauf aussehen:
- Code-Inventarisierung und -Analyse GenAI kann große Legacy-Codebasen schnell erfassen und verstehen, Abhängigkeiten, Frameworks und Architekturmuster abbilden.
- LLM-gestützte Transformation Große Sprachmodelle schlagen architektonische Verbesserungen, Code-Refactors und Migrationspfade vor. Natürlich können LLMs den Code auch auf eine andere Technologie migrieren.
- Human-in-the-Loop-Validierung Entwickler überprüfen die Empfehlungen, um die Einhaltung der Vorschriften, die Leistung und die kontextuelle Genauigkeit sicherzustellen.
- Testgesteuerte Verifizierung Kontinuierliche Tests stellen die funktionale Parität während und nach der Modernisierung sicher.
- Inkrementelles Deployment Modernisierte Komponenten werden schrittweise integriert und eingesetzt, um Unterbrechungen zu minimieren.
Modernisierung mit AWS
Für die GenAI-gestützte Modernisierung können wir mehrere Tools verwenden, aber lassen Sie uns die von AWS aus einer etwas spezifischen Perspektive betrachten. Einerseits können wir die Leistung von Standardtools wie CursorAI, Copilot, RooCode oder Amazon Q nutzen. Das Problem ist jedoch, dass Sie nicht wirklich kontrollieren können, was diese Tools hinter den Kulissen tun (obwohl sie oft gute Arbeit leisten!).
In der Regel haben solche Tools große Systemaufforderungen mit vielen Leitplanken und Regeln, die Ihnen helfen sollen, schneller und zuverlässiger zu arbeiten. Aber das Ergebnis ist, dass Sie nicht wissen, was sie tun. Sie können die komplexen Abläufe der Agenten nicht kontrollieren. Wenn sie tun, was Sie wollen, ist das großartig! Aber für komplexe Automatisierungsaufgaben sind sie oft nicht ausreichend.
Deshalb könnte es eine gute Idee sein, Cloud-Services zu nutzen und den Prozess auf eine individuelle Weise zu automatisieren. Wir erstellen den Modernisierungs-Workflow mit AWS-Services, mit denen wir experimentieren und automatisieren können. Lassen Sie mich dies anhand eines Beispiels näher erläutern.
Modernisierung eines .NET-Monolithen mit GenAI
Stellen Sie sich eine ASP.NET Web Forms-Anwendung mit 600.000 Zeilen vor, die Bestellungen, Rechnungen und Bestände verwaltet und die folgenden Attribute aufweist:
- Keine Microservices,
- Keine Dokumentation,
- Keine Tests,
- Eng gekoppelte Logik.
Wie kann ich mit der Modernisierung beginnen? Hier finden Sie die Schritte, die wir bei der Migration dieses Codes auf .NET Core befolgt haben.
Code-Ingestion & Analyse: GenAI hat uns geholfen, Webformulare, Geschäftslogik und SQL-Code zu analysieren, Abhängigkeitspläne zu erstellen und Hotspots zu identifizieren. Wir haben dies ohne Dokumentation getan, obwohl das Bild unten es als Eingabe darstellt. Eine Dokumentation wäre sicherlich hilfreich!
Wir haben zunächst Amazon Bedrock-Modelle verwendet, um den Code zu untersuchen, interessante Erkenntnisse zu sammeln und eine Dokumentation der Dateien und Module zu erstellen. Dann wurde die Dokumentation in OpenSearch Serverless mit den entsprechenden Einbettungen gespeichert. Dies hilft bei der Navigation zwischen verschiedenen Teilen des Systems, wenn Sie Beziehungen entdecken, und ermöglicht eine tiefer gehende Analyse der Arbeitsabläufe und internen Abhängigkeiten. Teilweise haben wir auch statische Analysewerkzeuge verwendet, aber sie waren in diesem Prozess nicht entscheidend.

Wissensextraktion und Experimentieren: Am Ende des vorangegangenen Schritts hatten wir eine vollständige und umfassende Dokumentation erhalten und konnten auch den Chatbot nutzen, der über komplexes Wissen über das System und seine Struktur verfügte. Und nun beginnt der interessante Teil: Wir nutzten dieses Wissen und den Legacy-Code, um mit der Modernisierung zu experimentieren.
Typischerweise sieht das folgendermaßen aus:
- Nehmen Sie den alten Code,
- Nehmen Sie die Beschreibung,
- Bereiten Sie das Muster vor (wie soll der neue Code aussehen?),
- Antrag auf automatische Migration.
Und wiederholen Sie den Vorgang, wenn die Ergebnisse nicht zufriedenstellend sind. In der Regel liegt das Problem in Ihrer Eingabeaufforderung oder in Ihren Automatisierungsschritten. Wenn Sie z.B. die neuen Dateien konsistent generieren möchten, müssen Sie wahrscheinlich die bereits generierten Dateien in einen Kontext setzen, damit LLM weiß, wie die Namenskonvention lautet oder welche Funktionen bereits implementiert wurden. Hier gibt es eine Menge Experimente zu machen!
Die Experimente werden in der Regel in Jupyter Notebooks durchgeführt, und in unserem Fall war es AWS SageMaker AI, um die Zusammenarbeit im Team zu ermöglichen. Nach der Experimentierphase haben wir den gesamten automatisierten Workflow als eine Reihe von Workern implementiert, die auf Amazon ECS eingesetzt werden, um Hunderte von Dateien zu verarbeiten.

Transformation: Jetzt geht der Prozess erst richtig los. Wir können nun jeden Teil der Legacy-Anwendung mit voller Kontrolle über den Workflow migrieren. Im Wesentlichen wollten wir in diesem Beispiel zu Blazor migrieren, was eine Zerlegung des Frontends vom Backend erforderte, und dieser architektonische Schritt wurde von den Entwicklern überwacht und teilweise umgesetzt. In der Tat ist die GenAI-gestützte Modernisierung keine Zauberkiste, in die Sie den alten Code stecken und den modernisierten abrufen. Nein, es ist eine Menge manueller Aufwand erforderlich, aber GenAI vereinfacht und beschleunigt den Prozess erheblich. Wir haben die Automatisierungstools (die in den vorherigen Schritten vorbereitet wurden) verwendet, um:
- Migrieren Sie das Frontend zu Blazor.
- Konvertieren Sie ADO.NET-Aufrufe in Entity Framework.
- Ersetzen der nativen SQL-Aufrufe durch das Repository-Muster.
- Automatische Generierung von DTOs, Basis-Controllern, Swagger-Dokumentation und Tests.

Human-in-the-Loop-Überprüfung: Dies ist von entscheidender Bedeutung. Die Entwickler müssen den Code überprüfen und korrigieren - er ist nie ganz genau, und manchmal ist er sogar nicht kompilierbar. Wir können dann Standardtools verwenden, um die Ergebnisse zu verfeinern, Fehler zu beheben und zusätzliche Tests zu erstellen.
Das Ergebnis? Eine skalierbare, wartbare Architektur mit klarer Dokumentation und Testabdeckung - und das in einem Bruchteil der herkömmlichen Zeit. Was der "Bruchteil" bedeutet, hängt von der jeweiligen Technologie ab. In diesem Fall haben wir nicht nur viel Zeit gespart, sondern auch die Frustration der Teams vermieden, die gezwungen waren, einen mühsamen Prozess der Migration von Komponenten nach dem anderen zu lesen und durchzuführen.
Szenarien der realen Welt
Wir haben eine ganze Reihe interessanter Experimente, Proof-of-Concepts und echter, funktionierender Migrationen mit dem oben beschriebenen Ansatz durchgeführt. Hier ein paar Beispiele:
- Generierung von Unit-Tests für ein komplexes PHP-basiertes System auf der Grundlage einer Microservices-Architektur. Wir haben den Pattern-Matching-Ansatz verwendet, d.h. wir verwenden bereits erstellte Unit-Tests, um neue zu erstellen.
- Migration von Hunderten von gespeicherten Prozeduren auf .NET 8. Dies ist in der Regel aufgrund der internen Struktur der Prozeduren komplex - viele Abfragen mit verschiedenen benutzerdefinierten Funktionen, die... zusätzliche Abfragen ausführen. Das direkte Kopieren des Codes der Prozeduren nach .NET ist keine Lösung, da es sich dabei nur um einen Plattformwechsel handelt (Lift & Shift), aber die technischen Schulden bleiben im Code.
- Migrieren einer WPF-Anwendung zu einer benutzerdefinierten Blazor-Implementierung. Dieses Projekt war komplex, da das erwartete Ergebnis eine benutzerdefinierte, nicht typische Blazor-Anwendung war. Auch hier war der Musterabgleich ein Ansatz der Wahl.
Herausforderungen und Überlegungen
Trotz ihres transformativen Potenzials ist die GenAI-gestützte Modernisierung nicht ohne Herausforderungen:
- LLM-Halluzinationen: Die KI kann Fakten erfinden - die Prompts müssen sorgfältig vorbereitet werden, die Leitplanken sollten sehr spezifisch sein, und - schließlich - müssen wir das richtige LLM für die Aufgabe mit den richtigen Parametern (wie der Temperatur) verwenden. Aber wir müssen die Tatsache akzeptieren, dass Halluzinationen trotzdem auftreten werden.
- Sicherheit und Compliance: Eine menschliche Überprüfung ist nach wie vor unerlässlich, insbesondere in regulierten Branchen. Es gibt auch berechtigte Bedenken hinsichtlich des Schutzes des Codes bei der Verwendung von Cloud-basierten Modellen - es ist wichtig zu verstehen, wie der Datenschutz in der Cloud funktioniert.
- Fähigkeitslücken: Teams müssen verstehen, wie sie effektiv mit GenAI interagieren können. Und das ist keine einfache Aufgabe!
- Iterativer Prozess: Modernisierung ist kein einmaliger Vorgang - der Modernisierungsworkflow muss ständig verfeinert werden.
Fazit
GenAI ersetzt die Entwickler nicht - es befähigt sie. Durch die Automatisierung der mühsamen, fehleranfälligen Aspekte der Modernisierung ermöglicht GenAI den Teams, sich auf Architektur, Geschäftslogik und Innovation zu konzentrieren.
Anstatt Monate mit dem Reverse-Engineering von undokumentiertem Code oder dem Refactoring von Hand zu verbringen, können Entwickler mit intelligenten Assistenten zusammenarbeiten, die die Routinearbeit in großem Umfang erledigen.
Die Modernisierung muss nicht länger eine riskante, schmerzhafte Reise sein. Mit GenAI wird sie zu einem überschaubaren, iterativen und sogar aufregenden Prozess, der schneller, sicherer und intelligenter Werte schafft.
Wenn Unternehmen wettbewerbsfähig bleiben wollen, ist die Modernisierung von Altsystemen keine Option mehr. GenAI ist nicht nur ein hilfreiches Werkzeug auf diesem Weg - es ist ein Wendepunkt.
Erfahren Sie mehr über unsere AI-Native SDLC Engineering Lösung.
Contact