Blog  |   Puzzles  |   Books  |   About

On making software with heart

In a software design meeting the other day, I found myself saying “it needs to be a little less here” (tapping myself on the forehead) “and a little more here” (tapping myself on the heart).

As a pointy-eared technical guy, I’ve long been resistant to this type of language, knowing it to be logically meaningless. After all, the heart is merely a muscle that pumps blood, right? But the heart is also a potent symbol, and I hope my meaning was clear to the programmers in the room: the software under discussion was intelligent, but lacking in emotional appeal.

Increasingly, I find that one of the things that separates software that I love from software that is merely adequate is the presence of heart; and this is something that programming books (and the programmers who write them) tend to give short shrift. We programmers will discuss speed, efficiency, maintainability, and robustness till the cows come home, but very rarely will we admit that our software needs to be more likable. We are an army of tin men, hacking away at the thicket, with increasingly powerful hatchets, and hollow chests.

What gives software more heart? What makes a user have a more meaningful and fulfilling relationship with a collection of ones and zeros? A few things that come to mind are personal relevance, simplicity, directness, judicious randomness, pictures and sounds and above all, a little silliness.

Personal Relevance

Probably the most direct way to make software pull at the heart strings is to fill it with people that are at the center the person’s life. Social apps, such as those that use Facebook connect or the Flickr API, are a good example. Simply looking at a row of faces that are familiar to me can have a strong impact, and even more so if the software finds ways to deepen my relationships with other people.

It is clear that a lot of people are aware of this simple trick, and we are now seeing a plethora of companies that seek to add personal relevance to their brands by using Facebook Connect and similar measures. Unfortunately, not all those brands necessarily make sense in a social context, and inappropriate and ungainly attempts to add social features may actually distance users (why does Levis want to connect me to my friends?), rather than endear them.


To put it plainly, a simple elegant interface has more emotional appeal than an inelegant clunky one. It is hard to love a clunky interface (although I suppose pity can inspire love). More often than not, clunky interfaces make us angry and frustrated.

Most good programmers are well aware of this counter-intuitive fact: Simple interfaces are harder to make. When a program seems busy and complicated, it probably took far less time to make than the competing program which accomplishes the same things with fewer moving parts.

Programmers with heart work extra hard to insure that their software is as simple and direct as possible. Their interfaces become nearly invisible, and the user is absorbed in the experience, rather than the tool.

Feature creep can make software needlessly complex and ungainly. Some programmers are turned on by complexity, and add needless
customization features, thinking it makes the software more powerful and desirable. The effect, more often than not, is a kind of unloveliness.


Software that directly communicates what I desire to know and doesn’t hide behind a layer of abstraction tends to have a more direct emotional appeal. The idea here is to reduce the involvement of higher reasoning and logic, so that the lower parts of the brain are more directly involved in the user experience.

For most of us, to directly manipulate objects with our fingers, using a tablet, is more satisfying and simple than to issue text commands to manipulate those objects on a command line. Now, being a geek, I actually love the command line – but it’s not as counter-intuitive as it seems — I’ve gained a degree of facility with the command line that makes it a more direct means of getting things done.

Judicious Randomness

Never avoid the opportunity to use a random number generator somewhere in a program! I say judicious, because, obviously, you don’t want to employ randomness in computing income taxes or rocket trajectories, but there is always an opportunity to use a little randomness as a means of adding surprise and delight.

For years, I have considered the need for randomness to be one of the most direct predictors of how much I will enjoy working on a software project. When a program requires randomness, it is less likely to be serious and useful, and I am more likely to enjoy it.

One of my favorite examples of Judicious Randomness is the Google logo, which surprises me, every few days, by appearing completely different. The Google corporation has engendered a huge amount of good will from that randomized logo.

Pictures and Sounds

Although they can be horribly misused, in general, pictures and sounds can make software more emotionally appealing, because they more fully involve the brain than text alone, and help to make the experience more direct.

Well chosen icons, photographs, and subtle audio feedback can greatly improve the emotional impact of software. Example: I once traded up for a nicer cell phone. My wife got jealous, not because of the greater utility of the phone, but because it made more pleasing bell-like sounds when the keys were tapped!

A Little Silliness

For me, injecting small amounts of playfulness is an important part of software design. Sadly, it is something that is often scrupulously avoided by serious-minded programmers, who, seeking to make their wares appear professional and useful, carefully drain them of all possible fun. I don’t care how serious the intent of a piece of software is – nobody deserves to live a life devoid of humor. Even accountants and morticians deserve a laugh or two – probably more than most!

I’m not suggesting that everything needs to be hugely silly. But there is a huge difference between a little playfulness, and zero playfulness. When there is zero, I can’t tell that the software has a beating heart behind it. It is software made by mindless, joyless drones.

Back in the 90s, I worked on an avatar chat client, and added a feature that removed all the “props” or additions to the base avatar. I labelled the button “Naked,” and I still believe that little button label was one of my best ideas.

So there you have it – some random musings on software with heart. Got any examples of your own?

6 Responses to “On making software with heart”

  1. Nick Says:

    Any quote from the Hitchhiker’s Guide like “Share and Enjoy”.

  2. JoeAvg Says:

    Gmail chat:
    “And … we’re back!” when it resumes after temporary disconnection.

  3. Wendy Says:

    My kids love mazes. Stumbled across KrazyDad and all the free mazes. All we can say is this site should be called KoolDad because anyone who posts this many awesome mazes must be Kool!!!

  4. gurdonark Says:

    I make music with software synthesizers and similar devices. I think every designer of such devices might benefit from this weblog post–or from seeing how often I pick an attractive GUI and simple, easy-to-use controls over the most dense, feature-laden device–every time.

  5. suresh Says:

    What a wonderful post. I totally share your views.

  6. Joely Says:

    Jim, great to connect with you again. Who knew we were so attuned…
    I specialize in helping companies make emotional connections with customers in the design phase of product and service development. Your post is right on! And a delight. Your examples are great!