I have a problem

I’m a perfectionist. For any given task, in the absence of evidence to the contrary — and sometimes despite the presence of said evidence — I’ll often feel the need to perform it no less than very well, and preferably superlatively.

I say “often” and not “always” because I’m a recovering perfectionist. Before my recovery began, when I could stand to feel how I felt, I’d be disappointed with my behavior, the way my life seemed to be going, and my seeming lack of agency about any of it. I’d wonder how much of my disappointment stemmed from the selfsame perfectionist judgment I was disappointed with. I’d wonder whether I’d ever have the option to think without always going in circles. I’d wonder whether I’d ever stop criticizing myself for how I criticized myself. I’d wonder about circles again, and try to stop.

I had an insight

With my brain throwing off so much waste heat, concentrating was difficult. I dropped out of college and got my first job, where I discovered the brilliantly clarifying experience of being very slightly useful to others. It became my organizing principle, my yardstick. Am I being at all useful? How can I be making myself more useful?

I’m also a procrastinator, probably because I’m a perfectionist, and vice versa, and so on. To make myself maximally more useful, the most useful change I could’ve made would’ve been to procrastinate less. But I had not, as yet, hit upon a self-engineering trick to that end.

I’ve got some tricks now

The To-Do List Trick, for example, has four steps:

  1. Write down a bunch of possible tasks.
  2. Pick the most important task, the easiest one, and one more.
  3. Put the easiest task first.
  4. Don’t worry about the order of the other two.

Step 1 eases my fear of spending precious productive minutes on the wrong thing. Step 2 limits today’s scope to tasks that I can expect to complete and are worth completing. Step 3 helps me spend less time not starting, and leaves me with much-needed momentum.

You might think Step 4 looks like a microoptimization. It’s not. It’s weirdly important.

When I get to the second task, I sometimes exercise the option to defer it until after the third one. Leaving myself that choice lets me indulge my procrastinatory tendencies when I really want to, so I can spend less cognitive energy on controlling myself. Knowing that I’ll be procrastinating productively, I also don’t spend energy second-guessing my choice to procrastinate. Since I start sooner and throw off less waste heat, I find myself getting more done, so I feel better about myself, so I keep getting more done.

That’s why I mustn’t worry about the order of the second and third to-dos. If I’d put any thought whatsoever into the ordering, then I either feel less free to reorder, or I reorder anyway despite knowing I’m going to second-guess. Either way, I find myself getting less done, so I feel worse about myself, so I keep getting less done. I feel a tinge of annoyance and fatigue just putting this vicious spiral into words. To favor the virtuous spiral, Step 4 is crucial.

I’m in recovery

I still think in circles sometimes, but much less often, and mostly in ways that serve me, so it bothers me less. I still seek perfection more often than I and others need, and I still get off to slow starts more often than I and others want, but much less more often than I used to. I’ve got a small bag of tricks for exerting greater agency over my behavior. I try not to let any fall out. Occasionally I pick up a new one.

The very first trick I found, the one that started my recovery, was Test-Driven Development.

TDD saved my brain

For any given problem, I never quite totally believe I’ll be able to solve it. If I start at a whiteboard, I have to think, so I have to be smart, and I’m not sure when I’ll be done thinking, so it’s really hard to start. Instead, I make a to-do list: an even simpler one, with a single dumb-as-rocks failing test that points vaguely in a direction of some sort, possibly the wrong one, who knows. I don’t have to be smart to make it pass, so I can just do it, so I do do it. This helps me spend less time not starting, and leaves me with much-needed momentum.

Because I know I won’t have to be smart later to remember to test that thing again, I don’t spend cognitive energy second-guessing each code change. And because I generally don’t have to be smart all the time, I can afford to spend cognitive energy to load a subproblem into my head, and make careful decisions and meta-decisions about it, when I really need to.

Since I start sooner and throw off less waste heat, I find myself getting more done, so I feel better about myself, so I keep getting more done. Recognize the pattern? This is where I discovered it.

TDD not only helps me sidestep procrastination, it helps me directly address perfectionism. By overriding my default vague, implicit self-expectations with specific, explicit system expectations, TDD reduces my brain’s WIP from “effectively infinite” to “approximately 1”. Test-driving provides a bounded context in which my code frequently is perfect: when green, it’s perfect at doing everything it’s ever been asked to do. And the tests that accumulate inhibit the growth of new imperfections. With TDD, I trust myself later, so I can confidently stop sooner.


I will always be a procrastinator and perfectionist. The thinking behind TDD started me on the path to getting better, in software development and in life. I’ve acquired enough support, tools, and habits to do timely and effective work.

Still, I can always improve. And sometimes there’s no more perfect way to procrastinate than to seek self-improvement.