01
Establish the baseline
Inventory users, business criticality, interfaces, data, dependencies, deployment process, incidents, performance, security exposure, recovery behavior, cost, and team ownership. Measure the constraint that prompted the work. Examples include release lead time, change failure rate, recovery time, peak response time, infrastructure effort, unsupported runtime risk, and unit cost. Release lead time: Time from approved change to live release, from deployment records. Change failure rate: Releases linked to incidents or rollbacks, over a fixed period. Recovery time: Detection to restoration, from incident records. Peak response time: 95th percentile from load tests or application performance monitoring. Infrastructure effort: Runbook hours, tickets, and on-call load per month. Unit cost: Monthly run cost divided by transactions, orders, or active users. Collect each measure over a defined window with a fixed definition, and reuse the same definition after the change. A baseline gathered from memory, or from a different quarter than the comparison, produces a result the team cannot defend. Set the window to cover a full business cycle. Month-end, festival-season, or fiscal-close peaks often drive the constraints that matter. Interview the people who operate and support the application. Architecture documents often miss manual jobs, scheduled extracts, local scripts, certificate renewals, reporting dependencies, and recovery steps. Compare the stated design with logs, network flows, deployment records, and incident history. Classify each dependency by owner, protocol, data, service expectation, failure effect, and replacement difficulty. This map determines which components can move together and which need a temporary compatibility path.
02
Score and sequence the work
Treat each application or component as a separate decision on two axes: the value of changing it and the risk of changing it. Value comes from the baseline measures. Risk comes from dependency count, data volume, test coverage, team familiarity, and the cost of a failed cutover. Sequence the work in waves. A first wave should prove the target platform, the deployment pattern, and the measurement method on a bounded component with tolerant users. Later waves repeat the pattern on harder components. Respect business freeze periods, audit windows, and peak seasons when scheduling waves. Record the dependency order explicitly. A component that forty others call cannot move before its interface contract is stable. A shared database can force several components into the same wave whether the plan wants that or not.
03
Choose a treatment for each component
One application can need several treatments. Apply the smallest change that meets the target and risk boundary. Rehost fits when the pressure is a facility or a deadline, such as a data-center exit. Its limit is honesty: it moves the same operating problems to a new address. Plan it as a relocation, with a follow-on decision about further change. Replatform fits when a managed service removes real toil, such as moving a self-managed database to a managed one. Verify version parity, feature gaps, connection behavior, and the failover model before committing. A managed service that behaves differently under failure can create a new incident class. Refactor only against a measured target, such as a deployment process that cannot meet the required frequency or a module that produces most defects. Without tests that pin current behavior, a refactor becomes a rewrite with unknown scope. Replace when a product meets the requirement better than the custom system and the exit terms are acceptable. Run a fit-gap analysis against real workflows, including reporting, access control, and data retention. Price the data migration and the integration work, not the license alone. Retire when usage evidence shows the capability is dead. Confirm with access logs and owner interviews, then remove the code, jobs, credentials, and infrastructure. Retain: Stable, low-change system; Risk accumulates silently. Rehost: Facility exit or deadline; Same problems, new location. Replatform: Managed service removes toil; Behavior differences under failure. Refactor: Measured structural constraint; Scope growth without tests. Replace: Strong product fit; Hidden migration and integration cost. Retire: No measured use; An unknown dependency breaks.
- Retain: Keep a component that meets its need and has manageable risk.
- Rehost: Move it with limited application change.
- Replatform: Adopt managed infrastructure or runtime features with bounded code change.
- Refactor: Change internal structure to improve a defined property.
- Replace: Move to a product or service that meets the requirement.
- Retire: Remove unused capability and its operating burden.
04
Create migration seams
Use stable interfaces, routing rules, data replication, or event boundaries to move one function at a time. A strangler-style migration can reduce cutover scope when the old and new paths can run together safely. Routing seam: Old and new paths can serve the same requests; The router becomes a critical dependency. Interface seam: A stable API hides which system answers; Contract drift between implementations. Data replication seam: Reads can move while writes stay; Replication lag and conflict handling. Event seam: Consumers can subscribe to either producer; Duplicate or out-of-order events. Shared data makes staged migration difficult. Define system-of-record ownership, write behavior, reconciliation, and rollback before moving traffic. Avoid uncontrolled dual writes. Dual writes without a single-writer rule produce silent divergence: one write succeeds, the other fails, and no reconciliation job exists to notice. Prefer one writer per stage, with change capture or replication feeding the other side. When dual writes are unavoidable, make consumers idempotent and reconcile with counts, sums, and sampled field comparisons. Use a seam only when it can be observed. Record traffic by old and new path, compare important outputs, and define the condition for increasing or reducing traffic. A routing layer without decision measures can hide two failing systems instead of reducing risk. When data must move, define the initial load, ongoing change capture, late changes, deletes, schema changes, and final reconciliation. Decide which system accepts writes during each stage. Keep one authoritative path at every point.
05
Plan the data migration
Data migration needs its own plan inside every staged move. Define the initial bulk load, the ongoing change feed, the catch-up window at cutover, and the final reconciliation. Change data capture (CDC) reads committed changes from the source log and applies them to the target in order, keeping the target current while the source still serves traffic. Handle the difficult records explicitly. Late-arriving changes, deletes, schema changes during the migration window, and rows rejected by target validation each need a rule and an owner. Decide how long the window stays open and what closes it. Validate with evidence, not sampling alone. Compare row counts and aggregate checksums per table, then run field-level comparisons on a sample that includes the largest, oldest, and most recently changed records. Record the variance and the agreed threshold that permits cutover. Define the rollback data path before cutover. If the new system accepts writes and then rolls back, those changes need a route back to the old system, or the plan must declare a data boundary. A rollback that silently discards new transactions is a business decision, and the business owner should make it knowingly.
06
Build the operating platform
Standardize identity, secrets, deployment, logging, metrics, tracing, vulnerability handling, backup, recovery, and cost allocation. A new runtime without these controls moves the same operating problem. Create paved deployment and service patterns for common components. Teams should know how to obtain an identity, expose a service, store a secret, emit logs and traces, set service objectives, and request support. Keep the pattern small enough that teams use it. Size the platform to the portfolio. A program migrating three applications does not need the platform of a program migrating three hundred. Build the paved-path items that the first wave uses, and add the rest when a second team needs them. Tag resources for cost allocation from the first deployment, so migration cost is visible per application rather than blended into one account total. Test the support path before migration traffic arrives. Dashboards, alerts, runbooks, on-call ownership, and rollback permissions need to work in the target environment.
07
Rehearse the cutover
Test representative load, dependency failure, data reconciliation, rollback, and recovery. Define go or no-go measures and decision owners. Keep the old path only for the agreed rollback window, then remove it through a controlled change. Data reconciliation: Variance below the agreed threshold. Rehearsal load: Peak response time within target. Rollback drill: Completed inside the safe window. Support readiness: Runbooks tested and on-call staffed. Business approval: Named owner accepts the residual risk. Write the cutover as a timed sequence with prerequisites, commands or changes, expected observations, stop conditions, and named owners. Rehearse it with representative data. Measure how long each step takes and set the latest point at which rollback remains safe. Run at least one rehearsal that fails on purpose. A team that has never executed the rollback path under time pressure does not know how long it takes. Communicate the user and support effect. Define the status channel, escalation path, and post-release observation period. A technically successful change can still fail if users cannot complete the workflow or support teams cannot diagnose it.
08
Failure modes and lessons
Modernization programs fail more often from sequencing and evidence gaps than from any single technology choice. The recurring failure modes are predictable: Each failure has the same shape: a decision was deferred until it became an incident. The controls in this guide exist to force those decisions early, while they are still inexpensive.
- A big-bang cutover with no rehearsal and no rollback drill.
- Dual-running old and new systems with no decision rule, so cost doubles and nobody exits.
- Retiring the old path too early, or never retiring it at all.
- Interface contracts drifting while the migration runs for months.
- Declaring success at go-live and never measuring the steady state.
- Discovering data quality problems during the load instead of during the assessment.
09
Retire the old system
Retirement is part of modernization. Remove traffic, scheduled work, credentials, certificates, data copies, monitoring, support contracts, and infrastructure only after the retention and rollback window closes. Archive the evidence required for audit or recovery. Update diagrams, inventories, cost allocation, incident paths, and ownership. An old component that remains reachable can preserve security and operating risk long after its business use ended. Schedule the retirement review at cutover, with a date and an owner. Work without a scheduled end rarely ends.
10
Measure after release
Compare the new system with the baseline. Review reliability, performance, deployment behavior, security findings, team effort, and unit cost. Some costs rise during migration because both paths run. Record temporary and steady-state cost separately. Expect a dual-run period where both paths operate. Track its cost separately from steady state, and track its duration against the plan. A dual-run that outlives its window is a schedule risk, not a safety measure. Report against the baseline table from the assessment, with the same definitions and windows. Where a measure got worse, say so and record the reason. A program that reports only improvements teaches the organization to distrust the next baseline.
11
Modernization readiness checklist
BluePi's modernization experience began in cloud engineering and later expanded through data platforms and AI systems. The common discipline is controlled release with measurable transfer.
- Baseline measures collected with fixed definitions and windows.
- Every component has a recorded treatment and the reason for it.
- Dependency map reviewed with the teams that own the dependencies.
- Waves sequenced around freeze periods, peaks, and audits.
- Data migration covers initial load, change capture, reconciliation, and rollback data.
- Cutover plan has gates, owners, a rehearsal, and a timed rollback drill.
- The operating platform is live and tested before the first wave arrives.
- Retirement of the old system is scheduled with a date and an owner.
- Post-release measurement uses the same definitions as the baseline.
12
Primary sources
Official references for the tools and services covered in this guide.