We've all been there — a product near (or not so near) ready to launch. Bosses breathing down your neck. Deadline soon approaching. People start to work evenings, then weekends. It starts to feel, perhaps rightly so, like nobody is doing anything other than working. Crunch mode is the time when everybody buckles down, and focuses on the product, and only the product. Forget about everything else.
Crunch mode is a result of the belief that more hours spent coding means more software gets written. The obvious problem with management's formula is that a tired programmer can do more harm than good. A particularly nasty bug, for instance, can cost a team orders of magnitude longer to fix than it took to write. So, while it may be possible to increase the total number of lines of code written, it only seems reasonable to measure shippable lines of code as a metric for productivity. Nasty bugs that get written by tired, over-worked developers should be counted against total output, rather than for it. In crunch mode, managers tend to overlook the bugs, and see productivity as increasing, while it's really decreasing. That's the crunch mode paradox.
Why Does it Happen?
You've assembled a team of all-star programmers. They're going to practice test-driven development, continuous refactoring, and other agile processes. They are code artists. Indeed, your team of developers is obsessed with 'beautiful code', and whether it's artistry, or OCD, they're not happy until code is perfect. They write shippable code.
The key to understanding why your team of carefully selected programmers breaks down in crunch mode is understanding what makes them tick in normal mode. Writing shippable code means being in a constant state of careful thought. Each change to the code is a calculated maneuver, the programmer's brain always working hard to discover new patterns of duplication that may have emerged in the code base, and promptly abstract them. The process of continuously searching for a better way — for better abstraction — is a major key to writing high quality code. As with anything else, abstraction can become a pitfall, but used properly, it means writing less code, easier testing, and perhaps most importantly, fewer places for bugs to come from. Of course, continuous refactoring, and code reuse aren't the only pieces of the puzzle, but it's important to note the thought process of the developer who is crafting his code this way.
In normal mode, your superstar developer cares about writing beautiful code; that's all. That's why he makes sure to write a comprehensive test suite, to continuously refactor, and makes sure his code is readable. That is probably the biggest difference between your great developer, and the average developer you went to so much trouble to avoid hiring; your superstar's priority is the code, whereas the average programmer's priority is going home at the end of the day. When you flip that crunch mode switch, though, priorities change.
When you tell your team that there's a deadline for a certain feature set (especially when it's a tight one), the focus is no longer on the code. When everybody is racing to accomplish a set of tasks for a certain date, coming in to work every day is about trying to get as many of those features out the door as possible in as short a time. The pressure is on. People start cutting corners. Processes break down. People write fewer tests, refactor less frequently. You have effectively turned your superstar team in to a group of average programmers.
In factory terms, a worker's production rate decreases over time. A worker who is creating 10 widgets/hour at the beginning of a shift may be producing only 6/hour at the end of the shift, having peaked at 12/hour a couple of hours in. Over time, the worker works more slowly, and makes more mistakes. This combination of slowdown and errors eventually reaches a point of zero productivity, where it takes a very long time to produce each widget, and every last one is somehow spoiled. Assembly-line managers figured out long ago that when this level of fatigue is reached, the stage is set for spectacular failure-events leading to large and costly losses – an expensive machine is damaged, inventory is destroyed, or a worker is seriously injured. (Why Crunch Mode Doesn't Work)
It Doesn't Have to Be This Way
There are two problems with crunch mode: management, and developer. Being a developer, I'm going to go after the pointy haired among us first.
Managers
Crunch mode doesn't work. Sending your team on a death march quickly leads to programmer fatigue, which nearly always leads to bad code. Moreover, developers are likely to become demoralized, burnt out, lose interest in the product, and perhaps worst of all for you, they'll become resentful of management. Moreover, in many cases, due to nasty bugs, and later hits in maintainability and consequent necessary rewrites, the crunch mode developer is outputting less in total. Finally, this sort of crunch mode is nearly always symptomatic of a team that has slipped in to waterfall development.
The great thing about true agile development is that after the first couple of weeks, the code is always in roughly shippable state. So, if you are working on a product that has to launch on a particular date, for whatever reason (be it PR, or anything else), agile is a highly effective way to ensure that you're going to have a shippable product ready. The reality is that trying to shove a specific featureset down the throats of your development team with a hard deadline simply does not work. The software will be alpha-quality if you're lucky.
John Nack, Adobe Photoshop product manager says of their transition to agile:
The team's ability to deliver a public beta--a first for a major Adobe application*--is probably the single greatest tribute to the new method. In the old days, we could have delivered a feature-rich beta, but the quality would have been shaky at best. This time, as Russell says, "The public beta was basically just 'whatever build is ready on date X,'" because we knew it would be stable. (Agile development comes to Photoshop)
Developers
The key to beating crunch mode, in my experience, is forgetting about the pressure being put on you (not easy, I know); you have to work as normal. What happens to us during crunch mode is extremely counter-productive. For some reason, when we want to work faster, we stop doing all of the things that save us time. Testing, refactoring, and general caring for code is what separates ultra-productive developers from average ones. But, best practices the first thing to go when the pressure's on.
Once you've pulled yourself together, and started working normally again, the next step is to start saying no. Obviously, this piece of advice is going to be controversial, but I think it's a discussion worth continuing. As Raganwald says:
Try this: Employ an Engineer. Ask her to slap together a bridge. The answer will be no. You cannot badger her with talk of how since You Hold The Gold, You Make The Rules. You cannot cajole her with talk of how the department needs to make its numbers, and that means getting construction done by the end of the quarter. (What I admire about professions like Engineering and Medicine)
Obviously, nobody is going to die on account of (most) bad software (as they might with a poorly built bridge). But, when you know that you, and others on your team are doing bad work, it's time to speak up. If you don't, you're doing a disservice to yourself, and your company. You're the one who is going to have to maintain this nightmare when crunch mode is over (and we know that there's never really time for a cleanup). Your company is going to have to deal with low quality software, and likely a botched release. Everybody loses.
The Crunch Mode Paradox
Crunch mode is a paradox. Managers think they're fostering increased productivity, but instead, they're damaging morale, the product, and often causing a net decrease in output. Developers try to increase their productivity by cutting all of the corners that make them effective in the first place. For those reasons, the death march has the opposite of its intended effect. Agile lifecycle management seems to be the most effective tool for guaranteeing that shippable software will be ready on a particular date. So, for companies trying to develop software, next time, try agile instead of crunch mode. Everybody will be happier.


Thanks for the quote and the link!
Controversial indeed... I myself do not always refuse the bidding of stake holders, even when I believe they are wrong. But I do insist that they understand the trade-offs they are making before trying practices I believe to be unproductive, such as sustained overtime.
It doesn't always help, but I often try to crack a joke to make the point. In the case of crunch mode, my standard line is:
"No problem. I can do almost as much work in seventy hours as I can in fifty."
I almost never refuse the bidding of stake holders either. It's funny, though, we'd really be doing them a favour.
The whole thing is just so damn backwards, it's crazy.
Thanks for the comment!
You can't push back when management thinks "it's crunch time" and expect to have any effect. Instead, you need to be continually educating about how software engineering really works through the entire process, until management begins to understand it is bridge building and not a factory floor.
Crunch time for one week is OK (because it will spill into the second week, which is also OK, but just barely). After two weeks, you run into the exact problems you mention.
And, honestly, if you cannot move management to that understanding...well, I don't want to work where I'm a clerk. :)
i have to disagree slightly with the author.
sometimes crunch mode is necessary. if something doesn't get done and the company wont' get paid, you have to put your ideals aside and get the code working, best practices be damned.
around 6 months ago, i was involved in a long (~3 month) 'crunch' on a project for a major financial company, with developers often putting in 60-70 hour weeks. at one point i did > 100 hours which is insane and almost certainly was counter productive to an extent.
however, the work got done, and it never would have got done with people doing 40 hour weeks. not just developers either - QA, business analysts and project managers all worked like crazy.
i should point out i didn't do this voluntarily for the love of the company - i am a contractor and was paid by the hour, as was everyone else involved. this helped a lot. i can largely thank this extended 'crunch' for my new house :-)
anon,
You're right about some things having to get done. But the real question is why that thing had to get done in that little time. The answer always ends up being "mismanagement". So this essay is still relevant, and something that managers still need to understand.
I must admit I have trouble with the argument that "it's an emergency, it's critical." That makes it sound like an exceptional circumstance. Ok, if that happens on one project out of ten or twenty, fine. But when it happens on every milestone of every project, you have to step back and stop pretending there is an emergency and recognize that you are managing for this outcome.
Imagine, if you will, the question of performing open-heart surgery on an overweight forty year-old smoker with blocked arteries/aorta/whatever. Obviously, it's an emergency, get out the knife.
But if the same person is back in twenty-four months for more surgery, and they haven't lost weight, they haven't stopped smoking, what are you to say? Clearly this is no longer "emergency surgery," the patient is choosing a course of action that will end up with surgery.
@anon: "and it never would have got done with people doing 40 hour weeks"
Really? Just what was it about working 70-80 hour weeks that produced an infinite increase in productivity?
i largely agree with the sentiment in the original essay, just not the school of thought that its always the wrong thing to do. sometimes you have to roll up your sleeves and get on with it.
business critical project related to financial legislation, software had to comply with it. not my call and i'm not saying its right, but that was the driver.
the work wouldn't have got done in 9-5. it's hard for someone that wasn't part of it to understand the situation, so i'm afraid you'll have to take my word for it. if everyone had clocked out at 5 and not put in any extra effort it's extremely unlikely the project would have been succesful.
my point was, a large team of dedicated people rescued a project that was 'in a mess' by essentially doing a prolonged crunch. at the end of it, everyone got a nice bonus and big holiday, and nothing like it has happened since.
it's worth pointing out that during said crunch there was a real sense of camaraderie - noone had 'lost the will to live'. if people were pressured into the work, that would have been a different ball game.
but my original point is sometimes crunches work.
What James says is not news but it is amazing how often we end up caught on this trap. It's easier than someone from the outside - with a cool head - can think of. It is so obvious that hurts. But it happens, all the time. It's actually the net result of a chain of small bad decisions and wrong attitudes/expectations down the road from the management, the client and the developers. No one person does it wrong alone: it's a chain reaction and starts in a very innocent way and it scalates very very fast like a snow ball speeding up down hill. I've been in crunch mode for some time now and I feel very very burnt out and exhausted.
Something similar was already said more than 30 years ago by some guy named Fred Brooks ...
Yes, crunches work some times. The interesting thing is identifying why those "some times" it works.
I have been in a very unique position, as I have seen crunches that worked, and crunches that didn't on the same team (same people, same project).
When management declares "crunch time", and the team feels that the plan was impossible to begin with, and that it was known since the beginning, the crunch will fail (low morale, low productivity, etc,etc,etc). But if the team feels that the plan was achievable, and that what happens is just a roadblock in an otherwise clean road, they will "do their best" to hit the deadline anyway (programmers are stubborn optimistic beasts). Management must just take care that no one burns out due to overwork, the sense of purpose will give the morale and energy needed.
So, at the end, if you manage your project correctly and "crunch time" is due to an unforseen cause the team will help you to hit the deadline. If you mismanaged the project, the team may save you once or twice. After that, they lose trust and will eventually leave.
cite. So, at the end, if you manage your project correctly and "crunch time" is due to an unforseen cause the team will help you to hit the deadline. If you mismanaged the project, the team may save you once or twice. After that, they lose trust and will eventually leave.
Amem to that. Very true.