Writing‎ > ‎

Good Enough is best

In Lisp: Good News/Bad News/How to Win Big Richard P. Gabriel wrote the section The Rise of Worse is Better which describes how a school of software design - worse is better - that is clearly inferior can lead to more people using software designed with that philosophy than a better philosophy - the right thing.

The real world has moved on, the products of the right thing design - in the form of LISP - have continued to wane. But the products of the worse is better design school - in the form of Unix and C - have not waxed to match. A new design school has more users than either. This paper will describe that design school - good enough - in terms of the the Gabriel paper.

Good Enough, the software design philosophy

To caricature good enough, the only measure of success in design is "How many people are using the software?" This means that good enough for most people today is better than perfect tomorrow. In fact, that is the genesis of the name. Given that, the characteristics of the good enough philosophy are:

  • Simplicity - the design must be simple, as speed of implementation is paramount. Simplicity is the most important characteristic, and all others may be sacrificed for simplicity.
  • Correctness - the design should be correct in most aspects observed by most users.
  • Consistency - The design must be as consistent as possible. Consistency is more important than correctness.
  • Completeness - the design should cover most situations encountered by most users. Completeness is more important than consistency.

This is an intentional caricature, to show that this design philosophy is clearly not as good as either alternative. The primary goal of designers of this philosophy is to get something into the hands of as many users as possible, without regard to quality. This is the attitude that drives Windows and the popular software that runs on that platform. To make comparing this school with the others easier, here are their characteristics (the other two quoted with permission):

The right thing Worse is better Good enough
Simplicity The design must be simple, both in implementation and interface. It is more important for the interface to be simple than the implementation. The design must be simple, both in implementation and interface. It is more important for the implementation to be simple than the interface. Simplicity is the most important consideration in a design. The design must be simple, as speed of implementation is paramount. Simplicity is the most important characteristic, and all others may be sacrificed for simplicity.
Correctness The design must be correct in all observable aspects. Incorrectness is simply not allowed. The design must be correct in all observable aspects. It is slightly better to be simple than correct. The design should be correct in most aspects as observed by most users.
Consistency The design must not be inconsistent. A design is allowed to be slightly less simple and less complete to avoid inconsistency. Consistency is as important as correctness. The design must not be overly inconsistent. Consistency can be sacrificed for simplicity in some cases, but it is better to drop those parts of the design that deal with less common circumstances than to introduce either implementational complexity or inconsistency. The design must be as consistent as possible. Consistency is more important than correctness.
Completeness The design must cover as many important situations as is practical. All reasonably expected cases must be covered. Simplicity is not allowed to overly reduce completeness. The design must cover as many important situations as is practical. All reasonably expected cases should be covered. Completeness can be sacrificed in favor of any other quality. In fact, completeness must sacrificed whenever implementation simplicity is jeopardized. Consistency can be sacrificed to achieve completeness if simplicity is retained; especially worthless is consistency of interface. The design should cover most situations encountered by most users. Completeness is more important than consistency.

The worse is better philosophy is also a caricature.

What's a bug?

As an example of the philosophies at work, consider what happens when some other program - not one being discussed - misbehaves. The right thing and the worse is better philosophy both believe that it is unacceptable for an errant program to cause problems in other programs; they should be unaware that anything is wrong. The good enough school doesn't believe this - after all, program errors are the exception, not the rule, and its even rarer for those errors to cause other programs to fail. As a result, when faced with a bug report of the form "Doing X in application Y crashed my system!", good enough designers will say "Y is broken, so don't do that". Designers from the other two schools will fix the system so that it doesn't crash, so that if you forget and do X by accident, only application Y will crash - or possibly not, if it was written to do the right thing.

As a related example, the internal clock on a system rolls over to zero every so often - usually with rather nasty results. On most systems, this will happen sometime in the mid 21st century. On Windows, it happens every 49.7 days. However, due to the approach to system crashes mentioned in the previous paragraph, it's rare for Windows systems to be up this long, so this is an acceptable limitation.

Cheap hardware?

Gabriel argues that software from worse is better designers will spread further than software from designers who do the right thing. His argument is that this happens because worse is better software is simpler, and so takes less computing resources to run quickly - so that it will start to appear everywhere. While history has proven this argument to be correct, the prediction was not.

The reason the prediction was not correct is that software from the good enough school appeared, and ran on hardware that wasn't sufficiently powerful to run Unix. The most popular OS for that hardware was DOS, and those systems appeared everywhere. DOS was later improved - first by adding windowing systems, then by replacing DOS with an integrated OS/Windowing system - so it now has much of the functionality of Unix.

In an ironic twist, the results of the good enough philosophy now require more resources than the worse is better. It is not at all uncommon to find a computer that has been discarded as too slow/small/old for Windows happily running Unix, and doing the job assigned it faster than a Windows system running on the fast/large/new system would. That Windows continues to add users shows that, while running on cheap hardware helps when hardware is expensive, being able to run on hardware that most people can afford is good enough.

So, contrary to Gabriel, I don't conclude that Unix and C are the ultimate computer viruses. Windows is the ultimate computer virus.

The bad news

The bad news is that good enough software is getting so widespread that people assume that everyone has it available. Further, software that's good enough tends to work only with itself. After all, the authors want you to use their software, not someone else's!

This means that people for whom good enough isn't - for instance, those who were exposed to either the right thing or worse is better software early on, and are used to those standards, find themselves having to choose between software they think is good enough, and software that works with things they get from other people most of the time. Web pages are a particularly nasty example of this, as their authors only support browsers that they consider good enough.

Some good news

The good news is that the good enough philosophy is incapable of producing systems suitable for being network servers. Systems that need to run twenty four hours a day, seven days a week, for hundreds or thousands of days must deal with unusual and rare conditions. So at least worse is better isn't doomed.

Further, the rise of Open Source Software means that people who have never been exposed to software that was built to be better than just good enough can try such software cheaply. Enough of them see the point and switch that one of these systems - Linux - has been doubling it's market share every six months. Software vendors have noticed, and are now selling commercial software for that system, some of which interoperates with good enough software - albeit no better than that software works in the first place.

So the good news is that there is now a viable alternative to simply good enough for a desktop system, and using it should be getting less painful as time passes.

Originally written in March of 1998.

Comments