
Remember users? They were big in the 1990s, back when the software itself was the product, and not the attention and the personal data of the people who use it.
One of the most important things I thankfully learned early in my career was how to approach the design of software not by asking “What will this software do?”, but by asking instead “What does that person need to do using the software?”
You may be familiar with the idea of “use cases” in software engineering, first presented by Ivar Jacobson in 1987. But, less formally, the idea of analysing users’ goals, and their mental model of tasks and associated problem domains, then driving the UI design of a system from there goes back to the 1960s.
Having been trained on object-oriented UI design approaches in the 1990s, which I’m sure you can imagine involved a lot of boxes and arrows, these days I favour a more informal “walk a mile in their shoes” philosophy to getting inside the user’s head.
If we’re writing call centre software, I’d spend time observing and, ideally, actually working in the call centre, seeing and experiencing the kinds of things they’ll be doing using our system first-hand. No amount of boxes and arrows can replace that tacit knowledge.
Then I’d create a “model office” – a simulated call centre that we control, and can use to explore and roleplay scenarios, replay production incidents and unanticipated edge cases, and to test software in the most meaningful way, which is to try to do the user’s job with it.
At the very least, more of us could eat our own dog food once in a while. I’m always amazed at just how far apart some dev teams’ opinions of how satisfied their users are can be from the actual reality when I talk to the users themselves. It’s pretty normal to discover that the team has completely failed to address those needs.
And approaching design in this user-centred way doesn’t stop at the UI. APIs benefit from being designed from the client developer’s point of view. Libraries and services, too. Even classes and functions benefit from being designed from that external perspective.
One great example of user- and usage-driven design is Test-Driven Development. The design emerges working backwards from the tests, and the tests play the role of the user. So if we’re test-driving a design for an online shopping basket, we ask not “What does the shopping basket do?”, but “What does a shopper need to do using the basket?”
In my own evolution as a software developer, my journey’s been one from not really considering the user’s experience much at all, to now seeing that everything is part of the user’s experience. It’s all UX!
Even the stuff we don’t think of as UX, like unit tests. Many might argue they play no part in the user’s experience. But as an end user I can actually tell when a product lacks fast-running regression tests by how long I end up waiting for bug fixes to be released. That’s definitely part of my user experience!
And as a software developer, I use software tools every day that – let’s be honest now – not a great deal of effort was put into the design of the user experience. I use the term “builder’s houses”. (Builder’s houses are often found in a permanent state of “It’ll be nice when it’s finished”).
This seems to be especially true of Open Source tools, when even just installing the damn things can sometimes be something of a quest.
When we invest in understanding our users and their needs, it usually pays dividends in adoption rates, in word-of-mouth, in avoided support calls, and especially in improved user outcomes.
Maybe you signed up just to make some very rich investors even richer, but making a positive difference to users’ jobs and lives is worthy of more than just lip service.
If you’re serious about building your team’s capability to rapidly, reliably and sustainably evolve software to meet rapidly changing business needs, visit codemanship.co.uk for details of high-quality hands-on training mentoring for software developers.



