-

Welche bewährten Praktiken gibt es für die effektive Arbeit mit Legacy-Code?

Mit Legacy-Code zu arbeiten kann selbst die besten Programmierer nachts wach halten. Es beinhaltet oft mühsames Debugging einzelner Methoden und das Entdecken von - manchmal nur auf den ersten Blick - unlogischen Abhängigkeiten. In diesem Artikel lernen Sie, wie Legacy-Code entsteht und welche Techniken und Werkzeuge Sie nutzen sollten, um effektiv damit zu arbeiten, Ihre Produktivität zu steigern und unnötigen Stress zu vermeiden.

Was ist Legacy-Code?

Legacy-Code ist ein Begriff, der sich auf bestehenden Quellcode bezieht, der in der Vergangenheit erstellt wurde und weiterhin in Verwendung ist. Zu Beginn eines Projekts war er möglicherweise verständlich und lesbar. Im Laufe der Zeit wurden jedoch alle Abweichungen von guten Programmierpraktiken und ursprünglichen Annahmen des Entwicklers oder Teams schließlich zu einem großen Problem. Daher kann solch ein Code aufgrund fehlender Dokumentation oder schlechter Struktur schwer zu verstehen, zu warten und weiterzuentwickeln sein.

Entwickler haben unterschiedliche Meinungen zu Legacy-Code - manche sehen es als Herausforderung, andere als Last. Es ist wichtig, effektive Strategien für den Umgang damit zu finden, um sicherzustellen, dass die Entwicklung einer Anwendung oder Website fortgesetzt wird. Wie können Sie Legacy-Code erkennen? 

Signale, die darauf hinweisen, dass Sie es mit Legacy-Code zu tun haben

Es gibt mehrere klare Indikatoren, die es Ihnen erlauben, zu beurteilen, dass der Code einen Legacy-Charakter hat. Hier sind einige Beispiele, die von erfahrenen Entwicklern bei Droptica hervorgehoben wurden:

Legacy-Code kann die Form von nicht objektbasiertem Quellcode annehmen, schlecht formatiert oder ohne Dokumentation.

 

  1. Code in einer Sprache, die nicht Englisch ist - die Verwendung einer einheitlichen Programmiersprache trägt zur Verbesserung der Klarheit des Codes bei, was es anderen Entwicklern erleichtert, ihn in Zukunft zu verstehen und zu warten. Wenn ein Entwickler eine Variable wie isPremiumUser sieht, wird er ihren Verwendungszweck erkennen. Hingegen kann die polnische Variable jestUzytkownikiemPremium für Menschen, die die polnische Sprache nicht kennen, verwirrend oder unverständlich sein.
     
  2. Schlecht formatierter Code - die Lesbarkeit des Codes hat einen entscheidenden Einfluss auf die Effizienz der Arbeit. Durch die Verwendung eines nicht standardmäßigen Formats macht der Programmierer den Code nur für sich selbst lesbar (zumindest bis er vergisst, wozu er genutzt werden sollte), und schon bei den ersten Änderungen oder Debuggings wird solcher Code Probleme verursachen.
     
  3. Nicht objektorientierter Code - wird oft als Legacy-Code betrachtet, weil objektorientierte Programmierung heute das dominante Paradigma ist. Nicht objektorientierter Code kann durch fehlende objektorientierte Struktur, globale Variablen, prozedurale Komplexität und veraltete Designmuster gekennzeichnet sein, was es schwierig macht, ihn zu warten und weiterzuentwickeln.
     
  4. Code ohne Testbarkeit - das Fehlen automatisierter Tests für Code ermöglicht keine effektive Überprüfung seiner Korrektheit und Leistungsfähigkeit. Infolgedessen ist er anfälliger für Fehler, schwer zu warten und weiterzuentwickeln. Das Nichttesten des Codes kann auch zu Änderungen führen, die das Risiko unerwünschter Nebeneffekte oder Regressionen mit sich bringen. Zum Beispiel kann ein Programmierer beim Beheben eines Elements versehentlich mehrere andere beschädigen und es nicht einmal bemerken. 
     
  5. Code ohne Dokumentation - wird manchmal als Legacy-Code betrachtet, da es schwierig ist, seine Funktionsweise, Ziele und Abhängigkeiten zu verstehen. Fehlende ordnungsgemäße Dokumentation macht es schwierig für andere, Änderungen vorzunehmen, den Code zu warten und zu entwickeln. Es kann auch zu detektivischer Arbeit führen, die das Fehlerrisiko erhöht und die Effizienz der Entwickler beeinträchtigt.
     
  6. Nicht unterstützte Software - der Support für Software (Programmiersprache, Framework, Module und zusätzliche Bibliotheken) umfasst regelmäßige Updates, Sicherheitspatches und technischen Support von Entwicklern. Kein aktiver Support bedeutet, dass die Software veraltet sein kann, Sicherheitslücken enthalten und nicht mit neuen Umgebungen interagieren kann. Mit solcher Software wird die Wartung und Weiterentwicklung des Codes schwieriger.

