Tipp: Wie ich meinen neu ernannten Teamleiter davon überzeugen kann, die Codebasis nicht von Grund auf neu zu schreiben

8

Ich arbeite in einem ziemlich bekannten MNC, und das Modul, in dem ich arbeite, wurde einem neuen "Lead" zugewiesen. Die Codebasis ist ziemlich groß (~ 130 KB oder mehr, mit Abhängigkeiten von anderen Modulen), aber stabil - einige Teile sind im Laufe der Jahre hässlich geworden, aber nachweislich funktionsfähig. (Unsere Produkte laufen seit Jahren auf ihnen, auch neue). Das Problem ist, dass unser Lead den Code von Grund auf neu schreiben möchte, um "feinere Granularität und ein proaktives Design" zu umfassen.

Ich weiß in meinem Bauch, dass das keine sehr gute Idee ist, aber wie kann ich ihn / den Rest des Teams (der in Bezug auf Jahre der Erfahrung ziemlich viel älter ist als ich) überzeugen, ohne selbst zu pedantisch zu klingen (du sollst nicht umschreiben, da Joel et al klare Artikel haben, die dies verbieten)?

Ich habe ein gutes Arbeitsverhältnis zu der betroffenen Person und möchte es nicht ruinieren, aber ich möchte auch nicht an einer Entscheidung teilnehmen, die uns sicherlich für die kommenden Jahre plagen würde !! Irgendwelche Vorschläge für einen milderen und dennoch effektiven Ansatz? Selbst Berichte darüber, wie Sie eine solche Situation nach Ihren Wünschen angegangen sind, würden mir sehr helfen!

BEARBEITEN: Die Codebasis, über die ich spreche, ist kein Produkt / keine grafische Benutzeroberfläche, sondern auf Kernelebene mit allen kritischen Funktionen für unser Produkt. Ich hoffe jetzt weißt du warum ich so besorgt klinge !!

