Wie überwinden Sie Ihre eigenen Codierungsverzerrungen bei der Übergabe von Legacy-Code? [geschlossen]


22

Als Programmierer sind wir oft unglaublich stolz auf unsere Fähigkeiten und vertreten sehr starke Meinungen darüber, was "guter" Code und "schlechter" Code ist.

Zu jedem Zeitpunkt in unserer Karriere ist uns wahrscheinlich ein Legacy-System in den Schoß gefallen und wir dachten: "Mein Gott, dieser Code ist scheiße!" weil es nicht in unsere Vorstellung passte, was für ein guter Code sein sollte, obwohl es möglicherweise perfekt funktionierender, wartbarer Code war.

Wie bereiten Sie sich mental vor, wenn Sie versuchen, sich mit der Arbeit eines anderen Programmierers auseinanderzusetzen?


2
wow ... diese frage ist für mich momentan wirklich relevant.
WalterJ89

1
Wenn es nicht kaputt ist, reparieren Sie es nicht. :-)
Richard

Dinge, die Sie niemals tun sollten, und Big Ball Of Mud sollten für alle Programmierer obligatorisch zu diesem Thema sein.
Jan Hudec

Möglicherweise Duplikat des Codes einer anderen Person
Gnat

Antworten:


31

Für jede ältere Codebasis besteht die richtige Art, sich mental auf den Umgang damit vorzubereiten, darin, zunächst Komponententests dafür zu schreiben .

Ob es saugt oder nicht, müssen Sie zuerst das Vertrauen haben, um es ändern zu können, ohne Sachen zu brechen!


6
+1. Andere Programme hängen oft von Fehlern im vorhandenen Code ab, unabhängig von den seltsamen Vorgehensweisen. Verstehen Sie es, bevor Sie sich damit beschäftigen!
Alex Feinman

Ich hatte mal dieses Problem. Ich habe einen Fehler in unseren internen Bibliotheken behoben, aber es stellte sich heraus, dass eine Menge wichtiger Code von diesem falschen Verhalten abhing. Huch.
Jonathan Sterling

Manchmal kann es sehr schwierig sein, diese Tests zu schreiben. Aber manchmal findet man irgendwo einen losen Faden , testet das und verbreitet die Testinfektion dann weiter. Möglicherweise müssen Sie einige Dinge überarbeiten, bevor Sie zu dem Teil gelangen, den Sie eigentlich ändern wollten.
Frank Shearar

5
Dies setzt voraus, dass Ihr Unternehmen Unit-Tests verwendet oder sogar versteht. Die meiste Zeit gibt es keine Tests für den Code, keine Dokumentation und eine knappe Frist für die Integration / Korrektur / Änderung, sodass Sie nicht einfach anfangen können, Komponententests dafür zu schreiben.
Wayne Molina

2
Bei älteren Codebasen ist es oft einfacher, mit automatisierten Regressionstests zu beginnen. Bei Unit-Tests wird davon ausgegangen, dass der Code einzelne Units enthält, die unabhängig voneinander getestet werden können. Sie müssen sehr glücklich sein, wenn Sie einen solchen Legacy-Code finden.
Doc Brown

30

Ich kann dir nicht sagen, wie oft ich "Oh, das ist total falsch" gesagt, es umgeschrieben und dann auf die harte Tour herausgefunden habe, warum dieser Code so geschrieben wurde. Normalerweise handelt es sich um eine nicht offensichtliche, ungeschriebene / undokumentierte Anforderung. Zumindest stimmt das für den Legacy-Code, an dem ich gerade arbeite.


3
Ist mir ein paar Mal passiert. Manchmal ist es besser, es einfach in Ruhe zu lassen
TheLQ

4
Und wenn Sie es herausfinden, seien Sie nett zu dem nächsten Mann und schreiben Sie einen Kommentar!
Frank Shearar

11

Sie warten, bis Sie lange genug dabei sind, um auf Ihren eigenen beschissenen Legacy-Code zu stoßen. Es ist eine demütigende Erfahrung und Teil des Lernprozesses. Ich sehne mich nach der Zeit, in der ich alles wusste.

Ich denke, Fosco hatte einen guten Grund, es in den Kontext möglicher Zeit- und Funktionseinschränkungen zu stellen. Manchmal muss man etwas zum Laufen bringen.

Und zum Schluss verstehen Sie, warum Sie einen Job haben.


4
Passiert die ganze Zeit für mich. Ich schaue ständig auf alten Code zurück und denke mir: "Wer hat diesen Mist geschrieben? Oh ja ... das habe ich." Ich denke, es zeigt, dass Sie als Programmierer wachsen, wenn Sie zugeben können, dass ein Code, den Sie in der Vergangenheit geschrieben haben, schlecht ist. Wenn Sie darauf zurückblicken und "Ja, sieht für mich gut aus" sagen, ist es entweder ein verdammt guter Code oder Sie machen keine Fortschritte. : P
Jasarien

