Heredar código: convivir con lo que no elegimos

El sistema que no elegimos

Es habitual, en nuestra profesión, imaginar un proyecto nuevo. La hoja en blanco. El repositorio vacío esperando el primer commit.

La realidad, sin embargo, suele ser distinta. La mayoría de las veces, cuando llegamos a un equipo, el sistema ya está ahí. Ya tiene nombre, ya tiene usuarios y, sobre todo, ya tiene historia.

Incluso cuando tenemos la oportunidad de arrancar una nueva solución desde cero, rara vez partimos de una situación aislada. Lo habitual es que ese nuevo proyecto tenga que encajar en un puzle que lleva años montado. Es posible que escribamos código nuevo, pero tendremos que integrarnos con sistemas antiguos, consumir datos de una estructura que no diseñamos o asumir decisiones de arquitectura tomadas hace tiempo.

El legacy no es solo el código antiguo que tocamos. A menudo es el ecosistema sobre el que necesariamente construimos lo nuevo.


El juicio fácil

Ante un contexto que no hemos definido nosotros, la primera reacción suele ser inmediata.

Miramos una integración compleja o una estructura de datos rígida y concluimos que eso está mal. Es tentador pensar que quienes estuvieron antes no supieron hacerlo mejor y asumir que, con nuestros estándares actuales, el resultado habría sido distinto.

Ese juicio suele ser incompleto porque deja fuera la variable más importante: el contexto.

Juzgar decisiones pasadas con la información del presente es una trampa habitual. No sabemos si esa estructura poco agradable fue la única forma viable de integrarse con un sistema crítico o si respondió a una limitación tecnológica que hoy ya no existe.

Confundir el estado actual de un sistema con la calidad de las decisiones que lo originaron es un error de perspectiva, que cometemos incluso cuando tenemos años de experiencia.


El legacy como contexto

Resulta más útil cambiar la mirada. El legacy no es un fallo en sí mismo ni una señal automática de malas decisiones.

Es el sistema que ha traído a la organización hasta aquí. Si ese entorno sigue en producción es porque ha sostenido procesos clave, ha permitido crecer y ha resuelto problemas reales durante años.

Muchas de las decisiones que hoy nos resultan difíciles de entender fueron, en su momento, la forma razonable de avanzar dadas las condiciones existentes.

Hay una utilidad demostrada en un sistema que funciona, incluso cuando interactuar con él no es sencillo.

Entender esto ayuda a ver el legacy no como algo que hay que eliminar, sino como el contexto operativo, con sus límites y reglas, en el que nos toca trabajar.


No todo es urgente

El desafío, entonces, no es arreglarlo todo de inmediato. En muchos casos, la cuestión no es qué hay que cambiar, sino cuándo tiene sentido hacerlo.

Modificar código o cambiar integraciones introduce riesgo. Hay partes del ecosistema que funcionan de forma suficientemente estable y apenas requieren intervención, aunque estén lejos de ser ideales. En esos casos, el coste de modernizarlas puede ser mayor que el beneficio que aportan.

En otros casos, el sistema sí necesita una modernización profunda, pero el contexto no permite abordarla de una sola vez. No porque no sea necesaria, sino porque hacerlo ahora introduciría un riesgo que el sistema o el negocio no pueden asumir.


Elegir dónde intervenir

La arquitectura, en estos entornos, se convierte en el criterio para decidir dónde y cuándo intervenir, y dónde no hacerlo.

Se trata de identificar dónde está el impacto real hoy y actuar en consecuencia.

Priorizar el efecto sobre el negocio y la operabilidad suele ser más útil que perseguir una coherencia técnica global que, en sistemas vivos, rara vez es alcanzable.

A menudo, la estrategia adecuada consiste en aislar la complejidad y establecer fronteras claras para evitar que el código nuevo herede problemas que no necesita.

De este modo, el sistema existente puede seguir cumpliendo su función sin condicionar la estructura interna de lo nuevo.


Continuidad frente a reinicio

En algunos momentos, la frustración lleva a plantear un reinicio completo. Empezar de cero resulta atractivo porque promete mayor control y una simplicidad aparente.

Sin embargo, las reescrituras completas suelen fallar, y rara vez lo hacen por motivos puramente técnicos.

El problema suele estar en la organización y en la pérdida de conocimiento acumulado. Se pierden reglas de negocio, excepciones y comportamientos que no están documentados, sino incorporados en la lógica del sistema existente.

La evolución incremental puede ser más lenta, pero suele ser más segura que una sustitución total de golpe.


El respeto como herramienta técnica

Respetar el sistema y a quienes lo construyeron es, en la práctica, una ventaja técnica.

Entender por qué se tomó una decisión concreta ayuda a no repetir errores y a no romper flujos de negocio que no son evidentes a la primera.

Esa actitud, que a veces implica revisar decisiones que tomamos nosotros mismos hace solo unos años, mejora la colaboración y amplía el margen de actuación.

Reducir el legacy a una crítica constante suele generar fricción. Entenderlo, en cambio, facilita trabajar con él de forma más efectiva.


Cuidar lo imperfecto

Convivir con sistemas heredados no significa conformarse ni renunciar a mejorar.

Significa asumir la responsabilidad de trabajar en un entorno real e imperfecto. El mismo entorno que veremos nosotros cuando, dentro de unos años, revisemos nuestros propios proyectos.

El objetivo deja de ser tener un sistema impecable para pasar a tener uno que sea sostenible, que siga funcionando y que pueda evolucionar con el tiempo.

La historia del sistema no desaparece. Se comprende, se gestiona y, con criterio, se transforma.