The Design of Everyday Things

Donald A. Norman

Mentioned 22

Reveals a current trend in smart design that can enable companies to move to or remain on the leading edge of the competitive frontier, offering a primer on how and why various products succeed or fail to satisfy consumers. Originally published as The Psychology of Everyday Things. Reprint. 25,000 first printing.

More on

Mentioned in questions and answers.

This is a poll asking the Stackoverflow community what non-programming books they would recommend to fellow programmers.

Please read the following before posting:

  • Please post only ONE BOOK PER ANSWER.

  • Please search for your recommendation on this page before posting (there are over NINE PAGES so it is advisable to check them all). Many books have already been suggested and we want to avoid duplicates. If you find your recommendation is already present, vote it up or add some commentary.

  • Please elaborate on why you think a given book is worth reading from a programmer's perspective.

Note: this article is similar and contains other useful suggestions.

How to Win Friends and Influence People

by Dale Carnegie

How to Win Friends and Influence People

Although this was first published in 1936, the advice contained within is still as fresh and appropriate as ever. Don't be put off by the name. This isn't some underhand guide to having your way with unsuspecting victims, but rather common sense advice on how to get on with people, how to nurture relationships and make the most of yourself and your fellow man (and woman).

It is well known that technical folk (including programmers) are often thought of as not being terribly 'people oriented' (whether this is a justified stereotype or not is subject of another discussion) and so this book is an invaluable resource for teaching you the finer points of human interaction.

It's warm, heartfelt, sturdy, straightforward and timelessly written. Highly recommended.

The Goal: A Process of Ongoing Improvement

by Eliyahu M. Goldratt and Jeff Cox

To elaborate: It is a book on how to approach problems. To identify bottlenecks in your system and work on them. So in short, it isn't a programming book, but shows (in novel format) how to problem solve -- and is thus very valuable to a programmer.

[Update Gishu] It's an eyeopener on how the throughput of your entire system depends on the bottlenecks. Optimizing other stages/operations will not produce any results. Although this is ingrained in developers who have had experience optimizing a scenario in their app; however zooming out to a more higher level and applying this can have profound gains. Beck's XP Book has a dedicated chapter on the Theory Of Constraints. Programmers who move onto Leads/PMs will find this a valuable addition to their toolkit.

Surely You're Joking, Mr. Feynman!

alt text

This book will inspire anyone to think and be original.

This might not be a popular one, but

Gravity's Rainbow

by Thomas Pynchon

Gravity's Rainbow

Gravity's Rainbow is my favorite book of all time. I read through the whole thing last summer, and I'm in the process of reading it again. From a writer's point of view, it's pure, beautiful art. However, I recommend it here because it really forces the reader to think and make a lot of mental connections.

Of course, this book has a reputation for being impossible to finish. It's definitely the hardest book I've ever read. Pick it up at your own risk.

Don't Make Me Think by Steve Krug. An essential book about web usability. As Krug says, "Common sense isn't always obvious."

alt text

(Hint: has good usability)

Update: This is now part of the library at work. I've gotten about five people to read it so far. 100% positive reviews, predictably.

Here's a strange one for you all to think about.

On The Road by Jack Kerouac.

It's a modern classic that everybody should read, and I'd be very surprised if English or Media Studies students weren't recommended to read it at some time. Reading should not only be informative and educational, but enjoyable as well. If you're not going to read a book for pure fun now and again then you'll only end up frustrated with the books you need to read as a programmer/developer.

This book is a real eye-opener; a book that'll really make you think about your own life, and for a programmer whom spends their day dealing with pure thought-stuff it's a great way to get you thinking on a different track.

I would heartily recommend Jennifer Government to any software developer. Amazon Wikipedia

It's a very fast paced action story that's excellent to clear your head with. It's a fun book to read (will make you laugh), and the characters are rather tragic (will make you feel more satisfied at work). This is one of those books that is hard to explain the content without fear that people will think you different and odd, but all the same you must tell everyone about (I.e. makes you talk to people).

The Humane Interface by Jef Raskin.

You can see some of the effects of these ideas in Aza Raskin's (Jef's son) Enso project and the Ubiquity Firefox add-on.

Kicking the Sacred Cow

Questioning the Unquestionable and Thinking the Impermissible

by James P. Hogan

alt Kicking the Sacred Cow

Masters of Doom !!

God programmer meet God marketing guy, and no it's not Steve Woz and Steve Jobs, but it's the Johns, Carmack and Romero.

Business, gaming and programming all rolled into one. a definitely page turner all the way until the end.

The Mythical Man-Month

by Fred Brooks

The Mythical Man Month

My personal opinion is, apart from programming, in life we need to find a balance, about everything (or keep striving for it). Many times, I have found myself getting too immersed in one aspect of life (frequently programming/work) at the cost of others. Over the years I have learnt to recognize this and act accordingly.

In work, sometimes I have come across pretty difficult people, making it hard to work with them (not just my opinion, but also of other team members). Previously I used to try hard to convince them, make them more helpful, etc. and get frustrated when I don't succeed.

But this book Tigana, by Guy Gavriel Kay helped me understand that sometimes a person can be inherently complex, hard to work with, without he/she helping it. It is a science fiction novel, and it may not be completely appropriate here, but it helped me work better with my team, so I am linking to it here. It helped me become more objective in dealing with people I work with.


Jeffrey K. Liker - The Toyota Way (Amazon link). A good if at times semi-boring read, but loads of information from the company which invented Lean.

Games People Play by Eric Berne.

alt text

IMHO it is a very useful aid to understand and deal with office politics (among others).

We think we’re relating to other people – but actually we’re all playing games.

Forty years ago, Games People Play revolutionized our understanding of what really goes on during our most basic social interactions. More than five million copies later, Dr. Eric Berne’s classic is as astonishing–and revealing–as it was on the day it was first published. This anniversary edition features a new introduction by Dr. James R. Allen, president of the International Transactional Analysis Association, and Kurt Vonnegut’s brilliant Life magazine review from 1965. We play games all the time–sexual games, marital games, power games with our bosses, and competitive games with our friends. Detailing status contests like “Martini” (I know a better way), to lethal couples combat like “If It Weren’t For You” and “Uproar,” to flirtation favorites like “The Stocking Game” and “Let’s You and Him Fight,” Dr. Berne exposes the secret ploys and unconscious maneuvers that rule our intimate lives. Explosive when it first appeared, Games People Play is now widely recognized as the most original and influential popular psychology book of our time. It’s as powerful and eye-opening as ever.

