Arbeiten mit Legacy-Code und 3 Schritte zum Aktualisieren

Kopfschuss von Igor Kirilenko, Chief Product Officer

Von Igor Kirilenko

19. Oktober 2018

7  min lesen

Die Arbeit mit Legacy-Codes ist Alltag. Allerdings stellen die Wissenslücken über den Code potenzielle Risiken dar. Lesen Sie weiter, um zu verstehen, wie Sie diese Risiken mindern und Ihren Legacy-Code aktualisieren können.

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.

Was ist Legacy-Code?

Viele Leute verwenden den Begriff "Legacy-Code", um einfach alten Code zu bedeuten. Aber „alt“ und „Vermächtnis“ bedeuten für verschiedene Menschen unterschiedliche Dinge. Hier verwende ich die Definition von Legacy-Code als Jeder vorhandene Code, über den das Team nur begrenzte Kenntnisse hat.

Das Wissen über den Code kann aus verschiedenen Gründen unvollständig sein, z. B.:

  • Das Team erwarb ein Projekt von einem anderen Teil der Organisation.
  • Der ursprüngliche Autor verließ das Team und nahm das Wissen über den Code mit.
  • Die vom Code bereitgestellte Funktionalität hat keine geschäftliche Priorität mehr und ist unverändert geblieben, was zu vergessenen Details des Codes führt.

Lassen Sie uns auf jeden Fall klar sein: Legacy-Code ist die Regel, nicht die Ausnahme. Ein Großteil der heutigen Software-Infrastruktur läuft auf Legacy-Code. Die Frage ist also, wie wir die mit Legacy-Code verbundenen Risiken mindern können, wenn wir Änderungen vornehmen müssen. In diesem Blog-Beitrag werde ich Ihnen einige Lösungen für die effektive Arbeit mit Legacy-Code vorstellen.

Webinar: Best Practices zum Erreichen von Code Coverage-Zielen mit JUnit

Legacy-Code ist ein Hindernis für Agile und DevOps

Das Problem mit Legacy-Code ist nicht sein Alter - es ist, dass Sie nicht verstehen, wie sich Änderungen auf vorhandene Funktionen auswirken können. Die mit Legacy-Code verbundenen Wissenslücken können zu einem Hindernis werden, wenn Sie auf eine neue Entwicklungsmethode 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 freizugeben, sobald minimale marktfähige Funktionen bereitstehen. Kurze und häufige Entwicklungszyklen sind das Markenzeichen von iterativen Entwicklungsmethoden, aber diese Ansätze lassen keinen Raum, um potenziell problematische Ergebnisse zu vermeiden, wenn Sie mit Legacy-Code arbeiten. Der Versuch, Code, den Sie nicht verstehen, schnell zu iterieren, führt wahrscheinlich zu neuen Problemen.

Die Realität ist, dass diese Techniken beim Starten neuer Projekte viel einfacher anzuwenden sind. Bei Projekten, die es schon länger gibt, arbeiten Teams normalerweise mit Systemen, die Legacy-Code enthalten. Entwickler wissen möglicherweise nicht, wie die vorhandene Codebasis funktioniert, müssen jedoch 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.

Warum technische Schulden wichtig sind (oder nicht)

Bei dem Softwareentwicklungsspiel geht es darum, die Softwarequalität, die Markteinführungszeit und die Entwicklungskosten ständig in Einklang zu bringen. In den meisten Fällen machen wir Kompromisse, um Geschäftsziele basierend auf dem, was auf dem Markt passiert, zu erreichen. Im Laufe der Zeit machen wir technische Schulden.

Was sind technische Schulden?

Technische Schulden sind die Kosten für die Minderung des Risikos, das mit der Implementierung einer unvollständigen Lösung verbunden ist, um Ihr Time-to-Market- oder Entwicklungskostenziel zu erreichen. (Zum Beispiel stellt der Verzicht auf Upgrades einer Bibliothek, weil dies die Veröffentlichung verzögert hätte, eine technische Schuld in Form von Zeit dar, die für die spätere Aktualisierung der Bibliothek benötigt wird.)

In vielen Fällen sind vererbte Legacy-Codebasen mit technischen Schulden in Form von schlechter Testbarkeit, geringer Abdeckung, übermäßig komplexem Code usw. behaftet. Technische Schulden können die Anwendung neuerer Softwareentwicklungspraktiken belasten, da Teams ständig vor der Frage stehen, ob sie sich damit befassen sollen die Schuld.

Sollten Sie sich über technische Schulden Sorgen machen?

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 ergreifen einige zusätzliche Schritte (ich werde gleich darauf eingehen).

Erhöhung der Abdeckung von Legacy-Code

