lunes, 5 de marzo de 2018

Acerca de la mantenibilidad del software


Hace ya un tiempo vi la siguiente imagen en internet, acerca de una experiencia que casi cualquier programador ha vivido:


La verdad es una imagen que me arranco una sonrisa, y a la que francamente me he enfrentado en multitud de ocasiones. Como antiguo programador de Visual Basic clásico (anterior a Microsoft.NET), me he encontrado código con multitud de variables globales sin tipo ( e incluso con más de un objetivo cada una), con funciones kilométricas llenas de gotos, controles de errores extrañísimos, funciones altamente acopladas o if encadenados hasta el infinito. Sistemas que fallaban si tosías cerca demasiado fuerte. Recuerdo que bromeaba con que esas líneas no eran código fuente, si no un conjuro escrito en una antigua lengua olvida, que levantaba el sistema.

El caso es que un software vale tanto como tan mantenible puede llevar a ser. Un sistema no es un edificio que pueda estar levantado inmutable durante siglos, es un ente que debe evolucionar para ajustarse a las mismos cambios por los que pasa el mercado, el dominio que intenta abarcar nuestro sistema, lo que llamamos habitualmente el negocio. De esto hemos hablado aquí y aquí.

Es obvio que de forma inconsciente y progresiva todos queremos cierta estabilidad en el negocio que estábamos implementando, y cuando mas tiempos hemos estado involucrados en dicho negocio (sobre todo si es de una forma pasiva), menos vamos a querer que cambie, incluso podemos, sin darnos cuenta, sabotear el cambio. Esto se llama zona de confort. Sin embargo, basta con dar un vistazo al mismo mercado de nuestra profesión para darnos cuenta que el cambios es algo inevitable, veamos cómo ha cambiado la informática desde los 90 hasta ahora, o la telefonía móvil desde hace una década. los cambios son cada vez mayores y mas rápidos, los sistemas que antes duraban décadas, pasaron a durar años y en la actualidad tenemos sistemas que reciben actualizaciones cada pocas semanas o incluso a diario. Es inútil negar la necesidad de cambio y adaptación que tiene los sistemas actuales, hacerlo es condenar a nuestro negocio a quedarse obsoleto en el mercado y finalmente a desaparecer.

Lo cual nos lleva a la imagen que acompaña al post, imaginemos que es una situación real, estaría impidiendo a nuestro sistema poder adaptarse a nuevas necesidades, dejándolo atrapado estáticamente en la misma funcionalidad.

Pensando en cómo se ha llegado a esa situación, posiblemente sea por alguno (o todos) de los siguientes problemas y errores:

  • Es una función terriblemente grande, con muchos caminos y ramificaciones, tal que no puede ser comprendida en su totalidad.
  • La función hace más de una cosa
  • La función usa, y modifica, variables globales.
  • La función necesita ser llamada en determinada secuencia junto con otras.

En resumen la función esta acoplada fuertemente dentro del sistema, de forma que no puede ser considera una parte independiente, extraíble o sustituye. Es un "todo" junto con el resto de funciones.

En esta situación es una bomba de tiempo esperando explotar en cualquier momento, es necesario ser consciente de la situación y ponerle remedio, analizar las dependencias de la función o el modulo oportunamente y reestructurarlo para que el sistema sea libre de poder recibir nuevos cambios y funcionalidades con el menor impacto posible.