It’s a common problem in development and endlessly frustrating.
There is a 100% foul-proof way to estimate though:
1 – Do all of the work first
2 – See how long it took to do the work
3 – Make that the estimate
This is not very useful of course, it provides no predictability!
See software development is all about discovery.
It’s not possible for everything to be known at the beginning.
This is a big problem with “Absolute Estimation”
e.g “How long is this project going to take?”
Dev: “Six months”
You’re either guessing or doing so much work you may as well have just developed it.
Instead use something humans are quick and very good at:
“Relative Estimation”
e.g You may not know how high a skyscraper is, but you can say with certainty it is taller than that other one. You can also confidently say it’s about twice as big.
We make these types of estimations all of the time and we’re good at it.
This combined with some agile practices, it is possible to “project” delivery dates within a 10-20% margin. Best part is you can estimate an entire project in just a few hours.