Our Client, a big company listed on the London Stock Exchange, retails groceries through a chain of supermarkets and an online home delivery service. The Company serves customers across the UK through approximately 500 stores and offers food and groceries, much of which it sources and processes through fully own manufacturing facilities (over 10 sites across Britain).
Our Client needs to maintain and support a legacy stack with minimal investment to ensure business continuity while introducing a new strategic solution. The Client also needed to continuously manage technical debt to support expected user experience. The biggest challenge here was to ensure uninterrupted business as usual using old, overdeveloped technology, where any change was to cause a minimal impact on the framework, and at the same time, to fulfil the desired user experience expectations.
To support business needs while the new solution was not available yet, we needed to manage a temporary setup. Introducing a new functionality meant dealing with complex dependencies and overwriting a block of 25 000 lines of live code with many exceptions in single procedure. Moreover, specialists capable of doing that are rare to come, as very few people are willing to work with outdated technologies.
Maintenance of old systems was also challenging. Environments required are no longer supported or even available. The whole process called for using environments that have to be set up on Virtual Machines. This draws additional resources and investments, while the goal of the whole operation is to minimise costs, so the reserves can be invested in a strategic solutions. Finally, technology limitations made applying modern practices like Continuous Integration and 1-click deployment very challenging.
With those constraints in mind, we were able to provide an Agile framework that ensures business continuity, continuously prepares the business for a sunset of the legacy stack and drives an integration with the new system. By providing “good enough” solutions, we minimise maintenance costs.
- Build: this team leverages the Client’s needs of new functionalities with the existing solution using Agile mind-set. They extend the legacy system by adding new functionalities and technical solutions that support business growth. The team helps the Client with their backlog management in accordance with the Client’s calendar.
- Run: this team uses Kanban to resolve all incoming issues. Full incident management is in place. Ticket management is based on P1 to P4 priority and SLAs are managed in accordance with the customer requirements. The team provides proactive and reactive support in their daily work. This means that on the top of the typical reactive support tasks, they also proactively perform preventive management with regular system health checks and database monitoring.
The legacy stack is a complex environment with multiple exceptions and loops. It also communicates with a mainframe, therefore every change we make has to be carefully planned and considered, so it establishes smooth business operations without causing errors.
To prepare the legacy system for a sunset, every change we make in key components is also an integration with the strategic solution. We gradually shift away from the legacy system, so that more and more information is processed by the new solution.
We integrate new components in the legacy system with the new system in three ways:
- An end user keeps using the legacy solution.
- The new and the old systems work in parallel until the legacy functionality can be switched off.
To address it, we make sure that:
- Only the Run team has access to the live code. This way, we are sure that the live code is changed only by people who know its complexity and dependencies by heart, therefore they will not introduce changes that might cause errors.
- 4-eye check for all development.
- Performing code reviews. Everything that the Build team creates, gets a review before it is uploaded.
- 24/7 support.
Integration maintenance requires a specific approach as well. Integrating two environments that are running in parallel, shrinks the maintenance window. The more integration we introduce, the more interdependencies we have to check, and the smaller the maintenance window gets. To enable smooth legacy sunset and to ensure consistency between the two systems until the legacy solution is obsolete, we routinely run operability testing and apply domino effects prevention techniques. Additionally, keeping the domain knowledge was challenging in such a setup. The induction process is long (e.g. six months), and it is problematic to replace people with domain knowledge. To address that, we have applied a following setup:
- We make it possible for our people to work with new technologies and to develop themselves. This does not affect our Client’s capacity.
- We encourage our people to rotate between Run and Build teams.
- We make sure our teams understand how important their work is to the Client.
- We also offer financial bonuses instead of the typical time in lieu solutions.
We effectively maintain the legacy stack with minimal financial effort, while allowing the business to grow. The old system is kept live until the new solution is up and running, and until the current system is ready to be decommissioned.