Wann ist es akzeptabel, kaputte Fenster NICHT zu reparieren?

21

Gibt es in Bezug auf zerbrochene Fenster Zeiten, in denen Refactoring für eine zukünftige Aktivität am besten geeignet ist?

Wenn beispielsweise ein Projekt zum Hinzufügen einiger neuer Funktionen zu einem vorhandenen internen System einem Team zugewiesen wird, das bisher noch nicht mit dem System gearbeitet hat, und eine kurze Zeitleiste für die Arbeit erhalten hat - kann dies jemals gerechtfertigt sein? Verschieben Sie größere Überarbeitungen des vorhandenen Codes, um die Frist in diesem Szenario zu verkürzen.

Bullines
quelle
6
Manchmal entscheidet der Chef, dass kaputte Fenster nicht repariert werden, weil er weiß, dass er viel mehr Geld verdienen wird, wenn er das ganze Haus später repariert.
Mouviciel
1
Grundregel: Technische Schulden sind in Ordnung, um eine Frist zu erreichen, müssen aber irgendwann ausgeglichen werden und je früher desto besser
JF Dion
4
Herzliche Glückwünsche! Sie haben die "Design-Philosophie" von PHP perfekt beschrieben.
ThomasX
1
eine Kuriosität: docs.jquery.com/Won't_Fix
Jonathan dos Santos
4
Morgen kommt nie ...
Eric King

Antworten:

25

Refactoring ist und sollte ein fortlaufender Prozess sein. Es reicht nicht aus, nur die Anforderungen mit einer funktionierenden und getesteten Implementierung zu erfüllen, die noch ein wenig unvollständig ist.

"Lass es funktionieren, dann lass es besser funktionieren" .

Ich kann mich nicht erinnern, wo ich dieses Zitat gelesen habe, aber dies ist der Schlüssel, um Refactoring gut anzuwenden, und ich halte es für unprofessionell, etwas anderes zu tun.

Kontinuierliches Refactoring ist wie das Aufwischen von verschüttetem Material während des Kochens und das Reinigen des Geschirrs nach dem Essen. Gezieltes Refactoring ist wie das Auffinden einer schmutzigen Küche, hat aber nur die Zeit, ein oder zwei schmutzige Gläser zu waschen. Möchten Sie lieber mit einer durchgehend schmutzigen Küche leben, oder möchten Sie die Dinge lieber sauber halten?

Sie bringen den Code zum Laufen und überarbeiten ihn dann, um sicherzustellen, dass Sie die bestmögliche Implementierung haben, die Sie möglicherweise verwenden können. Wenn Sie etwas Vertrautes tun, kann es sein, dass Sie den besten Code zum ersten Mal implementieren. Es lohnt sich jedoch, einen Moment zu dauern, um Ihre Arbeit zu überprüfen, um sicherzugehen. Wenn es so aussieht, als könnten Sie Ihren Code verbessern, versuchen Sie eine Umgestaltung, um sicherzustellen, dass Ihr Code mindestens so schlank und sauber ist, wie Sie ihn erstellen können. Dies bedeutet, dass Sie den Betrag der technischen Schulden, die Sie hinterlassen, reduzieren und das Lesen und Umgestalten erleichtern, wenn der Code das nächste Mal bearbeitet werden muss. Dies ist der Kernwert hinter dem TDD-Mantra "Red-Green-Refactor", mit der Ausnahme, dass es sich auszahlt, wenn Sie in TDD in erster Linie die Duplizierung entfernen, auch andere Elemente zu überprüfen, die überarbeitet werden könnten, wie große Klassen, lange Methoden,

Wenn Sie vor einem größeren Umbau stehen, können Sie ihn möglicherweise für eine Weile verschieben, insbesondere wenn Sie in Ihrem Zeitplan zu wenig Zeit haben. Dies setzt jedoch voraus, dass die Funktionalität Ihres Codes nicht beeinträchtigt wird und dass die Implementierung weiterhin den Anforderungen entspricht. Diese Art von Situation sollte selten vorkommen, und Sie können dazu beitragen, dass sie noch seltener auftritt, wenn Sie währenddessen kontinuierlich umgestalten. Noch wichtiger ist jedoch, dass Sie nicht riskieren können, größere Änderungen zu lange aufzubewahren. Andernfalls entsteht später eine noch größere Arbeitslast, deren Behebung entweder viel kostspieliger oder sogar noch kostspieliger sein kann Projektfehler.

