Be Software Architecture Wise
Be Wise Apps

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ítulos
Solo 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

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

Gráfico conceptual de la funcionalidad acumulada en el tiempo de un sistema bien estructurado y de otro mal estructuradoTiempoFuncionesentregadascompensaciónPoca atención a la estructuraEstructura deliberadarápido al inicio
Un esbozo conceptual basado en Martin Fowler: prestar menos atención a la estructura es más rápido al principio, pero una estructura deliberada mantiene el ritmo de entrega.

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 modoDos 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ón35 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ódigo35 servicios a unos 3 días-persona cada uno para cambiar, probar y lanzar = 105 días-persona.
Año 3: migración de datosConvertir 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 socios4 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 finanzasUnos 30 días-persona.
Año 3: totalUnos 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

Enrutador de órdenes de Knight Capital: el código nuevo llegó a siete de ocho servidores; el octavo aún tenía la vieja función Power PegLlegan órdenes minoristas marcadascon el flag reutilizado (= usar el RLP nuevo)Enrutador SMARS: ocho servidorescód. RLPnuevocód. RLPnuevocód. RLPnuevocód. RLPnuevocód. RLPnuevocód. RLPnuevocód. RLPnuevocód. viejoPower PegÓrdenes hijas sin finmás de 4 M de ejecucionesen unos 45 minutosÓrdenes ejecutadas bienNingún segundo técnico revisó el despliegue ni se verificó automáticamente que los servidores coincidieran
Un flag reutilizado, un servidor desactualizado y ninguna comprobación del despliegue: el fallo estaba en la estructura y el proceso, no en una sola línea de código.

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

Servicio de monitorización de Prime Video antes y después: pasos serverless distribuidos que pasan datos por almacenamiento y luego un solo proceso que los pasa en memoriaAntes: serverless distribuidoDespués: un proceso replicadoOrquestación con Step FunctionsConv. de mediosS3: fotogramas intermediosDetect. defectosNotificacionescambio de estado por pasoProceso único (contenedor)Conv. de mediosen memoriaDetect. defectosNotificacionesescalado con más copias
Los mismos pasos, reagrupados: mover los datos en memoria dentro de un proceso eliminó los costos de orquestación por paso y de almacenamiento.

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.

Siguiente · 1.4El papel del arquitectoLo que hacen realmente los arquitectos en su día a día, las ocho expectativas descritas por Richards y Ford, los tipos de arquitecto, la amplitud frente a la profundidad y si los arquitectos deberían seguir escribiendo código.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: “¿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?”