Plataforma de publicidade dos EUA · base de código com ~20 anos

Modernizar um monólito de 823.000 linhas — sem downtime, sem big bang

Uma plataforma .NET Framework 4.8 em produção, com 54 projetos e 23.000 commits de histórico, modernizada de forma incremental para .NET 10 — o sistema antigo continua a funcionar enquanto o novo assume secção a secção. 19 secções com testes em cerca de 8 dias.

  • 823.000 linhas de código legado
  • 19 secções em ~8 dias
  • SSO com zero alterações ao sistema antigo
  • 175 testes desde o primeiro dia

O cliente

Uma plataforma americana de diretórios de empresas e publicidade, em operação há quase duas décadas: consumidores, comerciantes, revendedores, pagamentos, disputas de transações, integrações com redes de anúncios. Um negócio vivo, com receita real — e uma base de código em que ninguém se atrevia a tocar.

O desafio

O sistema: 823.000 linhas de C# em 54 projetos, .NET Framework 4.8, páginas WebForms com mais de uma década, 581 tabelas no modelo de dados e mais de 23.000 commits de histórico. Tudo passa por uma aplicação "hub" central da qual dependem oito sites e serviços separados.

O dilema clássico: uma reescrita completa é demasiado arriscada e cara, enquanto manter o status quo fica mais dispendioso a cada ano — as tecnologias antigas estão fora de suporte, os novos programadores não querem trabalhar com elas e cada alteração é perigosa.

A abordagem

Escolhemos a modernização incremental ("strangler fig"): o novo sistema cresce ao lado do antigo e assume a funcionalidade página a página, sem que os utilizadores notem nada.

  • Inventário antes do código. As 123 páginas de administração foram todas catalogadas e priorizadas. Cerca de 30 revelaram-se mortas ou duplicadas — retirámo-las de serviço sem portar uma linha. Âmbito mais pequeno, preço mais baixo.
  • Uma transição invisível. A nova aplicação corre no mesmo endereço, atrás do mesmo login. Um utilizador autentica-se no sistema antigo e passa para as páginas novas sem um segundo login — com zero alterações ao código antigo.
  • Portar apenas o que está vivo. Para cada página traçamos a cadeia completa de chamadas da lógica de negócio e portamos apenas o que é realmente usado. A lógica morta morre simplesmente por não ser portada.
  • Testes no próprio dia. Cada secção migrada é entregue com testes automatizados no mesmo PR — incluindo testes que comparam o comportamento do código novo com o do antigo sobre dados idênticos.
  • Decisões por escrito. Cerca de 1.800 linhas de documentação de projeto (playbook de migração, análise de dependências, estratégia de testes) escritas antes e em paralelo com o código — para que cada decisão possa ser reverificada amanhã, por qualquer pessoa.

O resultado

  • 19 secções de administração — pagamentos, disputas, pacotes, categorias, relatórios — migradas em cerca de 8 dias úteis, com 175 testes automatizados.
  • Risco zero para o negócio em funcionamento: o sistema antigo continua a servir tudo o que ainda não foi migrado; a transição é invisível para os utilizadores.
  • Uma fundação moderna (.NET 10) em que as novas funcionalidades demoram horas em vez de semanas — e para a qual é fácil encontrar programadores.
  • Âmbito reduzido antes do arranque: as páginas mortas não foram pagas uma segunda vez.

A velocidade vem do desenvolvimento acelerado por IA. A segurança vem do método: inventário, testes de paridade e uma transição sem big bang. Nenhum funciona sem o outro.

Tecnologia

.NET 10 · ASP.NET Core MVC · EF Core · nginx coexistence · xUnit + Playwright