Before talking about software, lets talk about cars. Why do I want to talk about cars is to take great car design as an analogy to great software design.

What comes to your head when you hear BMW or Mercedes-Benz? The standard quality of these vehicles. They ordered by most important first are to be;

  1. Perform well (functional, does what it is suppose to do well)
  2. Reliable
  3. Comfortable (ease of use, positive feeling)
  4. Artistic / Luxurious (Have a taste)

Let’s look at their slogans.

Mercedes-Benz: The Best or Nothing

BMW: Sheer Driving Pleasure

Essentially their focus is to built great vehicles. With mindset let’s see how the above qualities can be applied to software design.

When it comes to software the most important characteristic is functionality.


Functionality is the starting point of a software product. All the functionality that is expected from the software product should perform. It is thoroughly important the developer understand the functionality.

  1. Developer must thoroughly understand what functionality are expected and any doubts have to be cleared.
  2. Think about the functionality. This if the functionality is bad (-1), ok(0), good (+1).  If it is bad or ok think whether the functionality can be turned into good or awesome (+2).
  3. Discuss with stakeholders any suggesting changes.
  4. Agree on new functionality if there are changes. Then carry it to development.

Ease of Use

A software product is a thing that is going to be used by someone. Preferably a human being. Whatever the product is (Library, API, web app, website, desktop or console application, game) it should be easy to use. If the software makes the user uncomfortable there is no point of talking about quality because already the product is neglected.

Keep in mind ease of use should be addressed for both end users as well as for developers who are going to work on the product. The code should follow an accepted standard. Commenting is must. Always be consistent. There are tools to generate documents out from the comments in the code. Make sure to use such a tool and understand the power of that tool.

In development use tools that make the developer’s life easy. Example use SASS instead of CSS.


No one like something unexpected happen to them. We seek reliability in living and static things. We seek reliability from these things because we rely/depend on them. When you get a sense of reliability in something you start to trust it and use acknowledge them into your life. Reliability and trust are some of the core requirements of daily life. They are part of human nature. It is never enough to stress out the importance of reliability. Reliability is a measure that filter out bad and good. Hence reliability is a premium characteristic of a good software product.

Let’s take a simple notepad application. When you try to save a document but it crash like one out of five it is not a reliable product. If the product crash when it exceeds it limits it is not a reliable product.

So how to improve reliability?

First thing that comes to mind is the testing. Testing is a solid way to analyze the reliability of the product. There is a specific Wikipedia article about different types of reliability testing.

Then follow industry best practices. When developing the application properly handle exceptions.

A Taste

What makes a BMW a BMW or a Mercedes-Benz a Mercedes-Benz? They have their own style and taste. Like that having a taste in a good software product can let your product stand out from the crowd.

When compared to public web applications enterprise applications seems to have very little taste. Michael Dubakov has written a good article about this. With good taste, usability improves. For example on a personal note, I have used the project management app called Trello. Their overall UI design and feature layout almost feel natural.

There are two perspective for software taste. One is the usability and the actual product itself the other is software code and application structure. For example, take Ruby on Rails framework. Their code layout is more humane and how they have written comments along with examples indicate their own style. If you are using a framework learn the style and taste of the code base. Inherit those characteristics when you build your application on top of the framework. Follow standard coding styles and be consistent. Any documentation should not left behind.



Bad software are built because you don’t value them as a physical product. In fact you must put great care and quality as if you are building the next gen BMW or Mercedes-Benz. Every letter in your code matters. How you place comments how they describe something must be elegant. The four factors need to consider to build a good software are functionality, ease of use, reliability, and having its own taste.