Bored in computer graphics class yesterday, my mind drifted to how people use machines best. A vague and general question, I thought of the most successful machines of the 20th century (the automobile, the typewriter, the personal computer, the internet) and what made them so great.

Many machines came to mind. The typewriter, the personal computer, even the Internet. Yet few machines revolutionized the 20th century as the automobile did.

A great machine should be judged very much by the problem it solves. But I believe a big part of what makes a machine successful and remembered is how well people can integrate it with their lives - how well they understand what it does and how it can help them. The human experience of interacting with a machine, essentially

Abstraction

Every professional programmer knows this term. When I go to work each morning, I want to get in my car, turn the key, put it in drive, and go. Though the car is an incredibly complex machine with many modules, the decisions I have to make are abstracted, meaning that I can make them without knowing about the details of their implementation. To turn on the car, which involves using the battery to ignite a spark plug, I simply turn a key. To move, which involves spraying discrete quantities of gasoline at precise moments, I press a lever (the gas pedal) continuously. A good machine hides complex actions or computations, and presents to the human being an abstracted interface which a human can make sense of. Humans work better with ideas than with protocols. It is simpler for a person to understand the idea of “slice a tomato” than to know how to perform the act. So a good machine presents an idea, and takes care of the process behind the scenes.

Intuitiveness

If abstraction is presenting a person with an idea rather than a protocol, then machine intuitiveness is how well that idea fits with the person's expectation for that idea. For example, in sign-language the gesture for "eat" looks like someone using her hand to stuff food into her mouth.

Most people can tell what it means without anyone telling them. That's intuition. My favorite example of intuitiveness in a machine is the volume adjustment on the iPod a continuous motion rather than discrete set of clicks. Most of Apple's products have a very sophisticated level of both abstraction and intuitiveness (as well as sheer beauty) - is it any wonder the world is hooked on them? A big part of our perception of intuitiveness has been taught through influential products like Windows and and recently, the Macbook. Even though pressing Cmd-Shift-A meant nothing to me a year ago, now it is obvious to me it should bring up my box's Applications. I think a comprehensive understanding of intuitiveness combines both knowledge of recently influential products, as well as a fundamental understanding of human behavior.

The point is

I never took a programming class dedicated to problem-solving with abstraction. This surprises me, because the more I get into professional programming, the more I see how big a part abstraction plays in modern software engineering. Most programmers use their abstraction skills on a weekly if not daily basis. Most programmers couldn't tell you the last time they designed an algorithm. And abstraction isn't learned easily. Unless you're a natural genius, you learn abstraction by copying others, failing, and fixing. It would be useful to have a process for abstraction, some quantitative criteria by which you can measure its success.
Managing intuition, on the other hand, takes true talent. Yes, we could get feedback on the intuitiveness of our products through experimentation in the field, and iterate from there. But even to decide where to go based on feedback requires a qualitative analysis done by someone who lives and breathes intuitiveness.

Although hard, the well-abstracted and intuitive product is a winner. And it will be remembered and loved because of the experience it provided.