Skip to content

Sistemas empresariales

Cómo modernizar un sistema legacy sin una reescritura riesgosa

Actualizado en junio de 2026 · 11 min de lectura · por Brian

El instinto frente a un sistema envejecido es tirarlo y empezar de cero. Se siente decisivo, y en una pizarra la nueva arquitectura siempre se ve mejor que el viejo desorden. Pero la reescritura completa es la forma más confiable de convertir un negocio que funciona en uno paralizado. El sistema viejo, con todos sus defectos, codifica años de casos límite, peculiaridades regulatorias y arreglos ganados con esfuerzo que nadie escribió. Una reescritura descarta todo eso en silencio y apuesta la empresa a reconstruirlo de memoria. La modernización de sistemas legacy bien hecha es lo opuesto a esa apuesta. Trata al sistema viejo como un paciente al que se opera mientras sigue funcionando, no como un edificio a demoler. Esta guía cubre por qué las reescrituras big-bang suelen fallar, cómo modernizar de forma incremental usando el patrón strangler-fig, cómo priorizar por riesgo y valor, y cómo manejar las dos partes que realmente rompen los proyectos: la migración de datos y la integración.

Por qué la reescritura big-bang suele fallar

El atractivo de una reescritura completa es que puedes escapar por entero del viejo código. El problema es que el viejo código también es la especificación más completa que tienes. Cada regla rara de descuento, cada apaño para un proveedor que no sigue el estándar, cada parche aplicado a las 2 de la mañana durante una caída vive ahí. Nada de eso está en un documento. Una reescritura empieza asumiendo que entiendes el sistema, y la modernización misma es lo que te enseña que no lo entendías.

El segundo problema es el tiempo. Una reescritura no entrega nada hasta que está terminada, y 'terminada' para un sistema de negocio real es un blanco móvil porque el sistema viejo sigue cambiando mientras construyes el nuevo. El negocio no se congela durante dieciocho meses. Llegan nuevos requisitos, las regulaciones cambian, y el equipo que construye el reemplazo ahora persigue un sistema que él mismo está en movimiento. Muchas reescrituras se cancelan en silencio no porque el nuevo sistema fuera malo, sino porque nunca pudo alcanzar al viejo.

El tercer problema es el cutover. Aunque la reescritura tenga éxito técnicamente, eventualmente enfrentas un único cambio de alto riesgo de viejo a nuevo, sin ninguna prueba gradual de que el reemplazo realmente funciona bajo carga real con datos reales. Esa es una cantidad enorme de riesgo concentrada en un solo fin de semana. La alternativa no es construir mejor de un solo golpe. Es dejar de hacerlo de un solo golpe por completo.

  • El sistema viejo es tu especificación real; una reescritura descarta casos límite no documentados
  • Nada se entrega hasta que la reescritura esté lista, mientras el sistema viejo sigue moviendo el blanco
  • Todo el riesgo cae en un solo gran cutover en lugar de probarse de forma incremental
  • Hay que mantener dos sistemas en paralelo durante mucho más tiempo del que nadie presupuesta
  • El valor para el negocio queda congelado durante todo el proceso, algo que el liderazgo rara vez tolera hasta el final

El enfoque strangler-fig para la modernización de sistemas legacy

El patrón que de verdad funciona es incremental, y tiene un nombre: la higuera estranguladora (strangler fig). La imagen viene de una enredadera que crece alrededor de un árbol, lentamente toma el control de su estructura, y eventualmente lo reemplaza mientras el árbol permanece en pie todo el tiempo. Aplicado al software, significa que envuelves el sistema legacy, enrutas el tráfico a través de una capa que tú controlas, y luego reemplazas una capacidad a la vez detrás de esa capa. El sistema viejo sigue corriendo y atendiendo cada función que aún no has reemplazado.

En la práctica colocas una capa de enrutamiento o fachada frente a la aplicación legacy. Al principio reenvía cada petición directo al sistema viejo, así que nada cambia para los usuarios. Luego eliges una capacidad bien delimitada, construyes una versión moderna solo de esa pieza, y cambias el router para enviar esas peticiones específicas al nuevo componente mientras todo lo demás sigue fluyendo al código legacy. Repites eso, capacidad por capacidad, hasta que el sistema viejo maneja tan poco que puedes retirarlo. Nunca hay un único cutover dramático, solo una serie de cutovers pequeños y reversibles.

