Ich habe gerade den Artikel-Link gelesen, den Sie gepostet haben. Ich muss sagen, Fowler hat einige sehr gute Punkte gemacht und viele Dinge, die er gesagt hat, habe ich seit Jahren mit unserem Team befürwortet.
IMO, wenn Sie ein anständiges Design machen, sollten Sie nicht in eine Sackgasse geraten. Ich habe Software immer als aus Bausteinen zusammengesetzt angesehen . Ich glaube immer noch an ein Vorab-Design, aber das Hauptziel ist nicht, das gesamte Produkt zu entwerfen, sondern die Gesamtarchitektur / -richtung bereitzustellen, damit Ihr Team ein gemeinsames Bild visualisieren kann, auf das wir alle hinarbeiten. Wenn Sie ein paar Würfel- und Dreiecksstücke haben, ist es hilfreich zu skizzieren, wie ein Schloss zusammengesetzt werden würde, bevor Sie einfach anfangen, Teile zusammenzuschlagen.
Da ich aus OO-Land komme, ist für mich jeder Block eine Klasse und die Oberfläche dieses Blocks ist die öffentliche Schnittstelle (was für externe oder abgeleitete Klassen sichtbar ist). Wenn Sie guten SOLID-Prinzipien folgen, stellen Sie sicher, dass jeder Block äußerst einfach ist und über eine intuitive öffentliche Oberfläche verfügt. Zurück zu meiner Analogie: Sie möchten sicherstellen, dass Ihr Code nur einfache Formen erstellt. Wenn Sie zu komplexe Klassen erstellen (viele Funktionen, viele Variablen), erstellen Sie Formen, die bei Änderungen der Anforderungen nur schwer wiederverwendet werden können.
Ich stimme Fowler darin zu, dass das größte Risiko / die größte Herausforderung für das evolutionäre Design darin besteht, dass Sie Designentscheidungen der Codierungszeit überlassen und von jedem einzelnen Entwickler erwarten, dass er diese Entscheidungen trifft. Hier kann das System ausfallen, wenn Sie nicht über die richtigen Feedback-Mechanismen verfügen. Wenn nach einer neuen Funktion gefragt wird, ist es äußerst verlockend, einfach die Funktion zu finden, die erweitert werden muss, eine Bedingung in sie zu setzen und einfach eine ganze Reihe von Code direkt in diese Funktion einzufügen. Und manchmal ist dies vielleicht alles, was benötigt wird, aber dies ist auch (IMO) die häufigste Praxis, die zu Sackgassenkomponenten führt. Dies hat nichts mit evolutionärem Design zu tun. Dies nennt man "kein Design".
Solange Sie sich die Zeit nehmen, einen Schritt zurückzutreten und zu sagen, warten Sie eine Minute, diese Klasse hat bereits 15 Mitgliedsvariablen. Lassen Sie mich 6 davon extrahieren und in eine eigenständige Klasse einfügen. Ihre Software besteht aus sehr leichtem Material -gewichtige, flexible und wiederverwendbare Bausteine. Sicher, wenn PMs kommen und die Hälfte der Produktanforderungen an Sie ändern, müssen Sie möglicherweise einige Ihrer Blöcke herausnehmen, sie wieder in das Regal stellen und einige neue erstellen (genau wie beim Bau eines Schlosses können Sie möglicherweise nicht alle verwenden Ihre Zylinder). Aber zu diesem Zeitpunkt ist das nur ein Teil des Geschäfts. Die Anforderungen haben sich geändert. Wenn Sie Ihren Code flexibel und modular halten, sollten Sie in der Lage sein, Ihr Produkt so zu ändern, dass es sich an Ihre neue Geschäftsrichtung anpasst.
Ich glaube, dass dieser evolutionäre Designansatz mit allen Fähigkeiten des Ingenieurs funktioniert. Persönlich habe ich sehr lange Software gemacht und bevor unser Team zu einer agilen Methodik überging, war ich dafür verantwortlich, mehrere wichtige Komponenten von meinem Entwicklungs-PC fast direkt mit kaum einer Qualitätssicherung an den Kunden zu liefern. Gleichzeitig sind diese Komponenten immer flexibel und wartbar geblieben.
Ich versuche nur zu sagen, dass ich mich beim Entwerfen von Software für relativ anständig halte. Wenn Sie mich gebeten haben, ein 100-seitiges Designdokument zu verfassen, es einem Codierer zu geben und zu erwarten, dass es funktioniert, könnte ich mich wahrscheinlich nicht aus einer Papiertüte heraus entwerfen. Wenn ich mit der Arbeit anfing, skizzierte ich manchmal einige UML-ähnliche (sehr vereinfachte, nicht vollständige) Diagramme, aber wenn ich mit dem Codieren anfing, überarbeitete ich sie nach Bedarf und mein endgültiger Code sah nie so aus, wie ich ihn ursprünglich gezeichnet hatte. Selbst wenn ich ein oder zwei Monate lang über jedes Detail nachdenke, kann ich mir nicht vorstellen, dass jemand anderes meine Diagramme aufnehmen und eine solide Software entwickeln kann, ohne das Design während der Codierung zu ändern.
Am anderen Ende des Spektrums, derzeit in meinem Team (jetzt agil und ich unterstütze das voll und ganz), haben wir ein paar Leute, die aus dem eingebetteten Land zu uns gekommen sind, wo sie in den letzten 15 Jahren nur C gemacht haben. Ich habe natürlich bei der anfänglichen Planung und Gestaltung von Kursen geholfen, aber ich habe auch darauf geachtet, regelmäßige Codeüberprüfungen und Brainstorming-Sitzungen durchzuführen, in denen wir Anwendungen von SOLID und Designprinzipien diskutieren. Sie haben einen Spaghetti-Code produziert, der mich ein wenig zusammenzucken ließ, aber mit nur einem kleinen Schubs von mir haben sie angefangen, das zu überarbeiten, was bereits produziert wurde, und der lustige Teil ist, dass einer von ihnen einige Tage später zu mir zurückkam und sagte, ich hasse um es zu sagen, aber nachdem dieser Code entfernt wurde, sieht dies viel lesbarer und verständlicher aus. Sackgasse abgewendet. Punkt I ' Ich versuche zu machen, dass selbst jemand, der für OO völlig neu ist, etwas anständigen Code produzieren kann, solange er einen Mentor mit mehr Erfahrung hat, um ihn daran zu erinnern, dass "evolutionäres Design" nicht dasselbe ist wie "kein Design". Und selbst einige seiner "komplexeren" Klassen sind nicht so beängstigend, weil jede Klasse nicht so viel Verantwortung hat (dh nicht so viel Code), also wird es schlimmer, wenn diese eine Klasse "Sackgassen" hat, wir Schmeißen Sie es und schreiben Sie eine Ersatzklasse mit derselben öffentlichen Schnittstelle (bisher habe ich in nichts, was wir geschrieben haben, eine Notwendigkeit für diese Kontingenz gesehen, und ich habe zweimal pro Woche Codeüberprüfungen durchgeführt).
Abschließend möchte ich auch fest an Designdokumente glauben (zumindest für die Geschäftsbedingungen meines aktuellen Teams), aber das Hauptziel für unsere Designdokumente ist das organisatorische Gedächtnis , sodass die tatsächlichen Dokumente geschrieben werden, nachdem der Code erstellt wurde und überarbeitet. Vor dem Codieren haben wir im Allgemeinen eine schnelle (manchmal nicht so schnelle) Entwurfsphase, in der wir Klassen für Servietten / mspaint / visio skizzieren, und ich erinnere die Leute immer daran, dass diese Phase einen Pfad erzeugt, dem sie folgen müssen, keine Blaupause, und wenn sie mit dem Codieren beginnen, Alles, was keinen Sinn ergibt, sollte geändert werden. Selbst mit diesen Erinnerungen neigen neuere Leute dazu, Code wieder in das ursprüngliche Design zu integrieren, egal wie unnatürlich es sich für sie anfühlt. Dies tritt normalerweise in Codeüberprüfungen auf.
Dang, ich habe viel geschrieben. Das tut mir leid.