Let's consider the simplified version of a complicated question, how to develop a system composed of ComponentA and ComponentB? ComponentA can be a software sub-system. ComponentA can also be deliverable artifacts like documentation, design, or code. The assumptions are: ComponentB cannot be started until ComponentA is finished; both ComponentA and ComponentB take significant efforts to finish.
The straightforward answer is:
- Step One: Finish ComponentA;
- Step Two: Finish ComponentB;
- Optional Step Three: Assemble ComponentA and ComponentB together.
This is exact the sequential waterfall approach. It mimics what an assembly line has been doing in the mature manufacturing industry over decades of years. However, software is quite different from hardware. By its very nature of flexibility, software development process is much less predictable. Big surprises (or risks) may arise:
- The ultimate goal of the project is a moving target;
- By any chance, if ComponentA is delayed, all components down the chain will be delayed;
- If a working project cannot be delivered finally, ComponentA may be totally useless.
To control the risks, Agile Methodologies, the iterative, adaptive and incremental approach, are preferred. The process looks like:
- Step One: Finish (ComponentA-- and ComponentB--); "--" means a simplified version of the system;
- Step Two: Finish (ComponentA- and ComponentB-);
- Step Three: Finish (ComponentA and ComponentB).
The benefits are listed below:
- Be adaptive to changing requirements. End user's feed back can be heard early. To do the right project is more important than to do the project right.
- Progress and deliveries are very visible. We don't have to wait until the Step Three to see some workable results.
- If by any chance, there are limited budget, time, or resources to finish the Step Three, the results of Step One and Step Two are still acceptable working systems.
For any approaches adaptive in their nature, people will raise the question, how to make the short term targets in line with the long term goals? This question has an assumption that the 'long term goals' are well known. Agile Methodologies help most when the 'long term goal' is unclear or when the process how to achieve the 'long term goal' is unclear. The short term cycles help to clarify things during the iterative process. If both the 'long term goal' and the process how to achieve it are crystal clean and carved into a stone, go ahead using Waterfall with no hesitation.
It's my motto that - Release early, release often, and release working products. However there is no panacea to resolve all software quality and delivery challenges. In another
post here, I discussed limitations of Agile Methodologies.
No comments:
Post a Comment