Una cuestión recurrente en el contexto del uso de Scrum es ¿cuándo se crea la arquitectura del software? ¿Será en el primer Sprint? ¿En el Sprint final?
Esta cuestión parece ser más compleja de resolver aún si consideramos que Scrum es estricto en esto: al final de cada Sprint, tenemos que entregar una pieza de software funcionando, eventualmente integrada con piezas anteriores (esta es la razón por la que se prefiere el término “incremento”), de acuerdo con una Definición de Listo. ¿Cómo puede la arquitectura de software tener un espacio aquí’ ¿Qué es la arquitectura de software en Scrum? ¿Es realmente necesaria? ¿Son Scrum y la arquitectura de software realmente compatibles?
Vamos a las raíces: ¿Qué es Arquitectura de Software?
Responder esta pregunta claramente nos puede llevar a un conflicto de argumentos. No hay una única definición debido a diferentes puntos de vista, así como también a la evolución del concepto. Algunos arquitectos ven la arquitectura como un producto de trabajo lejos de la implementación, preocupada solo de las “grandes cosas en grandes sistemas.” A estos arquitectos normalmente los escucharemos decir cosas como “en este sistema no hay arquitectura.” Otros, no obstante, ven la arquitectura como algo que se posiciona más cerca de la implementación.
¿Qué tienen en común estas visiones? Decisiones. Por supuesto, a diferentes niveles, pero tienen en común «decisiones de diseño». Jan Bosch [1] argumenta que la arquitectura de software es la composición de un conjunto de decisiones llamadas “arquitecturales”. Taylor et al. [2] comentan que la arquitectura de software es el conjunto de las principales decisiones de diseño realizadas acerca de un sistema. Es decir, podemos tomar muchas decisiones, pero no todas ellas son arquitecturales. Bosch también agrega que las decisiones arquitecturales tienen las siguientes características:
- Tienen influencia en la estructura del sistema. Por ejemplo, usar una base de datos SQL implica agregar un componente de administración de datos.
- Pueden definir una o más reglas de diseño. Por ejemplo, cuando se decide usar MVC, hay algunas reglas concretas que especifican una forma particular de responder a los eventos originados por el usuario a través de una interfaz gráfica.
- Pueden imponer restricciones de diseño. Por ejemplo, cuando se decide usar un modelo de datos relacional, emergen una serie de restricciones acerca de cómo las clases se van a organizar y los componentes que pueden ser seleccionados.
- Tienen asociado un “rationale”, es decir, una razón fundamental. Las decisiones, por tanto, se asumen como realizadas después de algún razonamiento. Por ejemplo, cuando se decide usar una base de datos para grafo porque será más fácil administrar las relaciones entre los clientes de un sistema.
A modo de ejemplo, usar un patrón particular para describir métodos en nuestro código Java es claramente una decisión de diseño, pero no es arquitectural. Por otro lado, la selección de un grupo de patrones de diseño para estructurar el sistema en capas sí es una decisión arquitectural. Seleccionar un motor NoSQL particular por sobre un motor SQL también es una decisión arquitectural.
Arquitectura de Software en Scrum
La idea clave aquí es que cuando hablamos de arquitectura de software, estamos hablando de tomar decisiones. Scrum indica que debemos tener incrementos de software funcionando al final de cada Sprint. Se llaman incrementos y no módulos o partes porque se asumen que pueden estar integrados con las entregas anteriores. Además, los incrementos de producen de acuerdo con una “Definición de Listo.”
Las decisiones de diseño que se van tomando durante el Sprint van constituyendo lo que llamaremos arquitectura de software. De esta forma, entenderemos que la arquitectura emerge y se encuentra inmersa en la pieza de software funcionando o incremento. Esto nos lleva al principal argumento de este artículo: no hay un momento especial para el diseño de la arquitectura de software en Scrum. No hay un “Sprint de arquitectura de software”. En Scrum, la arquitectura de software emerge, no es creada en alguna instancia o momento específico.
Hasta ahora, el lector podría haber notado que estoy considerando a las decisiones de diseño como si fueran historias de usuario. ¿Es así? Sí. Si bien las decisiones de diseño claramente no son historias de usuario, tienen una propiedad común: las consideramos entidades de primera clase. Esto significa que las podemos gestionar y manipular como si fueran cualquier otro objeto. En este contexto, una decisión de diseño puede ser caracterizada por muchos atributos. Los atributos más comunes son: un identificador, el nombre de la decisión, la descripción de una decisión, el identificador de las decisiones que implicaron o afectaron esta decisión, el identificador de las decisiones que se ven afectadas por esta decisión, un timestamp, las personas involucradas en la decisión, y un “rationale” para la decisión. Las decisiones de diseño pueden ser trabajadas en un Sprint como cualquier otro elemento del Sprint Backlog.
Dependiendo del tipo de decisión, esta podría estar presente como un elemento separado en el Backlog o bien ser una “nota” que especifique algún detalle en un elemento del Backlog. Esto es algo que finalmente el equipo de desarrollo va a decidir.
Lo importante es que, al final del Sprint, cuando el equipo de desarrollo ha terminado suficientes ítems del Sprint Backlog para alcanzar el Objetivo del Sprint, tendremos, de acuerdo con la Definición de Listo, un incremento que comprende varias decisiones de diseño arquitecturales. La Definición de Listo es muy importante para la toma de decisiones de diseño dado que está más relacionada con atributos de calidad que con requisitos funcionales. Es perfectamente válido tener una Definición de Listo como “el software debe mantener una estructura modular que facilite la integración continua.” El lector notará que una Definición de Listo como esta va a restringir el conjunto potencial de decisiones de diseño arquitecturales que se puedan tomar, lo cual es consistente con la restricción que emerge desde los atributos de calidad.
Para resumir, la arquitectura de software en Scrum es el conjunto de decisiones de diseño arquitecturales que están comprendidas en el “incremento”, ya sea que estas se encuentren documentadas o no. Por supuesto, soy un defensor de la idea de que se deben documentar. Pero me interesa que el lector note que la documentación es una representación y que esta aparece a consecuencia de las decisiones tomadas.
El “gran diagrama” en Scrum
Muchos arquitectos disfrutan elaborar diagramas con componentes, conectores y muchas otras cosas que impresionan, tanto en pizarras como directamente en algún software para UML o Archi. No hay problema con esto, incluso si se realiza en las primeras horas del primer Sprint. Usualmente, estos artefactos son también muy valiosos para que el equipo de desarrollo pueda reflexionar y discutir acerca de los ítems prioritarios en el Product Backlog.
Lo importante es recordar que un diagrama será siempre un diagrama y no son una arquitectura, al menos no en Scrum.
Documentar la Arquitectura de Software en Scrum
Este es otro asunto controversial en Scrum. Primero, Scrum no es una metodología. Es un framework. Por tanto, no manda ni más ni menos documentación. La idea clave aquí es entender que, dependiendo de lo que el Product Owner haya considerado como valorable, también podemos terminar con documentación para la arquitectura de software. EL equipo de desarrollo podrá también explicar al Product Owner la importancia, es decir, el por qué y el cómo, de la documentación de la arquitectura.
[1] «Software Architecture: The Next Step», Bosch, Springer, 2004.
[2] «Software Architecture: Foundations, Theory, and Practice», Taylor et al. Wiley, 2010.
NOTA: Este escrito es una actualización de un artículo que escribí hace algunos años para DZone (versión original en inglés: «What Is Software Architecture in Scrum?»).