Be Software Architecture Wise
Be Wise Apps

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

Sección 11.3 de 11.8 · Avanzado · 27 min de lectura

Funciones de aptitud y arquitectura evolutiva

Videolección

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

Una evaluación es una instantánea. Al día siguiente de terminar, cualquier cambio puede deshacer en silencio una decisión en la que se apoyaba. En esta lección aprenderás cómo las funciones de aptitud comprueban esas decisiones de forma automática y continua.

El tablero de un automóvil tiene luces de advertencia para las cosas que nunca deben fallar sin que nadie lo note: la presión del aceite, la temperatura del motor, los frenos. No esperas a la revisión anual para descubrir que el motor se sobrecalentó en marzo. Una función de aptitud es una luz de advertencia para una arquitectura de software. El equipo decide qué cualidades importan de verdad, como la rapidez con que se confirma un pedido, y escribe una comprobación automática para cada una. Esas comprobaciones se ejecutan cada vez que cambia el software. Cuando una falla, el cambio se detiene o se avisa a alguien, mientras el problema todavía es pequeño.

El término procede del libro Building Evolutionary Architectures, de Neal Ford y sus coautores. Una función de aptitud es cualquier mecanismo que ofrece una evaluación objetiva de una característica de la arquitectura. Cualquier mecanismo: una prueba unitaria, una prueba de carga, un monitor, un experimento de caos, incluso una revisión manual programada. Objetiva: el resultado no debe depender de quién la ejecute. La sensación de que el código está bien estructurado no cuenta. Y una métrica describe, pero una función de aptitud decide. Incumplir una obliga a una elección consciente: corregir el código, o cambiar la regla y registrar por qué.

Esta es la anatomía de una. Empieza con una característica, como la latencia de los pedidos, y una forma de medirla: los percentiles noventa y cinco y noventa y nueve, a cien pedidos por segundo. El umbral sale directamente de la medida de la respuesta del escenario: un segundo y medio, y tres segundos. El control es una prueba de carga en el pipeline, y la acción, cuando se supera el umbral, es hacer fallar la compilación. Una función de aptitud debe fallar de forma ruidosa, no llenar un panel que nadie lee. Por debajo, se remonta a su escenario de origen. Y tiene un responsable, una fecha de revisión y una justificación registrada en un registro de decisiones de arquitectura, o ADR.

Las funciones de aptitud se ejecutan a lo largo de todo el pipeline de entrega. Las comprobaciones atómicas prueban una característica; las holísticas prueban varias a la vez. En cada compilación van las comprobaciones baratas, rápidas y atómicas: reglas de dependencia, control de ciclos, límites de complejidad y dependencias con vulnerabilidades conocidas. En la etapa de pruebas van las comprobaciones holísticas, más lentas: una prueba de carga con umbrales de percentiles, controles de esquemas y de contratos, y una prueba de failover. En el despliegue canario, la tasa de errores y la latencia de la nueva versión se comparan con las de la versión anterior. Y en producción, las comprobaciones continuas se ejecutan todo el tiempo: monitores de los objetivos de nivel de servicio, o SLO, pedidos sintéticos, experimentos de caos y costo por pedido. Los fallos y la deriva vuelven como trabajo nuevo y, a menudo, como nuevas funciones de aptitud.

Ahora la plataforma convierte tres escenarios en funciones de aptitud. Primero: a cien pedidos por segundo, el noventa y cinco por ciento de los pedidos se confirman en menos de un segundo y medio, y el noventa y nueve por ciento en menos de tres. La función de aptitud uno es una prueba de carga contra un entorno similar al de producción, cada noche y antes de cada lanzamiento. Falla si alguno de los percentiles supera su umbral, o si falla más del cero punto uno por ciento de las solicitudes. El segundo y medio también se reparte en presupuestos para la red, el gateway, los pedidos, los precios y las escrituras en la base de datos, lo que deja quinientos cincuenta milisegundos de margen. Cada servicio prueba su propio presupuesto, así que una regresión se detecta donde se causa. El escenario dos es la disponibilidad del pago. Cada semana, en staging, un experimento de caos hace que el proveedor de pagos se quede colgado. Los pedidos deben seguir aceptándose como pendientes en menos de diez segundos, y todos deben liquidarse tras la recuperación. Escenario tres: un nuevo proveedor de punto de venta debería costar cinco días de trabajo de una persona, añadiendo un adaptador. Una regla de compilación impide que el código de restaurantes y de pedidos importe el kit de software de cualquier proveedor, para que el cambio quede localizado. Cada una se registra con su escenario de origen, su umbral, su responsable, el ADR que la explica y una fecha de revisión.

