Be Software Architecture Wise
Be Wise Apps

Read in English · Lire en français · Auf Deutsch lesen

Sección 2.3 de 2.8 · Intermedio · 18 min de lectura

Escribir escenarios de atributos de calidad que se puedan probar

Videolección

5 min · narrado en inglés, con subtítulos
Solo escuchar (audio)
Leer la transcripción

La lección anterior te dio el vocabulario de las cualidades. Esta te da la gramática: una forma sencilla que convierte cualquier deseo de calidad en algo para lo que puedes diseñar y que puedes probar.

Decirle a un constructor que haga el tejado resistente no le da nada que comprobar. Decirle que el tejado debe soportar cincuenta centímetros de nieve húmeda durante una tormenta invernal sí se lo da. Nombra lo que ocurre, la nieve, y las condiciones, una tormenta. Y dice lo que debe ocurrir, que no haya filtraciones, con un número que se puede medir: no más de dos centímetros de hundimiento. Un escenario de atributo de calidad hace lo mismo con el software.

Todo escenario tiene las mismas seis partes, y juntas cuentan una pequeña historia. Sigámosla de izquierda a derecha. Primero, la fuente del estímulo: la persona, el sistema o el evento que lo pone todo en marcha. Clientes, un proceso por lotes, un desarrollador, un atacante o un disco que falla. Segundo, el estímulo en sí: el evento al que debe responder el sistema. Una ráfaga de solicitudes, la caída de un servidor, una solicitud de cambio o un inicio de sesión con credenciales robadas. Tercero, el artefacto: la parte del sistema afectada. Nombrarlo le dice al equipo dónde deben hacerse el trabajo de diseño y la medición. Cuarto, el entorno: las condiciones. Funcionamiento normal, carga máxima, degradado o bajo ataque. La misma caída puede exigir respuestas muy distintas en condiciones distintas. Quinto, la respuesta: lo que hace el sistema. Y sexto, la medida de la respuesta: el número que te dice que funcionó lo bastante bien. El estímulo y la medida son las partes que más a menudo se olvidan. Aquí tienes un ejemplo completo. Quinientos compradores por segundo llegan al pago en Black Friday. Los pedidos se confirman, el noventa y nueve por ciento de ellos en menos de uno punto cinco segundos, y no se pierde ningún pedido.

Hay dos tipos de escenario. Un escenario general es una plantilla para una cualidad. Para la disponibilidad, enumera estímulos típicos, como una caída o una respuesta incorrecta, y medidas típicas, como el tiempo de reparación. Un escenario concreto rellena valores específicos para un sistema. La base de datos principal de pedidos se cae durante el funcionamiento normal, y las escrituras se reanudan en menos de sesenta segundos sin perder ningún pedido confirmado. Los escenarios concretos son tus requisitos. Así que usas el escenario general como lista de comprobación y luego escribes el puñado de escenarios concretos que importan para tu sistema.

La mayoría de los requisitos de calidad nacen como adjetivos. El sitio debe ser rápido se convierte en: en el pico de la tarde, de trescientas búsquedas por segundo, los resultados llegan en menos de cuatrocientos milisegundos para el noventa y cinco por ciento de las solicitudes, y en menos de un segundo para el noventa y nueve por ciento. Alta disponibilidad se convierte en: si falla uno de los tres servidores, las reservas continúan, no se pierde ninguna reserva confirmada y los usuarios ven errores durante no más de treinta segundos. Fíjate en que combina un número de velocidad con un número de corrección. Fácil de cambiar se convierte en: un desarrollador puede añadir una nueva opción de entrega en no más de tres días, cambiando solo el módulo de entregas. Si no estás seguro de cuál es el número correcto, empieza por la evidencia y propón uno. Preguntar si cuatrocientos milisegundos es aceptable da pie a una conversación mucho mejor que preguntar qué tan rápido debería ser.