7

Lache darüber, versuche es nicht zu sehr zu beurteilen und schaffe es einfach durch. Es ist nicht gut, ein echter Code-Nazi zu sein ... Es gibt definitiv so etwas wie "gut genug" oder sogar "gut genug zu der Zeit". Es gibt viele Male, in denen etwas entwickelt oder verbunden wird, um eine Krise zu beheben, und die dann nie wieder aufgegriffen werden.

Wenn es wirklich schlimm ist, sehen Sie nach, ob Sie ein Argument für das erneute Schreiben finden können. Wenn es nicht wichtig ist, steigen Sie einfach ein und aus.


7

Wähle deine Schlachten. Kennen Sie den Unterschied zwischen "Ich würde es nicht so schreiben" und "Dies schafft eine ernsthafte Wartungs- oder Support-Herausforderung".


Ich werde diese Antwort stehlen. :-)
Cringe

4

Oft finde ich es nützlich, ein Gefühl dafür zu bekommen, was die ursprünglichen Entwickler für gut hielten.

Suchen Sie nach Mustern und Themen für das, was sie getan haben, und oft finden Sie, dass es Gründe für einige der seltsamen Entscheidungen gab.

Manchmal stellt man fest, dass der ursprüngliche Entwickler tatsächlich schlecht war, aber man hat eine Vorstellung davon, welche Art von schlecht sie damals verkauften.

In jedem Fall sollten Sie sich danach ein besseres Bild davon machen, wo Sie mit dem Neuschreiben beginnen können oder wie eine schnelle Lösung aussehen würde, ohne alles umgestalten zu müssen.

Nehmen Sie vor allem nicht gleich an, dass es schlecht ist, nur weil es hässlich ist. Nichts lässt Sie dummer aussehen, als etwas zu modernisieren, nur um herauszufinden, dass es weniger leistungsfähig ist als das Original.


3

Wenn ich Zeit habe, greife ich es an und töte den schlecht geschriebenen Code.

Es ist Krieg.


3

Ich denke immer, dass hässlicher Code Code ist, bei dem viele Debuggings stattgefunden haben, mit vielen Feinheiten, die bei einer flüchtigen Betrachtung nicht auffallen. Wenn ich es ersetze oder grundlegend neu gestalte, muss ich sicherstellen, dass ich absolut jeden Aspekt der Code-Funktion verstehe. Wenn ich nicht die Zeit habe, auf den Grund zu gehen, muss ich ein minimales Risiko eingehen und die kleinstmögliche Änderung vornehmen, um meine Ziele zu erreichen.

Normalerweise werde ich eine kleine Korrektur / Änderung vornehmen und eine Funktion für die spätere Entwicklung vorschlagen, die es entschuldigen würde, den Dingen auf den Grund zu gehen und die ganze Sache umzugestalten. Dann gebe ich mein Bestes, um den Code zu ignorieren, bis das Feature auf der Roadmap landet.


3

Wenn älterer Code älter als ein paar Jahre ist, wurde er möglicherweise aufgrund von Einschränkungen in der Sprache, den Betriebssystemen usw., die zum Zeitpunkt der Codeerstellung existierten, auf diese Weise geschrieben. Hey, es sieht jetzt schlecht aus, aber war es dann schlecht? Ich versuche anzunehmen, dass der Entwickler einen Grund dafür hatte, was er oder sie getan hat. Dieser Grund mag nicht mehr zutreffen, aber wenn Sie davon ausgehen, dass es nicht nur allgemeine Inkompetenzen gibt (junge Programmierer werden in 5 Jahren vielleicht noch weniger an Ihren Code denken), sind Sie weniger verärgert darüber. Wenn es funktioniert und keine Probleme damit verbunden sind, schätzen Sie diesen Legacy-Code, auch wenn er noch so hässlich ist, da Sie aufregendere Probleme lösen können.


Ah, die uralte Frage nach WARUM ...

1

In der Vergangenheit, als ich nicht die Zeit hatte, auf den Code eines anderen zu pissen und ihn in "meinen" Stil zu verwandeln, musste ich mich sehr aufgabenorientiert verhalten:

Was versuche ich, um diesen Code hinzuzufügen / zu beheben / Arbeit zu machen?

Tue ich etwas, um dieses Ziel zu erreichen? Wenn nicht, hören Sie auf und kehren Sie zum letzten Mal zurück, als ich aufgabenorientierte Änderungen vorgenommen habe.

