Abstraction in User Interface Design
I've been focused on a lot of tool development lately, and in my quest to design the best possible tools my mind has wandered into the concept of abstraction and how it is everywhere in software.
In the world of languages, low-level assembly was developed to abstract out of bits and bytes, while C and FORTRAN were developed to abstract out of assembly. These days languages like C# and Java abstract so much from the machine level that they even have their own virtual machine.
In design we build layers and hierarchies to ease our ability to consider the higher-level concepts inherent in the software. Engines, API's, SDK's, libraries, components. They're all abstractions.
Take that one step further and you have the most important abstraction of all: the user interface.
It would be a mistake to design a user interface around the software design objects. Chances are the user isn't going to be a software engineer that can quickly grab the concepts of software design, so it's pretty worthless to create a user interface that reflects the design. Sadly, I see this on a regular basis, whether it's through my own coworkers, a tool I'm trying to use, or someone else's project on the Internet.
A better approach would be to abstract away from the design by simplifying operations and organization at the user interface level. This puts the user interface in the role of the lens into the functionality of the software design, without even exposing those design objects to the user.
And that's what we are trying to achieve in our tool development work: simple interfaces abstracting from a complex system. It's not easy, but striking the right balance with the user interface abstraction will help with our tools' success.
Filed under: Design