alt text

As well as the mentioned Gadwell's Tipping Point, Blink is a good choice.

A Brief History of Everything by Ken Wilber.

Front cover

In the ambitiously titled A Brief History of Everything, Wilber continues his search for the primary patterns that manifest in all realms of existence. Like Hegel in the West and Aurobindo in the East, Wilber is a thinker in the grand systematic tradition, an intellectual adventurer concerned with nothing less than the whole course of evolution, life's ultimate trajectory—in a word, everything. . . . Combining spiritual sensitivity with enormous intellectual understanding and a style of elegance and clarity, A Brief History of Everything is a clarion call for seeing the world as a whole, much at odds with the depressing reductionism of trendy Foucault-derivative academic philosophy.

The Fountainhead by Ayn Rand. Atlas Shrugged is already on this list, but the Fountainhead deals more with craftsmanship and integrity, rather than supply-side economic theory. Definitely worth a read for anyone in a creative field.

Could not put this one down, The Evolution of Cooperation by Robert Axelrod. Its a fascinating read and as game theory books go it's pretty accessible.

Snow Crash By Neal Stephenson

alt text

Ender's Game by Orson Scott Card

alt text

The Dirty Dozen

alt text

An analysis of the 12 worst Supreme Court decisions

Great and interesting book about how our liberties are being trodden on by the government. Libertarian viewpoint, but objective.

A Random Walk Down Wall Street

Burton G. Malkiel

Nothing else will teach you better how to get a handle on your money.

Wikipedia article

alt text

Niccolo Machiavelli's The Prince. After wondering why people acted so strangely at work, this book was the first of many, that taught me why.


alt text

How was JPod not posted? It's like a (already posted) Microserfs with internet. It's typical Coupland novel, must read for every techie, geek, webz hipster.

Here are some quotes

"You googled her?" "Of course I did. Didn't you?" I'd somehow forgotten to perform this essential task.

“After a week of intense googling, we’ve started to burn out knowing the answer to everything. God must feel that way all the time. I think people in the year 2020 are going to be nostalgic for the sensation of feeling clueless.”

“It turns out that only twenty percent of human beings have a sense of irony – which means that eighty percent of the world takes everything at face value. I can’t imagine anything worse than that. Okay, maybe I can, but imagine reading the morning newspaper and believing it all to be true on some level.”


Love is the Killer App by Tim Sanders - it's for every professional.

Nothing too programmer-specific, but being in the industry that we are, it helps immensly to have a positive mindset depicted in this book.

alt text

Note: I had to move this book from my previous answer to here, to comply with the question's specific rule that one post -> one answer

This is probably not going to be popular, but "If liberty means anything at all it means the right to tell people what they do not want to hear."

In the Beginning was the Command Line

by Neal Stephenson

It's very dated, but I have yet to find a single book (or essay for that matter) that gives a quasi-outsider's view of an industry that the public is apathetic to understand. The insights and descriptions are spot-on, even though the conditions have dramaticly changed over time.

In the Beginning was the Command Line

The Inmates Are Running the Asylum

by Alan Cooper

alt text

It's about using the right language to talk about projects - using stories (and personas) instead of 'features' to talk about stuff that needs to be realized. Also a lot of emphasis on interaction design and related activities. Delivering what is needed instead of what is asked for.

Beyond Code by Rajesh Setty

alt text

Also read these free manifestos

  1. 25 Ways to Distinguish Yourself
  2. Making the Most of Your Time: Going Beyond To-Do Lists

(Note: moved the other book to a separate answer)

Awaken the Giant Within by Anthony Robbins.

alt text

The Black Swan: The Impact of the Highly Improbable

alt text

This book as about why stock markets are not predictable like casinos and the lottary. It is very readable though querky. It will help you to understand when statistical techneques do not work, why math is not understanding, why project managers can't predict schedules and how they can with less effort.

The book does not go into heavy math but will give you a feal for when the math can and more ofter can not be used.

Author: Nassim Nicholas Taleb. Also wrote 'Fooled By Randomness'

Read it if you work with mathematics, statistics or finance - Or if you have a pension.

Simon Singh's Fermat's Last Enigma is one of the greatest books I have ever read.

This non-programming book has taught me a lot about running after the solution of a problem, no matter how old and complex it is.

alt text

I recommend

The Emperor's New Mind

by Roger Penrose

Somehow in the line of Godel, Escher, Bach but, I think, easier to read.

First Things First - another equal great book from Stephen R. Covey.

alt text

Dealing with people you can't stand:

Dealing with People You Can't Stand: How to Bring Out the Best in People at Their Worst (Paperback) ~ Dr. Rick Brinkman (Author), Dr. Rick Kirschner (Author), Dr. Rick Kirschner (Author), Dr. Rick Brinkman (Author)

Sensation & Perception by E. Bruce Goldstein will really pull a lot of software engineers out of their comfort zones. I found it to be fascinating when I started thinking about effective scientific visualization techniques with the user's physiology and psychology in mind. Issues with the user's potential for color blindness, visual acuity, attention span and information processing abilities are just some of the reasons why I keep going back to this book.

If you're a Python developer, you will not get around viewing Monty Python stuff. But to quickly look up a quote you find in any Python doc, I really recommend those:

alt text

