Be Software Architecture Wise
Be Wise Apps

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

Sección 1.1 de 1.8 · Principiante · 18 min de lectura

Qué es la arquitectura de software: las definiciones estándar y lo que tienen en común

Videolección

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

Pregunta a diez ingenieros con experiencia qué es la arquitectura de software y oirás diez respuestas distintas. Así que en esta lección precisamos la palabra, porque una buena definición te dice qué mirar y qué proteger.

Empieza por el edificio de un hospital. Su arquitectura no es el plano clavado en la pared. Es cómo está organizado realmente el edificio: dónde están las salas y qué pasillos las conectan. Dónde van los ascensores y qué puertas deben permanecer cerradas con llave. Y las reglas que todos siguen cuando lo amplían. Algunas decisiones, como dónde están los ascensores, costaría una fortuna cambiarlas. Las cortinas, no. La arquitectura de software es la misma idea aplicada a un sistema de software.

Las definiciones proceden de tres lugares. La norma internacional para describir arquitecturas la define como las propiedades fundamentales de algo en su entorno, más los principios que rigen cómo se construye y cómo cambia. El Software Engineering Institute, o SEI, da la definición más enseñada: las estructuras necesarias para razonar sobre un sistema, formadas por elementos, las relaciones entre ellos y las propiedades de ambos. Los profesionales lo dicen de forma más breve. Ralph Johnson la llamó el entendimiento compartido de los desarrolladores expertos. Grady Booch la llamó las decisiones de diseño significativas, con la significancia medida por el costo del cambio.

Así es como se ve en un sistema de reparto de comida. Dentro del límite del sistema están los elementos: una app móvil, un servicio de pedidos, una base de datos de pedidos, un servicio de repartidores y un módulo de pagos. Las relaciones muestran cómo se conectan. La app móvil llama al servicio de pedidos mediante HTTPS, y el servicio de pedidos consulta su base de datos con SQL. Las propiedades se escriben junto a los elementos. Por ejemplo, el servicio de pedidos no tiene estado y se ejecuta como tres copias. Fuera del límite está el entorno: los clientes, los repartidores, los restaurantes y el proveedor de pagos con tarjeta. El entorno también incluye la ley, el presupuesto, la organización y sus equipos, y la plataforma de nube. No puedes juzgar una arquitectura sin ellos.

Un sistema tiene varias estructuras a la vez, de tres tipos. Esta es una tienda en línea, vista de tres maneras. Las estructuras de módulos muestran cómo se divide el código: un paquete de pago que usa un paquete de catálogo y unas utilidades comunes. Responden a esto: ¿quién puede cambiar qué, y qué se rompe? Las estructuras de componentes y conectores muestran lo que se ejecuta: un frontend web llama a un servicio de pago, que envía un mensaje a una cola de pagos. Responden a preguntas de tiempo de ejecución: ¿qué rapidez, qué fiabilidad, qué seguridad? Las estructuras de asignación hacen corresponder el software con elementos ajenos a él: el clúster de contenedores de la región de nube A y el equipo de pago que es su dueño. Responden a esto: ¿cuánto cuesta, y quién lo construye y lo opera?

Leídas en paralelo, las definiciones comparten siete ideas. Las cuatro primeras las acabas de ver: estructuras, formadas por elementos, relaciones y propiedades. Quinta, las decisiones: las elecciones que produjeron las estructuras, con sus razones. Sin las razones, más adelante la gente deshace buenas decisiones por accidente. Sexta, la significancia. Solo algunas cosas son arquitectónicas: las que son costosas de cambiar, afectan a muchas partes o determinan una cualidad clave. Y séptima, el entorno: los usuarios, los sistemas, la organización, las leyes y los presupuestos que rodean al sistema, que le dan forma y a los que él da forma.

