
When most software developers are asked about productivity, one thing that often gets mentioned is interruptions. We perceive ourselves to be more productive when we can maintain a deep state of concentration (“flow”) for extended periods, and interruptions break that flow. They may cite research that shows that it can take 15-20 minutes to get back into that state of concentration – to “reload the program”, so to speak. 2-3 interruptions in an hour will cost you that hour, they’ll tell you.
So, “interruptions are bad” is widely-received wisdom among software developers. And, like so much received wisdom in our profession, it’s not true.
Not all interruptions are bad. Not all interruptions waste our time. If someone’s editing the same source file as me, maybe an interruption could save us both time. If someone’s writing code based on a misunderstanding about the requirement, maybe sticking your head around their proverbial door might not be such a bad idea.
More generally, when we’re in that state of flow, one thing we’re not doing is communicating. If we think of development teams as concurrent systems, the dependencies between the work we’re doing will often make it necessary for us to synchronise. There’s actually a limited amount we can do genuinely in parallel. And, I suppose, that’s why we’re a team.
The longer we go without synchronising – without communicating – the more out of step we get with each other; more misunderstandings, more conflicts, more duplication of effort, and ultimately more work later getting back in sync.
So, we need to focus, because – y’know – programming, but we also need to stay in sync. How do we square this circle?
First of all, why does it take so long to get back into that state of flow? It’s a matter of cognitive load. We’re carrying a model of the code, the requirements, the architecture, in our heads – it’s all loaded into “main memory”, if you like. When we’re interrupted, it’s like terminating the program – it all has to be loaded back into memory again.
What if we could reduce that cognitive load? This is where working in smaller steps can help enormously. Micro-iterative processes like Test-Driven Development and refactoring let us focus on one thing – solve one problem – at a time. The amount of detail we need to load into memory is much smaller.
Working in tiny cycles that end with all the tests passing, and the changes committed, we find ourselves in a “safe zone” many times an hour where we could be interrupted without breaking our concentration.

We can combine micro-iterations with “maps” – like test lists, high-level design sketches (e.g., a sequence diagram), UI storyboards, Mikado Method plans – that help us keep our place in a longer task, externalising most of the cognitive load. So we’re progressing one step at a time, and we know roughly where we’re going.
Developers who work this way do indeed report that interruptions are less of a problem. When the tests are green and the changes are committed, we’re free to talk, 5, 10, 20 times an hour.
Of course, flow still matters – let’s call them “micro-flows” – and if I’m in the middle of writing the code to pass a test, I don’t want to be interrupted. It’s very helpful to be able to observe team members working, so we can see when they might be interruptible. Some teams even have protocols and/or visual signals, kind of like those red lights outside movie stage doors.
Anyhoo, yes, we can have our cake and eat it; by reducing and externalising cognitive load, and working in small iterations that bring us back to tested, backed-up code many times an hour, we can achieve the focus we need – typically, much more focus on every change we make than in extended periods of “flow” – and communicate often enough to stay in sync with the team.
And the added benefit is that, if being interruptible means all our tests are passing and our changes have been committed, it also means the code’s shippable – 5, 10, 20 times an hour.

