Evolutionary Design
The following comes from a tutorial on Evolutionary Design, created by Joshua Kerievsky and Russ Rufer.
What is Evolutionary Design?
For Projects, it means
- Whole systems grow in stages
- System Features
- Begin life primitively
- Selectively become mature
For Programmers, it means
- Being Test-Driven
- Not Over-Engineering
- Refactoring to
- Remove duplication
- Simplify, clarify code
- Being influenced by
- Time to Market
- Continuous Feedback
- High-Quality Code
- Lowering risk of modification via many automated tests
For Customers, it means
- Rapid response to changes in priorities
- Freedom to learn at each stage
- Freedom to go in new directions
- Closer contact with programmers
Evolutionary Designers
- Don't produce rigid upfront designs
- Communicate designs efficiently
- Know when to ignore the saying “If it ain't broke, don't fix it”
- Are Not Phasists (i.e. don't work in phases)
Ten Practices of Evolutionary Design
- Rapid Return On Investment
- Risk Reduction
- Backtracking
- Selective Automation
- Team Intelligence
- Walkthrough
- Spanning System
- Small Iterations
- Multiplicity & Selection
- Dead Reckoning
1. Rapid Return on Investment
To obtain Rapid ROI, ask:
- “What can be overlooked to go live?”
- “What can be dropped to go live?”
- “What must be improved before going live?”
- “What can remain primitive for now?”
2. Risk Reduction
Lower the Risk of Modifying Code by
- Writing good tests
- Running all tests frequently
- Practicing
- Test-Driven Development
- Continuous Refactoring
- Continuous Integration
- Not Over-Engineering
- Simple Design
- You Aren't Gonna Need It
- Using standard solutions
3. Backtracking
Continuously Ask or Observe:
- “It can't be this hard!”
- “Why do we need that?!”
- “How did we get here?”
- “There must be an easier way!”
After making critical observations:
- Consider alternatives
- Rewrite code
- Aggressively refactor code
- Remove dead code
4. Selective Automation
To get to production quickly, continuously ask:
- What must be programmed?
- What can be done manually?
Before programming a system or feature, consider living with it
- Using a paper-based solution
- To learn what
- needs to be automated
- doesn't need to be automated
5. Team Intelligence
Change anything at anytime
- Evolve unforeseen solutions
- Fix unsuccessful evolutions
6. Walkthrough
We spent far more time reading the JUnit code than we spent writing it”
– Kent Beck & Erich Gamma, JUnit: A Cook's Tour
Study code continuously to learn
- How to improve it
- Where to evolve it
7. Spanning System
An early, primitive system that
- Provides end-to-end behavior
- Touches everything critical
- Helps guide evolution
8. Small Iterations
Small Iterations help teams
- Deliver working features fast
- Learn from code
- Learn from Iteration Retrospectives
9. Multiplicity & Selection
Discover optimal solutions by
- Considering proven
- Developing
- Workable solutions
- Experimental solutions
- Better solutions
- Allowing for “Survival of the Fittest”
- Practicing Multiplicity & Selection Economically
10. Dead Reckoning
Ships once navigated by Deduced (or ded) reckoning. For us, it means
- Knowing where you want to go
- Continuously assessing your direction
|