Estimating Client Work, and my Unexpected Buffer Time

 

Note: I use the word ‘component’ a lot in this article. By that, I mean a vague term for a small chunk of UI and functionality. Some frameworks and libraries use Component as a class, I’m not referring to any of those specifically.

When doing work for clients, you have to provide an estimate. They need to get budgets ready, plan for release dates, have people ready to use the new site or application to give feedback and report early bugs. Estimating the work that goes into a software project is, by large, a matter of experience. Over time, a developer will build up an understanding of how to guess the effort a single component will take and what effort goes into connecting that component to other parts of the application.

Once you have a model, you can decompose it into components. You’ll need to discover the mathematical rules that describe how these components interact. Sometimes a component contributes a single value that is added into the result. Some components may supply multiplying factors, while others may be more complicated.

Andrew Hunt, Dave Thomas: The Pragmatic Programmer

To estimate a component, you need to be able to see all the parts. If you can’t see all the parts, the component is too big and needs broken down. For example: a client has a document sharing application and needs to add searching functionality. That can’t be estimated with any accuracy, so we need to break it apart. What does searching include? A search form, sure. How much time does it take to add a new page, or add a field to a persistent piece of UI (like a header)? That’s one part. How much time to create a route and controller for the search form to submit data? That’s another. On and on, until each piece is broken down into a manageable chunk. This makes it easier to grasp and guess ‘roughly how much time to build this?’

Sometimes, estimating a component’s effort means actually creating a roughed out version of what you need to build. Back to the search example, if you’ve never built a filter for a list of results before, it might be a good idea to try a quick example. Don’t solve every piece of it, that’s a waste of time. But if it takes you thirty minutes to scratch out a decent working example with some static data and an ugly UI, it’s possible that thing won’t take more than a few hours total. Otherwise, if thirty minutes barely scratches the surface go ahead and assume days, not hours.

One understanding that comes with experience is the general level of complexity that the component has — and based on that level of complexity, how much extra time needs factored in. When I build estimates, I call this my “unexpected buffer” time. Back to the search filter example again: The client is fine with a full page refresh whenever some new filters are added. Simple to build, not a lot of complexity. Now, let’s assume the filtering and sorting needs to be instant, but that entire search result needs to have a shareable URL. This is a level of complexity that can introduce unforeseen problems. We still give both components an estimate according to the effort — but each one also receives a buffer time. Low complexity, add 10% to the estimate. Maybe 20%. Highly complex, add 50%. I’ve gone so far as to double my estimates.

The buffer is the unsung hero of my estimating process. It keeps launches on time and saves everyone’s sanity. And, if you don’t use it — your client gets an early delivery, which I guarantee they will love.

Long Reading vs. Short Reading

I recently had a realization that, over the past few years, the time I spend reading has changed dramatically. I used to read a book every month, along with a good mix of blogs and news. Now my reading has strayed to Twitter and news, with some technical articles sprinkled in. The shift was gradual, and I hadn’t paid attention to it. I was busy with life and didn’t notice the change. That’s not to say I read less — rather, the style and length of things I read is different.

I went on vacation this July, and brought a book with the intention of reading only this book and leaving the other stuff behind. I was halfway successful in that I finished the book — but I could not keep myself away from Twitter and the news that followed. It gave me pause. I would even have the urge to check Twitter while I was reading my book! Why was it so difficult to take a break for a measly two weeks? It made me feel sad about how few books I read anymore. So, while I was otherwise enjoying vacation, I tried to answer a few questions. Why do I spend so much time reading short pieces, and why do I feel bad about that? What can I do to move back in the other direction? This is what I came up with.

Why short reading took over

The reason my reading patterns changed was not hard to figure out. The time I have free does not lend itself to long reading. I have two young kids, and I can’t glance at a book before they need me elsewhere. I could spend 30 minutes trying to get through a single page. Put that together with the other things I need to do and there isn’t a big gap of time where I could get deep into a book.

There are, however, plenty of short breaks where pulling my phone out to catch up on an article I saved is no problem. I can read a few hundred to a few thousand words on near anything — and if I need to put the article down for a few minutes, it’s simple to pick back up where I left off. And in the case that its a detailed article, backing up a paragraph or two is not going to take long.

Twitter is even easier. I have two minutes while waiting for water to boil? Check Twitter. There’s a meeting soon and nothing to do? Check Twitter. A commercial during a show on one of these streaming services that still has commercials? Check Twitter. Now, I can’t read anything long during those times. It would be a complete waste. But when it all adds up — I can’t help but consider how I could have used that time better.

What’s so bad about that?

On its own, nothing. I really do like Twitter. The people I follow give me insights into topics I otherwise wouldn’t have, and I’m convinced it helps me see the world with a wider perspective. Journalism, both reporting and opinion, is important too. I want to stay up to date on a lot of topics and I cherish how simple that is.

The problem lies when I do short reading to the exclusion of anything else. Let’s say I read 1200 tweets a day and 5 short-ish articles. That must be in the range of ten to twenty thousand words. If that was devoted to a book, I’d be through it in about a week.

It’s not completely equivalent. It ignores time constraints. It ignores context. One reason I find short reading less satisfying is that there is less context to understand. Reading a book, especially non-fiction, requires memory, supplemental reading, and re-reading. So it is more difficult to do an equal amount of long reading as short reading. But it also stays in your memory longer — especially if you take notes while reading. I forget most tweets minutes after I see them. Short articles, if I don’t bookmark them to save long-term, are usually out of my memory within days.

That’s why I am unsettled by the imbalance of my reading. Pursuing depth on a subject is equally important to me as a breadth across many.

Plan to change

I’m going to re-balance my reading time gradually over the next few months. I don’t want or need to cut anything out entirely, but I do need to change priorities. I unfollowed about a third of my Twitter follow list. I stopped trying to be a completionist — if my unread tweet count gets too high, I skip to the top. If something is important enough it will always come up again. I’m quicker to purge unread articles from my reading list, especially if they’re topical. I’m more selective with the ‘save for later’ buttons.

I admit these are small changes — but hope they will pay off long term. Next time I have twenty minutes to read, I won’t spend it catching up on news articles from last week. I don’t know if it will turn out this way — if not, I will need to make bigger changes to see the results I want.