Bin ich mit dieser Aufgabe fertig? Wenn ja, hören Sie auf, an dem Code zu basteln, auch wenn es so aussieht, als ob er von einem nicht empfindungsfähigen Marsmenschen geschrieben wurde.


1

Berühren Sie den Code nicht, es sei denn, Sie sind bereit, den Code und die erforderlichen Korrekturen in Zukunft zu besitzen. Du wirst die Tendenz überwinden, etwas reparieren zu wollen, wenn du etwas kaputt machst, das du nicht geschrieben hast, weil du es nicht gut genug studiert hast, bevor du eingetaucht bist, und es dauert 2 Tage und eine Feuerübung, um es wieder zum Laufen zu bringen .

Versteht mich nicht falsch ... Es gibt legitime Gründe, Code umzugestalten, aber wenn ein Unternehmen verlangt, dass der Code funktioniert, und Sie ihn "reparieren", ohne die Konsequenzen zu kennen, bevor Sie einspringen, fordern Sie eine Welt voller Verletzungen .


1

Eine zeitweise Überarbeitung kann nützlich sein, aber seien Sie besonders vorsichtig, wenn Sie einen kleinen Aspekt des tatsächlichen Verhaltens des Codes ändern möchten, es sei denn, Sie verstehen, warum dieses Verhalten vorliegt und welche Auswirkungen es hat. Leider ist der Code, der ihn am dringendsten benötigt, manchmal am schwierigsten zu ändern, ohne das Verhalten zu berühren, obwohl Sie normalerweise Teile davon begradigen oder zumindest kommentieren können.


0

Ich arbeite heutzutage fast ausschließlich an Legacy-Code und ich denke immer: "Oh sh% t, was dachten sie?" . Dann beginne ich Unit-Tests für den Code zu schreiben und an diesem Punkt muss ich wirklich den Kontrollfluss und die Abhängigkeiten analysieren.

Manchmal ist es nicht einfach, Komponententests zu schreiben. Aber während ich es versuche, erhalte ich Informationen über den Code und werde verstehen, warum er so geschrieben wurde, wie er ist. Manchmal beweist das, dass der Code wirklich ein Chaos ist, manchmal verstehe ich den Denkprozess der ursprünglichen Entwickler und kann nützliche Dokumentationen hinzufügen oder einen Code neu schreiben, wenn ich eine neue Funktionalität hinzufügen möchte.

Für mich ist es hilfreich zu glauben, dass mein Code für mich selbst gleich aussehen wird, wenn ich in 12 Monaten darauf zurückkomme .


0

Mit der Erfahrung kommt das Urteil, zu wissen, wann Code wirklich schlecht ist und wann er nur in einem anderen Stil geschrieben ist. Wenn es einwandfrei funktioniert und gewartet werden kann und eine gute automatisierte Testabdeckung besteht , ist es nicht schlecht und Sie müssen nur Ihren Verstand öffnen. Sie werden wahrscheinlich etwas lernen. Fehlerhafter Code ist nicht funktionsfähig und kann nicht gewartet werden.

Hier sind einige Marker für wirklich schlechten Code:

  • Große Logikblöcke wurden dupliziert und nicht überarbeitet.
  • Zirkuläre Abhängigkeiten zwischen Klassen oder Paketen
  • Hohe Kopplung; geringe Kohäsion
  • Nicht verwendete Variablen, Schreiben in Variablen, die niemals gelesen werden, nicht erreichbarer Code.
  • Neuimplementierung von Standard-Bibliotheksfunktionen, zB Datumsformatierung.
  • Unnötig komplexe Logik; dh 50 Codezeilen, wo 10 gut tun würde.
  • Keine Kommentare, die den Zweck von Klassen oder Methoden beschreiben.
  • Irreführende Kommentare.

Ein Mangel an automatisierten Tests bedeutet nicht, dass der Code schlecht ist, aber es bedeutet, dass das Projekt schlecht ist.

Dies ist keine Geschmackssache; Diese Praktiken verteuern die Programmwartung erheblich.

Wie bereitest du dich vor?

Akzeptieren Sie die Tatsache, dass es eine Weile dauert, bis eine neue Codebasis erfolgreich bearbeitet werden kann. Wenn es "perfekt wartbar" ist und es eine hohe Testabdeckung gibt, dauert es weniger, aber es wird immer noch nicht sofort passieren. Wenn der Code schlecht ist, warne ich zuerst die Stakeholder, dass er in einem schlechten Zustand ist und die ersten Fortschritte nur langsam verlaufen. Wenn sie skeptisch sind, untermauere ich meine Behauptung, indem ich ihnen ein Beispiel für Probleme im tatsächlichen Code zeige und erkläre, wie sich diese von den branchenüblichen Best Practices unterscheiden.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.