Adding features to reduce complexity

Conventional wisdom when building a software product says that it should do one thing and do it well. The logic goes that when you add more functionality to a product, you also increase the complexity of the user experience.

That is certainly a useful heuristic, but sometimes the opposite is true. For some types of problems, adding more functionality can unlock an opportunity to design a less complex user experience.

My frame of reference is the design of developer tools, which are all about making programmers more productive. In my last blog post, I wrote about three developer experiences that elicited a “wow” reaction from me when I first experienced them. One of those is Vercel – I wrote:

Vercel bundles several best practices for modern web projects, such as CI/CD, branch deploys, serverless functions, and edge-caching. Today, even for a personal web project, those features are awesome to have, but normally each of them add more complexity. I think it’s impressive the way Vercel has managed to combine all these features in such a surprisingly simple way.

The first time I used Vercel, I had a preconceived notion about the steps involved in deploying a modern web project. I was expecting to connect a Git repo, write a build script, configure deployment, decide where to host things, define edge-caching policies, etc. But after picking a framework and setting up the repo, I was done! I had one of those of course! moments when I realized that by running everything from builds to deployments to edge-caching, they don’t need any instructions from me.

This is a delightful design pattern that I’ve seen in several great low-code developer tools. It’s about identifying a set of features that complement each other so well that by bundling them, you can remove the intermediary complexity and create a simpler product. It reminds me of cancelling out factors in a mathematical expression: x/y * y becomes just x. By adding more functionality, some of the complexity cancels out, and the user experience as a whole becomes less complex. In this design pattern, more is less (hat tip).

In building Beneath, my co-founder Eric and I thought a lot about how to address the complexities of putting data science into production. We found it useful to ask ourselves, how can we make it our problem and not the user’s problem? That question helped us think more about adjacent steps in the workflow, and to see which features only exist because of upstream or downstream dependencies. Those are opportunities to cancel out complexity.

One of the things we did in Beneath was bundle a data streaming system and a data warehouse. Many data projects depend on both, since the former enables real-time data processing (e.g. for enrichment) and the latter enables fast SQL queries on historical data (e.g. for dashboards). Bundling both allows us to take over the complexity involved in synchronizing records, coordinating schemas, and more. In fact, we don’t even expose them as two different systems: to the user, they’re just one dataset that you can subscribe to in real-time or run fast SQL queries against.

In general, we’ve found there are a few important things to consider when attempting to cancel out complexity:

  1. The product should still solve the same problems. Ideally, bundling features to cancel out complexity should be a “free lunch” in terms of improving the user experience. But it’s easy to become too opinionated and end up with a product that is less versatile.
  2. There are other ways of dealing with complexity. It’s often simpler to tackle complex workflows by providing starter templates, step-by-step wizards, or “automation” features.
  3. It tends to require a lot more software engineering work. If it was easy, someone would probably already have done it! It might not be the best use of time.

If done right, not only can you make the user experience simpler, you can also make the domain more accessible to new users. To build websites with Vercel, you never have to learn about hosting or DevOps in the first place. We have Beneath users who don’t know exactly what a data warehouse is.

Let’s recap. The “more is less” design pattern is about identifying opportunities to bundle functionality in such a way that complexity cancels out and you can achieve a simpler user experience. If done right, it should be a “free lunch” in the sense that you get a better user experience without limiting the problems that the product solves. It comes with a greater engineering burden, but it can be a great opportunity to delight your users and empower more people to use your product.

© Benjamin Egelund-Müller 2021