GUI mess
Posted by aogSaturday, 18 August 2007 at 09:41 TrackBack Ping URL

User interfaces are hard. I had forgotten just how difficult and grinding it is to make a good graphical user interface. As I noted earlier we’ve done a few demonstrations of our product for various potential customers and received a lot of good feedback. One of the things was that while the interface was quite usable, it wasn’t quite slick or helpful enough.

One can make a user interface too fancy, or waste time on over tuning it, but have a slick user interface should be a goal for any product. When people tell you that about an interface, they mean that there’s not much cognitive friction when they use it. Reducing that kind of friction, that sort of mental strain, makes the product better because it’s easier to use. Sadly, the ultimate reward for a good user interface is to be ignored because a really slick, easy to use interface effectively disappears from the user’s mental model of the product. I.e. the user thinks about what the product does, not how to get it do it what it is supposed to do. The interface becomes (as they say in the trade) “transparent” so the user can look through it to see the real product.

But achieving this kind of thing is a whole lot of work. Having gotten back to working on ours, I now remember why I gravitated to infrastructure back in my old job. At least now no one tells me “we’ve got the data designed, now we can just display it to the user”. My experience has been that building a good interface takes longer than the infrastructure it’s displaying. This is why so many products have such lousy user interfaces. It’s not that they’re stupid, or they didn’t care, but they probably just didn’t realize (and plan for) the effort it takes to get it right.

I think it will be a strong future trend to apparently favor form over function in the future, but in reality there will be so much function that the bottle neck will be using it properly far more than having the raw capability. It will be a content driven world, although sadly I’m not much of a content kind of coder.

P.S. This is essentially the point that Virginia Postrel makes in The Substance of Style. It’s just been brought home to me again because of the coding I have been doing instead of writing here.

Comments — Formatting by Textile
erp Saturday, 18 August 2007 at 12:20

This is the first Thought Mesh post to pop up on my Bloglines feed and I was quite amused when I saw that it was bare boned plain black print on white, not the familiar black and green format. Was that intentional given the subject matter?

As a potential user of hardware and software, I would opt for the one that’s slick, as you define it. I also don’t want to have to remember when I first bought it, what my user name is, etc. I expect that if I’ve already registered a product or a service, my vital information should be available on the vendor’s system.

erp Saturday, 18 August 2007 at 12:23

Eeeeeeeeeeek.. Double posts syndrome following me .…… Send help.

Some wierd server thing. I have adjusted my stuff to cope so it should be fixed now.

Annoying Old Guy Saturday, 18 August 2007 at 16:54

Bloglines doesn’t carry over the style sheet unless you do something magic, which I haven’t bothered to figure out.

Bret Saturday, 18 August 2007 at 23:36

User interfaces are hard.

Hard or tedious or both. The user interface plus service/maintenance can easily exceed 90% of the cost of the product in my experience.

Jack Diederich Wednesday, 22 August 2007 at 16:58

UIs are hard and they aren’t necessarily getting better. I bowl at two different bowling alleys: one with 70’s era computers and one with modern 2000s equipment. The 70’s era system is much uglier four color block text on the screen with a 30 button control panel. It is not just more usable than the modern system but it even does more too! On the old system you push the “reset pins” button to … reset the pins! The modern system has a button with an icon for “reset pins.” Quick, what do you think the obvious icon would be? Right, there isn’t an obvious one. There isn’t an obvious icon for most things so they made up a couple and then hid other common functionality behind menus.

The modern system is just mind numbingly awful. On every menu you have to push the “enter” icon to confirm choices (except when you have to push the “check mark” button to confirm choices). To view a game summary you have to push “1-enter-3-enter-4-enter.” Oh, and the “enter” is an icon, not a label. It is that 90-degree bent arrow which looks very similar to the 45-degree bent arrow icon for “check mark.”

I could go on and on. The system is so bad it must have been designed by committee. If it had been designed by a Software Engineer the UI might still be bad but at least the functionality would be better. The only information it remembers about the game that ended five minutes ago is the final score whereas the 70s system can show you the exact frames, strike counts, averages, etc. Seriously, what software guy would write a summary screen that didn’t include an average?

erp Wednesday, 22 August 2007 at 17:51

An “Only in America” moment. On a string about the latest in code writing, is a comment about how it affects bowling. Ya gotta love it.

Annoying Old Guy Wednesday, 22 August 2007 at 20:13

I doubt it was a committee, far more likely to have been the junior / intern fresh out of school who had never worked on a user interface before except in machine problems for class.

Wouldn’t a good icon for “reset pins” be a picture of the pin reseter machinery over an empty alley? Better, a little animated image of the pins getting reset.

Jack Diederich Thursday, 23 August 2007 at 22:48

re: erp

I’m a software guy and dot-commer who bowls a lot. As a capitalist running dog I also take great joy in the strange and unexpected aspects of other people’s biz. So when I see things that are obviously broken they stick in my craw. This sometimes includes UI: one of my more popular blog posts was I Hate My Toaster which recounts … everything I hate about my toaster. You really need to screw up the design to make a grown man confused by a toaster.

Similarly bowling lane UI is a well understood problem (40 years of computerized score keeping) so I was simply aghast at how badly a company (AMF) that makes all its money selling bowling lanes could do it so badly. I’ll have to find a modern lane by AMF’s only competitor (Brunswick) to see how they did.

My difficult to use $20 toaster may be an oversight but a new 20 lane bowling alley costs upwards of 2 million dollars. There is no excuse for sucking that badly with that kind of budget.

erp Friday, 24 August 2007 at 09:39

Jack, I sleep better knowing there are guys like you and AOG and others who comment here out there. I am not kidding.

