Journal / Technical guide
What to check before taking over a legacy software system
What to inspect first in a working legacy system, when to build a test environment, and how to decide whether a rewrite is justified.
- legacy systems
- modernisation
- software takeover
- integration
The first step in taking over a legacy software system is neither reading every line of code nor recommending a new stack. Start by understanding the business outcome, the part of the system the change will touch, and the route back if it fails. The depth of the review should follow from those answers.
A one-line reporting correction and a module that will be developed over several years do not call for the same preparation. Applying a complete “ideal infrastructure” checklist to every job may look safe, but it can create cost and delay without reducing the risk that matters.
This checklist sets out the questions to ask, and the order in which to ask them, when improving a working legacy system.
1. Define the request before judging the technology
“The system is old” is not a problem statement. Find the concrete outcome the company needs:
- Is a new integration required?
- Is a report calculating the wrong result?
- Does the system keep going down?
- Will new modules be built over the coming months?
- Has the original developer stopped providing support?
If the request is small and clearly bounded, the initial review can focus on the area affected by that change. A full security review, dependency upgrade and containerisation project may have no bearing on the requested outcome.
The picture changes when sustained development is planned. Running the code away from production, preparing test data, defining the release path and establishing a rollback method then become real requirements.
2. Do not dismiss a working system with the word “legacy”
Software used over many years contains more than source code. It carries accumulated business rules, exceptions, reports and connections to other systems.
Rewrite estimates often count only the screens people can see. The work grows around less visible areas:
- migrating and validating historical data,
- comparing old and new report results,
- ERP, accounting and payment connections,
- scheduled background jobs,
- workflows users rely on but nobody has documented,
- acceptance testing and the production cutover.
Finishing the code for the new application does not mean it is ready to replace the old one.
3. Is there a backup, and can you genuinely roll back?
If work will happen in production, “we have backups” is not enough. At a minimum, establish the answers to these questions:
- When did the database backup last complete successfully?
- Is a copy held on another machine or storage service?
- Can the files and database be restored together?
- How do you return to the previous working code?
- Has restoration ever been tested?
Not every small change requires a full disaster-recovery exercise. Changing live data without understanding the way back is still an avoidable risk.
4. A legacy system is more than its web pages
Important work often happens where the browser cannot see it. Windows Task Scheduler, cron, queues, file transfers or requests from other applications may keep the system moving.
Investigate dependencies such as:
- scheduled jobs,
- ERP and accounting connections,
- supplier and marketplace data feeds,
- email, SMS, courier and payment services,
- files sent to or collected from other servers,
- external systems tied to a domain name or IP address.
An endpoint that appears unused in the code may be the only entry point for a nightly import.
5. Inspect logs and infrastructure as far as the request requires
Logs can reveal where a system is struggling before every code path has been read. Server resources, database connections and recent errors are especially useful when the complaint involves performance or downtime.
It is equally wrong to turn a request for one extra field into an unsolicited infrastructure audit. The technical review should be proportionate to the risk of the work.
A useful first split looks like this:
| Request | Initial focus |
|---|---|
| Small, bounded correction | Relevant code, data and rollback path |
| New integration | Data format, authentication, scheduled jobs and error handling |
| Continuous feature delivery | Local or test environment, version control, release and backup process |
| Performance or downtime | Server, database, logs, bottlenecks and monitoring |
| Full modernisation | All dependencies, data migration, acceptance testing and phased cutover |
6. Do not turn the test environment into the objective
Many legacy systems will not run on a new developer’s machine with one command. Dependencies may be missing, server settings may be old, and some connections may exist only in production.
Moving the entire application into containers and reproducing every dependency for a one-hour correction can take many times longer than the correction. The result may be technically attractive and commercially pointless.
If the system will be developed for months, testing every change in production soon becomes unacceptable. A test environment, representative data and a repeatable release process should then be among the early investments.
The useful question is not “Should there be a test environment?” It is “At what point do the risk and duration of the planned work justify that investment?”
7. Real example: a Classic ASP system running since 2007
A B2B sales system I took over ran on Classic ASP and MySQL. It was fully integrated with Netsis ERP, had processed orders for years and held a substantial collection of operational reports.
The request was to import supplier inventory through JSON. Microsoft’s Classic ASP documentation describes the platform running VBScript or JScript on the server and using COM components for additional capabilities. Classic ASP with VBScript has no built-in JSON parser, so an external parser or a custom COM/.NET component was required. The integration was therefore more laborious than it would have been in a current stack.
That inconvenience still did not justify rewriting the B2B platform. Reproducing years of reports, Netsis flows and observed production behaviour would have created a much larger testing and migration problem.
Once the integration was released, the company could display supplier inventory alongside the products held in its own warehouse. It could take orders for products before tying up cash in purchasing them. The working B2B system and ERP connection remained in place.
For the platform’s execution model, see Microsoft’s official Classic ASP overview. Its Windows Script Components documentation explains how components can be called from ASP pages.
8. How should you frame the rewrite decision?
The rewrite decision is less difficult than it is easy to rush.
Suppose a new module would take:
- one week in a current system,
- one month in the existing legacy system,
- two weeks to reproduce the current product faithfully on a new stack.
A rewrite may then be worth considering. The saving applies to today’s module and continues into later development.
The third estimate is where most comparisons break down. Even when developers believe they can rewrite a long-running application in two weeks, acceptance testing, data comparison and the user cutover may take months.
Compare the complete totals:
The cost of continuing on the existing system against new development + data migration + integration work + testing + cutover risk.
Using current technology is not a business outcome in itself. If a rewrite is proposed merely to create a larger project and a larger invoice, both parties are likely to lose.
9. What should a takeover deliver?
Every takeover does not end with the same type of report. Depending on the business need, the useful outcome may be one or more of the following:
- an integration released to production,
- a corrected and stabilised existing system,
- a test and release environment,
- reliable backups and monitoring,
- a prioritised modernisation roadmap,
- one module replaced in stages,
- a working portal or internal system.
I deliver this work through a fixed monthly retainer, rather than as a one-off project. The first call is free; once we agree to work together, review, planning, implementation and management all use the same monthly hours.
If your system still works but is getting harder to change, read about the legacy system takeover and modernisation service or book a free introductory call.