Legacies Never Die: How to Handle Legacy Code

Wenn der Begriff „Legacy Code“ auftaucht, wird er normalerweise mit einem Hauch von Verachtung gesagt oder empfangen. Eine vorläufige Google-Suche nach „Legacy Code Memes“ bringt Hunderte und Hunderte von Bildmakros von Menschen hervor, die sich die Haare ausreißen, frazzled aussehen, oder sehr enttäuscht.

Frazzled aussehender Mann mit unorganisierten Papieren beschriftet

Als ich vor 6 Monaten als Softwareentwickler anfing, hatte ich keine Ahnung, was Legacy-Code war oder was die Arbeit damit bedeutete.

Während meines vierten Monats als Junior-Entwickler wurde ich gebeten, einer App, die vor zwei oder drei Jahren von einem meiner Kollegen erstellt wurde, ein Suchfilter-Modal hinzuzufügen. Es schien einfach genug zu sein; Ich hatte den größten Teil der letzten vier Monate damit verbracht, an einer unglaublich komplexen App für einen anderen Client zu arbeiten, an der unser Standard-Stack beteiligt war: TypeScript / React / Redux / Redux-Saga. Ich hatte bereits viele einzigartige Probleme gelöst und war zuversichtlich, dass meine Codierungsfähigkeiten ausreichen, um ein einfaches Modal zum Übergeben von Abfrageparametern an das Backend zu erstellen.

Wie Sie vielleicht erraten haben, war es nicht annähernd so einfach. Aber warum?

Was Legacy-Code ist und warum es schwierig sein kann, damit umzugehen

Legacy-Code ist Code, der von einem anderen Entwickler oder Team geerbt wurde und ältere Technologien verwendet, die nicht mehr unterstützt werden oder von einer neueren Version abgelöst wurden. Viele Programmierer sagen, dass „Code zu Legacy-Code wird, sobald er geschrieben ist“. Der funktionale Unterschied zwischen „normalem“ Code und Legacy-Code könnte einfach darin bestehen, dass er andere Konventionen hat als das, mit dem Sie gewohnt sind.

In meinem Fall verwendete die App, der ich zugewiesen wurde, eher Flow als TypoSkript, und sie war nicht so stark typisiert, wie ich es gewohnt war. Dies machte es mir etwas schwerer, die Struktur der Daten zu verstehen, die aus dem Backend abgerufen wurden. Keine Typen bedeuteten, dass ich zur Laufzeit viel häufiger auf TypeErrors stieß, was beim Schreiben eines großen Features schwierig zu debuggen sein kann. Darüber hinaus verwendete die App eine viel ältere Version von React, die mit einer kompatiblen Version der Komponentenbibliothek abgeglichen werden musste, mit der ich das Modal erstellen wollte.

Bevor ich auf das Wesentliche eingehe, wie man mit Legacy-Code mit einem Gefühl von Ausgeglichenheit und Rationalität umgeht, möchte ich einen Haftungsausschluss hinzufügen, dass Legacy-Code nicht alles schlecht ist und an einem Legacy-Projekt arbeiten muss nicht schrecklich sein. Im Gegenteil, die Arbeit an Legacy-Code hat mich gelehrt, flexibel und geduldig zu sein, und vor allem ermöglichte mir die Erfahrung, Probleme mit einer neuen Perspektive in einem neuartigen Kontext zu lösen.

In der Tat, es machte mich zu einem besseren Entwickler als ich war, bevor ich anfing, durch die oben genannte Codebasis zu arbeiten, und hoffentlich kann Ihr Legacy-Projekt Ihnen auch etwas beibringen.

Umgang mit Legacy-Code auf technischer Ebene

Sextnt und ledergebundenes Buch auf einer Naturholzbank.Foto von Jeff Sheldon auf Unsplash

Lesen Sie Dokumentation und Codekommentare, wenn möglich

In einer perfekten Welt hat jede Codebasis eine robuste README-Datei, die kurze Erklärungen zur Funktionsweise des Projekts enthält, Codekommentare, die die genaue Logik des ursprünglichen Autors erklären, und die gesamte Anwendung ist absolut sinnvoll. Dies ist jedoch selten der Fall. Viele READMEs werden nicht aktualisiert, wenn sich Projekte entwickeln, die Leute vergessen, Kommentare zu schreiben, gehen davon aus, dass ihre Logik für einen neuen Entwickler offensichtlich ist, oder sie haben einfach keine Zeit mehr, sich um diese Dinge zu kümmern.

Schauen Sie sich die Codebasis als Ganzes an

Wenn Sie sich verlaufen haben und nicht wissen, wo Sie anfangen sollen, stellen Sie sich diese Fragen:

  • Wozu dient die App?
  • Wie fließen Daten durch die App?
  • Wie passt dein Feature in die App?

Wenn Sie ein Gefühl für das große Ganze bekommen, ist es einfacher, herauszufinden, wie Sie das Problem am besten angehen können. Möglicherweise müssen Sie eine neue Datei und eine neue Komponente erstellen. Vielleicht müssen Sie eine Utility-Funktion schreiben und testen. In jedem Fall ist es ein guter erster Schritt, den breiteren Kontext Ihres Problems zu verstehen, um eine Lösung zu finden.

