Thursday, April 15, 2010

Is Better the Enemy of Good Enough?

"Better is the enemy of good enough" is a phrase often held up as the reason for not making changes on a team. If everything seems "good enough," the effort to make something better is regarded as waste. A lot of times, "good enough" is defied in terms of "providing value to the customer," often stated as the "shipping working software" metric. So if you are shipping working software and receiving generally positive feedback from your customers, then what you're doing is good enough and there is no need to do things differently.

But if good enough is really all you need, why is it so dissatisfying?

I've mentioned before that it's a good idea to have a project threshold of success, a set of minimum goals that must be completed for a project to be considered successful. Failure to meet all goals in the threshold of success means you've failed the project. So while you will succeed if you meet your threshold goals, only meeting the goals means you've done the absolute minimum amount of work necessary to be successful. Satisfying the threshold of success for a project is like getting a C in school. It's certainly good enough, but it isn't exactly awesome.

While "good enough" is perfectly acceptable (You didn't fail!), it always feels nice to achieve more. It feels good when I'm able to gently exceed my client's expectations. It also feels good to do things right and not merely get things done. This is why merely shipping software, the minimum requirement for succeeding on a project, is not enough for me.

Equally important to me is how the work is done, not just that the work gets done. Is overtime or heroic effort necessary? Are we reflecting on our work and attempting to improve? Does my team work together well, take risks, and innovate in many different areas of the project? Do we try to use data to understand what is happening in the project? Are teammates given the support they need to grow as professionals? Am I having fun, looking forward to work every day, and happy with my contributions on the team? Is the software something I am proud of and actually useful to people? Is the product well supported by documentation? Is my code beautiful and maintainable? And most importantly, did I either learn something new or achieve something great while working on this project?

This is actually a lesson in understanding what "good enough" really means and why tools such as Threshold of Success are so important. Only when everyone agrees at a conceptual level that what the team is doing is "good enough" can everyone on the team move forward and be happy. Sometimes this will mean getting working software out the door no matter the cost. For most teams "good enough" will be a mix between a working software product, a happy and healthy team, and laying foundation for future work.

Making improvements in how my team operates or to the software itself just feels good. It's fun. So while "better is the enemy of good enough," avoiding change is paramount to avoiding the very things that makes me happy. The trick is making sure that I'm not making changes just for the sake of change. Sound engineering and a good understanding of the project's threshold of success can help to avoid this fate. Once you've met your threshold, earn some extra credit by improving your code base or making process improvements. Or, better still, choose a threshold of success which requires you to do just a little more than the bare minimum. Because no one should settle for good enough when awesome is within reach.