There is a persistent myth that Agile Design is an oxymoron as there is no place for design in Agile; that our design and architecture will magically emerge as we code. This opinion is a natural reaction against the waterfall Big Design Up Front (BDUF) mentality. However it is a false and even dangerous opinion.
Dangerous in that the ad hoc ‘design’ that results from doing no design results in code that is:
Coding without doing any design work is not Agile; it is hacking pure and simple and you will end up with an instant legacy system.
Firstly, we maintain our focus on business value as the key driver for our design. A Fit-For-Purpose business-value-drive design results from an ongoing collaboration between the team, the customers, and other relevant stakeholders. This collaboration must include all stakeholders touching or touched by, including suppliers and regulators.
Secondly, the design is owned collectively by the team and the code is co-owned by the designer via their design. The developers will own certain design aspects at the unit and user story level. The designers and architects serve as design SMEs to the developers, as well as facilitate collaborative design workshops.
True to the Agile principle that technical excellence enhances agility, Agile design emphasizes excellence in design. This results in:
It is important to avoid the dangers of over-designing and over-documenting. So it is key to do only just-enough design that will ensure a coherent Fit-For-Purpose design. Documentation should be low-fidelity, so put Visio away as it is far easier to collaborate around a whiteboard than a computer screen. It is also quicker to sketch on a virtual whiteboard that create a diagram in Visio, then just snap a picture and attach it to the user story.
Goal is to do just enough design and architecture upfront, with detailed design being done as needed during backlog grooming. Key design concepts and techniques are summarized in the table below.
|Shearing Layers||Each architectural layer change/evolve at different speeds. Keep them loosely coupled as tight coupling results in rigid, hard to modify and hard to understand design.|
|Model Storming||Collaborative brainstorming designed to quickly develop high-level architectures and designs using techniques such as CRC Cards or Domain-Driven Design.|
|Intentional Architecture||Lever common architectural patterns, constraints and implementation technologies to optimize usability, extensibility, performance and maintenance. Addresses both business and technical requirements. Prove out by creating a Minimum Viable Architecture.|
|Architectural Runway||Provides sufficient architecture to support the incorporation of near-term product backlog items without needing architectural refactorings.|
|Minimum Viable Architecture||The minimum architectural implementation required to prove out an end-to-end architectural design.|
|Design Patterns||Provide proven, reusable design building blocks. Developed by looking at the common characteristics of solutions to related problems.|
|Design Principles||Describe Object Oriented design best practices.|
|Design for Testing||Design principles focusing on designing code that is optimized for automated testing.|
|Acceptance Test-Driven Development||Use to do behavior-focused design at the user story level. The Given-When-Then structure:
· Guides the design of the application flow and state changes
· Helps identify the inputs, processing, and outputs
· Refines the low-level design prior to coding
If you are interested in a more in-depth look at Agile Design, check out Learning Tree’s Agile software design course, which also qualifies participants for the ICAgile Certified Professional in Agile Software Design certification.