(as well as part two, they're great; Amazon) and

alt text


Reading doesn't give you the great look of a puzzled Michael Palin or the anger of a furious John Cleese, but it still is a worthwhile lecture.


The Soul Of A New Machine

by Tracy Kidder

"The Ultimate History of Video Games" of course!

Why? Because in one book you get history, fun, anecdotes, business decisions, project management, opinions, wonderful quotes, the hardware and the software ... all in all portraying an industry that went through numerous cycles, ups and downs, deaths and reincarnations. But most of all: Steven Kent managed to make this book a very entertaining read, you'll be captivated by each chapter.

alt text


This is similar to another question. Here is a link to my answer over there.

Now, Discover Your Strengths is my favorite personal/career development book. It teaches the most successful people become successful by focusing on building on their strengths, rather than covering up weaknesses. This book helps you find out where your strengths lie.

Waltzing With Bears

by Tom DeMarco and Timothy Lister

Waltzing With Bears

Great background on what managing risk means and lots of good tools for quantifying risks. They discuss a risk estimation tool which uses statistics to produce a pragmatic and reality-based understanding of the effects that risks will have on a given projects completion date and confidence level.

The prologue on "The Ethics of Belief" is not to be missed.

The Effective Executive

Concise, bare essential and time-less!

alt text

The First Quarter : A 25-year History of Video Games. Unabashed old-school video game geekery.

alt text

One hundred years of solitude

by Gabriel Garcia Marquez

Hackers: Heroes of the Computer Revolution

by Steven Levy

Does a great job of outlining some of the eras in computing, from the enviroment that sprung up around the Tech Model Railroad Club at MIT, to the Homebrew Computing in the bay area, to the story of the game companies of the early 80s. Especially the MIT section has wonderful descriptions of hackers at work, doing what they do best (in a wholly non-technical writing style), bumming instructions, making the machine do their bidding, and in the mid-seventies, it describes the self-made community of hardware hackers (including Wozniak), who built their own computers. Hugely entertaining, and a good way to understand where some of these communities originate from (academics, hackers, tinkeres).

Cover for Hackers: Heroes of the Computer Revolution

The Fifth Discipline:.

Several important things: System thinking, System Archetypes, etc.

alt text

alt text

If you don't want your job to be outsourced (as have happened to many programmers) then you need to read this book, A Whole New Mind - Why Right-Brianers Will Rule The Future, actualize it, and put it into practice yesterday!

I would recommend: "Code" by Charles Petzold.

It completely opened my eyes on how computers actually work, explained and illustrated clearly. I learned that computers have no inherent understanding of numbers, letters, words or anything like that. These were human concepts and it was up to the computer programmer (at a very low level) to present they patterns of bits from computer memory to something users would find meaningful.

Despite its title, "Code" has nothing to do with coding, but explains how computers work at the electrical level.

Peopleware: Productive Projects and Teams

by Tom DeMarco and Timothy Lister

alt text

This classic book encourages us to think about the people instead of the process. It's full of practical advice on team building, productivity and office environments. It's a must read, not just for managers, but anyone related to software development.

Get two copies, one for you and one for your manager.

Zen and the Art of Motorcycle Maintenance

by Robert M. Pirsig

alt text

This book is many things, but you could say it's sort of a philosophical take on what it means to "grok" something.

Commentry from Garth Gilmore:

I credit this book with teaching me more about software development than any programming book I ever read.

The central thread in the book is how our romantic (artistic) and classical (technical/rational) perceptions of the world are both derived from how we perceive quality in the environment around us. This understanding is then applied to apparently mundane tasks like motorcycle maintenance.

To give some examples of how this applies to coding:

  • The section on how to approach the motorcycle with a 'quality mindset' that leads to progress is just as applicable to reaching 'the zone' in programming.
  • The section on 'gumption traps' that prevent progress and lead to you damaging the machine is priceless. The solutions that are presented work just as well when trying to modify legacy code without introducing bugs.
  • The section on how a purely classical description of an engine part is useless (because it lacks any place for the user to stand) should be read by anyone involved in requirements analysis.

Long story short its a good read :-)

Simon Singh's The Code Book is a great book about how cryptography was born and how people is always trying to challenge it.

alt text

The Hitchhiker's Guide to the Galaxy

by Douglas Adams

alt text

Life, the universe, and everything

"See first, think later, then test. But always see first. Otherwise you will only see what you were expecting. Most scientists forget that." -- Wonko the Sane

Never Eat Alone: And Other Secrets to Success, One Relationship at a Time

by Keith Ferrazzi


Comments from duplicate answer by Flory:
I did not think that I would like it before I got the book but I really enjoyed it. It is basically about how to build a relationships. Prior to reading it I expected it to be very trite and about how to use people for your own ends. Instead it was the opposite in how to be used to everyone's ends. Very interesting.

What is the name of this book?, by Raymond Smullyan. It is a wonderful book of puzzles about the intricacies of logic.

Hyperspace: A Scientific Odyssey Through Parallel Universes, Time Warps, and the 10th Dimension

by Michio Kaku

alt text

There's a lot of space out there to get lost in.
-- John Robinson, Lost in Space


by Neal Stephenson

Cryptonomicon by Neal Stephenson

This book follows parallel stories of a World War II code breaker and his present day descendant, and deals a lot with the development of computers (Alan Turing is actually a character in the book). A geek's must-read!

Stranger in a strange land because every programmer should grok the word "GROK".

Lessons Learned in Software Testing by Kaner, Bach, and Pettigrew. Brilliant book, easy to read.

The Thermodynamics of Pizza by Harold Morowitz.

This could have all kinds of morals, depending on how you take it. 1. You can use science to improve EVERYTHING! :-) 2. Make sure you choose the right level of abstraction when designing and coding. 3. You can really improve your life if you just take a few minutes to think about it.


Getting Things Done

by David Allen.

alt text

The Moon Is A Harsh Mistress

Amazon - Wikipedia

The Moon Is A Harsh Mistress

Written in 1966 this classic science fiction novel takes place on the penal colony Luna (the moon). The story is told by the only programmer/computer repairman on Luna, Manuel. Manuel has a secret. The master computer (Mike) that controls all of Luna has become a sentient AI and happens to have Manuel as its only friend. Mike is rough around the edges at first, its speech is fuzzy and it plays childish but dangerous jokes with its god-like abilities. As time wears on Mikes abilities fully develop into a mature being. With Manuel's guidance they will go on an adventure together that spurs the revolution of freeing Luna from Earth!

This novel is the first Robert A. Heinlein novels I have read but will certainly not be the last. The fact that this book was written in 1966 still astonishes me! It has barely any dated parts and could easily pass for a contemporary novel. It wont he Hugo award for best novel.

Truly one of the better "programmer" style novels I have read. Great adventure the whole way through. If anyone has a suggestion as to which Heinlein novel I read next, please leave a comment!

Written in 1950, Dianetics: The Evolution of a Science describes the optimum computer as an introduction to a science of the mind.

Nineteen Eighty Four

by George Orwell


The Curious Incident of the Dog in the Night-Time

by Mark Haddon

alt text

It will give you some perspective of your odd co-workers.


This is an amazing book that details some very counter-intuitive conclusions about the LACK of THINKING actually predominates our decision process.

Player Piano by Kurt Vonnegut

Beyond Fear by Bruce Schneier.
Beyond Fear Book

