Skip to content
ASYNCX

Architecture

When should a startup rebuild its software?

Published 5 min read
A dark stone arch has one violet glass replacement segment held by a temporary ivory support.
Editorial illustration created with AI for AsyncX.

The short answer

Rebuild software when a verified constraint prevents necessary changes and a narrower repair cannot resolve it at an acceptable cost. Compare incremental replacement with a full rewrite, including data migration and ongoing support. Prove one production-sized slice before committing the business to a complete replacement.

"We need to rebuild it" can mean several things. The code may be difficult to change. The database may no longer fit the product. Or the team may be frustrated by slow releases and assume a different framework will help.

Before funding a replacement, turn the complaint into a constraint you can examine. "Adding a new customer role requires changes in six unrelated places and has caused repeated access regressions" gives an engineer something to investigate. "The stack is old" does not establish a business case.

Find the constraint that the rebuild must remove

Review a few recent changes from request to production. Record where time went, which dependencies blocked progress, and what failed after release. Include waiting for decisions and environments; a rewrite will not automatically resolve those delays.

Separate local defects from structural limits. One slow report may need a query change. An unsupported dependency may need an upgrade. A data model that cannot represent the product's required permissions may justify a deeper redesign.

The proposed replacement needs an observable outcome. Examples include adding a customer role without editing unrelated modules, deploying a reporting change independently, or restoring a failed import without replaying every account. These are illustrative acceptance criteria, not promised results.

Compare three options using the same evidence

We recommend estimating repair, gradual replacement, and a full rewrite against the same business requirement. Include the work required to keep the current product running throughout the change.

Option Fits when Cost that is easy to overlook
Repair the current system The constraint is local and behavior is reasonably understood Regression tests and cleanup around the repaired area
Replace one capability at a time Useful parts can coexist while traffic or responsibilities move Routing, compatibility, and temporary duplication
Rebuild the application The product is small enough to replace, or constraints make incremental change impractical Behavior discovery, migration, cutover, and support for the old product

A full rewrite can be reasonable for a small internal tool with a known workflow and a manageable data transfer. It deserves a different assessment from a revenue-critical system with years of exceptions embedded in its behavior.

Martin Fowler's description of the Strangler Fig approach favors gradual modernization: introduce new behavior beside the existing system and move capabilities over time. He also points out that understanding current behavior and building temporary transition code are real parts of the work. Martin Fowler: Strangler Fig.

Prove a replacement boundary before committing

Suppose a hypothetical scheduling product has a stable booking flow but a reporting module that blocks releases. A candidate first slice is a new report built from the existing booking records, without changing how bookings are written.

Define the contract for that slice: which records it reads, how it interprets cancellations, and what output must match. Test it against representative cases, including older records and unusual state transitions. A clean demo dataset will miss the behavior most likely to complicate migration.

Choose a slice that reveals the difficult integration work. Rebuilding the login screen first may prove very little about whether the booking model can be replaced. A report that crosses historical records and current permissions may expose the problem earlier.

Incremental replacement has its own operational costs. AWS's Strangler Fig guidance identifies proxy bottlenecks, unclear service boundaries, and data consistency as concerns. It also notes that a complete rewrite can be more efficient for sufficiently small applications. AWS: Strangler fig pattern.

Keep the transition architecture small enough to understand. A startup does not need to introduce a large fleet of services simply to replace a module. The deployment boundary should follow the actual constraint and the team's ability to operate it.

Make data ownership explicit

A new interface is easy to demonstrate. The harder questions appear when both versions can write records.

For the scheduling example, decide which system owns a booking at each stage. Define how identifiers map, how cancellations propagate, and how a delayed event is handled. If old and new systems can disagree, name the rule that resolves the disagreement and the person who investigates exceptions.

A migration rehearsal should use a representative, appropriately protected copy of data. Compare business totals and relationships, not just row counts. Equal counts can still conceal bookings assigned to the wrong account.

Write the rollback limit down. Switching traffic back is insufficient if the new system has already written data the old one cannot read. You may need backward-compatible writes, a reconciliation process, or a point after which recovery must move forward. Test the chosen recovery procedure before making the cutover promise.

Set conditions for continuing and stopping

Before the first slice ships, agree what evidence would justify the next one. Did it remove the original bottleneck? Can the team operate both versions? Did the migration reveal behavior that changes the remaining estimate?

Keep the budget for ongoing product work visible. A rewrite that repeatedly postpones customer commitments needs a business review, even when the new architecture is technically attractive.

Use a short decision record to capture the chosen option, alternatives, consequences, and review trigger. Michael Nygard's architecture decision record format is useful for preserving that reasoning as people and constraints change. Documenting Architecture Decisions.

Retirement also needs acceptance criteria. Identify the remaining consumers, confirm the replacement handles required behavior, and decide how historical data will remain accessible. Remove temporary routing and unused infrastructure after the migration is complete. Otherwise the organization may end up maintaining two systems indefinitely.

What to ask before approving a rewrite

Ask the technical owner to show the failed change or blocked requirement, the narrower repair considered, and the first replacement slice. Request a migration rehearsal plan with an explicit recovery boundary. Include the cost of operating both versions and a date for reviewing the evidence.

If these answers remain vague, fund the investigation first. Our fractional CTO guide describes how to assign ownership for this kind of decision. The next commitment should be small enough to test the replacement plan while the current product continues to serve its users.

About AsyncX Technologies

AsyncX is a founder-led product engineering studio in Dubai. We write about technical leadership, building focused products, and putting AI to work in production.

Meet the founder behind AsyncX
  1. Product engineering

    How to scope an MVP without cutting the wrong corners

    A founder’s guide to MVP scope: test the riskiest assumption, choose a complete workflow, and keep the safeguards needed for a real launch.

    · 5 min read
  2. Production AI

    Production AI integration: a practical launch checklist

    A production AI checklist covering task boundaries, evaluation, permissions, failure handling, latency, cost, and a release that can be stopped safely.

    · 5 min read