Wie kann man "Du wirst es nicht brauchen" und "Jetzt ist besser als nie" zusammen spielen?

17

Ich stelle oft fest, dass ich "jetzt ist besser als nie" umarme, wenn ich die Trockenheit eines Designs vorantreibe. Normalerweise finde ich, dass ich ein Verständnis für den einen maßgeblichen Ort für ein Stück Wissen im Kontext eines Systems anderer Wissensstücke entwickeln muss. Daher tendiere ich dazu, das System "jetzt" zu entwerfen.

Umgekehrt führt diese Praxis dazu, dass ich ziemlich weit im Voraus baue, obwohl die Wahrscheinlichkeit groß ist, dass ich sie nicht brauche.

Wie passen diese beiden Muster zusammen?

Mit welchen Methoden stellen Sie sicher, dass sie gut spielen?

Wie unterrichten Sie sie zusammen, ohne Verwirrung zu stiften?

Justin Myles Holmes
quelle
2
Schauen Sie vor dem Sprung. Aber wer zögert, ist verloren.
mmyers

Antworten:

26

Ich versuche auch weit voraus zu denken, aber normalerweise nicht im Code. Ich mache ein Brainstorming, mache mir Notizen und organisiere die Dinge hoffentlich so gut, dass ich auf sie zurückgreifen kann.

In Bezug auf Code neige ich eher zu "Du wirst es nicht brauchen", aber "Jetzt ist besser als nie" bei Design.

Wenn Sie anfangen, ein neues System zu bauen, ist es verlockend, jetzt alles zu bauen, aber es kann auch Ihre Dynamik und Moral beeinträchtigen. Ich neige dazu, über das Gesamtdesign nachzudenken und zu versuchen, eine direkte Linie durch dieses zu ziehen. Ich überlege mir eine durchgehende Skelettarchitektur und baue diese zuerst. Dabei wende ich solide Designprinzipien an, damit ich sie später weiterentwickeln und umgestalten kann in neuen Funktionen.

Erstellen Sie die einfachste durchgängige Darstellung des Systems, die funktionieren kann. Tun Sie das zuerst, und dann haben Sie etwas zu reflektieren. Das hilft, all diese vagen "Was-wäre-wenn" -Fragen zu kristallisieren und Ihnen dabei zu helfen, das zu finden, was Sie als Nächstes bauen müssen.

samplebias
quelle
3
+1 Platz für etwas im Design zu lassen, bedeutet nicht, dass Sie anfangs viel davon bauen müssen. WEG ZU VIELE MENSCHEN STEHEN AUF EINEN ABSOLUTISTISCHEN KICK, DASS NICHTS VOR ANFRAGE ZU BEACHTEN IST UND SICH IN EINER SCHLECHTEREN SITUATION LÄSSEN, ALS SIE DAS GANZE GEMACHT HABEN, OHNE KEINEN KUNDEN-EINGABEN.
Bill
9

YAGNI bedeutet , die Dinge zu erledigen , wenn sie benötigen , um zu erledigen und nicht vorher. Das bedeutet nicht, dass sie niemals fertig werden, es sei denn, sie werden niemals gebraucht. Es bedeutet, dass Sie nur das tun, was dem Kunden unmittelbaren geschäftlichen Nutzen bringt . Der unmittelbare Geschäftswert ist für jeden Kunden und jedes Projekt subjektiv.

In beiden Fällen können Sie mit YAGNI nichts verlieren .

In einem anderen Fall verlieren Sie Zeit, wenn Sie Code schreiben, der niemals verwendet wird, und Tests für Code schreiben, der niemals verwendet wird, und Dokumentation für Code schreiben, der niemals verwendet wird, und wenn Sie den Code warten, der niemals verwendet wird, fragen sich die Leute, was dieser Code tut , und wenn es jemals benutzt wird, ad nauseum.

Beispiel

Wenn ich an einem Prototyp / Proof-of-Concept oder einer 1.0- Version einer Anwendung arbeite, brauche ich kein Design, um es auf Facebook-Ebene zu skalieren. Hölle Ich brauche nicht ein Design - Skala auf das Niveau von Facebook, bis ich anfangen zu sehen , dass ich habe diese Art von Verkehr.

Glaubst du, Zuckerberg hat die allererste Version von Facebook entworfen, die auf 500 Millionen Nutzer skaliert werden kann? Nein, er hat es entworfen und gebaut, um nur zu wollen, dass es funktioniert und nicht mehr. Wenn er vom ersten Tag an versucht hätte, das Design für 500 Millionen Nutzer zu verwässern, wäre Facebook wahrscheinlich nie veröffentlicht worden.

