Plataforma publicitaria de EE. UU. · base de código de ~20 años

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