You tripled your customer base. The team doubled. Revenue hit a record high. And then, on an ordinary Monday, the system crashes during peak hours — and you discover that the technology that brought you here cannot take you to the next level. This is the moment when many companies make the most expensive and risky decision possible: rewrite everything from scratch.
I have seen this movie many times. In over 20 years advising companies — from fintechs growing at an accelerated pace to established financial institutions like BTG, XP, and Bradesco — a complete rewrite is rarely the right answer. It is almost always an emotional reaction to a problem that has a smarter solution.
The uncomfortable truth is that most legacy systems do not need to be replaced. They need to be evolved with strategy. And there is an enormous difference between the two approaches — in cost, in risk, and in time to value delivery.
Why growth breaks technology
When a startup or growing company builds its first systems, it makes decisions that are correct for that moment. A single database, a monolithic application, direct integrations between systems — all of this makes sense when you have 10,000 users and a team of five engineers.
The problem begins when the business grows and the architecture does not keep up. Not because the original team was incompetent. But because system scalability requires architectural decisions that often only become visible when volume truly increases.
The symptoms are recognizable:
- Deployments that freeze the entire system, even for small changes
- Response time growing as the user base increases
- Incidents that take hours to diagnose because no one fully understands the system anymore
- Product teams waiting weeks to implement simple features
- Database as the central bottleneck of everything
If you recognized yourself in two or more items on this list, your architecture is crying out for help. The question is: how do you respond without bringing the business to a halt?
The myth of the total rewrite
The complete rewrite has a powerful appeal. It is seductive because it seems clean, definitive, modern. "Let's throw out this legacy and build it right this time." I have heard this phrase dozens of times in the meeting rooms of frustrated CTOs.
The problem is that history is cruel to those who make this decision without a strategy. The Netscape 6 project is the classic case in technical literature — the company decided to rewrite the browser from scratch and lost years of market share to Internet Explorer. In Brazil, I know of fintechs that paused product development for 18 months to carry out a "clean migration" and lost their market window to competitors.
Rewriting is tempting because it seems to solve the technical problem. But the technical problem is rarely the real problem. The real problem is architectural — and architecture is evolved, not discarded.
Beyond the strategic risk, there is the financial risk. A complete rewrite of a medium-sized system costs, on average, 3 to 5 times more than the initial estimate. The bugs in the legacy system — which you know and have learned to live with — are replaced by new bugs you have not yet encountered. And the business knowledge accumulated in the old code? It disappears along with it.
Architecture modernization: the strategic approach
The alternative is what we call architecture modernization — an incremental and deliberate evolution of the existing system, without stopping what works. The fundamental principle is simple: never stop delivering value while modernizing.
In practice, this means identifying the greatest pain points and tackling them one by one, using proven techniques. Three approaches are particularly effective in this context:
Strangler Fig Pattern: Inspired by the strangler fig tree, you build the new functionality around the legacy system, gradually routing traffic to the new component. Over time, the legacy withers and is removed without the user noticing. This is the technique I recommend for most cases involving critical systems.
Domain decomposition: Instead of breaking up the monolith randomly, you identify the business's bounded contexts — payments, authentication, catalog, notifications — and extract each one as an independent service when it makes strategic sense. This is not microservices for the sake of hype. It is surgical decomposition driven by real necessity.
Anti-Corruption Layer: When you need to integrate modern systems with complex legacy ones, this abstraction layer protects the new code from the complexity of the old. It acts as a translator between two worlds without forcing the immediate extinction of either one.
AWS Cloud as a scalability lever
During my time at AWS, it became clear to me that the cloud is not about cutting infrastructure costs — that benefit comes, but it is secondary. The true leverage of the AWS cloud is the ability to scale components independently, without the rigidity of on-premises hardware.
For companies in the modernization phase, some services are particularly strategic:
- Amazon API Gateway + Lambda: Allows you to expose legacy functionality as modern APIs without touching the original code, creating a scalable facade in front of systems that were not designed for current volumes
- Amazon RDS with Read Replicas: In many cases, the bottleneck is not the system itself but the database. Adding read replicas resolves 60% of performance issues without a single new line of code
- Amazon SQS and SNS: Introducing message queues between systems breaks the synchronous coupling that causes cascading failures — one of the main fragility points in monolithic architectures
- Amazon CloudFront + ElastiCache: Strategically positioned cache layers reduce backend load by up to 80% for read-intensive patterns
The point here is not to use all of these services at once. It is to understand that the cloud offers specific components for each specific problem — and that modern platform engineering is about composing these components intelligently, not about adopting everything at once.
Platform engineering: what separates companies that scale from those that stall
There is a pattern I consistently observe in companies that manage to scale technology without chaos: they invest in platform before they need to. Those that stall do the opposite — they solve problem by problem, reactively, until the technical debt becomes unpayable.
Platform engineering is the discipline that builds the foundations upon which product teams develop. It includes infrastructure as code, standardized CI/CD pipelines, centralized observability, and abstractions that allow developers to deliver features without needing to understand every detail of the infrastructure.
When I advised on system modernization at companies in the Brazilian financial sector, one of the greatest gains was not technical — it was organizational. Engineering teams that spent 40% of their time on manual infrastructure tasks shifted to focusing almost entirely on product after a well-structured platform was in place. This translates directly into speed of innovation.
For a CEO or CTO, the relevant question is not "which technology should we use?" but rather: "is our engineering team spending more time creating value or fighting fires?" The answer to that question defines the urgency of the investment in platform.
How to prioritize: the three-layer framework
One of the most frequent questions I receive is: "where do I start?" Especially when the system has dozens of pain points and the team is overwhelmed. For this, I use a simple three-layer prioritization framework:
Layer 1 — Resilience: What is breaking the business today? Single points of failure, systems without redundancy, critical manual processes. Before modernizing anything, you need to stabilize. A system that crashes during peak sales cannot wait for a 12-month modernization effort.
Layer 2 — Decoupling: What is preventing the team from delivering quickly? Unnecessary dependencies between components, databases shared across contexts, deployments that require coordination among multiple teams. This is where strategic decomposition and the introduction of APIs and queues come in.
Layer 3 — Scale: What will break in the next 12 to 18 months if the business keeps growing? This is the layer of preventive investment — where you use AWS cloud to build the capacity to grow without disruption.
Most companies try to solve layer 3 before they have solved layer 1. The result is a modern system that still crashes, because the foundation is not solid. The order matters.
What to do now: practical decisions for leaders
If you have made it this far, you are probably facing some version of this challenge. Here are some concrete actions to get started:
- Conduct a technical debt inventory with business impact: This is not a technical exercise — it is a strategic one. Each item of debt needs to have an estimated cost in terms of lost velocity, operational risk, or maintenance cost
- Identify the real bottleneck: In most cases, 20% of the system is responsible for 80% of the problems. Find that 20% before trying to modernize everything
- Separate the modernization team from the product team: Trying to modernize while delivering new features within the same team is a recipe for doing neither well
- Define technical success metrics: Availability, deployment time, MTTR (mean time to recovery), observability coverage. Without metrics, modernization becomes a matter of opinion
- Think in months, not years: Modernization cycles of 6 to 9 months with visible deliverables are more sustainable than 2-year projects that promise to solve everything at once
Architecture modernization and solving problems with legacy systems are not technology projects — they are business projects. The CTO who frames this as "technical debt to be paid" loses the conversation with the board. What wins the conversation is showing how much growth is being constrained by the current architecture and how much additional growth will be enabled by its evolution.
Your company grew because you made difficult and well-informed decisions about the business. Scaling the technology requires the same kind of decision: strategic, data-driven, with a calculated appetite for risk. Rewriting everything from scratch is rarely that decision. Evolving with intelligence, almost always is.
If you are at the point of deciding how to modernize your company's architecture — or if you want to understand whether you have reached that point before a crisis forces your hand —, I am available for a strategic conversation. In 20 years advising companies of all sizes, the conclusion is always the same: those who act before breaking have far more options than those who act afterward. Get in touch at abraao.tech and let's figure out together what the right next step is for your business.