As the beginning of a new year often is concerned with looking forward, I thought I’d spend this article (and perhaps some more) on discussing some of the trends that I believe are happening. One of these trends, I believe, is self-improving systems.
Traditional software intensive systems are typically static after deployment. The performance levels that the system provides at the time of deployment will, by and large, be the performance of the system going forward. For instance, when you bought your most recent car, you didn’t really expect that the fuel efficiency of the car would improve over time.
Especially in online software, but increasingly also in the embedded systems world, we have moved or are moving towards DevOps. Using continuous deployment and collecting data back from the field for each version of the software that we release, we can use experimentation and techniques such as A/B testing to improve key performance indicators (KPIs) that we care about. Although this results in systems that are improving over time, it requires continuous involvement of the R&D team, including product managers, engineers and data scientists, to ideate improvement suggestions.
The next step would, of course, be to let a system experiment autonomously with the intent of improving its behaviour and KPIs. Together with David Issa Mattos, one of my PhD students, this is exactly what we are exploring. One of the avenues of our research is concerned with optimizing large parameter spaces. Most large, complex software-intensive systems have many parameters that can be set to a wide variety of different settings. In all cases that we have seen so far, there is actually no real understanding of the consequences of changing parameters beyond some basics.
We built a solution framework that, with minimal invasiveness, can be linked with the system that is to be optimized and using machine learning techniques, the system can automatically explore its multi-dimensional parameter space in a smart way to find the optimal combination of parameter settings for the desired priority of KPIs. In short, the system has become self-optimizing.
We have now validated the approach in domains ranging from e-commerce to telecommunications and it works amazingly well. Depending on the domain, we can tune how much risk the system takes when changing parameters, at what hours of the day the system can experiment and when it should not, etc.
For software-intensive systems, this approach allows for mass-optimization, where similar systems learn from each others findings, as well as for mass-customization, where every individual system optimizes itself for the specific context, user and relative priority of KPIs selected by the customer.
Concluding, as a general trend, we already today see many systems that are getting better over time, due to continuous deployment and experimentation. The next step will be where systems become self-improving and autonomously experiment with their functionality to improve their KPIs. Imagine a world where everything you own or use becomes better every day you use it!