From Amazon: "Schneier provides an interesting view of the notion of security, outlining a simple five-step process that can be applied to deliver effective and sensible security decisions. These steps are addressed in detail throughout the book, and applied to various scenarios to show how simple, yet effective they can be....Overall, this book is an entertaining read, written in layman's terms, with a diverse range of examples and anecdotes that reinforce the notion of security as a process".

Or just consider it a straight read on understanding what security means - whether for computers or in real life. It can give you the tools to handle the ginormous amounts of FUD we encounter every day.... And it's entertaining, besides. (Even got my father to read it, and he's enjoying it...)

Universal Principles of Design, by William Lidwell, Kritina Holden, and Jill Butler

Universal Principles of Design

One of this biggest issues I have with many programs I have used is the lack of design put into the interface and into the product. This book goes in-depth describing how to enhance the usablilty within a interface. It also tells you all of the basic principals and rules of design, and they give many examples for many different applications whether its techinical or non-technical. The book reads a little like a college classroom book (and it probably is for many design schools), so it the not the most exciting thing to read, but I find the most informative when it comes to interface design.

The Tao of Physics by Fritjof Capra

One notable premise contained within this book reminds me of the saying "If you go far enough away, then you're on your way back home". For example, the Eastern and Western approaches to philosophy and science were so diametrically opposed for centuries but perhaps they're coming around the other side towards similar conclusions these days?

It may be 30 or so years old, but it's still very much worth the read.

alt text

My second choice would be to read Neuromancer by William Gibson (or watch The Matrix which is along the same lines I guess).

I can't believe I didn't see this already listed:


by Frank Herbert

Dune Cover

Dune is the pinnacle of Sci-Fi novels!

I've been really enjoying haiku recently. To that end, I'd very strongly recommend The Haiku Handbook: How to Write, Share, and Teach Haiku by William J. Higinson.

Book Cover

I recommend reading/writing haiku as a way to relax.

The Tipping Point is one of the best books that I have ever read.

Eats, Shoots & Leaves: The Zero Tolerance Approach to Punctuation

by Lynne Truss

Becoming a better communicator in people language, I believe, makes you a better communicator in code. Punctuation is a very good place to start improving your writing.

The Game

Every programmer should read this book to learn how to pick up women.

The game

Fortune's Formula

alt text

Information theory, betting, value of information, etc.

Fantastic read.

Flow: The Psychology of Optimal Experience

by Mihaly Csikszentmihalyi

alt text

The best and most productive coding is done in a flow state. This is a psychological study of the phenomemon. Although the book is scientifically rigorous it remains accessible to the lay-person.

21st Century Jet: The Making of the Boeing 777, by Karl Sabbagh

From coffee cup holder to three-hundred-foot wing, this book is the story of how a group of people came to build a brand new aeroplane.

The book describes the development of the Boeing 777, from initial concept, through requirements gathering, design, development, testing, production, and delivery. The engineers and management implemented a new development system, overcame changing requirements, met strict safety requirements, and continually optimized the solution. It describes how the designers and engineers worked to make the aircraft easier, safer, and more intuitive for everyone who would come in contact with it (air crew, maintenence crews, and passengers).

Software developers can learn a lot from this book. It's very well written, it reads like a novel. I've read it twice and highly recommend it.

Boeing Computer Services president John Warner said, the Boeing 777 is "three million parts flying in close formation." Sounds like software to me.

Charles Perrow's "Normal Accidents" investigates what can happen when complex technology goes horribly wrong, and formulates his theory of the "normal accident": complex, tightly coupled systems will have accidents, because minor faults interact with catastrophic consequences. We see this all the time in programming and systems administration, and yet, as far as I know, few of these concepts are understood outside safety engineering.

(He also writes very well, and brings life to what could have been a rather dry book).

alt text

Joel Spolsky's "Best Software Writing I"

Women, Fire, and Dangerous Things

by George Lakoff

alt text

It's a book about how people categorize things, and about reasoning in general. It's long and extremely boring for some people, but it is still great.

If you live on the Unix side of the world, The Art of UNIX Programming by Eric Raymond (see also here). Despite its title, it is not a programming book, and it contains very few lines of code indeed. It's the best book I know about the Unix philosophy.

I found Zero: The Biography of a Dangerous Idea to be pretty decent. He has a followup to this called Decoding the Universe: How the New Science of Information Is Explaining Everything in the Cosmos, from Our Brains to Black Holes which I have but haven't read yet so I can't comment on how it is.

alt text

Secret Rendezvous by Kobo Abe. Abe's the frickin' man, man.

But seriously, if you like Murakami, you owe it to yourself to check out Abe.

Happiness is a Choice by Barry Neil Kaufman

It's a great book that can help you understand you can choose how to feel. Turns out you can be responsible for a lot more of your emotions than you think.

Another one from a different angle from prior posts: Gödel, Escher, Bach: an Eternal Golden Braid, by Douglas Hofstadter.

alt text

The Four Steps to Epiphany

I can not believe this book has never been mentioned!! It is one of the best book about product management I have read in years. If you are working for a startup, it is a must read.

alt text

The Milkshake Moment: Overcoming Stupid Systems, Pointless Policies and Muddled Management to Realize Real Growth by Steven Little

The Milkshake Moment

The Right Stuff by Tom Wolfe


Walter Murch's "In the Blink of an Eye"

Speed Reading, by Robert L. Zorn:

alt text

Or any other Speed Reading text. Learning my own quirks about how I read has helped me to be conscious of other aspects of how I think. Having the ability to control my reading speed has proven to be invaluable. I still choose to read books for pleasure at my previous reading speed with all its flaws.

The Illuminatus! Trilogy by Robert Shea and Robert Anton Wilson. In many ways, this book changed the way I do my thinking. Not sure whether it is good or bad to completely distrust anything and everything, but at least it keeps ones mind critical instead of automatically accepting something as truth without questioning.

The book also introduced me to the concepts of discordianism, which I find having quite a few interesting points.

Outliers: The Story of Success by Malcolm Gladwell

I just bought it on Audible last week and I can't stop listening to it. It goes through the factors of successful people (ex: Bill Gates, Bill Joy, The Beatles). Fascinating!

Enigma: The Battle for the Code

by Hugh Sebag-Montefiore

alt text

Having a bad week at work? Well at least when you can't figure out some algorithm people aren't dying in their hundreds in the freezing North Atlantic waiting on you to work it out.

