Wie erstelle ich die Architektur / das Design einer Anwendung in Agile?

8

Wenn ich im Begriff bin, eine Enterprise-Anwendung zu entwickeln, aber soweit ich aus agilen Prozessen weiß, teile ich Features in kleine Teile auf und entwickle sie iterativ. Ich habe zuerst die Datenbank und den Kern der Anwendung erstellt und diese dann iterativ erweitert.

Die Frage ist: Muss ich das, was ich vorher getan habe, beibehalten (zuerst den Kern entwickeln) oder muss ich die Kernentwicklung auf die Entwicklung der Geschichten verteilen? Im späteren Verlauf bin ich mir nicht sicher, ob der Code für zukünftige Erweiterungen flexibel genug sein wird!

Irgendeine Idee?

Sameh Deabes
quelle
2
Die Chancen stehen gut, dass alles, was Sie im Vorfeld als "flexibel genug" betrachten, entweder zu unflexibel oder viel zu flexibel ist.
OK, gibt es Techniken, um gutes Design / Architektur während der iterativen Entwicklung zu liefern, ohne zuerst den Kern zu entwickeln? Entschuldigung, ich bin neu in Agile: /
Sameh Deabes

Antworten:

11

Entwickeln Sie den Kern nicht zuerst . Ein Schlüsselprinzip der agilen Entwicklung besteht darin, den minimalen Code zu schreiben, der für die abgeschlossenen Funktionen erforderlich ist. Auf diese Weise können Sie jederzeit liefern. Der Code bleibt flexibel, da Sie ihn kontinuierlich umgestalten, um Doppelarbeit zu vermeiden. Das Refactoring wird durch die automatisierten Tests unterstützt, die Sie für jedes Feature geschrieben haben, als Sie es erstellt haben. Der Kern wächst automatisch, wenn Sie die Duplizierung von Code höherer Ebene herausrechnen.

Anstatt Flexibilität in einem normalerweise vergeblichen Versuch zu schaffen, teure zukünftige Codeänderungen zu minimieren, erstellt Agile automatisierte Tests zur Unterstützung des Refactorings, sodass Codeänderungen relativ kostengünstig sind.

Martin Fowlers Refactoring ist mein Lieblingsbuch über effektive Refactoring-Techniken. Es ist viel einfacher, einen verwendbaren Kern herauszufiltern, als einen im Voraus zu definieren. Das Definieren eines verwendbaren Kerns vor der Implementierung von Features ist nahezu unmöglich, es sei denn, Sie implementieren lediglich eine vorhandene API neu. Und das hat keinen Wert.

Kevin Cline
quelle
Dann ist der Schlüssel hier kontinuierliches Refactoring + automatisierte Tests. Vielen Dank!
Sameh Deabes
1
@ Girgio: Entschuldigung, unklar. Ich meinte, es hätte keinen Wert, ein eigenes Protokollierungsframework oder ORM usw. zu schreiben, anstatt nur eine der vielen vorhandenen Alternativen zu übernehmen. Es scheint offensichtlich, aber ich habe mehrere Unternehmen gesehen, die genau das getan haben.
Kevin Cline
1
@kevin: Ich denke, dass es in bestimmten Fällen sinnvoll ist, mit Ihrer eigenen Lösung zu arbeiten. So etwas wie die Protokollierung, deren Umfang relativ klein ist, würde ich wahrscheinlich eine vorhandene Lösung verwenden. So etwas wie ein ORM kann ich sehen, wenn es darum geht, eigene zu rollen. So etwas wie Doctrine hat Code, um eine Menge verschiedener Anwendungsfälle und Funktionen zu behandeln, aber was ist, wenn ich nur 25-30% davon benötige? Wenn ich die 25-30% der Funktionen, die ich benötige, selbst erhalte, erhalte ich etwas, das kleiner, benutzerfreundlicher und wahrscheinlich leistungsfähiger ist.
Ryanzec
2
Sie können die Architektur eines Systems nicht einfach neu gestalten. Dies ist ein verbreiteter Mythos von Agilität und Architektur.
Michael
1
@SamehSerag, "Der Kern wächst automatisch, wenn Sie [neu] faktorisieren ..." impliziert, dass die Architektur nicht aktiv ausgewählt wird, sondern "automatisch" durch zufällige Entscheidungen über Entscheidungen auf niedrigerer Ebene (nicht auf systemischer Ebene) entstehen darf. Das ist das Problem beim Versuch, die Architektur durch Refactoring organisch zu "wachsen".
Michael
1

Mein Ansatz für eine agile Entwicklung besteht darin, "vertikale Schichten" zu erstellen. Ich nehme eine Geschichte von der Benutzeroberfläche in den Speicher und implementiere sie. Ich habe einige leichte Tools, die ich verwende, um diesen Prozess zu unterstützen (wie ein einfaches IRepository / UnitOfWork-Framework, das Adapter für In Memory (normalerweise zum Testen), Entity Framework und NHibernate enthält Argument, ob man ein O / RM verwenden soll, aber welches man verwenden soll. Und für mich hängt es von der Umgebung ab.

Ich habe festgestellt, dass dieser Ansatz die Neinsager in Bezug auf die agile Entwicklung überzeugt, weil sie funktionierende Software schneller erkennen, als wenn ich viel Zeit im Voraus damit verbringe, einen Kern zu erstellen. In Kombination mit Domain Driven Design und einigen anderen Techniken, die ich verwende, kann ich den Benutzern normalerweise sehr schnell viele Arbeitsfunktionen zur Verfügung stellen.

TDD- oder sogar Post-hoc-Komponententests sind wichtig, da ein Teil der Aufrechterhaltung der Geschwindigkeit bei wachsender Anwendung über das Sicherheitsnetz verfügt, das eine umfassende Komponententestsuite bietet. "Ich muss diese Klasse ändern. Wie stelle ich sicher, dass ich nichts kaputt gemacht habe?" Mit einer guten Unit-Test-Suite ist es so einfach wie das Ausführen dieser Testsuite. Ohne müssen Sie Ihre App manuell durchlaufen, um sie zu überprüfen. Überhaupt kein Spaß.

Michael Brown
quelle
-1

Erstellen Sie das minimale horizontale Framework, das einen vertikalen Teil der Funktionalität unterstützt. Das Framework ist erweiterbar gestaltet und konzentriert sich zunächst auf die meisten Anstrengungen. Der vertikale Teil der Funktionalität besteht darin, zu demonstrieren, dass das Framework den tatsächlichen Wert unterstützt. In nachfolgenden Iterationen wird weniger Aufwand aufgewendet, wenn das Framework realisiert wird, und mehr, um mithilfe des Frameworks Funktionen aufzubauen. Fahren Sie auf diese Weise fort, bis sich der größte Teil des Aufwands auf die Funktionalität konzentriert, die das über Iterationen entwickelte Framework verwendet.

Chris Wolters
quelle