As for the new bowling lanes, I’ll bet nobody designing them ever thought someone like them, savvy high tech types, would be actually using them.

I’ve subscribed to your feed the better to enjoy your future rants reasoned critiques. For the record, our new toaster also has a design flaw. The controls are at the end of the little box, not on the side, so it doesn’t rest easy on the kitchen counter.

Annoying Old Guy Friday, 24 August 2007 at 11:53

Gosh, we’ve got a lot of code slingers around. Me, Mr. Diederich, Oroborous — any others?

In terms of the industry, the oddest thing was working with all of the California programmers. I used to wonder how they could deal with the demands of logic and clear thinking in their code and then not apply a bit of it to their politics. Then I saw their code …

Bret Saturday, 25 August 2007 at 12:23

Me. And I’ll take that insult about CA programmers personally.

Also, I didn’t think Oroborous was a code slinger.

Annoying Old Guy Saturday, 25 August 2007 at 20:16

You’re correct, I got the two of you confused. You look so much alike from here :-). I think cjm’s a code slinger too.

Gah. Spent today dealing with QT framework grinding and then a nasty little problem with Boost.MultiIndex crashing on me. There’s a bug but the real problem isn’t the crash, it’s that coding it that way shouldn’t even compile (to prevent the crash). Even with that, though, I probably saved net time over doing what I needed myself.

joe shropshire Monday, 27 August 2007 at 11:26

GUIs are easy, so why are you behind schedule? Get your sh**t in one sock or we’ll find an intern or a tech writer or somebody to do that. I’d do it myself this afternoon but I have a meeting.

(Sorry. Just channeling an old manager there for a minute. How is the Boost MultiIndex thingy working out for you when it is not crashing? )

Annoying Old Guy Monday, 27 August 2007 at 13:33

MultiIndex is generally excellent. The bug was just that a copy constructor isn’t safe for client use but is public. I just have to remember to not use it (and it’s clearly documented, except for the documentation saying “it won’t compile” :-)).

In this case, I have a set of objects with names that I want to display in a list. The list widget requires the objects to be indexed (so that it can do lazy display) but I also need to key them by name for fast lookup and uniqueness checking. MultiIndex just requires a little bit of tricky declaration instead of lots of potentially buggy code synchronizing two data structures.

// Index by name and position
    struct ByName {}; //!< Meta name : expressions indexed by name.
    struct ByPosition {}; //!< Meta name : expresisons indexed 0..N

    typedef boost::multi_index_container
    < value_type
    , boost::multi_index::indexed_by
        < boost::multi_index::hashed_unique
            < boost::multi_index::tag<ByName>
            , boost::multi_index::member
                < value_type
                , std::string
                , &value_type::_name
                >
            >
        , boost::multi_index::random_access
            < boost::multi_index::tag<ByPosition>
            >
        >
    > Container;
    typedef Container::index<ByName>::type NameIndex;
    typedef Container::index<ByPosition>::type PositionIndex;

Now I can do lookups by name or position, and inserts automatically update both indices. You do have to extract the index from the container to access the elements, which is an extra step, but well worth it IMHO.

// Insert if not unique
        NameIndex& idx = imp._data.get<ByName>();
        if (idx.end() == idx.find(item.name())) {
            idx.insert(item);

There are some people who use this instead of std::set even for a single index because it lets you specify a member as the key, instead of having to use the entire object, duplicate a member, or split the member across the key and value in a std::map. That’s the biggest irritant for the STL keyed containers in my view.

cjm Monday, 27 August 2007 at 15:19

yes, i make my living in the code mines of socal. “16 tons, and what do you get, another day done and further in debt”. not surprising how many s/w engineers there are on blogs, giving their propensity for analysis.

Peter Burnet Tuesday, 28 August 2007 at 14:00

Wow AOG, are you trying to illustrate the point personally? I note your handy list of recent comments on the right has now been changed to a list broken down by post, except it starts from the earliest comment and you can’t see the most recent. Pretty, but totally useless. When you click on title of the post in hope of being sent somewhere useful, you get a message saying: “That concept in not in my lexicon.” Nor in mine, sweetie, nor in mine.

I fixed your little problem, because clearly it was caused by my inadequate interface design. The others I am working on.

The Other Brother Wednesday, 29 August 2007 at 18:44

I also sling code for a living…Coldfusion mostly, though I’ve decided to try to learn Perl this fall.

Annoying Old Guy Wednesday, 29 August 2007 at 19:09

Yeah, Perl is what we old Lisp hackers have to use to keep our hand in. Although Javascript has some nice basic principles. Feel free to look through my Movable Type plugins to experience the “do I want to learn a language that lets people do this?” moment.

The Other Brother Wednesday, 29 August 2007 at 19:16

I use javascript quite a bit as well, mostly for Ajax and form stuff. I’ve also dabbled in VB and Actionscript. I’ve looked at your plugins and also MT code, and would love to have a better handle on what’s going on.

Annoying Old Guy Wednesday, 29 August 2007 at 19:46

Do you do use any support libraries? I am using MooTools to do the switching on the recent comments, and I did some AJAX work with it on my professional website. It made that very easy, once I learned the right bit of invocation. I hope to be able to do some AJAX stuff here as well but as always just not enough time.

The Other Brother Thursday, 30 August 2007 at 05:14

I’ve tried to settle on the YUI library, as it has good documentation and I figure it’s future development is likely to continue since it’s from Yahoo. The new version of Coldfusion also includes some drop dead simple Ajax via normal Coldfusion tags. I use Ajax sparsely…only when it clearly makes the user experience better, not just for fluff.

Post a comment