Perfectionism: The Engineer's Bane

Photo: Paul Mannix

I’ve tried blogging many times, but my forays into online writing always grind to a halt. The explanation for this is partly psychological and partly technological: I latch onto minor dislikes I have with blogging tools/platforms and I can’t overcome them because of my perfectionist nature. I’d rather leave the blogging ‘problem’ unsolved than to solve it imperfectly.

I have serious difficulties with accepting 90% solutions to problems. I suspect this is a shared engineer trait. 90% solutions are so aggravating because they bring you close enough to perfection that you can nearly touch it–but you can’t quite. It’s like the occasional drop-out in that YouTube video you really wanted to watch that makes you turn the damn thing off completely.

The situation reminds me of roboticist Masahiro Mori’s essay The Uncanny Valley:

There are mathematical functions of the form y = f(x) for which the value of y increases (or decreases) continuously with the value of x. For example, as the effort x increases, income y increases, or as a car’s accelerator is pressed, the car moves faster. This kind of relationship is ubiquitous and easily understood. In fact, it covers most phenomena, so we might think that this function can represent all relations. That is why people are usually upset when faced with some phenomenon it cannot represent.

Climbing a mountain is an example of a function that does not increase continuously: a person’s altitude y does not always increase as the distance from the summit decreases owing to the intervening hills and valleys. I have noticed that, as robots appear more human-like, our sense of their familiarity increases until we come to a valley. I call this relation the “uncanny valley.”

The Uncanny Valley as it applies to robotics (or 3D animation) can actually be quite disturbing, resulting in human-like robots that seem more like zombies or even psychopaths because, (I surmise) the entities in question are similar enough to humans to trigger our brains’ mechanisms for detecting our fellow humans, but not perfect enough to be indistinguishable from actual humans. Our brains essentially detect an impostor.

For a perfectionist, happiness with a design can illustrate this same behavior; a better design makes us happier until it reaches a point (near to perfection) where the flaws in the design seem to stand out in an especially strong way.

Often 50% solutions are actually more desirable (and almost certainly more practically effective) due entirely to these psychological factors. I find that I can adopt a 50% solution thinking “this will work for now”, but I’ll drive myself crazy with a 90% solution I’d view as an imperfect permanent solution. With 50% solutions I’ve psychologically accepted the imperfection; with 90% I haven’t, yet it’s still there.

I’ll try to bring this to a more concrete level:

Until recently I had a storage closet jumble which would have driven me mad had it not had a door which hid its clutter, yet I never did much to permanently resolve the situation. You’d think that I’d take the time to deal with something which irritated me so, but fundamentally, I couldn’t solve the problem. If I needed to retrieve something from the disaster area I’d wade in, find it, and leave with a hefty sigh over the hopelessness of the situation.

The problem was that every time I saw the mess I looked at it as an engineer: it was a problem to be solved. What was the ideal solution? I could put this in one container and that in another, but there weren’t discernible, natural groupings. Which things should go together? They were unrelated! My engineering mind said, “the ideal solution hasn’t yet presented itself, but surely it will”. But it never did.

This is well-explained in the essay on Devizen entitled Programming Can Ruin Your Life:

Programmers become obsessed with perfection. This is why they are constantly talking about rewrites. They cannot resist optimum solutions. Perfection requires tossing aside mediocre ideas in search of great ones. A good programmer would rather leave a problem temporarily unsolved than solve it poorly. A good solution takes into account all predictable outcomes and solves the largest number of them in the most efficient way. This mindset prevents you from writing code with limited utility and life span. While it’s a wonderful trait to have in programming, the demons of scope and efficiency will start to assert themselves on your ordinary life. You will avoid taking care of simple things because the solution is inelegant or simply feels wrong. Time to think will no doubt yield a better result, you’ll say.

Unable to find an ideal solution, I put the project aside and waited for one, until eventually, when the need for space reclamation arose, I stumbled upon the incredibly obvious 50% solution of moving the entire disaster out of my apartment. I’ve been satisfied ever since.

This sounds like the nit-picky, pointless tale of one man’s inability to wrangle his rubbish, but I assure you it’s much more. It’s the tale of a man who has missed important meetings because he can’t find a calendaring application which satisfies his requirements. It’s the story of a dozen stillborn projects.

It’s the face that would have launched a thousand ships but couldn’t find optimal material to make sails from. And for people with this personality trait, it really does matter.

Perfectionism has its charms. Certainly it’s the reason many things are so very good. But if we’re not producing anything because of it, we need to listen to Voltaire’s advice and remember that sometimes, “The perfect is the enemy of the good.”1

When perfectionism has us held hostage, what can we do? Here are three strategies:

“Escape by Design”

I’ve borrowed this title from The Uncanny Valley:

We hope to design robots or prosthetic hands that will not fall into the uncanny valley. So I recommend designers take the first peak as the goal in building robots rather than the second. Although the second peak is higher, there is a far greater risk of falling into the uncanny valley. We predict that it is possible to produce a safe familiarity by a nonhumanlike design. So designers please consider this point. A good example is glasses. Glasses do not resemble the real eyeball, but this design is adequate and can make the eyes more charming. So we should follow this principle when we design prosthetic eyes.

Masahiro Mori is talking about making robots that don’t attempt to look human so that they don’t fall short of looking identical to humans; robots that look like (say) cartoon characters don’t trigger our innate disgust for the flawed (for a deeper treatment of the uncanny valley problem, go here).

In other words, do more by doing less. Accept the “50% solution” as passable with the knowledge (personal or even public) that it isn’t your best work, or wasn’t quite up to your original intention but is still an accomplishment.

Release Iteratively

If you have the luxury of working in a field like (much of) software or web content, release iteratively. Release small, perfected nuggets and build on them later. Don’t ship broken features or immature content, just ship less content and work your way up to the masterpiece.

Make Hard Commitments

Real artists ship, so make big, firm promises to ship the product and stick to them (I’ve done this recently with Raconteur, promising my users an important update before Christmas).

From the 37signals book:

Here’s an easy way to launch on time and on budget: keep them fixed. Never throw more time or money at a problem, just scale back the scope.

This might cause you to release something imperfect (which might even be good for you), or it might just give you the motivation to power through to perfection.


Are you held hostage by perfectionism? You know who you are. Can you share any additional tips on freeing yourself from its clutches?

  1. The original quote in French is “Le mieux est l’ennemi du bien.”, from Voltaire’s Dictionnaire Philosophique (1764). ↩︎