A salient development of the digital era is that every company, whether in the software business or not, must learn to build software that provides a great consumer experience.
While everyone understands the need for great experiences, how to build one is not as well understood. A significant misconception is that a great experience is an outcome of slick user interfaces (UI design) or how a user experiences software's workflow (UX design).
A great user experience is not just a UI/UX problem. It is a full-stack problem - a stack that also includes the right development processes, good systems architecture, and great team environments.
First, let us start with the question of what to build.
Most organizations start initiatives wanting to create "Uber-like" experiences. But they specify a big list of requirements without identifying consumer or user problems.
Requirements are just the beginning. Teams need the time to take those apart. They have to deconstruct requirements typically in the "I want../I need.." format to understand the underlying user problems. What are the core constraints that are preventing the user from making progress in their lives?
When designing for experience, you have to pay attention to unsaid requirements as well. For example, no one wants the system to be slow even if there is no formal requirement for a fast-performing system.
In some novel scenarios, the underlying problems aren't even apparent. Such scenarios require extensive iteration with real users to discover the problem hypothesis. Uber was a cab-hailing service before it became a ride-hailing service.
A good UI/UX design is necessary but not sufficient. It can enhance the solution for a well-understood problem. But it can't elevate software that doesn't solve real user problems. In Fred Brooks' words, it can't "enflame or inspire the drudge".
Without the right amount of process rigor in deciding what to develop in the first place, it is impossible to build a good experience.
Second, you have to break apart how you will build the overall system.
A simple example is how consumer experience apps need flexible interfaces with legacy IT systems. Employee wellness apps have to integrate with HR systems. Mobile or web storefronts have to couple with the ERP or manufacturing systems.
IT systems are optimized for scale and have long change management cycles, while consumer-facing apps have to optimize for short feedback and change cycles. Due to this inherent agility difference, system design concepts like modularity are a must to abstract complexity.
Uber's clean and simple user experience abstracts a tremendous amount of behind-the-scenes complexity. 2000+ micro-services with web APIs power the 1-2 screens that most users see. Uber invested in making the system modular on their own accord to increase developer velocity that can accommodate the pace of change desired by consumers. No user asked for it. Without system modularity, the complex dependencies between system components can outpace every well-intentioned front-end UI/UX design.
Non-functional system needs, such as a modular architecture, are an investment. They get the short shrift when the cost is the only metric to decide what you build. But anything for consumers, you have to maintain and enhance continually. Therefore, you must consider tradeoffs between functional and non-functional needs to keep the system experience simple and flexible.
Third, and perhaps most important, is the experience of your teams designing, developing, and supporting systems for your consumers and users.
Right development processes and good system design can result in a good experience. The transition from good-to-great experience can only come from great team cultures and environments.
Everything you want users and consumers to experience, you have to model within the teams' structure and behaviors. It is impossible to anticipate every user experience issue. Therefore, it is critical to respond quickly when the unanticipated happens. The team structure and culture have to prioritize fast change management. These teams have to be empowered to decide what is right to fix the consumer issues.
Bigger organizations have to prioritize the specialization of roles and labor. But specialization creates silos and siloed teams don't create a coherent experience. Therefore, if you want to ship a great consumer experience, the relevant parts of your organization have to be redesigned to prioritize great employee experience first.
Jeff Lawson, CEO of Twilio, writes in his book Ask Your Developer that nearly half of Twilio's engineering staff quit due to a poor employee experience from inefficient DevOps pipelines early on. They had to invest heavily against the wishes of their board. Jeff reported in his book that, after their investment, Twilio can put new code to production "nearly 550 times every single working day".
Again, no user asks for a solid DevOps infrastructure. But it is impossible to respond to the needs of a great user experience without a solid DevOps.
With those examples, I think we can frame what the full-stack consumer experience means:
A great consumer experience is an emergent property of empowered and self-organizing teams, solving the right user problems within the guardrails of a good system design.
In the digital era, providing great digital experiences, which can be products in and of themselves or can facilitate great experience of physical products, is a prime value opportunity. But reducing that opportunity to just a visual design problem is a value-destroying mistake. Approaching it as a full-stack problem is the only way for creating consistently great experiences.
Soul of an Engineer
Join the newsletter to receive the latest updates in your inbox.