Applying design principles to software, Part I

January 21st, 2008

A woman likes designSometimes I find a well-written library with a great API. It’s well documented, easily understood, and it seems to do what it “should” do. It’s almost as if the author of the library anticipated my usage. Those libraries are a pleasure for me to use. I tend to call them well-designed.

I’ve been reading a fascinating book on design recently, called The Design of Everyday Things (DOET). It discusses good and bad design of the objects we use every day, from the doorknob to stovetops. The book presents principles of good design that, if followed, can make products easier to use. And the reasoning behind the principles is so simple and straightforward.

In this article I’d like to explore principles of design as applied to writing software. Not user interface design, but the design of API’s and libraries.

There are two users of a module: the programmer, and the client code he/she writes. Both types of users are important, so I’ll try to give some useful tips about both.

Conceptual Models

Good or bad conceptual model

DOET showed me that there is an order — a process — for making things easy to use, intuitive, and enjoyable. I want to apply that process to developing software. If I could only learn to apply the ideas of design, maybe I could make my libraries easier on the user. We’ve all used libraries that are easy to use. They feel intuitive, natural — like they “just work”.

There is no magic bullet to make that happen. It takes a lot of thought and hard work. But I can’t help but feel that the insights into design I gained from DOET can help me create libraries that are a joy to use.

The first insight? Enjoyment of a library is not based on it’s technical merits. It’s not about what algorithm is used. It’s not the efficiency or the number of features. In fact, it doesn’t happen in the computer at all.

The most important usability aspect happens in the brain of the user.

It’s about how the user thinks the library works. It’s about how well the user’s ideas about the system match with how the system actually works. Those ideas the user has are called the user’s Conceptual Model. A good conceptual model can mean the difference between a frustrating programming experience and a delightful one.

Your main task as an API designer is to communicate a correct conceptual model to the user.

An incorrect or incomplete conceptual model will make using the library confusing. The user will think an action will do one thing but it does another. It may even make it impossible to use.

Two dandies discussing the user’s model

Good question. And it’s pretty tough to do because the designer cannot communicate directly with the user. He/she instead must communicate through the documentation, comments, self-documenting code, and examples. All of those things the system presents to the user are collectively called the “System Image”. It’s the first and most important way to develop a correct conceptual model.

Communicating Conceptual Models

So improve your system image and you’ll improve your usability. That’s not to say that it’s all superficial. The system image needs to communicate how to use the library clearly and correctly. If you can’t find a clear, simple, and correct explanation for how to use it, it could be a sign that your library needs to be reworked from the bottom up. I’ll explore doing that in the next articles in the series.

Here’s a big diagram showing some of my ideas for ways I can communicate better to my user.

Communicate with the user

I’m looking forward to applying these to my libraries. I’m sure my users will thank me.

So, that’s just the first of the principles. It won’t solve all of your design issues, but it’s an important concept to have before we more forward. Now that the idea is there, we can tackle the idea of feedback, which is important for the programmer and the client code using your library. See you in the next article.

Popularity: 9% [?]


3 Responses to “Applying design principles to software, Part I”

  1. Applying design principles to software, Part II | LispCast on January 28, 2008 8:01 pm

    […] the last part of this series, I introduced the idea of Conceptual Models. I explained how the designer’s model is […]

  2. Applying design principles to software, Part III | LispCast on February 13, 2008 3:32 pm

    […] the last two articles, I explored the ideas of the Conceptual Model and Feedback. The Conceptual Model of the user is his/her understanding of the system. It’s […]

  3. Stephanie on February 26, 2008 3:57 pm

    Really easy to read and understand, a lot of good advice and I loved the pictures! I was actually looking for examples of simple Conceptual Models as I’ve just started learning about them at uni and I can’t seem to find many online but it was a good read anyhow.

Trackback URI | Comments RSS

Leave a Reply

Name (required)

Email (required)

Website

Speak your mind