A curated list of awesome resources and links about tackling legacy systems that gives hope.
Hi! My name is Markus Harrer. I created this repository to share a set of resources and links that I found valuable and inspiring while working with legacy systems. I hope that you'll like it, too!
Image source: Ancient scroll vector created by upklyak - www.freepik.com
Legacy Systems are systems that you might be too afraid of to change. But they are necessary because they make all the money for your company. Thus, developers often have to maintain these older systems whether they want or not.
Legacy systems have their own fascinations and challenges that can be much more interesting than just gluing together some frameworks in a green-field project. But the lack of knowledge about how to tackle legacy systems is a big problem. Most developers just learn how to create new systems initially and not how to maintain existing ones or even evolve those systems. This list tries to close these gaps.
- Books
- Blogs
- Articles
- Microsites
- Podcasts
- Talks
- Conferences
- Courses
- Lists of Tools
- Other Languages
- Learning Paths
- Related Awesome Lists
The resources are ordered alphabetically the first author's surname for books and articles or the name of the resource for all the other resources)
- Robert Annett: Working with Legacy Systems (2019) - Short book that gives you plenty of tips on what you can do with legacy systems.
- Len Bass, Paul Clements, Rick Kazman – Software Architecture in Practice (2021) - Although this book focuses on software architecture in general, I like the idea of "architectural tactics" that propose solutions you can choose to fulfill specific quality goals like "deployability," "performance," or "security." This book could be a valuable source for you when you want to improve your existing system.
- Marianne Bellotti: Kill It with Fire (2021) - A book that gives a fresh look at working with legacy systems. It contains plenty of tips to assess architectures and provides guidance as well as tips for keeping modernization plans on track.
- David Scott Bernstein: Beyond Legacy Code (2015) - A book focussing on the agile way of improving legacy code. It includes plenty of material regarding improving processes and tips for better collaboration, too. If you want to see how agile methodology fits into the area of legacy system modernization, this book is for you.
- Serge Demeyer, Stéphane Ducasse and Oscar Nierstrasz: Object-Oriented Reengineering Patterns (2003) - A book with plenty of patterns for tackling the challenges with legacy systems explained in great detail.
- Michael Feathers: Working Effectively with Legacy Code (2004) - The classic book that gives you hope for your old system with many small recipes for improving your old codebase.
- Jens Knodel, Matthias Naab: Pragmatic Evaluation of Software Architectures - Albeit a book about software architecture evaluation, it provides plenty of ideas on how to find architectural problems in your systems. I especially like the structured approach that guides you through different levels, starting at the business level and ending at the code level.
- Christine Koppelt, Markus Harrer, Gernot Starke, Benjamin Wolf, and Martin Otten (2021): Software Reviews - Identifying Risks and Problems in Software - A slim book that guides through the inventory of software systems including typical problems and questions to get to know the system.
- Maude Lemaire: Refactoring At Scale: Regaining Control of Your Codebase (2020) - This book guides you if you need to refactor larger, complex codebases by providing tips about the right team, tools, and mindset.
- Carola Lilienthal: Sustainable Software Architecture - Analyze and Reduce Technical Debt (2019) - On how to deal with eroded software architectures – and how they can be analyzed and improved with the help of elements from cognitive psychology in a tool-supported way.
- Sam Newman: Monolith to Microservices - Evolutionary Patterns to Transform Your Monolith (2019) - Shows various decomposition patterns for incrementally moving functionality out of a monolith. Focuses on microservices, but can also be used if you plan to split one application into several modules or systems (incl. the data).
- Pini Reznik, Jamie Dobson, Michelle Gienow: Cloud Native Transformation - Practical Patterns for Innovation (2019) - Albeit focussing on cloud native development, the book provides many patterns that you can also use in the classic on-premises world to get your software and team organization fit for the future.
- Christoph Stock: IT Rescue Guide - Strategies for IT Rescue Operations and Technical Debt Reduction (2023) - A slim book about the modernization of software systems. Particularly beneficial are the many pitfalls that are pointed out, creating a realistic picture of the modernization of applications for the reader. Numerous, practical tips make the book particularly exciting for newcomers to the subject.
- Girish Suryanarayana, Ganesh Samarthyam, Tushar Sharma: Refactoring for Software Design Smells, Managing Technical Debt (2014) - Presents a comprehensive catalog of 25 design smells, their role in identifying design issues, and potential refactoring solutions. Includes illustrative examples and anecdotes drawn from the trenches of real-world projects.
- Philippe Bourgau's XP Coaching Blog: Refactoring Code and Orgs to a Sustainable Pace - Offers strategies for refactoring both code and organizational structures to achieve a sustainable development pace.
- Nicolas Carlo: Understand Legacy Code: Change Messy Software Without Breaking It - Practical advice and techniques to manage and refactor legacy codebases safely.
- Markus Harrer: About Legacy Systems, Software Analytics and the Fundamental Problems of Software Engineering - Delves into the challenges of legacy systems and software analytics, providing practical advice on software engineering, system modernization, and data-driven decision-making.
- Peter Morlion: Helping companies tackle legacy code, and other software development musings - Provides insights and strategies for tackling legacy code and improving software development practices.
- Erich Eichinger: Heuristics for Identifying Service Boundaries (2018) - Practical guidelines to help break down large systems into smaller, manageable services by considering domains, process flows, data locality, organizational boundaries, and more.
- Markus Harrer: 17 actions you can take to move your legacy system forward (2021) - A Twitter thread that lists plenty of options you have when you want to do something with your legacy system.
- Torsten Mandry: Visualizing the progress of a refactoring into a hexagonal architecture using jQAssistant - Tracking long-term architectural refactorings with architecture management tools. Nice application using constraints / rule violations to track the desired and current architecture style differences.
- Matthew Skelton, Manuel Pais: Independent Service Heuristics (2020) - A checklist with valuable insights to evaluate whether your system's modularization ideas make possible sense.
- Nick Tune: Legacy Architecture Modernisation With Strategic Domain-Driven Design (2020) - A braindump that brings several methods for different legacy system modernization tasks together into one framework.
- Mathias Verraes: The Legacy Mirror Heuristic (2021) - A great decision-making method that helps evaluate new ideas by imagining if the new idea were the established norm and the old idea were the new proposal.
- Architecture Antipatterns - An anti-pattern library featuring common pitfalls encountered when approaching software architecture the wrong way, including tips on how to avoid creating the next legacy system monster.
- Architecture Improvement Method aim42 - A collection of practices and patterns to support software evolution, modernization, maintenance, migration, and improvement of software systems. (transparency hint: the maintainer is one of the authors of this list).
- Cloud Native Transformation Patterns: Tools for creating effective Cloud Native architecture – and remaking the way we work - Collection of patterns on different levels (strategy, development, operations etc.) that show many ideas what one can do with existing applications that should be moved to the cloud. Many of the patterns work also for non-cloud environments.
- Divio's Documentation System - Outlines best practices for organizing different types of documentation and provides clear guidelines to help distinguish between various documentation categories, enhancing clarity and usability.
- Open Practice Library - A collection of methods and practices that go beyond software modernization, but could be helpful if you're not only facing problems within software systems.
- Patterns of Legacy Displacement: Effective modernization of legacy software systems - A collection of procedures, patterns and experience reports around the piecemeal replacement of legacy systems.
- Henning Schwentner: Domain-Driven Refactorings - A set of refactoring patterns and step-by-step instructions to help restructure existing codebases to better align with the concepts of a business domain.
- legacycode.rocks - A podcast (and community) created by Andrea Goulet and M. Scott Ford from Corgibytes about the world of modernizing existing software applications.
- maintainable.fm - A podcast by Robby Russell interviewing seasoned practitioners that know how to work with technical debt and legacy code.
Podcast Episodes
- Grady Booch: Nine Things You Can Do with Old Software @ IEEE Software's On Architecture Podcast (2008) - What you "can do intentionally with legacy code, from abandonment to evolution and many things in between" (taken from the podcast episode's description).
- Andrea Goulet: Learning to love Legacy Code with Andrea Goulet from CorgiBytes @ Hanselminutes Podcast by Scott Hanselman (2016)
- Gernot Starke: aim42 with Gernot Starke @ Conversations about Software Engineering (2017)
- Dave Thomas: SE-Radio Episode 242: Innovating Legacy Systems @ Software Engineering Radio (2015)
- Dylan Beattie: Ctrl-Alt-Del - Learning to Love Legacy Code @ NDC2019
- Marianne Bellotti: Future Proofing Systems @ MLH Fellowship 2020
- Philippe Bourgau: Live Legacy Code Refactoring with the Golden Master (2020) - By applying the Golden Master technique and the Mikado Method, Philippe shows you two tools that can help you to restructure your code without getting lost.
- Colin Breck: Using Quality Views to Tackle Tech Debt at Tesla @ QCon2017 - Colin Breck created a view of software qualities (or the absence from it) for bigger software systems to create more awareness for fixing technical debt.
- Eric Evans: Strategic Design @ Øredev 2015 - Eric Evans shares his view towards a more business-driven approach to rewrites (links to a blog post because video is not public yet).
- Dave Farley: From Legacy Code To STATE OF THE ART DEVELOPMENT @ Continuous Delivery YouTube Channel (2023) - Dave is a Continous Delivery advocate. In this video, he addresses the options you might take if you don't start developing a software system from scract / on the green field: Refactor, improve feedback cycles, introduce testing and automate deployment!
- Michael Feathers: Strategic Code Deletion @ QCon 2017 - Michael Feathers explains how to make sure features work well and how to get rid of unimportant code.
- Andrea Goulet: Putting the Right Developers on the Right Projects @ DC FULL STACK 2017
- Gregor Hohpe: The architect elevator - Connecting IT and the boardroom @ AWS re:Invent 2021 - A talk about connecting the different needs of different stakeholders of different layers of an organization. Great insights into how to motivate and translate modernization ideas from the engine room to something people in the penthouse can understand and work with.
- Sabrina Leandro: How to rewrite, a bit at a time @ DDD Europe 2019
- Maude Lemaire: How to get away with refactoring @ LeadDevAustin 2018
- Sandro Mancuso: Software Modernization: A strategic approach @ Trendyol Tech Meetup 2021
- M. Scott Ford: Keynote about celebrating software maintenance @ MenderCon 2020 - A dense overview of the world of legacy system modernization with many great inspirations for software maintainers.
- Sam Newman: Monolith Decomposition Patterns @ NDC Oslo 2019
- Gernot Starke: Improving Your Software @ GOTO 2016
- Jesse Toth: Easy rewrites with ruby and science! @ RubyConf 2014 - A story told about rewriting the permission system at GitHub, a big, mission-critical part of the whole platform.
- MenderCon - A full-day virtual conference (and unconference) about modernizing and improving software systems.
- The Legacy of SoCraTes - An irregular online conference where speakers share their insights on how to approach legacy systems in a successful way. Plenty of talks from various directions make this resource valuable for people tackling legacy systems.
- iSAQB IMPROVE - Evolution and Improvement of Software Architectures (commercial offering) - A three-day workshop on addressing problems in legacy systems at the architecture, design, and code levels.
- M. Scott Ford: Agile Software Development - Dealing with Legacy Code and Technical Debt (commercial offering)
There are plenty of tools out there that can help you with your legacy systems. This section lists existing lists so that you can find your tool that fit to your specific needs:
- Analysis-Tools.dev - Static analysis tools for many programming languages, build tools, config files and more.
- Awesome Open Source - Profilers - Tools for in-depth runtime analysis.
- OpenAPM - Lists various Application Performance Management tools that can help you to find performance problems.
- Sandra Parsick: maintenance-talk - A talk on how to tackle maintenance hell, including a list of valuable tools to rid of it.
This list focusses on contant in English. But there is also content out there in other languages.
- German: Großartige Bestandssysteme - Eine kuratierte Liste mit großartigen Ressourcen und Links zum Umgang mit Altsystemen, die Hoffnung macht.
There is so much to learn as a software developer that wants to improve legacy systems and code. Here you can find some personal recommendations from others:
Social: markusharrer.de
Background: Java developer, software evolutionist, software development analyst, CDO (Code Deletion Officer)
- Marianne Bellotti: Kill It with Fire
- Michael Feathers: Working Effectively with Legacy Code
- legacycode.rocks Podcast
- Serge Demeyer, Stéphane Ducasse and Oscar Nierstrasz: Object-Oriented Reengineering Patterns
- Architecture Improvement Method aim42
This section lists other awesome lists in the area of legacy systems.
- Awesome Legacy Code - A curated list of legacy systems with publicly available source code.
- Awesome Modernization - Awesome legacy system modernization tools. (partly in Chinese)
- Awesome Software Analytics - A curated list of awesome resources and links about Software Analytics – a discipline that tries to analyze software data to get ideas about improving legacy systems.
- Awesome Technical Debt - a curated list of Technical Debt talks, articles, and books. (there might be some overlaps with this list)
Did you like this list? Contributions are very welcome! Read the contribution guidelines first and add your ideas!