I used to work for a company called Tarantella and we had a great idea: "desktop computing", by which we meant PC's running big applications from Microsoft, had turned out to be a real headache. How much better would it be if we hosted applications centrally and projected their user interface over the web using a clever Java applet? People would only need a web browser, not those clunky, expensive PCs and all the apps could be administered centrally. We would make our fortunes and retire to Monaco.
Turns out that didn't happen. Also turns out the idea wasn't that original. People had been having it for about thirty years and lots of people were having it at the same time we were, notably our two biggest customers: Sun Microsystems (who later bought the company) and Oracle (who later bought Sun Microsystems).
Sun and Oracle hoped that network computing would let them "commodotise Microsoft". If all the applications are running on a big server in the sky then the client machine stopped mattering. More importantly, it stopped needing to run Windows. If all this sounds familiar you've probably read one of the blog posts guessing at Google's master-plan. It goes something like:
This is given credence by people who should know better because, well because it's Google. And they've got all those smart people. And that geyser of cash. But the truth is that people didn't really like the idea of a thin client ten years ago and they don't really like it now: they don't like the crappy experience of the applications, they don't like giving up control, and they don't like giving up their data - if your data is on Google's servers then it belongs to Google, not you.
Network computing isn't a wrong idea it's just not going to help you unseat Microsoft. They more than anyone else would like applications to move to the web - then they could start charging subscriptions and make some real money. The problem is that network computing is hard. Look at Google Gears or HTML 5 and the consensous is that once you've got SQLite crammed into the browser for offline storage and the canvas tag for "vector graphics" then collaborative, nomadic, mutli-sychronous network applications are just a simple matter of JavaScript. I think lot of people are in for a nasty shock.
Consider what network computing will have to offer to be adopted:
This are non-trivial goals that touch just about every area of systems development; it's not as easy as switching on contenteditable and pretending you've made a word processor
What would people recommend as a good systems programming language in 2009? I'm writing the systems components of metro on OS X which means lots of good old UNIX systems programming.
The obvious choice is C but after years of being cosseted with Java and .NET. I couldn't face going back to a macro-assembler. I need a language that:
This seems to leave either Ocaml or D. I'm going to write the Windows system components in F# so Ocaml is the obvious choice - it's succinct and very expressive and hopefully there will be a lot of code sharing between an Ocaml implementation and an F# implementation. The more I look at D though the more I like it: it is mature, seems to have an intelligent community and is focussed far more on practical systems programming than the rather academic Ocaml.
I have a pair of co-operating daemons to write for this project. One will be done in Ocaml, one in D and I'll share my experience. Of course, if anyone knows any languages I've missed, I'll be happy to hear about them.
Beautiful things work better. Donald Norman, in his 2004 book "Emotional Design" recounts a study by researchers Masaaki Kurosu and Kaori Kashimura to investigate how aesthetics effects the apparent usability of a software artefact - in this case the interface to an ATM machine. Kurosu and Kashimura found that subjects of the study consistently rated the apparent usability of an interface higher when it was prettier - a finding later duplicated by Noam tractinsky in Israel.
People really do feel that aesthetically pleasing interfaces are easier to use; regardless of whether that is actually the case. Note that in Kurosu and Kashimura's report it was aesthetics and apparent usability that was strongly correlated, not inherent usability: people felt that the prettier interface was easier to use, which really is all that matters.
Norman uses the work of Alice Isen to try and explain this phenomenon. Isen carried out a number of studies in how emotional mood affects problem solving ability and found that "happy" people are more effective in finding alternate solutions and are therefore more tolerant of minor difficulties than "unhappy" people. People she gave a slice of cake to solved brain teasers better than people she didn't. Norman ties this in with recent research about how emotion and cognition are interlinked:
"Everything we do has both a cognitive and an affective component-cognitive to assign meaning, affective for assigning value." Norman 2004
To paraphrase: Pleasant looking interfaces make people happy, happy people relax, relaxed people are better at solving problems. If your interface makes people better at solving their problems they'll think your interface is better.
So make it pretty.
Exercise extra interaction that does not contribute to a user's goal and therefore interrupts the user's flow. Some exercise is unavoidable, but an excess of it usually indicates that the software has poor navigation - it is difficult for a user to find the information he is interested in. Some tips for eliminating exercise are:
The easiest way to improve navigation is simply to reduce the number of places the user needs to go; and if the user does need to go somewhere, you should bring try to bring that place to him. Some tips for improving navigation are:
Finally, you should try and "inflect" the interface - organise it to minimise the most common navigation path, and thus reduce exercise and keep the user within his flow. Inflecting the interface usually means organising it according to three attributes:
A good interface should be invisible. Orchestration is the process of making sure that all the elements in an interface work coherently together, without any sour notes that will shake the user out of his flow. Unfortunately, there are no fixed rules for making a well orchestrated interface - it is a function of the user's activity and the context in which he is working. HIGs, UI manuals published by Microsoft and Apple, are useful but will not tell you how to create a harmonious interface: only experience and feel will. However, there are some useful guidelines:
The psychological state of flow occurs when people are able to concentrate fully on an activity without interruption or peripheral distraction. It is this state that a good software design seeks to generate. Software that successfully induces flow becomes transparent to the user's thought process and usually exhibits the following:
Without effective design engineers tend to ship products made in their own image - heavy with "expert" features (where the definition of expert is someone suspiciously similar to the engineers themselves.) This is entirely rational - what other model to the engineers have to go on?
Moreover, after this expert-heavy first version is put out to a bad reaction it is festooned with features for the "beginner" - training wheels such as wizards and dancing paper-clips. We wind up with software that has lots of features for the minority of experts, and lots of features for the minority of beginners and barely any features for the vast majority of intermediate users. Good design is about inverting this profile.
"The intractability of the software construction process - particularly the high cost of programming and the low quality of interaction - is simply not a technical problem" Alan Cooper
My colleagues at BNP hated the software they had to use. Whether it was store-bought or developed in-house they found it buggy and frustrating and stressful: eight-hours-a-day five-days-a-week. Was this down to stupid programmers making bad software? Maybe, but unlikely. Much more likely is that the people responsible for originating the software - the product teams and executive teams - did not have the tools to articulate exactly what the software should be. Without clear direction programmers cannot create clear software.
The business people staffing executive and product teams are schooled in a system designed to maximise profits on the manufacture of physical objects, usually by reducing variable costs - the costs that vary with each unit shipped. They reflexively treat software production as a variable cost and, with the best intentions, set about trying to reducing it.
Unfortunately, this is a catastrophic strategy both business-wise and in terms of software quality. Software production is not a variable cost - in fact software has very little variable costs, once it is written you can reproduce a new unit for the cost of pressing a new CD. If your software is downloaded over the internet the cost of "shipping a unit" is effectively too small to measure. When execs think they are minimising variable costs on software development what they are actually doing is minimising the quality of the product since programmers not only do not know what they are making but are always given too little time to make it.
This is the situation that interaction design, and software design in general, should remedy. Good design should provide a clear picture of what the software does and who it does it for. Not in terms of a floating check-list of "features" but by defining a target user, defining his goals, and enumerating the interactions the user will have with the finished software to achieve those goals.
I'm going to reboot this blog by serialising a guide to interaction design that I wrote for my old employers at BNP Paribas, and recently gave as a lecture to my new employers at True Knowledge.
It's a sobering thing, as a technologist, to go work for an investment bank. Cambridge can be a rather cosseting techno-utopia, steadfast in its conviction that software can make the world a better place just as soon as we've worked out the bugs. That is a fine ideal, and not one I disagree with, but at any software firm you are insulated from the people you are convinced you are helping and this can lead to you not really helping them at all.
BNP Paribas staff are submerged in technology, utterly dependent on it, but their relationship with it viers from apathy to irritation to red-faced rage - never satisfaction, certainly not enjoyment. It is good, if not easy, for a technologist to work in such an environment. You either give up or you get focussed.
As a technologist, I knew that software should be making their lives simpler and even happier, but it was not, and that is not a story isolated to investment banks. Why is most software so buggy and frustrating to use? Are programmers just too stupid to create good software?
Of course not. Programmers are smart people but most of the time they are working in the dark on something that has never been designed. There is even a disturbing, unspoken, notion in development circles that software cannot be designed and developers must just get used to this fact and work around it: processes with important sounding names such as "SCRUMM", "Agile Development" and "Extreme Programming" have evolved to give a veneer of intellect to this idea.
I distrust the notion that the best we can do in software development is throw "features" against the wall to see what sticks and my experience at the coal face of BNP has only convinces me that a proper design phase is essential in any software endeavour. But how do we do it?
Software design, by which I mean the wholesale design of a software artefact, not just the design of the internal technical architecture or the external visual UI design, is a discipline still in need of definition but perhaps a good start is with the current notion of _interaction_design.