La ventaja es que cada paso entrega valor y cada paso es comprobable en producción con tráfico real. Si una pieza recién migrada se porta mal, vuelves a enrutar al camino legacy mientras la arreglas, porque el sistema viejo sigue ahí. Nunca estás a más de un interruptor de distancia del estado bueno conocido. Eso es lo que hace que la modernización incremental sea fundamentalmente menos riesgosa que la reescritura: la red de seguridad es el sistema legacy del que intentabas escapar, y permanece en su lugar hasta que el nuevo sistema se haya ganado su reemplazo.

  • Coloca una capa de enrutamiento o fachada frente al sistema legacy para controlar adónde van las peticiones
  • Empieza con el router reenviando todo al sistema viejo, sin cambiar nada para los usuarios
  • Reemplaza una capacidad delimitada a la vez, enrutando solo esas peticiones al nuevo componente
  • Mantén el camino legacy vivo como fallback instantáneo para cualquier cosa que acabes de migrar
  • Repite hasta que el sistema viejo maneje lo suficientemente poco como para retirarlo con seguridad

Evalúa y prioriza por riesgo y valor

La modernización incremental solo funciona si eliges el orden deliberadamente, y el orden es una decisión de negocio antes que técnica. Mapea el sistema en capacidades y puntúa cada una en dos ejes: cuánto valor de negocio desbloquea modernizarla, y cuánto riesgo carga la versión actual. Riesgo aquí significa la probabilidad y el costo de fallo: un runtime sin soporte, una sola persona que entiende el código, un componente que falla bajo carga, una exposición de cumplimiento. Valor significa lo que ganas al reemplazarla: velocidad, menor costo, nuevas funciones que el viejo diseño no puede soportar.

Resiste el impulso de empezar por la pieza más difícil y central solo porque es la peor. El núcleo de un sistema legacy suele ser el más enredado y el que más carga soporta, lo que lo convierte en el peor lugar posible para aprender el patrón strangler. Empieza en cambio con algo lo bastante valioso como para importar pero lo bastante delimitado como para terminarse, de modo que el equipo pruebe el enfoque y la capa de enrutamiento en menores riesgos. Reserva el núcleo de alto valor y alto riesgo para cuando tengas impulso y un proceso probado. Las victorias tempranas también te compran el capital político para seguir financiando un proyecto que, por diseño, no termina rápido.

  • Divide el sistema en capacidades y puntúa cada una por valor de negocio y riesgo actual
  • Trata el riesgo de forma concreta: tecnología sin soporte, puntos únicos de conocimiento, exposición de escalado y cumplimiento
  • Empieza con una pieza delimitada y valiosa para probar el patrón, no con el núcleo enredado
  • Secuencia el núcleo de alto valor y alto riesgo para después de que el equipo tenga impulso y un proceso probado
  • Reprioriza después de cada incremento, porque lo que aprendes cambia el mapa

Migración de datos e integración: las partes difíciles

Rara vez es el código lo que hunde una modernización. Son los datos y las integraciones. Un sistema legacy suele haber acumulado una década de datos con formatos inconsistentes, campos reutilizados para propósitos para los que nunca fueron pensados, y registros que violan reglas que la aplicación se suponía que debía hacer cumplir. Mover esos datos a un esquema moderno significa confrontar cada uno de esos líos, y no puedes saltártelo, porque el nuevo sistema tiene que seguir atendiendo a los mismos clientes y el mismo historial.

Durante la modernización incremental también enfrentas una versión más difícil del problema: los componentes viejo y nuevo necesitan acceso a los mismos datos al mismo tiempo, porque ambos están vivos. A veces la respuesta más limpia es que el nuevo componente lea y escriba en el almacén de datos legacy al principio, para que haya una sola fuente de verdad, y migrar los datos en sí más tarde como su propio paso. Otras veces replicas datos entre viejo y nuevo y aceptas el trabajo de sincronización que eso requiere. No hay una respuesta correcta universal, pero pretender que el movimiento de datos es trivial es la forma más común en que estos proyectos revientan su cronograma.

