Skip to content

Ten Principles for Good Design

Back in the late 1970s, Dieter Rams was becoming increasingly concerned by the state of the world around him: “An impenetrable confusion of forms, colours and noises.”

Aware that he was a significant contributor to that world, he asked himself an important question: is my design good design?

His answer is expressed in his ten principles for good design.

Because we are all extremely smart and creative thinkers, let’s agree that “design” is not a thing-in-itself; that design is a means to an end; that design is a solution to a problem.

Let’s agree that design is abstract and that it can be applied to things other than design, like Engineering.


Is my software good software?

What happens when we ask ourselves a similar that Rams asked himself? Furthermore, as a starting point, can we use the same principles that he used?

Let’s just do one thing and exchange the word design for the word software

1. Good [software] is innovative — The possibilities for innovation are not, by any means, exhausted. Technological development is always offering new opportunities for innovative design. But innovative design always develops in tandem with innovative technology, and can never be an end in itself.

Good code is built on good technology, good technology is always evolving therefore good code is always evolving.

Software is not “an app”, but literally code that we write and interface with as engineers.

2. Good [software] makes product useful — A product is bought to be used. It has to satisfy certain criteria, not only functional, psychological and aesthetic. Good design emphasizes the usefulness of a product while disregarding anything that could possibly detract from it.

A good abstraction is universal and easy to use, but it also doesn’t try to solve too many problems.

3. Good [software] is aesthetic — The aesthetic quality of a product is integral to its usefulness because products we use every day affect our person and our well-being. But only well-executed objects can be beautiful.

Good code is used often because it is essential.

4. Good [software] makes a product understandable — It clarifies the product’s structure. Better still, it can make the product talk. At best, it is self explanatory. Bad code is not self-explanatory and therefore not intuitive or easily understood:

Clean abstractions are intuitive and self-documenting, but also well documented and tested.

5. Good [software] is unobtrusive — Products fulfilling a purpose are like tools. They are neither decorative objects nor works of art. Their design should therefore be both neutral and restrained, to leave room for the user’s self-expression.

For engineers, good code should be usable and extendable, it shouldn’t get in the way of the implementation.

6. Good [software] is honest — It does not make a product more innovative, powerful or valuable than it really is. It does not attempt to manipulate the consumer with promises that cannot be kept.

You can’t contrive innovation. If it’s a problem that is already solved, there are solutions in the wild that you can use. Good code knows its own limitations and can communicate that accordingly, it doesn’t pretend to be something it’s not.

7. Good [software] is long-lasting — It avoids being fashionable and therefore never appears antiquated. Unlike fashionable design, it last many years – even in today’s throwaway society.

Code should be robust and future-friendly, it should be inviting to engineers who may need to refactor it over time instead of scrapped entirely.

8. Good [software] is thorough down to the last detail — Nothing must be arbitrary or left to chance. Care and accuracy in the design process show respect to the user.

For the user, don’t miss edge cases and handle errors gracefully. For the engineer, provide a delightful experience and intuitive abstraction.

9. Good [software] is environmentally friendly — Design makes an important contribution to the preservation of the environment. It conserves resources and minimizes physical and visual pollution throughout the life cycle of the product.

Think of this as the server environment: don’t write code that will demand too much from the server.

10. Good [software] is as little design as possible — Less, but better – because it concentrates on the essential aspects, and the products are not burdened with non-essentials.

Back to purity, back to simplicity. 1

This is not to say “terse” code. Code is that is over-engineered or bloated is bad and hard to maintain. Abstractions should be clean, etc.

Just to recap:

  1. Good [software] is innovative.
  2. Good [software] makes [engineering] useful.
  3. Good [software] is aesthetic.
  4. Good [software] makes [engineering] understandable.
  5. Good [software] is unobtrusive.
  6. Good [software] is honest.
  7. Good [software] is long-lasting.
  8. Good [software] is thorough down to the last detail.
  9. Good [software] is environmentally friendly.
  10. Good [software] is as little [software] as possible.
  1. Ten principles for good design