Everybody knows that multitasking is bad in general. Time is wasted due to context switching and more errors due to insufficient attention. There are many opinions and articles about multitasking problems and general advice is to eliminate it when possible. However, it is required to define what the task is in multitasking before making any conclusions. For example, is it possible to consider waterfall a multitasking process?
For simplicity purposes, let’s assume that our development process has 4 stages: specification, design, implementation, testing. We have a bunch of requirements that may be implemented in the project. In the design stage we focus on the system design only. We think about objects, patterns, communication, API, etc. Looks like quite a focused activity, doesn’t? However, at the same time we are designing many features. We are trying to consider them all and create a design that supports all of the features at once.
There are two facets to this problem:
From this point of view we have a single focused task – system design.
Here, we have many tasks (design feature 1, design feature 2, etc.).
What is a better view? I think it is required to focus on delivery. In the end our ultimate goal is to ship working software with a set of features. We do not ship system design, requirements documents or acceptance tests. We ship functionality (features). Feature that solves a real problem is the most important thing in software development. That is what we produce. We should focus on features (that solve real problems in a most efficient way). We should not focus on activities; they are just a part of development process. If you can release working bug-free software without testing stage – that is perfect. If you can release it without design stage – fantastic. Following common/defined/approved/considered-best process is not a rule of thumb. If you can release working, usable, high quality, efficient software without any formal process – that is fine. I am not trying to diminish the importance of processes in the software engineering, but too many people developing software using waterfall, loose focus on their ultimate goal – to ship a product that user wants!
It is better to consider feature as a task (in a multitasking term, it means that multitasking and “multi-feature” are interchangeable). Having this in hands we can say that waterfall is a kind of multitasking. It leads to many features in production cycle, thus eliminating focus. Development team tries to follow defined stages with the best possible output, but the goal is often blurred. People focus on specification, design, implementation, testing, but often they loose focus on features. Why? Well, two reasons: context switching and insufficient attention.
For example, in the design stage you have many features to design and can’t prove all design concepts for all of them. During implementation stage you face many problems with wrong initial design decisions and have to change and adapt design quickly. That is natural, since design can be proved only during the implementation, there is no way to get it right the first time. However, such quick decisions may be uncontrolled and uncoordinated. They ruin the original fancy design. Insufficient attention? Yes, since it is impossible to design and prove ALL the features during the design stage.
The same is true for the testing phase where we have many features to test. We can’t focus on one feature, we feel that there are many more features to test and most likely will not complete full testing of one feature. We feel that it is better to test all features briefly than test some features deeply. We briefly test feature A, then jump and briefly test feature B hoping to get back to it later and complete the testing. We have many features to test causing insufficient attention. Often under time pressure you can’t get back to briefly tested features, and that leads to bugs in post-production period. Large testing stage blurs focus on features testing. It may sound strange, since it is the testing stage after all – but think about it once again.
Iterative development (especially using short iterations) solves these problems in the roots. You have few features in the production and may focus on them. It is easy to fully test several features. It is quite easy to design and prove the design right away (in waterfall you may have several months gap between feature design and implementation). You have a clear focus by not having to switch to other features outside of the iteration scope.
Iterative development is a vertical slicing. You implement “by Feature”. Waterfall development is a horizontal slicing. You implement “by Activity”. What do you prefer? 😉