There is bad software and good software, and then there is awesome software.
Bad software – the user finds it hard to understand what the software is saying.
Good software – the user understands what the software is saying explicitly.
Awesome software – the software fully understands what the user is trying to say.
The rules are simple, following them is not.
In fact so hard that most of the software we use today falls in the first two categories.
The good news is, for us to build awesome software, we don’t need to be ninja programmers or rockstar designers.
What we need, is a lot more empathy and a little sense of good design.