Ich habe den Eindruck, dass viele Leute dazu neigen, die Definitionen für Refactoring und Re-Engineering zu verwechseln . Die beiden Begriffe beschreiben Strategien zum Umgang mit sehr unterschiedlichen Situationen. Wenn Sie eine Neuentwicklung durchführen möchten, verpflichten Sie sich zu einer drastischen Änderung, die das Verhalten eines Systems verändert. Dies macht einige Tests ungültig und erfordert auch neue Tests. Mit dem Refactor stellen Sie sicher, dass sich Ihr System weiterhin genau verhältWie vor der Änderung stellen Sie jedoch auch sicher, dass Ihr Code eine lange Lebensdauer hat und sich im Laufe der Zeit einfacher warten lässt. Sie "pimpen" Ihren Code nicht für die Hölle, sondern verpflichten sich zu einem professionellen Standard für sauberen Code, der das Risiko von Fehlern verringert und sicherstellt, dass die Arbeit mit Ihrem Code ein Vergnügen bleibt und einen professionellen Standard aufweist .

Zurück zu der Analogie der zerbrochenen Fenster. Wenn Sie das Fenster zerbrechen, sollten Sie es sofort reparieren. Wenn Sie nicht bemerkt haben, dass ein Fenster zerbrochen ist, müssen Sie die Kosten selbst bestimmen, wenn Sie das Fenster zerbrochen lassen. Nun wiederholen Sie die letzten beiden Sätze, aber Ersatz Bug für Fenster. Sie brauchen am Ende eine andere Strategie. Wenn Sie beim Codieren einen Fehler verursacht haben, können Sie diesen sofort beheben oder feststellen, ob die Änderungen einen erneuten Engineering-Aufwand erfordern, und Sie treffen eine kommerzielle Entscheidung, wann das Problem am besten behoben werden kann. Damit Sie ein Problem nicht umgestalten, sondern umgestalten, um sicherzustellen, dass es einfacher ist, Probleme zu finden und zu beheben. Es ist mir egal, wie erstaunlich Sie Ihren Code finden, komplexe Systeme werden immer Probleme haben, die im Laufe der Zeit behoben werden müssen. Das ist es, worum es bei technischen Schulden geht und warum das Refactoring ein fortlaufender Prozess sein muss, während Sie Ihren Code implementieren , und nicht für eine willkürliche zukünftige Zeit.

Kurz gesagt, die Antwort, dass es in seltenen Fällen akzeptabel ist, größere Änderungen am Code aufzuschieben, um eine Frist zu setzen, sollte jedoch nicht als übliche Praxis angesehen werden, Refactoring als eine Übung zu behandeln, die von Ihrer täglichen Implementierungsarbeit unabhängig ist, und mit Sicherheit Niemals als Ausrede von Teams verwendet, die mit der Codebasis nicht vertraut sind, um zu vermeiden, dass ihre Implementierung so schlank und sauber ist, wie sie es unter den gegebenen Umständen möglicherweise schaffen können.

S.Robins
quelle
Wie das Zitat.
Marjan Venema
1
An zu vielen Orten sind "seltene Zeiten" die Norm.
ozz
2
Wenn nur die PHP "Designer" dieses Zitat erkennen würden ...
ThomasX
1
Tolles Zitat, denken Sie darüber nach - möchten Sie, dass Ihr Autolackierer dieselbe Logik bei der Reparatur Ihres Toyota von 1999 anwendet - und wenn ja, sind Sie bereit, für eine Roll Royce-Lackierung eines 1000-Dollar-Autos zu bezahlen?
Mattnz
@mattnz Deine Analogie gilt nicht wirklich für die Softwareentwicklung. Hierbei handelt es sich nicht um eine "Vergoldung", sondern um eine relativ kostengünstige Anzahlung, um sicherzustellen, dass sich Ihre Investition maximal auszahlt. Wenn Sie Ihre Lackanalogie stehlen, ist es auch der Unterschied, ob Sie mit einem breiten Pinsel einen Anstrich auf Ihr Auto auftragen oder eine Lackierkabine verwenden, um ein schönes, gleichmäßiges Finish zu erzielen. Sie bekommen das, wofür Sie bezahlen, möchten also die Gebühr eines Profis bezahlen und einen halbfertigen Job erhalten? Kürzungen können kurzfristig ein wenig einsparen, führen aber langfristig zu einer höheren technischen Verschuldung.
S.Robins
11

