· nervico-team · desarrollo-software  · 11 min read

Cuando reescribir vs refactorizar: la decision mas cara en software

Framework de decision para reescribir vs refactorizar: el efecto del segundo sistema, estrategias de migracion incremental, el patron strangler fig y ejemplos reales de exitos y fracasos.

Framework de decision para reescribir vs refactorizar: el efecto del segundo sistema, estrategias de migracion incremental, el patron strangler fig y ejemplos reales de exitos y fracasos.

“Tiremos todo y empecemos de cero.” Si has trabajado en tecnologia el tiempo suficiente, has escuchado esta frase. Puede que incluso la hayas dicho tu. Es comprensible: cuando un codebase se ha convertido en un obstaculo, la tentacion de empezar limpio es enorme.

Pero la historia del software esta llena de rewrites que fracasaron estrepitosamente. Netscape reescribio su navegador desde cero y le costo 3 anos y la perdida de su liderazgo de mercado frente a Internet Explorer. Borland reescribio su entorno de desarrollo y nunca recupero su posicion.

Esto no significa que reescribir sea siempre incorrecto. Significa que es una decision que necesita un analisis riguroso, no una reaccion emocional ante la frustracion con el codigo existente.

En esta guia vas a encontrar un framework para decidir cuando refactorizar y cuando reescribir, los patrones que funcionan para migraciones incrementales, y los errores que hacen que los rewrites fracasen.

Por que la reescritura es tentadora

La ilusion del lienzo en blanco

El codebase actual tiene anos de decisiones acumuladas: algunas buenas, otras malas, muchas que tenian sentido en su momento pero ya no. Los desarrolladores lo miran y ven un laberinto de excepciones, workarounds y logica de negocio enterrada en lugares inesperados.

El codigo nuevo, en cambio, es imaginario. Y lo imaginario siempre es perfecto. Cuando piensas en la reescritura, imaginas un codebase limpio, bien estructurado, con las mejores practicas actuales. Lo que no imaginas son los 3.000 bugs que se descubrieron y corrigieron en el sistema actual y que necesitas reimplementar en el nuevo.

Joel Spolsky lo llamo “el peor error estrategico que una empresa de software puede cometer.” No porque reescribir sea siempre malo, sino porque la decision se toma con informacion incompleta y expectativas irrealistas.

El efecto del segundo sistema

Fred Brooks describio este fenomeno en “The Mythical Man-Month.” El segundo sistema de un equipo tiende a ser sobrecargado, sobreingenierizado y dolorosamente complejo.

Por que ocurre:

El primer sistema se construyo con humildad. El equipo tenia recursos limitados, tiempo limitado y un miedo genuino al fracaso. Cada funcionalidad se ganaba su lugar. Cada decision se moderaba por la necesidad.

El segundo sistema se construye con confianza. Y la confianza tiende a anadir funcionalidades. “Ya que estamos reescribiendo, anadamos esta feature que siempre quisimos.” “Aprovechemos para cambiar tambien la base de datos.” “Implementemos ese patron de arquitectura que leimos en un blog.”

El resultado tipico:

  • El proyecto tarda mucho mas de lo previsto en alcanzar paridad de funcionalidades con el sistema original
  • Mientras se desarrolla el nuevo sistema, se introducen nuevos problemas arquitectonicos que el sistema original no tenia
  • Los recursos se dividen entre mantener el sistema viejo y construir el nuevo, prolongando el proceso
  • El equipo descubre que muchas de las “decisiones malas” del sistema original eran en realidad adaptaciones necesarias a requisitos del mundo real

Cuando refactorizar tiene sentido

La arquitectura fundamental es solida

Si la arquitectura base del sistema es correcta pero la implementacion tiene problemas, refactorizar es casi siempre la opcion correcta. Puedes mejorar la calidad del codigo, reducir la complejidad y pagar deuda tecnica sin perder la estructura que funciona.

