In my original Don’t design like a programmer post, I explored a common UI design trap that programmers often fall into, where you have a data structure, map that directly to a UI, and expect the results to be a good user experience. Sometimes that approach works just fine, but often it does not. The original post explains the potential usability problems in detail. This is an easy trap to fall into if you are thinking about the code instead of your users. As a developer myself, I’m very sympathetic here.
Someone named pankratiev put a link to that post on Y Combinator Hacker News and my site traffic just exploded—so much that my web host couldn’t handle it. (Thanks pankratiev! Please do it again!) While the feedback and comments have been positive, the top request was to show examples of good designs too.
I will start that challenge with this post. I finish with a proposed design in Part 3.
Here’s the first UI in the post:
Actually, I didn’t say this was a bad design—rather I showed how this UI is a direct mapping of this data structure:
struct UserOptions {bool Option1;
bool Option2;
String Option3:
String Option4:
...
};
I made this example generic to focus on showing how a programmer might map a code directly to UI. Is this a good UI? Impossible to say without knowing more, but the original post gives reasons why the odds are against it.
I then ended the post with this example:
I chose this wGetGUI example because it so clearly illustrates several of the problems I mentioned in the post. For example, note that almost all the controls are text boxes, check boxes, and command buttons, which map directly to strings, integers, Booleans, and function calls. You can just see the underlying data structures that need to be filled out:
struct RetrevalOptions {bool NoClobber;
bool Timestamping;
bool ContinueFileDownload;
int Quota:
...
};
This is the UI everyone wants me to redesign—to something that doesn’t look like it was designed by a programmer. There are some problems with this task though:
And as a courtesy to the wGetGUI developer, I really should add one more:
So for this post, I’m going to outline a process but not attempt to improve the original design. This might seem like a cop out, but it’s actually the first key takeaway:
Key takeaway #1
You can’t significantly improve a user experience if you don’t understand its target users.
Sure, I could possibly make some minor improvements to the labeling, layout, tasks flow, and control usage, but that is hardly a giant leap for design. It’s not like changing a check box to a pair of radio buttons is going to be a big revelation.
At this point, I’m going to take full advantage of fact that I’m not a wGetGUI user and look at the design from a fresh perspective. If I were more familiar with the tool, it would be easier to rationalize the design.
Key takeaway #2
Target users aren’t you. They have different knowledge, goals, and preferences.
My first observation about this UI is that I haven’t a clue what to do with it. A programmer might say “Well of course not, you haven’t read the documentation. RTFM.”
Key takeaway #3
Good UIs are self explanatory. Users shouldn’t have to read a document to figure them out.
I’m wondering what the tool is for. Shouldn’t the UI explain itself? Why should I have to figure it out? (Update: I tried to deduce what the tool was for, then later RTFM. Turns out I was completely wrong!)
Key takeaway #4
Don’t make me think…I shouldn’t have to figure things out using thought and experimentation.
Note that this UI presents settings and commands, but no obvious tasks. What are the tasks…what I am supposed to do? Am I supposed to know everything already?
Key takeaway #5
Good UIs are task centric, not feature or technology centric.
Just as the UI reveals how the programmer mapped the data structures to the UI, it also reveals the design process used. Something like:
Code -> UI
Instead, the process should look more like:
Target users -> goals -> tasks -> UI -> code
Key takeaway #6
The UI drives the code, not the other way around.
Starting with the code gets it backwards.
I’d now like to outline what the “target users -> goals -> tasks -> UI -> code” process might look like. There is any number of ways to do this, but I’ll outline a process that a programmer could actually use. No masters degree in design or UX professional staff required.
Done!
If you design like a programmer, you might be doing a little of Steps 7, 8, and 9 before you start writing the UI code. That’s at best—at worst you are skipping all these design steps and going directly to writing the code. If so, mapping the data structures that the code needs to directly UI will be an obvious, natural thing to do.
Some of you might be thinking: What a pain! I’d rather just map the code to a UI and take my chances.
Sometimes that approach works just fine. But if not, you’ll later have to choose between unhappy users and lost market share vs. starting over. This above process wins long-term because you are more likely to get the UI close to right the first time. Having to start over or fix fundamental usability problems complaint by complaint, bug by bug is a much bigger pain. But you know that, right?
If you would like to learn more about the process I’ve just described, please consider taking my UX Design Essentials course or my online UX Design Basics course. I’ve designed both of these courses to help non-designers get started in UX design. I’ve only scratched the surface here.
Its really a great post, you have provided such a wonderful information about designing which will be helpful for designers.