Als Randnotiz: Suche nach einem neuen Job. Dieser würde nicht besser werden.
Die Ziele des Codes, den Sie überprüfen, sind:
Zu eine Eigenschaft versenden, die entsprechend den Anforderungen arbeiten sollte.
Reduzierung des Wachstums der technischen Schulden.
Das erste Ziel wird überprüft, indem überprüft wird, ob die Einheiten-, Integrations-, System- und Funktionstests vorhanden sind, ob sie relevant sind und alle Situationen abdecken, die getestet werden müssen. Sie müssen auch die Überzeugungen des ursprünglichen Autors über die Programmiersprache überprüfen , die zu subtilen Fehlern oder zu dem Code führen können, der vorgibt, etwas anderes zu tun als das, was er tatsächlich tut.
Das zweite Ziel ist das, auf das sich Ihre Frage konzentriert. Einerseits wird nicht erwartet, dass der neue Code die technische Verschuldung erhöht. Auf der anderen Seite ist der Umfang der Überprüfung der Code selbst, aber im Kontext der gesamten Codebasis. Von dort aus können Sie als Rezensent zwei Ansätze des ursprünglichen Autors erwarten:
Der externe Code ist nicht meine Schuld. Ich implementiere nur die Funktion und kümmere mich nicht um die gesamte Codebasis.
In dieser Perspektive kopiert der Code die Fehler der Codebasis und erhöht so zwangsläufig die technische Verschuldung: Schlechterer Code ist immer schlechter.
Dies ist zwar ein kurzfristig gültiger Ansatz, würde aber langfristig zu zunehmenden Verzögerungen und einer geringen Produktivität führen und schließlich dazu führen, dass der Entwicklungsprozess so teuer und riskant ist, dass sich das Produkt nicht mehr weiterentwickelt.
Das Schreiben von neuem Code ist eine Gelegenheit, das alte umzugestalten.
In dieser Perspektive könnte die Auswirkung der Fehler des Legacy-Codes auf den neuen begrenzt werden. Darüber hinaus könnte die technische Verschuldung proportional zum Codewachstum verringert oder zumindest nicht erhöht werden.
Dies ist zwar ein gültiger langfristiger Ansatz, birgt jedoch auch kurzfristige Risiken. Das Wichtigste ist, dass es kurzfristig manchmal länger dauern würde , bis die spezifische Funktion verfügbar ist. Ein weiterer wichtiger Aspekt ist, dass das Refactoring des nicht getesteten Legacy-Codes ein enormes Risiko für die Einführung von Regressionen birgt.
Abhängig von der Perspektive, die Sie fördern möchten, können Sie dazu neigen, den Rezensenten zu raten, mehr umzugestalten oder nicht. Erwarten Sie auf keinen Fall makellosen, sauberen Code mit ansprechender Architektur und Design in einer beschissenen Codebasis. Was Sie nicht fördern sollten , ist das Verhalten, bei dem ein sachkundiger Entwickler, der an einer beschissenen Codebasis arbeiten muss, versucht, seinen Teil gut zu machen. Anstatt die Dinge zu vereinfachen, werden sie nur noch komplizierter als zuvor. Anstelle von einheitlichem fehlerhaften Code haben Sie jetzt einen Teil mit Entwurfsmustern, einen anderen Teil mit sauberem, klarem Code, einen anderen Teil, der im Laufe der Zeit umfassend überarbeitet wurde, und überhaupt keine Einheit.
Stellen Sie sich zum Beispiel vor, Sie entdecken eine alte Codebasis einer mittelgroßen Website. Sie sind überrascht über das Fehlen einer üblichen Struktur und die Tatsache, dass bei der Protokollierung die Daten manuell an eine Textdatei angehängt werden, anstatt ein Protokollierungsframework zu verwenden. Sie entscheiden sich für die neue Funktion, MVC und ein Protokollierungsframework zu verwenden.
Ihr Kollege implementiert eine weitere Funktion und ist sehr überrascht, dass es kein ORM gibt, in dem eine perfekte Größe erzielt werden kann. Also benutzt er ein ORM.
Weder Sie noch Ihr Kollege können Hunderttausende von Codezeilen durchgehen, um MVC, ein Protokollierungsframework oder ein ORM überall zu verwenden. Eigentlich würde es Monate dauern: Stellen Sie sich vor, Sie würden MVC einführen; wie lange würde es dauern Oder wie wäre es mit einem ORM in Situationen, in denen SQL-Abfragen chaotisch durch Verkettung (mit gelegentlichen Stellen für SQL-Injection) in Code generiert wurden, die niemand verstehen konnte?
Sie denken, Sie haben großartige Arbeit geleistet, aber jetzt muss sich ein neuer Entwickler, der sich dem Projekt anschließt, einer viel größeren Komplexität stellen als zuvor:
Die alte Art, Anfragen zu bearbeiten,
Der MVC Weg,
Der alte Protokollierungsmechanismus,
Das Protokollierungsframework,
Der direkte Zugriff auf die Datenbank mit SQL-Abfragen im laufenden Betrieb,
Der ORM.
An einem Projekt, an dem ich gearbeitet habe, wurden vier (!) Protokollierungs-Frameworks nebeneinander verwendet (plus manuelle Protokollierung). Der Grund dafür ist, dass jedes Mal, wenn jemand etwas protokollieren wollte, es keinen gemeinsamen Ansatz dafür gab. Anstatt ein neues Framework zu lernen (das in allen Fällen nur in 5% der Codebasis verwendet wurde), fügte man einfach ein anderes hinzu weiß schon. Stellen Sie sich das Durcheinander vor.
Ein besserer Ansatz wäre die schrittweise Umgestaltung der Codebasis. Nehmen wir noch einmal das Beispiel der Protokollierung, so würde das Refactoring aus den folgenden kleinen Schritten bestehen:
Suchen Sie alle Stellen, an denen die Legacy-Protokollierung durchgeführt wird (dh, wenn direkt auf die Protokolldatei zugegriffen wird), und stellen Sie sicher, dass alle dieselbe Methode aufrufen.
Verschieben Sie diesen Code gegebenenfalls in eine dedizierte Bibliothek. Ich möchte keine Speicherlogik in meiner Warenkorbklasse protokollieren.
Ändern Sie bei Bedarf die Schnittstelle der Protokollierungsmethoden. Beispielsweise können wir eine Ebene hinzufügen, die angibt, ob die Nachricht informell ist oder eine Warnung oder ein Fehler ist.
Verwenden Sie die neu überarbeiteten Methoden in der neuen Funktion.
Migrieren Sie zum Protokollierungsframework: Der einzige betroffene Code ist der Code in der dedizierten Bibliothek.