Seien Sie am 30. April dabei: Vorstellung von Parasoft C/C++test CT für kontinuierliche Tests und Compliance-Exzellenz | Registrierung

Arbeiten mit Legacy-Code und 3 Schritte zum Aktualisieren

Kopfbild von Igor Kirilenko, Chief Product Officer bei Parasoft
6. Dezember 2023
7 min lesen

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.

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 jeglicher vorhandener Code, der nicht mehr unterstützt oder aktualisiert wird und ü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.

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

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.

Technische Schulden abmildern

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.

Was sind technische Schulden?

Technische Schulden sind die Kosten für die Minderung des Risikos, das mit der Implementierung einer unvollständigen Lösung zur Erreichung Ihres Time-to-Market- oder Entwicklungskostenziels verbunden ist. Wenn Sie beispielsweise auf Upgrades einer Bibliothek verzichten, weil dies die Veröffentlichung verzögert hätte, stellt dies 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 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.

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 unternehmen einige zusätzliche Schritte. Ich werde gleich darauf eingehen.

Erhöhung der Abdeckung von Legacy-Code

Wenn Unternehmen eine alte Codebasis übernehmen, um damit umzugehen, übernehmen sie häufig eine Abdeckungsrichtlinie, die ihnen hilft, eine Basis für neue Entwicklungen zu schaffen. Der Legacy-Code ist bereits im Feld und angeblich funktionsfähig, daher liegt der Fokus auf der Sicherstellung der Qualität des neuen Codes. Um die Abdeckungsrichtlinie einzuhalten, erhöhen viele Organisationen die Abdeckung des Legacy-Codes durch Erstellung vieler neuer Unit-Tests. Eine geringe Abdeckung verschlechtert die Gesamtkennzahlen, was es schwierig macht, die Abdeckung für Ihre neue Entwicklung genau zu messen. Wenn Sie wissen, dass Sie mit gut abgedecktem Legacy-Code arbeiten, können die gesamten Projektmetriken Aufschluss darüber geben, ob sich die Neuentwicklung in die richtige Richtung bewegt.

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.

Erstellen Sie aussagekräftige, wartbare Java-Tests

Verwenden Sie ein Tool, mit dem Sie schnell aussagekräftige Tests zur Abdeckung Ihres Java-Legacy-Codes erstellen können. Parasoft Jtest bietet eine Point-and-Click-Schnittstelle, die Entwicklern einen automatischen Testerstellungsprozess basierend auf dem vorhandenen Code ermöglicht. Die resultierende Regressionssuite ist aussagekräftig, wartbar und erweiterbar. Kunden berichten, dass sie über 50 % ihres Entwicklungsaufwands für die Erstellung von Tests für ihren Legacy-Code eingespart haben.

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 Umfang

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.

  • 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 und dergleichen können Aufschluss über den Zustand der Softwarequalität geben.

Parasoft bietet eine leistungsstarke Analyseplattform zum Erfassen, Korrelieren und Berichterstattung Code-Analyse-Verstöße, Testergebnisse, Abdeckungsanalyse und andere Software-Qualitätsdaten. Die Plattform geht über die statische Berichterstattung hinaus. Darüber hinaus werden zusätzliche Analysen durchgeführt, die Ihnen dabei helfen, Teile der Anwendung zu identifizieren, die von Änderungen betroffen sind.

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.

2. Capture-Verhalten

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.

Besser ist es, die Abdeckung durch aussagekräftige Tests zu erweitern. Jtest kann Unit-Tests erstellen Nur für die nicht abgedeckten Teile des Codes, um redundante Tests für Code zu verhindern, der bereits einige Komponententests enthält.

Parasoft Jtest kann auch in OpenAI- oder Azure OpenAI-Anbieter integriert werden, was es Entwicklern ermöglicht, ihre Tests durch die Eingabe von vom Benutzer erstellten Eingabeaufforderungen in natürlicher Sprache weiter zu verbessern, die beschreiben, wie Testfälle umgestaltet werden sollten. Dies bietet flexible Anpassungsoptionen für Entwickler, die schnell Änderungen vornehmen möchten Testfälle auf spezifische Art und Weise, die für die Anforderungen ihrer Organisation relevant ist.

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.

3. Verbessern Sie den isolierten Legacy-Code

Wenn das Verhalten des Systems erfasst ist, können Sie mit der Behebung von Verstößen, der Behebung von PRs oder der Umsetzung der Änderungen beginnen, auf die Sie sich konzentrieren möchten, und das bei minimalem Risiko, bestehende Funktionen zu beeinträchtigen. Parasoft kann Ihnen helfen Bewältigung der bestehenden technischen Schulden und fügen Sie Daten, wie z. B. Verstöße gegen die statische Analyse, in geeignete Arbeitsabläufe ein, wo sie leicht neu priorisiert, unterdrückt oder behoben werden können, um die Gesamtqualität der Anwendung zu verbessern. Auch Änderungen von Build zu Build sollten im laufenden Prozess ü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

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.

Fazit: Arbeiten mit Legacy-Code

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.

Machen Sie Unit-Tests richtig: Top-Tipps für Entwickler