Read in English · Lire en français · Auf Deutsch lesen
Sección 1.3 de 1.8 · Principiante · 19 min de lectura
Por qué importa la arquitectura: costo del cambio, calidad, riesgo y fallos reales
Videolección
5 min · narrado en inglés, con subtítulosSolo escuchar (audio)
Leer la transcripción
¿Por qué debería importarle la arquitectura a un equipo, a un propietario del producto o a un director financiero, y no solo las funcionalidades? Esta lección responde a esa pregunta con tres casos reales.
Imagina dos cocinas que preparan la misma carta. En una, los puestos están dispuestos para que los cocineros apenas se crucen. En la otra, el único refrigerador está detrás del lavavajillas. En una noche tranquila, las dos sirven los mismos platos. Pero un sábado de mucho trabajo, o cuando cambia la carta, la segunda cocina se atasca. Con el software pasa algo parecido. Las funcionalidades pueden parecer idénticas, pero la disposición de las partes decide lo rápido, lo fiable y lo barato que es el sistema, y lo doloroso que resulta cambiarlo.
Cualidades como el rendimiento, la disponibilidad, la seguridad y el costo son emergentes. Surgen de cómo se organizan e interactúan las partes, no de un único fragmento de código. Por ejemplo, si el proceso de pago hace cinco llamadas seguidas a servicios que están disponibles cada uno el noventa y nueve punto nueve por ciento del tiempo, la cadena no puede superar aproximadamente el noventa y nueve punto cinco por ciento. Las probabilidades se multiplican. Añadir una cola o una caché cambia esa aritmética, y aun así ninguno de los dos cambios es visible dentro de una sola función. Los dos son arquitectónicos.
La estructura también determina el costo del cambio, y la mayor parte del costo de un sistema de éxito llega después de su primer lanzamiento. La hipótesis de la resistencia del diseño de Martin Fowler recoge este efecto. Un equipo que presta poca atención a la estructura suele entregar más rápido al principio. Pero la maraña frena cada cambio, y un equipo que invirtió en estructura lo adelanta. Fowler lo llama hipótesis porque es difícil de medir, y sugiere que la inversión suele compensar en semanas más que en meses. Esa ralentización es el interés de la deuda técnica, que trata la Sección uno punto siete.
Veamos un ejemplo práctico, con cifras ilustrativas. Una tienda en línea almacena el dinero como números de coma flotante, que no pueden representar exactamente muchos valores decimales, así que a veces los totales se desvían un penique. En el mes uno, dos desarrolladores podrían pasar a almacenar peniques enteros en aproximadamente medio día. Eso son unas trescientas libras. En el año tres, treinta y cinco servicios manejan dinero, ciento veinte columnas de base de datos lo almacenan, hay doscientos millones de filas de pedidos antiguos y cuatro sistemas de socios lo intercambian. Ahora el mismo cambio lleva unos ciento noventa y cinco días-persona. Eso son aproximadamente ciento diecisiete mil libras, varios cientos de veces el costo original. La decisión en sí nunca cambió de tamaño. Lo que creció fue todo lo construido sobre ella.
La arquitectura también contiene o amplifica el riesgo. El uno de agosto de 2012, la firma de negociación bursátil Knight Capital perdió más de cuatrocientos sesenta millones de dólares tras unos cuarenta y cinco minutos de negociación. Su enrutador de órdenes recibía órdenes marcadas con un flag. El código nuevo reutilizó ese flag, que años antes activaba una antigua función llamada Power Peg. El código de Power Peg seguía allí. El código nuevo se desplegó a mano en los ocho servidores del enrutador. Siete lo recibieron y procesaron las órdenes con normalidad. Pero un técnico no copió el código en el octavo servidor. Cuando se activó el flag, ese servidor ejecutó Power Peg. Envió millones de órdenes no deseadas y recibió más de cuatro millones de ejecuciones. Ningún segundo técnico revisó el despliegue, y nada comprobó que todos los servidores coincidieran. El código antiguo accesible, un flag con dos significados y un lanzamiento sin comprobar son decisiones de estructura y de proceso, no una línea defectuosa.
Cuando el mercado de seguros médicos de Estados Unidos, HealthCare punto gov, abrió en octubre de 2013, muchas personas no pudieron crear cuentas. Los auditores del gobierno concluyeron que se había lanzado sin verificar que cumpliera sus requisitos de rendimiento. Varios contratistas construyeron partes separadas, y nadie probó el conjunto ensamblado con una carga realista. La capacidad es una propiedad del sistema completo, así que alguien tiene que ser responsable del conjunto. En 2023, el equipo de Prime Video de Amazon trasladó un servicio de monitorización de pasos serverless distribuidos a un único proceso, que pasa los datos en memoria. Informaron de que los costos de infraestructura cayeron más del noventa por ciento. Eso no significa que los monolitos superen a serverless. El primer diseño era adecuado para una carga de trabajo temprana y más pequeña. La arquitectura es cuestión de adecuación, no de moda: pregúntate qué necesitan la carga de trabajo, el equipo y el presupuesto.
Por eso importa la arquitectura. La sección completa cuenta cada caso con más detalle y explica cómo dependen de la estructura los equipos, la comunicación y las estimaciones. A continuación, en la Sección uno punto cuatro, vemos qué hace realmente un arquitecto. Nos vemos allí.
Lo que necesitas saber
- La arquitectura determina en gran medida atributos de calidad como el rendimiento, la disponibilidad, la seguridad y el costo, porque estos surgen de cómo se organizan e interactúan las partes.
- El costo de cambiar una decisión crece a medida que se construyen sobre ella código, datos, integraciones y equipos, por lo que las primeras decisiones estructurales condicionan el costo y la velocidad de todo el trabajo posterior.
- La arquitectura gobierna el riesgo, cómo puede repartirse el trabajo entre equipos (ley de Conway), la comunicación y la capacidad de estimar los cambios.
- Knight Capital perdió más de 460 millones de USD el 1 de agosto de 2012 después de que un despliegue manual dejara uno de sus ocho servidores ejecutando código antiguo que un flag reutilizado reactivó.
- La GAO concluyó que HealthCare.gov se lanzó en octubre de 2013 sin verificar que cumpliera los requisitos de rendimiento, tras unos requisitos sin cerrar, una supervisión débil y unas pruebas incompletas.
- El traslado en 2023 de un servicio de monitorización de Prime Video, de pasos serverless distribuidos a un único proceso, redujo según se informó su costo de infraestructura en más del 90%, lo que muestra que la arquitectura es cuestión de adecuación, no de moda.
Las decisiones que salen caras si se toman mal
La Sección 1.1 definió la arquitectura como el conjunto de estructuras y decisiones significativas que dan forma a un sistema, con la significancia medida por el costo del cambio. Esta sección plantea la continuación práctica: ¿y qué? ¿Por qué debería importarle la arquitectura a un equipo, a un propietario del producto o a un director financiero, y no simplemente las funcionalidades?
La respuesta breve es que la arquitectura decide, más que cualquier otro factor técnico, cómo será el sistema: lo rápido, lo fiable, lo seguro y lo barato de operar que será, y sobre todo lo fácil que será cambiarlo. Las funcionalidades son lo que hace un sistema. La arquitectura determina lo bien que lo hace y lo que costará hacer algo distinto el año que viene. Muchos grandes fallos de software y muchos éxitos costosos se remontan a un puñado de decisiones estructurales.
La arquitectura determina los atributos de calidad
Un atributo de calidad es una propiedad medible de lo bien que un sistema hace su trabajo: rendimiento, disponibilidad, seguridad, modificabilidad, escalabilidad, usabilidad, eficiencia de costos y otras. El Capítulo 2 las define con precisión. Lo fundamental aquí es que la mayoría de los atributos de calidad son emergentes: surgen de cómo se organizan las partes y de cómo interactúan, no de ningún fragmento de código concreto.
Piensa en la disponibilidad. Si el proceso de pago de una tienda en línea debe hacer cinco llamadas síncronas seguidas a servicios que están disponibles cada uno el 99.9% del tiempo, la cadena en su conjunto no puede estar disponible más de aproximadamente el 99.5%, por bien escrito que esté cada servicio, porque las probabilidades se multiplican. Añadir una cola para que algunos de esos pasos ocurran más tarde, o guardar resultados en caché para que algunas llamadas no sean necesarias, cambia la aritmética. Ninguno de los dos cambios es visible dentro de una sola función; ambos son arquitectónicos. El rendimiento, la seguridad y el costo se comportan de la misma manera. Una página de inicio de sesión segura no hace seguro un sistema si un servicio interno sin autenticación es accesible desde internet.
La funcionalidad, en cambio, suele ser en gran medida independiente de la estructura. Puedes implementar las mismas funcionalidades de una app bancaria como una sola unidad desplegable o como cincuenta servicios; los usuarios ven los mismos botones. Lo que cambia es todo lo demás: lo rápido que se puede lanzar una corrección, qué ocurre cuando falla una parte, cuántos ingenieros puede absorber el sistema y cómo es la factura de la nube.
Costo y velocidad del cambio
La mayor parte del costo de un sistema de éxito se produce después de su primer lanzamiento, a medida que se modifica para atender nuevas necesidades. Por eso la estructura importa sobre todo porque determina lo costoso que será cada cambio futuro. En un sistema bien estructurado, un cambio en las normas fiscales afecta a un módulo. En uno enmarañado, afecta a veinte, y cada uno necesita pruebas y coordinación.
La hipótesis de la resistencia del diseño (design stamina hypothesis) de Martin Fowler (2007) recoge este efecto. Un equipo que presta poca atención a la estructura interna suele entregar más rápido al principio. Con el tiempo, la maraña acumulada frena cada cambio, y un equipo que invirtió en estructura lo adelanta. Fowler lo llama hipótesis porque es difícil de medir con rigor, y sugiere que el punto de cruce suele llegar en semanas más que en meses. La ralentización es el interés de la deuda técnica, que trata la Sección 1.7.
La hipótesis de la resistencia del diseño
Ejemplo práctico
Ejemplo práctico: el costo de una decisión a lo largo del tiempo
Una tienda en línea almacena los importes de dinero como números de coma flotante. La aritmética de coma flotante no puede representar exactamente muchos valores decimales (0.1 + 0.2 no es exactamente 0.3), así que de vez en cuando los totales difieren en un penique de lo que esperan los contables. Las cifras siguientes son supuestos ilustrativos, no datos del sector, elegidos para mostrar cómo crece el costo del cambio.
| Mes 1: decidir de otro modo | Dos desarrolladores acuerdan almacenar en su lugar unidades menores enteras (peniques). Esfuerzo: aproximadamente medio día. Costo, suponiendo £600 por día-persona: unas £300. |
|---|---|
| Año 3: lo que se ha construido sobre la decisión | 35 servicios manejan dinero; 120 columnas de base de datos lo almacenan; 200 millones de filas históricas de pedidos; 4 integraciones con socios (proveedor de pagos, almacén, contabilidad, marketplace) lo intercambian. |
| Año 3: cambios en el código | 35 servicios a unos 3 días-persona cada uno para cambiar, probar y lanzar = 105 días-persona. |
| Año 3: migración de datos | Convertir columnas, migrar el histórico, conciliar los totales: unos 20 días-persona, más una ventana de mantenimiento planificada. |
| Año 3: coordinación con los socios | 4 socios a unos 10 días-persona cada uno, incluidas sus pruebas y los cambios de contrato = 40 días-persona. |
| Año 3: pruebas de extremo a extremo y conciliación con finanzas | Unos 30 días-persona. |
| Año 3: total | Unos 195 días-persona, o aproximadamente £117 000, más el riesgo de errores durante la migración y meses de tiempo transcurrido. Eso es varios cientos de veces el costo del mes 1. |
La decisión en sí nunca cambió de tamaño. Lo que creció fue todo lo construido sobre ella: código, datos, socios y hábitos.
Por eso Ralph Johnson describió la arquitectura como las decisiones que desearías poder acertar pronto, y por eso los arquitectos buscan convenciones de bajo nivel con un alcance amplio.
Una estrategia alternativa es hacer que esas decisiones sean más baratas de revertir, por ejemplo poniendo todo el manejo del dinero detrás de un único tipo o biblioteca compartidos desde el principio, para que un cambio posterior sea local.
Riesgo, equipos, comunicación y estimación
Riesgo. La arquitectura es donde la mayoría de los riesgos técnicos quedan contenidos o se amplifican. Un diseño con un punto único de fallo, una integración sin probar entre partes construidas de forma independiente o una tecnología no probada en su núcleo conlleva un riesgo que ninguna cantidad de programación cuidadosa elimina. Gran parte del trabajo arquitectónico es gestión de riesgos: identificar qué podría salir muy mal y dar forma a la estructura para que no pueda ocurrir o, si ocurre, cause un daño limitado.
Repartir el trabajo entre equipos. Melvin Conway observó en 1968 que las organizaciones que diseñan sistemas tienden a producir diseños que reflejan sus propias estructuras de comunicación. Hoy se llama ley de Conway, y funciona en ambas direcciones. Un sistema cuyas partes tienen límites claros e interfaces estrechas permite que varios equipos trabajen en paralelo con poca coordinación. Un sistema en el que todo depende de todo obliga a cada equipo a estar en cada reunión. Por eso la arquitectura y el diseño de la organización están entrelazados, como explica la sección del Capítulo 3 sobre la ley de Conway.
Comunicación. Una arquitectura da a las personas un vocabulario compartido y un mapa compartido. Los nuevos ingenieros aprenden el sistema más rápido, los gerentes de producto entienden por qué algunas solicitudes son baratas y otras caras, y el personal de operaciones sabe qué depende de qué durante un incidente.
Estimación y planificación. La descomposición en partes conocidas hace posible la estimación: un cambio puede rastrearse hasta los componentes que toca, y cada uno puede estimarlo el equipo que lo conoce. Sin una estructura clara, las estimaciones son conjeturas, porque nadie puede decir con seguridad hasta dónde se propagará un cambio.
Caso práctico: Knight Capital, 1 de agosto de 2012
Knight Capital era uno de los mayores creadores de mercado de la renta variable estadounidense. Según la orden de la Comisión de Bolsa y Valores de Estados Unidos (SEC) del 16 de octubre de 2013, en los primeros 45 minutos de negociación del 1 de agosto de 2012 el enrutador automatizado de órdenes de Knight (llamado SMARS) envió al mercado millones de órdenes no deseadas mientras procesaba 212 pequeñas órdenes minoristas. Recibió más de 4 millones de ejecuciones en 154 valores, por más de 397 millones de acciones, y se quedó con grandes posiciones no deseadas. Knight perdió más de 460 millones de USD, necesitó una inversión externa de emergencia en cuestión de días, y más tarde la SEC le impuso una multa de 12 millones de USD por infringir las normas de acceso al mercado.
La orden de la SEC describe el mecanismo. Años antes, Knight había dejado de usar una antigua función llamada Power Peg, pero su código seguía en el enrutador y aún podía activarse: era código muerto que no estaba muerto. En 2012, Knight escribió código nuevo para un nuevo programa de la NYSE, el Retail Liquidity Program, y ese código nuevo reutilizó un flag que antes activaba Power Peg. El código nuevo se desplegó manualmente en los ocho servidores del enrutador. Un técnico no lo copió en uno de ellos, ningún segundo técnico revisó el despliegue, y Knight no tenía ningún procedimiento escrito que exigiera esa revisión. Cuando se activó el flag, siete servidores ejecutaron el código nuevo; el octavo interpretó el flag como "ejecutar Power Peg" y envió órdenes sin reconocer que ya se habían ejecutado. Antes de la apertura del mercado se enviaron correos electrónicos automáticos que avisaban de un problema, pero nadie actuó en consecuencia.
Cómo un servidor desactualizado causó la pérdida de Knight Capital
Sería injusto llamarlo simplemente un bug de programación, e igual de injusto llamarlo un error puramente de operaciones. Las lecciones arquitectónicas tienen que ver con la estructura y la desplegabilidad: funcionalidad obsoleta que seguía siendo accesible en un sistema en producción; un mismo flag con dos significados en distintas versiones del código; un proceso de despliegue sin verificación automática de que todos los servidores ejecutaban la misma versión; y, como subrayó la SEC, controles inadecuados para limitar el daño una vez que algo salía mal. Cada una es una decisión sobre cómo se construye y se lanza el sistema, no sobre una sola línea de código.
Caso práctico: el lanzamiento de HealthCare.gov, octubre de 2013
HealthCare.gov, el mercado federal de seguros médicos de Estados Unidos, abrió las inscripciones el 1 de octubre de 2013. Muchas personas no pudieron crear cuentas ni completar solicitudes, y el sitio sufrió caídas durante semanas. La Oficina de Rendición de Cuentas del Gobierno de Estados Unidos (GAO) y la Oficina del Inspector General (OIG) del Departamento de Salud y Servicios Humanos investigaron después, y sus conclusiones son la mejor fuente sobre lo que salió mal.
El informe de la GAO de julio de 2014 (GAO-14-694) concluyó que los Centros de Servicios de Medicare y Medicaid (CMS) adjudicaron contratos antes de que se fijaran requisitos clave, que los requisitos no dejaron de cambiar, que la supervisión fue débil y que los CMS lanzaron el sistema sin verificar que cumpliera sus requisitos de rendimiento. Las obligaciones del contrato principal del mercado pasaron de 56 millones de USD a más de 209 millones de USD entre 2011 y principios de 2014. Un segundo informe de la GAO, de marzo de 2015 (GAO-15-238), concluyó que los sistemas no se habían probado por completo antes del lanzamiento, y que entre los problemas del lanzamiento figuraban una planificación de capacidad inadecuada, errores de programación del software y funciones previstas que no se habían implementado. El estudio de caso de la OIG de 2016 señaló como causas centrales la ausencia de un liderazgo claro y la mala coordinación entre el trabajo normativo y el técnico. Tras un intenso trabajo correctivo, el sitio pudo atender una alta demanda de los consumidores en unos dos meses.
La historia de HealthCare.gov trata sobre todo de la gestión del programa, pero su lección arquitectónica es directa. El mercado lo construyeron varios contratistas como partes separadas que tenían que funcionar juntas, entre ellas un nodo central de datos (data hub) que se conectaba con otras agencias federales, y nadie verificó de extremo a extremo, con una carga realista, que el conjunto ensamblado cumpliera sus objetivos de capacidad y rendimiento. Los atributos de calidad como la capacidad son propiedades del sistema completo, así que solo puede garantizarlos alguien que sea responsable de la estructura de todo el sistema y lo pruebe como un todo.
Caso práctico: Prime Video y la arquitectura como adecuación, no como moda
En marzo de 2023, un ingeniero del equipo de análisis de calidad de video de Amazon Prime Video publicó una entrada en el blog Prime Video Tech sobre un servicio que monitoriza las transmisiones de video en busca de defectos de calidad. La primera versión se había construido con componentes serverless distribuidos: AWS Step Functions orquestaba los pasos y las funciones de AWS Lambda hacían el trabajo, y los fotogramas de video intermedios pasaban de un paso a otro a través del almacenamiento de Amazon S3. El equipo informó de que este diseño chocó con un límite de escalado rígido en torno al 5% de la carga esperada y habría sido demasiado caro a plena escala, en gran parte por los cargos de orquestación por paso y las numerosas solicitudes al almacenamiento.
El equipo trasladó los pasos de conversión de medios y de detección de defectos a un único proceso que se ejecutaba en contenedores en Amazon ECS, pasando los fotogramas en memoria en lugar de a través del almacenamiento, y escaló ejecutando más copias de ese proceso. La entrada informó de que los costos de infraestructura cayeron más del 90% y de que el servicio podía escalar aún más. La entrada se compartió ampliamente como "Amazon abandona los microservicios", algo que no decía: el cambio afectaba a un servicio, y el autor señaló que los microservicios y los componentes serverless sí funcionan a gran escala, pero que la elección entre ellos y un monolito debe hacerse caso por caso.
El servicio de monitorización de Prime Video, antes y después
La lección no es que los monolitos superen a serverless. Es que la arquitectura es cuestión de adecuación. El diseño serverless fue rápido de construir y adecuado para una carga de trabajo temprana y más pequeña. Cuando la característica definitoria de la carga de trabajo (volúmenes muy altos de datos pasados entre pasos por cada segundo de cada transmisión) pasó a ser dominante, una estructura que movía esos datos por la red muchas veces dejó de encajar, y otra estructura encajaba mejor. Un buen arquitecto se pregunta qué necesitan la carga de trabajo, el equipo y el presupuesto, no qué está de moda.
Comprueba lo que has entendido
¿Por qué un servicio bien escrito puede formar parte de un sistema poco fiable?
Porque la disponibilidad surge de cómo dependen los servicios unos de otros. Una cadena de llamadas síncronas multiplica las probabilidades de fallo, así que el conjunto puede estar menos disponible que cualquiera de sus partes.
¿Qué hizo que el fallo de Knight Capital fuera arquitectónico y no un simple bug?
Código obsoleto accesible, un flag con dos significados según la versión y un despliegue manual sin ninguna comprobación automática de que todos los servidores coincidían: todas ellas decisiones estructurales y de lanzamiento, no una línea defectuosa.
¿Cuál es la lección principal del caso de Prime Video?
Que una arquitectura debe adecuarse a su carga de trabajo y a su contexto. Un diseño adecuado para una escala y un patrón de datos puede dejar de encajar, y cambiar la estructura puede transformar el costo.
¿Por qué crece con el tiempo el costo de cambiar una decisión?
Porque pasan a depender de ella más código, más datos almacenados, más integraciones, socios y hábitos, así que cambiarla significa cambiarlos todos.
Fuentes y lecturas recomendadas
- SEC press release 2013-222: SEC charges Knight Capital with violations of market access rule
- GAO-14-694: Healthcare.gov: Ineffective Planning and Oversight Practices Underscore the Need for Improved Contract Management
- GAO-15-238: Healthcare.gov: CMS Has Taken Steps to Address Problems, but Needs to Further Implement Systems Development Best Practices
- Return of the Monolith: Amazon Dumps Microservices for Video Monitoring (The New Stack)
- Design Stamina Hypothesis (Martin Fowler)
¿Tienes una pregunta sobre esta sección? ArchitectBot, el asistente de estudio con IA del curso, responde primero a partir del curso.
Pregunta: “¿Cómo le explico a un gerente de producto por qué cambiar ahora nuestro modelo de datos de pedidos costará mucho más de lo que habría costado hace un año?”