Versuchen Sie beim Schreiben des Codes oder beim Entwerfen, das Problem in der ersten Instanz selbst zu verallgemeinern, oder versuchen Sie, dieses sehr spezifische Problem zu lösen.
Ich frage dies, weil der Versuch, das Problem zu verallgemeinern, dazu führt, dass die Dinge kompliziert werden (was möglicherweise nicht notwendig ist), und es andererseits sehr schwierig ist, die spezifische Lösung zu erweitern, wenn sich die Anforderung ändert.
Ich denke, die Lösung ist, den Mittelweg zu finden, der leichter gesagt als getan ist. Wie gehen Sie dieses Problem an? Wenn Sie anfangen, es zu generalisieren, zu welchem Zeitpunkt wissen Sie, dass so viel Generalisierung ausreicht?
Antworten:
Zu oft, wenn Sie versuchen, für die Zukunft zu entwerfen, stellen sich Ihre Vorhersagen über zukünftige Bedürfnisse als falsch heraus. In der Regel ist es besser, eine Umgestaltung vorzunehmen, wenn Sie tatsächlich wissen, wie sich die Anforderungen geändert haben, als Ihr System am ersten Tag zu überarbeiten. Schießen Sie sich dabei auch nicht in den Fuß. Es gibt sicherlich einen Mittelweg, und zu wissen, wo das ist, ist mehr Kunst als Wissenschaft.
Um es auf eine Faustregel zu bringen: Weniger ist mehr.
quelle
Kennen Sie sich mit Agile aus? Eines der großen Prinzipien von Agile ist YAGNI . Ich finde, das ist der beste Weg, um Dinge anzugehen.
quelle
Dies ist wahrscheinlich einer der schwierigsten Teile der Softwareentwicklung, da Sie die Grenze zwischen "YAGNI" und "PYIAC" (Paint Yourself Into A Corner) überwinden müssen.
Es ist ziemlich einfach zu sagen, "schreibe keine Funktion, es sei denn, du brauchst sie". Der schwierige Teil besteht darin, Ihren Code so zu gestalten, dass Sie später problemlos Funktionen hinzufügen können, wenn Sie sie benötigen.
Der Schlüssel ist, in der Lage zu sein, eine erweiterbare Architektur zu entwerfen, in der Sie nicht mehr Code schreiben, als Sie derzeit benötigen. Die Fähigkeit, dies gut zu machen, beruht auf einer Menge Erfahrung (und Schmerzen).
quelle
Ich verbringe einige Zeit im Voraus damit, über die allgemeine Richtung des Entwurfs nachzudenken - nicht zu viel, aber genug, um im Grunde genommen einen Überblick auf hoher Ebene zu skizzieren. Anschließend verfolge ich eine auf Storys basierende agile Methodik, bei der mithilfe von TDD Lösungen für einzelne Storys entwickelt werden. Wenn ich über TDD implementiere, behalte ich meinen Überblick auf hoher Ebene im Hinterkopf und leite entweder (a) meine bestimmten Implementierungen, um dem Überblick auf hoher Ebene zu folgen, oder (b) baue (und verbessere) mein Verständnis / meine Richtung auf hoher Ebene basierend Was ich beim Testen / Implementieren lerne.
Ich denke, es ist ein Fehler, keine Vorausplanung zu machen, aber es ist wahrscheinlich ein größerer Fehler, zu viel zu tun. Nach Möglichkeit möchte ich mich von meiner Erfahrung leiten lassen und dann das Design organisch wachsen lassen, so wie ich es mir für die Entwicklung der Anwendung vorgestellt habe. Bei der Verwendung von TDD stelle ich fest, dass das Design selbst zu besseren Designprinzipien (entkoppelt, einzelne Verantwortung usw.) gezwungen ist und sich in Bezug auf Änderungen besser formulieren lässt, als wenn ich versuche, das Ganze vorauszudenken und die Entwicklung darauf abzustimmen.
quelle
Ein gutes Design nimmt zukünftige Veränderungen auf und ist auf jeden Fall einen Besuch wert. Betrachten Sie das UNIX-Betriebssystem und dessen "Alles ist eine Datei-Philosophie". Diese Entwurfsentscheidung wurde nicht getroffen, um einen unmittelbaren Bedarf zu decken, sondern im Hinblick auf zukünftige Anforderungen. Man schaudert, wenn man sich überlegt, wie ein auf einem "agilen" Design basierendes Betriebssystem aussehen würde.
quelle
Was Sie versuchen, damit umzugehen, hat mit der Wiederverwendung zu tun (dh der Verallgemeinerung eines Problems, mit dem Sie sich jetzt befassen, damit Sie die Arbeit (den Code) in Zukunft wiederverwenden können). Ich habe es schon einmal gesagt und ich werde wieder darauf verlinken .
Ich glaube, ich habe andere Leute etwas sagen hören, um Folgendes zu bewirken:
quelle
Entwurf für "jetzt + 1". Das heißt, lösen Sie das unmittelbare Problem und bauen Sie genügend Funktionen ein, damit Sie, wenn Sie das nächste Mal nach einer Änderung fragen, diese bereits zur Hälfte (oder mehr) erledigt haben und die Wahl haben, entweder a) sie sofort zu lösen und späteres Refactoring oder b) erneutes Lösen von "now + 1" (mit der "now" -Hälfte)
Dies hängt vom jeweiligen Projekt ab. Kurz gesagt, die Erfahrung zeigt Ihnen, was die "+1" sind.
quelle
Die Philosophie von YAGNI , Sie werden es nicht brauchen, lässt sich wie folgt zusammenfassen (aus dem Artikel):
quelle
Ich bin der festen Überzeugung, für das jeweilige Problem zu entwerfen und Ihr Design nicht auszublasen, indem ich versuche, alle Fälle zu erraten, für die Sie etwas zu tun haben, weil "wir es eines Tages brauchen könnten".
Im Grunde genommen bedeutet dies bei einer Liste spezifischer Anforderungen nicht, dass Sie Folgendes nicht tun sollten:
Das Hauptproblem beim Entwerfen für "mögliche Zukünfte" ist, dass Sie immer nur raten. Möglicherweise fundierte Vermutungen anstellen, aber "wenn es hart auf hart kommt", sind es immer noch nur eine Reihe von Vermutungen.
Auf diese Weise haben Sie auch die realistische Möglichkeit, Ihre Lösung auf den allgemeinen Fall abzustimmen, anstatt das spezifische Problem zu lösen, das durch Ihre bekannten Anforderungen definiert ist.
Was sagt das? "Wenn Sie nur einen Hammer haben, fängt alles an, wie ein Nagel auszusehen."
Ich wünschte, ich hätte ein Pfund für jedes Mal, wenn ich jemanden sagen hören würde: "Aber es ist eine Lösung, die für die allgemeinen Fälle, die wir in Zukunft sehen könnten, anpassungsfähiger ist."
quelle