Apliquemos esto. Una empresa de reparto de comida pide a una arquitecta recién incorporada que le diga cuál es su arquitectura. Lo único que tienen es un diagrama desactualizado. Usando las ideas compartidas como lista de comprobación, la arquitecta enumera los elementos y las relaciones. Las apps llaman al servicio de pedidos, que escribe en una única base de datos compartida y publica eventos que recoge la asignación de repartidores. Después, las propiedades. El servicio de pedidos no tiene estado y se ejecuta como tres copias. La asignación de repartidores guarda su estado en memoria y se ejecuta como una sola copia. A continuación, lo previsto frente a lo real. El diagrama antiguo muestra una base de datos separada para cada servicio. En realidad, el servicio de repartidores lee directamente las tablas de pedidos. Eso saca a la luz dos riesgos que nadie había señalado: un punto único de fallo y una base de datos compartida que ata a dos equipos. Ninguno de los dos era visible en el código de ningún servicio concreto. Ambos son propiedades de la estructura, así que cuentan como arquitectura.

De aquí se desprenden dos lecciones. Primera, todo sistema tiene una arquitectura, la haya diseñado alguien a propósito o no. La pregunta es si es adecuada para su propósito, se entiende y se ha moldeado de forma deliberada. Segunda, la arquitectura no es lo mismo que su descripción. Un diagrama es un producto de trabajo que la expresa, y puede estar incompleto o desactualizado. Y cuando no estés seguro, hazte tres preguntas. ¿Sería caro cambiarlo más adelante? ¿Afecta a varias partes o a varios equipos? ¿Determina una cualidad importante, como la velocidad o la seguridad? Si alguna respuesta es sí, trátalo como arquitectura.

Eso es la arquitectura. La sección completa compara las definiciones en paralelo y trata las ideas erróneas habituales. A continuación, en la Sección uno punto dos, vemos dónde termina la arquitectura y dónde empieza el diseño. Nos vemos allí.

Lo que necesitas saber

Por qué hace falta definir la palabra

Pregunta a diez ingenieros con experiencia qué es la arquitectura de software y oirás diez respuestas distintas: el diagrama de cajas y flechas de la pared, la elección del proveedor de nube, el esquema de la base de datos, la división en servicios, las reglas sobre qué código puede llamar a cuál o, simplemente, "las decisiones difíciles". Cada respuesta capta algo real y, por sí sola, a cada una le falta algo. Por eso, un curso que va a enseñar arquitectura tiene que empezar por precisar de qué está hablando.

Esto importa por razones prácticas. Si un equipo cree que la arquitectura es "el diagrama", dejará de prestarle atención una vez dibujado el diagrama, aunque el sistema siga cambiando por debajo. Si cree que la arquitectura es "el stack tecnológico", discutirá sobre frameworks mientras ignora cómo se reparten las responsabilidades y cómo fluyen los datos. Una buena definición te dice qué mirar, qué proteger y qué hablar con los demás.

Las definiciones que siguen proceden de una norma internacional, del Software Engineering Institute (SEI) de la Universidad Carnegie Mellon y de profesionales del sector. Se escribieron con fines distintos, pero coinciden más de lo que discrepan, y los puntos en los que coinciden son el núcleo de la disciplina.

La definición estándar: ISO/IEC/IEEE 42010:2022

ISO/IEC/IEEE 42010 es la norma internacional para describir arquitecturas. Su edición actual, publicada en noviembre de 2022, sustituyó a la edición de 2011. Define la arquitectura, en una paráfrasis fiel, como los conceptos o propiedades fundamentales de una entidad en su entorno, junto con los principios que rigen la realización y la evolución de esa entidad y sus procesos del ciclo de vida relacionados.

Tres rasgos de esta definición merecen atención. Primero, habla de una entidad, no solo de un sistema de software. La edición de 2022 amplió deliberadamente el alcance para que las mismas ideas se apliquen al software, a los sistemas de sistemas, a los productos, a las líneas de productos y a empresas enteras. Segundo, sitúa la entidad en su entorno: no puedes entender una arquitectura sin los usuarios, los otros sistemas, la organización, las leyes y los presupuestos que la rodean. Tercero, incluye principios que rigen cómo se construye la entidad y cómo cambia. La arquitectura no es solo una instantánea de la estructura; incluye las reglas que mantienen la estructura coherente a medida que el sistema evoluciona, como "cada servicio es dueño de sus propios datos" o "el código del dominio nunca depende del framework web".

