Hace unos días tuve la oportunidad de asistir a una charla de Neal Ford titulada: Building Evolutionary Architectures. Neal arrancó la charla con la siguiente observación (palabra más, palabra menos):

Los cambios en el software realmente tienen dos orígenes. Por un lado, están los cambios relacionados con el modelo de negocio (los famosos requerimientos) y existen muchísimas herramientas para abordarlos y gestionarlos dentro de un proyecto. Pero además hay otro tipo de cambios que son generalmente ignorados: los cambios en el ecosistema donde funciona el software. Cada vez más, vemos cómo el entorno donde se despliega el software no es estático, sino que va evolucionando a su propia velocidad y de manera independiente.

La observación era evidente pero creo que nunca antes alguien lo había expresado tan claramente. Para mi fue casi reveladora.

Tenemos un montón de herramientas para abordar y tratar los cambios funcionales y técnicos en el modelo de negocio: desde patrones de diseño, herramientas de documentación, metodologías ágiles para trabajar en los proyectos, etc. Y hay también alternativas para automatizar y controlar el proceso despliegue.

Pero no tenemos muchas herramientas para mitigar el impacto que tiene la evolución del ecosistema donde se instala y ejecuta el software. Estos cambios pueden ir desde una simple actualización de los sistemas operativos, caídas en los servidores hasta cambios en el marco legal del negocio.

¿Cómo preparamos la arquitectura de un sistema para evitar que se vaya degradando con el tiempo?

Tradicionalmente, la definición de la arquitectura de un sistema se refiere a sentar una base firme para fundar todo el diseño. Y es una de las fases iniciales. Pero Neal da una vuelta de tuerca e introduce el concepto de arquitecturas evolutivas para explicar que todo en el desarrollo de software es dinámico, incluída la arquitectura:

An evolutionary architecture supports incremental, guided changes as a first principle across multiple dimensions.

Las dimensiones a las que se refiere aparecen cuando el software se despliega en su entorno de ejecución y éste comienza a evolucionar. Así, aparecen problemas inesperados, como por ejemplo, la necesidad de mantener con vida varias versiones incompatibles del sistema.

¿Es posible definir una arquitectura capaz de asimilar elegantemente esos cambios?

El tema da para mucho y tendré que investigar más a fondo. Todos los conceptos están desarrollados más en profundidad en el libro Building Evolutionary Architectures: Support Constant Change. También se puede ver el vídeo de otra charla sobre el mismo tema.