Where should application modernization start? Map the transition before the rewrite

Age alone does not justify changing a system. If its functions are stable, demand for change is low, and operating cost is predictable, leaving it alone may be the better decision. A newer stack can still be a modernization candidate when small changes take weeks, every deployment shakes the whole service, and incidents cannot be traced.
Legacy describes a condition, not a birthday: the cost of change is constraining the business. That makes Kubernetes or microservices the wrong starting point. The first task is to rediscover what moves together whenever the system changes.
Modernization starts by choosing the unit of change
Cloud migration, modernization, and a full rewrite can overlap, but they are not synonyms.
| Approach | What changes | When it fits | What can remain |
|---|---|---|---|
| Migration or rehost | Runtime location and infrastructure | A data-center exit or fast move comes first | Code and data coupling, plus delivery bottlenecks |
| Replatform | Runtime, database, messaging, or another operating foundation | Reduce operating work while limiting code changes | Fundamental application constraints |
| Refactor | Internal code and module boundaries | Functionality is sound, but change speed and testability are poor | Wider structural limits can keep expanding the scope |
| Rearchitect | Service, data, and integration boundaries | The current design blocks scale or independent delivery | Parallel operation and data transition cost more |
| Rewrite | The implementation as a whole | Little of the implementation is worth preserving and equivalence can be proven | Hidden rules and exceptions are easy to miss |
Microsoft places replatform, refactor, and rearchitect on a continuum of complexity and value, and recommends mixing them by component.1 Forcing one strategy across a program rebuilds code that already works or hides a structural bottleneck behind a platform move.
Assessment goes beyond a source-code inventory
A repository and server list will miss many of the connections that make change risky. Data ownership, batch jobs, external institutions, identity policy, manual deployment, and human approval paths often hold the real dependencies.
AWS assesses modernization readiness through five lenses: strategic or business fit, functional adequacy, technical adequacy, financial fit, and digital readiness.2 Translated into operational questions, they look like this.
| Lens | Question | Evidence to preserve |
|---|---|---|
| Business | Does this function still matter to revenue, operations, or compliance | Function owner, critical periods, tolerated interruption |
| Functional | Which features are used, and which have faded away | User flows, call volume, exception catalogue |
| Technical | What builds, deploys, and fails together | Runtime dependencies, call graph, deployment and incident history |
| Financial | Where do current run and change costs originate | Infrastructure, licences, manual work, and waiting time |
| Readiness | Do testing, observability, automation, and ownership exist | Regression tests, logs, metrics, traces, teams, and approval paths |
When documentation is gone, the running system becomes the source. Trace traffic, logs, delivery configuration, database schemas, and batch schedules to reconstruct real dependencies. Designing the target first merely postpones discovery until the transition is already under way.
One treatment does not fit every component
AWS portfolio guidance classifies applications with the 7 Rs, then combines that choice with dependencies and technical complexity to form migration waves.3 The same discipline helps a modernization program record the reason for each decision before technology fashion takes over.
| Choice | Decision test | Typical next state |
|---|---|---|
| Retain | Stable, with little demand for change | Keep it; improve only observability and security baselines |
| Retire | No meaningful use or business value remains | Stop calls, retain required data, end contracts and resources |
| Replace | Commodity capability with little reason to own it | Move to SaaS or a managed product; retain an integration adapter |
| Rehost or relocate | A facility or account move must happen quickly | Move the runtime and separate modernization into a later wave |
| Replatform | Runtime operations, not code, form the constraint | Move to a managed database, containers, or PaaS |
| Refactor or rearchitect | Coupling and data boundaries block change | Separate modules and APIs, introduce asynchronous flow and independent delivery |
A decision record needs more than the choice. Record why it is right now and what would trigger another review. Retain does not mean retain forever, and rehost does not mean modernization is complete.
The transitional architecture matters as much as the target
Architecture packs often show two diagrams: current and target. Delivery needs the pages between them. Design for the period when old and new modules both receive requests, the source of truth still lives in the legacy store, and a new API translates an older integration contract.
A transitional architecture should define at least four things.
- The point that routes each request to the old or new path
- The source of truth and the direction of replication and reconciliation
- The compatibility layer between old and new interfaces
- The last safe point from which the change can be reversed
The target explains direction; the transitional state keeps the service alive. Give each intermediate state an exit condition and a maximum lifetime, or temporary duplication becomes the next legacy system.
Cut waves by value, dependency, and recoverability
“Start with low risk” is incomplete. Moving only an easy internal tool does not test assumptions around the core system. The first wave should matter to the business while keeping the blast radius controllable. Microsoft likewise recommends small modernization phases with success criteria and rollback procedures for each phase.1
| Wave | Purpose | Exit gate |
|---|---|---|
| 0. Baseline | Establish tests, observability, and repeatable delivery | Critical user flows and performance, failure, and delivery metrics are reproducible |
| 1. Prove a boundary | Separate one real function with relatively low coupling | Functional equivalence, data integrity, independent delivery, and rollback are proven |
| 2. Expand the flow | Widen related functions and API or event boundaries | Failures stay within the boundary and old/new calls remain traceable |
| 3. Move the data | Shift the source of truth and write path into the new boundary | Reconciliation passes, with a clear recovery point and owner |
| 4. Retire | Remove remaining traffic, jobs, and accounts | The observation period passes and legacy cost and access paths are closed |
Each wave is a hypothesis test, not a calendar milestone. “The new service is running” is weaker than “it produces equivalent outcomes and can recover within the agreed time when it fails.”
Data cutover is not the last task
Two code versions can run side by side. Data still needs one truth at each point in the transition. Data strategy must therefore begin with boundary design, not near the end of the program.
Read replicas, change data capture, dual writes, and batch migration fail in different ways. Dual writes, in particular, create inconsistency when one store succeeds and the other fails unless the recovery rule is explicit. Decide these points first.
- Which store is authoritative in each phase
- How missing, duplicate, and out-of-order changes are reconciled
- Whether schema changes remain safe for both application versions
- How far new writes can be reversed during rollback
- Who approves retention and deletion of personal or audited data
Do not assume replication lag is zero. Measure it and define an acceptable range. A cutover plan needs reconciliation queries, owners, stop conditions, and post-recovery checks alongside the traffic switch.
Measure changed delivery, not a newer stack
Container count and microservice count are not modernization outcomes. Establish a baseline for the current change flow, then compare the same application before and after each wave.
DORA now describes software delivery performance with five measures: change lead time, deployment frequency, failed deployment recovery time, change fail rate, and deployment rework rate.4 Add service-level objectives, infrastructure and licence costs, manual approval steps, and incident blast radius to see whether modernization changed operations.
One improving number can hide another cost. More frequent deployment with rising failure and rework is not a clear win. Lower spend with slower recovery moves operational risk into the next quarter. Speed, stability, and cost belong on one scorecard.
Modernization succeeds when the next change gets easier
We documented one monolith split into infrastructure, database, API, and frontend layers, then moved to NKS and GitOps in From a monolith to NKS. Kubernetes was not the core outcome. The work made change points and responsibilities visible again.
A new technical structure does not finish the job. When no one owns the next wave, the improvement backlog slips behind daily operations. Why structural improvement loses an owner covers that ownership gap across assessment, migration, and rearchitecture.
The best sign of completed modernization is not a technology name. It is a system where the team can explain the blast radius of a small change, deploy during a normal weekday, reverse a problem through a known procedure, and leave an architecture the next team can read.
Application Modernization covers assessment and hands-on phased transformation of legacy systems. Cloud & Infrastructure builds the operating foundation, while Product Engineering carries new user-facing products to launch.
References
Sources & notes4ExpandCollapse
Footnotes
-
Microsoft Cloud Adoption Framework, Plan your cloud modernization. It covers replatform, refactor, and rearchitect choices, phased modernization, parallel deployment, and rollback planning. ↩ ↩2
-
AWS Prescriptive Guidance, Readiness assessment process. It defines the five assessment lenses and the expected modernization blueprint. ↩
-
AWS Prescriptive Guidance, Detailed portfolio discovery. It combines 7R classification with dependencies and technical complexity to form migration waves. ↩
-
DORA, Software delivery performance metrics, updated 5 January 2026. It defines five measures across change throughput and instability. ↩

