Artigos >

O Mito do Rewrite (Big Bang)

O artigo combate a tentação do “Big Bang Rewrite”, classificando-o como um risco operacional que ignora o valor do código legado como documentação de regras de negócio. Defende a modernização incremental através de estratégias como o Padrão Strangler Fig e Camadas de Anticorrupção (ACL). A abordagem foca em reduzir a dívida técnica com o “motor ligado”, garantindo entregas constantes de valor e mitigando falhas catastróficas.

Por que a Modernização Incremental Supera o Rewrite

Existe uma tentação onipresente na engenharia de software, especialmente quando nos deparamos com sistemas legados: a crença de que começar do zero é a solução mais eficiente. Ao analisarmos um repositório com anos de histórico, classes extensas e acoplamento temporal, nosso instinto técnico frequentemente diagnostica o código como “irrecuperável”. A conclusão lógica parece ser a reescrita total (o Big Bang Rewrite) sob a promessa de uma arquitetura limpa e tecnologias modernas.

 

No entanto, a experiência demonstra que essa é uma das armadilhas mais dispendiosas da nossa indústria; uma verdadeira construção de uma casa sobre a areia. A decisão de reescrever ignora que a complexidade de um sistema legado raramente é apenas técnica; ela é uma representação arqueológica das regras de negócio que sustentam a operação.

 

A Cerca de Chesterton e a Documentação Implícita

Um equívoco comum em projetos de modernização é a afirmação de que “o sistema não possui documentação”. Na realidade, o código em produção é a documentação definitiva.

 

Considere uma condicional complexa e aparentemente arbitrária, como if (user.id == 429 && date > ‘2022-01-01’). Aos olhos de um desenvolvedor com pouca vivência ao lidar com regras complexas de negócio, isso parece dívida técnica ou “código sujo”. Sob a ótica do negócio, isso representa um edge case, uma regra de faturamento específica ou uma correção de compliance, que foi descoberta empiricamente.

 

Ao optar pelo rewrite da base de código inteira, descartamos intencionalmente a Cerca de Chesterton. Removemos barreiras e lógicas cuja finalidade desconhecemos, perdendo o conhecimento de domínio acumulado (o domain knowledge) que reside apenas naquelas linhas. O resultado estatístico é a reintrodução de bugs já solucionados no passado e a perda de paridade funcional com o sistema anterior.

A Analogia da Intervenção Cirúrgica

Para ilustrar o risco operacional, podemos comparar a modernização de software à reforma de uma unidade de emergência hospitalar. A gestão tem duas abordagens estratégicas:

 

  1. A Abordagem Big Bang: Construir um hospital novo em outro local, esperando inaugurá-lo em 18 meses, enquanto o atual opera sem manutenção.
  2. A Abordagem Incremental: Reformar sala por sala, modernizando a infraestrutura crítica enquanto o hospital continua atendendo pacientes.

 

A engenharia madura entende que o software é um organismo vivo. Paralisar a evolução do produto por meses para construir a “Versão 2.0” cria o problema do Alvo em Movimento. Enquanto a nova versão é desenvolvida, o negócio continua evoluindo, a versão legada recebe patches e novas features. Quando a V2.0 é finalmente lançada, ela já nasce obsoleta ou incompleta em comparação à V1.0, gerando um ciclo perpétuo de catch-up.

 

Estratégia Tática: Estrangulamento e Isolamento

A reescrita total de um sistema (“Big Bang Rewrite”) é, na vasta maioria dos casos, uma aposta de risco inaceitável. A história da engenharia de software está repleta de projetos que fracassaram, estouraram orçamentos ou nunca viram a luz do dia ao tentar refazer tudo do zero. As razões são múltiplas: perda de conhecimento tácito, introdução de novos bugs em funcionalidades já estáveis, desvio massivo de recursos e o longo tempo de feedback que mantém o novo sistema em desenvolvimento sem gerar valor.