Einige Entwickler sagen, dass sie "kaputte Fenster reparieren", wenn sie wirklich "die Liegestühle auf der Titanic neu ordnen". Das Refactoring von Code, der funktioniert, aber Ihren Geruchssinn beleidigt, ist relativ einfach. Wenn Sie feststellen, dass Sie immer wieder auf diese Art von Aufgaben zurückkommen, anstatt neue Funktionen für Ihre Benutzer hinzuzufügen oder die App für diese besser nutzbar zu machen (Optimierung bedeutet, dass die App schneller ausgeführt wird, Optimierung bedeutet, dass der Code besser lesbar ist) anders) dann räumst du vielleicht zu viel auf. Nicht weil Aufräumen schlecht ist, sondern weil das Unternehmen für Entwicklung zahlt, um etwas zu entwickeln. Sie wollen zwar keine spröde, schwer lesbare, schlecht strukturierte Lösung, aber sie wollen auch keine polierte und schöne halbe Lösung.

Räumen Sie auf, wenn Sie etwas Einfaches tun müssen, um loszulegen, oder wenn Sie darauf warten, dass ein anderes Team Ihnen mitteilt, ob Ihr Problem tatsächlich seine Schuld ist, oder wenn Sie auf eine Entscheidung warten. Es wird viele Möglichkeiten geben. Wenn Sie die Möglichkeit haben, die gesamte App voranzutreiben, nehmen Sie sie, es sei denn, Sie spüren, dass das Ganze brüchig geworden ist. Es hat wahrscheinlich nicht. Sie haben die Möglichkeit, eine Umgestaltung vorzunehmen - darüber brauchen Sie sich keine Sorgen zu machen.

Um auf die zweite Hälfte Ihrer Frage zurückzukommen, einen Sprint, bei dem Features hinzugefügt werden, die sich auf eine kurze Zeitleiste beziehen, wäre es falsch zu sagen: "Und wir werden kein Refactoring durchführen, wir haben keine Zeit." Es wäre auch falsch zu sagen: "Ich weiß, es sind 6 Wochen vergangen und es sieht für die Benutzer genauso aus, aber diese zerbrochenen Fenster mussten wirklich repariert werden." Passen Sie das Refactoring in die Lücken ein, die in einem Projekt auftreten. Nehmen Sie keine Zuflucht zum Aufräumen auf Kosten des Projektziels.

Kate Gregory
quelle
4
Einige Entwickler sagen, dass sie "kaputte Fenster reparieren", wenn sie wirklich "die Liegestühle auf der Titanic neu ordnen" - tatsächlich scheint es für Entwickler oft schwierig zu sein, den Unterschied zwischen "technischen Schulden" und "nicht so, wie ich es tun würde" zu erkennen habe es geschafft "
RevBingo
9

Aus betriebswirtschaftlicher Sicht ist Refactoring eine spekulative Investition. Sie investiert jetzt Zeit und Mühe (Geld) in der Hoffnung, dass sie irgendwann in Zukunft mehr Zeit und Mühe (Geld) spart.

Ohne in die Debatte darüber einzutreten, wie viel Aufwand beim Refactor in der Zukunft gespart wird (dies hängt von zu vielen Variablen ab, um hier eine bedeutungsvolle Diskussion zu führen), ist es klar, wann der "Kapitalwert" refactor ist. von den Kosten, die sie hinterlassen, übersteigen sie die Kosten, die jetzt anfallen.

Das ist einfach, außer Sie haben keine Ahnung, wie viel die Zukunft kosten wird. Sie müssen auch alle normalen Finanzplanungsideen berücksichtigen, wie z. B. Kapitalrendite, Risikomanagement (Markenwert, rechtliche Haftung, versicherbares versus nicht versicherbares Risiko), Oppertunitätskosten usw.