Der praktische Weg, Dinge zu tun, ist, wie er es tat. Er begann mit PHP und MySQL, und die Neugestaltung und Neugestaltung nach Bedarf basierend auf dem Geschäftswert , die Skalierung auf Millionen von Benutzern, war von enormem Geschäftswert, aber nicht am Tag 0. Am Tag 0 war es der enorme Geschäftswert, nur etwas zu starten.

Er plante eine Neugestaltung und Neuschreibung. Das ist eine andere Einstellung als die Planung für die Küchenspüle und niemals die Entwicklung oder Bereitstellung von etwas Nützlichem, das vollständig ist.

Die Planung des End-of-Life für eine Codebasis und das Neuschreiben ist agil und zukunftssicher. Der Versuch, ein undefiniertes Ziel für "flexibel" zu finden, scheitert jedes Mal. Sie entwerfen ohne Notwendigkeit und verschwenden Zeit damit, das zu entwickeln, was von geschäftlichem Wert ist, anstatt von Funktionen zu träumen, die niemals genutzt werden.


quelle
2
Wenn Ihr Design schlecht ist (zB unflexibel), können Sie mit YAGNI viel verlieren.
EricSchaefer
1
@EricSchaefer - nicht wenn es die Ziele erfüllt und dem Unternehmen einen Mehrwert bietet und Sie nicht viel Zeit investieren müssen, werfen Sie es einfach raus. Es geht weniger verloren, als wenn Sie niemals Ihr magisches, unendlich flexibles System liefern, das niemals komplett und versandt werden wird und wenn doch, wird es ein Konfigurations-Albtraum.
6

Der Zen of Python- Weg sagt:

Jetzt ist besser als nie. Obwohl nie oft besser ist als jetzt.

Die Idee ist, dass es nicht daran liegt, dass Sie jetzt etwas definieren können, was Sie sollten. Brauchst du es jetzt

  • Ja, mach es jetzt!
  • Nein, tu es nicht! Warten Sie auf die Notwendigkeit! YAGNI!

Die Fälle, in denen dies weniger offensichtlich ist, betreffen Refactoring-Fälle. Sollte ich DRY jedes Mal anwenden, wenn ich kann? Die Antwort ist nicht klar, da es Zeiten gibt, in denen das Anwenden von DRY mehr (in der aufgewendeten Zeit) kostet als das Duplizieren. Auf lange Sicht ist es jedoch immer gut, DRY anzuwenden, bis Sie aus technischen Gründen / aus Gründen der Leistung nicht mehr.

Also, YAGNI, bis du es tust, dann tu es jetzt. Warten Sie nicht!

Klaim
quelle
3

Ich glaube nicht, dass sie zusammen spielen. Ich denke, Sie lehnen sich entweder so oder so. Und ich beuge mich zu YAGNI.

Aber für das, was es wert ist, stimme ich dem zweiten Vorschlag nicht zu: "Jetzt ist besser als nie." Wenn eine Anforderung wichtig ist, muss sie erledigt werden. "Niemals" ist also keine Möglichkeit. Wenn es nicht wichtig ist, ist "jetzt" nicht besser - "nie" ist besser.

Nur meine zwei Cent.

MJB
quelle
Und jetzt die Millionenfrage: Was bedeutet "wichtig"?
Aaronaught
1
"Wichtig" bedeutet, dass es sich um einen Abnahmetest handelt.
Kindall
Wichtig bedeutet, dass der Kunde nachgibt, wenn er nicht da ist.
Paul Nathan
2
Wichtig bedeutet, dass der Kunde nicht zahlt, wenn er nicht da ist.
Christopher Mahan
@Christopher, das könnte als Ermutigung zum Unprofessionalismus interpretiert werden. Beispielsweise ist der Schutz vor SQL-Injection wichtig, auch wenn der Client nicht weiß, was es ist, und erst recht nicht testet, bevor er bezahlt.
Peter Taylor
2

Wie passen diese beiden Muster zusammen?

Sie sind orthogonal und haben nichts miteinander zu tun.

Mit welchen Methoden stellen Sie sicher, dass sie gut spielen?

Äh. Tun sie beide? Was kann es noch mehr geben?

Wie unterrichten Sie sie zusammen, ohne Verwirrung zu stiften?

YAGNI beschreibt Funktionen, wie sie von den Benutzern gesehen werden. Sie brauchen keine Phantasie.

Jetzt ist es besser als nie, den Prozess zu beschreiben. Schreibe jetzt Tests. Schreiben Sie jetzt Code. Lassen Sie sich nicht die Zeit, um über Designalternativen nachzudenken. Bauen Sie etwas, anstatt über das Bauen von etwas zu sprechen.

S.Lott
quelle
2

Wenn "nie" die Implikation von "nicht jetzt" ist, ist Ihr Design fehlerhaft.

