Java to serverless, one endpoint at a time
Incremental replacement beats the big rewrite. The routing trick that let us retire a Java service without a cutover weekend.
The big rewrite fails the same way every time: weeks of parallel development, a cutover weekend, and a rollback plan nobody ever has to use because the old system never quite dies. We are replacing live mortgage-servicing components at Nationale-Nederlanden with serverless Node.js on AWS, and the rule that makes it survivable is simple — one endpoint at a time, never a system.
Route at the edge. Each endpoint moves behind the same public contract, so clients do not know or care which implementation answered. Old and new run side by side against the same traffic shape, which means every migration is one reviewable unit — and reversible by moving a route back.
Two things it buys that the rewrite cannot:
- Each endpoint ships on its own schedule. No integration freeze, no shared deadline for a system that has to keep serving loans while you work.
- The old system shrinks instead of being replaced. Every migrated endpoint retires a slice of the Java surface — and, eventually, the team's dependency on the people who can maintain it.
The migration is not the interesting part. Doing it without ever asking anyone for a maintenance window is.