In den meisten Fällen ist es Sache der Verantwortlichen, zu entscheiden, wann eine Umgestaltung durchgeführt werden soll. Trotz der vielen Plakate in dieser Forensprache wissen Manager in der Regel mehr über die Führung eines Unternehmens als Programmierer. Sie haben ein größeres Bild vor Augen, das die Maximierung der Rendite für den Aktionär einschließt. Es ist selten, dass das Reparieren von Dingen, die nicht kaputt sind, dazu beiträgt, Code ist keine Ausnahme.

Bearbeiten: Ich habe einen interessanten Artikel über die Wartung von Zeitplänen für kritische Infrastrukturen gelesen. Das Wesentliche ist, dass die Bewegung nicht routinemäßig gewartet werden muss (Refactor), um bei Bedarf repariert zu werden (Fix Bugs). Der Hauptunterschied besteht in den Überwachungsebenen - zum Beispiel überwacht ein Kernkraftwerk sehr genau und behebt Fehler, wenn sie "kaputt" sind, jedoch lange vor dem Ausfall. Es hat sich gezeigt, dass das Reparieren an einer Wartungs-Scheule nicht nur mehr kostet, sondern aufgrund von Ausfällen, die durch das Wartungs-Programm verursacht werden, weniger zuverlässig ist. Eine ähnliche Idee ist für Software erforderlich - Refaktorieren der Bits, die kurz vor dem Brechen stehen -, die Sie nur durch Messung erkennen können.

mattnz
quelle
4
+1 trotz Rechtschreibfehlern :); Meistens bezahlt der Kunde nicht für sauberen Code - er bezahlt für ein Ergebnis. Wenn Sie sauberen Code und keine Ergebnisse haben, werden Sie nicht bezahlt und Sie werden nicht sehr lange umgestalten.
Jasonk
2
Ich möchte nur darauf hinweisen, dass es durchaus üblich ist, dass Manager das Geschäft als Ganzes besser verstehen. Leider wissen sie oft SCHLECHTER, was der fehlerhafte Code in Zukunft kosten wird. Stellen Sie daher sicher, dass Ihr Manager über einige angemessene Kostendaten verfügt, mit denen Sie arbeiten können, wenn Sie dem Manager vertrauen, dass er diese Entscheidung trifft.
Michael Kohne
Die andere Art, Refactoring zu betrachten, ist nicht als Zielaufgabe zu entscheiden, sondern als Mittel, um sicherzustellen, dass Sie bei der Entwicklung eines Systems nicht über sich selbst stolpern. Oft werden Sie feststellen, dass schlecht faktorisierter Code Sie veranlasst, die Tests weiter zu modifizieren und dabei zu versuchen, Flecken zu löschen. Dies kann Ihren Kunden im Vorfeld mehr kosten. Code sauber zu halten sollte nicht als Vergoldung des Codes angesehen werden, sondern als Beibehaltung eines professionellen Standards, um erfolgreiche Ergebnisse zu erzielen.
S.Robins
1
@ S.Robins Wir sprechen von Refactoring und nicht von schlecht faktorisiertem Code (in meinen Augen ist der zweite ein Problem, der erste ist schön zu haben).
Jasonk
5

Es ist akzeptabel, wenn der Schaden für das Unternehmen durch das Reparieren größer ist als durch das Nicht-Reparieren.

Situationen, in denen dies auftritt, können sein:

  • wo ein Termin oder eine Geschäftsmöglichkeit wegen der Zeit verpasst werden könnte, die zur Lösung benötigt wird
  • Wenn ein Teil des Codes (wirklich) in sehr kurzer Zeit ausgemustert werden soll, hat die Umgestaltung des Codes fast keinen Nutzen.

Und diese Situationen treten auf - kommerzielle Situationen werden oft künstliche Fristen einführen, die eingehalten werden müssen, wenn die Gelegenheit zur Aushandlung verstrichen ist, und Anforderungen, die eine zeitliche Komponente haben - zum Beispiel eine Änderung der Gesetzgebung oder der Steuervorschriften, die in Kraft treten von ein bestimmtes Datum - existieren.

