Novedades - Tecnología - El enfoque evolutivo en la arquitectura de software
El enfoque evolutivo en la arquitectura de software
24 Jul, 2024
¿Qué es la arquitectura?
Para hablar de arquitecturas evolutivas, en primer lugar, debemos ponernos de acuerdo sobre a qué nos referimos cuando hablamos de arquitectura de software. Esta implica el diseño y la estructura que permiten a los desarrolladores crear y mantener sistemas y aplicaciones complejas. Una buena arquitectura proporciona una base sólida para el desarrollo de aplicaciones y permite la escalabilidad, el mantenimiento y la evolución del sistema a lo largo del tiempo. En este sentido, el enfoque evolutivo en la arquitectura de software se ha vuelto cada vez más relevante. En lugar de construir una arquitectura fija y rígida que pueda volverse obsoleta con el tiempo, el enfoque evolutivo se centra en la creación de sistemas adaptables y flexibles que puedan cambiar y evolucionar junto con las necesidades del negocio.
El trabajo del equipo técnico es, entonces, equilibrar los requerimientos de negocio con factores no funcionales que hacen a la calidad de la solución.
Estas características no funcionales, como por ejemplo: el rendimiento, la seguridad, la legalidad, la escalabilidad, etc., son muy variadas y es parte de la responsabilidad del arquitecto identificar cuáles son relevantes para el negocio y velar por su cumplimiento.
El enfoque evolutivo
Una arquitectura evolutiva se centra en la evolución constante en lugar de crear una arquitectura fija y rígida. La idea principal es que el diseño debe ser adaptable y flexible para enfrentar los cambios inevitables que pueden ocurrir en el futuro.
Esta visión se opone a las prácticas y metodologías tradicionales que intentaban lograr una estructura definitiva, tratando de adivinar el futuro del negocio y los cambios en el entorno. Estas soluciones eran genéricas y complejas, y debían funcionar bajo múltiples escenarios futuros.
Esto no quiere decir que este tipo de enfoques hayan sido erróneos, sino que simplemente funcionaron en momentos en los que solo las corporaciones de gran tamaño con estructuras más estáticas tenían acceso al desarrollo de software a medida, y esto tenía sentido en ese contexto.
Prácticas clave para una arquitectura evolutiva
Para poder implementar un enfoque evolutivo, debemos tener en cuenta diferentes aspectos:
- Modularización
Lo primero que pensamos cuando hablamos de modularización es “Microservicios”. No esta mal pensarlo, de hecho es una de las herramientas mas potentes para lograrla, ya que fuerza limites físicos entre los componentes, restringiendo el acoplamiento indeseado.
Sin embargo también hay que entender el contexto del producto o proyecto que estamos desarrollando y las desventajas que viene asociadas a este tipo de estructuras.
Martin Fowler en su articulo “Monolith First” expresa:
1. Casi todas las historias exitosas de microservicios han comenzado con un monolito que se volvió demasiado grande y se dividió.
2. Casi todos los casos en los que he escuchado de un sistema que fue construido con microservicios desde cero, ha terminado en serios problemas.
Entonces, una buena forma de comenzar es mediante el uso de monolitos modulares. Este tipo de estructura nos incita a pensar la aplicación de manera modular, pero en lugar de forzar limites físicos, implementamos limites lógicos entre los módulos. De esta manera, logramos todas las ventajas de ambos mundos y no caemos en el costo operativo de mantener una arquitectura compleja.
- Implementación de Fitness Functions
Las "Fitness Functions" nos permiten evaluar la calidad del producto en función de un conjunto de características no funcionales, como las que describimos anteriormente. Es un concepto que deriva de los tests automatizados, pero enfocado a validar la arquitectura en lugar de las funcionalidades. El objetivo principal es permitir la evolución de la arquitectura y al mismo tiempo detectar problemas y desviaciones, tomando medidas correctivas antes de que se conviertan en problemas más graves.
- Experimentar y desechar
El concepto de evolución implica necesariamente reemplazar algo viejo, por algo nuevo que se adapta mejor al contexto actual. Esto va a generar una necesidad recurrente de experimentación en búsqueda de nuevas soluciones, que van a tender a desplazar soluciones anteriores. Esto sumado a los experimentos fallidos nos van a llevar a desechar mucho trabajo.
El objetivo de este punto es desarrollar una mentalidad que nos permita aceptar que algunos experimentos pueden fallar y que se debe estar dispuesto a desechar el trabajo que ya se ha hecho, de esta forma los equipos pueden evitar quedar atrapados en soluciones obsoletas o ineficaces y, en cambio, avanzar hacia soluciones más efectivas y adaptativas. Este enfoque de experimentación y descarte también ayuda a fomentar una cultura de innovación y mejora continua en el equipo técnico.
- Buscar equipos multifuncionales y evitar los silos
Este punto hace referencia a la importancia de tener equipos multidisciplinarios que trabajen juntos en lugar de departamentos aislados o "silos". Esto permite una mejor colaboración entre los miembros del equipo y evita la creación de barreras en el proceso de desarrollo. Además, los equipos multifuncionales tienen más habilidades y experiencia en diferentes áreas, lo que puede ayudar en la toma de decisiones y en la identificación de posibles problemas.
No siempre es fácil lograr este punto. En regiones donde la oferta laboral sea alta y el desarrollo y retención de recursos sea costoso, se beneficiarán de áreas que centralicen políticas, buenas prácticas y recomendaciones sobre temas específicos. Sin embargo, incluso en este contexto, debemos tratar siempre de impulsar a que los equipos sean capaces de operar por sí mismos.
Si estás interesado en profundizar sobre estos temas, el libro "Building Evolutionary Architectures" de Neal Ford, Rebecca Parsons y Patrick Kua te brindará herramientas importantes para diseñar sistemas adaptables y flexibles que puedan evolucionar junto con las necesidades del negocio.
Franco Bostico - Technology Director of Jemersoft