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