Portanto, se a reescrita total é um risco inaceitável, a alternativa profissional, sensata e sustentável é a modernização iterativa baseada em refatoração estratégica. Esta abordagem reconhece a dívida técnica como um fato da vida e a trata de forma contínua e disciplinada, em vez de ignorá-la até que seja catastrófica.

A modernização iterativa exige:

  1. Disciplina Contínua: Não se trata de um projeto de modernização de um ano, mas sim de uma cultura onde a melhoria do código é uma atividade diária e integrada ao desenvolvimento de novas funcionalidades. Cerca de 15% do tempo da equipe deve ser alocado consistentemente para a redução da dívida técnica.
  2. Refatoração Estratégica (ou Tática): Diferente da refatoração de limpeza localizada, a refatoração estratégica visa a transformação de módulos inteiros do sistema. O objetivo é isolar e modernizar componentes críticos ou problemáticos, tipicamente usando o Strangler Fig Pattern.
  3. Uso de Padrões Arquiteturais Específicos: Para gerenciar a coexistência entre o sistema legado e o novo, padrões como:
    • Padrão Strangler Fig: O novo código é gradualmente introduzido em torno do sistema legado, interceptando chamadas para o código antigo. O sistema legado é, então, “estrangulado” lentamente, módulo por módulo, até ser completamente substituído, sem que o usuário final perceba uma interrupção brusca.
    • Padrão Anti-Corruption Layer (ACL): Cria uma camada de tradução entre o sistema novo (moderno) e o legado (geralmente bagunçado), garantindo que os modelos de domínio do novo sistema não sejam contaminados pela complexidade do antigo.
    • Modularização e Micro-serviços: Isolar áreas de negócio em unidades independentes para que possam ser reescritas, testadas e implantadas separadamente, diminuindo o blast radius (raio de explosão) de qualquer falha.

A modernização iterativa transforma a migração de um evento de alto risco para uma série de passos de baixo risco, entregando valor incremental e permitindo que o sistema continue a evoluir e a gerar receita durante todo o processo.

Testes de Caracterização (Golden Master)

O principal bloqueio para a refatoração é a ausência de testes unitários no legado. A solução não é escrever testes unitários perfeitos para código ruim, mas sim criar Testes de Caracterização. Trate o módulo legado como uma caixa preta. Capture as entradas e saídas atuais e crie um teste que garanta que, para um dado input, o output permanece idêntico. Isso cria uma rede de segurança que permite a refatoração interna sem a necessidade de compreender, inicialmente, toda a complexidade ciclomática do algoritmo.

Camadas de Anticorrupção (ACL)

É crucial, ao adicionar novos domínios ou microsserviços, que o modelo de dados do sistema legado não influencie ou corrompa a nova arquitetura. Quando lidamos com domínios de negócios diferentes, essa separação é ainda mais crítica, pois cada um deve ter seu próprio Bounded Context e linguagem ubíqua. Para isso, o padrão Anti-Corruption Layer (ACL) serve como um intermediário, ou tradutor, entre o Bounded Context do novo sistema e o sistema legado. Essa camada tem a função de isolar a complexidade do sistema antigo em uma fronteira bem definida, permitindo que o novo código seja desenvolvido. Ao passo que garante a comunicação e interoperabilidade com o sistema preexistente sem que o modelo de dados legado “corrompa” o novo modelo de domínio.

O Padrão Strangler Fig

A seguradora “Protege Mais” usou o Padrão Strangler Fig para modernizar seu monolito legado em COBOL, que gerenciava apólices, sinistros e endossos, visando reduzir custos e acelerar a inovação. Um gateway (Strangler) foi implementado para interceptar requisições.

 