Der Trick besteht darin, diese Situationen zu identifizieren und richtig einzuschätzen. Code, der voraussichtlich in den Ruhestand geht, bleibt oft jahrelang bestehen. Künstliche Fristen müssen möglicherweise eingehalten werden, sie können jedoch häufig auf unterschiedliche Weise eingehalten werden (z. B. kann Software zu einem bestimmten Zeitpunkt präsentiert, vorgeführt und "gestartet" werden, ohne dass die endgültige Release-Version erst später fertiggestellt werden muss).

Wenn Sie mit so etwas konfrontiert werden, müssen Sie offen darauf zugehen, aber immer fragen, ob es das ist, was es aussieht? Sind die Annahmen realistisch? Gibt es eine andere Möglichkeit, das Ziel zu erreichen, ohne minderwertigen Code zu versenden? Wenn nicht, wie nutze ich die verfügbare Zeit am besten?

Und wenn es keine Alternative gibt, immer gut, aber wann werden wir das beheben?

Denn es sollte fast, fast immer wann sein , nicht wenn .

Jon Hopkins
quelle
Betreff: künstliche Fristen; In der idealen Welt sollte jedes anständige Projekt eine Frist haben. Ich habe von Produktteams gehört, die eine Woche auslassen können (eine Woche ist keine große Sache, oder?) - ohne den geschäftlichen Anreiz zu bemerken -, dass Sie dies nach dem schwarzen Samstag gegenüber dem Vorjahr getan haben. Schlechter Zug.
Jasonk
3

Wenn Manager beschließen, technische Schulden aufzubauen . Dies ist eine faire Entscheidung, wenn man zum Beispiel nur einen frühen Prototypen an einige Erstkunden ausliefern möchte, um ein frühes Feedback zu erhalten.

David
quelle
4
Es kommt viel zu oft vor, dass Manager zulassen, dass technische Schulden zu einem engen Termin fällig werden. Statt die Schulden so schnell wie möglich zurückzuzahlen, steht der nächste Termin bevor , und stattdessen planen sie rechtzeitig für bevorstehende Arbeiten und frühere Schulden wird die Verschuldung ignoriert und die benötigte Zeit mit zusätzlichen neuen Funktionen für die Freigabe gefüllt. Mit anderen Worten, die Schulden werden niemals zurückgezahlt, und bevor Sie erkennen, wie tief das Projekt in der Krise steckt, ist es zu spät, etwas zu unternehmen, um die außer Kontrolle geratene Problemspirale zu vermeiden. Es ist in Ordnung, Schulden zu akkumulieren, solange Sie diese tatsächlich schnell abbezahlen.
S.Robins
2
Einige Manager (insbesondere nicht technische) haben keine Ahnung, wovon Sie sprechen, wenn Sie technische Schulden erwähnen. Einige denken sogar, dass Sie versuchen, sie dazu zu bringen, einfach wegzugehen und mit Dingen zu spielen, anstatt echte Arbeit zu leisten.
quick_now
Das ist der Grund, warum unsere Organisation keine Manager hat: Open-Org.com;)
David
1
Die meisten Manager sind nicht intelligent genug, um die Nachteile der technischen Verschuldung zu verstehen. Sie haben also technische Verschuldung, die so lange ansteigt, bis Sie technisch bankrott gehen und gezwungen sind, das gesamte System neu zu schreiben.
Wayne Molina
1

Sie können sich das genauso vorstellen, als würden Sie um Gutschrift bitten. Ist es in Ordnung, kurzfristig Geld für eine Investition in X zu leihen und langfristig zu bezahlen? Es gibt keine definitive Antwort, es kann im besten Interesse der Organisation sein (z. B. um die aktuellen Kundenerwartungen zu erfüllen) oder es kann eine Katastrophe sein, wenn dies verantwortungslos geschieht.

Alles hängt von Prioritäten ab, und das Management sollte sich darüber im Klaren sein, dass jedes Mal, wenn Sie zerbrochene Fenster verlassen, die Priorität Nummer eins verlangsamt wird, obwohl die Priorität Nummer eins darin besteht, dass "Code funktioniert", neue Funktionen implementiert werden und die Kundenerwartungen erfüllt werden schwieriger und erfordern mehr Ressourceninvestitionen. Außerdem ist es in 99% der Fälle nicht möglich, die Entwicklung neuer Funktionen einzustellen und alle Anstrengungen auf die "Korrektur der Codebasis" zu konzentrieren.

