Ich arbeite mit einer Codebasis, die mehr als 500 KB Codezeilen umfasst. Es muss dringend umgestaltet werden. Es wurden Refactoring-Bemühungen identifiziert, die länger dauern als der normale zweiwöchige Sprint. Diese können nicht in kleinere Aufgaben unterteilt werden, wie ich in anderen Antworten auf dieser Site gesehen habe. Das Produkt muss am Ende der Iteration funktionieren, und eine teilweise Umgestaltung wird das System in einem unbrauchbaren Zustand belassen, da die Abhängigkeit zwischen den Elementen schrecklich ist. Was wäre der beste Weg, um diese Hürde zu nehmen? Ich erwähne noch einmal, dass es keine Option ist, es in kleinere Teile zu zerlegen, was bereits geschehen ist.
Update: Die Leute brauchen anscheinend eine Erklärung, warum dies nicht in einen zweiwöchigen Sprint passt. Ein Sprint beinhaltet mehr als nur das Schreiben von Code. Wir haben keine Richtlinie ohne Tests. Diese Richtlinie existierte nicht immer und ein großer Teil der Codebasis hat sie nicht. Auch einige unserer Integrationstests sind noch manuelle Tests. Das Problem ist nicht, dass das Refactoring selbst so groß ist. Kleine Änderungen wirken sich auf viele Teile des Systems aus, und wir müssen sicherstellen, dass diese Teile weiterhin ordnungsgemäß funktionieren.
Wir können einen Sprint nicht verschieben oder verlängern, da wir monatliche Hotfixes haben. Daher kann diese Änderung, die sich über einen Sprint hinaus erstreckt, nicht verhindern, dass die andere Arbeit dem Hotfix hinzugefügt wird.
Refactoring vs Redesign: Nur weil unser Entwicklungsprozess nicht effizient genug ist, um dieses Refactoring in einem zweiwöchigen Zyklus durchzuführen, ist eine Umbenennung in Redesign nicht erforderlich. Ich würde gerne glauben, dass wir in Zukunft genau dieselbe Aufgabe in einem zweiwöchigen Zyklus erledigen können, wenn sich unser Prozess verbessert. Der fragliche Code musste sich in sehr langer Zeit nicht ändern und ist ziemlich stabil. Jetzt, da die Richtung des Unternehmens anpassungsfähiger wird, möchten wir, dass dieser Teil der Codebasis genauso anpassungsfähig ist wie der Rest. Welches erfordert Refactoring. Anhand der hier gegebenen Antworten wird deutlich, dass ein Gerüst fehlt, um dieses Refactoring im Zeitrahmen normaler Sprints durchführen zu können.
Antworten:
Ich werde den Branch-and-Merge-Ansatz ausführen, den Corbin March zum ersten Mal vorgeschlagen hat, damit wir mehr über diese Problembereiche erfahren und die fehlenden Tests identifizieren können. Ich denke, wir sollten in Zukunft den Ansatz verfolgen, den Buhb vorgeschlagen hat, die Bereiche zu identifizieren, in denen Tests fehlen, und diese zuerst implementieren und dann das Refactoring durchführen. Dies ermöglicht es uns, unseren normalen zweiwöchigen Sprintzyklus beizubehalten, so wie es viele hier gesagt haben, sollte dies beim Refactoring immer der Fall sein.
quelle
Antworten:
Wenn Sie den Luxus haben, das Refactoring zu verzögern, empfehle ich, die nächsten Iterationen auf das Hinzufügen von Komponententests und automatisierten Integrationstests zu konzentrieren, bis Sie die Codebasis bequem refactoren und dann in einem Sprint refactoren können.
quelle
Mein Vorschlag:
An der Tatsache, dass es wahrscheinlich hässlich wird, führt kein Weg vorbei. Ich beneide dich nicht. Wenn Sie ein Projekt drastisch ändern, ist es meiner Erfahrung nach einfacher, die fortlaufende Entwicklung in das neue Paradigma einzubeziehen, als das neue Paradigma irgendwie in einen jetzt geänderten Stamm einzubinden, nachdem alles abgeschlossen ist. Trotzdem wird es weh tun.
quelle
Nicht jede Aufgabe kann in einem (künstlichen) zweiwöchigen Sprint erledigt werden, daher ist gesunder Menschenverstand gefragt. Wenn es nicht mehr abgebaut werden kann und es getan werden muss, steigen Sie einfach ein und tun Sie es. Der Prozess ist nicht wichtiger als das Endergebnis und sollte eher als Richtlinie als als ein Gesetz angesehen werden, das niemals gebrochen werden darf.
quelle
Führe einfach einen Sprint von 3, 4 oder 5 Wochen durch. Wen interessiert das? Sie sind offensichtlich davon überzeugt, dass in kürzerer Zeit nichts getan werden kann. Hören Sie also auf, dagegen anzukämpfen.
Erzählen Sie Ihren Kollegen von der Royal Society of Blind Agile Adherance nichts.
quelle
Ich empfehle, mit dem Buch Working Effectively with Legacy Code von Michael Feathers zu beginnen. Er behandelt eine Vielzahl von Techniken, um den Umfang von Änderungen des Refactoring-Stils zu verringern.
quelle
Wenn wir in unserem Shop umfangreiche Refactoring- oder Rewriting-Aufgaben haben, die nicht in einem Release-Fenster ausgeführt werden können, belassen wir die Funktionalität im System wie sie ist. Wir beginnen jedoch mit den neuen, überarbeiteten Legoblock-Funktionen, wenn es die Zeit erlaubt. Schließlich erreichen wir einen Zustand, in dem genügend Legoblöcke erstellt wurden, sodass ein Sprint genügend Zeit bietet, um die Legoblöcke in die Anwendung einzustecken und für die Benutzer einzuschalten.
Genauer gesagt, teilen wir große Funktionen unter Verwendung neuer Namen auf oder überarbeiten sie. Am Ende verwenden wir dann unser umbenanntes, überarbeitetes Werk anstelle des fiesen alten Codes.
quelle
Setzen Sie einen Sprint ein, um herauszufinden, wie der Code während des Refactors ordnungsgemäß funktioniert. Dies kann die Form von veralteten Methoden und Klassen, Wrappern, Adaptern und dergleichen annehmen. Ihr Refactoring kann den Code für kurze Zeit schmutziger machen, um langfristig sauberer zu sein. das ist okay. Im Moment sagst du, dass es nicht geht. Ich halte das nicht für richtig - überlegen Sie, wie Ihr Prozess aussehen würde, wenn er durchgeführt werden könnte , und welche Schritte Sie unternehmen können, um dies zu erreichen. Dann tauch ein.
quelle
+1 auf die Antwort von Corbin March, genau das habe ich mir gedacht. Es hört sich so an, als ob Ihre Codebasis ein bisschen hässlich ist und es mehr als einen einzelnen Sprintzyklus braucht, um sie zu bereinigen.
So wie Corbin sagte:
Ich bin mir sicher, dass Sie keine Probleme haben werden, dies an Ihren Entwickler-Manager zu verkaufen. Wenn es Ihren PMs schwer fällt, es zu sehen, dann erklären Sie ihnen, dass Rom nicht an einem Tag gebaut wurde und räumen Sie den Müll auf, der in Roms Müll geworfen wurde Straßen werden auch nicht an einem Tag fertig sein. Das Refactoring wird eine Weile dauern, aber es lohnt sich im Endeffekt in Bezug auf eine einfachere Wartung, schnellere Erweiterungsversionen, weniger Produktionstickets und ein besser erfülltes SLA.
quelle
Obwohl die Neugestaltung, die Sie wirklich durchführen möchten, eine große Aufgabe ist, wäre es möglich, kleinere Teile umzugestalten, um einzelne Abhängigkeiten zu lösen oder zu entkoppeln? Sie wissen, wenn Sie Zweifel haben, fügen Sie Indirektion hinzu. Jede dieser Entkopplungen sollte eine kleinere Aufgabe sein als die Mammutaufgabe, die Sie nicht ausführen können.
Sobald die Abhängigkeiten entfernt sind, sollten Sie in der Lage sein, die verbleibenden Refactoring-Aufgaben aufzulösen, die innerhalb von Sprints verfügbar sein sollen.
quelle
In dem Projekt, für das ich gerade arbeite, verwenden wir 4-wöchige Sprints. Und manchmal können wir eine User Story nicht beenden und starten sie im folgenden Sprint neu.
Allerdings sollte es meiner Meinung nach möglich sein, ein Refactoring in kleinere Storys aufzuteilen, die in einen 4-wöchigen Sprint passen. Wenn Sie den Code nicht innerhalb von 4 Wochen in einen konsistenten Zustand versetzen können, habe ich das Gefühl, dass Sie Ihre Anwendung umschreiben, anstatt sie umzugestalten.
quelle
Ich empfehle, dass bestimmte Aufgaben, die länger als der zweiwöchige Sprintzyklus dauern, für ein anderes Mal ausgeführt werden. Ihr Team hat festgestellt, dass eine Umgestaltung erforderlich ist, und das ist wichtig. Manchmal gibt es keine andere Möglichkeit ... und ja, das ist scheiße.
Wenn die Zeit gekommen ist, um mit dem Refactoring zu beginnen, werden Sie einfach die normalen Sprints aussetzen. Du hast keine Wahl. Verwenden Sie die intelligente Versionskontrolle - Verzweigen, Umgestalten, Testen, Zusammenführen. Es gibt immer einen Zeitpunkt, an dem das Refactoring einiger großer Projekte Vorrang vor Features hat. Nach Möglichkeit würde ich auch versuchen, die Bedenken für eine bessere Flexibilität zu trennen.
quelle
Nachdem ich kürzlich dasselbe Problem mit einem Teil unserer Codebasis (die auch etwas größer ist) durchgearbeitet habe, hoffe ich, dass ich ein paar Einblicke mit Ihnen teilen kann. In meiner Situation wurde die Codebasis von einem anderen Team entwickelt, sodass niemand von den ursprünglichen Entwicklern an diesem Refactoring beteiligt war. Meine Erfahrung mit der Codebasis betrug ungefähr 1 Jahr, und ein anderer Entwickler hatte 2 Jahre damit zu tun.
Gestatten Sie mir zwei kleine Anmerkungen zu den anderen Antworten:
Es wird nicht unbemerkt bleiben, wenn Sie zwei Wochen oder länger nicht reserviert sind. Sie müssen sicherstellen, dass Sie vom Projektmanagement und vor allem vom Team unterstützt werden. Wenn sich das Team nicht für dieses Refactoring engagiert (und dies bedeutet, tun Sie es jetzt, nicht in ferner Zukunft), werden Sie in Schwierigkeiten geraten.
Mach es nicht alleine, benutze die Paarprogrammierung. Dies bedeutet nicht unbedingt, dass Sie die ganze Zeit vor derselben Tastatur sitzen müssen, sondern dass Sie kleine und enge Aufgaben (z. B. Schreibtests, die das Verhalten dieser Klasse erfassen) einzeln ausführen können.
Führen Sie ein Scratch Refactoring durch und behandeln Sie es als solches. (Eine Art "Wegwerf" -Prototyp-Refactoring, das "Wegwerf" -Bit ist wichtig!) Ehrlich gesagt ist es unwahrscheinlich, dass Sie alle Auswirkungen Ihres Refactorings kennen. Ein Scratch Refactoring hilft Ihnen in gewisser Hinsicht:
Wenn Sie Ihr Scratch Refactoring abgeschlossen haben, werden Sie hoffentlich feststellen, dass Sie nicht einfach alles ändern können. Sie werden sich schlecht fühlen, es ist nur ein großes, fettes Durcheinander und Sie können nicht einfach einen Schalter umlegen und dafür sorgen, dass es funktioniert. Dies ist, was mir passiert ist, es könnte in Ihrer Situation anders sein.
Mein Partner und ich hatten jedoch ein viel besseres Verständnis für unser System. Nun konnten wir einzelne, kleinere (wenn auch noch große) Umgestaltungen identifizieren. Wir haben unsere Vision des Systems in einem Diagramm festgehalten und sie mit dem Team geteilt, zusammen mit den Rückständen, die wir zur Umsetzung dieser Vision entwickelt haben. Gestützt auf einen gemeinsamen Konsens haben wir entschieden, welche Elemente wir im Verlauf der nächsten Iteration implementieren werden.
Eine letzte Sache, die uns geholfen hat, war die Verwendung eines großen Whiteboards. Es gibt zu viele Dinge, um sie im Kopf zu behalten. Es ist äußerst wichtig, dass Sie Notizen machen. Schreiben Sie sich am Ende des Tages eine Kurznotiz, in der Sie festhalten, was Sie heute getan haben und morgen tun möchten. Es hilft, große Zeiten zu entspannen, und Sie brauchen eine entspannte Zeit, wenn Sie mit der Aufgabe Schritt halten möchten. Viel Glück!
quelle
Starten Sie ein Wartungsfenster, in dem keine weitere Entwicklung durchgeführt wird. Führen Sie das Redesign durch und setzen Sie dann die Entwicklungs-Sprints fort.
quelle
Wir haben zwei Arten von Arbeiten zur Hand:
Refactoring besteht in der Regel aus der ersten Art von Arbeit, da viele Methoden bekannt sind , bereits für Entwickler wie DRY , SRP , OCP , DI usw. Wenn also ein Projekt , um zwei Monate dauern Refactoring werden, es einfach zwei Monate in Anspruch nimmt , gibt es kein weg daran vorbei. Daher würde ich vorschlagen, das ursprüngliche Projekt nicht umzugestalten und an der aktuellen Situation arbeiten zu lassen. Hören Sie auf, neue Anfragen und Anforderungen von Interessengruppen und Produktbesitzern zu erhalten . Lassen Sie dann das Team an dem Projekt arbeiten, bis es überarbeitet und einsatzbereit ist.
quelle
Ein Vorschlag, der möglicherweise Abhilfe schafft: Wenn Sie nicht genügend Zeit haben, um den Code zu überarbeiten und innerhalb des zweiwöchigen Sprints erneut zu testen, sollten Sie zunächst einige andere kleine Änderungen am Code vornehmen, damit Sie sich konzentrieren können beim Schreiben von Tests für den ersten oder den zweiten Sprint. Möglicherweise können Sie mehrere nicht getestete Clients des Codes identifizieren, den Sie umgestalten möchten. Wählen Sie einen Kunden aus, und nehmen Sie einige andere Änderungen vor, die Sie dazu zwingen, Tests für diesen Kunden zu schreiben. Sobald Sie mit dem Code aus der Arbeit vertraut sind, mehr Tests durchgeführt haben und möglicherweise ein paar kleinere Umgestaltungen vorgenommen haben, sind Sie in einer viel besseren Position, um das Umgestalten und das (jetzt einfachere) Verfahren durchzuführen ) beide in einer Iteration testen.
Ein weiterer Ansatz besteht darin, eine Kopie des fehlerhaften Codes zu erstellen, ihn umzugestalten und die Clients nacheinander in den neuen Code zu verschieben. Diese Arbeit kann über Iterationen aufgeteilt werden.
Und nicht aufgeben: Akzeptieren Sie nicht, dass ein großes Refactoring nicht in kleinere Schritte zerlegt werden kann. Der einfachste / schnellste / beste Ansatz kann länger dauern als eine Iteration. Das bedeutet jedoch nicht, dass es keine Möglichkeit gibt, iterationsgroße Chunks zu erstellen.
quelle