Testen Sie die App manuell und wann immer möglich mit Komponententests

Das vorübergehende Unterbrechen einer App beim Hinzufügen einer neuen Funktion ist unvermeidlich, unabhängig davon, auf welcher Entwicklerebene Sie sich befinden. Dies ist normal und zu erwarten, insbesondere wenn Sie neu im Job sind und in einer älteren Codebasis mit einem unbekannten Stack oder einer Kombination aus beidem arbeiten.Der beste Weg, um zu verhindern, dass diese Brüche zu langfristigen Problemen werden, besteht darin, Ihre App gründlich mit Komponententests und manuellen Tests zu testen. Wenn Sie diese Tests durchführen und genau wissen, welche Art von Abdeckung Sie daraus ziehen, sparen Sie und zukünftige Entwickler viel Zeit. Darüber hinaus machen strenge Tests die App skalierbarer und geben Ihnen jedes Mal, wenn Ihre Tests sauber laufen, einen kleinen Dopaminschub.

Für Unit-Tests können Sie Testframeworks wie Jest oder Jasmine verwenden.

Für manuelle Tests sollten Sie eine Testmatrix entwickeln und sicherstellen, dass das Dokument für zukünftige Entwickler zugänglich ist. Für die Matrix möchten Sie eine Reihe von Aktionen, das erwartete Verhalten, das tatsächliche Verhalten beim Testen und alle anderen wichtigen Details definieren: Spreadsheet for behavior driven development

In einem zukünftigen Blogbeitrag werde ich erläutern, wie Sie beide Arten von Tests effizient in Ihren Workflow implementieren können.

Um Hilfe bitten

Angenommen, Ihr Projekt wurde von einem aktuellen oder ehemaligen Mitarbeiter an Ihrem Arbeitsplatz geschrieben, weiß wahrscheinlich jemand anderes, was in der App vor sich geht, oder weiß zumindest genug, um Sie zu lösen. Zu lernen, deinen Stolz zu schlucken und jemand anderen zu fragen, ist für manche ein unangenehmer Schritt, aber ein notwendiger Schritt, um als Entwickler zu wachsen, und vielleicht kann dir dein Kollege ein paar neue Tricks beibringen.Eine gute Möglichkeit, Ihre Zeit (und ihre) effizient zu nutzen, besteht darin, fundierte Fragen zu formulieren. Versuchen Sie, die Codebasis als Ganzes zu betrachten und die Lücken in Ihrem Verständnis herauszufinden. Es wird ihnen nicht nur helfen, ein besseres Gefühl für Ihr Problem zu bekommen, sondern es zeigt auch, dass Sie die Initiative ergriffen haben, das Problem zuerst selbst zu lösen.

Wissen, wann Sie Ihre Verluste reduzieren müssen

Wenn Sie zu viel Zeit damit verbringen, Ihren Fuß in die Tür zu bekommen, und nach den obigen Schritten keine ernsthaften Schritte in Richtung Implementierung der Funktion unternommen haben, lohnt es sich möglicherweise, den Code um Ihre Funktion herum zu überarbeiten. Geben Sie nicht zu leicht auf, sondern denken Sie auch daran, was Ihre Fristen sind und was Ihr Projektmanager von Ihnen erwartet.

Allerdings gibt es Nachteile, wenn man so vorgeht:

  • Das Umschreiben von Code kann Fehler verursachen, obwohl dies mit guten Komponententests etwas umgangen werden kann.
  • Das Umschreiben von Code kann versteckte Funktionen entfernen, obwohl dies auch mit guten Komponententests umgangen werden kann.
  • Wenn Sie unter Zeitdruck stehen, kann das Schreiben von Code außerhalb Ihres Features zusätzlich zu Ihrem Feature tatsächlich zeitaufwändiger sein, als nur darauf aufzubauen.

Verwenden Sie alles in allem Ihr bestes Urteilsvermögen. Es gibt Vor- und Nachteile für beide Entscheidungen, und alles hängt von Ihren individuellen Umständen und Ihrem Projektbudget ab.

Umgang mit Legacy-Code auf psychologischer Ebene

Ein Mann sitzt auf einem Dock in einem ruhigen BergseeFoto von Simon Migaj auf Unsplash

Nachdem wir nun die technischen Aspekte des Umgangs mit Legacy-Code behandelt haben, wollen wir darüber sprechen, wie wir mit unseren Soft Skills damit umgehen können. Schließlich sind Entwickler Menschen, nicht nur Programmierroboter, und der Umgang mit herausfordernden Problemen bei Projekten, die Kreativität und Autorenschaft erfordern, kann emotional anstrengend sein, nicht nur für Sie, sondern auch für Ihre Mitarbeiter.

Sei demütig und freundlich

Das ist etwas, was ich verlegen zugeben werde, dass ich mehr üben muss. Als mir zum ersten Mal das Filtermodal-Projekt zugewiesen wurde, war ich ziemlich lautstark darüber, wie janky und unattraktiv der Code war, während der ursprüngliche Autor des Codes 15 Fuß von mir entfernt saß. Ich wollte, dass meine Kommentare ein Witz sind, aber im Nachhinein erkenne ich, dass ich arrogant und verletzend war und dass ich einfühlsamer hätte sein sollen.

