Gracias a la evolución de la tecnología y las herramientas de desarrollo de software en la actualidad tenemos patrones, arquitecturas y modelos comprobados que podemos seguir para construir nuestras aplicaciones. Por ejemplo: Arquitectura por capas, principios de desarrollo como los principios SOLID y patrones de diseño.
Sin embargo, desde mi experiencia hay muchos aspectos aún tradicionales en la construcción de software que van en contra de la misma naturaleza del desarrollo y la abstracción de la realidad que intentamos hacer al programar.
En este articulo quiero compartir una reflexión sobre como pensar diferente la forma en que construimos nuestras aplicaciones y aplicamos arquitectura de software.
1. Homogeneidad de modulos y componentes
Un edificio conserva un patrón dentro de sus partes tanto externas como internas. En un edificio de apartamentos pueden existir 2 o 3 estilos de apartamentos y estos conservan una semejanza en cada detalle para respetar los intereses de los compradores y dueños. Son pequeñas las zonas en las que existe alguna diferencia significativa y la rigidez de los muros, las columnas y las bases hace que sea difícil realizar cambios significativos en el futuro.
Las módulos y componentes en una aplicación son muy dinámicos y gracias a las buenas prácticas de experiencia de usuario las aplicaciones se ajustan a los comportamientos y fluidez en la que el usuario interactúa con la aplicación, tal cual como lo hace un árbol.
Las ramas y las raíces de un árbol son parecidas, pero no iguales, la intención de que sean perfectamente iguales no está contemplada en la naturaleza, la forma depende del entorno, los obstáculos que encuentre, el clima y demás variables que se presentan durante su desarrollo, exactamente igual como una aplicación debe comportarse dentro de su ciclo de análisis e implementación.
2. Adaptabilidad
Algo maravilloso de la naturaleza es que no se detiene a pesar de los obstáculos, se puede adaptar, ajustar, repensar y buscar la mejor manera de solventar los desafíos.
Los árboles son un ejemplo claro de eso, a medida que van creciendo pueden ir cambiando la ubicación de sus raíces y ramas e incluso la forma en que sale sus hojas de acuerdo con el clima para sobrevivir.
A pesar de invertir tiempo en análisis, toma de requisitos y planeación, en el camino de la construcción de un software podemos encontrar desafíos muy grandes y cambios repentinos de tecnología que nos deben hacer replantear nuestro camino, esto debe ser algo natural y debe fluir dentro del proceso de desarrollo, así como también en la arquitectura de nuestra aplicación.
Debemos poder cambiar componentes o conectar con nuevos servicios utilizando elementos abstractos que nos permita transformar el proyecto sin afectar drásticamente nuestra arquitectura.
3. Tolerancia a cambios y fallos
Este punto esta relacionado a aplicaciones que ya estén en producción, aunque sigan en fase de desarrollo.
Si analizamos un árbol adulto de varios años, podemos ver que sus múltiples raíces y ramas le permite tener tolerancia ante cambios brucos de clima, o algún fenómeno perturbe una de sus extremidades. Podemos incluso cortar ramas del árbol y este seguirá en pie absorbiendo nutrientes y cumpliendo su función usando otras ramas.
Existen varias arquitecturas y prácticas que nos permiten lograr este comportamiento de los árboles en una aplicación, por ejemplo, la arquitectura de microservicios. Implementando esta arquitectura podemos dividir nuestras aplicaciones en pequeños componentes aislados que no dependan uno de otro y que cumplan una función específica. Nuestra aplicación puede sobrevivir a un problema grave en que algunos módulos que ya no funcionen y aun así seguir disponible para que los usuarios puedan realizar otras acciones.
La alta disponibilidad que necesitan nuestras aplicaciones debe estar inspirada en la forma en que los árboles están preparados ante cualquier eventualidad de la naturaleza.
4. Evolución y mejora continua
Un edificio tiene etapas de diseño, planeación y construcción, después de estas etapas los cambios que se pueden realizar a nivel general son mínimos.
No pudiéramos reemplazar un piso o agregar otro, tampoco mover el edificio a otro lugar. Si bien hay nuevas técnicas de construcción que permiten cambios y en donde se ensamblan los edificios por piezas en vez de construirlas, en este punto me refiero a las construcciones tradicionales que hoy siguen siendo las más usadas.
¡Los Árboles por su parte nunca paran de crecer! ni en sus ramas y en sus raíces. Si bien en una edad avanzada un árbol es poco lo que crece nunca detiene su crecimiento o adaptación a su medio. Un árbol también se puede trasplantar (aunque sea un proceso difícil por su edad) y este se puede adaptar a su nuevo entorno. Esto va relacionado a la migración de aplicaciones a la nube, uso de nuevos servicios o cuando movemos aplicaciones de una nube a otras, el proceso será difícil pero no puede ser imposible.
Ninguna aplicación moderna interrumpe su crecimiento, siempre va necesitar cambios, actualizaciones y mejoras, por eso debemos contemplar en nuestra arquitectura este fenómeno que va hacer parte de las futuras fases del desarrollo.
Conclusión
Hay muchos otros aspectos que resaltar de los árboles y que podemos aprovechar para pensar mejor el diseño de nuestras aplicaciones como la forma en que las raíces le permiten aferrarse a la tierra cuando hay deslizamientos o la forma en que van generando una nueva corteza cada año (lo que podemos relacionar al actualizar nuestras librerías y frameworks y mantener nuestro proyecto actualizado).
Con esta reflexión solo quiero que pensemos mejor el diseño y arquitectura de nuestras aplicaciones de una manera más natural y orgánica para que la armonía de los requisitos y las tecnologías que usamos nos permitan construir la mejor solución.
Me gusto muchísimo la analogía que planteas Miguel. Las bases de la ingeniería del software en general fueron fundadas sobre principios de la ingeniería civil. El software es dinámico y debe ser flexible, tal como los árboles, no como un edificio.
Genial reflexión 🙂