In Code

Elsewhere

Support My Wording & Coding

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:

Write down a bunch of possible tasks.

Pick the most important task, the easiest one, and one more.

Put the easiest task first.

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.

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.

Conclusion

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.