Las integraciones son la otra trampa. Los sistemas legacy tienden a estar en el centro de una red no documentada de procesos batch, alimentaciones de archivos, conexiones punto a punto y reportes downstream de los que otros departamentos dependen en silencio. Antes de mover una capacidad, tienes que saber todo lo que se comunica con ella, porque algo siempre lo hace, y normalmente se descubre el día después de que se rompe. Catalogar esas integraciones y poner tu capa de fachada a cargo de ellas es lo que te permite reenrutar limpiamente en lugar de cortar una conexión de la que finanzas ha dependido durante años.

  • Perfila los datos legacy temprano; espera formatos inconsistentes, campos reutilizados y registros que violan reglas
  • Decide deliberadamente si el nuevo componente lee el almacén legacy o si replicas y sincronizas
  • Valida los datos migrados con conteos, checksums y verificaciones puntuales antes de confiarles tráfico
  • Cataloga cada integración, proceso batch y reporte downstream antes de mover una capacidad
  • Enruta las integraciones a través de tu capa de fachada para que las conexiones puedan redirigirse, no cortarse

Refactorizar, reemplazar o reconstruir: eligiendo por capacidad

No toda pieza de un sistema legacy merece el mismo tratamiento, y decidir capacidad por capacidad mantiene el esfuerzo proporcional al beneficio. Hay tres opciones honestas. Refactorizar significa conservar el código existente pero mejorarlo en su lugar: limpiar la estructura, actualizar dependencias, agregar pruebas, sin cambiar lo que hace. Es el camino más barato y de menor riesgo, y es la decisión correcta cuando la lógica es sólida y bien entendida pero el código simplemente está anticuado.

Reemplazar significa cambiar una capacidad a medida por algo que no tienes que poseer, normalmente un producto comercial con soporte o un servicio gestionado. Si tu componente hecho a mano hace algo que ahora es un commodity, seguir manteniéndolo es un costo sin ventaja. Reconstruir significa escribir una versión moderna desde cero, y a pesar de la advertencia de esta guía sobre las reescrituras, es la elección correcta para una única capacidad delimitada cuando el viejo diseño genuinamente no puede soportar lo que el negocio necesita ahora. La distinción crucial es el alcance: reconstruir un componente bien definido detrás de tu capa de enrutamiento es incremental y reversible. Reconstruir el sistema entero de golpe es la apuesta big-bang que todo este enfoque existe para evitar.

La decisión normalmente se reduce a unas pocas preguntas por capacidad. ¿La lógica existente sigue siendo correcta y valiosa, o es fundamentalmente limitante? ¿Es esto algo que un proveedor ahora hace mejor y más barato de lo que tú puedes? ¿Y el costo del trabajo coincide con el valor y el riesgo que puntuaste antes? Responde eso con honestidad y la mayoría de las capacidades se ordenan solas en el balde correcto.

  • Refactoriza cuando la lógica es sólida pero el código está anticuado: lo más barato, menor riesgo, sin cambio de comportamiento
  • Reemplaza cuando un producto de proveedor o servicio gestionado ahora hace lo que hace tu componente a medida
  • Reconstruye una única capacidad delimitada cuando su diseño genuinamente no puede cubrir las necesidades actuales
  • Mantén cada reconstrucción acotada a un componente detrás de la capa de enrutamiento, nunca el sistema entero
  • Ajusta la elección al puntaje de valor y riesgo para que el esfuerzo se mantenga proporcional al beneficio

Mantén el negocio en marcha durante la modernización

El punto entero de la modernización incremental es que el negocio nunca se detiene, así que las prácticas que protegen la continuidad no son extras opcionales. La más importante es que cada incremento debe ser reversible. Antes de enrutar tráfico a un nuevo componente, necesitas una forma probada de enrutarlo de vuelta, y criterios claros de cuándo lo harías. Modernizar un sistema vivo sin un fallback ensayado es la misma apuesta que un cutover big-bang, solo que repartida.