Wenn Unternehmen eine ältere Codebasis erben, um damit umzugehen, wenden sie häufig eine Abdeckungsrichtlinie an, mit deren Hilfe sie eine Basis für neue Entwicklungen erstellen können. Der Legacy-Code ist bereits vor Ort und funktioniert angeblich. Daher liegt der Schwerpunkt auf der Sicherstellung der Qualität des neuen Codes. Um die Abdeckungsrichtlinie einzuhalten, erhöhen viele Organisationen die Abdeckung des Legacy-Codes mit allen erforderlichen Mitteln. Eine geringe Abdeckung führt zu einer Verschlechterung der Gesamtmetriken, was es schwierig macht, die Abdeckung für Ihre neue Entwicklung genau zu messen. Wenn Sie wissen, dass Sie mit Legacy-Code arbeiten, der gut abgedeckt ist, können die Gesamtprojektmetriken anzeigen, ob sich die Neuentwicklung in die richtige Richtung bewegt.

Die zugrunde liegende Begründung für diese Strategie ist solide, aber das Problem ist, dass Unternehmen blind Tests generieren, um ihre Deckungsrichtlinien einzuhalten. Infolgedessen wird das Projekt mit nicht wartbaren Tests geladen, die ein falsches Gefühl für die Softwarequalität vermitteln. Wenn Sie nicht vorhaben, den Code zu berühren, oder sich nicht mit der Wartbarkeit oder Qualität von Tests befassen, können Sie eines der verschiedenen Tools zur Testgenerierung auf dem Markt verwenden, mit denen Sie dieses Ziel erreichen können.

Erstellen Sie aussagekräftige, wartbare Java-Tests

Um es klar auszudrücken, ich befürworte nicht, blind Tests zu generieren. Verwenden Sie stattdessen ein Tool, mit dem Sie schnell aussagekräftige Tests erstellen können, um Ihren Java-Legacy-Code abzudecken. Parasoft Jtest bietet eine Point-and-Click-Oberfläche, über die Entwickler einen automatischen Testerstellungsprozess basierend auf dem vorhandenen Code erhalten. Die resultierende Regressionssuite ist aussagekräftig, wartbar und erweiterbar.

Fitch bietet hohe Codeabdeckung und Qualität für Microservices-Anwendungen

Die 3 Schritte zum Aktualisieren Ihres Legacy-Codes

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.

1. Definieren Sie Ihren Bereich.

Um zu verstehen, wie sich Änderungen auf das Systemverhalten auswirken, ist mindestens ein Datenpunkt erforderlich. Beginnen Sie mit der Auswahl eines Baseline-Builds und verfolgen Sie die Metriken in Zukunft. Legen Sie Ihren Bereich fest und sehen Sie sich drei Merkmale des Legacy-Codes an:

  • Wie viele Verstöße gegen die statische Analyse haben Sie und wie schwerwiegend sind sie? Sie müssen verstehen, wie viele potenzielle Fehler in den Code integriert sind.
  • Was ist Ihre aktuelle Testabdeckung? Eine geringe Abdeckung stellt ein potenzielles Risiko dar, das mit Änderungen verbunden ist.
  • Wie viel Bereinigung wird notwendig sein? Zusätzliche Metriken wie Komplexität, Kommentare usw. können einen Überblick über den Status der Softwarequalität geben.

Parasoft bietet eine leistungsstarke Analyseplattform zum Erfassen, Korrelieren und Melden von Verstößen gegen die Codeanalyse, Testergebnissen, Abdeckungsanalysen und anderen Daten zur Softwarequalität. Die Plattform geht über die statische Berichterstellung hinaus. Außerdem werden zusätzliche Analysen angewendet, um Teile der Anwendung zu identifizieren, die von Änderungen betroffen sind.

Mithilfe des Konzepts von Ressourcengruppen können Sie einen bestimmten Satz von Dateien oder Verzeichnissen sowie die Bereichsabdeckung, Verstöße gegen statische Analysen und Metrikdaten für diese bestimmten Ressourcen identifizieren. Mithilfe dieser Informationen können Sie eine Basislinie für Bereiche der Codebasis erstellen, bevor Sie Änderungen in diesen Teilen des Codes vornehmen.

2. Verhalten erfassen.

Ausgerüstet mit einem anfänglichen Datenpunkt besteht der nächste Schritt darin, das aktuelle Verhalten des Systems durch Erstellen von Tests zu erfassen. Der Aufbau einer hochwertigen Regressionssuite erfasst nicht nur das vorhandene Verhalten, sondern fördert auch die Abdeckung, die als Sicherheitsnetz dient, um sicherzustellen, dass Änderungen die Funktionalität nicht beeinträchtigen.