La norma también traza una línea clara entre una arquitectura y una descripción de arquitectura. La arquitectura es el conjunto de propiedades fundamentales que el sistema tiene realmente. La descripción es un producto de trabajo (documentos, modelos, diagramas, registros de decisiones) que la expresa. ISO/IEC/IEEE 42010 es sobre todo una norma sobre descripciones: dice qué debe contener una buena descripción, como las partes interesadas identificadas, sus inquietudes y las vistas que abordan esas inquietudes. No te dice cómo diseñar una arquitectura. La Sección 1.5 vuelve a las partes interesadas y las inquietudes, y el Capítulo 4 trata las vistas.

La definición del SEI: estructuras, elementos, relaciones y propiedades

La definición más enseñada procede de Software Architecture in Practice, de Len Bass, Paul Clements y Rick Kazman (4.ª edición, Addison-Wesley, 2021), cuyos autores trabajaron en el SEI. En sus palabras, parafraseadas: la arquitectura de software de un sistema es el conjunto de estructuras necesarias para razonar sobre el sistema, y esas estructuras constan de elementos de software, las relaciones entre ellos y las propiedades de ambos.

Cada parte de esa frase cumple una función. Estructuras, en plural: un sistema tiene muchas estructuras a la vez (sus módulos de código, sus procesos en ejecución, su despliegue en máquinas) y ninguna de ellas es por sí sola "la" arquitectura. Necesarias para razonar sobre el sistema: la prueba de si algo es arquitectónico es si lo necesitas para responder preguntas importantes, como "¿Aguantará esto la carga máxima?" o "¿Pueden dos equipos trabajar en esto de forma independiente?". Los elementos son las partes: módulos, servicios, bases de datos, colas. Las relaciones son cómo se conectan: usa, llama a, publica en, se despliega en. Las propiedades son lo que hace que los elementos y las relaciones se comporten como lo hacen: un servicio no tiene estado, una llamada es síncrona con un timeout de dos segundos, una base de datos contiene datos personales y debe permanecer en la UE.

La expresión sobre el razonamiento también explica lo que no es arquitectura. El nombre de una variable local, el algoritmo interno de una rutina de ordenación o la disposición de una pantalla de configuración normalmente no te ayudan a razonar sobre el sistema en su conjunto, así que pertenecen al diseño detallado y no a la arquitectura. La Sección 1.2 examina dónde cae esa línea.

Elementos, relaciones, propiedades y entorno

Un sistema de reparto de comida dibujado como elementos y relaciones dentro de un límite, rodeado de su entornoSistema de repartoClientesRepartidorRestaurantesProveedorde pagosApp móvilServ. pedidosServ. repartoMódulo de pagosBD de pedidosHTTPSSQLeventosin estado, 3 copiasalcance PCI DSSEl entorno incluye además: ley, presupuesto,la organización y sus equipos, plataforma de nube
Elementos (cajas) conectados por relaciones (flechas), con sus propiedades escritas al lado, dentro de un límite del sistema situado en un entorno más amplio.

Definiciones de los profesionales: entendimiento compartido, lo importante y decisiones

Los profesionales han propuesto definiciones más breves que ponen el acento en las personas y las decisiones más que en las estructuras. Martin Fowler ha popularizado dos de Ralph Johnson (uno de los cuatro autores del libro Design Patterns de 1994). La primera es que la arquitectura es el entendimiento compartido que tienen los desarrolladores expertos de cómo está diseñado el sistema. La segunda, de la misma discusión, es deliberadamente abierta: La arquitectura trata de lo importante. Sea lo que sea. Johnson también sugirió que la arquitectura es el conjunto de decisiones que te gustaría acertar al principio de un proyecto, no porque sea más probable acertarlas al principio, sino porque equivocarse en ellas sale muy caro.

Grady Booch, uno de los creadores de UML, lo planteó en términos económicos: la arquitectura está formada por las decisiones de diseño significativas que dan forma a un sistema, donde la significancia se mide por el costo del cambio. Eso convierte una idea abstracta en una prueba utilizable. Elegir el color de un botón es barato de revertir. Elegir entre una base de datos relacional y un almacén de documentos, o entre una unidad desplegable y cuarenta, es caro de revertir una vez que los datos, el código y los equipos han crecido a su alrededor. Booch también observó que toda arquitectura es diseño, pero no todo diseño es arquitectura.