As well as being a great read about the dawn of the modern computing age, this book can help with perspective.

Dreaming in Code

by Scott Rosenberg (Amazon Wikipedia)

Cover image

A great book about the development process. It also highlights how developers are doomed to keep repeating the same mistakes over and over again

Juggling for the Complete Klutz

Juggling is mandatory. All programmers must juggle. Sorry, it's a rule.

Rick Cook - The Wiz Biz

alt text

This is a compilation of the first two novels in a series, called 'Wizard's Bane' and 'Wizardry Compiled', respectively.

It all began when the wizards of the White League were under attack by their opponents of the Black League and one of their most powerful members cast a spell to bring forth a mighty wizard to aid their cause. What the spell delivers master hacker Walter "Wiz" Zumwalt. With the wizard who cast the spell dead, nobody can figure out what the shanghaied computer nerd is good for--because spells are not like computer programs.

Lots of in jokes for the Unix/Linux crowd to enjoy. Pretty much anybody in the software industry will enjoy it, I think.

I'm not a usability specialist, and I really don't care to be one.

I just want a small set of rules of thumb that I can follow while coding my User Interfaces so that my product has decent usability.

At first I thought that this question would be easy to answer "Use your common sense", but if it's so common among us developers we wouldn't, as a group, have a reputation for our horrible interfaces.

Any Suggestions?

Read Don't Make Me Think by Steve Krug. It is a great starting point, and an easy short read.

EDIT: This is mainly for web usability though, but it would still be a good read even if you are doing rich clients.

  • Don't make things work in a different way than your users are expecting (i.e. breaking the "back" button when using Ajax in web forms
  • Follow the K.I.S.S principal

Really, any rules someone posts will be a variation on the theme: Don't Make Your Users Think

"Don't Make Me Think" has already been posted, see also Design of Everyday Things and Designing with Web Standards which are also great for light usability reading.

I suggest to read these blog posts from the Enso creators.

Of course they repeat guides/ideas/advices from books such as
The Design of Everyday Things and About Face, but nevertheless, the posts contain quite a few insights and (IMO) they are a good read.

I'm going to make my monthly trip to the bookstore soon and I'm kind of interested in learning some user interface and/or design stuff - mostly web related, what are some good books I should look at? One that I've seen come up frequently in the past is Don't Make Me Think, which looks promising.

I'm aware of the fact that programmers often don't make great designers, and as such this is more of a potential hobby thing than a move to be a professional designer.

I'm also looking for any good web resources on this topic. I subscribed to Jakob Nielsen's Alertbox newsletter, for instance, although it seems to come only once a month or so.


Somewhat related questions: User Interface Design

This is not directly related to GUI design or programming, but The Psychology of Everyday Things is a good book to read.

It is a general look at how things are designed and how they fail. The concepts in this book, although not directly applicable to GUI's, do apply. In fact you could say they apply to all instances of user centered design.

The design of everyday things ? An "old" classic, but useful if you plan anything that requires human interaction.

Although completely independent of web and programming, The Design of Everyday Things by Donald Norman taught me a lot!

