I'm a fan of estimations as long as they are not used to try to figure out when a feature will be done. I like estimations and I think they are critical when they are used to decide which features should be done and which ones shouldn't.
So, if they are so important, what is the best way to make estimations. I'm going to share my secret formula based on the things that I have read and my personal experience in my professional career (where I have to admit that my estimations are now completely different than 15 years ago).
There are two key concepts that we need to understand before digging into the actual formula:
- One feature working doesn't mean the feature is complete or ready. Instrumentation, thread safety, unit tests, error handling, documentation, automation, unexpected problems, bug fixing... most of the times takes much more time that the implementation of the basic functionality.
- Once you write something you usually have to maintain and not break it forever. Making sure that new features, refactors or any minor change doesn't break any existing code is a really big deal in any project with enough complexity.
Based on those key concepts we can split the cost of a feature in 3 buckets:
- Cost to have something working (the usual engineers initial estimation): X
- Cost to have something ready to be shipped: Y
- Cost to keep it working for the life of the product: Z
And now is when the scientific part is applied. Based on my experience and thousands (well, maybe 3 or 4) articles I have read I think the Pareto Principle has a perfect application in this case.
In any project the cost of implementing the basic functionality (X) is 20% vs the 80% of implementing the rest of functionality needed to ship the product (Y). So Y = 4 * X
I've seen a similar estimation of X + Y = PI * X that is a bit optimistic in my opinion. I recommend you to read the visual demonstration of what is called the circular estimation conjeture
For the second part (the maintainability cost Z) we can apply the same Pareto Principle to get Z = 4 (X + Y)
With all those numbers in place the conclusion is easy. The total cost of having a feature in a product is X + 4 * X + 4 * (X + 4 * X) = 25 * X
Take your initial guess (or ask any engineer) to get X, then the cost of the feature that you need to use to decide if it is worth to waste your time implementing it or not is exactly 25 * X
As corollary and final demonstration of the theorem, I though this post was going to take me 5 mins to write it and it took me 25 mins and I suspect I will have to spend more than one hour discussing about it with other people.