Wie wird Legacy-Code aus einem Projekt eliminiert?

Das Eliminieren von Legacy-Code während der Arbeit am Projekt ist entscheidend, um die Codequalität zu erhalten und die zukünftige Softwareentwicklung zu erleichtern. Mehrere effektive Praktiken können bereits in der Code-Schreibphase implementiert werden, damit der Code in Zukunft nicht als Legacy angesehen wird.

1. Schreiben von Code nach Standards

Das Erstellen von Code nach Standards ist ein wichtiger Faktor zur Vermeidung von Legacy-Code. Die Verwendung einheitlicher Codierstandards, wie Namensgebung, Dateistruktur, Formatierung und Kommentare, erleichtert anderen Programmierern das Verständnis des Codes. Dank dessen wird der Code klarer, einfacher zu warten und zu ändern, was das Risiko verringert, dass er in Zukunft als Legacy-Code betrachtet wird.

Darüber hinaus hilft die Verwendung guter Praktiken, wie das Aufteilen in Module, das ordnungsgemäße Verwalten von Abhängigkeiten und das Vermeiden übermäßiger Komplexität, flexibleren und skalierbaren Code zu erstellen, der mit größerer Wahrscheinlichkeit langfristig entwickelt wird.

2. Anwendung der Prinzipien des guten Programmierens

Wichtig bei der Reduzierung von Legacy-Code ist die Implementierung guter Programmierprinzipien. Dazu gehören beispielsweise die SOLID- und KISS-Ansätze: 

  • SOLID ist eine Reihe von Designprinzipien für die Softwareentwicklung, die Flexibilität, Skalierbarkeit und Wartbarkeit des Codes durch Anwendung von 5 Regeln fördern. Mehr darüber können Sie im Artikel lesen: Code-Refactoring best practices that will help you in your daily work.
     
  • KISS, oder "Keep it simple, stupid," ist eine Regel, die einfach durch den Slogan erklärt werden kann: unnötige Komplikationen der Aktivitäten vermeiden. Wenn Sie etwas einfacher machen können, tun Sie es einfach.

Die Anwendung dieser Prinzipien und anderer bewährter Designmuster hilft, den Code lesbar, modular und leicht erweiterbar zu halten. Darüber hinaus reduziert das Sauberhalten des Codes durch das Beseitigen übermäßiger Komplexität, Redundanz und unnötiger Abhängigkeiten auch das Risiko, dass der Code zu Legacy-Code wird.

Praktiken wie regelmäßige Code-Reviews, Dokumentation und die Verwendung beschreibender Variablen- und Funktionsnamen tragen ebenfalls dazu bei, den Code in gutem Zustand zu halten und das Risiko von Legacy-Code zu minimieren.

3. Zusammenarbeit mit dem Tech Lead zur Steuerung der Anwendungsentwicklung

Eine weitere bewährte Praxis für die Arbeit mit Legacy-Code ist die Einbeziehung eines technischen Leiters (Tech Lead) in den Prozess. Dieser Spezialist sollte die Entwicklung der Anwendung und ihrer Architektur überwachen, um die Entstehung von Legacy-Code aus mehreren wichtigen Gründen zu vermeiden.

Erstens ist der Tech Lead dafür verantwortlich, die architektonische Konsistenz und Konformität im Projekt sicherzustellen. Durch die Überwachung der Arbeit des Teams kann der Tech Lead prüfen, ob gute Programmierpraktiken, Designprinzipien und Codierstandards eingehalten werden, was hilft, die Codequalität zu erhalten und potenziellen Legacy-Code zu vermeiden.

