You are reimplementing a legacy capability. What does running old and new in parallel find that testing cannot?
Show the full answer Hide the answer
What is being tested
Whether you know how to recover requirements that exist nowhere except in a running system.
What it finds
Undocumented behaviour. Send production traffic to both systems, serve the old result, and log every difference.
The requirements for a legacy system exist only in its behaviour — including behaviour nobody intended, edge cases accumulated over decades, and rules that some customer now depends on. No specification contains them, no test suite covers them, and the people who knew have left.
A parallel run surfaces them systematically, and it will find dozens of cases on any substantial capability.
How to run it
- Read paths first, where serving the old result makes the comparison risk-free.
- Log the difference with enough context to reproduce it — inputs, both outputs, the identifiers.
- Run long enough to cover the cycle: month-end, quarter-end, the seasonal case, the batch boundary. A week of comparison misses everything periodic.
- Sample if volume demands it, but keep 100% of differences.
The step people forget
Budget time to triage the differences.
Some are bugs in the new implementation — fix those. But some are bugs in the legacy system that you should not replicate, and some are behaviour that is intentional but surprising.
Deciding which is which is a business conversation, not an engineering one, and it is the part that consumes the time. A parallel run that generates 300 differences and no triage capacity produces a backlog nobody acts on.
For write paths
Harder, because you cannot execute both. Options: run the new implementation in shadow mode computing what it would have done and comparing; or run both against a copy of the data and reconcile. Both are more work and both are worth it for anything consequential.
Why it beats testing
Tests verify the behaviour you thought of. A parallel run verifies the behaviour that actually occurs, against the only specification that exists — which is precisely the gap that makes legacy replacement risky.