Las funciones de aptitud son la mitad de lo que esos autores llaman arquitectura evolutiva: un cambio guiado e incremental en múltiples dimensiones. Las partes desplegables pequeñas y los pipelines rápidos aportan los incrementos. Las funciones de aptitud aportan la guía. Empieza por poco. Elige las tres a cinco características que el árbol de utilidad valora más alto, y escribe una comprobación fiable para cada una. Una docena de comprobaciones de confianza valen más que cien que fallan al azar. En un sistema existente, usa un trinquete. Registra las violaciones de hoy como línea base, falla solo ante las nuevas y endurece la línea base a medida que se salda la deuda. Y mantén el pipeline rápido: comprobaciones atómicas en cada compilación, y comprobaciones holísticas pesadas, como las pruebas de carga de diez minutos, cada noche o antes del lanzamiento.

La sección completa trata las dimensiones de las funciones de aptitud y el código de las tres comprobaciones. A continuación, en la Sección once punto cuatro, veremos la gobernanza en organizaciones ágiles. Nos vemos allí.

Lo que necesitas saber

De la evaluación puntual a la comprobación continua

Una evaluación como el ATAM (Sección 11.1) es una instantánea. Al día siguiente de terminar, los desarrolladores empiezan a cambiar el sistema, y cada cambio puede deshacer en silencio una decisión en la que se apoyaba la evaluación: una importación cómoda a través del límite de un módulo, una llamada síncrona adicional en la ruta del pedido, una biblioteca con una vulnerabilidad conocida. La Sección 1.7 describió el resultado: la erosión, cuando se viola la arquitectura, y la deriva, cuando se ignora. Las revisiones periódicas detectan parte de esto, con meses de retraso. La idea de esta sección es comprobar las decisiones arquitectónicas más importantes de forma automática y continua, del mismo modo que las pruebas unitarias comprueban el comportamiento.

