Entdecken Sie das TÜV-zertifizierte GoogleTest mit Agentic AI für C/C++-Tests!
Details ansehen »
Parasoft-Blog
Die Arbeit mit Legacy-Code ist Alltag. Allerdings stellen die Wissenslücken über den Code potenzielle Risiken dar. Lesen Sie weiter, um zu erfahren, wie Sie diese Risiken mindern und Ihren Legacy-Code aktualisieren können.
Zum Abschnitt springen
Wenn Sie mit Legacy-Code arbeiten, benötigen Sie eine nachhaltige Methode zur Verwaltung von Änderungen. Die Arbeit mit Legacy-Code kann ein Hindernis für Agile und DevOps sein. Sie können die Herausforderung jedoch meistern, indem Sie geeignete Technologien einsetzen.
Viele verwenden den Begriff „Legacy-Code“ einfach für alten Code. Doch „alt“ und „Legacy“ haben unterschiedliche Bedeutungen. Hier verwende ich die Definition von Legacy-Code als jeglichen bestehenden Code, der nicht mehr unterstützt oder aktualisiert wird und über den das Team nur noch wenig weiß.
Das Wissen über den Code kann aus verschiedenen Gründen unvollständig sein, z. B.:
Eines sei vorweg gesagt: Legacy-Code ist die Regel, nicht die Ausnahme . Ein Großteil der heutigen Softwareinfrastruktur basiert auf Legacy-Code. Die Frage ist also: Wie können wir die Risiken von Legacy-Code minimieren, wenn Änderungen notwendig sind? In diesem Blogbeitrag stelle ich Ihnen einige Lösungsansätze für die effektive Arbeit mit Legacy-Code vor.
Das Problem mit Legacy-Code ist nicht sein Alter – es liegt darin, dass Sie nicht verstehen, wie sich eine Änderung des Codes auf die vorhandene Funktionalität auswirken kann. Die mit Legacy-Code verbundenen Wissenslücken können zu einem Hindernis werden, wenn Sie auf eine neue Entwicklungsmethodik wie Agile oder DevOps umsteigen.
Agile und DevOps sind zu den vorherrschenden Methoden für die Softwareerstellung geworden, da sie Teams dabei helfen, Anwendungen schnell zu iterieren und zu veröffentlichen, sobald minimale marktfähige Funktionen bereit sind. Kurze und häufige Entwicklungszyklen sind das Markenzeichen iterativer Entwicklungsmethoden, aber diese Ansätze lassen oft keinen Raum für die Abmilderung potenziell problematischer Ergebnisse, wenn Sie mit Legacy-Code arbeiten. Der Versuch, Code, den Sie nicht verstehen, schnell zu iterieren, führt wahrscheinlich zu neuen Problemen.
Beim Starten neuer Projekte ist es viel einfacher, mit Änderungen im Quellcode Schritt zu halten. Bei Projekten, die es schon länger gibt, arbeiten Teams normalerweise mit Systemen, die Legacy-Code beinhalten. Entwickler wissen möglicherweise nicht, wie die vorhandene Codebasis funktioniert, müssen aber dennoch Fehler beheben oder die Funktionalität erweitern, ohne neue Probleme einzuführen. Und selbst oberflächliche oder scheinbar kleine Änderungen können erhebliche Auswirkungen auf die Anwendung haben.
Bei der Softwareentwicklung geht es darum, Softwarequalität, Markteinführungszeit und Entwicklungskosten ständig in Einklang zu bringen. In den meisten Fällen gehen wir Kompromisse ein, um Geschäftsziele basierend auf dem Marktgeschehen zu erreichen. Mit der Zeit bauen wir technische Schulden auf.
Technische Schulden sind die Kosten für die Risikominderung, die mit der Implementierung einer unvollkommenen Lösung zur Erreichung des Ziels hinsichtlich Markteinführungszeit oder Entwicklungskosten verbunden ist. Beispielsweise stellt der Verzicht auf Bibliotheksaktualisierungen, weil dies die Veröffentlichung verzögert hätte, technische Schulden in Form des späteren Zeitaufwands für die Aktualisierung der Bibliothek dar.
In vielen Fällen sind geerbte Legacy-Codebasen mit hohen technischen Schulden in Form von schlechter Testbarkeit, geringer Abdeckung, übermäßig komplexem Code usw. behaftet. Technische Schulden können die Anwendung neuerer Softwareentwicklungspraktiken erschweren, da Teams ständig vor der Frage stehen, ob sie die Schulden angehen sollen.
Um es ins rechte Licht zu rücken: Jede Anwendung weist technische Schulden auf, und viele Unternehmen können erhebliche Ressourcen in die Tilgung dieser Schulden investieren, ohne wesentliche Vorteile zu realisieren. Letztendlich hängt die Entscheidung, Ressourcen in die Tilgung technischer Schulden zu investieren, davon ab, welche Teile Ihrer Anwendung Sie ändern möchten. Aber Sie werden es nicht wissen, es sei denn, Sie unternehmen einige zusätzliche Schritte. Ich werde gleich darauf eingehen.
Wenn Unternehmen eine bestehende Codebasis übernehmen, wenden sie häufig eine Testabdeckungsrichtlinie an, um eine Grundlage für die Neuentwicklung zu schaffen. Der bestehende Code ist bereits im Einsatz und funktioniert in der Regel, daher liegt der Fokus auf der Sicherstellung der Qualität des neuen Codes. Um die Testabdeckungsrichtlinie zu erfüllen, erhöhen viele Unternehmen die Testabdeckung des bestehenden Codes durch die Erstellung zahlreicher neuer Unit-Tests . Eine geringe Testabdeckung verschlechtert die Gesamtkennzahlen und erschwert die genaue Messung der Testabdeckung für die Neuentwicklung. Wenn Sie wissen, dass Sie mit gut abgedecktem bestehendem Code arbeiten, können die Gesamtkennzahlen des Projekts Aufschluss darüber geben, ob die Neuentwicklung in die richtige Richtung geht.
Der Grundgedanke für diese Strategie ist fundiert, das Problem besteht jedoch darin, dass Unternehmen normalerweise keine Zeit haben, qualitativ hochwertige Unit-Tests zu erstellen, um diese Lücken zu schließen. Es sollte eine bessere Möglichkeit geben, mit Legacy-Code umzugehen.
Nutzen Sie ein Tool, mit dem Sie schnell aussagekräftige Tests für Ihren bestehenden Java-Code erstellen können. Parasoft Jtest bietet eine intuitive Benutzeroberfläche, die Entwicklern einen automatischen Testgenerierungsprozess auf Basis des vorhandenen Codes ermöglicht. Die resultierende Regressionstestsuite ist aussagekräftig, wartungsfreundlich und erweiterbar. Kunden berichten von einer Einsparung von über 50 % ihres Entwicklungsaufwands bei der Erstellung von Tests für ihren bestehenden Code.
Anstatt zu versuchen, auf Makroebene zu arbeiten, erstellen Sie eine Basislinie und beschränken Sie den Umfang Ihrer Qualitätsaktivitäten auf die Codebereiche, die von Ihren geplanten Änderungen betroffen sind. Nachdem Sie Messungen durchgeführt haben, um den Umfang und den Status des Codes zu bewerten, sollten Sie Tests erstellen, die das aktuelle Verhalten erfassen, damit das Team verstehen kann, wie sich die Änderungen auf vorhandene Funktionen auswirken können.
Anschließend können Sie eine Reihe von Technologien nutzen, die Ihnen beim Sammeln von Analysen bei der Umgestaltung von Legacy-Code helfen und sicherstellen, dass Ihre Investition in Codeänderungen die Sicherheit und Zuverlässigkeit von Legacy-Systemen verbessert.
Um zu verstehen, wie sich Änderungen auf das Systemverhalten auswirken, ist mindestens ein Datenpunkt erforderlich. Beginnen Sie mit der Auswahl eines Baseline-Builds und beginnen Sie mit der Verfolgung von Metriken für die Zukunft. Legen Sie Ihren Umfang fest und sehen Sie sich drei Merkmale des Legacy-Codes an.
Parasoft bietet eine leistungsstarke Analyseplattform zur Erfassung, Korrelation und Berichterstellung von Codeanalyse-Verstößen, Testergebnissen, Abdeckungsanalysen und anderen Softwarequalitätsdaten. Die Plattform geht über statische Berichterstellung hinaus. Sie führt zusätzliche Analysen durch, um Ihnen zu helfen, die von Änderungen betroffenen Teile der Anwendung zu identifizieren.
Sie können einen bestimmten Satz von Dateien oder Verzeichnissen identifizieren und die Abdeckung, Verstöße gegen statische Analysen und Metrikdaten für diese spezifischen Ressourcen festlegen. Mithilfe dieser Informationen können Sie eine Basislinie für Bereiche der Codebasis erstellen, bevor Sie Änderungen an diesen Teilen des Codes vornehmen.
Ausgestattet mit einem ersten Datenpunkt besteht der nächste Schritt darin, das aktuelle Verhalten des Systems durch die Erstellung von Tests zu erfassen. Durch den Aufbau einer hochwertigen Regressionssuite wird vorhandenes Verhalten erfasst und ein Sicherheitsnetz geschaffen, um sicherzustellen, dass Änderungen die Funktionalität nicht beeinträchtigen.
Parasoft Jtest ist für diese Aufgabe ideal geeignet, da es Ihnen ermöglicht, eine Basislinie von JUnit-Tests in großen Mengen, einschließlich Assertionen, basierend auf dem vorhandenen Code zu erstellen. Jtest bietet außerdem die Möglichkeit, Tests zu erstellen, die direkt auf private Methoden zugreifen, wenn der Legacy-Code ursprünglich nicht im Hinblick auf Testbarkeit geschrieben wurde.
Es ist besser, die Testabdeckung durch aussagekräftige Tests zu erweitern. Jtest kann Unit-Tests speziell für die noch nicht abgedeckten Teile des Codes erstellen und so redundante Tests für Code vermeiden, für den bereits Unit-Tests existieren.
Parasoft Jtest lässt sich zudem in OpenAI- oder Azure OpenAI-Anbieter integrieren. Dadurch können Entwickler ihre Tests durch benutzerdefinierte, natürlichsprachliche Anweisungen erweitern, die beschreiben, wie Testfälle refaktoriert werden sollen. Dies bietet flexible Anpassungsmöglichkeiten für Entwickler, die Testfälle schnell und gezielt an die Anforderungen ihres Unternehmens anpassen möchten.
Sie sollten ein möglichst hohes Maß an Abdeckung anstreben, aber in den meisten Fällen ist es nicht praktikabel, eine 100-prozentige Abdeckung der gesamten Codebasis zu erreichen. Lesen Sie weiter, um eine weitere Technik kennenzulernen, die Sie als Sicherheitsnetz anwenden können, um die Abdeckung von geändertem Code sicherzustellen.
Wenn Sie aus funktionaler Sicht eine gute Abdeckung haben, können Sie jederzeit Änderungen vornehmen und die Tests ändern.
Nachdem das Systemverhalten erfasst wurde, können Sie mit minimalem Risiko, bestehende Funktionen zu beeinträchtigen, Verstöße beheben, Pull Requests bearbeiten oder die gewünschten Änderungen implementieren. Parasoft unterstützt Sie beim Management bestehender technischer Schulden und ordnet Daten wie Verstöße gegen die statische Analyse geeigneten Workflows zu. Dort können sie einfach neu priorisiert, unterdrückt oder behoben werden, um die Gesamtqualität der Anwendung zu verbessern. Änderungen zwischen den Builds sollten ebenfalls im Rahmen des laufenden Prozesses überwacht werden, um sicherzustellen, dass sich die Softwarequalität nicht verschlechtert.
Der beste Zeitpunkt, um die technischen Schulden im Legacy-Code zu beheben, ist, wenn Sie Änderungen vornehmen. Die gemeldeten Daten sollten in die statistischen Gesamtinformationen über das Projekt aufgenommen werden. Die technische Verschuldung hat möglicherweise keine unmittelbaren Auswirkungen auf die Anwendung. Sie sollten jedoch bewährte Methoden anwenden, um sie systematisch einzudämmen und zu verwalten. Wenn Sie Legacy-Code jederzeit umgestalten, wenn Sie Änderungen vornehmen müssen, können Sie die Verschuldung schrittweise reduzieren.
Der von uns besprochene Prozess stellt sicher, dass sich der Umfang der Änderungen nicht negativ auf die vorhandene Funktionalität auswirkt. Sie müssen jedoch auch sicherstellen, dass das Team in Zukunft gute Praktiken befolgt. Um weiterhin ein hohes Maß an Abdeckung aufrechtzuerhalten und Tests zu schreiben oder zu aktualisieren, während sich der Code weiterentwickelt, ist eine Zustimmung auf kultureller Ebene erforderlich. Aus diesem Grund hat Parasoft eine Technologie entwickelt, die Sie automatisch benachrichtigt, wenn geänderter Code – neuer oder geänderter – nicht der Abdeckungsrichtlinie entspricht.
Durch die Analyse der Änderungen zwischen bestimmten Baseline-Builds können Sie sich auf die Änderungen in der gesamten Codebasis konzentrieren und diese überwachen, um sicherzustellen, dass nichts durchs Netz geht. Eine 100-prozentige Abdeckung der gesamten Codebasis zu erreichen, ist vielleicht nicht praktikabel, aber durch die Überwachung der Abdeckung des geänderten Codes kann sich das Team auf die Teile des Codes konzentrieren, an denen aktiv gearbeitet wird, und darauf vertrauen, dass alle Änderungen getestet werden.
Die Software der Welt läuft auf Code, der von Team zu Team weitergegeben wurde. Der Umgang mit Legacy-Code ist Alltag. Die Wissenslücken über den Code stellen potenzielle Risiken dar, wenn Entwickler Änderungen vornehmen, um die Funktionalität aufrechtzuerhalten oder zu erweitern. Die hier beschriebenen Prozesse und Technologien sollen Ihnen dabei helfen, das Selbstvertrauen zu gewinnen, nahezu jede Codebasis-Aufgabe an Ihre Teams anzunehmen.
Weiterführende Inhalte