Los mismos errores aparecen una y otra vez. El primero es omitir la medida de la respuesta. Sin un número, un escenario no es más que un deseo. El segundo es usar una media para los tiempos. Las medias ocultan los valores atípicos lentos, así que especifica percentiles en su lugar. La Sección dos punto cuatro explica por qué. El tercero es mezclar varios estímulos, como que la carga se duplique o que falle un servidor. Sepáralos en escenarios distintos. El cuarto es el más dañino: escribir una solución, como usar una cola de mensajes, en lugar de la necesidad. Si alguien insiste en una tecnología, pregunta qué problema resuelve. La respuesta es el escenario real. Y el quinto es omitir el entorno. ¿Se recupera en menos de cinco minutos, de qué y cuándo?

Un escenario bien escrito ya es la mayor parte de una prueba. Esta es su vida. Antes del lanzamiento, se convierte en una prueba de aceptación. Un escenario de rendimiento se convierte en una prueba de carga, y un escenario de disponibilidad, en un simulacro de conmutación por error. Después se convierte en una función de aptitud: una comprobación automatizada que se ejecuta en cada cambio, de modo que la compilación falla cuando la cualidad se desvía. La monitorización de producción lo vigila todo el tiempo, y esa evidencia vuelve para afinar el escenario y sus números.

La sección completa incluye las seis partes en detalle, escenarios para seis cualidades distintas y una lista de comprobación para saber cuándo un escenario está listo. A continuación, en la Sección dos punto cuatro, veremos el rendimiento y la escalabilidad. Nos vemos allí.

Lo que necesitas saber

Por qué escenarios

La Sección 2.2 te dio el vocabulario de las cualidades; esta sección te da la gramática. El nombre de una cualidad por sí solo, como rendimiento o seguridad, no permite diseñar ni probar nada. Ni siquiera basta con un número por sí solo: '2 segundos' no significa nada hasta que sabes para qué operación, con qué carga, medido dónde y para qué proporción de solicitudes. El escenario de atributo de calidad, desarrollado en el Software Engineering Institute (SEI) y expuesto por Len Bass, Paul Clements y Rick Kazman en Software Architecture in Practice, resuelve esto obligando a que todo requisito de calidad adopte la misma forma de seis partes.

La idea es sencilla. Toda cualidad se manifiesta cuando algo le ocurre a un sistema: una avalancha de usuarios, una caída, una solicitud de cambio, un ataque. Un escenario nombra ese evento, las circunstancias, la parte del sistema afectada, lo que debe ocurrir y cómo sabrás que ocurrió lo bastante bien. Es breve (normalmente de una a tres frases), concreto y comprobable. Y como todas las cualidades usan la misma forma, los escenarios de rendimiento, seguridad y modificabilidad pueden figurar uno junto a otro en una sola lista priorizada.

Las seis partes

Las seis partes son la fuente del estímulo, el estímulo, el artefacto, el entorno, la respuesta y la medida de la respuesta. Apréndelas en ese orden, porque juntas cuentan una pequeña historia: alguien o algo hace algo a una parte del sistema en ciertas condiciones; el sistema hace algo, y lo medimos así. El estímulo y la medida de la respuesta son las dos partes que más a menudo se olvidan, y son las dos que más importan.

Anatomía de un escenario

Las seis partes de un escenario de atributo de calidad: una fuente envía un estímulo a un artefacto dentro de un entorno, que produce una respuesta evaluada con una medida de la respuesta1 Fuentequién o qué2 Estímuloel evento4 Entornonormal, pico, degradado, bajo ataque3 Artefactosistema o parte5 Respuestaqué hace6 Medida derespuestael númeroEjemplo: 500 compradores por segundo (fuente, estímulo) llegan al proceso de pago (artefacto) en Black Friday (entorno);pedidos confirmados (respuesta) con p99 < 1.5 s y ninguno perdido (medida de la respuesta).
Una fuente produce un estímulo que llega a un artefacto dentro de un entorno; la respuesta del artefacto se evalúa con una medida de la respuesta.

Las seis partes en detalle