Senales de que la arquitectura es solida:

  • El sistema puede acomodar nuevas funcionalidades, aunque con mas esfuerzo del deseable
  • Los problemas principales son de calidad de codigo, no de diseno estructural
  • El rendimiento puede mejorar con optimizaciones puntuales, no requiere un cambio de paradigma
  • Los limites entre modulos o componentes son razonablemente claros

Refactoring incremental: la regla del Boy Scout

“Deja el codigo un poco mejor de como lo encontraste.” Cada vez que un desarrollador toca un archivo, mejora algo pequeno: renombra una variable confusa, extrae una funcion, simplifica una condicion.

Ventajas:

  • Riesgo practicamente nulo (cambios pequenos y testeables)
  • No requiere un proyecto dedicado ni presupuesto especial
  • El beneficio se acumula con el tiempo
  • Mantiene al equipo en contacto con la calidad del codigo

Limitacion: Funciona para mejorar la calidad general pero no resuelve problemas arquitectonicos profundos.

Refactoring planificado

Para problemas mas grandes que la regla del Boy Scout, necesitas sesiones de refactoring dedicadas.

Como hacerlo:

  1. Identifica las areas del codigo que mas dolor causan (las que mas bugs generan, las que mas tiempo requieren para cambiar)
  2. Define el objetivo de la mejora en terminos concretos
  3. Escribe tests que cubran el comportamiento actual antes de refactorizar
  4. Refactoriza en pasos pequenos y testeables
  5. Verifica que el comportamiento no ha cambiado

Proporcion recomendada: Reserva entre un 15% y un 20% del tiempo del equipo para mejoras tecnicas. No es un lujo, es mantenimiento preventivo.

Cuando reescribir tiene sentido

La tecnologia subyacente esta obsoleta

Si tu sistema esta construido sobre tecnologia que ya no tiene soporte, no recibe actualizaciones de seguridad, y no puedes contratar personas que la conozcan, la reescritura puede ser inevitable.

Ejemplos reales:

  • Aplicaciones en Flash despues de que Adobe dejara de soportarlo
  • Sistemas en COBOL cuando el equipo que lo mantenia se jubilo
  • Aplicaciones dependientes de APIs de terceros que fueron descontinuadas

Matiz importante: “La tecnologia es vieja” no es lo mismo que “la tecnologia esta obsoleta.” PHP 5 es viejo pero se puede migrar a PHP 8 incrementalmente. COBOL sin equipo que lo mantenga es un problema diferente.

El negocio ha cambiado radicalmente

Si el modelo de negocio ha cambiado tanto que el software actual no puede adaptarse, incluso con refactoring extenso, la reescritura tiene sentido.

Ejemplo: Una empresa que paso de vender licencias a modelo SaaS multi-tenant. Si la arquitectura original asumia instalaciones individuales, la cantidad de cambios necesarios puede justificar empezar de nuevo con una arquitectura multi-tenant desde la base.

El sistema es lo suficientemente pequeno

Si puedes reescribir el sistema en semanas, no en meses, el riesgo es manejable. Para sistemas pequenos, el coste de una reescritura puede ser menor que el coste de entender y refactorizar codigo legado complejo.

Regla practica: Si el sistema tiene menos de 50.000 lineas de codigo y un equipo pequeno puede reescribirlo en 6-8 semanas, la reescritura puede ser viable.

No hay tests y el codigo es incomprensible

Si el codebase no tiene tests, no tiene documentacion, y el equipo original no esta disponible para explicar las decisiones, refactorizar se convierte en un ejercicio de arqueologia sin guia.

En estos casos, la reescritura puede ser mas rapida y segura que intentar entender y modificar codigo que nadie comprende. Pero atencion: necesitas entender el comportamiento actual antes de reescribir, o reproduciras los mismos errores.

El patron Strangler Fig: migracion incremental

Que es y como funciona