Fazit: Ja, es ist akzeptabel, manchmal zerbrochene Fenster zu lassen, genauso wie es akzeptabel ist, um einen Kredit zu bitten. Denken Sie daran, dass Sie in Zukunft wirklich, wirklich dafür bezahlen müssen. Und in Zukunft wird die Zeit dafür höchstwahrscheinlich nicht viel länger sein als die Zeit, die Sie jetzt haben.

jlemos
quelle
0

Normalerweise sollten Sie das Problem beheben, wenn Sie dazu in der Lage sind. Dadurch wird potenzieller Zeitaufwand für die Wartung vermieden. Einige barbarische, nicht agile Praktiken neigen jedoch dazu, den Status quo so lange aufrechtzuerhalten, wie er funktioniert. Einige Manager haben Angst vor den "unvorhergesehenen Auswirkungen" der Änderung.

Ich nehme an, es nur zu lassen, wenn es so funktioniert, wie es sollte (nur durch Optimierung, aber nicht durch Funktionalität unterbrochen), und Sie haben keine Zeit, es zu testen, wenn Sie einige Umgestaltungen vornehmen. Sie sollten jedoch beachten, dass dies später so bald wie möglich behoben werden sollte.

Wenn die Funktionalität nicht mehr funktioniert und Sie neue Funktionen benötigen, ist es am besten, sie so schnell wie möglich zu beheben.

Dorward Villaruz
quelle
0

Die meisten Programmierer haben es sich zur Aufgabe gemacht, Geld für ihren Arbeitgeber zu verdienen. Also, wann sollte Refactoring stattfinden: Wenn es Ihr festes Geld verdient. Refactoring ist Zeit, die nicht für andere Projekte aufgewendet wurde, und Zeit, die in Zukunft für dieses Projekt gespart wurde.

Ob es sich lohnt, liegt meistens bei Ihrem Vorgesetzten.

Pieter B
quelle
1
-1; Diese Einstellung führt dazu, dass Software-Systeme ins Stocken geraten, weil Refactoring als "Zeit betrachtet wird, die für neue Dinge aufgewendet werden könnte".
Wayne Molina
1
Refactoring IST Zeit, die nicht für neue Dinge aufgewendet wird.
Pieter B
@Wayne M: Dinge, bei denen Software-Ingenieure normalerweise nicht entscheiden können, was sie tun, was das Unternehmen und die Manager tun. Natürlich möchte jeder , wann immer er möchte, umgestalten, aber es ist wirklich nicht die Realität ... zumindest in meinen 7 Jahren Berufserfahrung.
James
+1 Diese Art von Einstellung ist es, die demjenigen, der Ihr Gehalt zahlt, einen Wert verleiht. Ohne sie könnte Ihr ganzer Job ausgelagert werden.
MarkJ
0

Die Programmierer sollten die Geschäftsseite über das Ausmaß der technischen Verschuldung informieren, damit sie eine fundierte Entscheidung treffen können. Wenn die Notwendigkeit, früher auf den Markt zu kommen, das Risiko Ihres Codes überwiegt, haben Sie nicht viel Auswahl. Mangelnder Cashflow wird viele technische Entscheidungen übersteigen.

Um einige der Probleme in eine nichttechnische Perspektive zu rücken, weisen Sie auf die längere Zeit hin, die erforderlich ist, um Fehler zu beheben und neue Funktionen hinzuzufügen. Wenn das Management einen Vertriebs- und Marketing-Hintergrund hat, kann es dies verstehen. Sie hassen es, Kunden sagen zu müssen, dass diese Dinge länger dauern werden.

Wenn Sie überlegen, Ihr Team zu erweitern, ist dies möglicherweise ein guter Zeitpunkt, um einen Junior-Entwickler einzustellen. Testberichterstattung wird in diesem Fall ein großer Retter sein. Sie lernen mehr, indem sie die Dokumentation lesen.

JeffO
quelle
0

Kann es jemals gerechtfertigt sein, größere Umgestaltungen des vorhandenen Codes aufzuschieben, um die Frist in diesem Szenario einzuhalten?

  • Wenn etwas kaputt ist, dann höchstwahrscheinlich nicht. Sie werden kein Auto mit teilweise funktionierenden Bremsen fahren, oder? (Es sei denn, das Risiko, nicht rechtzeitig irgendwohin zu gelangen, ist größer als das Risiko eines Absturzes aufgrund der fehlerhaften Bremsen.) Keine ideale Lösung, aber leider passiert es.