ParteSignificadoEjemplos
Fuente del estímuloLa persona, el sistema o el evento que genera el estímulo.Clientes en teléfonos móviles; un proceso por lotes interno; un desarrollador; un atacante; un disco que falla.
EstímuloEl evento al que debe responder el sistema.Una ráfaga de solicitudes; la caída de un servidor; una solicitud de cambio; un intento de inicio de sesión con credenciales robadas.
ArtefactoLa parte del sistema que recibe el estímulo: el sistema completo o un componente concreto.El servicio de pago; la base de datos de pedidos; el módulo de precios; el pipeline de despliegue.
EntornoLas condiciones en las que llega el estímulo.Funcionamiento normal; pico de Black Friday; un centro de datos caído; durante un despliegue; en desarrollo.
RespuestaLo que hace el sistema (o las personas que lo rodean) como resultado.Procesa el pedido; conmuta a la réplica; el cambio se hace, se prueba y se despliega; el intento se bloquea y se registra.
Medida de la respuestaCómo se mide la respuesta, para que el escenario se pueda probar.p99 por debajo de 800 ms; servicio restablecido en 60 s sin pedidos perdidos; menos de 2 días-persona; 100% de los intentos bloqueados.

El entorno merece especial atención porque el mismo estímulo puede exigir respuestas muy distintas en condiciones distintas. La caída de un servidor durante el funcionamiento normal puede requerir una conmutación por error automática en menos de un minuto; la misma caída durante una ventana de mantenimiento planificada puede ser aceptable con una recuperación manual. Una solicitud de cambio en tiempo de diseño (antes del lanzamiento) cuesta mucho menos que el mismo cambio cuando ya se han acumulado datos en producción. Escribir el entorno de forma explícita evita que se comparen escenarios que en realidad tratan de situaciones distintas.

El artefacto importa por una razón parecida. 'El sistema responde en menos de 200 ms' oculta qué parte es responsable. Nombrar el artefacto (el servicio de búsqueda, el API gateway, el cliente móvil) indica al equipo dónde deben hacerse el trabajo de diseño y la medición. Para algunas cualidades, como la modificabilidad y la desplegabilidad, el artefacto puede ser el código, la configuración o el pipeline de entrega en lugar de un componente en ejecución.

Escenarios generales y concretos

Bass, Clements y Kazman distinguen dos tipos. Un escenario general es independiente del sistema: para un atributo de calidad, enumera los valores típicos que puede tomar cada parte. Para la disponibilidad, por ejemplo, las fuentes pueden ser internas o externas, personas, hardware, software o infraestructura; los estímulos pueden ser una caída, una omisión, una temporización incorrecta o una respuesta incorrecta; las respuestas pueden ser detectar, registrar, recuperar, enmascarar o degradar; y las medidas pueden ser el tiempo de detección, el tiempo de reparación, el porcentaje de disponibilidad o la proporción de solicitudes atendidas.

Un escenario concreto elige valores específicos para un sistema determinado: 'la base de datos principal de pedidos se cae durante el funcionamiento normal; la réplica toma el relevo y las escrituras se reanudan en menos de 60 segundos sin perder ningún pedido confirmado'. Los escenarios generales son plantillas y listas de comprobación; los escenarios concretos son requisitos. Usas el escenario general para asegurarte de haber considerado las fuentes, los estímulos y las medidas adecuados, y luego escribes el puñado de escenarios concretos que importan para tu sistema.

De afirmaciones vagas a escenarios comprobables

La mayoría de los requisitos de calidad nacen como adjetivos. La habilidad consiste en hacer las preguntas que convierten cada adjetivo en un escenario: ¿qué operación?, ¿provocada por quién?, ¿con qué frecuencia o en qué cantidad?, ¿en qué condiciones?, ¿qué debe ocurrir?, ¿qué número nos dice que funcionó? La tabla muestra pares típicos de antes y después. Observa que las versiones de 'después' a veces revelan que la parte interesada quería decir varias cosas distintas, que pasan a ser varios escenarios.

Antes y después