El patron Strangler Fig, introducido por Martin Fowler, es la alternativa mas segura a la reescritura total. En lugar de reemplazar el sistema completo de golpe, construyes el nuevo sistema alrededor del viejo y migras funcionalidad gradualmente.

El proceso paso a paso:

  1. Identifica un componente del sistema que quieres reemplazar. Empieza por uno que sea relativamente independiente y tenga fronteras claras.

  2. Construye el reemplazo al lado del sistema actual. El nuevo componente funciona en paralelo con el viejo.

  3. Redirige el trafico gradualmente. Primero un porcentaje pequeno de peticiones van al nuevo componente. Si funciona, incrementa. Si falla, vuelve atras.

  4. Cuando todo el trafico va al nuevo componente, elimina el viejo.

  5. Repite para el siguiente componente.

Por que funciona

Riesgo controlado: Si el nuevo componente falla, el viejo sigue funcionando. No apuestas todo a una sola carta.

Entrega continua de valor: No necesitas esperar a que la migracion completa termine para ver beneficios. Cada componente migrado mejora el sistema.

Aprendizaje progresivo: Cada migracion te ensena algo. La segunda es mejor que la primera. La quinta es mucho mejor que la primera.

Datos de la industria: Los equipos que usan Strangler Fig logran ciclos de entrega entre un 20% y un 30% mas rapidos en los primeros 6-12 meses.

Cuando no funciona

El Strangler Fig funciona mejor para sistemas grandes con componentes relativamente independientes. Para sistemas pequenos muy acoplados, el esfuerzo de implementar el patron puede ser mayor que una reescritura directa.

Tampoco funciona si no puedes identificar fronteras claras entre componentes. Si todo esta tan acoplado que no puedes extraer una parte sin tocar todo lo demas, necesitas primero un trabajo de desacoplamiento dentro del monolito.

Framework de decision

Paso 1: Evalua la arquitectura

Pregunta: la arquitectura fundamental del sistema puede soportar la evolucion que el negocio necesita?

  • Si: Refactoriza. La arquitectura es tu activo mas valioso.
  • No: Considera migracion incremental o reescritura.

Paso 2: Evalua el tamano

Pregunta: cuanto tiempo tomaria una reescritura completa?

  • Menos de 2 meses: La reescritura es viable si la arquitectura actual no sirve.
  • 2-6 meses: Migracion incremental (Strangler Fig) es preferible.
  • Mas de 6 meses: La reescritura total tiene un riesgo muy alto. Migracion incremental o refactoring.

Paso 3: Evalua el conocimiento

Pregunta: el equipo entiende el sistema actual lo suficiente como para refactorizarlo de forma segura?

  • Si: Refactorizar es mas seguro.
  • No, pero hay tests: Refactorizar con precaucion, apoyandose en los tests.
  • No, y no hay tests: Considera la reescritura, pero primero documenta el comportamiento actual.

Paso 4: Evalua el negocio

Pregunta: el negocio puede permitirse el tiempo que requiere cada opcion?

  • Refactoring: Mejora gradual, el sistema sigue funcionando mientras mejora.
  • Migracion incremental: Tiempo medio, el sistema mejora por partes.
  • Reescritura total: Tiempo largo, y durante ese tiempo mantienes dos sistemas.

Errores que hacen fracasar las reescrituras

Error 1: no alcanzar paridad de funcionalidades

El error mas comun. El equipo empieza la reescritura con entusiasmo, anade funcionalidades nuevas, y nunca alcanza paridad con el sistema original. Los usuarios no pueden migrar porque les faltan cosas que ya tenian.

Solucion: Define paridad de funcionalidades como el primer hito. Nada nuevo hasta que el nuevo sistema hace todo lo que hace el viejo.

Error 2: mantener dos sistemas demasiado tiempo

Mientras la reescritura avanza, el sistema viejo necesita mantenimiento. Bugs, parches de seguridad, cambios minimos. El equipo se divide y ambos sistemas sufren.