Wenn Sie jedoch über das Re-Factoring von Arbeitscode sprechen, würde ich Folgendes in Betracht ziehen:

  • Wenn es nach unseren leitenden Entwicklern oder technischen Direktoren ginge, würden wir niemals Software veröffentlichen. Wir haben immer den Perfektionismus überarbeitet und danach gestrebt.

  • Wenn sich das Re-Factoring negativ auf die Rentabilität des Geschäfts auswirkt, sollte es neu geplant werden.

  • Wenn Ihr Unternehmen versprochen hat, bestimmte Funktionen bis zu einem bestimmten Datum bereitzustellen, werden Sie später eine Umgestaltung vornehmen. Denken Sie an die Wohltätigkeitsorganisation Red Nose Day - jedes Jahr können Spenden für einen Zeitraum von 24 oder 48 Stunden gesammelt werden. Es gibt keine Möglichkeit, dass sie ihre Codebasis neu faktorisieren, wenn sie glauben, dies könnte sie davon abhalten, in dieser Zeitspanne Spenden zu erhalten. Darüber hinaus ist es sehr wahrscheinlich, dass sie sich dafür entscheiden, nicht neu zu faktorisieren, wenn ein Fenster zerbrochen ist, dies jedoch keine Auswirkungen auf ihre Fähigkeit zur Entgegennahme von Spenden hat.

  • Sie werden immer einen besseren Weg finden, um etwas zu tun. Es ist ein natürlicher Prozess und es ist sehr wichtig, eine Grenze ziehen zu können.

CodeART
quelle
Wäre nett, wenn wir ein Feedback zu Abstimmungen bekommen würden: D
CodeART
2
Einverstanden, mit so vielen Minus-Stimmen, sieht es so aus, als hätte jemand gerade einen schlechten Tag gehabt und sich durch ein Bündel von Down-Stimmen gestampft.
Sam Goldberg
-1

Als Antwort auf Ihre Frage zum Refactoring würde ich "Ja" sagen. Wie jemand anderes in den Antworten oben ausgeführt hat, ist das Refactoring ein fortlaufender Prozess, und manchmal gibt es taktische und geschäftliche Entscheidungen, die die Notwendigkeit überflüssig machen, bereits funktionierenden Code umzuschreiben (wenn auch vielleicht auf kluge Weise).

In Bezug auf "kaputte Fenster": Ich habe diesen Begriff zum ersten Mal vor ungefähr 10 Jahren im Zusammenhang mit der Softwareentwicklung gehört. Zu dieser Zeit wurde es jedoch verwendet, um das Zulassen von Tests mit defekten Einheiten zu beschreiben . Dies beschreibt das Szenario, in dem Benutzer versucht sind, defekte Komponententests nicht zu reparieren, da es zweckmäßiger erscheint, sich nur daran zu erinnern, welche Tests "in Ordnung sind, um fehlzuschlagen", anstatt die defekten Tests zu reparieren (die aufgrund von Schnittstellen oder Anforderungen gültig defekt waren) Änderungen, zum Beispiel).

Ich denke, die Anwendung der Metapher für zerbrochene Fenster auf Komponententests ist passender und beschreibt die Gefahr, "zerbrochene Fenster" in der Nachbarschaft der Software zuzulassen. Wenn Sie von defekten Komponententests (wie zerbrochenen Fenstern) sprechen, ist die Antwort meiner Meinung nach, dass dies niemals in Ordnung ist. (Soweit wir jemals nie sagen können ...)

Sam Goldberg
quelle
Was ist der Grund für die Abwahl? Etwas gesagt hier nicht richtig? Oder nur rachsüchtige Redakteure?
Sam Goldberg
-1

Wenn es wirklich kaputt ist, sollte es repariert werden.

Aber ist es wirklich kaputt? Sind Sie sicher, dass Sie nicht einfach "nicht hübsch" mit "kaputt" gleichsetzen?

Sie müssen eine Berechnung des "versunkenen Werts" anwenden, bevor Sie den Arbeitscode neu faktorisieren, weil Sie den Stil nicht mögen oder weil Sie glauben, dass er in Zukunft Probleme verursachen wird.

