User interface design is my favorite part of the development process. The problems it poses are the most interesting, and thinking up solutions is a form of creative expression.
Users consume applications through the interface - one chance to either deliver a satisfying experience or fail miserably.
It is a topic I have very strong and passionate opinions of, and motivated by this beautiful prose by Jono over at Not the User's Fault, these are my guidelines for user interaction design:
Know your users
The first step in interaction design is to know who it will be interacting with. Users can be profiled on many criteria, such as age, technical orientation, vocation, cultural background and more. The user profiles created from segmentation of those criteria are called Personas.
While defining Personas is a common practice for designing user interactions, it might not be possible to engage in all the steps required to fully understand the needs and tendencies of the users they represent - such as interviews, surveys, focus groups etc.
This is especially true on the web, where projects have limited funds and are very quick from inception to implementation. In this case, experience and common sense rule the day - but it is still important to define the base Personas for which the interaction under design applies. Going through the process brings out some considerations that can influence design decisions.
Watching actual users go through an interaction is very important to learn about its effectiveness. Watching live users in action is the best learning experience in interaction design.
Knowing your users is the most basic step to interaction design. Yet, for each user type and interaction requirements there are as many possible implementations as there are interaction designers. At this point the interaction designer has to make choices for his users based on his experience, attitude and style.
It is sometimes hard to avoid designing an interaction for yourself rather than for your users. It is a natural tendency to try to solve interaction problems in a way that seems most natural to you, however that might not always be in the user's best interest.
Ideally, the interaction designer is a part of the target audience. When that is not the case, observing prospective users is very important to understanding their needs and deciding on the approach to solve their problems.
I believe that good UI design is more intuitive than science, and in that respect it is not so different from graphical design. However the two should never be confused - as I've argued in my post on common misconceptions in web development.
Keep it as simple as possible
This old mantra is very much an integral part of a successful user interface. By keeping interactions as simple as possible you will:
- Have less opportunities to fail your users
- Give your users less to think about, allowing them to make easier decisions
- Reward your users quicker (at the completion of the interaction)
- Increase the chance that the interaction will get completed at all
A large part of the success of web-based services can be attributed to the simpler interfaces they provide compared to desktop solutions. Some of this is a result of technological limitations on the delivery software (ie, web browsers), but it's hard to argue with the results.
There are several common ways to simplify interactions:
- Use intelligent defaults
- Hide optional paths (or form fields) by default (progressive disclosure)
- Remove unnecessary steps from the interaction (and do so aggressively)
- Reduce mouse clicks. Make each click do more
This is obviously a very partial list, but it's a good start.
For me as a developer, the KISS principle is deeply ingrained in my thought process. Translating it into user interface design took some getting used to, but once it happened it became second nature.
In fact, many parallels can be drawn between UI design and software architecture design almost to the point you wonder why most developers aren't interested in designing interactions (actually I know why - most developers resent users for constantly breaking their code. I know this since a couple years back I had the same mindset).
Don't break conventions - And if you do, make it obvious
The tools available to us developers have evolved much in recent years, allowing us to create richer interfaces and interactions. With power comes responsibility - we need to apply discretion when using advanced techniques and tools, as to not confuse users.
Breaking interface conventions by using new technologies where they are not needed is a mistake.
Conventions should only be broken when they result in a bad user experience or when the alternative is significantly better. The latter is very uncommon when the former does not apply, so be advised.
If you do design a unique interaction (or at least, one that isn't in common use) - make it as obvious as possible for the user. A user can only begin to understand your new interaction when he realizes that something is different. Disguising buttons as links, hiding drop down menus in small target zones, making background changes to the document without notifying the user - all result in user confusion and a bad user experience.
The more you need to educate the user on how to complete an interaction - the less likely he will bother to. Good interactions are self explanatory.
Interactions should be fun
Users interact with your application since they want to achieve a goal. That goal might be to complete an item purchase, to indulge a curiosity, to gather information and many others. There are several factors that affect the user's motivation to complete an interaction:
- How important is the interaction to achieving the user's goal
- How unique is your application (ie, how easy would it be for the user to find a better place to achieve his goal)
- How hard it is for the user to complete the interaction
Negative factors can be offset by a fourth one:
- How fun is it to progress through the interaction
The fun factor in interactions is often ignored as they are considered strictly functional. It's no coincidence the word functional begins with fun. The fun factor of an interaction increases motivation for completing it - it makes your application more unique and it increases the user's tolerance for the interaction.
There are several ways to increase the fun factor of an interaction:
Making your interface prettier will have a positive effect on your users' perception of it. It's no secret that most of the illusion of Apple's superior OS interface is made on the grounds of aesthetics.
Make it gamely
Computer games have some of the best interfaces of any computer software, and it's no coincidence. You can make your interactions more gamely by adding feedback, reward the user for completing steps and transmit the feeling that the interaction is a part of the user's journey towards his goal, rather than a functional requirement that he must take care of.
Make the interaction do more with less
The user's time and patience are limited. Advance the interaction as much as you can with each user input. Make the user feel the interaction is smart and that it is working with him towards completion.
Learn from others
Those are my thoughts on user interaction design, born out of my experience in web development and of my introspection as a long-time user.
If you are interested in user interface design, the GNOME Human Interface guidelines is as good a reference as you will find.