Reducing risk, eliminating complexity, and sequencing effectively

To truly maximize user value, you must collaborate on an effective plan to reduce risk. Photo by rawpixel.

With perfect information, an engineering design process can be pretty straightforward: you can focus on implementing functionality while minimizing engineering complexity and risk. But this gets a lot trickier when there are a lot of product uncertainties. How do you make an engineering plan when you don’t know how it will be used or extended? In these cases, you need to have a strong dialogue between product and engineering — healthy teams don’t silo each person, but have them work together as one team. Through this, you can plan to maximize user value through incremental releases, by minimizing product and engineering risk.

The most interesting types of engineering problems

At Asana, I’ve been the tech lead of a few different teams, and have seen first-hand that each team has its own joys and challenges in the engineering design process. For example, one team involved rewriting an unperformant feature to a new framework. This meant that the team had a well-defined product with little uncertainty, as the feature was already launched. In this team, we only solved engineering problems: e.g. how to write efficient queries, differences between our old and new frameworks that could impact the product, and how to build abstractions to harness the power of the feature.

My favorite kinds of teams involve much more product collaboration. When building powerful new features, there are many types* of risk at play — product and engineering are two of the most common — and you need to think of them all when planning a product engineering project. Product risk can be very dangerous: if you build the wrong feature, you might need to re-build the right feature afterwards. At best, this means wasting some time. At worst, this means building and maintaining two separate systems instead of one. This means the scope of problem solving changes completely, as an engineer needs to be a partner in the product process and think through both engineering and product tradeoffs.

In other words, be involved in all stages of the product process. Do this from the start, even before identifying the problem statement and initial hypotheses. You will be better equipped to think through product tradeoffs and be a good partner to your product manager. Similarly, a product manager should be a partner in the engineering process. They should understand where complexities or legacy technologies live, intuit which solutions are simpler, and so on. A successful collaboration results in a better product delivered with higher velocity.

* Some of the most common types of risk I’ve seen (see here for more):

How to approach these problems

Unfortunately, many engineers focus on an extreme when they see multiple types of risk. If there is large product risk, they’ll prototype to deliver value as fast as possible, which could harm their future viability. On the other side, they might over-abstract and focus too much on the long-term feature-set, risking added complexity and delaying when they deliver value. The ideal path forward is to be somewhere in the middle, and balance the product and engineering concerns.

If you’re at a product company, your ultimate goal is likely to deliver user value. There’s a lot to consider: what user benefit will you deliver, what risk will that have, when will the release occur, what engineering debt will you add, and so on. The danger is when these factors aren’t considered when planning a project. That likely happens when it’s assumed that someone else will consider the factors (i.e. the PM will think about product risk, and you, the engineer, only need to care about engineering planning).

Brief interlude: concretely modeling this

Bear with me for a moment, we’ll return in a minute — but it’s helpful to think of this from the perspective of economics. Suppose you have a project which you are developing an engineering plan for. You can deliver it all at once, or through a series of incremental releases. We want to maximize the expected value for hypothetical releases. If you squint a bit, we can model this the same way as risk-adjusted net present value in economics. We have a series of “releases” at different points of time, each with a different risk profile and net value. Since we prefer value as soon as possible, we “discount” the value based on when it will occur.

Where:

Ui represents the net value from release i. This combines a few factors: Ui=Vi-Di-Ci

ri represents the probability a release can happen to yield the value Ui. This models the risk of a release.

1/(1+d)^Δti represents the “discount factor

With this, we can model expected user value from a series of releases. While I’ve never calculated this explicitly, and this model is highly simplified, it lets us compare how each factor relates to one another and the overall plan.

Best practices to maximize value, with inspiration from the model

Through the teams and launches I’ve been a part of, I’ve gathered some learnings about maximizing value. These also are reflected in the simplistic model above.

On thinking through a release plan

On thinking about engineering design

On mitigating risk

Want to read more posts like this? Follow me on Medium!