Für das Re-Factoring von Code, den Sie in der letzten Woche geschrieben haben, sind die gesunkenen Kosten die Zeit, die Sie damit verbracht haben, den Code in der letzten Woche zu programmieren.

Re-Factoring-Code, der den Komponententest durchlaufen hat. Jetzt müssen Sie nicht nur neu schreiben, sondern alle bisher durchgeführten Tests neu definieren und erneut ausführen. Dies sieht langsam teuer aus.

Re-Factoring-Code, der in die Produktion gegangen ist. Es müssen noch weitere Tests durchgeführt werden, und die Benutzer werden informiert. Außerdem besteht das Risiko, dass etwas ausgeliefert wird, das nicht so gut funktioniert wie das alte Release. Sie müssen dies begründen und mit dem großen Chef klären, bevor Sie fortfahren.

Re-Factoring-Code, der seit einiger Zeit in der Produktion ist und mehrere Releases und Fehlerbehebungen durchlaufen hat. Wenn Sie nicht wissen, dass die Software nicht mehr funktioniert, gehen Sie nicht einmal dorthin!

James Anderson
quelle
Normalerweise geht "nicht schön" mit "kaputt" einher. Code, der nicht korrekt geschrieben wurde, ist schwieriger zu warten und um neue Funktionen zu erweitern. Daher müssen Sie diesen Code eventuell neu schreiben, da Sie das Refactoring auf diesem Weg vernachlässigt haben.
Wayne Molina
2
Code, der getestet und in der Produktion ohne ausstehende Fehlerberichte ist, ist Arbeitscode. Es wurde viel Zeit und Geld investiert, um es in diesen Zustand zu bringen. Hübscher Code ist genau das - hübscher Code.
James Anderson
Ich stimme dir nicht zu. Code kann funktionieren, es ist jedoch mühsam, Features zu warten und hinzuzufügen. Code wie dieser ist kaputt, weil er starr und "stinkend" ist. Richtig geschriebener Code ist oft hübsch UND getestet UND vor allem einfach zu pflegen und zu verbessern.
Wayne Molina
@ Wayne M: Wow, Wayne, du hast wirklich keine Ahnung. Wenn Sie es jemals zu PM schaffen, werden Ihre Entwickler Sie lieben, aber Ihre Karriere wird wahrscheinlich nicht lange dauern. Sie müssen die Linie irgendwann ziehen. Ich nehme an, Sie haben jeden abgewählt, der Ihren Träumen nicht zustimmt?
James
1
@WayneM - Sie würden also einen "Defekt" melden, weil Ihnen die Art und Weise, wie der Code aussieht, nicht gefällt. Code ist geschrieben, um einen Job zu erledigen - wenn er den Job erledigt, dann funktioniert er. Die Wartungskosten mögen hoch sein, aber sie müssen billiger sein als ein Umschreiben.
James Anderson
-2

Ich habe die Erfahrung gemacht, dass der Abgabetermin das Wichtigste für das Unternehmen ist. Es hängt wirklich davon ab, wer Ihre Anwendung verwenden wird. In meinem Fall handelte es sich um Software für Mobiltelefone. Versäumte Fristen bedeuteten verpasste Verkaufsziele und Kurserfolge.

Beim Betrachten von Code, den wir geerbt haben und der eindeutig geändert werden musste, stießen wir auf eine Reihe von WTF-Momenten. Da dieser Code jedoch "so gut wie" funktionierte (Asynchronität wird nur unzureichend verstanden), gab es für das Management keinen Anreiz, das Refactoring tatsächlich zuzulassen, während noch ausstehende Verpflichtungen zu erfüllen waren. Erst als ein Fehler in der Wildnis entdeckt wurde, durften wir etwas ändern, auch wenn wir es uns durch dunkle Randfälle leicht brechen konnten. Ich habe einmal in meiner Freizeit ca. 10.000 Codezeilen überarbeitet und musste sie schließlich wegwerfen. Der Zeitaufwand für Tests und Überprüfungen usw. konnte nicht gerechtfertigt werden.

James
quelle
Ich bin froh, dass die Realität der Softwareentwicklung für manche Menschen verloren zu sein scheint
James