Muster in der Praxis
Inkrementelle Übertragung durch fortlaufende Design
Jeremy Miller

Inhalt
In früheren Muster in Übung Spalten ich haben konzentriert sich hauptsächlich auf technische "Muster", aber in diesem Artikel erörtert die weichere "praktischen"-Seite der Softwareentwurf.
Das Endziel von Softwareprojekten ist Wert an den Kunden zu liefern und meiner Erfahrung ist Software Design ein wesentliche Faktor wie erfolgreich ein Team den Wert übermitteln kann.
Über Entwurf behindert unter Design oder nur flach out falschen Entwurf ein Projekts.
Ein guter Entwurf ermöglicht ein Team mehr in seine Bemühungen erfolgreich durchgeführt werden.
Meiner Erfahrung ist auch, dass die besten Entwürfe eines Produkts kontinuierliche Design (auch bekannt als Beseitigung oder evolutionären Design), sondern das Ergebnis der Bemühungen, die versucht sind, das gesamte Motiv vorab richtig hinzubekommen.
In fortlaufende Entwurf beginnen Sie möglicherweise mit einer Modicum Weise entwerfen, aber Sie verzögern Commit Technische Anweisungen wie möglich.
Dieser Ansatz ermöglicht Ihnen die bemüht zuweisen gewonnenen Erkenntnisse aus dem Projekt den Entwurf, statt immer in einen fehlerhaften Entwurf zu früh in das Projekt entwickelt gesperrt kontinuierlich zu verbessern.
Darüber hinaus glauben ich fest, dass die beste Möglichkeit Business Wert zu erstellen durch inkrementelle Bereitstellung von Features arbeiten, sondern konzentriert sich zuerst auf Aufbau Infrastruktur ist.
In diesem Artikel werde ich wie inkrementelle Bereitstellung von Features ermöglicht arbeiten untersuchen ein Projektteams besser übermitteln Geschäftswert, und wie mit fortlaufenden Design aktivieren kann inkrementelle Bereitstellung effizienter und Ihnen helfen, bessere Software Entwürfe erstellen.
Inkrementelle Bereitstellung von Features
Mein dann-Arbeitgeber in 2002 wurde das Experimentieren mit neu minted Microsoft .NET Framework und mussten mit ASP.NET 1.0 ein Testversion Projekt gestartet.
I, beachtet zusammen mit vielen anderen unverzüglich das Projekt, für den Erfolg Hoffnung, so dass wir mithilfe dieses interessante neue Framework auf unseren eigenen Projekte starten konnte.
Sechs Monate später wurde das Projekt abgebrochen.
Das Team war sicherlich ausgelastet ist, und von allen Konten war es viel Code geschrieben, aber keines dieser Code wurde für die Produktionsumgebung geeignet.
Die Erfahrung, dass das Projektteam führt einige wichtigen Lektionen.
Das Team schrieb zuerst eine Entwurfsspezifikation, die scheinbar ziemlich abgeschlossen und conformed Standards für unsere Organisation war.
Mit diesem Dokument in der Hand gestartet das Team das Projekt, indem Sie Versuch, die gesamte Datenzugriffsschicht dann die Geschäftslogikschicht und schließlich die Benutzeroberfläche zu erstellen.
Beim Starten, die Benutzer Schnittstelle Bildschirme zu codieren, realisierter die Entwickler schnell nicht vorhandenen Datenzugriffscode was Bedarf, die Benutzeroberfläche zu erstellen, obwohl Code in den Dokumenten entwerfen entsprach genau war.
An, Punkt, IT-Verwaltung und der Geschäftspartner haben finden Sie einen Wert vom Projekt übermittelt werden und in Handtuch zugunsten von anderen Initiativen ausgelöst hat.
Ironischerweise, mir der Muttergesellschaft war und ist eines der weltweit führenden Beispiele ein Hersteller neigen oder Just-in-Time.
"Die meisten unserer Mitbewerber verwendet verschieben" Produktion, in dem große Mengen von Teilen für Factory Positionen basierend auf den prognostizierten Bedarf über einige Zeitraum bestellt werden.
Downfalls der Push-Produktion sind, verlieren Sie Money jederzeit bestellen Sie weitere Teile als Sie verwenden können; Sie bezahlen zusätzliche um Aktien überschüssige Teile zu speichern, bevor Sie diese; verwenden möchten und Sie Teil Engpässe in der Fabrik anfällig sind, jederzeit die Planungen falsch sind – und Prognosen sind selten genau.
Im Gegensatz dazu wird mein dann-Arbeitgeber "Pull" Produktion verwendet.
Mehrmals am Tag, den der Factory-Systeme die Kundenbestellungen geplanten Bedarf über das nächste paar Stunden, erstellen, bestimmt die Mengen der Teile, die Sie zum Abschließen dieser Aufträge erforderlich, die und dann für sofortige Übermittlung genau die Anzahl und Art der benötigten Teile bestellt.
Die Vorteile des Pull-Produktion sind, vom Kauf nur was benötigt wird, Sie verschwenden Sie viel weniger Geld auf Teile kann nicht verwendet werden; Factorys haben zu konkurrieren mit viel weniger Lagerbestand Bestandteil Aktien Produktion etwas effizienter machen; Sie können schnell an neue Situationen anpassen und Vermarkten erzwingt, wenn Sie sind nicht durch Prognosen vor; Monaten gestellt und Prognosen gebunden und Schätzungen genauer, wenn über die kurzfristig statt mehr Begriff vorgenommen.
Wie gilt Pull und Push Problem für Softwareentwicklung?
Fehlgeschlagene Projekt ich früher verwendeten Push Entwurf von versuchen, zunächst alle infrastructural Anforderungen des Systems ermitteln und außerhalb der Datenzugriffsinfrastruktur zu erstellen, bevor Sie andere Arten von Code schreiben möchten beschrieben.
Das Team verschwendet viel Aufwand entwerfen, Dokumentieren und Erstellen von Code, der nie in der Produktion verwendet wurde.
Stattdessen, was geschieht, wenn das Team hatte schnell Schreiben einer allgemeinen Spezifikation mit minimalen Details ausgeglichen, und dann fortgesetzt, die höchste Priorität zu entwickeln, Produktion einsetzbaren Qualität, dann das nächste höchste Priorität Feature, das feature und usw..
In diesem Szenario würde das Team, nur Infrastrukturcode, wie Datenzugriffs-Code erstellen, die von den Anforderungen von bestimmten Features, in abgerufen wurde.
Überlegen Sie diese.
Was ist ein besseres Ergebnis für ein Projekt am Ende der geplanten Zeitachse?
-
1. Nur 50 Prozent der vorgeschlagenen Features vollständig sind, aber die wichtigsten Features des Angebots Anfangsprojekt sind in der Produktionsumgebung bereitstellen.
-
2. Die meisten der Codierung Infrastruktur abgeschlossen ist, jedoch keine Funktionen vollständig verwendbar sind, und nichts in die Produktion bereitgestellt werden kann.
In beiden Fällen das Team ist nur ungefähr Hälfte durchgeführt und weder Ergebnis ist tatsächlich ein Erfolg im Vergleich zu den ursprünglichen Plan und den Zeitplan.
Aber welche "Fehler" würde stattdessen erklären Sie an Ihren Chef?
Ich weiß mein Chef und unsere Vertriebsteam würde definitiv das erste Ergebnis basierend auf Inkrementelle Bereitstellung bevorzugen.
Die Hauptvorteile von inkrementellen Übermittlung sind die folgenden:
-
Arbeiten in der Reihenfolge des Unternehmens Priorität.
Erstellen inkrementell vom Feature haben Sie die bessere Möglichkeit um die Features für das Unternehmen wichtigsten abzuschließen.
Schließlich sollten Sie warum jederzeit investieren, überhaupt entwerfen, erstellen und eine "nice," Funktion testen, bevor die Features "müssen haben" abgeschlossen werden?
-
Risiko zur Risikominimierung.
Offen gesagt, ist das größte Risiko in den meisten Projekten technischen nicht.
Das größte Risiko ist, dass Sie nicht Geschäftswert übermitteln, oder Sie das falsche System übermitteln.
Darüber hinaus die anspruchsvoll Realität ist, dass die Anforderungen und Projekt Analyse, die Sie ist nur als wahrscheinlich falsche als Entwurf oder Code.
Durch demonstrieren Features arbeiten mit Geschäftspartnern frühzeitig im Projekt, können Sie wertvolles Feedback zu den Anforderungen Ihres Projekts abrufen.
Mein Team wurden frühe Demos an unser Produkt-Manager und Sales Team unschätzbarem Wert für die Feineinstellung unserer Anwendung Benutzerfreundlichkeit.
-
Frühzeitige Bereitstellung.
Abgeschlossene Funktionen können in der Produktionsumgebung vor dem Rest des Systems starten bei einigen Rendite Wert einfügen.
-
Flexible Bereitstellung.
Ob Sie es glauben oder nicht ändern Sie die Geschäftspartner und Ihr Produktmanager manchmal deren Prioritäten.
Anstatt Ihre Zähne zu Unrecht es alle Knirschen, können Sie in einer Weise arbeiten, die wird davon ausgegangen, dass Prioritäten geändert werden.
Blockieren Infrastrukturcode zu den Features in spielen, verringern Sie die Wahrscheinlichkeit von ungenutzten Aufwand aufgrund von Prioritäten zu ändern.
Jetzt, für der Nachteil der inkrementellen Lieferung: schwierig werden.
Im Beispiel schlanke Produktion pull Produktion bearbeitet nur da Lieferkette des Unternehmens ultraefficient war und vordefinierte Factorys mit Teilen fast bei Bedarf konnten.
Dasselbe gilt für die inkrementelle Übermittlung.
Sie müssen in der Lage, schnell Designelemente der neuen Features und halten Sie die Qualität der Codestruktur hoch genug, dass Sie vornehmen künftige Features schwieriger zu erstellen.
Was Sie dazu keine Zeit haben ist Wochen oder sogar Monate gleichzeitig arbeiten ausschließlich architektonische Fragen aufwenden, jedoch noch die architektonischen Aspekte.
Sie müssen die Möglichkeit, Entwerfen Sie Softwaresysteme inkrementelle Delivery-Modell entsprechend ändern.
Dies kommt kontinuierliche Design in das Bild.
Kontinuierliche Design
Befürworter der herkömmlichen Entwicklung häufig glauben, dass Projekte erfolgreichsten, sind wenn der Entwurf vorab vollständig angegeben werden kann überflüssige Aufwand im Code reduzieren und überarbeiten.
Die Rise of Agile und kurzen Programmierung hat herkömmlichen Konzepte für die zeitliche Steuerung der Softwareentwurf Aufforderung, durch die Einführung eines Prozess kontinuierliche Design, das während der Projektdauer geschieht.
Kontinuierliche Design absichtlich verzögert Verpflichtungen zu bestimmten Entwürfen, verbreitet sich mehr Entwurfsarbeit über den Lebenszyklus des Projekts und fördert ein Team ein Entwurfs weiterentwickeln, wie das Projekt durch Anwenden von Erfahrungsberichten aus dem Code kann.
Betrachten Sie diese Möglichkeit.
Ich wird nicht einfach den detaillierten Entwurf für ein Feature entwickeln, bis das Feature zu erstellen.
Ich könnte versuchen, es jetzt entwerfen, aber, Entwurfsarbeit würde nicht bieten Vorteile erst viel später – und nach meinem Team auf die Funktion ruft, ich bin wahrscheinlich viel mehr über unsere Architektur und System verstehen und in der Lage erarbeiten sich mit einem besseren Entwurf als habe am Anfang des Projekts konnte.
Bevor ich weiter, möchte ich sagen, dass kontinuierliche Design nicht impliziert, dass keine Entwurfsarbeit vorab erfolgt.
Ich möchte
Dieses Angebot von Robert C.
(Onkel Bob) Martin
: "
Das Ziel ist ein kleiner, aber kann anfängliche entwerfen, erstellen und verwalten und weiterentwickelt, Entwurf für die Lebensdauer des Systems
."
Bevor Sie aus fortlaufenden Entwurf als riskant und fehleranfällig schreiben, erläutern wir, wie fortlaufende erfolgreich entwerfen (anders gesagt, ich werde versuchen, Sie davon überzeugen, dass diese verrückte nicht).
Der Last verantwortlich Zeitpunkt
Wenn nicht voraus, wenn Sie nehmen Entwurfsentscheidungen?
Eine der wichtigsten Lektionen, die Sie, über fortlaufende Entwurf erfahren ist der Entscheidungen cognizant werden Sie über den Entwurf, und entscheiden, wann diese Entscheidungen consciously soll.
Schlanke Programmierung vermittelt uns Entscheidungen Zeitpunkt"Letzte verantwortlich." Nach Mary Poppendieck (in Ihr Buch kurzen Softwareentwicklung) folgenden dieses Prinzip bedeutet, "Engagement bis … Verzögerung der Zeitpunkt, an welche fehlschlagen stellen eine Entscheidung wichtige Alternative beseitigt."
Der Punkt ist, Entscheidungen so spät wie möglich zu treffen, da, wenn Ihnen die meisten Informationen mit denen die Entscheidung.
Denken Sie an das fehlgeschlagene Projekt am Anfang dieses Artikels beschriebenen.
Das Team entwickelt und viel zu früh an einen detaillierten Entwurf für Datenzugriffs-Code übergeben.
Wenn die Entwickler die Benutzeroberfläche lassen mussten und Geschäftslogik Laufwerk muss die Form des Datenzugriffs-Code, während der Erstellung des Benutzers Features der Benutzeroberfläche, haben Sie konnte etwas vergeblicher Bemühungen verhindert.
(Dies ist ein Beispiel für "Client-gesteuerte Entwurf", erstellen Sie außerhalb der Consumer einer API zunächst um Form und Signatur der API selbst zu definieren.)
Einer der wichtigen Ideen ist, sollten Sie nun denken und kontinuierlich vorschlagen Entwurfsänderungen, aber Sie sollten nicht unwiderruflich zu eine Richtung Entwurf zusichern bis zu.
Wir möchten fungieren basierend auf spekulative Entwurf.
Commit frühzeitig zu einem Design verhindert die Möglichkeit, eine einfachere oder eine bessere Alternative, die sich selbst weiter unten in das Projekt möglicherweise verwenden.
Um einen ehemaligen Kollegen, Mike 2 von 2 NUnit Ruhm Angebot "Think nun Ja, ahead keine führen."
Reversibility
Martin Fowler angezeigt wird, "Wenn Sie Ihre Entscheidungen problemlos ändern können, dies bedeutet weniger wichtig, um rechts zu erhalten, wodurch Ihr Leben viel einfacher." In engem Zusammenhang mit dem letzten ist verantwortlich Moment das Konzept der Reversibility, denen ich als Möglichkeit oder Unfähigkeit, eine Entscheidung ändern würde.
Wird von der inhärenten Reversibility Ihre Entscheidungen cognizant unbedingt zu das Prinzip der im letzten Moment verantwortlich.
Die erste Entscheidung mein Team für die aktuelle Projekt wurde, ob mit Ruby on Schienen entwickeln oder bleiben Sie mit einer Architektur .NET vorgenommen.
Auswählen einer Plattform und Programmiersprache ist keine Entscheidung leicht umkehrbar, und wir wussten wir mussten, frühzeitig Entscheidung.
Auf andere Projekte habe ich musste mit externen Gruppen zu koordinieren, die zum Definieren und Planen Ihre Zeit Monate im Voraus erforderlich.
In den Fällen mussten mein Team absolut vorab zu Einbindung mit externen Teams Entscheidungen treffen.
Eine klassische Entscheidung im Zusammenhang mit Reversibility ist, ob Zwischenspeicherung in eine Anwendung zu erstellen.
Fälle, in denen Sie vergewissern Sie sich kennen möchten Sie wirklich einige Datenbestandteil Zwischenspeichern, überlegen.
Wenn Sie fürchten sind, dass Zwischenspeichern unmöglich, später Nachrüstung werden, haben Sie ausnahmslos erstellen, Zwischenspeichern am Anfang – Obwohl, Zeitverschwendung möglicherweise.
Andererseits, haben was passiert, wenn Sie strukturierte den Code, der Zugriff auf diese Daten in einer solchen Weise zu isolieren, dass Sie problemlos Nachrüstung konnte Zwischenspeicherung in den vorhandenen Code mit geringem Risiko?
Im zweiten Fall aus können Sie hinsichtlich die Zwischenspeicherung Unterstützung für den Moment einfach aufzugeben und die Funktionen schneller zu übermitteln.
Reversibility führt auch mein Team in welche Technologien und Verfahren wir verwenden.
Da wir eine inkrementelle Übermittlungsprozess (Kanban mit engineering Vorgehensweisen Extreme Programming) verwenden, bevorzugen wir definitiv Technologien und Methoden, die höhere Reversibility zu fördern.
Unser System müssen wahrscheinlich mehrere Datenbankmodule irgendwann in der Zukunft unterstützen.
Zu diesem Zweck verwenden wir ein Framework Object Relational Mapping, um unsere Zwischenebene von tatsächlichen Datenbank-Engine größtenteils entkoppeln.
Ebenso wichtig haben wir einen ziemlich umfassenden Satz von automatisierten Tests, bei denen unsere Datenbank zugreifen.
Wenn es Zeit für Datenbankmodule vertauschen ist, können wir diese Tests verwenden, um sicher sein, dass unser System mit der neuen Datenbank-Engine funktioniert – oder zumindest hinweisen genau, wo wir nicht kompatibel sind.
YAGNI und die einfachste Thing, die möglicherweise funktionieren kann
Kontinuierliche Design hierzu wir zu unseren Code so ändern Sie erleichtern haben, aber wir möchten wirklich viel Überarbeitung in unserem Code zu verhindern, wie wir Änderungen daran vornehmen.
Inkrementelle Bereitstellung hierzu wir konzentrieren, erstellen nur die Features, die wir beauftragt sind mit jetzt erstellen möchten, aber wir möchten nicht das nächste Feature unmöglich oder schwerer zu entwickeln, indem Sie den Entwurf nicht kompatibel mit künftigen Anforderungen stellen.
Extreme Programming eingeführt zwei Redensarten zu Entwicklung Vernacular, die hier relevant sind: "Sie sind nicht gonna benötigt" (YAGNI, "Yawg-nee" ausgesprochen), und "Die einfachste Sache, die möglicherweise funktionieren konnte."
Erstens verbietet YAGNI Sie das System beliebigen Code hinzufügen, nun, die von aktuellen Funktionen nicht verwendet werden. "
Analyse Lähmungen"in der Softwareentwicklung ist ein sehr reale Problem und YAGNI schneidet über dieses Problem durch erzwingen Sie nur das unmittelbare Problem konzentrieren.
Umgang mit Komplexität ist schwierig, aber YAGNI unterstützt, indem reduziert den Umfang der Systementwurf zu einem beliebigen Zeitpunkt berücksichtigt werden müssen.
Natürlich YAGNI kann sound angsteinflößende Angelegenheit und vielleicht sogar irresponsible, da Sie sehr gut Maß an Komplexität möglicherweise Sie umgangen um zum erste Mal.
Folgende YAGNI sollte nicht bedeuten, dass Sie zukünftige Möglichkeiten beseitigen.
Eine der besten Möglichkeiten, um sicherzustellen, dass besteht darin, "die einfachste Sache." einsetzen, die möglicherweise funktionieren kann
Ich möchte die einfachste Sache, die möglicherweise konnte in der folgenden Liste aufgeführten Alan Shalloway Definition.
(Einmal-und-nur-Once-Regel bezieht sich auf die Beseitigung von Duplizierung aus dem Code; eine andere Möglichkeit zur Beschreibung des Prinzips "nicht selbst Wiederholen").
Wählen Sie die einfachste Lösung, die diese Regeln weiterhin entspricht:
-
Alle Tests ausgeführt.
-
Einmal-und-nur-Once-Regel folgt.
-
Hohe Kohäsion hat.
-
Hat lockeren Kopplung.
Diese strukturelle Merkmale des Codes leichter Code um später ändern.
Der Punkt diese ergänzenden Redensarten ist, dass jeder Teil Komplexität gewinnen rechts davon vorhanden sein.
Alle Dinge, die eintreten können, wenn Sie eine komplexere Lösung über eine einfachere überlegen:
-
Die zusätzliche Komplexität ist klar gerechtfertigt.
-
Die zusätzliche Komplexität ist nicht notwendig und vergeblicher Bemühungen über ein einfacher Ansatz dar.
-
Die zusätzliche Komplexität erschwert weiteren Entwicklung.
-
Die zusätzliche Komplexität erweist sich flat-out falsch und muss geändert oder ersetzt werden.
Die Ergebnisse der Komplexität hinzufügen gehören einem positiven Ergebnis und drei negative Ergebnisse.
Im Gegensatz dazu kann bis das Gegenteil erwiesen, eine einfache Lösung ausreichend sein.
Noch wichtiger, einfache Ansatz wahrscheinlich viel leichter erstellen und mit anderen Teile des Codes verwendet werden und wenn verfügt auch geändert werden, können Sie leichter einfachen Code als komplizierten Code zu ändern.
Der schlimmsten Fall ist, dass Sie wegwerfen einfachen Code, und starten über aber nach der Sie wahrscheinlich ein viel besseres Verständnis des Problems trotzdem sind.
Eine komplexere Lösung wird manchmal definitiv auf im Blocksatz ausgerichtet werden aktivieren und die richtige Wahl, aber mehr häufig als nicht einfacher Ansatz ist besser, am Ende.
Konsistent folgenden YAGNI und "das einfachste, was" ist in zweifelhaft einfach die Wahrscheinlichkeit folgt.
Wie viele Modeling vor Programmieren?
Sagen Sie Dokumentationsanforderungen für den Moment einfach reserviert.
Hier ist eine klassische Frage bei der Softwareentwicklung: "wie viel entwerfen und Erstellen von Bedrohungsmodellen tun? vor dem Code" Es gibt keine definitive Antwort, da jeder Situation unterscheidet.
Der wichtige Punkt hierbei ist, wenn Sie nicht sicher sind, um den Vorgang fortzusetzen, dies bedeutet in einem Modus Learning sind.
Ob einige modellieren möchten oder unsystematische Codierung zuerst streng hängt welche Ansatz hilft Sie schneller über das Problem zu erfahren und, besteht natürlich dieses klassische Angebot von Bertrand Meyer Wiederholen: "Blasen nicht abstürzen."
-
Wenn Sie mit einem unbekannten Technologie oder Entwurfsmuster arbeiten, denke ich, dass die Modellierung fast so übersichtlich wie Ihre Hände dirty mit einigen unsystematische Codierung abrufen nicht.
-
Ist eine Vorstellung von Entwurf viel einfacher, die in einem Modell als im Code zu visualisieren, zeichnen Sie durch alle Fall einige Modelle.
-
Wenn Sie keine Ahnung, wo im Code gestartet haben, nicht nur das IDE-Fenster für Inspiration Hoffnung stare.
Aus Papier und Stift nutzen Sie und notieren Sie die logische Aufgaben und Zuständigkeiten für die Aufgabe, der Sie arbeiten.
-
Wechseln Sie zur Codierung der Sekunde, die Sie einen Punkt abnehmender Rückgaben mit Bedrohungsmodellen gelangen.
(Denken Sie daran, Sprechblasen abstürzen nicht!) Die Felder in Ihrem Diagramm besser ausrichten hilft besseren Code zu schreiben nicht!
-
Wenn Sie direkt in Code springen und beginnen, kämpfen, beenden und zurück zu modellieren.
-
Denken Sie daran, dass Sie zwischen Codieren und Modellierung wechseln können.
Oft ist Wenn Sie mit einem schwer Codierung Problem konfrontiert sind, sollten Sie am besten, wählen Sie die einfachsten Aufgaben, code in Isolation und mithilfe des Formulars des Codes können Sie bestimmen, wie der Rest des Codes aussehen sollte.
Eine andere Sache zu beachten ist, dass einige Formulare modellieren einfacher als andere sind.
Wenn UML Sie bei einem Problem helfen nicht ist, wechseln Sie zu CRC-Karten oder sogar Entität Beziehung Diagramme.
Was ist machen
In diesem Artikel wurde kein Code überhaupt, aber mein Kollege dringend, dass diese Konzepte auf fast alle Entwurfsentscheidungen angewendet.
In einer zukünftigen Kolumne werde ich sprechen über einige bestimmte Konzepte und Strategien für die Entwicklung Entwürfe, die Sie fortlaufende Entwurfsprinzipien verwenden können.
Ich werde auch viel genauer beschreiben wie die Umgestaltung in fortlaufenden Entwurf einfügt.