How long will it take to develop a particular project? This is a question that it's never easy to answer. When you start estimating, you have a partial idea of what you have to do and the issues you may find along the way.
When it comes to me, I usually split the full project into smaller pieces, each one of them can be accomplished in a week or less. I use one week as a maximum time for each task because:
- the pieces are small enough to give me a detailed idea about them, and
- there isn't the (psychological) risk to say: "There's so much time ahead; I'll do this part next week".
On the other side, the minimum amount of time I use is one day. Even if a task only requires a couple of hours, I count it as a full working day. The reason is that I've noticed that the sum of four two-hour tasks takes more than eight hours: you have to switch your mind from a task to another, maybe do some work on the repository (pull & merge & push, set up a new branch, etc.) and there is always some contingency to answer quickly.
Once I have all the times for the various tasks, if the project is going to take months, I add a couple of extra weeks.
Of course the extra time (final two weeks and the fraction of days) may be used to cover some underestimation. You may say that with the experience, the uncertainty should decrease but I can tell you that it is exactly the opposite. As Socrates used to say:
I know that I know nothing.
The more experience you have, the more you know that hidden problems can show up in the middle of a project and delay everything. You have also to consider that if you work with a strict schedule, you end up cutting corners and introduce technical debts only to meet the deadline. Needless to say that this will impact on the reliability of the final result.
In any case, an overestimation of few days for the development part of a project leaves more time for tests and this is always a good thing.
Cover image by CityGypsy11 from Flickr licensed under the Creative Commons Attribution-NonCommercial 2.0 Generic license.