It's interesting because I suffer from perfectionism as well, severely so. Probably for worse, I've also been able to achieve it in a lot of aspects of life. This reinforces my desire for perfection.
The interesting part is that programming is the one place where perfection escapes me, as in I haven't desired for it. I realize there are bugs and caveats to written code. My flip side here is that I strive for perfection of the user's experience. I do get disheartened when a user experiences something negative in the code based I work on.
The key for me has been focusing on the perfection to a user and not perfection of code. There may be a dark edge that they never see, and it's fine.
When there is a careless bug, I still struggle balancing empathy and drive to fix it. That's fine, however, as I'm aware and work to not do it. I could see where someone who strives for perfection would easily get disheartened and feel misalignment in values.
There is one thing that has held me back the most while progressing in my programming endeavors: perfectionism. It has been an enormous energy drain. I believe that programmers are especially susceptible to it since programming is a very creative but at the same time logical task with many different ways of approaching problems in a huge ecosystem. In the last few years I got to know my perfectionistic side, where it comes from and what is supportive in changing my relationship with it. I always say that perfectionism is a fear of vulnerability. I think it is a topic that is not addressed enough and that many people have challenges with. What are your experiences with perfectionism? How do you handle it? Lets support each other!
I see perfectionism as a behavior driven by two motivations:
A) The desire to go from competent developer to an expert one.
B) The desire to avoid the shame of failure.
In the case of A, I think its often good for the developer / bad for the product. By single-mindedly erasing imperfections, the developer learns the nuances needed to move from competence to expertise. I don't think the product is likely to benefit at the same rate, though.
i'll be honest, i didn't really enjoy this article. i feel like there are people who are idealists and perfectionists and people who actually execute on ideas. i am not saying one can not change. certainly in my life i have been in the first category for many years or decades at a stretch. but i am at a productive period in my life and i write every day, i write music every day, i write code every day, i accomplish many other things through the course of a day. is everything i do perfect? no: not one thing i do is perfect. perfection is just some ideal or mental standard but it is not something that i think can ever be achieved except in very limited contexts, like maybe a game of tetris.
i remember some years ago reflecting back on some software project that had gone well. in my head, it was a beautiful finished object that i'd created using the tools and frameworks available to me. it was perfect and flawless.
then i went back and read the code and saw so many TODOs and things that i would have accomplished had i only had more time. and i never did get a chance to finish those TODOs, but the project launched successfully and generated a lot of revenue.
Computers demand perfection. Code must be perfect or code doesn't work as intended. As Douglas Crockford once said, we humans are awful at being perfect. There is no "good enough" in code - there is only perfect or a product that doesn't work as intended.
Perfection can drive people crazy. So how do you guys do it? How do you guys manage perfection? Or are we all just a bit crazy :)
Is it because you are not convinced that aiming lower is the right thing to do; or do you believe it but you have trouble actually doing it?
Perfectionism is common in programmers (perhaps because imperfect syntax doesn't work). It means that you compare your product with "perfection", instead of comparing it with "nothing" (ie. it not existing at all.) If you tend to be critical, and quickly notice faults and omissions, then you may be a perfectionist. It seems to me that perfectionism is the number one reason why many programmers aren't successful in business. It's very difficult to overcome, but one way to begin is simply try to find what does exist in your product (and elsewhere), and just acknowledge that it does. You might not yet be convinced that it matters, but just being aware of it is a start.
For me, a crucially motivating thing was people actually being interested: feedback. When I launched that 2-hour product, I wouldn't have continued if there was no feedback. But there was (a single email!). Feedback can help survive the gap you mention, to paying customer. Before then, just getting something that does something can be very motivating (see my GP comment).
BTW: don't do tdd for a MVP! It takes too long. The advantages of tdd don't really make sense for prototype.
EDIT Ask yourself how you could cut corners, and yet still deliver some of the essence of the thing. Work out what your one essential idea is, and try asking of a particular line of code: is is absolutely necessary for that essence? Some other questions:
- error checking? *cut*
- corner cases? *cut*
- "option to save your work"? *cut*
(unless it's a DB etc, whose essence is storage)
- cover the most common cases? *cut*
(just cover *one* case)
- documentation? *cut*
(except: the essence + how to run)
- debug? *cut*
(provided it mostly runs)
- integration test? *cut*
- define formats/interfaces? *cut*
A more extreme cut is possible... No Code:
- present slides of your product (Steve Blank)
- pretend to have a product, but you just:
post on HN
one webpage (optional: a survey on it + Skype chat)
(feels wrong to me, but can be done ethically)
- adwords campaign + landing page
Consider your PHP friend... did he aim high? What specific actions did he do that were different from your other friends?
disclaimer I find it hard to cut corners on my present project. My excuses (which I'd like to overcome) are due to it being based on a new mathematical model:
- if the maths isn't realized correctly, it won't work perfectly
- showing off all its benefits (eg error checking) requires more work
- getting the foundation right will be easier to build on
- patenting (can't be done after release)
I feel as if I am a natural perfectionists. No matter where I work, I want everything that I build to be perfect in meeting the needs of the users and outsmarting competitors in the market.
Yet I know that the problem with perfection is that it slows me down and can stop new ideas from being given a green light.
How do I fight this feeling of striving to be absolutely perfect?
How do I know when a feature is "good enough"?
Sidenote: This feeling is exacerbated by the fact that I also receive a lot of customer support messages, giving me insights into the problems they might have. Yet I know that a single user complaining about a feature should not be the reason to fix it.
My perfectionistic tendencies stem from growing up with (undiagnosed at the time) ADHD.
I am well aware that nothing is actually ever perfect in our world. However, what perfectionism is for me is a "double or nothing" kind of mentality.
What I mean is that I would (and still do) get criticized and/or reprimanded for doing poorly on a task. Therefore, on the next task or on a second attempt, I would adopt this mindset where I believed that if I truly went above and beyond/did a perfect job, then some how it would make up for the previously failed attempt.
From all the various responses I would receive, I learned that when I went way above and beyond that people treated me much better. I internalized that if I make things "perfect", then people will be kind to me, respect me, accept my downfalls, etc.. I am soon to be 32, and I still struggle with this a lot. But at the same time, I feel like it has made me a somewhat better programmer in some regards. Or at the very least, I hope it has made me better. So, maybe it's not all bad? ;)
I think coding kinda forms us to be perfectionists, because a small mistake can disable entire programs.
I'll share my epiphany that I've learned from HN that PG said...if we're not embarrassed at launch time, it's too late. Being a perfectionist my self, it's a brilliant statement.
Oh, I agree. You're absolutely right. I know that the perfect is the enemy of the good, but just knowing that doesn't make it easy to get over the psychological hurdle.
The same hangup keeps me from trying many of my software ideas. It's a feeling that I'm constantly learning to fight.
Could not agree more. Self taught programmer here too. For such a long time chasing "perfection" had me stuck where I was not finishing any projects.
Taking a step back I decided that finishing projects is what really gives me happiness. They don't have to be perfect or world changing. That coupled with detachment from how the project is received has helped me so much.
Totally agree with this. Trying to be perfect is a good road to paralysis and not getting things done. Software is like people: it's ok to not be perfect, especially if they're always trying hard to be better and doing good things for society.
I consider myself a reformed perfectionist, having struggled with it for a long time. OP should take heart that perfectionism can be managed, and you can accomplish wonderful things.
Perfectionism has positive aspects, but only when you continuously work to direct those tendencies towards constructive ends. Left undirected, it can collapse in a paroxysm of endless refinement from which little escapes.
> "perfect is the enemy of shipped".
This is a key concept, although I find that a more negative emphasis helps me: I need to remind myself that overengineering is destructive. Not only to the shipped product, but to the unshipped product right before my eyes as well, as productivity and value added diminish towards zero. (Refinement and refactoring are not always net positive, because churn introduces bugs, and because models created without the input of actual users are usually ill fit.)
It is also helpful to involve other people — to talk to people regularly who are counting on you to finish something, to experience not only their appreciation but their expectations and their wants. Setting incremental deadlines for small gains, promising others that you'll meet those deadlines, and then fulfilling those promises creates a virtuous cycle.
Finally, I've had to accept that there are limits to the kind of environment that I can thrive in. I'm just not that effective when working on projects with poor engineering practices: failing CI, no documentation, chaotic version control, wildly unrealistic expectations. Some people can do great work under those conditions, and I can still function — but it doesn't play to my strengths so I try to avoid placing myself in such environments.
As a perfectionist myself, let me say that the key is being able to continue working on v1 even when you anticipate the potential for a problem with the finished v1. The perfectionist failure mode is to restart the iteration every single time a potential problem is perceived. The perfectionist cannot stand the idea that anything, even v1, might fail in a way that was remotely preventable. The perfectionist iterates, but the iteration is a very tight loop that is not large enough to collect good feedback. In pathological cases the iteration never leaves the mind.
The obvious problem is that these "mistakes" are far too small to learn anything useful from. It does no good to tell the perfectionist that they have to iterate and learn from failure, because that is exactly what the perfectionist is doing. The problem is that it is more complicated than that - one also has to have the right kind of failures. A person with a healthy attitude towards failure won't even think about it and will naturally tend to let the problem dictate the optimal size of the iteration loop, but the perfectionist will usually always keep their loop too tight to be efficient, or to get anything useful done at all.
Being able to let go of that requires the ability to ignore or accept a certain kind of imperfection. Perfection in the limit requires the acceptance and embrace of permanent lack of perfection everywhere else, but especially in the builder. That is what is so hard for the perfectionist to do.
"I've heard that "perfect is the enemy of good enough" many times, but the repressed artist in me refused to accept this as truth" - Thank you!
I still have this issue about perfectionism. I am constantly reading, trying to perfect my knowledge of the framework I am using, CSS guidelines to ensure that the UI is perfect, patterns book and software development books to make sure I know a code smell, always trying to write the perfect code or pick the perfect color that I have NEVER seen a side project to fruition.
This might have to do with what kirse said - it may have to do with the way I look at myself internally. But it certainly proves to be an impediment. The "fail fast, fail early fail often" matra does not work so well for me, especially when I have complete control over the final outcome.
I will certainly find that book and see if it helps me. But its nice to know someone else was in my shoes, and found a way to work with it, rather than fighting it.
I still have this issue about perfectionism. I am constantly reading, trying to perfect my knowledge of the framework I am using, CSS guidelines to ensure that the UI is perfect, patterns book and software development books to make sure I know a code smell, always trying to write the perfect code or pick the perfect color ...
I think there are a lot more people struggling with this problem that any of us realise. Particularly, it would seem, in areas where technical knowledge intersects with endevours that would traditionally be classed at "art".
Personally, I think this has got to be one of the most useful articles I've read in months. This kind of stuff is why I keep coming here.
overcome come perfectionism by doing more. important things will fall out of the cracks in the software. then you can focus on the issues that arise from the cracks. so simply put, if youre suffering from perfectionsim, youre not spreading yourself out enough, i.e. too narrow minded. this forces you to make mistakes and mistakes are sometimes good.
I'm always fighting with my strive for perfection myself.
And, sometimes, I'm so tired of struggling with this part of my personality that I end up doing even worse than how I would've done if I would have taken that particular task more lightly.
The interesting part is that programming is the one place where perfection escapes me, as in I haven't desired for it. I realize there are bugs and caveats to written code. My flip side here is that I strive for perfection of the user's experience. I do get disheartened when a user experiences something negative in the code based I work on.
The key for me has been focusing on the perfection to a user and not perfection of code. There may be a dark edge that they never see, and it's fine.
When there is a careless bug, I still struggle balancing empathy and drive to fix it. That's fine, however, as I'm aware and work to not do it. I could see where someone who strives for perfection would easily get disheartened and feel misalignment in values.
reply