Software platforms by their very nature support multiple products. Typically, these products are used in different contexts and configurations. As a consequence, the platform has to offer variation points that allow each product and customer to use the platform in the way that best suits their purposes. Each variation point then has two or more variants that can be selected in that variation point or has configuration settings that allow the user of the platform to influence platform behavior. In addition, the platform often offers extension points where the product team or the customer can build custom extensions.
Although a simple and beautiful concept, it’s very easy to cause significant practical challenges. Most platforms I’ve been involved in have thousands, tens of thousands or even more than a hundred thousand variation points. There are several reasons for this. First, when a customer asks for a point of variation and it becomes part of a sales negotiation, it’s very tempting to accept the request and just carry the cost of introducing the variation point as part of the “cost of goods sold” line item. Second, product teams can easily demand that certain variation points be included as a precondition for getting or staying on the platform. Third, engineers are by their nature optimizers and identify, for each feature or functionality, the parameters that can be tuned. That often results in several variation points to be added for each feature in the platform.
When left unchecked, the number of variation points tends to explode. The resulting complexity is phenomenal and causes significant extraneous costs when adding features and when testing the platform. Many variation points have dependencies on other variation points, resulting in a combinatorial explosion of configurations that often cause post-deployment issues as it’s impossible to test all variations. Most companies only focus on the cost of introducing a variation point but fail to recognize the downstream cost for maintenance, testing and managing inter-dependencies.
One model that’s very helpful in controlling platform variability is the Three Layer Product Model (3LPM). It organizes functionality into a commodity layer, a differentiation layer and an innovation and experimentation layer. The rule of thumb is that we seek to keep innovative and experimentation functionality outside the platform until it has proven itself as being valuable. In the differentiation layer, we allow for value-adding variation points to be included, whether these are configuration parameters, variants or extension points, as we seek to maximize the value for the customers of the platform. Finally, in the commodity layer, we seek to actively reduce the number of variation points. This includes the refusal to add new variation points in that functionality but also the removal of variation points that have outlived their usefulness.
The largest contributor, in my experience, to unmanageable amounts of variation points is the absence of variation point removal efforts. Naively, one may easily assume that an existing variation point, once introduced, has no associated cost. In practice, however, for each variation point, a constant ‘tax’ is paid that has to be outweighed by the value generated for customers and the company. For commodity functionality, this value is often missing or significantly reduced. Consequently, as part of technical debt management, we need to continuously allocate resources for the removal of variation points that have outlived their usefulness.
The challenge with removing variation points, as well as features and other functionality, is that the company often doesn’t know whether they’re in use by customers. This is why instrumentation of the platform is so important. It allows us to make data-driven decisions on variation points as well as features that are no longer used. We can then proactively work with the few customers who are still using them to help them transition.
Platform variability needs to be carefully controlled as it leads to significant costs and many post-deployment quality issues due to the combinatorial explosion of inter-dependent variation points, variants, configuration parameters and extensions. Controlling platform variability has two main activities. First, the introduction of new variation points needs to be carefully evaluated and only focused on the differentiating functionality. Second, we need to proactively remove variation points that no longer provide sufficient business value. In many cases, the quote of Henry T. Ford provides the right answer: “You can have any color you want, as long as it’s black.”