Estas definiciones añaden algo que las estructurales dejan implícito. La arquitectura vive en parte en la cabeza de las personas; un sistema cuyos ingenieros sénior comparten una imagen clara de cómo funciona tiene una arquitectura más coherente que uno en el que cada cual tiene una imagen distinta, aunque ninguno de los dos tenga un diagrama. Y la arquitectura se forma a partir de decisiones, muchas de las cuales implican un compromiso: elegir una opción significa renunciar a las ventajas de otra. La Sección 1.6 estudia en detalle las decisiones y los compromisos.

Comparación de las definiciones

FuenteIdea central (parafraseada)Qué destacaMás útil para
ISO/IEC/IEEE 42010:2022Conceptos o propiedades fundamentales de una entidad en su entorno, más los principios que rigen su realización y su evoluciónEntorno, principios, evolución; la arquitectura es distinta de su descripciónContratos, trabajo de normalización, describir arquitecturas de forma coherente en toda una organización
Bass, Clements y Kazman (2021)El conjunto de estructuras necesarias para razonar sobre el sistema: elementos, relaciones y propiedades de ambosMúltiples estructuras; razonar sobre las cualidadesAnálisis y diseño: preguntarse si una estructura cumplirá sus objetivos
Ralph Johnson, a través de Martin FowlerEl entendimiento compartido de los desarrolladores expertos; lo importante, sea lo que seaLas personas, la comunicación, el criterio sobre lo que es importanteLa práctica del equipo: mantener vivo un modelo mental común
Grady BoochLas decisiones de diseño significativas que dan forma a un sistema, con la significancia medida por el costo del cambioLas decisiones y su economíaDecidir dónde invertir el esfuerzo de análisis

Lo que comparten las definiciones

Leídas en paralelo, las definiciones convergen en siete ideas, y juntas forman una definición de trabajo para el resto de este curso.

Siete ideas compartidas

  1. EstructurasUn sistema tiene varias estructuras a la vez, y cada una lo muestra desde un ángulo distinto. Ningún diagrama por sí solo es toda la arquitectura.
  2. ElementosLas partes que forman esas estructuras: módulos, componentes, servicios, almacenes de datos, colas, servidores.
  3. RelacionesCómo se conectan los elementos y cómo dependen unos de otros: llamadas, mensajes, datos compartidos, despliegue, propiedad.
  4. PropiedadesLas características visibles desde fuera de los elementos y las relaciones, como no tener estado, estar cifrado, ser asíncrono o estar replicado, que juntas determinan los atributos de calidad del sistema.
  5. DecisionesLas elecciones que produjeron las estructuras, con las razones y las alternativas descartadas que hay detrás. Sin las razones, más adelante la gente deshace buenas decisiones por accidente.
  6. SignificanciaSolo algunas cosas son arquitectónicas: las que son costosas de cambiar, afectan a muchas partes o determinan una cualidad clave. La arquitectura es selectiva por definición.
  7. EntornoEl sistema se sitúa entre usuarios, otros sistemas, una organización, leyes y presupuestos. Todo ello da forma a la arquitectura y, a su vez, la arquitectura le da forma a ello.

Tres tipos de estructura

El trabajo del SEI sobre documentación, publicado como Documenting Software Architectures: Views and Beyond (Clements y colaboradores, 2.ª edición, 2010), agrupa las estructuras en tres tipos, y Software Architecture in Practice usa la misma agrupación. Conocer los tres tipos te protege del error más común en las discusiones de arquitectura: hablar de un tipo de estructura mientras la otra persona está pensando en otro.

Las estructuras de módulos muestran cómo se divide el código en unidades de implementación, como paquetes, bibliotecas y espacios de nombres, y cómo dependen esos módulos unos de otros. Existen en tiempo de desarrollo. Responden a preguntas como: ¿qué equipo puede cambiar qué sin romper el trabajo de los demás, y qué código se puede reutilizar?