Afirmación vagaEscenario comprobable
El sitio debe ser rápido.Durante el pico de las tardes de los días laborables, de 300 búsquedas por segundo, la búsqueda de productos devuelve resultados en menos de 400 ms para el 95% de las solicitudes y en menos de 1 s para el 99%, medido en el balanceador de carga.
El sistema debe tener alta disponibilidad.Si uno de los tres servidores de aplicaciones falla durante el funcionamiento normal, el servicio de reservas sigue aceptando reservas; no se pierde ninguna reserva confirmada y los usuarios ven errores durante no más de 30 segundos.
El sistema debe ser seguro.Cuando un atacante envía 10 000 intentos de inicio de sesión por minuto con credenciales filtradas, el sistema bloquea el origen tras 20 fallos, avisa al equipo de seguridad en menos de 5 minutos, y los usuarios legítimos desde otras direcciones pueden seguir iniciando sesión.
El código debe ser fácil de cambiar.Cuando el negocio pide una nueva opción de entrega, un desarrollador que conozca el código puede implementarla, probarla y desplegarla en no más de 3 días, cambiando solo el módulo de entregas y su configuración.
La app debe ser fácil de usar.Un usuario nuevo sin formación puede registrarse y hacer un pedido en menos de 4 minutos; el 90% de los participantes en la prueba lo consigue al primer intento.
Los despliegues deben ser fáciles.Un desarrollador puede lanzar a producción un cambio en el servicio de pedidos en menos de 30 minutos tras el merge, sin tiempo de inactividad, y revertirlo en menos de 5 minutos si suben las tasas de error.

Ejemplos de escenarios para seis cualidades

Los ejemplos siguientes usan una misma tienda en línea para que veas cómo se ven distintas cualidades en el mismo formato. Cada uno está escrito de forma compacta, con las seis partes etiquetadas; en la práctica, los equipos suelen escribirlos en una o dos frases.

Escenarios concretos para una tienda en línea

CalidadEscenario (fuente, estímulo, artefacto, entorno, respuesta, medida)
RendimientoFuente: clientes con sesión iniciada. Estímulo: 2000 envíos de pedidos por minuto. Artefacto: servicio de pago. Entorno: pico del viernes por la tarde. Respuesta: pedidos validados, almacenados y confirmados. Medida: p95 ≤ 1.5 s, p99 ≤ 3 s, cero pedidos perdidos.
DisponibilidadFuente: hardware interno. Estímulo: se cae el nodo principal de la base de datos. Artefacto: base de datos de pedidos. Entorno: funcionamiento normal. Respuesta: réplica promovida automáticamente, solicitudes en curso reintentadas. Medida: las escrituras se reanudan en menos de 60 s; ningún pedido confirmado perdido (RPO = 0).
ModificabilidadFuente: product owner. Estímulo: solicitud para añadir un nuevo método de pago. Artefacto: componente de pagos. Entorno: tiempo de diseño, tras el lanzamiento inicial. Respuesta: cambio hecho, probado y desplegado. Medida: ≤ 5 días-persona; ningún cambio fuera del componente de pagos; ninguna regresión en los métodos existentes.
SeguridadFuente: un cliente con sesión iniciada que actúa de forma maliciosa. Estímulo: intenta leer los pedidos de otro cliente cambiando un ID en la URL. Artefacto: API de pedidos. Entorno: funcionamiento normal. Respuesta: solicitud denegada y registrada con la identidad de quien llama. Medida: 100% de esas solicitudes rechazadas; alerta generada en menos de 1 minuto tras 5 intentos.
UsabilidadFuente: cliente nuevo. Estímulo: quiere cambiar la dirección de entrega después de hacer el pedido. Artefacto: frontends web y móvil. Entorno: en ejecución, sin ayuda disponible. Respuesta: completa el cambio sin ayuda. Medida: el 90% de los participantes en la prueba de usabilidad lo consigue en menos de 2 minutos.
DesplegabilidadFuente: desarrollador. Estímulo: un cambio fusionado en el servicio de catálogo. Artefacto: pipeline de despliegue y servicio de catálogo. Entorno: horario laboral, carga normal. Respuesta: compilado, probado y desplegado de forma progresiva. Medida: en producción en menos de 45 minutos; cero tiempo de inactividad; rollback automático en menos de 5 minutos si la tasa de error supera el 1%.

Vale la pena fijarse en dos rasgos de estos ejemplos. Primero, los escenarios no tratan solo del software en ejecución. Los escenarios de modificabilidad y desplegabilidad tienen como fuentes a desarrolladores y product owners, y sus medidas son el esfuerzo, el tiempo transcurrido y el alcance del cambio. Segundo, las buenas medidas suelen combinar un número de velocidad con un número de corrección: 'en menos de 60 segundos' y 'ningún pedido confirmado perdido'. Una conmutación por error rápida que pierde datos no es lo que quería el negocio.

