- We Fail Too Much
- Definitions of Success
- The Standish Group
- Doing the Wrong Things
- Doing the Things Wrong
- Time Goes By, Things Improve
- One Reason: The Civil Engineering Analogy
- Giving Up Hope
- Ignoring Your Mother
- Bridges Are Hard, Software Is Soft
- We Swim in an Ocean of Change
- Accept Change
- Embrace Change
- Capitalize on Change
- A Better Analogy: Evolving Systems
- Summary
Embrace Change
What is being suggested now, first by the fellows who dreamed up eXtreme Programming (XP), and then later by the entire agile movement,5 is that we work in relatively short cycles (two weeks, a month, etc . . . ), and that in every cycle we do every step—analysis, design, testing, coding—and then let the customer look at what we have done and tell us if we are on track or not.
Each cycle allows us to adapt our design to what the customer has told us, and also capitalize on what we have learned about his domain by working on the system in detail.
Part of what makes this work is time boxing, the idea that we limit the length of time we will work on a system before we stop and get what we have done so far validated (again, read Appendix C for my views on this).
The value of this is manifold, but right off we can see that it will prevent us from trying to predict too much. If validating the software is part of making the software, we will not try to gaze into our crystal ball and predict what we'll be putting into the iteration two months down the line; we will wait until we see how this iteration went.
It is also an acknowledgment that these phases (analysis, design, code, test) are highly interrelated.
- Your design is a reflection of your problem domain—while determining the design, insights on the problem domain, and therefore requirements, arise.
- Coding gives you feedback on the practicality of your design, and also teaches you about the problem domain.
- Considering the testability of a design can help you evaluate its quality (more on this later).
- Often, we come up with questions while designing, coding, or especially testing, which inform our analysis of the domain.
In other words, working incrementally changes "I wish I had thought of this sooner" to "Now I get it; let's do it this way." It is a fundamentally stronger position to be in.