Las estructuras de componentes y conectores muestran lo que existe cuando el sistema se ejecuta: procesos, servicios, clientes, bases de datos y los conectores entre ellos, como las llamadas HTTP, las colas de mensajes y los flujos de eventos. Responden a preguntas de tiempo de ejecución: ¿qué rapidez tiene una solicitud, qué ocurre cuando falla una parte, dónde se guardan los datos?

Las estructuras de asignación hacen corresponder el software con elementos ajenos al software: con el hardware y la infraestructura en la nube (despliegue), con los equipos (asignación del trabajo) y con los archivos y repositorios (implementación). Responden a preguntas sobre costos, operaciones y organización: ¿dónde se ejecuta, quién lo construye, a quién despiertan de madrugada cuando falla?

Un mismo elemento puede aparecer en las tres. Una funcionalidad de pago es un paquete en la estructura de módulos, un servicio en ejecución en la estructura de componentes y conectores, y un conjunto de contenedores en una región de nube cuyo responsable es el equipo de pago en las estructuras de asignación. La correspondencia entre estructuras no siempre es de uno a uno: un solo módulo puede desplegarse como varios servicios, o varios módulos pueden ejecutarse en un mismo proceso. Es justo en ese desajuste donde se esconden muchas sorpresas.

Un sistema, tres tipos de estructura

La misma tienda en línea vista con estructuras de módulos, de componentes y conectores y de asignaciónMóduloscómo se divide el códigoComponentes y conectoresqué se ejecuta y comunicaAsignacióndónde se ejecuta, de quién espaquete catálogopaquete pagoutilidades comunesusausaFrontend webServicio de pagoCola de pagosvía RESTmensajeRegión de nube AContenedoresEquipo de pagocorre enposeePreguntas: ¿quién puedecambiar qué y qué falla?Preguntas: ¿qué rapidez,fiabilidad y seguridad?Preguntas: ¿cuánto cuesta,quién lo crea y lo opera?
Las estructuras de módulos, de componentes y conectores y de asignación muestran la misma tienda en línea desde tres ángulos y responden a preguntas distintas.

Todo sistema tiene una arquitectura

Como la arquitectura consiste en estructuras y en las propiedades que estas tienen realmente, todo sistema de software tiene una arquitectura, la haya diseñado alguien a propósito o no, y esté documentada o no. Una macro de hoja de cálculo que acabó convirtiéndose en una herramienta crítica para el negocio tiene una arquitectura. También la tiene la base de código de una startup escrita a toda prisa por tres personas. La pregunta nunca es si un sistema tiene arquitectura, sino si esa arquitectura es adecuada para su propósito, la entienden las personas que trabajan en ella y se ha moldeado de forma deliberada.

Esto lleva a una distinción útil. La arquitectura prevista (o prescriptiva) es lo que el equipo cree o ha decidido que debe ser la estructura: el diagrama de la wiki, las reglas acordadas. La arquitectura real (o descriptiva) es lo que hacen de verdad el código y la infraestructura. Las dos se van separando con el tiempo, a menos que alguien las mantenga alineadas, y ese desajuste es una de las principales fuentes de deuda técnica, que se trata en la Sección 1.7. Una arquitectura sin documentar no está ausente; simplemente es más difícil de ver, de razonar sobre ella y de cambiar con seguridad.

Ejemplo práctico

Ejemplo práctico: aplicar las definiciones a una app de reparto de comida

Una empresa de reparto de comida pide a una arquitecta recién incorporada que "nos diga cuál es nuestra arquitectura". Hay un único diagrama desactualizado. Usando las ideas compartidas como lista de comprobación, la arquitecta elabora una primera descripción en una semana.

