The essence of being human is that one does not seek perfection.
– George Orwell
Since this blog will also be on the long side, I’m going to begin it with the “executive summary” format I tried with my last blog. So, for those of you that can’t be bothered with “lots of words”, here ya go:
- Software that is “good enough” really is
- Perfection is the enemy of “good enough”
- “Perfect code” never ships
- Ship often, as soon as you have compelling new value
- Creates a culture of constant improvement
- Greatly increases value to customers
- Iterative refinement allows customers to provide feedback
- Solve Customers’ current problems
- Provide a better way, not a new way
- Don’t fall in love with what you build
- Customers don’t care what you value — only what they value
- Be ready to dump what customers don’t value
Many years ago I thought of source code as some sort of art form. I actually had a belief that it could be “perfect”, to a level, and that pursuit of this goal of perfection was somehow important. It was something akin to believing that software developers were artists that used code as a medium for expression of that art. The worst part of that belief was that I was striving for perfection in my eyes, not those of my users. Perfection had to do with how the software was implemented, but not whether or not is ultimately useful. How utterly naive.
As I previously blogged, business is like a street fight. And to have any hope at beating your opponents you’ve got to focus on delivering what customers value. And they don’t value how software is written; they value what it does, or more specifically what it does for them. For example, since Genuitec is in the development tools space we focus on helping developers do what they want to do, the way they want to do it, but more easily and effectively. And the ability to do that requires listening to customers and then building what they want, since that is the only thing that they will ultimately value.
But that’s not the same, necessarily, as building what they need, or specifically what we think they need. We all must keep in mind that our customers, not us, are the subject matter experts for what we deliver. And it is they, not us, that get to determine what is valuable and what is not. And it is they, not us, that decide whether or not to pay for the value they perceive. So, what we must do is get close to what we think our customers want, ship it, listen to their feedback, and deliver relentlessly to close the gap between our product’s current abilities and their reality. And sometimes their reality suddenly changes, as does what they value. And when that happens we can’t be so in love with what we’ve already done that we can’t dump it and start over if needed.
Because the code itself isn’t art and never has been. It’s just a temporary vehicle that leads to the perception of value in the minds of our customers, at least for a little while.
Perfectionism is the enemy of creation, as extreme self-solitude is the enemy of well-being.
–John Updike
June 11, 2009 at 9:24 am
I had an English professor in college who basically said the same thing. She taught me that I will never have an essay or writing that I was 100% satisfied with, and that at some point I would have to declare it “good enough”.
Rarely is crappy code good enough, but for meticulous developers like you and I, it is difficult to define that point of “good enough”. It still comes back to accepting that you code does not define you. It is a definition of the requirement (or in your case features) that you customer wants.
This principle of “good enough” spans many other aspects in life. As we were talking about with houses the other day, you can spend all your time making your house perfect, or reach a point of good enough, and enjoy what you have. That perfect business deal may never come along, but don’t miss out on the ones that are good enough.
Mainly, pick a point at which you would be happy and satisfied calling “good enough”, and move on to enjoy the next challenge.