TCSGrad
quelle
Nur um sicherzugehen, bevor Sie diese Art von Rat geben ... Führen Sie viele Entwicklungs- / Wartungsarbeiten an diesem Code durch (und verbringen Sie am Ende viel Zeit damit, Regressionsfehler zu beheben)? Müssen Sie neue Funktionen hinzufügen, können dies aber nicht, da Sie die "hässlichen" Teile Ihres Codes berühren müssten? Ich denke, das Umschreiben ist nicht IMMER eine schlechte Idee ...
@paolo - nein, die Codebasis funktioniert einwandfrei (ich wünschte, ich könnte unsere Produkte benennen, Sie verwenden sie wahrscheinlich :)). Es gibt Fehler für einige Kunden, aber keine größeren Hacks im Code (außer wenn wir HW-Fehler
vertuschen müssen
1
Es gibt viele Vor- und Nachteile auf c2.com/cgi/wiki?RewriteCodeFromScratch
k3b
130.000 Kernel-Code wie er ist, wobei die Treiber eine feine Granularität und ein proaktives Design aufweisen. Ist es ausreichend schwierig oder nahezu unmöglich, neue Geräte oder Protokolle zu implementieren / zu verbinden? Würde das Ergebnis der beabsichtigten Änderungen es Kunden / nachgeschalteten Anwendern wesentlich erleichtern?
JustinC
Kunden werden nichts spüren - die Schnittstellen sind ziemlich einfach und robust genug. Wie ich festgestellt hatte, war die Absicht, die "Lesekomplexität von Code" zu verringern. IMHO, das ist eine ziemlich subjektive Ansicht ... wenn Sie den gesamten Code von Grund auf neu schreiben, wäre es natürlich einfacher für Sie zu lesen - aber was ist mit den neuen Ingenieuren, die sowieso beide durchlesen müssten !!
TCSGrad

Antworten:

8

Rechnen Sie mit ihm zusammen:

Auf der Schuldenseite:

  • Wie lange dauert es, bis die Funktionen wiederhergestellt sind, über die Sie gerade verfügen? Wie viel kostet das (Entwickler + Overhead)

  • Wie viel wird das Unternehmen verlieren, wenn es keine neuen Funktionen / Bugfixes bereitstellen kann oder nur viel langsamer?

  • Wie hoch ist das Risiko, dass das Umschreiben nicht abgeschlossen werden kann und nach n Monaten auf die aktuelle Quellenbasis zurückgegriffen werden kann? Einschließlich des Risikos, das Produkt insgesamt abzutöten.

  • Wie lange dauert es, bis die neue Codebasis genauso hässlich aussieht wie die aktuelle?

Auf der Aktivseite:

  • Wie viel besser wird der Code nach dem Umschreiben sein (gemessen an den gesparten Wartungskosten pro Monat)?

Addieren Sie alles und führen Sie möglicherweise einen Vergleich der besten / schlechtesten Szenarien durch.

Am Ende haben Sie eine Antwort. Wenn er die Antwort ignoriert, sprechen Sie mit seinem Chef.

Jens Schauder
quelle
Tolle Aufzählung !! Ich würde sie meinen Besprechungsnotizen hinzufügen !!
TCSGrad
3
Sie würden denken, dass dies der richtige Weg ist, aber es ist verrückt, wie Sie die Zeit überschätzen, die erforderlich ist, um neue Funktionen in die alte Codebasis einzufügen, während Sie gleichzeitig die Zeit unterschätzen, die erforderlich ist, um die "neuen" zu erhalten "Codebasis bis zur Funktionsliste der alten.
Wheaties
Tolle Punkte Es wäre gut, diese Schätzungen tatsächlich von allen beteiligten Entwicklern zu erhalten, damit jeder ein klares Bild bekommt.
Aditya P
@wheaties Das ist natürlich ein Problem bei jeder Schätzung. Der Weg, dies zu bekämpfen, besteht darin, die Schätzung häufig zu wiederholen und sie mit dem tatsächlichen Fortschritt zu vergleichen. (Think Product Burn Down)
Jens Schauder
Sehr oft ist das „Kapital“ des neuen Codes nicht besser als das, was er ersetzt hat - insbesondere nach einigen Iterationen der Verbesserung und Wartung. IMHO Total Rewrites sind nie die beste Idee.
Gbjbaanb
13

Obligatorisch: Dinge, die Sie niemals tun sollten, Teil 1 (Sie haben es gesehen, aber falls jemand diese Frage findet und nicht.)

Das Neuschreiben von Grund auf ist für Entwickler sehr verlockend. Niemand möchte an Legacy-Code arbeiten, jeder möchte sexy neuen Code schreiben. Aber am Ende des Tages geht es darum, was für das Geschäft am besten ist. Warum ist ein Umschreiben erforderlich? Können sie diesen Fall klar darstellen, was einen Mehrwert für das Unternehmen zeigt?

Sie sollten sie nicht davon überzeugen müssen, keine Ressourcen auszugeben. Sie sollten die Unternehmen davon überzeugen müssen , um Ressourcen zu verbringen.

David
quelle
Ich liebe diesen Artikel. Ich hasse es, Dinge umzuschreiben!
Mark Canlas
3
@ Mark Canlas: Eigentlich ist es irgendwie lustig, weil ich oft ein Befürworter des Umschreibens bin. Ich hasse Legacy-Code :) Aber ich verstehe auch, dass das Umschreiben nicht stattfinden sollte, wenn ich keinen Mehrwert für das Unternehmen nachweisen kann. Meine Meinung muss durch Zahlen gestützt werden.
David
2
Ich hasse auch alten Code, aber seit ich diesen Artikel gelesen habe, habe ich gelernt, laufende Schiffe gegenüber theoretischen zu bewerten. Ein kaputtes, laufendes Schiff generiert mehr Geld pro Stunde als ein hypothetisches auf einer Serviette. Es ist ein Balanceakt!
Mark Canlas
1
@ Mark Canlas: Auf jeden Fall. Und hier verlieren viele Entwickler (in vielen Fällen sogar sehr erfahrene) den Überblick über das Gesamtgeschäft. Es muss einen tatsächlichen materiellen Wert für das Unternehmen haben, und sehr oft hat das vorhandene Produkt diesen Wert. Obwohl ein Argument, das ich immer aus dem Geschäft hasse, lautet: "Wir haben bereits Geld dafür ausgegeben, also müssen wir dies nutzen." Manchmal, wie bei meinem letzten Job, treibt eine solche Entscheidung sie in den Boden. Es ist weder "immer neu schreiben" noch "nie neu schreiben". Wie du gesagt hast ... Gleichgewicht.
David
8

Wie gut deckt Ihr Testansatz die Codebasis ab? Wie wäre es mit Unit-Tests?

Wenn es dort nicht bereits vorhanden ist, schlagen Sie vor, dass jeder Code jeweils nur in einem Abschnitt neu geschrieben wird und dass jeder Abschnitt, der neu geschrieben wird, eine nahezu vollständige (90% +) Abdeckung des Unit-Test-Codes aufweist. Sobald Sie dies getan haben, haben Sie einen Teil des Codes definiert, der sowohl gut definiert ist (wir könnten ihn testen) als auch über eine bekannte Schnittstelle verfügt.

Zu diesem Zeitpunkt ist das Umschreiben dieses Codes ein viel geringeres Risiko. Fehler sollten durch Unit-Tests / andere Tests aufgefangen werden, und vorausgesetzt, Sie haben auch eine Quellcodeverwaltung, können diese leicht rückgängig gemacht werden.