Solucion: Establece un plazo maximo para la migracion. Si no puedes migrar en ese plazo, la reescritura probablemente no es viable.

Error 3: no entender por que el codigo viejo es como es

Muchas de las decisiones “malas” en el codebase viejo son en realidad adaptaciones a requisitos del mundo real que no estan documentados. Un if raro en el codigo de facturacion puede estar manejando un caso especial que afecta a un cliente importante.

Solucion: Antes de reescribir un modulo, habla con los usuarios y con el equipo que lo mantiene. Entiende no solo que hace el codigo, sino por que lo hace asi.

Error 4: sobreingenierizar el nuevo sistema

El efecto del segundo sistema. “Ya que estamos reescribiendo, hagamoslo perfecto.” La perfeccion es enemiga de la entrega.

Solucion: El nuevo sistema debe ser mejor que el viejo en las areas que importan, no perfecto en todo. Prioriza las mejoras que generan mas impacto de negocio.

Error 5: subestimar el esfuerzo de migracion de datos

Los datos del sistema viejo tienen anos de historia, formatos inconsistentes, y casos especiales. Migrarlos al nuevo sistema es un proyecto en si mismo.

Solucion: Incluye la migracion de datos como una linea independiente en el plan de proyecto, con su propio presupuesto y timeline.

Guia practica: que hacer manana

Si estas considerando una reescritura, antes de tomar la decision:

  1. Haz un inventario. Documenta que hace el sistema actual. No el codigo, sino el comportamiento funcional visible para los usuarios.

  2. Identifica los puntos de dolor reales. No “el codigo es feo.” Sino “cada vez que anadimos una regla de facturacion tardamos 3 semanas en lugar de 3 dias.”

  3. Evalua alternativas incrementales. Para cada punto de dolor, preguntate: esto se puede resolver con refactoring? Con una migracion parcial?

  4. Calcula el coste real. No solo el coste de desarrollo del nuevo sistema. Tambien el coste de mantener dos sistemas, el coste de migracion de datos, y el coste de formacion.

  5. Haz una prueba de concepto. Antes de comprometerte con la reescritura completa, migra un componente usando Strangler Fig. Si ese componente va bien, continua. Si no, replantea.

Conclusion

La decision entre reescribir y refactorizar no es emocional. Es una decision de negocio que requiere datos, analisis de riesgo y expectativas realistas.

Las claves para decidir bien:

  1. Refactorizar es casi siempre mas seguro que reescribir. La carga de la prueba esta en la reescritura, no en el refactoring.
  2. Si necesitas reescribir, usa Strangler Fig. La migracion incremental reduce dramaticamente el riesgo.
  3. Cuidado con el efecto del segundo sistema. El nuevo sistema debe ser mejor, no perfecto.
  4. No reescribas lo que no entiendes. Primero documenta, luego decide.
  5. El 80% de las veces, mejorar incrementalmente es la opcion correcta. Las reescrituras exitosas son la excepcion, no la regla.

La tentacion de “empezar de cero” es universal. Pero los mejores equipos de ingenieria resisten esa tentacion y encuentran formas de mejorar lo que tienen sin arriesgarlo todo.


Tu equipo esta atrapado entre mantener un sistema viejo y la tentacion de reescribir?

En una auditoria tecnica gratuita podemos ayudarte a:

  • Evaluar si tu caso justifica refactoring, migracion incremental, o reescritura
  • Identificar los componentes que mas impacto tienen si se mejoran primero
  • Disenar un plan de migracion incremental con Strangler Fig si es necesario
  • Calcular el coste real de cada alternativa para que la decision sea basada en datos

Sin compromisos, sin PowerPoints. Solo un diagnostico tecnico honesto.

Solicitar auditoria tecnica gratuita

Back to Blog

Related Posts

View All Posts »