Errores comunes

Al revisar cientos de escenarios escritos por equipos aparecen los mismos errores una y otra vez. Cada uno hace que un escenario sea imposible de probar o engañoso.

Errores y cómo corregirlos

ErrorEjemploCorrección
Sin medida de la respuesta'Con carga máxima, el proceso de pago responde rápidamente.'Añade un número y una estadística: 'p95 ≤ 1.5 s, p99 ≤ 3 s'.
Media en lugar de percentil'Tiempo de respuesta medio por debajo de 300 ms.'Las medias ocultan los valores atípicos lentos; especifica percentiles (Sección 2.4).
Varios estímulos en un escenario'Cuando la carga se duplica, falla un servidor o se ejecuta un despliegue, el sistema sigue siendo rápido.'Divídelo en tres escenarios, cada uno con su propio entorno y su propia medida.
Solución disfrazada de requisito'El sistema usa Redis para almacenar en caché las páginas de producto.'Expresa la necesidad ('las páginas de producto cargan en menos de 300 ms para el 95% de las visualizaciones con 1000 visualizaciones por segundo') y deja la caché como opción de diseño.
Falta el entorno'El servicio se recupera en menos de 5 minutos.'Di de qué y cuándo: 'tras la caída de una sola zona durante el funcionamiento normal'.
Palabras que no se pueden medir'Con elegancia', 'sin interrupciones', 'de forma robusta', 'fácil de usar'.Sustituye cada una por un comportamiento observable y un número.
Absolutos imposibles'El sistema nunca se cae.' '100% de los ataques bloqueados.'Usa objetivos realistas y di qué ocurre cuando no se cumplen.

Guía de decisión

Guía de decisión: ¿está listo este escenario?

Pasa cada borrador de escenario por estas preguntas antes de que entre en el documento de arquitectura o en el backlog.

  1. ¿Describe un único estímulo con una fuente nombrada?
    SíContinúa.
    NoDivídelo, o nombra quién o qué provoca el evento.
  2. ¿Indica el entorno (normal, pico, degradado, durante un despliegue, en tiempo de diseño)?
    SíContinúa.
    NoAñade las condiciones; de lo contrario, la medida no se puede interpretar.
  3. ¿Nombra el artefacto, la parte del sistema responsable?
    SíContinúa.
    NoNombra el componente, la interfaz o el pipeline para que el equipo sepa dónde diseñar y medir.
  4. ¿Es la respuesta un comportamiento observable y no la elección de una tecnología?
    SíContinúa.
    NoReescribe la necesidad y lleva la tecnología a una decisión de diseño o a una restricción.
  5. ¿Contiene la medida de la respuesta un número, una unidad y, para los tiempos, un percentil?
    SíEl escenario es comprobable: añade una prioridad y un responsable.
    NoAñade la medida; sin ella, el escenario es un deseo.

De los escenarios a las pruebas de aceptación y las funciones de aptitud

Un escenario bien escrito ya es la mayor parte de una prueba. La fuente y el estímulo te dicen qué carga o qué evento generar, el entorno te dice cómo preparar la prueba, el artefacto te dice qué observar y la medida de la respuesta da la condición para aprobarla. Un escenario de rendimiento se convierte en una prueba de carga; un escenario de disponibilidad, en un simulacro de conmutación por error o un experimento de caos; un escenario de modificabilidad, en una revisión de cuánto código tocó un cambio de muestra y cuánto tardó; un escenario de seguridad, en un caso de prueba de penetración.

El siguiente paso es seguir comprobando. Una función de aptitud (fitness function), término popularizado por Neal Ford, Rebecca Parsons y Patrick Kua en Building Evolutionary Architectures, es cualquier comprobación automatizada o repetible de en qué medida el sistema cumple un objetivo arquitectónico. Ejecutada en el pipeline de entrega o sobre la telemetría de producción, convierte un escenario de una prueba de aceptación puntual en una protección permanente: la compilación falla, o salta una alerta, cuando la cualidad se desvía. El Capítulo 11 trata las funciones de aptitud en profundidad en Funciones de aptitud y arquitectura evolutiva.