For a less in-depth, more cook-book approach (if you don't want to think), try Robin Williams' The Non-Designer's Design Book: Design and Typographic Principles for the Visual Novice.

Presonally I much prefer The Design of Everyday Things.

"Don't Make Me Think" is great. After sitting in on several usability studies I can safely say that several of his biggest points are the kinds of things drilled in your head over and over.

Joel Spolsky's book on user interfaces is also decent.

I have a pretty good knowledge of programming languages like C/C++, Java, Python. But they were all mostly learnt in a college / high school class room setting where the best user interface was a numbered menu. You know, the standard data structures, implementation of various algorithms, file handling and the like.

What I want to do now is to get into GUI programming. I am not sure if I am asking the right way, but I am looking at using the WIMP paradigm (windows icons menus pointers). I want to place buttons and forms. Event driven programming, I believe is the right word, where my application waits till the user clicks something, types something etc.

Given my background, where would be a good place to start? I am looking at the following requirements -

1> Preferably cross platform. 2> Lots of documentations, tutorials, and if possible sample code that I can learn off of 3> A good GUI builder tool, where I can drag / drop stuff the way I want them to be displayed.

Any ideas or suggestions to get me started?

I'l try the book About face: Essential of User Interface Design, its centered on design practices for UI as well as designing taking into account the user goals, that is, what the user wants to acomplish trying to get you away for the "developer GUI design".

It also reviews some history about GUI design from Microsoft, Apple and other companys. Things like defaults for MacOsX (where the accept and cancel buttons are usually located, etc) as well and the whys beneath that.

I'll also look up the Office 2007 UI Design Guidelines for Microsoft as it's probably "gonna be a thing".

There is a great deal of language and UI framework specific resources available for people interested in building application UIs. However, before delving into specific technologies, there is much to be learned about Human-Computer Interaction and how it applies to user interface design. Some references to look at:

After researching what makes a good UI, it is time to explore how:

Of course there are many options out there, including QT, Fltk and SWT

One of the window dialog of a software I'm working on looks a bit like this : (original screen-shot copied from this coding horror post, other examples available on this SO question)

alt text

The thing is that none of the options can be removed (those who can have already been), and that they must all be visible at a glance (i.e. no tabs allowed) Edit : I've added a comment explaining why tabs are not an option in my specific project.

I've tried to use colors, to add icons, but it just added to the overall feeling that someone had just dropped controls randomly using Visual Studio Form designer during a summer internship.

How can I make this dialog more user-friendly less horrifying without deleting features ?

Edit : The GUI example I took has a lot of obvious design flaws (see those answers 1 2), but even after fixing those (which I've done on the software I'm working on), the dialog still looks pretty ugly.

Below is another example (credit). Controls are (almost) lined up correctly, appropriate controls are used, etc, but the overall result still looks terrible :

alt text

The thing is that none of the options can be removed (those who can have already been), and that they must all be visible at a glance (i.e. no tabs allowed)

Sigh. I would argue that, because everything is visible at a glance, they practically become invisible in a sea of controls.

That being said, the ff (yes another list) are my suggestions:

  • To reduce clutter, make the overall form bigger, and all controls more widely spaced apart in all directions
  • Standardize the height of the controls, e.g., textboxes must all have same height, buttons all have same height, etc
  • Align labels with text boxes more consistently
  • Make the layout flow down instead: 1 column, with each group having the same width as all other groups
  • Set all group box names in bold to make them stand out
  • Put all those "wGetStart.bat" commands in a group of its own

If you really want to learn more about making it "flow", with or without getting rid of all this "visible" information, you might wanna get a copy of Steve Krug's Don't Make Me Think:

Steve Krug Don't Make Me Think

I'm current a computer science student with a minor in psychology. I have the programming down when it comes to software design, but not so much the design of UI. What are some good books/websites/blogs for learning design principles for user interfaces and/or websites?

The consummate book on UI design is Don't Make Me Think. Additionally, The Design of Everyday Things is enlightening though it is not specifically about UI design.

That said, my experience with UI design has been primarily focused on web applications. I have found the work by Dan Cederholm to be the most enlightening in designing excellent user interfaces for the web. One of the most important aspects of web design is ensuring semantically correct accessible sites and Cederholm does an excellent job describing how to do that in Web Standards Solutions which was followed by the also excellent Bulletproof Web Design.

Though the CSS Zen Garden may not be explicitly about UI design it is an outstanding example of what can be accomplished visually through CSS-based design.

Finally, an often overlooked part of UI design is delivering effective error messages. While, Defensive Design for the Web emphasizes web error design much of what is described is applicable to other mediums. Those responsible for the book 37Signals maintain an excellent blog Signal vs. Noise.

Designing Interfaces by Jenifer Tidwell is a good one.

A must read: Don't Make Me Think

I need some employee/co-worker Christmas gift ideas. Do you have any good cubicle toys that help you to do any of:

  1. think about programming problems
  2. solve programming problems by representing common abstractions
  3. can be directly programmed
  4. can interface with a PC based IDE to be programmed.
  5. it may present problems that can be solved, to kick start problem solving.

Disallowed items are:

  1. reference material in book, pamphlet, poster or cheat-sheet form, even if it has kick ass pop-cultural references.
  2. edibles. [discuss separately]
  3. things that need their own lab-space and/or extensive tools to be worked with.

So yes, Lego Mindstorms come to mind, but they aren't cubicle toys because they cost more than cubicle toys would, and they have too many losable parts.

comments on the answers so far: The 20 Questions game sounds quite neat as it could get you thinking; The bean balls could be used as tokens in a problem, so I can see that working. The magnetic toys like ball of whacks or the ball-and-stick ones present hands on fun of a structural nature... now can there be a similar hands on fun toy that aids in representing a solution to a problem? The Gui Mags clearly could, but they're quite utility oriented. The AVR Butterfly is less of a toy but definitely priced attractively, cheaper and more responsive than a basic stamp.

I'm not going to pick an answer; there's several great suggestions here. Thank you.

Taking your question's requirements more literally, I suggest something like the Atmel AVR Butterfly, which is a battery-operated single-board computer. The really nice thing about this board is that it has an LCD display, buzzer, light sensor, temperature sensor, and some other nice doodads that make it useful right out of the box.

It's programmable in C, but in this case, that's a plus. I find doing even simple embedded development in C forces me to think more about breaking a problem down to its essence, and think about what's actually happening in the processor when I issue my high-level commands.

If this is too expensive, there are a lot of geeky funny books out there, like:

For something more serious and software related, Donald A. Norman has an excellent series of books on why things are designed the way they are, what are the right things to think about when designing something, and a bit about HCI and usability. A great example is "The Invisible Computer: Why Good Products Can Fail, the Personal Computer Is So Complex, and Information Appliances Are the Solution" or "The Design of Everyday Things"

What are your best usability testing tips? I need quick & cheap.

You have to watch people use your application. If you work in a reasonable sized company, do some 'hallway testing'. Pull someone who is walking past your door into the room and say something like, 'Could you please run the payroll on this system for the next month? It should only take two minutes'.

Hopefully they won't have any problems and it shouldn't be too much of an imposition on the people walking past. Fix up any hiccups or smooth over any processes that are unnecessarily complex and repeat. A lot.

Also, make sure you know what usability is and how to achieve it. If you haven't already, check out The Design of Everyday Things.

I'm looking to find any articles/books on usability. I'd like to get a handle on best practices when designing a UI, this can be anything from which user controls are more intuitive to a new user, to how to phrase text that is displayed to the user to avoid confusing dialogs. I mainly do Windows desktop applications, but most usability standards, I assume, would stand true regardless of the platform.

As an example, here's an MSDN article about the Windows User Experience Guidelines:

The Design of Everyday Things by Donald A. Norman is a standard book on general usability considerations that can be applied to just about everything in day-to-day life. It's not specifically about software, but it's worth it to read it.

Universal Principles of Design is a recommended textbook for my university's Engineering Methods of Software Usability course. Myself, and others who have taken this course, have found this book to be more useful than the required textbook. There appears to be an updated version, called Universal Principles of Design, Revised and Updated: 125 Ways to Enhance Usability, Influence Perception, Increase Appeal, Make Better Design Decisions, and Teach through Design, but I can't speak about that one.

Designing Visual Interfaces by Mullet and Sano provides a great foundation for different layout-related issues. Not a book on usability per se but still relevant, I'd say.

As for web resources, try:

For book inspiration, see Suggested Readings in Human-Computer Interaction (HCI), User Interface (UI) Development, & Human Factors (HF) (and all the great answers in this thread).

Well, a long-standing favorite specifically for user interface design is Alan Cooper's About Face. It should touch most important topics when designing Windows desktop applications.

Then there are also various UX patterns which are well-presented in Quince (needs Silverlight).

Jef Raskin's The Humane Interface is also rather good, but very radical in his ideas. Still, this book points out many fallacies in modern UI design. If you need to stick to the WIMP world, then following his suggestions might be a little hard as he tends to suggest to overthrow everything we're used to. But well-written and good for provoking thoughts, even if you don't follow all his advice.

As for books/articles on usability in general or on slightly different topics:

  • Jakob Nielsen's website While not particularly fancy-designed it is a trove of thoughts and advice on usability in general.
  • Steve Krug's Don't Make Me Think. Web usability, but also a very good read.
  • Donald Norman's The Design of Everyday Things. Usability in general and has many pointers on how to think about usability without going into specific technologies. It's applicable to desktop application usability anyway, though.

Try reading this book: Don't Make Me Think. While it's focused on web usability it is applicable to all facets of UI design.

To start with some context, I'm so annoyed whenever I get on a Windows computer that has the settings adjusted for "best appearance" over "best performance" that I instinctively turn off all fades, transitions, animations, etc. immediately. I almost can't focus until it's changed.

However, when it comes to my web apps, I will very occasionally throw in some "eye candy" - maybe a slight transition because the instant transition seems distracting or too abrupt.

I feel like a hypocrite though. I never opt for a slower UI on a desktop machine, and when I change desktop settings for family, friends, and clients, no one EVER asks to switch back to the old, slower way.

So am I biased or are there some legitimate rules of thumb for when it is actually appropriate?

In my current dilemma, I'm using a Javascript paginator with a fade in to show the next page's worth of content over 0.75 sec because if I do not do it, the change causes a tiny flicker (distracting to me), but maybe if I was in the user chair, I would be screaming, "just show me the page already!"

Thoughts? Anyone read any good books on this stuff?

Edit: I should mention that in my current example, the next page is almost always ready to be displayed instantly if I so desired. I prefetch the next page while the user is on the current page. That's one aspect of what makes something like this "eye candy" to me. I could do it faster with almost no difference to the user.

2nd Edit: Thanks for all the suggestions and considerations. There are several books that I'm looking forward to reading. I marked the ui-patterns website as the answer because it will be the most immediately useful for this type of problem. Also no one mentioned the YUI design pattern library, but I came across it later. It's an excellent resource and even addresses this issue. Also, I definitely intend to seek user input when I'm at that stage for this particular example.

Lastly, I understand that my initial reasoning about it didn't take into account my familiarity with windows vs my app. Since I'm so used to the Windows desktop, I now just want to get things done. Maybe way back when I first used xp, those transitions where helpful for a day or two. (I don't remember that being the case but maybe.) Probably the same will be true for my transitions in my web app if it's used often enough. Soon I (and my users) will be tired of any eye candy that I add even if it is very brief. I'll see and ask.

Thanks, everyone!

There is no easy answer The Design of Everyday Things is a good place to start looking into simplistic design. Sites like SO that have a "clean" look with a little extra flash (figurative not the adobe kind) seem to fair the best.

Exactly not MSDN is a good place to start...

Update - As pointed out by John in the comments the low bandwidth view of MSDN is actually pretty nice. Good call John Weldon I had never looked at it before (and likely never would have). Thanks!

After checking out some of the other books mentioned here on amazon, I also came across "Don't Make Me Think". While I haven't read the book, I read many reviews and excerpts and it looks very good, so I'm adding it to the list.

I'm wondering about computational efficiency. I'm going to use Java in this example, but it is a general computing question. Lets say I have a string and I want to get the value of the first letter of the string, as a string. So I can do

String firstletter = String.valueOf(somestring.toCharArray()[0]);

Or I could do:

char[] stringaschar = somestring.toCharArray();
char firstchar = stringaschar[0];
String firstletter = String.valueOf(firstchar);

My question is, are the two ways essentially the same, computationally? I mean, the second way I explicitly had to create 2 intermediate variables, to be stored in memory (the stack?) temporarily. But the first way, too, the computer will have to still create the same variables, implicitly, right? And the number of operations doesn't change. My thinking is, the two ways are the same. But I'd like to know for sure.

The earlier answers are coincident and right, AFAIK.

However, I think there are a few additional and general considerations you should be aware of each time you wonder about the efficiency of any computational asset (code, for example).

First, if everything is under your strict control you could in principle count clock cycles one by one from assembly code. Or from some more abstract reasoning find the computational cost of an operation/algorithm.

So far so good. But don't forget to measure afterwards. You may find that measuring execution times is not so easy and straightforward, and sometimes is elusive (How to account for interrupts, for I/O wait, for network bottlenecks ...). But it pays. You ask here for counsel, but YOUR Compiler/Interpreter/P-code generator/Whatever could be set with just THAT switch in the third layer of your config scripts.

The other consideration, more to your current point is the existence of Black Boxes. You are not alone in the world and a Black Box is any piece used to run your code, which is essentially out of your control. Compilers, Operating Systems, Networks, Storage Systems, and the World in general fall into this category.

What we do with Black Boxes (they are black, either because their code is not public or because we just happen to use our free time fishing instead of digging library source code) is establishing mental models to help us understand how they work. (BTW, This is an extraordinary book about how we humans forge our mental models). But you should always beware that they are models, not the real thing. Models help us to explain things ... to a certain extent. Classical Mechanics reigned until Relativity and Quantum Mechanics fluorished. None of them is wrong They have limits, and so have all our models.

Even if you happen to be friend with your router OS, or your Linux kernel, when confronting an efficiency problem, design a good experiment and measure.


NB: By design a good experiment I mean beware of the tar pits. Examples: measuring your measurement code instead the target of the experiment, being influenced by external factors, forget external factors that will influence the production code, test with data whose cardinality, orthogonality, or whatever-ality is dissimilar with the "real world", mapping wrongly the production and testing Client/server workhorses, et c, et c, et c.

So go, and meassure your code. Your results will be the most interesting thing in this page.

Joel Spolsky repeats over and over that today, knowing a bit of anthropology can be very useful for a programer because much of what's being created is social software.

How can someone that already knows the computer science learn the anthropology needed to know how human beings works? Any books? Any recorded lectures?

I agree that knowing a bit about how we think is more important now for a developer then ever. The book Consciousness Explained by Dan Dennett was a real eye opener for me in understanding that we don't think the way we think we think.

What would be my best option for a minor? Graphic Design?....

I'm also majoring in CS and I've specialized in UI design. Maybe your CS university did not have courses about UI design? (And graphic design is not the same as UI design - the former is about how the program should look like, the latter is about what the program should do.)

Here are some books that I would recommend you to read, if you want to get more into UI design. In alphabetical order:

The course that I went to was mostly based on the User Interface Design: A Software Engineering Perspective book. I have not yet read the book itself, I've just skimmed through it, but it seems like a good book to start learning UI design. Also all the other books are good. Then when you have read some theory from the books, you just need to practice UI design until you develop a sense for good and bad usability, and get some training in requirements gathering and usability testing methods.

Being mostly a software developer I find that the hardest thing for me is to produce usable user-interface.

I did read some books, including The Smashing Book and Web Design For Developers. But those are mostly concentrated on the Design rather than on building more complex interfaces (like allocating many-to-many items with search with different options on both sides, grouping using different fields and so on).

Are there any books, articles that target building more (logically) complex UIs for the web?

Based on the other answer on the SO the Designing Web Interfaces book looks good


As with any topic, get your hands on as many resources as possible.

My most recent addition to my pile of books is Designing Interfaces Patterns for Effective Interaction Design by Jenifer Tidwell. Links: Official website and Amazon.

I highly recommend it: it describes user interfaces in patterns (something that we are familiar with).

A few titles from my book shelf:

I could list more titles, however the above will get you started.


Possibly a bit Off-topic, however I cannot resist as this is an area that I know.

If you have the opportunity, talk with your users (or even better sit down with them as they work). It is the best research you can do when trying to improve usability of your software.

If you want to measure your usability check out running System Usability Scale test (commonly referred to as SUS scores). Link 1 and Link 2 (PDF)



I also like this one:

The Design Of Sites - second edition

Jenifer Tidwells book Designing Interfaces: Patterns for Effective Interaction Design is a good one.

alt text


  1. The user and the task.
  2. Organizing content
  3. Navigation
  4. Organizing the page
  5. Actions and commands
  6. Complex data
  7. Input
  8. Buildes and editors
  9. Making it look nice

I'm in the process of designing and testing various ideas for an application whose main functionality will be to notify users of occurring events and offer them with a choice of actions for each.

The standard choice would be to create a queue of events showing a popup in the taskbar with the events and actions, but I want this tool to be the less intrusive and disrupting as possible.

What I'm after is a good book or papers on studies of how to maximize user productivity in these intrinsically disruptive scenarios (in other words, how to achieve the perfect degree of annoying-ness, not too much, not too little).

The user is supposedly interested in these events, they subscribe to them and can choose the actions to perform on each.

I prefer books and papers, but the usual StackOverflow wisdom is appreciated as well.

I'm after things like:

  • Don't use popups, use instead X
  • Show popups at most 3 seconds
  • Show them in the left corner
  • Use color X because it improves readability and disrupts less

That is, cognitive aspects of GUI design that would help users in such a scenario.

I have read and recommend:

This question has been addressed in a similar post on a more specific level regarding UI.

I would like to address the subject on a more general design level.

I make descisions on design every day to ensure high quality. But every now and then I get into dicsussions with middle management and unexperienced developers about the gain of doing things "the right way".

Sometimes I just say "trust me, I've seen where this leads to, we're doing it the other way", sometimes I make an attempt lay down a scenario where a particular set of choices introduce problems etc. Most of the time I feel I'm not reaching the person I'm talking to. I might as well have said "trust me".

I feel that one of my capabilities as a senior software guy should be to explain and motivate the technical choices we make as a company. I can do that on economical and user experience level.

But I seem to fail to explain on technical and pseudo-technical levels why some design choices "feels wrong" and why others just feels more correct and benefitial, even though at first it might be harder to implement or seem unnecessarily complex.

Luckily, I occasionally show good results, otherwise I probably would begin to doubt the whole concept of good vs. bad design.

I would really find it interesting to read about what others here have to say about this.

Thanks in advance!

Often, discussions like these can devolve into religious or political arguments - everyone has an opinion, but no one has the answers. Anything you can do to add substance to your thoughts will help you push your ideas through.

Read some existing material - About Face, The Design of Everyday Things, etc. - and see if you can't identify some facts to back up your feelings that some things just feel wrong.

Any key to become a user experience design and Rich Internet Application design? What should I learn to reach it?

The single best, most important thing you can do to learn to become a designer is watch real people (not you, not other engineers) use real software. Read help forums. Usability test other people's software. LISTEN, like, really understand, what they're trying to do and what their goals are. Give them software that supports what THEY want to do.

I suggest starting with Jakob Nielsen:

Other great books:

Then you need to pick up functional skills in design — that's visual design, wireframing, probably some coding (for prototyping purposes), graphics production.

As a front-end developer, I would like to develop nice and good usability web applications. However, normally developers are good at coding. So, I would ask how to get started with learning some UI design knowledge? What's your recommended books or courses for a newbie to learn? Basically for graphic design, fonts and colors etc etc.

  1. Build on the shoulders of those who have gone before. To be a great developer, you have to know your stuff. In the same way, to be a good designer requires understanding of some basic foundational guidelines. Some of it may seem pretty simple and tedious, but understanding the proper principles of typography, color theory, grid systems and so on can help you a lot. A few resources to get you going are:

    That list should generate it's own follow-on books / websites reading list for you.

  2. Ask questions. Find some designers you really like and ask questions. Try to understand why they made the decisions they did. Most people are pretty willing to talk about their own work. Asking questions helps you to understand why designers use (or don't use) certain design principles in their work.

  3. Actually design (and seek out constructive criticism.) Like anything you do in life, reading and learning can only take you so far. At some point, you have to start practicing. Find a small circle / community of more senior designers who can review your designers and give you some brutal, but constructive criticism. Your stuff will suck at first. Everyone's work does. Designers spend hours upon hours honing their talents and skills. Don't get discouraged by it. Just like anything you can gain mastery in, it takes time. Having people in your life who can give constructive feedback is a huge help.

I want to Switch from Web Designer to Front End Developer or web developer PHP, which skill should I get , Is it Easy to switch from Designer to Developer. I have two years Exp. in Web Designing. Please suggest.

Or should i stick to the Designing what is the Next BIG thing for Designer after DIV layout.

My Current Roles Conversion PSD to HTML, fixing Bugs in Different Browsers , Strong knowledge of HTML and CSS. I want to Go with the Open source Programming like PHP and MySQL

@wazdesign, I didn't come from a design background like you, but I found my niche in Front-End Web Development none-the-less. I started with Standards-based HTML and CSS and then started working back in the day on the Views and Helper functions in MVC frameworks (with a good team doing the controllers, models etc.) Ask a competent Web Developer to give you a basic web-server architecture and process demo. Understand how data from the DB gets onto your user's pages, and all the checkpoints the data goes thru on the way. Once you understand the principles, you can pretty much work with any technology after tooling up with the syntax.

I've listed some terms to research below that are tech-agnostic. I can't help you with the PHP side of things :)

Some books worth reading:

Some terms to research:

  • Interaction Design
  • MVC Frameworks
  • Templating systems
  • HTTP
  • User Interface

Some tools to use:

  • Firebug
  • YSlow for Firebug