Designing for Failure
I’m a big fan of the Game Maker’s Toolkit YouTube channel. It breaks down and analyzes the design decisions that make video games great. I love it because several of the topics are so fundamental that they apply well to other design disciplines. This analysis of Super Mario 3D World level design resonates deeply with how I like to approach user experience design. The thing that caught my attention was this:
This is a game with Conkdors and flipswitch panels, double cherries and cannon boxes, switchboards, Ant Troopers, beat blocks, trapezes, Grumblumps, footlights, and piranha creepers. This game has innovation in abundance. So how does Nintendo manage to cram so many mechanics into the game without making it bloated, or incomprehensible, or stuffed with tutorials?
You may not know what a Conkdor is, but the design problem is universal: “how do we reduce cognitive load without sacrificing interest and fun?” To summarize the video, game designers would approach the problem like this:
- Introduce a new concept in a way that the player is not punished for failing.
- Build upon that concept in a way that challenges the player.
- Combine the concept with other familiar concepts to put a new twist on it.
- Give the player a reward!
What makes games fun boils down to giving the player agency, and responding to what they decide to do.
Let’s apply that to experience design
User experience improves when we give people agency. Think about the last time you had to use a “wizard” and were forced to go through steps 1 through 4 just to find what you needed on step 5.
Imagine an app that requires the user to confirm their email address immediately after they sign up. This can cause frustration if the user is in a hurry, or if they are signing up from a device that is not set up to recieve their email. If we determine that email confirmation is only necessary for a few specific features, we could postpone the confirmation requirement until it’s necessary.
Now we’ve given the user more agency – they can sign up and immediately start using our app. However, our design needs to provide feedback when they find the boundaries of the system. Here’s a simple example – consider the following error message:
Your account must be authorized to perform this action.
That’s frustrating. We’re showing the user a dead end and shrugging our shoulders. How about this:
You must confirm your email address before you can perform this action.
Click here to re-send a confirmation email to me @ example.com
That’s much better. We’ve designed the failure state in a way that doesn’t punish the user if they don’t know that account authorization is handled through email. We’re also giving them a way to resend the confirmation so they don’t have to dig to find the original one, and we’ve given them a hint as to which email is associated with their account, in case they forgot.
As the complexity of our system increases, so does the number of possible failure states. This is particularly true of enterprise software, which often has many interconnected subsystems, user personas, and critical paths. Good user experience design requires that we constantly anticipate failure.
When we take the shortcut of designing rigid, linear user flows to avoid failure states, we sacrifice user agency, which ultimately leads to frustration. Instead, let the user’s needs inform the boundaries of the system, and provide a safety net only when they stray out of bounds.