La vida de un escenario

Un escenario de calidad pasa a ser una prueba de aceptación antes del lanzamiento y una función de aptitud que lo sigue comprobando después, y la monitorización de producción realimenta el escenarioEscenariode calidadPrueba deacept.Función de aptituden el pipelineProducciónmonitorizadala evidencia afina el escenario y sus númerosantes de lanzaren cada cambiosiempre
Un escenario guía una prueba de aceptación y luego una función de aptitud que se ejecuta en cada cambio, y la evidencia de producción vuelve para afinar el escenario.
# A performance scenario expressed as an automated check (illustrative)
# Scenario: at 300 searches/s, p95 <= 400 ms and p99 <= 1000 ms.
import statistics

def check_search_latency(latencies_ms, p95_target=400, p99_target=1000):
    cuts = statistics.quantiles(latencies_ms, n=100)  # 99 cut points
    p95, p99 = cuts[94], cuts[98]
    assert p95 <= p95_target, f"p95 {p95:.0f} ms exceeds {p95_target} ms"
    assert p99 <= p99_target, f"p99 {p99:.0f} ms exceeds {p99_target} ms"
    return p95, p99

# latencies_ms comes from a load test that replays 300 searches per second
# for ten minutes against a production-like environment.
Un escenario de rendimiento convertido en una sencilla comprobación automatizada de la latencia p95 y p99.

Cómo usan los escenarios los profesionales

En la práctica, los equipos rara vez escriben largas tablas de escenarios de seis partes para todo. Escriben un número reducido, a menudo de diez a treinta para un sistema de cierta envergadura, para las cualidades que son arquitectónicamente significativas, y los guardan donde todos puedan verlos: en el documento de arquitectura (la sección 10 de arc42 pide exactamente esto), en el backlog como criterios de aceptación o en un tablero de calidad compartido. Algunos equipos usan una forma más corta; el proyecto Q42 de Gernot Starke, por ejemplo, recomienda una estructura compacta de contexto, desencadenante y criterios de aceptación. La forma importa menos que la disciplina: toda cualidad importante tiene un estímulo, un contexto y un número.

Los escenarios también sirven de motor a los métodos de evaluación. El Quality Attribute Workshop y el Architecture Tradeoff Analysis Method (ATAM), ambos del SEI, recogen y priorizan escenarios con las partes interesadas y después ponen a prueba la arquitectura frente a los más importantes. La Sección 2.8 muestra cómo se recogen los escenarios y se clasifican en un árbol de utilidad.

Comprueba lo que has entendido

Nombra en orden las seis partes de un escenario de atributo de calidad.

Fuente del estímulo, estímulo, artefacto, entorno, respuesta y medida de la respuesta.

¿Qué tiene de malo 'el sistema usa una CDN para que las páginas carguen rápido'?

Expresa una solución, no una necesidad, y no tiene medida. El requisito debería describir la carga, las condiciones y el tiempo de respuesta objetivo; la CDN es un diseño posible para cumplirlo.

¿Quién suele ser la fuente del estímulo en un escenario de modificabilidad?

Una persona que quiere un cambio, como un product owner, un desarrollador o un regulador; el estímulo es la solicitud de cambio.

¿En qué se diferencia un escenario de una función de aptitud?

Un escenario es la formulación de un requisito; una función de aptitud es una comprobación automatizada o repetible, ejecutada de forma continua, que mide si el sistema lo cumple.

Siguiente · 2.4Rendimiento y escalabilidadLa latencia y el rendimiento (throughput), los percentiles y la latencia de cola, la ley de Little, el encolamiento y el abismo de la utilización, la ley de Amdahl y la Ley de escalabilidad universal, con cálculos desarrollados y un panorama de las tácticas de rendimiento.Continuar →

Fuentes y lecturas recomendadas

¿Tienes una pregunta sobre esta sección? ArchitectBot, el asistente de estudio con IA del curso, responde primero a partir del curso.

Pregunta: “¿Me ayudas a convertir 'la API debe tener alta disponibilidad y ser rápida' en escenarios de atributos de calidad bien formulados para una app de reparto de comida?”