None of these is exotic. Together they are the difference between a migration you can stop halfway through and a migration you cannot.
01
Strangler-fig routing
A routing layer in front of both systems; traffic moved path by path, old system still authoritative for everything else
The name comes from the strangler fig, which grows around a host tree, takes over its structure gradually, and only at the end leaves nothing of the original. In practice it means putting a routing layer in front of the old system — a proxy, a gateway, or a facade the callers already talk to — so that requests can be sent to either implementation without the caller knowing which answered. On day one it routes everything to the old system and changes nothing. Then one path at a time moves across. The old system is not modified to allow this; it is simply no longer the first thing the request reaches. What this buys you is the ability to move a single capability without coordinating a single other thing, and the ability to move it back.
Every change becomes a big-bang change, because there is no way to have half of the traffic on the new system. The date of the switchover becomes the date the whole programme succeeds or fails on, and no amount of testing beforehand makes that a comfortable date to stand behind.
02
Slicing by capability, not by table
Vertical slices bounded by a business capability, each with its own data, rules and interface, rather than horizontal cuts through the storage layer
The tempting first move is to replace the database, or the front end, or the reporting layer — a horizontal cut across the whole system. It is tempting because it looks tidy on a diagram. It is a trap, because a horizontal slice delivers nothing to the business until every other layer has caught up with it, so it cannot be tested by use and cannot be stopped halfway. A capability slice is vertical: goods-in receipting, or credit notes, or shift rostering, taken from the screen a person touches all the way down to the rows it writes. It is a smaller and messier piece of work, and it is the only kind that can be switched on by itself. The right unit is a thing a person in the business would name if you asked them what they do.
Nine months in you have a new data layer, a new API and no user who has done a day's work on the new system. Nothing has been proved by real traffic, and the first slice to go live goes live carrying every unexamined assumption made since the start.
03
Dual-run and parity checking
Both implementations process the same live input; the new one writes nothing; outputs are diffed field by field and the differences triaged
Dual-running means the new slice receives a copy of the real traffic the old system is handling, computes its answer, and is not allowed to act on it. The old system remains the one that writes the record, sends the email, releases the stock. Parity is the comparison of the two outputs — literally, whether the new answer matches the old one, field by field, across days of real volume rather than a test suite somebody wrote. Every mismatch is then triaged into one of three piles: the new system is wrong, the old system is wrong, or the two are both defensible and the business has to decide which it wants. That third pile is the valuable one, and it is where the undocumented decisions of fifteen years finally get written down. Dual-running is also how you discover the rounding rule from 2011 without anyone having to remember it.
You go live on a slice that passed its tests and find out from a customer that it disagrees with the old system in a way nobody anticipated. Confidence in the programme is spent in a single afternoon, and the next slice will be asked to justify itself for a quarter before anyone will let it near production.
04
Historical data migration with reconciliation
Backfill in dated batches, control totals per period, and a per-record reconciliation report the finance team signs rather than the engineers
Reconciliation means proving, in a document somebody outside the project can read, that what arrived equals what left. Not that the migration script ran without an error — that the ledger balance for March in the new system is the same number as the ledger balance for March in the old one, that the record counts agree period by period, and that every record which did not come across is on a named exceptions list with a reason against it. The output is a report a finance team can check line by line and put their name to, because they are the people who will be asked to explain a variance later, not the people who wrote the migration. Expect the exceptions list to be long at first and expect it to be interesting: it is usually where the genuinely broken historical data has been hiding, and it costs real weeks to work through.
The data is in the new system and nobody can attest that it is complete. That is a problem at year-end, when an auditor asks how you know, and it is a problem long before then, because the first person who finds a missing record will stop trusting every number on the screen — reasonably.
05
The cutover, and the rollback that must exist
A dated change of the routing rule for one slice, with a tested reverse path and a named person holding the decision to use it
Cutover is the moment a slice stops being a shadow and becomes the system of record: the routing rule changes, the new implementation writes for real, and the old path stops being called for that capability. Done this way it is a small event — one capability, one rule, one afternoon — and it happens many times over a programme rather than once. The part that is not optional is the rollback: a tested path back to the old implementation, exercised at least once before it is needed, with a clear statement of what happens to records created in the window between cutting over and rolling back. A rollback that has never been run is not a rollback, it is a hope. Name the person who is allowed to call it, and agree in advance what they are watching that would make them call it.
The switch happens, something is wrong, and the discussion becomes whether to spend the night fixing forward under pressure because going back was never built. That is how a controlled migration turns into an outage, and it is the failure mode that ends up in the trade press.