The Rescue Sequence
The order matters more than the speed. Each step makes the next one safer, and skipping ahead to fixes or features is how a rescue turns into a second orphaned system.
- 1Secure everything first
Source code, server access, passwords, licenses, third-party accounts, domain and certificate renewals, and vendor contacts. Practitioner guides agree on this: collect it all before touching anything, because your leverage to get it fades fast.
- 2Source control and backups
If the code is not in version control, that is day one. Take a verified backup of the database and the server. From here on, every change is reversible.
- 3Map how the system behaves
Document what the system does in production: data flows, scheduled jobs, integrations, and the modules where bugs keep recurring. Fully internalizing a medium-to-large codebase takes months, but a working map takes weeks.
- 4Safety tests around what you will change
Characterization tests capture current behavior, quirks included, so a change cannot silently break what the business depends on. You do not need tests everywhere, only where you are about to operate.
- 5Stabilize the riskiest areas
Fix the recurring failures and fragile deployment steps before any feature work. Refactoring without a concrete goal becomes a bottomless pit, and practitioners warn against it for good reason.
- 6Then the roadmap
With the system stable and understood, you can choose with evidence in hand: keep maintaining it, modernize it incrementally, or rebuild specific modules. Our guide on modernizing legacy .NET without a risky rewrite covers that choice.
What a Working Map Contains
The map is the deliverable that outlasts the engagement. It does not need to describe every class. It needs to answer the questions someone will ask at two in the morning when something breaks.
Where each important piece of data enters, which tables it lands in, what transforms it, and where it leaves.
Every scheduled task, service, and connection to another system, with what happens to the business if it stops.
The modules where bugs recur and changes go wrong, found from the bug history and the commit history once the code is in source control.
The build and deployment steps as they really happen, including the manual ones, written down so a deploy no longer depends on memory.
Safety Tests, Explained
A characterization test records what the code does today, right or wrong, so you find out immediately when a change alters it.
You are not testing whether the behavior is correct. You are pinning it down. Feed the module its production inputs, capture what comes out, and turn that into an automated check. When you later change the module, the tests tell you exactly which behaviors moved, and you decide on purpose which of those were bugs and which were rules the business relies on. Put these tests around the code you are about to touch and the hotspots from the map, and leave the rest alone until you need it.
Why Not Just Rewrite It?
Because the undocumented system is full of edge cases that took years to accumulate, and a rewrite rediscovers them one at a time in production. Engineers who work in legacy systems keep reaching the same conclusion: a careful, incremental takeover beats burning it down. We routinely take over orphaned .NET and SQL Server systems, and getting one from takeover to stable is usually measured in weeks.
The system already encodes how the business works. A rescue keeps that knowledge; a rewrite bets on rediscovering it.
What You Have at the End
- Every credential, license, and account in your hands, with the code in source control and backups verified.
- A working map of data flows, jobs, integrations, hotspots, and deployment steps.
- Automated tests around the code most likely to break, so changes are safe to make.
- The recurring failures fixed and a deploy that works the same way every time.
- A roadmap with three options: maintain, modernize in stages, or rebuild specific modules.
- Understand Legacy Code: 7 practices for a successful code handover (secure access/passwords/licenses first; goal-oriented refactoring)
- Just Some Code: 8 Proven Steps to Take Over a Legacy Codebase (6-12 months to fully learn a medium-to-large codebase)
Keep Reading
Legacy application modernization services
How we plan and deliver the work end to end.
See the service GuideLegacy .NET modernization without a full rewrite
What to do once the system is stable: re-host, re-platform, rebuild, or replace.
Read the guide GuideReplacing an Access database with a web application
Moving Access data to SQL Server and the interface to the web.
Read the guideInherited a system nobody understands?
We reply within one business day, and the first conversation is always free.
Start the Conversation →