La continuidad también depende de saber qué significa 'funcionando' antes de cambiar nada. Captura el comportamiento y el rendimiento actuales de una capacidad como una línea base, de modo que después de migrarla puedas probar que la nueva versión iguala o supera a la vieja en lugar de esperar que lo haga. Corre los caminos viejo y nuevo en paralelo donde puedas y compara su salida con tráfico real antes de comprometerte. Comunica la secuencia a los departamentos que dependen de estos sistemas, porque las personas que corren el cierre de mes o sacan el reporte de cumplimiento necesitan saber qué cambia y cuándo.

Por último, acepta que estarás corriendo dos sistemas a la vez durante un tiempo, y presupuéstalo con honestidad. Ese período en paralelo es el precio de no apostar el negocio a un solo interruptor, y es un precio que vale la pena pagar. La disciplina de pasos pequeños, reversibles y bien medidos es lo que convierte una modernización de un salto de fe de varios años en una serie de movimientos controlados donde el peor caso es reenrutar una capacidad de vuelta al sistema que ha estado corriendo todo el tiempo.

  • Haz cada incremento reversible, con un rollback probado y criterios claros de go/no-go
  • Captura una línea base de comportamiento y rendimiento para poder probar que la nueva versión no es una regresión
  • Corre los caminos viejo y nuevo en paralelo y compara con tráfico real antes de comprometerte
  • Dile a los departamentos que dependen del sistema qué cambia y cuándo
  • Presupuesta con honestidad el período de operación en paralelo; es el costo de evitar la apuesta big-bang

Preguntas frecuentes

¿Qué es el enfoque strangler-fig para la modernización?
Es un patrón incremental donde colocas una capa de enrutamiento frente al sistema legacy y lo reemplazas una capacidad a la vez, mientras el sistema viejo sigue corriendo todo lo que aún no has migrado. Los nuevos componentes crecen hasta que el sistema viejo maneja tan poco que puedes retirarlo. Nunca hay un único gran cutover, solo una serie de cambios pequeños y reversibles, cada uno de los cuales puede revertirse al camino legacy si algo sale mal.
¿Por qué fallan tan a menudo las reescrituras big-bang de sistemas legacy?
Tres razones. El sistema viejo es tu única especificación completa, y una reescritura descarta años de casos límite no documentados. No entrega valor hasta que está terminada, mientras el sistema legacy sigue cambiando y moviendo el blanco. Y concentra todo el riesgo en un único cutover de alto riesgo sin prueba incremental. La modernización incremental evita las tres entregando y probando valor una pieza a la vez con el sistema viejo como red de seguridad.
¿Cómo decido entre refactorizar, reemplazar o reconstruir?
Decide capacidad por capacidad. Refactoriza cuando la lógica sigue siendo correcta y valiosa pero el código está anticuado, ya que es la opción más barata y segura. Reemplaza cuando un producto con soporte o servicio gestionado ahora hace lo que hace tu componente a medida mejor y más barato de lo que tú puedes mantenerlo. Reconstruye una única capacidad delimitada solo cuando su diseño genuinamente no puede soportar lo que el negocio necesita ahora, y mantén esa reconstrucción acotada detrás de tu capa de enrutamiento en lugar de dejar que se vuelva una reescritura completa.
¿Cuál es la parte más difícil de la modernización de sistemas legacy?
La migración de datos y la integración, no el código de la aplicación. Los datos legacy suelen ser inconsistentes y estar llenos de registros que violan las reglas que el sistema se suponía que debía hacer cumplir, y durante el trabajo incremental los componentes viejo y nuevo a menudo necesitan los mismos datos a la vez. Las integraciones son igual de riesgosas porque los sistemas legacy se sitúan en el centro de una red no documentada de procesos batch, alimentaciones y reportes de los que otros departamentos dependen. Cataloga ambos antes de mover una capacidad.
¿Cómo mantengo el negocio en marcha mientras modernizamos?
Haz cada incremento reversible con un rollback probado, captura una línea base de comportamiento y rendimiento para poder probar que la nueva versión no es una regresión, y corre los caminos viejo y nuevo en paralelo para compararlos con tráfico real antes de comprometerte. Comunica la secuencia a los departamentos que dependen del sistema, y presupuesta con honestidad el período en el que corres dos sistemas a la vez. Ese costo en paralelo es el precio de nunca apostar todo el negocio a un solo interruptor.

Más guías