This summer, The Workshop’s Director of Architecture, Joaquín Guillén presented Continuous evolution: Using fitness functions to drive platform modernisation at Málaga’s J on the Beach conference. Below, he explores the power of evolutionary architecture and explains how The Workshop is integrating this approach.
Modernising software systems and products is always a big investment. Over the years, engineers have struggled to justify the associated costs – such as technical debt, code refactoring and tech refresh plans. Meanwhile, the lack of tools available to measure degradation makes it a challenge to explicitly identify when upgrades are needed.
At The Workshop, we’re determined to keep our products up-to-date. Over the past three years, we’ve developed a framework to help us measure software degradation – and we’re using this data as a touchpoint to make sure we’re constantly evolving.
The challenge of software evolution
Software systems naturally degrade over time. This isn’t because the software itself is deteriorating, but because it exists within a dynamic ecosystem. Its lifecycle is impacted by a whole host of external factors: changing business priorities, emerging technologies and new features that need to be integrated. As a result, many software products become more fragile – and less efficient – as time passes. Let’s consider a real-life example to illustrate the point, using the visuals below. Imagine a newly developed residential area. Let’s say a family builds a house and connects it to the sewage treatment plant using pipes (Figure 1.a). Initially, everything functions perfectly. But as the population of the area grows, the demand placed on these perfectly functional pipes increases, leading to issues like leaks (Figure 1.b). As more people arrive, the original pipes no longer serve their purpose and must be replaced with larger ones to accommodate demand (Figure 1.c). Plus, as technology advances, newer pipes made of different materials are introduced, requiring adjustments to the existing connections. Then, eco-friendly sewage enters the picture. New treatment plants are developed and, once again, the pipes’ connections need to be adapted to ensure compatibility with an updated infrastructure (Figure 1.d). This is a great example of a solution becoming less efficient over time, primarily due to external factors. Something that was initially perfectly suitable has to evolve in order to remain effective. This same principle applies to software products.Evolutionary architecture
In the software industry, evolutionary architecture is a technique aimed at solving these problems and ensuring our systems can age gracefully, meeting changing demands while staying relevant. The idea was initially introduced by Thoughtworks director and software architect Neal Ford. Alongside his co-authors Rebecca Parsons and Patrick Kua, Ford explained the core principles of the approach in the book Building Evolutionary Architectures: Support Constant Change. The main principles supporting evolutionary architecture are as follows:- Incremental change: Aligned with the principles of Agile software development, evolutionary architecture promotes making small incremental changes (instead of “big bang” changes), in order to reduce risk and enable smoother evolution.
- Fitness functions: These measure how changes are impacting the efficiency of a system, allowing us to measure its alignment to our overall goals. (Fitness functions may also fit into various categories based on context, e.g. atomic vs. holistic, automated vs. manual or triggered vs. continual.)
- Quality attributes: These are characteristics specific to a software system, and based on that system’s needs and purpose. (For an example, check out the attributes defined in ISO/IEC 25010:2011.)
The Workshop framework
At The Workshop, we carried out a detailed analysis of our products, taking into account the principles of evolutionary architecture alongside our particular challenges and operating environment. As a result, we decided to implement a framework for tackling software degradation that focused on four specific dimensions: quality, technology, security and maintainability. Our overall goal is to ensure that our products meet exceptional quality standards, use fit-for-purpose technologies, are resilient to security threats and can be maintained in line with our rigorous architecture and coding standards. With all this in mind, our next step was to define the exact fitness functions we wanted to use. In order to achieve a holistic view, we landed on the following four:- Quality index
- Technology alignment
- Security index
- Technical debt
Some areas for improvement
Our fitness function framework has been a game-changer for us, but we’re still committed to making it even better. We’ve already targeted a few specific areas for improvement:- Visualisation: We’re looking at incorporating visualisation tools, such as the Backstage development portal, to make sure the insights gained through the framework are easily accessible to our Product and Engineering teams. We also want to make use of traditional data analytics visualisation tools like Tableau for product stakeholders.
- Automation: Some metrics still require manual calculation. We want to automate these processes wherever possible, with a focus on improving adoption and ensuring fairness of the tool.
- Gathering feedback: Getting feedback from the teams using the tool is vital for refining the algorithms we use. We’re using this crucial feedback to determine the ideal balance of fitness function components when assessing the overall product score. We’re also eager to identify any additional elements that we should be considering in our metrics to enhance their accuracy and relevance.