A preennial problem in software development is determining how long it will take to deliver a useful system. Amusingly the conversation normally starts with the words How hard can it be…
The correct answer to this is a lot harder than you initially think it will be.
The problem is that collectively we are very bad at requirements elicitation
The idea that we could identify all requirements up front before developing the software has been proven false multiple times. A key reason for this is that any new system, has impacts outside of the intended results, that although possibly easy to see in hindsight are hard to predict …
- We can now send and receive emails, do we have a way of addressing the problems related to spam?
- Once connected to the internet, how to deal with distributed denial of service?
- With social media, none of the initial implementations considered hostile actors.
The Agile approaches deal with the problem by developing incrementally and iteratively. So a small part of the eventual system is built and evaluated. Depending on what is learnt during the evaluation, iteration may be required to rework the feature, design or implementation. This iteration is an essential part, as it allows new information to be incorporated into the system.
An obvious downside is that iteration slows the delivery of the next increment of functionality – since the rework of the delivered features takes time. But the key thing to consider it that not responding to what has been learned from the evaluation will mean that the eventual users will be adversely impacted.
Incremental Development requires Incremental Requirements Capture
The above implies that there is no point in trying to elicit and document all the requirements up front. Instead the requirements for the initial features need to be captured before doing the development of those features. But the requirements for the subsequent features can be deferred until later in the process – potentially just in time capture of the second set of requirements in parallel with the development and evaluation of the first features.
Hence my answer to How hard can it be… is how well do you understand your problem domain? With a hat tip to the Dunning Kruger effect where people without experience normally over estimate how good their understanding is.