ElementosApp móvil, aplicación web para restaurantes, servicio de pedidos, servicio de asignación de repartidores, módulo de pagos, una base de datos PostgreSQL compartida, un intermediario de mensajes (message broker) y un proveedor externo de pagos con tarjeta.
RelacionesLas apps llaman al servicio de pedidos mediante HTTPS; el servicio de pedidos escribe en la base de datos compartida y publica eventos de "pedido realizado"; la asignación de repartidores consume esos eventos; el módulo de pagos llama a la API del proveedor.
PropiedadesEl servicio de pedidos no tiene estado y se ejecuta como tres copias; la asignación de repartidores guarda el estado en memoria y se ejecuta como una sola copia; la base de datos contiene datos personales y tokens de tarjetas.
EntornoDos equipos de desarrollo, un regulador de seguridad alimentaria, la legislación de protección de datos, un presupuesto fijo de nube y restaurantes con tabletas poco fiables.
Decisiones significativas encontradasUna sola base de datos compartida por todos los servicios; una sola copia de la asignación de repartidores; eventos para el envío de repartidores, pero llamadas directas para los pagos.
Prevista frente a realEl diagrama antiguo muestra bases de datos separadas para cada servicio. En realidad, el servicio de repartidores lee directamente las tablas de pedidos, así que los dos servicios no se pueden cambiar de forma independiente.

El ejercicio saca a la luz dos riesgos que nadie había señalado: la única copia de la asignación de repartidores es un punto único de fallo, y la base de datos compartida acopla a dos equipos.

Ninguno de los dos riesgos era visible en el código de ningún servicio concreto. Ambos son propiedades de estructuras y relaciones, y por eso cuentan como arquitectura.

La descripción llevó una semana porque nadie había registrado las decisiones ni sus razones. Registrarlas es el tema del Capítulo 4.

Cómo usan las definiciones los profesionales

En la práctica, los arquitectos con experiencia rara vez recitan una definición, pero usan cada una como una lente. La visión de ISO les recuerda que deben mirar hacia fuera, al entorno, y separar lo que el sistema es de lo que dicen los documentos. La visión del SEI les da un vocabulario de estructuras, elementos, relaciones y propiedades para el análisis, y una prueba ("¿necesitamos esto para razonar sobre el sistema?"). La visión de Johnson les recuerda que un modelo mental compartido en todo el equipo es en sí mismo un activo que hay que mantener. La visión de Booch les dice dónde dedicar su tiempo limitado: a las decisiones que serían caras de revertir.

De ahí se deriva una regla práctica. Cuando no estés seguro de si algo es arquitectónico, hazte tres preguntas. ¿Sería caro o arriesgado cambiarlo más adelante? ¿Afecta a varias partes del sistema o a varios equipos? ¿Determina si el sistema cumple un objetivo de calidad importante, como la velocidad, la disponibilidad o la seguridad? Si la respuesta a cualquiera de ellas es sí, trátalo como arquitectura: decídelo de forma deliberada, registra las razones y asegúrate de que las personas afectadas lo entienden.

Comprueba lo que has entendido

¿Cuál es la diferencia entre una arquitectura y una descripción de arquitectura?

La arquitectura es el conjunto de propiedades y estructuras fundamentales que el sistema tiene realmente. La descripción es un producto de trabajo, como diagramas y documentos, que la expresa, y puede estar incompleta o desactualizada.

¿Qué tipo de estructura examinarías para averiguar a qué equipo despiertan cuando falla un servicio?

Una estructura de asignación, en concreto la correspondencia de asignación del trabajo o de propiedad entre el software y los equipos.

Según la prueba de Booch, ¿es arquitectónica la elección de la biblioteca de logging?

Normalmente no, si está oculta tras una interfaz pequeña y es barato sustituirla. Se vuelve arquitectónica si todos los módulos la llaman directamente, lo que hace que sea caro cambiarla.

¿Por qué menciona el entorno la definición de ISO?

Porque una arquitectura solo se puede juzgar en relación con los usuarios, los sistemas, la organización, las leyes y los presupuestos que la rodean; la misma estructura puede ser buena en un entorno y mala en otro.

Siguiente · 1.2Arquitectura frente a diseñoLa arquitectura y el diseño forman un único continuo de decisiones. Aprende qué hace que una decisión sea arquitectónicamente significativa, en qué se diferencian las decisiones estratégicas y las tácticas, y cómo se relacionan la arquitectura empresarial, la de soluciones y la de software.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: “El único diagrama de arquitectura de mi equipo tiene dos años. ¿Cómo averiguo cuál es nuestra arquitectura real y qué partes de ella son significativas?”