This post is part of an ongoing series on the books that I have read as part of my continual professional development (CPD). All of my CPD posts are available at the following link: Continual Professional Development
If you’ve read any of my other CPD blog posts then you’ll know that I’m always looking for wisdom from unexpected places. It’s easy to get caught up in the latest frameworks, languages, and architectural patterns, but true progress often comes from understanding fundamental principles and applying lessons from the past. Recently, I re-read Marianne Bellotti’s Kill It With Fire: Managing Aging Computer Systems and was struck by how profoundly its insights resonate with the challenges faced by technology leaders today.
This isn’t a book about technology per se; it’s a book about people, priorities, and the often-messy reality of maintaining systems that are critical to businesses, regardless of their age. It’s a bracingly honest look at the human side of technical debt, and offers a surprisingly optimistic path forward. I want to share some key takeaways, specifically geared toward team leaders, decision-makers, and those responsible for guiding technical strategy.
The People Puzzle: Modernization Isn’t Just Technical
Legacy modernizations are hard not because they are technically hard—the problems and the solutions are usually well understood—it’s the people side of the modernization effort that is hard. Getting the time and resources to actually implement the change, building an appetite for change to happen and keeping that momentum, managing the intra-organizational communication necessary to move a system that any number of other systems connect to or rely upon - those things are hard.
Bellotti hits the nail on the head. We often focus on the technical challenges (the refactoring, the migrations, the new infrastructure) and underestimate the significant effort required to manage the human element. Gaining buy-in from stakeholders, securing the necessary resources, and navigating internal politics are often the biggest hurdles.
This means effective leadership must extend beyond technical expertise. It requires strong communication skills, empathy, and the ability to build consensus. It’s about understanding why a system needs to change, and articulating that vision in a way that resonates with everyone involved. Simply presenting a technically superior solution isn’t enough; you need to demonstrate the value of that solution to the business.
The "Good Enough" Reality
We are horrified to discover that most people do not actually care how healthy a piece of technology is as long as it performs the function they need it to with a reasonable degree of accuracy in a timeframe that doesn’t exhaust their patience. In technology, "good enough" reigns supreme.
This is a critical point often missed. As technologists, we strive for elegance, efficiency, and maintainability. But users (and often, business stakeholders) primarily care about functionality and performance. This isn’t a criticism; it’s a reality.
Understanding this allows you to prioritize effectively. Not every system requires a complete overhaul. Sometimes, incremental improvements and targeted fixes are sufficient. Chasing perfection can be a costly and time-consuming endeavour, especially when the return on investment is minimal. Focus on delivering value, not on building the ‘perfect’ system.
The Looming Knowledge Gap
We are reaching a tipping point with legacy systems. The generation that built the oldest of them is gradually dying off, and we are piling more and more layers of society on top of these old, largely undocumented and unmaintained computer programs.
This is a ticking time bomb. The institutional knowledge of those who built and maintained these systems is disappearing. Without proper documentation and knowledge transfer, critical systems become increasingly fragile and difficult to maintain.
Proactive knowledge capture and succession planning are essential. Encourage documentation, peer programming, and knowledge sharing sessions. Invest in training programs to upskill the next generation of engineers. Ignoring this issue will lead to increased risk, higher maintenance costs, and potential system failures.
Even if your framework, library, or code is relatively new, disaster can strike. Just as Jon P. Smith; he has had to handover his open source work due to a debilitating illness.
Beyond Linear Thinking: The Trap of "New is Always Better"
The first mistake software engineers make with legacy modernization is assuming technical advancement is linear. With that frame of mind, anything built in older design patterns or with an older architectural philosophy is inferior to newer options. Improving the performance of an old system is just a matter of rearranging it into a new pattern.
And:
When people assume that technology advances in a linear fashion, they also assume that anything new is naturally more advanced and better than whatever they are currently running. Adopting new practices doesn’t necessarily make technology better, but doing so almost always makes technology more complicated, and more complicated technology is hard to maintain and ultimately more prone to failure.
It’s easy to fall into the trap of believing that the latest technology is always the best solution. However, simply rewriting a system in a new framework doesn’t automatically solve its problems. In fact, it can often introduce new ones.
A critical eye is needed. Evaluate the potential benefits of modernization against the costs and risks. Sometimes, a targeted refactor or optimization is more effective than a complete rewrite. Don’t adopt new technologies just for the sake of it; ensure they address a genuine business need and provide a clear return on investment.
Focus on Value, Not Technology
If we talk about what we’re doing in terms of technical choices, users’ needs get lost. The best way to find value is by focusing on their needs.
This is a reminder to keep the user at the centre of everything you do. Technology is a means to an end, not an end in itself. Before embarking on any modernization effort, clearly define the user needs and business objectives.
What problems are you trying to solve? What value will the changes deliver? Keep these questions top of mind throughout the entire process. By focusing on user needs, you can ensure that your efforts are aligned with the goals of the business.
Modernisation: Not Always Necessary
Old systems don’t need to be modernized simply because they are old. Lots of technology has not fundamentally changed in decades. Moving to the latest and greatest thing can sometimes cause more problems than it solves.
Just because something can be modernized doesn’t mean it should be. If a system is functioning reliably and meeting business needs, there may be no compelling reason to change it. The risk of introducing bugs, disrupting operations, and incurring unnecessary costs may outweigh any potential benefits. “If it ain’t broke, don’t fix it” isn’t just a cliché; it’s sound advice.
Understanding Before Acting
When you first take on a legacy system, you can’t possibly understand it well enough to make big changes right away.
This highlights the importance of thorough investigation before diving into any modernization effort. Take the time to understand the system’s architecture, dependencies, and data flows. Document your findings and share them with the team.
Avoid making sweeping changes without a clear understanding of the potential consequences. A phased approach, starting with small, incremental improvements, is often the most effective strategy.
Prioritize Stability: Stop the Bleeding First
A combat medic’s first job is to stop the bleeding, not order a bunch of X-rays and put together a diet and exercise plan. To be effective when you’re coming into a project that has already started, your role needs to adapt. First you need to stop the bleeding, and then you can do your analysis.
This is a powerful analogy. When inheriting a problematic legacy system, your immediate priority should be stabilization. Fix critical bugs, address performance bottlenecks, and prevent further degradation. Don’t get bogged down in long-term planning until the system is stable and reliable. This ‘stop the bleeding’ approach builds trust and creates a foundation for future improvements.
Backup and Disaster Recovery: A Non-Negotiable
Remember, if an organisation has never restored from a backup, it does not have working backups. Waiting for an actual outage to figure that out is not a safer strategy then running a failure drill at a time you’ve chosen, supervised by your most experienced engineers.
This is a simple but profoundly important reminder. Backups are useless if you can’t restore them. Regularly test your backup and disaster recovery procedures to ensure they are working effectively. Don’t wait for a catastrophic failure to discover that your backups are corrupted or incomplete.
Navigating the Complexities of Legacy and Modern Systems
Ultimately, Kill It With Fire reminds us that technology is a tool to serve human needs. Successfully managing aging systems – and embarking on modernization efforts – requires a holistic approach that considers not only the technical aspects but also the people, processes, and business objectives. It’s about making informed decisions, prioritizing effectively, and embracing a pragmatic mindset.
Are you facing challenges with legacy systems or planning a modernisation effort? I help businesses navigate these complexities, providing strategic technology consultation to ensure alignment with business goals and maximize return on investment.
Explore how we can work together to strengthen your team’s security posture here: https://rjj-software.co.uk/services/, or by using the contact form below.
