Monday, April 27, 2009

A Programmers Work-day

When I first started working as a programmer full time outside of school, in the "real world", I was a bit unsure what to expect. Would I spend all my day slaving at a keyboard? Would I spend it all in endless meetings? Buried under mountains of TPS reports? How does a real software house organize it's labour force on the day-to-day?

Starting my career in some poorly managed companies didn't provide a shining example for me to learn from.

I was literally shocked to see how much of the day co-workers just surfing out of boredom, but I was a little ashamed to ask anyone about their workplaces. Would anyone be honest about such flagrant waste of time? Would they look down on my workplace as a joke? Was the big horrible secret of the "working world" the fact that very little work actually gets done?

It touched protestant work ethic I didn't know I had. So much wasted time and money felt dirty to me.

That said, it wasn't long before I too #$%@ed my day away on websites; and for the same reason co-workers did: there was no serious management structure. Management didn't give anyone serious goals, or give developers the resources needed to meet them. Management provided no structure or oversight to the development process, and morale was fairly low; no one cared. One place I worked some of the developers showed up at 3pm and left before 7pm, four days of the week!

Over the development of my career no one has yet come out and given me a clear definition of what the professional standard for work ethic, but I have managed to develop my own idea of what should be expected of all programmers from a work day (you'll note I do not include managerial job titles):

Organizational Overhead

2 hours per day

This is the overhead that is not an output itself, but is a natural requirement of any development process, and thus is has to be done every day.

It's often characterized by a series of interruptible tasks that center around communication with other human beings.
  • Face to face meetings
  • Phone calls
  • E-mail and mailing-lists
  • Bug triaging and code reviews
  • Work-related blogs, websites, and IMs


4 hours per day

This is the "real" work, and is the measurable result by which your contribution to the group will be judged. If you're not producing here, you are not a developer.

This work is characterize by the necessity to spend long unbroken periods concentrating single-mindedly on the task(s) at hand.
  • Researching technologies or libraries
  • Devising designs
  • Proposing and discussing design details
  • Implementing code
  • Testing and debugging running code
  • Implementing tests and documentation

You'll also note that that accounts for only 6 hours, and the reason is that I essentially do not believe that knowledge workers' productivity, especially developers who are required to expend so much concentration for extended periods of time, scales linearly with time. Your brain needs breaks to open back up. Overwork just leads to burn-out.

The ideal work day for a programmer is some variation on the following:
  • 0900-1000: handle time-critical overhead tasks such as emails, bug reports, and meetings
  • 1000-1200: concentrate on priority work items
  • 1300-1400: regular meetings and emails
  • 1400-1600: concentrate on other important work items
It may look like a short day, but I do assume you have developed the ability to concentrate on your task, and you have the freedom to eliminate distractions. I do admit that it is often quite hard, and most people's day looks more like:
  • 1300-1700: try concentrate on work while being distracted by meetings and emails
If you really need to have an 8 hour work day for some reason, you'll only find that the extra two hours ends up going into work-place play or dawdling; and I'd personally prefer to go home to my family.

Trying to do too much per day leads to burn-out, which doesn't have to be emotional or dramatic; it can be intellectual, and manifest itself is a subtle lack of creativity that's hard to detect.

Do you agree with my experience-bought conclusion? Do you have your own? Let me know.


Anonymous said...

Overall I agree. I struggle with focus of most things and that's because the workplace is not conducive to getting into the zone. My workplace is not flexible with developer hours, so I'm here and constantly having Project managers or coworkers coming up and asking questions.

On top of that instant chat, email and twitter all call to me with their siren song.

I'm not able to not check email, if an email comes in to me it's usually of importance and time sensitive. I've had to resort to turning off twitter, closing my personal browser and using music to try and get as much focus as possible.

I agree with your time estimates, currently mine lean more heavily on development, but I think the 2/4 is quick true and honest as to what should be aimed for.

Anonymous said...

Why is "work-day" hyphenated? Wouldn't "work day" suffice?

OJ said...

I also agree. I think the timings will vary depending on the day, but on the whole it's about right. I have worked with a rather large internetional software development firm who, upon starting, said to me that they expect 6 hours of productive time out of me per day.

That was a surprise. The fact that they were aware of how impossible it is to get 8 hours solid was very reassuring that these people knew what they were doing (they also backed that up in other ways).

The problem with the industry as a whole is that 90% of the people in it are not in it for anything else other than the money. If they can get by through the day doing as little work as possible then that's what they'll do -- so long as they get paid.

I have seen it time and time again.

PS. Stupid doesn't seem to like my new domain name for OpenID! Works everywhere else.

Dave Ackerman said...

Yes I am in the same situation you are more-or-less. I have an 8 hour workday as it is expected (lest I get fired), but I find that taking breaks or a long lunch helps me to focus better on priorities, and honestly I seem to get more work done than the average developer. So Although I "relax" more during the day than others, I also focus harder and therefore become more productive. I don't think anyone can fault me for that (and like you said, productivity isn't linear so management can't really say well just focus for 2 more hours without me staying quite a bit longer)

Doug said...

'Why is "work-day" hyphenated? Wouldn't "work day" suffice?'

I don't believe so. The hyphen indicates that the two words form one unit of measure, such as light-years or man-hours.

Anonymous said...

I can't believe someone hit on 'work-day' and didn't hit on 'emails', which itself is such a badly-hacked noun (valid really only as a verb, only for some conjugated forms, based on its roots) that it should stand out like a sore thumb. And this guy hits on 'work-day'.

I like 'emails', though. It shows me which children were already left behind.

Hoopz said...

The worst is when you're a few developers in a big office full of marketing/sales people. These people thrive on social interaction and can't seem to fathom that you would actually prefer to just work for a period of intense focus rather than casually interact with humans throughout your work day. They think they're doing you a favor by coming over to your desk and asking you things in person.

I find that such an environment actually causes developers to waste more time on surfing and e-mail, because they are unable to get the natural problem-solving high that makes development a rewarding task, and hence look to the 'net for entertainment.

publius said...

My favorite metaphor when I'm trying to communicate to non-programmers about focus is from Paul Graham:

"... if you're a technology company, [your programmers'] thoughts are your product. So making hackers work in a noisy, distracting environment is like having a paint factory where the air is full of soot."

Every time I try to mimic the outward signs of a good worker (long hours, sociability), I forget that focus is my main skill, and my performance suffers. Do anything you can to preserve your focus, or you will indeed lose the groove that gives you motivation to keep being an excellent programmer.

Veera said...

I agree with that. Spending our time effectively is crucial to a successful career!

Anonymous said...

Sorry to make this anon, damm internet!

Heres the skinny where I work...
Myself - 3 days from home, 2 days at the office
Other Programmer - 5 days from home, our CVS shows little to no activity.
Sys Admin 1 - 4 10's, really only does 4 6's.
Sys Admin 2 - 4 10's, really only does 4 5's
Helpdesk 1 - 5 8's (waste time all day waiting on calls)
Helpdesk 2 - 5 8's, does our Managers job.

Myself, I bust my ass like you wouldnt believe. I do this becuase the workload is immense, but, time lines are pretty much our choosing.

Long story short, I think it's like this almost everywhere. Set some personal goals and if you have spare time in the day or between projects use that time to achieve those goals vs. surfing the net. WAIT, I shouldn't be at this site lol.

Anonymous said...

From what I've seen, four hours of productive development in one day is a really solid day. Two other hours for emails/meetings/face time is about right too.

I have found a few tricks to improve the development productive. One is to eat lunch away from the desk and take an hour away from everything. When I do this I find that I'm able to be more focused for the rest of the afternoon and can sometimes extend my focus for more than four hours of dev time a day. If I eat lunch while working, I'm usually burned by 3pm or so.

The other thing I've found is to break tasks up as small as possible and capture them in a way where you don't need to hold all of them in your head. Either by having the team use scrum to break down tasks into small enough pieces or to break them down on my own and use some sort of GTD system to keep track of what I'm doing. When I do this, I don't get tired as much, interruptions don't have nearly as big an impact (since I'm only focusing on a tiny step at a time, I don't need to hold a bunch of stuff in my head), and I find that I can spin off smaller tasks while waiting for something on a larger task (follow up with someone on something I need while I wait for my code to build, etc).

As for your experience with dev's not working many hours and not getting anything done, that isn't the case every where. And I've found that morning scrum meetings (15 minutes) where each member talks about what they did yesterday and what they are doing today, productivity increase. And people's tendency to be more responsible for their work improves as well.

Anonymous said...

There is one good way: realy big headphones. Bayer DT 770 :-)