Wenn Sie das Umschreiben in kleineren Abschnitten durchführen, können sowohl Sie als auch Ihr Team ein genaueres Gefühl für ein vollständiges Umschreiben haben. Wissen Sie beide, worauf Sie sich einlassen? Ist einer von euch zu pessimistisch / optomistisch?

Chris Pitman
quelle
130.000 Kernel-Code wie er ist, wobei die Treiber eine feine Granularität und ein proaktives Design aufweisen. Ist es ausreichend schwierig oder nahezu unmöglich, neue Geräte oder Protokolle zu implementieren / zu verbinden?
JustinC
2

Es sind einige relevante Faktoren zu berücksichtigen:

  • Die Tatsache, dass es so funktioniert, wie es die Benutzer möchten, ist ein Hinweis darauf, dass es umgestaltet und nicht neu geschrieben werden muss
  • Wenn Sie Unit-Tests haben, überarbeiten Sie diese definitiv, anstatt sie neu zu schreiben. Wenn Sie dies nicht tun, wird der Aufwand zwischen Refactoring und Umschreiben verringert (vorausgesetzt, Ihr Ziel besteht darin, Unit-Tests für das resultierende System durchzuführen). Wenn Sie keine Komponententests haben und sich der gesamte Code in der GUI-Ebene befindet, kann das Umschreiben möglicherweise schneller erfolgen, insbesondere wenn die Funktionalität ohnehin größtenteils fehlerhaft ist. Das ist meine Erfahrung.
  • Wenn Ihr Ziel darin besteht, Plattformen vollständig zu ändern (nicht verwalteter Code -> .NET oder Windows -> Linux oder PHP -> Python usw.), ist dies ein offensichtliches Argument zur Unterstützung des Umschreibens.
Scott Whitlock
quelle
Nein, wir haben keine Unittests.
TCSGrad
Es ist unwahrscheinlich, dass der Neue es auch haben würde, wenn man bedenkt, wie viel Arbeit es bereits beinhaltet. Außerdem ist die Codebasis, über die ich spreche, kein Produkt / keine grafische Benutzeroberfläche, sondern auf Kernel-Ebene mit kritischen Funktionen für unser Produkt. Ich hoffe jetzt weißt du warum ich so besorgt klinge !!
TCSGrad
1
@ shan23 - warum sollten Sie eine Umschreibung starten und nicht zumindest eine Akzeptanztestsuite pflegen? Sie werden am Ende nur das gleiche Chaos schaffen. Die Tatsache, dass es keine grafische Benutzeroberfläche gibt, erleichtert das Testen erheblich!
Scott Whitlock
0

Sag einfach nein." Seien Sie überzeugend, aber seien Sie bereit zu sagen: "Sie sind nicht nur falsch in Bezug auf die Vorteile, sondern Sie liegen auch falsch, weil es eine Verschwendung menschlicher Anstrengungen ist."

Andy Finkenstadt
quelle
0

Wo ist der Business Case für ein Umschreiben? Sie haben eine Codebasis, die einen Bedarf erfüllt. Zugegeben, es ist vielleicht nicht perfekt, aber es stellt eine erhebliche Investition in Bezug auf Zeit und Ressourcen dar. Das vollständige Umschreiben ist nur dann gerechtfertigt, wenn die Codequalität so schlecht ist, dass das Unternehmen Geld oder Geschäftsmöglichkeiten verliert. Man muss sich an das alte Sprichwort erinnern, wenn es nicht kaputt ist, reparieren Sie es nicht!

Bit-Twiddler
quelle
Ich muss dies ablehnen, weil dieses Sprichwort das Schlimmste in unserer Branche ist. Es fördert Faulheit, Inkompetenz und träge Verhaltensweisen bei Entwicklern, weil niemand die Bälle hat, um ein Problem richtig anzugehen, weil "es funktioniert" in einer kleinen Kapazität.
Wayne Molina
@WayneM: Die Option "Umschreiben" ist die schlechteste, zu oft aufgrund des Ego und der Inkompetenz von Entwicklern, die nicht mit vorhandenem Code arbeiten können. Sie wollen, dass Torewrite coole neue Sachen sind, und machen am Ende schlimmere Fehler in ihrer fehlgeleiteten Einstellung, dass sie so viel besser sind als die Jungs, die die letzten Sachen gemacht haben. Nur wenn sich alter Code im Laufe der Zeit weiterentwickelt hat (oder anfangs Mist war), sollten Sie ihn neu schreiben, und selbst dann sollte zuerst ein ernsthaftes Refactoring in Betracht gezogen werden.
Gbjbaanb
0

Kaufen Sie so viele Shorts wie möglich auf Lager. Wenn das Management sich bereit erklärt, Selbstmord zu begehen, sollten Sie zumindest etwas Geld damit verdienen. Immerhin wirst du bald auf der Straße sein, nachdem sie gepanzert haben.

SnoopDougieDoug
quelle