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?
design-patterns
language-agnostic
philosophy
Justin Myles Holmes
quelle
quelle
Antworten:
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.
quelle
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
Der Zen of Python- Weg sagt:
Die Idee ist, dass es nicht daran liegt, dass Sie jetzt etwas definieren können, was Sie sollten. Brauchst du es jetzt
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!
quelle
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.
quelle
Sie sind orthogonal und haben nichts miteinander zu tun.
Äh. Tun sie beide? Was kann es noch mehr geben?
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.
quelle
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
,CookieFactory
für derenCookieRecipes
UmwandlungCookies
aufgrund einiger Ihrer Eingabeparameter ein erforderlich ist ,CookieSource
muss und darf dies nicht davon abhängen, wie sieCookieFactory
implementiert undCookieRecipes
dargestellt wird.Wenn das
CookieFactory
in der Tat einBakery
ist, kann das jederRecipe
entsprechend 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 zwischenCookieSource
den 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 .
quelle
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.
quelle
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.
quelle