Ich habe einen alten Code durchgesehen, den ich geschrieben habe. Es funktioniert, aber es ist kein großartiger Code. Ich weiß jetzt mehr als damals, also könnte ich es verbessern. Es ist kein aktuelles Projekt, aber es ist aktueller, funktionierender Produktionscode. Haben wir die Verantwortung, zurück zu gehen und den Code zu verbessern, den wir in der Vergangenheit geschrieben haben, oder ist die richtige Einstellung "Wenn er nicht kaputt ist, reparieren Sie ihn nicht"? Meine Firma hat vor ein paar Jahren einen Code-Review-Kurs gesponsert, und einer der wichtigsten Aspekte war, dass er manchmal gerade gut genug ist. mach weiter.
Also, sollten Sie es irgendwann einfach als gut genug bezeichnen und weitermachen oder versuchen, Projekte voranzutreiben, um alten Code zu verbessern, wenn Sie denken, dass es besser sein könnte?
Antworten:
Es sei denn, Sie nehmen Änderungen an diesem "alten Code" vor, um Fehler zu beheben oder Funktionen hinzuzufügen, und ich würde mich nicht darum kümmern, ihn zu verbessern. Wenn Sie es eventuell verbessern möchten, stellen Sie sicher, dass Unit-Tests vorhanden sind, mit denen der Code getestet wird, bevor Sie mit der Umgestaltung beginnen.
Sie können den "alten Code" verwenden, um bessere Methoden zu erlernen. Wenn Sie dies tun, handelt es sich um eine Teilzeit-Lernerfahrung, und Sie sollten nicht erwarten, dass dieser Code das ersetzt, was derzeit von Clients / Kunden veröffentlicht oder bereitgestellt wird.
quelle
Überarbeiten Sie die Codebereiche, die Sie am häufigsten ändern müssen . Da Sie diese Bereiche häufig besuchen, verbessert das Refactoring Ihr Verständnis für den Code und die Lesbarkeit, wenn Sie sie erneut besuchen müssen, wohingegen es keinen Grund gibt, Code zu refactor, den niemand mehr sehen wird.
Wenn Sie Codebereiche nur dann umgestalten, wenn Sie sie ändern müssen, gibt dies Ihnen eine gültige Entschuldigung, wenn Ihr Umgestalten eine Regression verursacht . Versuchen Sie natürlich, Ihre Refactorings mit Unit-Tests abzudecken, aber dies ist nicht immer möglich, insbesondere mit Legacy-Code, und Sie sollten damit rechnen, dass große Refactorings von Zeit zu Zeit zu Regressionen führen.
Wenn Sie Features hinzufügen müssen und Ihr Design Sie verlangsamt oder zu Duplikaten führt, müssen Sie den Refactor ausführen . Wenn ich Code entwerfe, kann ich fast nie genau vorhersagen, welche Änderungen in Zukunft erforderlich sein werden. Wenn ich jedoch neue Funktionen hinzufüge, wird der gemeinsam genutzte Code in der Regel umgestaltet. Bis ich einen dritten Feature / Refactoring-Zyklus hinzugefügt habe, zahlt sich mein Refactoring bereits aus und mein gemeinsam genutzter Code ist ziemlich stabil.
TLDR: Refactor nach Bedarf, es besteht keine Verpflichtung.
quelle
Alles, was Sie tun, hat Kosten. Sie haben nur eine begrenzte Zeit zum Programmieren. Alles, was Sie in der Programmierung tun, sollte mit "Was ist der Vorteil davon?" Verglichen werden. und "Was bringt es, etwas anderes zu tun?"
Wenn Sie die Opportunitätskosten nicht berücksichtigen (Was kostet es, etwas anderes zu tun?), Ist die Qualität kostenlos. Es ist besser, den Code zu verbessern. Du wirst etwas lernen. Es wird besser laufen. Es wird mehr verkaufen.
Die eigentliche Frage ist, was das nächstbeste ist, was Sie mit Ihrer Zeit anfangen können. Und dann müssen Sie Kompromisse eingehen.
Wird es mehr von der Software verkaufen?
Wird es weniger Kopfschmerzen verursachen?
Was wirst du lernen?
Wird es ästhetisch ansprechender?
Verbessert es Ihren Ruf?
Stellen Sie diese Fragen (und alle anderen für Sie relevanten) für diese und andere Aktivitäten in Ihrer Warteschlange. Dies hilft Ihnen bei der Beantwortung, wenn es sich lohnt, sie zu beheben. Diese Kompromisse sind der Grund, warum Wirtschaftlichkeit für Programmierer wichtig ist. Joel hat es vor mir gesagt, und ein alter Mentor hat es mir sogar vor Joel gesagt.
Oder wenn Sie eine einfachere Antwort wünschen, hören Sie einfach auf, fernzusehen, bis Sie den Code festgelegt haben. :-)
quelle
Ich denke, Sie sollten sich zunächst die Frage stellen, die Sie vermisst zu haben scheinen. Inwiefern ist der Code schlecht? Und damit stellen Sie sich wirklich die folgenden Fragen:
Wenn es eine Sache gibt, die ich im Laufe der Jahre gelernt habe, ist es, dass Sie es sich nicht leisten können, sich selbst nachträglich zu erraten. Jedes Mal, wenn Sie ein Problem im Code lösen, erfahren Sie etwas und werden wahrscheinlich sehen, wie Ihre Lösung - oder etwas Ähnliches - eine bessere Lösung für ein Problem gewesen sein könnte, das Sie vor Jahren anders gelöst haben. Das ist gut so, denn es zeigt Ihnen, dass Sie aus Ihren Erfahrungen gelernt haben. Die eigentliche Frage ist jedoch, ob der von Ihnen zuvor geschriebene Code wahrscheinlich zu einem Legacy-Problem wird, das mit der Zeit immer schwieriger zu bewältigen ist.
Worüber wir hier wirklich sprechen, ist, ob der Code, der Sie stört, einfach oder schwierig zu warten ist und wie kostspielig diese Wartung im Laufe der Zeit sein dürfte. Dies ist im Wesentlichen eine Frage zur technischen Verschuldung, und ob es sich lohnt, diese Verschuldung mit ein wenig chirurgischer Wartung abzuzahlen, oder ob die Verschuldung klein genug ist, dass Sie sie für eine Weile abrutschen lassen können.
Diese Fragen müssen unbedingt mit Ihrer gegenwärtigen und zukünftigen Arbeitsbelastung verglichen werden und sollten ausführlich mit Ihrem Management und Ihrem Team besprochen werden, um ein besseres Verständnis darüber zu erhalten, wo Ihre Ressourcen investiert werden sollen und ob sich Ihr alter Code lohnt die Zeit, die Sie möglicherweise dafür aufwenden müssen - wenn überhaupt. Wenn Sie ein gutes Geschäftsmodell für die Einführung von Änderungen erstellen können, dann tun Sie dies auf jeden Fall, aber wenn Sie vor dem Drang stehen, Code zu basteln, weil Sie sich für die Art und Weise, wie Sie ihn geschrieben haben, verlegen fühlen, dann schlage ich vor, dass es keine gibt Raum für persönlichen Stolz, wenn es darum geht, alten Code zu pflegen. Entweder funktioniert es, oder es funktioniert nicht, und es ist entweder leicht zu warten oder teuer zu warten, und es ist niemals gut oder schlecht, einfach weil Ihnen die heutige Erfahrung gestern nicht zur Verfügung stand.
quelle
Auf jeden Fall verbessern sich nicht nur aus Gründen es zu verbessern. Wie andere gesagt haben (und es ist gesunder Menschenverstand), werden wir alle mit der Zeit besser (für einen gewissen Wert von "besser"). Das heißt, die Überprüfung des Codes (entweder formal oder informell) beleuchtet häufig diese Teile und Stücke, von denen wir uns wahrscheinlich gewünscht haben, dass sie nie wieder das Licht der Welt erblicken würden.
Obwohl ich nicht der Meinung bin, dass wir die Verantwortung haben , Code zu verbessern, der nicht grundlegend kaputt ist, unsicher ist oder von Funktionen auf einer veralteten / EOL-Liste abhängt, habe ich in dieser Situation in der Vergangenheit einige Dinge getan :
Identifizieren Sie die Mitarbeiter im Team, die wirklich daran arbeiten, den Code zu verbessern, als eine Art Gehirnreinigung oder nette, mundgerechte Aufgabe, die ein Erfolgserlebnis vermittelt, und finden Sie Zeit im Zeitplan, damit sie dies regelmäßig tun können. Ich habe immer mindestens eine dieser Arten von Leuten in einem Team gehabt, und dieser Ansatz kann auch die Moral (oder zumindest die Stimmung) verbessern, wenn wir alle in einer Ruhe- oder Ruhephase sind.
Verwenden Sie es als Grundlage für eine Lernübung. Für Praktikanten, Studenten oder neue / jüngere Teammitglieder bietet die Überarbeitung des alten Codes unter Anleitung älterer Teammitglieder die Möglichkeit, mit neuen Teammitgliedern zu kommunizieren, mehr über das System zu verstehen und sich an das Schreiben zu gewöhnen. Aktualisieren von Unit-Tests und Arbeiten mit kontinuierlicher Integration. Es ist wichtig zu beachten, dass diese Übung mit Anleitung durchgeführt wird und klar umrissen ist , um den Code zu verbessern, da er nicht den aktuellen Standards / Normen entspricht.
Also keine Verantwortung, es zu reparieren, aber das alte Zeug kann wirklich nützlich sein. Und Unit Tests und CI sind deine Freunde!
quelle
Nicht unbedingt. Wenn Sie jedoch eine Codewartung durchführen und zufällig auf etwas stoßen, das besser sein könnte, können Sie dies ändern, sofern Sie über die entsprechenden Komponententests verfügen, um sicherzustellen, dass Sie keine Regression erstellt haben.
Wenn es solche Tests nicht gibt und Sie nicht sicher sind, ob sie sich genau so verhalten, wie sie sollten, sollten Sie sie lieber in Ruhe lassen.
quelle
Aus der Sicht eines Ingenieurs würde ich sicher sehr gerne an altem Code arbeiten, bis er nicht mehr verbessert werden kann. Aber gibt es ein Geschäftsmodell dafür? Letztendlich trägt der Kodex zur Rentabilität Ihres Arbeitsplatzes bei. Wenn nicht, lass es einfach.
Es gibt eine große Einschränkung, wenn Sie durch die Verbesserung des Codes verhindern, dass ein Fehler auftritt (denken Sie an die großen Y2K-Bälle hier oben). und diskutieren Sie die Konsequenzen der Verbesserung des Codes.
quelle
Was mich betrifft, kann die Frage umformuliert und verallgemeinert werden: "Warum sollte jemand zusätzliche Ressourcen ausgeben (Zeit, Geld, Mentales usw.), wenn dieses konkrete Stück Code jetzt gut funktioniert? Ist es nicht eine Verschwendung von Ressourcen? ? "
Jedes Mal, wenn ich einen Legacy-Code finde, denke ich über verschiedene Dinge nach, die mir wichtig erscheinen.
Eigentlich sollten Sie sich viele Fragen stellen. Es gibt keine vollständige und endgültige Liste. Nur Sie und wahrscheinlich Ihre Teamkollegen können die Antwort finden.
PS Mir ist aufgefallen, dass ich den Code sehr oft umschreibe, während mein Freund und Teamkollege dazu neigen, ihn unangetastet zu lassen. Das liegt daran, dass wir die genannten Fragen unterschiedlich beantworten. Und ich muss sagen, dass wir sie sehr oft falsch beantworten ... weil wir die Zukunft nicht vorhersagen können.
quelle
Muss Microsoft Windows aktualisieren? Müssen sich alle * nix Distros weiterentwickeln? Oder ein praktischeres Beispiel: Fährt jeder noch Autos aus den 1970er Jahren?
quelle
Normalerweise können Sie Code beim zweiten Mal besser schreiben. Sie haben mehr über die Domäne gelernt, indem Sie sie ursprünglich geschrieben haben.
Es gibt keine einfache Antwort, ob es sich lohnt, sich neu zu orientieren. Im Allgemeinen sollten Sie dies nicht tun, es sei denn, a) es ist eine gute Lernübung für Sie oder b) Sie würden auf lange Sicht mit besserem Code Zeit sparen. Denken Sie daran, dass bei jeder Änderung Fehler auftreten können.
Als Randnotiz würde ich Unit-Tests nachdrücklich befürworten. Es ist sehr einfach, Refracoring zu verarschen, besonders wenn Sie kein aktuelles Verhalten haben, das mit automatisierten Pausen deutlich gekennzeichnet ist.
quelle
Ich glaube, dass wir die Verantwortung haben, den bestmöglichen Code zu schreiben, den wir heute können. Das bedeutet, dass wir alles verwenden, was wir in der Vergangenheit gelernt haben, und uns weigern, Abkürzungen in unserem Design vorzunehmen. Wenn aufgrund von Termindruck etwas reduziert wird, sollte man meiner Meinung nach nicht einmal an die Qualität unserer Software denken, zum Beispiel an die nette kleine animierte Büroklammer ...
Wenn Sie jetzt arbeiten und feststellen, dass der Code, mit dem Sie interagieren müssen, nicht in dem Maße geschrieben ist, wie Sie gerade schreiben können, ist es sinnvoll, ihn zu korrigieren, WENN Sie es auf kontrollierte methodische Weise tun können. Ich persönlich habe nur sehr wenig Erfahrung mit dieser Art von Refactoring, wie jeder (fast jeder?). Ich habe das Ganze ausprobiert "Lasst uns einfach alles ändern und beten, dass es funktioniert" und bin so schlimm genug durchgefallen. Ich würde vorschlagen, sich Martin Fowlers Diskussionen (entweder sein Buch oder einen von vielen Artikeln ) zu diesem Thema anzuschauen. Er scheint den größten Teil der aktuellen Überlegungen zu diesem Prozess inspiriert zu haben.
Natürlich kann es vorkommen, dass Sie den Code nicht wie gewünscht bereinigen können. Joel Spolsky hat einen Artikel darüber geschrieben, warum Sie möglicherweise ein paar Wochen darauf verwenden möchten, Ihren Code einfach umzugestalten. Lesen Sie es hier und ja, es ist ein bisschen alt, aber ich denke, die Informationen sind immer noch relevant.
Ich hoffe das hilft
quelle
Ich habe das Gefühl, dass das Umgestalten / Verbessern von altem Code den Programmierer selbst definiert. Wenn Sie den Code, den Sie vor einem Jahr geschrieben haben, verbessern möchten, werden nur Ihre Fortschritte angezeigt. Wenn die Anwendung dadurch verbessert wird und Sie über die Fähigkeit, die Zeit und die Genehmigung zur Verbesserung verfügen, können Sie dies tun.
quelle
Besser / verbessert ist ein Mehrachsenvergleich. Denken Sie, Sie können es schneller, kleiner, ressourcenschonender, lesbarer, nützlicher, präziser, flexibler, allgemeiner und auf mehr Systemen lauffähig machen und die Abhängigkeit von einem separaten Produkt beseitigen?
Warum sollte Ihr Unternehmen Sie dafür bezahlen, diesen Code neu zu schreiben, anstatt neuen Code zu schreiben oder einen anderen Code zu schreiben?
Sie sollten Verbesserungen vornehmen, wenn sich eine Gelegenheit bietet. Gelegenheit bedeutet jedoch, dass Sie entweder bereits am Code arbeiten oder einen geschäftlichen Grund für die Änderung angegeben haben.
Wenn eine Änderung in der Produktion vorgenommen wird, besteht die Gefahr, dass Dinge kaputt gehen (Einheits- und Funktionstests verringern diese Chance nur, sie beseitigen sie nicht) und sollten nur durchgeführt werden, wenn der erwartete Nutzen das Risiko überwiegt.
Was ist ein weiterer zu berücksichtigender Punkt? WOLLEN Sie diese Änderung auf die Produktion oder einfach auf die Entwicklungsbranche übertragen? Die Balken für die beiden Szenarien sind völlig unterschiedlich. Wenn es nur in der Entwicklungsbranche eingesetzt wird und möglicherweise nie in Produktion geht, bedeutet Gelegenheit im Grunde, dass Sie sich den Code aus irgendeinem Grund ansehen und es nicht zeitaufwändig ist, dies zu tun. Es kann nach Bedarf überprüft werden, falls jemals ein Push stattfinden sollte, und es kann weggelassen werden, wenn es zu diesem Zeitpunkt als ungerechtfertigt angesehen wird. Wenn es andererseits jetzt zur Produktion geht, wie ich oben sagte, müssen Sie prüfen, ob diese Änderung die Kosten wert ist: in Bezug auf die Zeit, die für den Push aufgewendet wurde, und die Vorteile der Verwendung des neuen Codes.
quelle
Eine gute Faustregel ist, dass Sie, wenn Sie Zeit brauchen, um zu verstehen, was der Code tut, und wenn diese Zeit durch einige gut ausgewählte Refactorings in Zukunft verkürzt werden könnte, die Bedürfnisse des Unternehmens und Ihres Teams bedienen diese Schritte unternehmen.
Wenn der Code nicht von Ihrer Analyse profitiert, wenn die Feldnamen nicht Ausdruck der Codeabsicht sind und die Methoden nicht in lesbare Abschnitte unterteilt wurden, hat das Unternehmen etwas Wertvolles verloren: Ihren Kenntnisstand. Mit Tools wie Visual Studio und ReSharper sind solche Refactorings sicher, logisch neutral und von potenziell hohem Wert für die zukünftige Produktivität und das Vertrauen der Entwickler.
Wie Onkel Bob Martin sagt: "Verlassen Sie den Campingplatz immer sauberer, als Sie ihn vorgefunden haben."
quelle
Dies ist eine Frage, die Sie dem Management Ihres Unternehmens stellen sollten.
Haben Sie die Zeit und die Ressourcen, um zurück zu gehen und Änderungen am alten Code vorzunehmen?
Haben Sie die Zeit und die Ressourcen, um ein QA-Team zu testen, was Sie geändert haben, um sicherzustellen, dass es nicht kaputt ist?
Ich bin zuvor in diese Falle geraten, als ich mich in einem Modul befand, das einen Fehler behebt, und habe gesehen, wie ich oder jemand anderes einen ineffizienten oder ineleganten Code geschrieben habe, ihn geändert und am Ende mehr Probleme zu lösen gehabt, als wenn ich nur einen Fehler behoben hätte Der Fehler, den ich beheben sollte.
quelle
Es hängt davon ab, ob.
Wenn der fragliche Code wirklich kaputt ist und Fehler enthält, die zwangsläufig an einer Stelle auftauchen (z. B. ein Zähler, der irgendwann überläuft und böse Probleme verursacht), lohnt es sich, diese zu beheben - aber wenn Sie Setzen Sie alle möglichen Sicherheitsvorkehrungen in Kraft, um neue Fehler zu vermeiden: Stellen Sie sicher, dass Sie aussagekräftige Komponententests haben, die alles abdecken, was Sie berühren, lassen Sie alle Änderungen von einer kompetenten Person überprüfen, bestehen Sie auf gründlichen Tests, und stellen Sie sicher, dass Sie zu den alten zurückkehren können Sie können die Daten jederzeit sichern, bevor Sie in die Produktion gehen, zuerst in einer Akzeptanzumgebung bereitstellen und sie von tatsächlichen Benutzern testen lassen usw. Sie sollten auch die Genehmigung einholen, bevor Sie fortfahren: Wenn der Fehler wirklich eine Zeitbombe ist und Ihr Manager ist etwas kompetent,Sie können ihn / sie davon überzeugen, dass Sie das Problem beheben (und wenn Sie keine Genehmigung erhalten, ist dies möglicherweise ein Zeichen dafür, dass Sie sich irren).
OTOH, wenn Ihre Beschwerde nur ein Mangel an Code-Eleganz ist, dann trauen Sie sich nicht, sie anzufassen. Es leistet seit einiger Zeit treue Dienste in der Produktion, eine Änderung des Codes würde Sie nur zufriedenstellen, aber keinen Mehrwert schaffen, und wie bei jeder Änderung besteht die Gefahr, dass Sie etwas kaputt machen. Selbst wenn Sie dies nicht tun, ist Ihre Zeit wertvoll (im wahrsten Sinne des Wortes: Sie werden für das bezahlt, was Sie tun, und jede Minute Ihrer Zeit kostet Geld), und da Sie keinen tatsächlichen Wert hinzufügen, wäre dies eine Änderung ein Nettoverlust für das Unternehmen und das Projekt.
quelle