Modernización de un monolito de 823.000 líneas — sin paradas y sin big bang
Una plataforma .NET Framework 4.8 en producción con 54 proyectos y 23.000 commits de historia, modernizada de forma incremental a .NET 10 — el sistema antiguo sigue funcionando mientras el nuevo toma el relevo sección a sección. 19 secciones con pruebas en unos 8 días.
- 823.000 líneas de código heredado
- 19 secciones en ~8 días
- SSO sin un solo cambio en el sistema antiguo
- 175 pruebas desde el primer día
El cliente
Una plataforma estadounidense de directorios de empresas y publicidad en funcionamiento desde hace casi dos décadas: consumidores, comerciantes, revendedores, pagos, disputas de transacciones, integraciones con redes publicitarias. Un negocio vivo con ingresos reales — y una base de código que nadie se atrevía a tocar.
El reto
El sistema: 823.000 líneas de C# repartidas en 54 proyectos, .NET Framework 4.8, páginas WebForms con más de una década de antigüedad, 581 tablas en el modelo de datos y más de 23.000 commits de historia. Todo pasa por una aplicación central, un "hub", del que dependen ocho sitios y servicios independientes.
El dilema clásico: una reescritura completa es demasiado arriesgada y cara, mientras que mantener el statu quo resulta más costoso cada año — las tecnologías antiguas están fuera de soporte, los nuevos desarrolladores no quieren trabajar con ellas y cada cambio es peligroso.
El enfoque
Elegimos la modernización incremental ("strangler fig"): el sistema nuevo crece junto al antiguo y asume la funcionalidad página a página, sin que los usuarios noten nada.
- Inventario antes que código. Las 123 páginas de administración se catalogaron y priorizaron. Unas 30 resultaron estar muertas o duplicadas — se retiraron sin portar una sola línea. Menos alcance, menor precio.
- Una transición invisible. La nueva aplicación funciona en la misma dirección, detrás del mismo inicio de sesión. El usuario entra en el sistema antiguo y pasa a las páginas nuevas sin un segundo inicio de sesión — sin ningún cambio en el código antiguo.
- Portar solo lo que está vivo. Para cada página trazamos la cadena completa de llamadas de la lógica de negocio y portamos únicamente lo que se usa de verdad. La lógica muerta muere por el simple hecho de no portarse.
- Pruebas el mismo día. Cada sección migrada se entrega con pruebas automatizadas en el mismo PR — incluidas pruebas que comparan el comportamiento del código nuevo con el del antiguo sobre datos idénticos.
- Decisiones por escrito. Alrededor de 1.800 líneas de documentación del proyecto (playbook de migración, análisis de dependencias, estrategia de pruebas) redactadas antes del código y en paralelo a él — para que cada decisión pueda volver a verificarse mañana, por cualquiera.
El resultado
- 19 secciones de administración — pagos, disputas, paquetes, categorías, informes — migradas en unos 8 días laborables, con 175 pruebas automatizadas.
- Riesgo cero para el negocio en marcha: el sistema antiguo sigue sirviendo todo lo que aún no se ha migrado; la transición es invisible para los usuarios.
- Una base moderna (.NET 10) en la que las nuevas funcionalidades llevan horas en lugar de semanas — y para la que es fácil encontrar desarrolladores.
- Alcance reducido antes de empezar: las páginas muertas no se pagaron por segunda vez.
La velocidad viene del desarrollo acelerado con IA. La seguridad viene del método: inventario, pruebas de paridad y una transición sin big bang. Ninguno de los dos funciona sin el otro.
Tecnología
.NET 10 · ASP.NET Core MVC · EF Core · nginx coexistence · xUnit + Playwright