Ka Wai Cheung

Why I can’t bill time

Mar 2024

There are two kinds of time in software building.

There's the delivery date. Over my career, I've been pretty good at delivering features on a delivery date. I can guess a thing will get done in two days, two weeks, or two months and you better bet it will be ready when I say it will.

Then there's the amount of time something takes. The problem is that people want that time to be predictable. They want X to take Y long and so on.

But I've never been good at this part and you probably haven't either. This is why we are still reading and writing diatribes about the flaws of making estimates decades after The Mythical Man Month came out.

My way around this has been to not work in an environment that requires you to track time. And thankfully, I haven't billed time in well over a decade.

I spend lots of time obsessing over an ostensibly minor detail that to me is important. I know once I get to the answer, so much of the other work will fall into place if for no other reason than the fuel of joy I feel for getting to a satisfactory resolution on that detail.

In good conscience, I couldn't tell you I just spent 75% of the allotted budget on a sub-piece that no one but me cares about, even though it gave me the momentum to get the entire piece done in 100% of the allotted time.

That would seem silly despite it being true.

Code is written in encapsulated ways but thinking never is. My mind needs to bounce between the layers of the software. I often think of multiple areas of the product simultaneously—how a request traverses down and back up the codebase.

Sometimes an aspect of a feature kind of crumbles and rebuilds itself in my head all at once and in those moments, I am furiously writing it all down in code on the fuel of natural ecstasy.

In good conscience, I couldn't tell you how much time I spent on a particular layer, even though the whole thing was delivered around the day I suspected.

Sometimes I use time to look at the same problem again and again and again. Starting from first principles again and again and again. I've done this long enough to realize at some point the journey ends differently.

I guess they call this insanity. But for me, thinking the same thoughts over and over again really does—at some point—lead to some different result. I need that repetition to fully grasp the problems and their best solutions. It simply needed time to crack it open in my head.

In good conscience, I wouldn't want to tell you how much time I spent on the repetition of thought, even though I got to the place I wanted to at roughly the day I said I would.

I think about what I'm building while on a run, while staring at a TV, while eating, while lying next to my children at night waiting for them to sleep.

I spend much more time thinking about the software I'm building than I care to admit primarily because of something I am willing to admit: I like building software.

Am I working?
Or am I just thinking?
Should I bill thinking?

This is why I can't bill time.

It's a waste of my time and yours.