Na primeira iteração, um microsserviço de Sinistros foi criado, e o Strangler desviou o tráfego de sinistro para ele. Na segunda, um microsserviço de Endossos foi desenvolvido, e o Strangler passou a redirecionar também essas requisições. O novo serviço de Endossos interagia com o banco de dados legado para manter a consistência. O processo continuou com outras funcionalidades (ex: emissão, faturamento), desviando progressivamente o tráfego do monolito, que só será desativado após a migração completa de todas as suas funcionalidades.

 

O Strangler Fig implica em um trade-off: lentidão inicial. Exige paciência, Testes de Caracterização e tempo para refatoração. Contudo, essa aparente lentidão não é desperdício, mas investimento em conhecimento de domínio. Aceitar operar dois sistemas por um prazo estendido é o custo para garantir uma transição segura, sem perda do valor de negócio acumulado, mitigando o risco catastrófico de uma reescrita total (Big Bang Rewrite).

A Métrica do Sucesso

A modernização de legado não deve ser encarada como um projeto finito de substituição, mas como uma capacidade contínua de engenharia.

 

O sucesso não é medido pela pureza do código em um repositório isolado, mas pelo downtime evitado e pela continuidade da entrega de valor. Engenheiros seniores distinguem-se não pela vontade de apagar o passado, mas pela habilidade de navegar a complexidade, refatorando o sistema “com o motor ligado”, garantindo que a tecnologia sirva ao negócio, e não o contrário. E você, como tem liderado o sistema legado da sua empresa? Me conta nos comentários.

 

Escrito por
Com mais de 10 anos atuando no mercado, Yuri vem focando na construção e evolução de sistemas escaláveis e cloud-native. Atua com ênfase em confiabilidade, manutenibilidade e excelência em engenharia. Contribui na modernização de sistemas legado e complexos por meio de melhorias arquiteturais, refatorações em larga escala e uso estratégico de inteligência artificial para reduzir débito técnico e refinamento de User Stories atuando junto ao Product Manager e Product Owner. Possui forte atuação em observabilidade, utilizando ferramentas como Grafana, Loki e Prometheus Mimir, além de colaborar na evolução de CI/CD e na ampliação de testes automatizados para aumentar a estabilidade dos sistemas. É entusiasta de bancos de dados e aplica Domain-Driven Design para ajudar empresas a focarem no que realmente gera vantagem competitiva.

Você também pode gostar

Como Governar a Urgência: Um Modelo de Decisão para Repriorizações Sem Colapsar a Engenharia

A “urgência contínua” é um dos padrões mais comuns, e menos mensurados, de degradação de performance em times de engenharia. Quando a repriorização deixa de ser um evento excepcional e passa a ser um comportamento cotidiano, o efeito não é apenas “desorganização”: há perda sistemática de produtividade, aumento de risco técnico, deterioração de previsibilidade e queda de confiança entre Negócio e Tecnologia.

Guia técnico: Comunicação Síncrona ou Assíncrona

HTTP ou Mensageria? Entenda os impactos do acoplamento temporal e saiba quando o modelo síncrono se torna um gargalo para sistemas distribuídos.

O Teatro da Engenharia: Números Corretos, Decisões Erradas

Como usar métricas sem otimizar o número em vez do resultado.

Você Não Quer Desenvolvedores Cuidadosos. Você Quer Fly-by-Wire

Substitua a dependência do erro humano pela Engenharia Fly-by-Wire: crie envelopes operacionais para garantir entregas rápidas, seguras e escaláveis.

Sete Controles de FinOps que Cortam Gastos na Nuvem: Estratégias AWS e Multicloud

7 controles FinOps para reduzir até 40% dos custos em AWS e multicloud em 90 dias com governança, automação e eficiência.

Modelo de Governança para tratar itens urgentes

Aprenda a governar a urgência e evitar o colapso da engenharia. Descubra como repriorizações sem critérios destroem a produtividade e o fluxo técnico.

Assine nossa newsletter.

Assine nossa newsletter para ficar por dentro de todas as novidades de tecnologia.