Zweitens ermöglicht die Kontrolle der Anwendungsentwicklung dem Tech Lead, alle Änderungen in den Anforderungen und Technologien im Auge zu behalten. Wenn sich die Anwendung ändert, kann der Tech Lead ihre Architektur anpassen, um neuen Anforderungen gerecht zu werden und die neuesten Techniken und Entwicklungstools zu nutzen. Dies verhindert, dass die Anwendung veraltet und schwer zu warten wird.

Schließlich sollte der Tech Lead die technische Schuld verwalten. Dieser Spezialist kann Bereiche identifizieren, die Code-Refactoring, Patching und Optimierung benötigen, um den Code in gutem Zustand zu halten. Dies verhindert die Entstehung von Legacy-Code, was zu Schwierigkeiten bei der Implementierung von Änderungen führen würde.

4. Erstellen von Code ohne Kommentare

Das Schreiben von Code nach dem Prinzip "guter Code benötigt keine Kommentare" hilft, die Erstellung von Legacy-Code aus einem einfachen Grund zu vermeiden. Wenn Code an sich lesbar ist, bedeutet das, dass er gut organisiert ist, geeignete Variablen- und Funktionsnamen hat und einfach und intuitiv geschrieben ist. Er benötigt keine zusätzlichen Beschreibungen, da andere Programmierer seine Absicht und Funktionsweise verstehen. 

Die obige Faustregel erlaubt es Entwicklern, ihren Ansatz ein wenig zu ändern. Es lohnt sich, den geschriebenen Code objektiv zu betrachten und zu überlegen, ob jemand anderes ihn auf einen Blick ohne zusätzliche Hinweise in den Kommentaren verstehen kann.

5. Automatische Werkzeuge nutzen 

Der Einsatz von Werkzeugen, die auf die Einhaltung guter Programmierprinzipien achten, reduziert Legacy-Code. Mit Code-Analyse-Werkzeugen und Lintern erhalten Sie Feedback zur Programmierkonformität, was hilft, Fehler und schlechte Praktiken zu vermeiden. 

Automatisierte Testwerkzeuge erkennen auch Fehler und Inkonsistenzen, wodurch das Risiko verringert wird, dass der Code zu Legacy-Code degradiert wird. Infolgedessen unterstützen sie die Erstellung qualitativ hochwertiger und langlebiger Codes.

Wenn Sie ein Projekt mit Legacy-Code übernehmen. In diesem Fall ist es ratsam, zu Beginn die Zeit zu investieren, um den Code mit einem der vielen verfügbaren Werkzeuge zu analysieren (die Auswahl sollte auf die Sprache und den Projekttyp abgestimmt sein). Oft korrigieren sie automatisch grundlegende Fehler, wie schlechte Formatierung oder schlecht gewählte Variablen-Case.

Werkzeuge, die die Arbeit mit Legacy-Code erleichtern

Die Arbeit mit Legacy-Code kann für Sie einfacher sein mit mehreren Werkzeugen, die Ihnen helfen, ihn zu erkennen, automatisch das Format zu korrigieren und vorzuschlagen, welche Funktion anstelle Ihres veralteten (deprecated) Vorgängers verwendet werden soll. Diese sollten natürlich auf die verwendete Programmiersprache und Umgebung abgestimmt werden. Hier finden Sie Beispiele für Werkzeuge, die für die PHP- und JavaScript-Entwicklung entwickelt wurden.

Werkzeuge zur Überprüfung von Legacy-Code 

Zusätzlich zu den erwähnten Signalen, die darauf hinweisen, dass Sie mit Legacy-Code arbeiten, können Sie auch Hilfe von einer IDE (Integrated Development Environment) nehmen. Die meisten Programme werden, in einem mehr oder weniger hohen Maß (dies kann auch von ihren Einstellungen abhängen, mit denen Sie sich vertraut machen sollten), auf doppelte Codefragmente, falsche Formatierung oder Abweichungen vom gewählten Codierstandard aufmerksam machen. Oft können Sie auch Erweiterungen installieren, die sich auf die Arbeit mit einem bestimmten Framework konzentrieren, wie Drupal, Symfony oder Laravel.

