As builders, we often strive to create products that look and feel “clean”. We try to reduce clutter, remove noise, and surface only the most important information to our users. This is a noble idea, but as as one of my favorite Proverbs puts it…
“Where no oxen are, the trough is clean; But much increase comes by the strength of an ox.”
Proverbs 14:4 NKJV
Sometimes cleanliness comes at a cost, and that cost is the very strength of the thing we are trying to build!
A Lesson Learned
I recently launched a feature that I thought was super clean. Users would navigate to a page, the page would fire up a websocket connection in the background, and display incoming data the moment our system received it! Awesome.
Then I sat down with some actual users…
They liked the basic idea of the feature, but their foremost suggestion caught me a little off guard.
“Can you add a refresh button?”, they asked.
“Huh? What do you mean, the data is always live, there is no need to refresh.”, I explained.
They walked me through their workflow. How they would navigate to the page, wait for new data to come in, and get anxious when nothing showed up for a few moments.
Then it hit me… there was nothing “wrong”, the page accurately and reliably reflected the latest data, BUT it didn’t tell the user what it was doing, or why nothing had changed, or what it was “looking” for new data in the background.
I made it too simple, and because of that users were left confused, hitting the refresh button in their browser, eagerly awaiting for the data on their screen to update.
The Fix
Thankfully the fix for this one was pretty straight forward. What was needed was presenting some additional state indicators to the user. A pulsing “live connection” indicator… a timestamp from the last “keep alive” message we transmitted over the websocket.
Really, just a few subtle hints that the page was working, that the tool was looking for new data for them, and that they didn’t have to finagle with it to get the latest result.
Conclusion
Clean isn’t everything. Step back and make sure that your design gives the user something to hook onto so that they understand what’s happening, even in passive states.