El término procede del libro de Neal Ford, Rebecca Parsons y Patrick Kua Building Evolutionary Architectures (O'Reilly, 2017), cuya segunda edición, con Pramod Sadalage, apareció en noviembre de 2022. Lo tomaron de la computación evolutiva, donde una función de aptitud puntúa lo cerca que está una solución candidata del objetivo para que el algoritmo pueda quedarse con las mejores variantes. En arquitectura, el objetivo es el conjunto de características que el sistema debe conservar mientras todo lo demás cambia.

Qué es una función de aptitud

La segunda edición define una función de aptitud (fitness function) arquitectónica como cualquier mecanismo que proporciona una evaluación objetiva de la integridad de alguna característica o características de la arquitectura. Tres expresiones de esa definición hacen el trabajo. Cualquier mecanismo: una prueba unitaria, una regla de análisis estático, una prueba de carga, un monitor, un experimento de caos o incluso una revisión manual programada cumplen los requisitos. Objetiva: el resultado no debe depender de quién la ejecute; "el código parece bien estructurado" no es una función de aptitud, "ningún paquete de la capa de dominio importa el framework web" sí lo es. Característica de la arquitectura: la comprobación protege una cualidad que la arquitectura existe para ofrecer (rendimiento, disponibilidad, modificabilidad, seguridad, compatibilidad de datos), no una regla de negocio, que es tarea de las pruebas ordinarias.

En la práctica, una función de aptitud útil tiene algunas propiedades más. Está vinculada a un requisito, idealmente un escenario de atributo de calidad cuya medida de la respuesta se convierte en su umbral (Sección 2.3). Tiene un responsable que decide qué ocurre cuando falla. Falla de forma ruidosa, rompiendo una compilación o avisando a alguien de guardia, en lugar de alimentar un panel que nadie lee. Y su umbral y el motivo de este quedan registrados, normalmente en un ADR, para que un equipo posterior pueda distinguir entre una regla que protege algo importante y un número arbitrario.

La Sección 3.8 trazó la distinción importante con las métricas: una métrica describe, una función de aptitud decide. Una métrica de acoplamiento en un panel te dice que las cosas empeoran; una función de aptitud codifica una decisión que el equipo ya ha tomado, de modo que incumplirla obliga a una elección consciente: corregir el código, o cambiar la regla y registrar por qué.

Anatomía de una función de aptitud

Una función de aptitud vincula una característica de la arquitectura a una medida, un umbral, un control automatizado y una acción, con escenario de origen, responsable y justificación registradaCaracterísticalat. de pedidosMedidap95, p99 a 100/sUmbral1.5 s y 3 sControlk6 en pipelineAcciónfallar el buildOrigen: escenario (Sección 2.3)Responsable, motivo (ADR) y fecha revisión
Una función de aptitud convierte la medida de la respuesta de un escenario en un umbral, un control automatizado y una acción, con un responsable y un motivo registrado.

Categorías de funciones de aptitud

Ford y sus coautores clasifican las funciones de aptitud según varias dimensiones independientes. La clasificación es útil menos como taxonomía que como estímulo para el diseño: preguntarse "¿debería ser atómica u holística, activada o continua?" a menudo revela una comprobación mejor que la primera que vino a la mente.

Dimensiones de las funciones de aptitud

DimensiónOpcionesQué significaEjemplo
AlcanceAtómica u holísticaLa atómica comprueba una característica en un contexto; la holística comprueba varias características que interactúan en un contexto compartidoAtómica: ningún ciclo entre paquetes. Holística: latencia de los pedidos medida con el cifrado, el registro de auditoría y la caché activados a la vez
Cuándo se ejecutaActivada, continua o temporalLa activada se ejecuta ante un evento como un commit, una compilación o un despliegue; la continua se ejecuta todo el tiempo contra el sistema en funcionamiento; la temporal se dispara al pasar un tiempo, como recordatorio para revisar algoActivada: análisis de dependencias en cada compilación. Continua: alerta de tasa de consumo del SLO en producción. Temporal: hacer fallar la compilación cuando una versión fijada de un framework tiene más de 12 meses
Tipo de resultadoEstática o dinámicaLa estática compara con un umbral fijo; la dinámica ajusta el umbral al contexto, por ejemplo a la escalaEstática: p95 por debajo de 1.5 s. Dinámica: el p95 puede subir a 2 s por encima de 150 pedidos/s, según lo acordado para los picos extremos
Cómo se ejecutaAutomatizada o manualSe prefiere la automatizada; algunas características, como los requisitos legales o de usabilidad, siguen necesitando personas, idealmente con un calendario fijoManual: revisión trimestral de accesibilidad según WCAG 2.2 AA
PlanificaciónIntencional o emergenteLas intencionales se diseñan de antemano a partir de requisitos conocidos; las emergentes se añaden a medida que el equipo aprende qué importaEmergente: una comprobación del retraso de los consumidores (consumer lag) añadida tras un incidente

Las comprobaciones holísticas merecen atención porque las cualidades interactúan: los controles de seguridad añaden latencia, la caché complica la frescura de los datos, y una prueba atómica de cada una por separado puede pasar mientras la combinación falla. Las comprobaciones continuas importan porque algunas características solo existen en producción: la latencia real de los usuarios, los modos de fallo reales, el costo real. Una cartera sana combina comprobaciones rápidas, atómicas y activadas en la compilación con un número menor de comprobaciones holísticas más lentas antes del lanzamiento y comprobaciones continuas en producción.

Dónde se ejecutan las funciones de aptitud

Las funciones de aptitud actúan en cada etapa del pipeline de entrega, desde controles estructurales al compilar hasta monitorización continua y experimentos de caos en producciónCommitBuildPruebaCanarioProducciónDesarrolladorprueba rápidoen localReglas dependenciaCVE dependenciasLímites complejidadControl ciclosPr. carga p95/p99Ctrl. esquemasPruebas contratoPrueba failoverTasa de erroresy latencia frentea la versiónanteriorMonitores SLOPedidos sintéticosExperimentos caosCosto por pedidomanual oautomáticaactivada,atómica/estáticaactivada,holísticaactivada,dinámicacontinua,holísticafallos y deriva generan trabajo y nuevas funciones de aptituduna función de aptitud fallida detiene el cambio o lanza una alerta
Los controles estructurales baratos se ejecutan en cada compilación, los holísticos antes del lanzamiento y los continuos en producción, y los fallos vuelven como trabajo nuevo.

Funciones de aptitud para cada cualidad

La mayoría de los equipos empiezan por la estructura, porque las comprobaciones estructurales son baratas, rápidas y deterministas, y después añaden comprobaciones de rendimiento, seguridad, resiliencia y datos a medida que madura el pipeline. La tabla ofrece ejemplos típicos; las herramientas cambian, los patrones no.

Ejemplos por cualidad

CualidadFunción de aptitud (fitness function)ClaseHerramientas típicas
EstructuraReglas de capas y de dependencias, ningún ciclo, los módulos se usan entre sí solo a través de API públicas (Sección 3.4)Atómica, activada, estáticaArchUnit, import-linter, dependency-cruiser, verificación de Spring Modulith
RendimientoPrueba de carga de extremo a extremo con umbrales de percentiles; presupuestos de latencia por servicio en el pipeline propio de cada servicioHolística, activadak6, Gatling, JMeter, Locust; umbrales que hacen fallar el trabajo del pipeline
SeguridadHacer fallar la compilación si hay dependencias con vulnerabilidades conocidas altas o críticas; ningún secreto en el código; imágenes de contenedor solo del registro aprobadoAtómica, activadapip-audit, npm audit, OWASP Dependency-Check, Trivy, escáneres de secretos; política como código (Sección 11.4)
ResilienciaExperimentos de caos que eliminan instancias o ralentizan dependencias y comprueban que se mantiene el estado estable (Sección 9.8)Holística, activada o continuaToxiproxy, Chaos Toolkit, servicios de inyección de fallos de la nube
DatosComprobaciones de compatibilidad de esquemas en eventos y API; migraciones ensayadas con datos del tamaño de producción (Sección 7.7)Atómica, activadaComprobaciones de compatibilidad del registro de esquemas, buf breaking, pruebas de contrato dirigidas por el consumidor
Operabilidad y costoTodos los servicios exponen comprobaciones de estado (health checks) y métricas estándar; el costo por pedido se mantiene por debajo de un objetivoAtómica o continuaComprobaciones en el pipeline sobre las plantillas de servicio; paneles de costos con alertas

La arquitectura evolutiva y el cambio incremental

Las funciones de aptitud son una mitad de lo que Ford, Parsons, Kua y Sadalage llaman arquitectura evolutiva: una arquitectura que admite un cambio guiado e incremental en múltiples dimensiones. Cada parte de la frase es un requisito de diseño.

El cambio incremental tiene una vertiente de desarrollo y otra operativa. Los desarrolladores deben poder hacer cambios pequeños con seguridad, lo que depende de la modularidad y de un acoplamiento adecuado (Capítulo 3) y de mantener cada parte desplegable de forma independiente, el cuanto de arquitectura de la Sección 5.1, lo bastante pequeña para cambiarla sin coordinarse con otros. Las operaciones deben poder lanzar cambios pequeños con frecuencia y con seguridad, lo que depende de un pipeline de despliegue, un despliegue progresivo y un rollback rápido (Sección 10.5). Guiado es donde entran las funciones de aptitud: definen qué significa "apto" e impiden que los incrementos lo degraden. Múltiples dimensiones recuerda que la arquitectura no es solo la estructura del código: los datos, la seguridad, las operaciones, la estructura de los equipos y el costo evolucionan, y todos necesitan protección.

El enfoque cambia la forma en que los arquitectos piensan en el futuro. En lugar de predecir cada requisito y construir de antemano flexibilidad para él, algo que la Sección 3.8 mostró que es caro y a menudo erróneo, el equipo mantiene el sistema fácil de cambiar y protege solo las características que importan, aplazando las demás decisiones hasta el último momento responsable (Sección 1.6). Los críticos señalan límites reales. No todas las cualidades se pueden comprobar de forma automática o barata; los umbrales mal elegidos generan ruido que los equipos aprenden a ignorar; y algunas decisiones, como una base de datos o un proveedor de nube, siguen siendo puertas de un solo sentido por bueno que sea el pipeline. La arquitectura evolutiva es una disciplina para mantener reversibles las partes reversibles y protegidas las partes importantes, no una promesa de que todo se podrá cambiar más adelante.

Ejemplo práctico

Ejemplo práctico: tres escenarios del Capítulo 2 como funciones de aptitud

La Sección 2.8 construyó un árbol de utilidad para la plataforma de reparto de comida. El equipo convierte tres de sus hojas en funciones de aptitud, una activada y holística, otra un experimento de caos y otra estructural, después de que el ATAM de la Sección 11.1 llevara a una autorización de pago asíncrona.

Escenario 1: latencia de los pedidos (H,H)En el pico del viernes de 100 pedidos/s, el 95% de las confirmaciones de pedido llegan en menos de 1.5 s y el 99% en menos de 3 s
Función de aptitud 1Holística, activada: una prueba de carga con k6 contra un entorno similar al de producción, cada noche y antes de cada lanzamiento, que falla si el p95 o el p99 superan el umbral o si falla más del 0.1% de las solicitudes. Respaldada por una monitorización continua en producción de los mismos percentiles a partir del tráfico real
Presupuestos de latenciaLos 1.5 s se reparten en presupuestos: red móvil y TLS 400 ms, gateway 50 ms, pedidos 250 ms, precios 100 ms, escrituras en la base de datos 150 ms, lo que deja 550 ms de margen ahora que la autorización de la tarjeta está fuera de la ruta. El pipeline de cada servicio ejecuta una prueba de carga atómica del componente contra su propio presupuesto, de modo que una regresión se detecta en el servicio que la causó
Escenario 2: disponibilidad del pago (H,H)Cuando el proveedor de pagos agota el tiempo de espera durante el pico, los pedidos se aceptan y se ponen en cola, no se pierde ningún pedido confirmado y se informa a los clientes en menos de 10 s
Función de aptitud 2Experimento de caos holístico, semanal en staging y trimestral como game day en producción con un radio de impacto pequeño: se hace que el proveedor se quede colgado; los pedidos deben aceptarse como pendientes en menos de 10 s y todos deben liquidarse tras la recuperación. Responsable: equipo de pedidos
Escenario 3: nuevo proveedor de POS (M,L)Un nuevo proveedor de punto de venta (POS) para restaurantes se integra en 5 días-persona añadiendo un adaptador
Función de aptitud 3Atómica, activada, estática: un contrato de import-linter prohíbe que los módulos de dominio y de API de restaurantes y el paquete de pedidos importen el SDK de un proveedor, y un segundo contrato impide que los adaptadores se importen entre sí, para que el cambio quede localizado. Se complementa con una comprobación manual: se registra el esfuerzo de cada integración real con un proveedor y se compara con el objetivo de 5 días
Se registra con cada unaEscenario de origen, umbral, responsable, el ADR que lo explica y una fecha de revisión

Cada medida de la respuesta se convirtió en un umbral sin reinterpretarla, que es la recompensa de haber escrito bien los escenarios desde el principio.

El escenario de modificabilidad no se puede automatizar del todo: la regla estructural protege las condiciones para un cambio de 5 días, y la medición manual comprueba el resultado.

Los presupuestos de latencia convierten un único número holístico en comprobaciones atómicas que avisan al equipo correcto de una regresión.

import http from 'k6/http';
import { check } from 'k6';

export const options = {
  scenarios: {
    friday_peak: { executor: 'constant-arrival-rate', rate: 100, timeUnit: '1s',
                   duration: '10m', preAllocatedVUs: 300 },   // 100 orders per second
  },
  thresholds: {   // the scenario's response measure, as pass/fail rules
    'http_req_duration{name:place_order}': ['p(95)<1500', 'p(99)<3000'],
    'http_req_failed{name:place_order}': ['rate<0.001'],
  },
};

const order = { restaurantId: 'r-42', items: [{ sku: 'pad-thai', qty: 1 }] };

export default function () {
  const res = http.post(`${__ENV.BASE_URL}/orders`, JSON.stringify(order), {
    headers: { 'Content-Type': 'application/json' }, tags: { name: 'place_order' } });
  check(res, { 'order accepted': (r) => r.status === 201 || r.status === 202 });
}
Función de aptitud 1: una prueba de carga con k6 cuyos umbrales son la medida de la respuesta del escenario. k6 termina con un error cuando un umbral falla, lo que hace fallar el trabajo del pipeline.
# Fitness function: checkout keeps accepting orders when payments hang (illustrative)
# Runs weekly in staging; toxiproxy, api and ledger are test fixtures.
def test_orders_survive_payment_provider_outage(toxiproxy, api, ledger):
    toxiproxy.add_latency("payment-provider", latency_ms=30_000)   # provider hangs
    placed = [api.place_order(sample_order()) for _ in range(200)]

    assert all(r.status in (201, 202) for r in placed)            # still accepted
    assert all(r.json()["state"] == "PENDING_PAYMENT" for r in placed)
    assert max(r.elapsed_seconds for r in placed) < 10            # told within 10 s

    toxiproxy.remove_toxics("payment-provider")                    # provider recovers
    ledger.wait_until_settled(timeout_seconds=300)
    assert ledger.lost_orders(placed) == []                        # none lost
Función de aptitud 2: un experimento de caos escrito como prueba (ilustrativo; los fixtures envuelven un proxy de inyección de fallos, la API y el libro de pagos).
# .importlinter: only the POS adapters may use vendor SDKs
[importlinter]
root_package = fooddelivery
include_external_packages = True

[importlinter:contract:pos-vendors-isolated]
name = Vendor POS SDKs are used only inside the POS adapters
type = forbidden
source_modules =
    fooddelivery.restaurant.domain
    fooddelivery.restaurant.api
    fooddelivery.ordering
forbidden_modules =
    tillpro_sdk
    kitchenlink

[importlinter:contract:adapters-independent]
name = POS adapters do not import each other
type = independence
modules =
    fooddelivery.restaurant.pos_adapters.tillpro
    fooddelivery.restaurant.pos_adapters.kitchenlink
Función de aptitud 3: contratos de import-linter que mantienen el código específico de cada proveedor dentro de los adaptadores, ejecutados con lint-imports en cada compilación.

La compatibilidad de los datos se protege de la misma manera. Antes de que pueda fusionarse un cambio en el evento OrderPlaced, el pipeline pregunta al registro de esquemas si el nuevo esquema es compatible con la última versión registrada según la regla de compatibilidad del sujeto, y falla si no lo es:

# Data fitness function: block the merge if the new event schema would break consumers
curl -s -X POST -H "Content-Type: application/vnd.schemaregistry.v1+json" \
  --data @build/order-placed-v7.request.json \
  "$SCHEMA_REGISTRY_URL/compatibility/subjects/order-placed-value/versions/latest" \
  | jq -e '.is_compatible == true'
Una función de aptitud de datos que usa el endpoint de compatibilidad de un registro de esquemas; jq -e devuelve un código de salida distinto de cero, lo que hace fallar el trabajo, cuando el esquema es incompatible.

Diseñar funciones de aptitud que perduren

Empieza por poco y por lo importante. Elige las tres a cinco características que el árbol de utilidad valora más alto, escribe una función de aptitud para cada una y asegúrate de que sean rápidas y fiables antes de añadir más. Una docena de comprobaciones de confianza valen más que cien que fallan al azar.

Usa trinquetes (ratchets) en los sistemas existentes. Cuando una base de código ya viola una regla, registra las violaciones actuales como línea base y falla solo ante las nuevas; endurece la línea base a medida que el equipo salda la deuda. Lo mismo sirve para el rendimiento: falla ante regresiones superiores a un margen acordado respecto al último lanzamiento mientras avanzas hacia el objetivo del escenario.

Haz que los umbrales sean explícitos y tengan responsable. Guarda los umbrales en una configuración bajo control de versiones junto a una referencia al ADR que los justifica, con un responsable con nombre. Cuando una función de aptitud falla, el responsable decide entre corregir el código y cambiar la regla, y la decisión se registra. Trata una función de aptitud que se anula con frecuencia como un hallazgo: o la regla está mal o la arquitectura está sometida a una presión real.

Mantén el pipeline rápido. Las comprobaciones atómicas van en cada compilación; las comprobaciones holísticas pesadas, como las pruebas de carga de diez minutos, se ejecutan cada noche, antes del lanzamiento o sobre la versión candidata. Las comprobaciones continuas en producción necesitan el mismo cuidado que cualquier alerta: vinculadas al impacto en los usuarios, con un runbook y en silencio cuando no pasa nada.

Preguntas frecuentes

¿Las funciones de aptitud son solo pruebas?

Muchas se implementan como pruebas, pero su objeto es distinto. Las pruebas ordinarias comprueban que las funcionalidades se comportan correctamente; las funciones de aptitud comprueban características de la arquitectura como la estructura, la latencia, la resiliencia o la compatibilidad. Algunas, como los monitores de producción y las revisiones manuales, no son pruebas en absoluto.

¿Quién escribe las funciones de aptitud: los arquitectos o los desarrolladores?

Ambos. Los arquitectos suelen identificar las características y los umbrales, y a menudo escriben las primeras comprobaciones, lo que es una buena forma de seguir con las manos en el código (Sección 1.4). Los equipos son propietarios de ellas y las mantienen como cualquier otro código.

¿Qué relación tienen las funciones de aptitud con los SLO?

Un SLO con una alerta sobre su presupuesto de errores es una función de aptitud continua y holística para la disponibilidad o la latencia en producción (Sección 9.5). Las funciones de aptitud del pipeline intentan detectar las mismas regresiones antes de que lleguen a los usuarios.

Comprueba lo que has entendido

¿Cuál es la diferencia entre una métrica y una función de aptitud?

Una métrica describe una propiedad; una función de aptitud codifica una decisión con un umbral y una acción, de modo que incumplirla hace fallar una compilación o lanza una alerta y obliga a una elección consciente.

Da un ejemplo de una función de aptitud atómica y otro de una holística.

Atómica: una regla que prohíbe importaciones desde la capa web hacia el dominio. Holística: una prueba de carga que mide la latencia de los pedidos con la seguridad, el logging y la caché activos a la vez.

¿Qué aporta un presupuesto de latencia a una función de aptitud de latencia de extremo a extremo?

Divide el objetivo de extremo a extremo en límites por servicio que cada servicio comprueba en su propio pipeline, de modo que una regresión se detecta en el servicio que la causó.

¿Cuáles son las tres partes de la definición de arquitectura evolutiva?

Admite un cambio guiado (por funciones de aptitud) e incremental (cambios y lanzamientos pequeños y seguros) en múltiples dimensiones (código, datos, seguridad, operaciones, equipos y más).

Siguiente · 11.4GobernanzaPara qué sirve la gobernanza de la arquitectura y cómo ejercerla sin compuertas lentas: principios, estándares, guardrails, el proceso de consejo (advice process), los foros asesores, los radares tecnológicos, la política como código y la arquitectura empresarial.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: “¿Qué tres funciones de aptitud deberíamos escribir primero para un servicio que debe confirmar los pedidos rápidamente y sobrevivir a una caída del proveedor de pagos?”