(BUTTON) Toggle navigation [1]SteveStreeting.com
    * [2]About
    * [3]Blog
    * [4]Feed

Work 2.0 - the interruptible programmer

  4 Sep, 2010 · by Steve · Read in about 10 min · (1981 Words)
  [5]coding [6]Development [7]GTD [8]Health [9]Productivity
  [10]programming

  I’m 37, and I’ve been a (professional) developer for 16 years. You
  would have thought that in that time, I’d have figured out an effective
  work style which delivered the desired outcomes (code cut, products
  shipped etc) without causing detrimental knock-on effects - but, sadly,
  you’d be wrong. I think the style in which I practiced my craft for the
  first 15 years of my career was much the same as every other
  enthusiastic developer: you put a ton of hours in. 12-16+ hour days,
  evening and weekend coding marathons, pizza in the keyboard, crunch
  times, 3am debugging sessions where you just can’t go to bed because
  you can feel the source of that bug just beyond your fingertips,
  dammit, desperate last-minute sprints to deadlines where you manage to
  slot that last piece in, Jack Bauer-like, just before the world goes to
  hell. If you’re in the demographic I’m talking about, you’re nodding
  sagely, and probably grinning a little too, reminiscing on past trials
  and glories. This sort of crazy dedication is respected in our circles,
  and is pretty much expected of any developer who has claimed to earn
  their stripes.

  But, it turns out this kind of thing is not good for your health - who
  knew? Those of you who know me or keep up with my blog know that I’ve
  been dragged kicking and screaming away from my old ways, because of
  back issues that I initially ignored, then tried to cope with using
  token accommodations, and finally succumbed to in a big way. Being
  self-employed, this was a major problem. Crawling out of the pit I dug
  for myself took a long time and a lot of frustration - I read quite a
  few productivity books on the subject to try to find answers on how to
  keep working, and in the end found that the answers you mould for
  yourself tend to be the best ones. I’d like to share one of the things
  I learned along the way.

  But I’m ‘In The Zone’!!

  So, I want to talk about the biggest problem I encountered:
  concentration periods. I can’t sit at a desk for longer than about an
  hour at a time now; if I don’t get up and walk around, do some gentle
  stretching etc, at least this often, I’ll pay for it badly once I do
  move, and probably over the next few days too. I also can’t
  realistically work more than a standard 8 hour day without pain any
  more. The problem with this was that, as a programmer, the style which
  I developed over 15+ years involved getting gradually ‘Into The Zone’
  and coding for very long periods at a time, uninterrupted. This is a
  common theme among coders, who like to shut themselves away for hours
  at a time, wear headphones to avoid distractions, have ‘quiet times’
  and so on - and it’s also why we tend to react really badly when
  interrupted. Programming requires concentration, and concentration
  seems to run on a valve system - it takes time to warm up, and once
  it’s going, you don’t want to turn it off because starting it up again
  is a major hassle.

  I thought there was no way around this, and had begun to resign myself
  to just being less productive because of it. However, over the last 6
  months in particular, I’ve discovered that, far from being an
  intractable problem, this ‘slow warm up, long uninterrupted focus time’
  approach is to a large degree a learned behaviour, and it’s possible to
  re-train yourself to cope with things differently. It’s a little like
  when people learn to adopt [11]polyphasic sleep patterns - it’s not
  that you can’t do it, it’s just that when you’ve become accustomed to
  doing things a certain way, changing that is initially very, very hard.
  But it’s not impossible, given the right amount of motivation and time
  to adjust.

  So, my goal was to acclimatise myself to many shorter work chunks
  during the day instead of a few very large ones, while still
  maintaining productivity. The key to this was to learn how to get back
  ‘In The Zone’ in the shortest time possible - much like the way
  polyphasic sleepers train themselves to achieve REM sleep more quickly.
  I’m mostly there now, or at least way better at it than I was, so, what
  techniques did I use to make this transition?
   1. Embrace interruptions
      This is less of a technique and more of a deliberate psychological
      adjustment which cuts across all the practical approaches I’ll
      cover next. Instead of being the typical coder who
      avoids interruptions at all costs, you need to accept them, and
      learn to manage them better. It’s hard - you have to try to set
      aside years of resisting interruptions and initially, until you
      adjust, you’ll feel like you can’t get enough done. Many people
      will probably want to give up, unless there’s something specific
      motivating them to push through it - for me, daily pain was a great
      motivator. My main message here is that the transition is just a
      phase, and that it is possible to be an interruptable programmer
      who still gets things done. But you have to learn not to fight
      against it, hence why this is the first point.
   2. Maintain context outside of your head at all times
      Much of the problem with interruptions is that of losing context.
      When you’re in that Zone, you’re juggling a whole bunch of context
      in your head, adjusting it on the fly, and maintaining and tweaking
      connections between issues constantly. Interruptions make you drop
      all that, and it takes time to pick it all up again. My answer to
      this was to externalise as much as possible, on as many levels as
      possible:

   1. **Maintain a running commentary on your current task
      I am my very own chronicler. ** I write notes on what I’m doing all
      the time, whether it’s adding a comment line to a ticket,
      committing frequently and writing detailed commit notes (you do use
      a DVCS to make light commits more practical, right? ;)) scribbling
      a drawing on (ordered) pieces of paper. This really isn’t that
      onerous, and in fact externalising your thoughts can often help you
      clarify them. Basically the guide is that roughly every 30 minutes,
      I should have generated some new piece of context which is stored
      somewhere other than my head. If I haven’t, then that’s context I’d
      have more trouble re-building mentally if I’m interrupted. It
      doesn’t take much time to do, and it has other benefits too such as
      recording your thought & decision process.
   2. **Ruthlessly ignore tangental issues
      You might have noticed that in the last bullet, I used the words
      ‘current task’, singular. Not ‘tasks’. There is no such thing as
      having more than one ‘current task’ - there is only the one task
      you’re actually working on, and distractions.
      We probably all use bug trackers / ticket systems to track bugs and
      feature requests, but when you’re working on a ticket, it’s very
      common to spot a new bug, or identify an opportunity for
      improvement, or think of a cool new feature. How many of us go
      ahead and deal with that right away, because it’s in the area we’re
      already in, or it’s ‘trivial’, or it’s a cool idea that you want to
      try right now?  I know I did - but I don’t any more; any tangental
      issues not related to what I’m currently doing get dumped into the
      ticket system and immediately forgotten until I’m done with the
      current task, regardless of their size, relevance or priority. It
      sounds simple and obvious, and this might even be official
      procedure in your organisation, but I challenge most coders to say
      that they actually do this all the time. The benefit is that even
      the tiniest of distractions add an extra level of context that you
      have to maintain, which is then harder to pick up again after an
      interruption.
      For this to work, you need a ticket system which is fast,
      lightweight, and doesn’t require you to be anal about how much
      detail you put in initially. You need to be in & out of there in 30
      seconds so you can offload that thought without getting distracted
      - you can flesh it out later. **
   3. Always know what you’re doing next
      This is one from GTD (‘Next actions’), but it’s a good one. When
      you come back from a break or interruption, you should spend no
      time at all figuring out what you need to be doing next. Your
      ticket system will help you here, and so will the running
      commentary that hopefully you’ve been keeping on your active task.
      If you’ve been forced to switch gears or projects, so long as
      you’ve maintained this external context universally, you should
      have no issue knowing what the next actions on each item are. The
      important thing is to have one next action on each project. If you
      have several, you’ll have to spend time choosing between them, and
      that’s wasted time (see the next section on prioritisation). At any
      one time, you should not only have just one current task, but one
      unambiguous next action on that task. Half the problem of working
      effectively is knowing what you’re doing next.



  Prioritise Negatively

  I mentioned next actions in the previous section, but how do you decide
  what comes next? A lot of time can be frittered away agonising over
  priorities, and I used to struggle with it; I would plan on the
  assumption that I wanted to do everything on the list, and I just
  needed to figure out which I needed to do first. I discovered that I
  could cut the amount of time I spent on planning, and also get better,
  less ambiguous priorities by inverting the decision making process - to
  assume a baseline that I wouldn’t do any of the tasks, and assessing
  the negative outcomes of not doing each one. So instead of ‘which of
  feature A or B is more important to have?’, it became ‘Let’s assume we
  ship without feature A and B. What are the issues caused by omitting
  them in each case?’. It might appear to be a subtle difference, but
  having to justify inclusion entirely, rather than trying to establish a
  relative ordering assuming they all get done eventually, tends to tease
  out more frank evaluations in my experience.



  Recognise the benefits of breaks

  Much of the above is about limiting the negative aspects of taking
  breaks, but the fact is, that they have many work-related benefits too.
  I’m willing to bet that all coders have stayed late at work, or late
  into the night, trying to fix a problem, only to find that they fix it
  within 15 minutes the next day, or think of the answer in some unlikely
  place like the shower. The reason for this is very simple - extended
  periods of concentration seem productive, and can be on operational /
  sequential thinking, but for anything else such as creative thinking or
  problem solving, it’s very often exactly the opposite. Not only do
  tired minds think less clearly, but often the answer to a problem lies
  not in more extensive thinking down the current path which you’ve been
  exploring in vain for the last few hours, but in looking at the problem
  from a completely different perspective. Long periods of concentration
  tend to ‘lock in’ current trains of thought, making inspiration and
  strokes of genius all too rare. Creativity always happens when you’re
  not trying, and it’s an often under-appreciated but vital element of
  the programming toolbox. Interrupting that train of thought can
  actually be a very good thing indeed.

  There’s more I could talk about, but that’s quite enough for now I
  think. I hope someone finds this interesting or useful 😀

    * [12]←Previous
    * [13]Next →

  [14]back to top
  Make the things you want to exist.
  © 2018 Steve Streeting.

References

  1. https://www.stevestreeting.com/
  2. https://www.stevestreeting.com/about
  3. https://www.stevestreeting.com/
  4. https://www.stevestreeting.com/index.xml
  5. https://www.stevestreeting.com/tags/coding
  6. https://www.stevestreeting.com/tags/development
  7. https://www.stevestreeting.com/tags/gtd
  8. https://www.stevestreeting.com/tags/health
  9. https://www.stevestreeting.com/tags/productivity
 10. https://www.stevestreeting.com/tags/programming
 11. http://www.everything2.com/index.pl?node_id=892542
 12. https://www.stevestreeting.com/2010/08/08/cocoa-tip-using-custom-table-outline-cells-designed-in-ib/
 13. https://www.stevestreeting.com/2010/10/26/introducing-sourcetree/
 14. https://www.stevestreeting.com/2010/09/04/work-2-0/