Software Architecture · Cluster
Legacy Systems
Strangler patterns and incremental replacement.
- 01 Finding Seams in Legacy Code That Was Never Built to Have Them How object, link, and preprocessor seams let behaviour be substituted without editing the code under test, and what each kind of indirection costs at runtime and in maintenance.
- 02 Mapping Runtime Dependencies from Traffic and Query Logs Why static call graphs miss the dependencies that decide whether a legacy component can be removed, and how to reconstruct the real graph from query logs, flow records, and scheduler output.
- 03 Characterization Tests: Pinning Behaviour Nobody Designed How to write tests that describe what untested code currently does, why the oracle problem makes this different from normal testing, and where golden-master comparisons break down.
- 04 Routing Requests Between Old and New with a Strangler Facade How a routing layer in front of a legacy application lets capabilities move to a replacement one slice at a time, what the routing key must capture, and why session and data ownership decide the order.
- 05 Anti-Corruption Layers and the Cost of Model Translation What a translation boundary between a replacement system and a legacy one must handle beyond field renaming, where information is lost in the mapping, and when the layer is not worth its cost.
- 06 Dual Writes and the Divergence They Inevitably Produce Why writing to two stores from application code cannot be made atomic, how partial failure and reordering corrupt one side, and which log-based alternative removes the window.
- 07 Backfilling a New Store While the Old One Still Takes Writes How to copy historical rows into a replacement without a consistent cut, how keyset pagination and version guards handle concurrent updates, and what a reconciliation pass can and cannot prove.
- 08 Switching the Write Path: Cutover, Rollback, and the Point of No Return How to move writes to a replacement store without a window of two writers, what rollback actually requires after new-only data exists, and how to decide when reversal stops being possible.
- 09 Differential Testing Between a Legacy System and Its Replacement How to run old and new implementations on the same inputs, normalise what is legitimately different, and classify divergences without an external specification to appeal to.
- 10 Proving a Legacy Component Is Unused Before Deleting It Why an absence of observed traffic is not evidence of absence, how deliberate denial turns a guess into a measurement, and what must be checked before code and data are removed for good.