Parasoft Jtest ist ideal für diese Aufgabe geeignet, da Sie damit eine Basislinie von JUnit-Tests in großen Mengen erstellen können, einschließlich Zusicherungen, die auf dem vorhandenen Code basieren. Jtest bietet auch die Möglichkeit, Tests zu erstellen, die direkt auf private Methoden zugreifen, wenn der Legacy-Code ursprünglich nicht unter Berücksichtigung der Testbarkeit geschrieben wurde.

Es ist besser, die Abdeckung mit aussagekräftigen Tests zu erweitern. Während der Analyse der Abdeckungslücke identifiziert Jtest vorhandene Tests, die geklont und mutiert werden können, um nicht getestete Teile des Codes zu erreichen. Es wurde viel Arbeit in die Erstellung dieser vorhandenen Tests gesteckt, und die Klon- und Mutationsfunktionalität in Jtest erhöht die Rendite Ihrer Investition in die Testerstellung.

Sie sollten sich um ein Höchstmaß an Abdeckung bemühen, aber in den meisten Fällen ist es nicht praktikabel, eine 100% ige Abdeckung der gesamten Codebasis zu erreichen. Wir werden eine zusätzliche Technik besprechen, die Sie als Sicherheitsnetz anwenden können, um die Abdeckung von geändertem Code etwas später sicherzustellen.

Wenn Sie aus funktionaler Sicht eine gute Abdeckung haben, können Sie jederzeit Änderungen vornehmen und die Tests ändern.

3. Verbessern Sie den isolierten Legacy-Code.

Wenn das Verhalten des Systems erfasst ist, können Sie Verstöße beheben, PRs adressieren oder die Änderungen anwenden, auf die Sie sich konzentrieren möchten, ohne das Risiko einzugehen, dass vorhandene Funktionen beschädigt werden. Parasoft kann Ihnen dabei helfen, die vorhandenen technischen Schulden zu verwalten und Daten wie Verstöße gegen statische Analysen in geeignete Workflows zu integrieren, in denen sie leicht neu priorisiert, unterdrückt oder behoben werden können, um die Gesamtqualität der Anwendung zu verbessern. Änderungen von Build zu Build sollten auch 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.

Sicherstellung der Abdeckung des geänderten Codes

Mit diesem Prozess können Sie sicherstellen, dass sich der Umfang der Änderungen nicht negativ auf vorhandene Funktionen auswirkt. Sie müssen jedoch auch sicherstellen, dass das Team in Zukunft bewährte Verfahren befolgt. Um weiterhin ein hohes Maß an Abdeckung aufrechtzuerhalten und Tests zu schreiben oder zu aktualisieren, während sich der Code weiterentwickelt, ist ein Buy-In auf kultureller Ebene erforderlich. Aus diesem Grund haben wir eine Technologie entwickelt, die Sie automatisch benachrichtigt, wenn geänderter Code (dh neuer oder geänderter Code) nicht den Deckungsrichtlinien entspricht.

Durch die Analyse der Änderungen zwischen den angegebenen Baseline-Builds können Sie sich auf Änderungen in der gesamten Codebasis konzentrieren und diese überwachen, um sicherzustellen, dass nichts durch die Risse rutscht. Das Erreichen einer 100% igen Abdeckung über die gesamte Codebasis ist nicht praktikabel. Durch Überwachen der Abdeckung des geänderten Codes kann sich das Team jedoch auf die Teile des Codes konzentrieren, an denen aktiv gearbeitet wird, und darauf vertrauen, dass alle Änderungen getestet werden.

Zusammenfassend lässt sich sagen, dass die Software der Welt mit Code ausgeführt wird, der von Team zu Team weitergegeben wurde. Der Umgang mit Legacy-Code ist eine alltägliche Realität. Die Wissenslücken über den Code stellen potenzielle Risiken dar, da Entwickler Änderungen vornehmen, um die Funktionalität aufrechtzuerhalten oder zu erweitern. Die hier verwendeten Prozesse und Technologien sollten Ihnen dabei helfen, das Vertrauen zu gewinnen, nahezu jede Codebasis zu übernehmen, die Ihren Teams auferlegt wird.

Erfüllen Sie die Abdeckungsziele mit Parasoft Jtest.
Planen Sie jetzt eine Demo
Kopfschuss von Igor Kirilenko, Chief Product Officer

Von Igor Kirilenko

Igor, Vice President of Development bei Parasoft, ist verantwortlich für die technische Strategie, Architektur und Entwicklung von Parasoft-Produkten. Igor bringt über 20 Jahre Erfahrung in führenden Entwicklungsteams mit, mit einer Spezialisierung auf die Etablierung und Förderung der besten agilen Praktiken in Softwareentwicklungsumgebungen.

Erhalten Sie die neuesten Nachrichten und Ressourcen zum Testen von Software sofort.