There is practically no such thing as a reliable estimate based on coarse requirements. In fact, in my experience, any single task estimated at more than 1 day is a strong indication that the task needs to be broken down further into subtasks.
Even a week-long estimate usually turns out badly. In my experience, most tasks estimated at 1 week without further details end up taking 2-3 weeks, and the problem only gets worse with larger projects.
It's largely psychological. We know that as programmers/designers/architects, we are optimists. When we give ourselves a long, nebulous target to hit, it's incredibly easy to feel like we are ahead of the game even though we really aren't. 4 more weeks? And all I have to do is fix the broken search function that was working last week? That's easy! Let's put it aside and work on some fun Ajax fade effects.
Having said this, there is a particular heuristic I often use for back-of-the-envelope estimates, and let me be crystal clear that these are never actually committed to or used in project plans - they're simply ways to help answer the question that customers and managers always ask, "so let's say we want to do <some_vague_project>
, how long do you think that would take?"
First I identify certain facets of the project, namely:
- Expected lifetime - run-once, temporary, or permanent?
- Originality of project - have we done anything like it before?
- Level of domain knowledge required vs. known - do the specs have a learning curve?
- Volatility - how clear is the scope/ownership, how likely is it to change?
- Impact - will it support/replace a critical business function?
- UI complexity - less than 5 screens, less than 20, or more?
- Is it customer-facing? (If so it will need to go through a zillion revisions)
- Does it need to interoperate with any other systems?
Then I usually assign "points" to each of these (note that this is not a "system", this all happens in my head and usually requires fine-tuning). Tally up the points for an approximate project size:
- No points: 1-2 days (a script)
- 1 point: 1-2 weeks
- 2 points: 2-4 weeks
- 3 points: 1-2 months
- 4 points: 3-6 months
- 5 points: 6-12 months
- 6 or more points: No clue.
Note what I'm doing here - there's a more-or-less exponential rate of growth with complexity. When you add a new wrinkle, such as that the app is customer-facing, that doesn't just add a little extra time to the project, it doubles or triples the time because now everything will take longer as a result of having to be vetted for language, legal, look and feel, etc. Same idea if it's replacing a critical business function; now every single component needs to be written defensively to plan for every possible contingency.
I want to repeat for the record that this is of no practical use in a real project plan and I would never actually commit to a project timeline without breaking down the entire spec into tasks of a maximum size of 1-2 days. This is only for answering quick, off-the-cuff questions when customers/managers effectively ask me to do the math in my head and aren't willing to take "I don't know" for an answer.
Once again, just to be absolutely sure everybody heard me: Do not use this method to create an actual project estimate. It is at best useful for coming up with a minimum baseline project "size", something you can say in a board meeting to set some semblance of an expectation without signing on the dotted line.