Friday, July 28, 2006
Iterative development is generally a good thing. However, it is important to recognize that things don't really happen sequentially.
I was recently involved in a project that had three phases. The idea was that the developers would create the Phase 1 software, then that would go into testing and later production, while the developers started working on Phase 2. Then when Phase 2 went into testing, the developers would start Phase 3. The intended timeline looked something like this:
|Developers||Develop Phase 1||Develop Phase 2||Develop Phase 3||Get some sleep||Testers||Prepare for testing||Test Phase 1||Test Phase 2||Test Phase 3||Get some sleep||Operations||Prepare for Deployment||Deploy Phase 1||Deploy Phase 2||Deploy Phase 3||Take turns getting some sleep|
Looks good on paper, right? I saw the Gantt chart, and it looked very simple.
Here's what really happened: Developers worked on Phase 1, and met a tight deadline. So they started on Phase 2. But of course, the testers found some problems and had some questions about Phase 1, so developers kept getting pulled away from Phase 2 to support Phase 1.
Even with those distractions, the developers met their second deadline. Here's where the real fun started. Now the developers were expected to develop the Phase 3 software, while supporting deployment of Phase 1, and supporting testing of Phase 2. For a team of a half-dozen members, this was spreading things thin.
Rather than being a three-phase project, it was really more like working on three projects simultaneously. There were no breaks for people to rest. Once the system went into production, everybody was on call 24 hours a day to deal with whatever fires broke out. There were all-night teleconferences. The developers were still expected to make progress on Phase 3.
How did it end? Thankfully, a project manager realized that there was no way for the developers to meet the Phase 3 schedule, and convinced the higher powers that Phase 3 needed to be postponed. And so all the developers got to take vacations (except for those who had already quit).
- Support of testing and deployment are not trivial tasks that developers can do in their spare time.
- Consider assigning different teams to different phases.
- An iteration doesn't end until its product is no longer in use.