Es gibt viele Faktoren, die dazu führen können, dass Legacy-Code „aus“ aussieht, was Sie berücksichtigen sollten, bevor Sie anfangen, den Autor zu kritisieren oder das Schlimmste an ihnen anzunehmen (Dies ist lose mit dem grundlegenden Attributionsfehler verbunden!).

Der ursprüngliche Autor mag seine Gründe gehabt haben, Code so zu schreiben, wie er es tat.

Zeitliche und technologische Einschränkungen können dazu führen, dass eine Person Code schreibt, der funktioniert, aber nicht unbedingt die beste Konvention hat. Wenn Sie sich in einer Situation mit nicht genug Zeit, veralteten Tools und einer kilometerlangen Aufgabenliste vorstellen, würden Sie wahrscheinlich auch nicht den besten Code schreiben!

Konventionen ändern sich.

In älteren Olio Apps-Projekten verwendet die Konvention für Code einfache Anführungszeichen, um Zeichenfolgen zu deklarieren, und zwei Leerzeichen entsprachen einem Tabulator. Wir hatten mehrere kleine Reaktionskomponenten in einer einzigen Datei verschachtelt. In unserer aktuellen Konvention verwenden wir doppelte Anführungszeichen und vier Leerzeichen, und jede Reaktionskomponente, egal wie klein sie ist, befindet sich in einer eigenen .tsx Datei im component Verzeichnis. Und in einigen Jahren, Ich bin sicher, das wird sich auch ändern.

Der gesamte Code wird schließlich Legacy

Dies knüpft an den vorherigen Punkt an: Ihr Code wird schließlich Legacy sein. Wenn Sie die Leiter des Dienstalters nach oben steigen, werden neue Entwickler eingestellt und müssen Ihren alten Code beibehalten. Sie können sauberen, fehlerfreien, TROCKENEN Code schreiben, aber sobald sich Konventionen ändern oder Trends ändern, sehen diese neuen Entwickler Ihren Code möglicherweise genauso wie den Legacy-Code anderer.

Seien Sie stolz auf die kleinen Erfolge

Es ist nicht einfach, außerhalb Ihrer gewohnten Konventionen zu arbeiten; Es gibt einen Grund für die riesige Menge an Memen und Witzen über den Umgang mit Legacy-Code. Wenn Sie jemals eine Sprache außerhalb Ihrer Muttersprache gelernt haben, wissen Sie, wie es sich anfühlt, ein Wort oder einen Begriff in Ihrer zweiten Sprache zu vergessen, sich aber in Ihrer Muttersprache daran zu erinnern und nicht in der Lage zu sein, über die Lücke zu übersetzen. Gleiches gilt für den Wechsel zwischen modernen und alten Konventionen. Manchmal dauert es nur eine Minute, um sich wieder zu orientieren.Wenn Sie in der Lage sind, erfolgreich durch Legacy-Code zu navigieren, zeigen Sie Ihre Fähigkeit, anpassungsfähig zu sein, was eine wichtige Fähigkeit ist, von der Sie bei Ihrem aktuellen Job und all Ihren zukünftigen Jobs profitieren, unabhängig davon, ob diese Jobs sind im Technologiebereich oder nicht. Legacy-Code ist der perfekte Spielplatz, um diese Fähigkeit zu üben.

Fazit:

Nutze diese Zeit, um deinen eigenen Code zu schreiben

Nun, da du die Erfahrung gemacht hast, in einer Legacy-Codebasis zu arbeiten, solltest du mit einem besseren Gefühl dafür, was dir an Tools und Konventionen gefällt und was nicht, davon wegkommen. Dies sind Dinge, mit denen Sie in zukünftigen Projekten fortfahren können, und machen Sie besser darin, den Code anderer zu überprüfen, konstruktive Kritik anzubieten und Mentoring zu geben.

Entwickeln Sie Apps für den Benutzer und den zukünftigen Entwickler

Egal, ob Sie die Erfahrung mit großartiger Dokumentation und Codekommentaren oder ohne Dokumentation oder Codekomentare gemacht haben, Sie können sehen, wie sowohl Dokumentation als auch Kommentare leistungsstarke Tools sind, um zukünftigen Entwicklern bei der Navigation im Projekt zu helfen. Sie haben das gemeinsame Ziel, eine reibungslose, funktionale und TROCKENE App zu wünschen; Die Pflege der Dokumentation und das Hinterlassen informativer Codekommentare sind eine gute Möglichkeit, diese Lücke zu schließen.

Denken Sie daran, dass Ihr Code eines Tages auch Legacy sein wird

Ich habe das schon ein paar Mal erwähnt, aber es ist wichtig zu wiederholen, dass Ihr Code auch Legacy sein wird, egal wie TROCKEN und makellos Ihr Code und Ihre Logik sind.

Das Wichtigste ist, flexibel und bescheiden zu sein und definitiv neue Tricks aus altem Code zu lernen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.