Lokale Entscheidungen, die Sie treffen, sollten für den Rest eines Systems transparent sein.
Wenn Sie zum Beispiel eine Komponente haben CookieSource, CookieFactoryfür deren CookieRecipesUmwandlung Cookiesaufgrund einiger Ihrer Eingabeparameter ein erforderlich ist , CookieSourcemuss und darf dies nicht davon abhängen, wie sie CookieFactoryimplementiert und CookieRecipesdargestellt wird.
Wenn das CookieFactoryin der Tat ein Bakeryist, kann das jeder Recipeentsprechend aufnehmenPastry sollte dabei keine Rolle. Und wenn Sie diese Funktionalität nicht benötigen, müssen Sie sie nicht implementieren. Und es gibt keinen Grund auf der Welt, warum Sie es nicht nachträglich hinzufügen können, es sei denn, es gibt keine klare Abstraktionsbarriere zwischen CookieSourceden von ihm verwendeten Diensten.

Fügen Sie beim Erstellen von Software nach Bedarf Funktionen hinzu und versuchen Sie, sich nicht an Entscheidungen zu binden, die Sie treffen. Sperren Sie die Entscheidung stattdessen in eine geeignete Abstraktion .

back2dos
quelle
1

Die einfachste Lösung, die ich gefunden habe, besteht darin, Änderungen beim Schreiben von Code im Voraus zu erwarten. Wenn ich einer Funktion einen Bool übergebe, ändere ich ihn normalerweise so schnell wie möglich in ein Flag / Enums, damit er a) lesbarer und b) einfach zu erweitern ist. Ebenso erstelle ich normalerweise eine spezielle Struktur, wenn ich bemerke, dass ich eine Reihe von Parametern an Stellen weitergebe, an denen es riecht, als bräuchte ich eine weitere. Die Hoffnung ist, dass YAGNI es, aber wenn Sie es irgendwann tun, wird es nicht alle Benutzer sofort schrecklich brechen und die "Grunzarbeit" ist bereits erledigt. Oft genug können Sie auch einfach einen Kommentar hinzufügen, wie zum Beispiel / * zukünftige Ergänzungen werden hier eingefügt * /. Das hilft normalerweise am meisten, da ich das spätere Umgestalten der Benutzeroberfläche als am zeitaufwändigsten empfand.

Anteru
quelle
Ich mag diese Philosophie im Prinzip, aber in der Praxis empfinde ich Migrationen als schmerzhaft genug, um zweimal nachzudenken. Stellen Sie jemals fest, dass die Migration Ihrer Modelle den Erwartungen an Änderungen im Wege steht?
Justin Myles Holmes
Das Gute an diesem Ansatz ist, dass Änderungen weniger schmerzhaft sind. es ist immer noch viel arbeit damit verbunden. Ich bin mir nicht sicher, was Sie mit der Migration von Modellen meinen - ich bin definitiv auf der YAGNI-Seite, aber ich bereite mich auf das Schlimmste vor :)
Anteru
0

Entwerfen Sie mit Blick auf zukünftige Erweiterungen, aber implementieren Sie diese Erweiterungen erst, wenn Sie sie benötigen.

Das Beispiel, das mir einfällt, ist, als Netflix zum ersten Mal gestartet wurde, dass jedem Konto nur eine Warteschlange zugeordnet werden konnte. Sie hackten später die Unterstützung für mehrere Warteschlangen. Da es von Anfang an nicht so konzipiert war, wurde es immer schwieriger, es zu warten, und so beschlossen sie, dieses Feature einzustellen. Nach einem Kundenaufruhr haben sie die Kugel gebissen und ein Redesign durchgeführt, um mehrere Warteschlangen richtig zu integrieren.

Wenn jemand zu Beginn die Möglichkeit in Betracht gezogen hätte, dass er später mehrere Warteschlangen haben möchte, hätte er sich viel langfristigen Kummer ersparen können, wenn er nur sehr wenig zusätzlichen kurzfristigen Aufwand betrieben hätte. Sie mussten nicht sofort mehrere Warteschlangen implementieren. Stellen Sie nur sicher, dass für den Fall, dass dies jemals der Fall sein sollte, kein umfangreiches Umschreiben oder kein unerreichbarer Hack erforderlich ist.

Auf den ersten Blick scheint es eine Wahrsager-ähnliche Fähigkeit zu erfordern, zukünftige Anforderungen vorherzusagen, aber in der Praxis tendieren solche Dinge dazu, einem guten Programmierer aufzufallen, wenn er feststellt, dass er etwas fest programmiert oder eine Datenbanktabelle sammelt viele nur vage verwandte Kolumnen.

Karl Bielefeldt
quelle