Estimating software work without lying to yourself

January 23, 20265 min readBy Harman Kamboj
CareerBuilding in public

I have given an estimate of two days for something that took two weeks, and I was not being lazy or dishonest when I said it. I was picturing the version of the task where everything goes right, the API behaves, the requirements do not change, and nobody finds an edge case. Estimating software work is hard precisely because our brains default to that clean fantasy and quietly delete all the friction. Getting better at it is less about clever math and more about refusing to lie to yourself.

You are estimating the happy path

The single biggest source of bad estimates is that we estimate the coding and forget everything around it. The actual work is rarely just writing the function. It is understanding the existing code, handling the cases nobody mentioned, writing tests, fixing what the tests reveal, the review cycle, deployment, and the inevitable follow-up when it does not behave in production. The pure coding might genuinely be two days. The rest is the other eighty percent, and that is the part the estimate forgot.

Once I started naming the non-coding work out loud, my estimates got far more honest. Now when I picture a task, I deliberately walk through the whole path to merged and running, not just the part where I type.

Break it down until it stops scaring you

Any task I cannot estimate confidently is a task I do not understand yet, and the fix is to break it down. When I split a vague feature into concrete pieces, two things happen. The pieces become estimable because they are small enough to actually picture. And the breakdown itself surfaces the unknowns I was hand-waving past.

  • If a chunk feels fuzzy, it is hiding work. Split it again until each piece is something you could start tomorrow.
  • Watch for the pieces you keep avoiding in the breakdown. That is usually where the real risk lives.
  • A task you cannot break down is a research task, not a build task, and those get estimated differently.

That last point matters. If I genuinely do not know how something will work yet, I do not pretend to estimate the build. I estimate a timeboxed spike to go learn, and then I estimate the real work once I actually know what I am dealing with. Mixing research and construction into one number is how you get the two-days-becomes-two-weeks disaster.

Talk about ranges and confidence

A single number pretends to a precision that does not exist. When I am estimating software work for someone who is planning around it, I give a range and I say how confident I am. Something like, if this goes the way I expect it is around three days, but there is a part I have not done before that could push it to a week. That sentence is more useful to a manager than a falsely confident three, because it tells them where the risk is and lets them decide what to do about it.

Stakeholders are not actually asking for certainty. They are asking for something they can plan around. An honest range with the risks named gives them that. A confident single number that blows up gives them a worse day than the truth would have.

Track where you were wrong

The only way I have ever gotten better at this is by noticing, after the fact, where my estimate missed and why. Over time you start to see your own patterns. Maybe you always underestimate anything touching authentication. Maybe integration with a third-party API always costs double what you think. These are not character flaws, they are calibration data, and once you know your blind spots you can pad the right things instead of padding everything blindly.

I do not keep an elaborate system for this. I just pay attention. When something takes twice as long, I ask what specifically ate the time, and most of the time it was a category of work I had underweighted before. The next estimate accounts for it.

Padding is not lying, it is honesty about uncertainty

Some people feel that adding buffer to an estimate is cheating. I see it the other way. The unknowns are real, so an estimate that ignores them is the dishonest one. The trick is to be transparent about it. I would rather say there is real uncertainty here so I am building in margin than hand over a tight number I know I will blow. Padding you hide is a lie. Padding you explain is just an accurate description of risk.

Estimating software work will never be exact, and chasing exactness is a trap. The goal is to be honest, to break things down until the unknowns are visible, and to communicate the uncertainty instead of burying it. Do that and people stop dreading your estimates, because even when you are off, you were never pretending.

Building something where this matters?

I am open to senior full-stack, Web3, or AI engineering roles, fully remote and any timezone. If the hard part of your product is fighting you, that is the work I like.

Get in touch →