Wenn Sie die Softwareaktualisierung des Projekts überprüfen, sollten Sie daran denken, dass im Administrationspanel der Website viele Informationen über die verwendeten Softwareversionen verfügbar sind. Dort können Sie in der Regel eine Liste der zu aktualisierenden Module finden. Auf der Frontend-Seite hingegen kommen Ihnen Browser-Plugins wie Wappalyzer zu Hilfe. Sie erkennen, welche Technologien auf der Webseite verwendet werden und analysieren deren Leistung.

Das Online-Tool Wappalyzer ist ein Browser-Plugin, das Ihnen helfen kann, Legacy-Code und Technologien zu erkennen.


Ein Scan der Droptica.com-Website mit dem Wappalyzer (Quelle)

Werkzeuge zur Organisation von Legacy-Code

Viele der kleineren Fehler im Zusammenhang mit Legacy-Code können Sie mit Werkzeugen korrigieren, die für bestimmte Sprachen und Frameworks entwickelt wurden. Nach der Code-Analyse präsentieren sie eine Liste der erkannten Fehler, wobei Sie normalerweise darüber informiert werden, dass Sie einige davon automatisch beheben können. Hier sind Beispiele für solche Werkzeuge: 

  • Code Sniffer - ein beliebtes Werkzeug unter PHP- und Drupal-Entwicklern. Nach der Festlegung des entsprechenden Codierstandards bietet es eine tiefgehende Codeanalyse.
     
  • CS Fixer - eine zuverlässige Lösung für Entwickler, die das Symfony-Framework verwenden, das automatisch die Code-Formatierung korrigiert und an festgelegte Standards anpasst, die Lesbarkeit und Konsistenz des Projekts verbessert.
     
  • ESlint/JSlint - beliebte Werkzeuge zur statischen JavaScript-Codeanalyse, die Entwicklern helfen, sauberen und konsistenten Code zu pflegen, indem sie potenzielle Bugs und Inkonsistenzen in der Codierung identifizieren und melden.
Das Online-Tool ESlint kann Ihnen helfen, sauberen und konsistenten JavaScript-Code in Ihrem Projekt zu pflegen.

Quelle: eslint.org

  • PHPStan - ein leistungsstarkes Werkzeug zur statischen Codeanalyse für die PHP-Sprache, das Entwicklern ermöglicht, Fehler, Typinkompatibilitäten und potenzielle Probleme zur Kompilierungszeit zu erkennen, die Codequalität und Zuverlässigkeit zu verbessern.
     
  • Larastan - eine Erweiterung für PHPStan, die eine statische Codeanalyse für auf dem Laravel-Framework basierende Anwendungen bietet, Entwicklern ermöglicht, Fehler zu erkennen und die Codequalität zur Kompilierungszeit zu verbessern.
     
  • Rector - ein Tool für die PHP-Sprache, das die automatische Transformation von Quellcode ermöglicht, um neuen Standards, Best Practices und Konventionen zu entsprechen. Es erleichtert die Aktualisierung eines Projekts auf die neuesten PHP-Versionen und verbessert die Lesbarkeit und Qualität des Codes.

Praktiken zur Vermeidung von Legacy-Code - Zusammenfassung

Legacy-Code ist ein Begriff für bestehenden Code, der weiterhin verwendet wird. Viele Entwickler finden es schwierig, damit zu arbeiten und ihn zu verstehen, zum Beispiel aufgrund der Nichteinhaltung der Codierstandards einer Sprache oder eines Frameworks oder der Nutzung veralteter Technologien. 

Die Arbeit mit Legacy-Code kann erleichtert werden, indem die oben genannten Strategien implementiert und Werkzeuge zur Erhaltung des sauberen Codes verwendet werden. Sie helfen bei der Analyse und korrigieren automatisch kleinere Fehler. Es ist auch eine gute Idee, sich an Unit Tests zu erinnern und zu versuchen, diese umzusetzen, um sicherzustellen, dass die vorgenommenen Änderungen die beabsichtigte Wirkung haben. Wenn Sie zusätzlich Unterstützung bei Legacy-Code benötigen, wird Ihnen unser erfahrenes PHP-, Symfony- oder Drupal-Entwicklungsteam helfen, die beste Strategie zu finden. 

3. Best practices for software development teams