One of the most exasperating thing any software engineer has
to go through is to answer a client's question- "How long do you think it
will take to finish this?". And the
second question is "How much is it going to cost?".
Unlike other
discipline, software development is always a new undertaking. It is always an
one shot task and involves several variables, that makes its estimation
extremely random. And further we human beings are very bad in making estimates.
According to Frank Knight in his Risk,Uncertainity and Profits (1925) every randomness has two components - risk
and uncertainty. Among which risk can be measured with knowable probabilities
using the standard statistical tool such as coefficient of variance , on the
other hand the uncertainty is class of randomness which cannot be attributed to
any knowable probability. With the
nature of software lifecycle , together with technological constraints and
changing customers requirement the entire software development mostly comprise
of Uncertain components rather than risk. As a result apriori estimates will
always fall short.
Thus the entire process can be categorized into three
categories using the class of awareness and unawareness as explained by Italian
Economist Salvatore Modica and Aldo Rustichini in their paper Awareness and
partitional information structures (1994)
i) Known Knowns: This is the type of software
project where we know what to be done and we know how to do it. For example if
we have developed and school MIS system
and now we have task to install it in new school with minor customization. In
this scenario the entire software project has changed into the class of
Job-shop.
ii. Known Unknowns: This is the class of software
project where we know what needs to be done but we really have no idea of how
to do it. For example A developer who has experience of developing an droid app
needs to integrate his current app with some telephony based system or PSTN.
Now lets assume that the developer has never worked in voice before then his
project falls into this category. In this scenario he will have to study Telephony system and will face
knowledge cliff and high learning curve before he can be pretty sure of how long it
will take to complete the project. Besides he will have to hire right person
with the knowhow . Which will eventually increase hiring and recruitment cost.
Open source community is big help in these situations but if the knowledge has
been patented then it's really difficult to accomplish it.
iii. Unknown Unknowns:
Though this term has often be dubbed as an abuse of language
by former defense secretary Donald Rumsfeld, it is still legit. Software
project that belongs to this class can lay claim on highly green pasture of
development. For instance developing a software to navigate the robotic probe
on surface of Europa (moon of Jupiter). In these scenario the developer neither
knows what to do nor how to do it. And
its success will depend on how well the research and development team can handle
the unknowns.
Besides these three class of awareness in software
development project , one another class can be deduced as per philosopher
Salvoj Zizek's extrapolation and that is
Unknown
Knowns:
This class of problem generally arise in small software companies
which witness attrition among its developer with high turn over rate. Without
smooth succession planning the developers while leaving the firm takes away all
their knowledge as a result the firm will have no knowledge of doing things
that they previously had done.
So how to make estimates then ?
This is the big question ? Considering all the above facts
it seems unreasonable and extremely presumptuous to make the estimates with any
software development projects besides the Job Shop type. But problem is
management and customers do not understand this issue. And especially if the
gestation period is too long the entire project may turn into jeopardy. Besides
the developers are generally more introverted in nature and have hard time
communicating the problems .
There are mathematical model such as function point
analysis and evidence based estimation. But still using these tools
can only mitigate Knightian risk and does not properly address the Knightian Uncertainity. Therefore the best way
is to get involved with customers. Get their regular feedback and apply
piecemeal approach. Agile approach is extremely helpful but its main drawback
is people may lose sight of goal and rather focus on small task.
So for any successful project following must be done
i. Divide work into piecemeal
ii. Get estimates of smallest tasks
iii. Build strong Knowledge Base
iv. Have separate R&D team that can provide the proof of
concept
v. Receive regular feedback from client
vi. Have a proper succession planning
vii. Bugs are part of life , deal with it
viii. Never think that your estimates are correct. The best
rule is estimates are never correct
ix. Never have marketing
team decide on the deadlines (most important).