Be Software Architecture Wise
Be Wise Apps

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

Sección 0.8 de 0.8 · Principiante · 20 min de lectura

Requisitos, control de versiones, pruebas, entrega y el recorrido de una solicitud

Videolección

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

Construir software es un deporte de equipo con una rutina cuidadosa. Las necesidades se anotan, cada cambio se registra y se revisa, y las pruebas automáticas funcionan como una red de seguridad. Al final de esta lección, seguimos un toque del botón Hacer pedido a través de todas las partes de un sistema de reparto de comida, uniendo todo el capítulo.

El software empieza con una necesidad. Algunos requisitos dicen qué debe hacer un sistema, por ejemplo, que un cliente pueda pagar con tarjeta. Otros dicen con qué calidad, por ejemplo, que el pago se complete en menos de dos segundos. Muchos equipos escriben las necesidades como historias de usuario. Por ejemplo: como cliente con hambre, quiero volver a pedir una comida que ya pedí antes, para poder comer cuanto antes. Después, los criterios de aceptación dicen exactamente cuándo está terminada la historia.

Muchas personas modifican el mismo código cada día, así que los equipos usan control de versiones, casi siempre una herramienta llamada Git. Registra cada cambio, quién lo hizo y por qué. Cada cambio guardado es un commit, aquí en la línea principal. Para trabajar en algo nuevo, un desarrollador crea una rama: una línea de trabajo separada. Aquí, dos commits añaden un botón de propina y sus pruebas, sin molestar a nadie más. Cuando está lista, el desarrollador abre un pull request. Se ejecutan comprobaciones automáticas y un colega revisa el cambio. La revisión detecta errores, pero también difunde el conocimiento, de modo que al menos dos personas entienden cada cambio. Una vez aprobada, la rama se fusiona de vuelta en main.

Cada cambio corre el riesgo de romper algo que antes funcionaba. Las pruebas automáticas son programas que comprueban otros programas, y se organizan en capas. En la base están las pruebas unitarias. Cada una comprueba una pieza pequeña, como una función, y se ejecuta en milisegundos, así que un equipo puede tener muchas. En el medio, las pruebas de integración comprueban que las partes funcionan juntas, como el código de pedidos con una base de datos real. En la cima hay unas pocas pruebas de extremo a extremo, que manejan el sistema completo como lo haría un usuario. Son realistas, pero lentas y a veces inestables. El objetivo es detectar la mayoría de los problemas con pruebas rápidas y focalizadas.

La automatización que lleva un cambio hasta los clientes se llama pipeline. Con la integración continua, cada cambio se fusiona a menudo y se compila y se prueba automáticamente. Un fallo vuelve directamente al desarrollador, en cuestión de minutos. Después viene staging: una copia del sistema lo más parecida posible a producción, donde se ensaya el lanzamiento. Producción es el sistema en vivo del que dependen los clientes reales. Con la entrega continua, una persona aprueba cada lanzamiento pulsando un botón. Con el despliegue continuo, cada cambio que supera las comprobaciones pasa a producción automáticamente.

Los equipos también eligen cómo organizar el trabajo. En un enfoque secuencial, a menudo llamado en cascada, cada fase termina antes de que empiece la siguiente. Es adecuado cuando los requisitos son fijos, pero los usuarios no ven nada hasta muy tarde. Scrum, el marco ágil más usado, trabaja en ciclos cortos llamados sprints, de un mes o menos, que terminan cada uno con una revisión. Kanban no tiene ciclos fijos. El trabajo fluye por un tablero visible, y el equipo limita cuánto hay en curso a la vez. Y DevOps es una cultura que une la construcción y la operación del software: quien lo construye, lo opera.

Ahora, todo el capítulo en un solo momento. Un cliente toca Hacer pedido en una app de reparto de comida. La app convierte el carrito en JSON. Primero, el DNS convierte el nombre de la empresa en una dirección IP. La app envía una solicitud HTTPS. Un balanceador de carga en la región de nube de la empresa la pasa a una de varias copias del servicio de pedidos, que se ejecutan en contenedores. El servicio de pedidos llama a la API del proveedor de pagos y espera. El cliente no debe ver confirmado hasta que el pago esté aprobado, así que esta llamada es síncrona. Después, en una sola transacción, el pedido y sus artículos se guardan en la base de datos. O se guarda todo, o no se guarda nada. Por último, un mensaje de pedido realizado va a una cola, y la app muestra confirmado. El servicio de notificaciones lo recoge cuando está listo, y una notificación push llega al teléfono. Si ese servicio se cae brevemente, no se rompe nada visible.

Pregunta qué pasaría si, en cada paso, y aparecerán las preguntas arquitectónicas. ¿Y si la llamada de pago supera el timeout? ¿Se hizo el cargo? Una clave única enviada con el pedido permite al servicio volver a preguntar con seguridad, sin cobrar dos veces. ¿Y si guardar el pedido falla después de que el pago haya salido bien? El pago y la base de datos son sistemas separados, así que el diseño necesita una forma de reembolsar o reintentar. ¿Y si el tráfico de la hora de la cena se triplica? Se añaden más copias del servicio de pedidos, y la base de datos pasa a ser el cuello de botella probable. Ninguna de estas preguntas trata de escribir una función. Tratan de cómo se organizan las partes.

Alguien tuvo que decidir todo eso: qué es síncrono, dónde residen los datos, qué se ejecuta dónde. Decidir cómo se organizan las partes es arquitectura de software. Con esto termina el Capítulo cero. Haz la prueba opcional del capítulo y luego continúa con el Capítulo uno: qué es la arquitectura de software.

Lo que necesitas saber

De una idea a un requisito

El software empieza con una necesidad: un restaurante quiere recibir pedidos en línea, un hospital quiere que los pacientes reserven sus citas ellos mismos. Convertir esa necesidad en algo que un equipo pueda construir es el trabajo de los requisitos. Algunos requisitos describen qué debe hacer el sistema ("un cliente puede pagar con tarjeta"); otros describen con qué calidad debe hacerlo ("el pago se completa en menos de dos segundos para el 95% de los clientes"). El Capítulo 2 muestra que el segundo tipo, los atributos de calidad, impulsa la mayoría de las decisiones arquitectónicas.

Muchos equipos recogen las necesidades funcionales como historias de usuario: descripciones breves escritas desde el punto de vista del usuario. Kent Beck las introdujo en Extreme Programming a finales de la década de 1990, y un equipo de la empresa londinense Connextra ideó en 2001 la plantilla que hoy usa la mayoría:

As a hungry customer,
I want to reorder a meal I have ordered before,
so that I can eat sooner without searching the menu again.

Acceptance criteria
- My last 10 orders appear on the home screen.
- Tapping "Reorder" fills the basket with the same items.
- Items that are no longer available are flagged, not silently dropped.
Una historia de usuario con criterios de aceptación. Los criterios son lo que comprobarán los testers y las pruebas automáticas.

Una historia es deliberadamente pequeña e incompleta. Ron Jeffries la describió como una tarjeta, una conversación y una confirmación: la tarjeta es un recordatorio, los detalles se concretan conversando entre quienes quieren la funcionalidad y quienes la construyen, y los criterios de aceptación confirman cuándo está terminada. Los profesionales no se ponen de acuerdo sobre cuánto debe escribirse por adelantado. Los equipos de sectores regulados, como los dispositivos médicos y la aviación, deben mantener requisitos formales y trazables; los equipos de producto suelen preferir historias más ligeras que se refinan justo antes de empezar el trabajo. Ambas opciones son legítimas en su contexto.

Control de versiones con Git

El código fuente es el documento compartido más valioso del equipo, y muchas personas lo modifican cada día. El control de versiones registra cada cambio, quién lo hizo y por qué, permite trabajar en paralelo sin sobrescribir el trabajo de otros y hace posible restaurar cualquier estado anterior. Hoy casi todos los equipos usan Git, creado por Linus Torvalds en 2005 para el desarrollo del kernel de Linux, normalmente junto con un servicio de alojamiento como GitHub, GitLab o Bitbucket.

Unas pocas ideas cubren la mayor parte del uso diario. Un commit es una instantánea guardada de un conjunto de cambios, con un mensaje que lo explica ("Add tip button to checkout"). Una rama es una línea de trabajo separada: un desarrollador crea una rama a partir de main, hace commits en ella sin molestar a nadie y, al terminar, fusiona la rama de vuelta (merge), combinando los dos historiales. Si dos personas cambiaron las mismas líneas, Git informa de un conflicto de fusión que una persona debe resolver.

En los servicios de alojamiento, la fusión suele pasar por un pull request (GitLab lo llama merge request): una página web que muestra el cambio propuesto, donde se ejecutan comprobaciones automáticas y los colegas hacen la revisión de código, leyendo el cambio, haciendo preguntas y sugiriendo mejoras antes de aprobarlo. La revisión detecta defectos, pero sus mayores beneficios son difundir el conocimiento (al menos dos personas entienden cada cambio) y mantener la coherencia del diseño. Los arquitectos suelen participar en las revisiones de cambios que afectan a la estructura o a las interfaces.

Una rama de funcionalidad se crea desde main, recibe dos commits, se revisa en un pull request y se fusiona de vuelta en mainmaincommitcommitarreglo de colegamerge commitfeature/tip-buttonañade botónañade testsPull requestrevisión + CILa rama mantiene el trabajo en curso fuera de main hasta que se ha revisado y probado.
Rama, commit, revisión, fusión: el ciclo diario del control de versiones.
git switch -c feature/tip-button     # create a branch and move onto it
# ... edit files ...
git add checkout.py test_checkout.py
git commit -m "Add tip button to checkout"
git push -u origin feature/tip-button  # upload; then open a pull request
# after review and green checks, the branch is merged into main
El ciclo diario de Git desde la línea de comandos.

Los equipos difieren en cómo usan las ramas. Algunos mantienen ramas de larga duración por funcionalidad o por versión; otros practican el desarrollo basado en trunk, fusionando cambios pequeños en main al menos una vez al día y ocultando las funcionalidades sin terminar tras interruptores llamados feature flags. La investigación del programa DORA asocia las ramas de corta duración con un mejor rendimiento de entrega, pero la elección correcta también depende de cómo lanza el equipo sus versiones.

Pruebas: la pirámide

Cada cambio corre el riesgo de romper algo que antes funcionaba, lo que se llama una regresión. Las pruebas automáticas son programas que comprueban otros programas, así que pueden ejecutarse con cada cambio en minutos en lugar de a cargo de personas durante días. Se organizan en capas. Una prueba unitaria comprueba una pieza pequeña, como una función, de forma aislada, y se ejecuta en milisegundos. Una prueba de integración comprueba que las partes funcionan juntas: el código de pedidos con una base de datos real, o la tienda con el entorno de pruebas de un proveedor de pagos. Una prueba de extremo a extremo maneja el sistema completo como lo haría un usuario, por ejemplo tocando la app desde el menú hasta la confirmación del pedido.

La pirámide de pruebas de Mike Cohn, publicada en su libro de 2009 Succeeding with Agile, sugiere las proporciones: muchas pruebas unitarias, menos pruebas de integración y pocas pruebas de extremo a extremo. Las capas superiores son más realistas, pero más lentas, más caras de mantener y más propensas a fallos intermitentes (flaky), que van y vienen por motivos ajenos al cambio. Algunos profesionales defienden otra forma, por ejemplo más pruebas de integración en sistemas que son sobre todo pegamento entre servicios; el principio en el que todos coinciden es detectar la mayoría de los problemas con pruebas rápidas, fiables y focalizadas.

La pirámide de pruebas: muchas pruebas unitarias rápidas en la base, menos de integración y pocas de extremo a extremo, lentas, en la cimaPruebas E2EIntegraciónUnitariaspocas: el sistema,lentas, inestablesalgunas: partes juntas,BD y APIsmuchas: una funcióno clase, milisegundosmás lentas y caras,más realistasrápidasLa forma guía las proporciones, no es una ley: que casi todas las pruebas sean rápidas y concretas.
Muchas pruebas unitarias rápidas, menos pruebas de integración y unas pocas de extremo a extremo dan una respuesta rápida sin perder realismo.
def delivery_fee(basket_total, distance_km):
    if basket_total >= 25:
        return 0.0                      # free delivery on larger orders
    return round(1.50 + 0.40 * distance_km, 2)

def test_free_delivery_over_threshold():
    assert delivery_fee(30.00, 5) == 0.0

def test_fee_grows_with_distance():
    assert delivery_fee(10.00, 5) == 3.50
Dos pruebas unitarias escritas con pytest para una función de tarifa de envío. Se ejecutan en milisegundos y fijan las reglas.

Entornos: de desarrollo a producción

El código pasa por varios entornos en su camino hacia los clientes, cada uno una copia separada del sistema con sus propios servidores, datos y configuración. El objetivo es encontrar los problemas donde son baratos e inofensivos, antes de que lleguen a producción, el entorno real del que dependen los usuarios reales.

EntornoQuién lo usaDatosPropósito
DesarrolloUn desarrollador, en una computadora portátil o un espacio personal en la nubePocos, inventadosEscribir y probar código rápidamente.
Pruebas (o integración)El equipo y el pipeline automatizadoInventados o anonimizadosEjecutar pruebas automáticas y exploratorias sobre los cambios combinados.
Staging (o preproducción)Testers, product owners y, a veces, clientes seleccionadosParecidos a los de producción en forma y volumen, nunca datos personales sin tratar y sin salvaguardasEnsayar el lanzamiento en una copia lo más parecida posible a producción.
ProducciónClientes realesRealesHacer funcionar el negocio. Los cambios llegan solo a través del pipeline.

Cuanto más se diferencian los entornos de producción, más problemas se cuelan: una base de datos de pruebas con cien filas no revelará el índice que falta y que hace que una consulta tarde cuarenta segundos contra diez millones. Mantener los entornos parecidos es más fácil cuando se construyen a partir de las mismas imágenes de contenedor y la misma configuración automatizada mediante scripts, un tema de la infraestructura como código.

Integración, entrega y despliegue continuos

La integración continua (CI) es la práctica de fusionar el trabajo de todos en la línea principal compartida con frecuencia, al menos a diario, con una compilación y una ejecución de pruebas automatizadas que comprueban cada cambio. Surgió de Extreme Programming en la década de 1990. Su sentido es que los problemas de integración se detectan en minutos, mientras el cambio sigue fresco en la mente de su autor, en lugar de en una dolorosa "fase de integración" semanas después. Un equipo que practica CI trata una compilación fallida como una emergencia: arreglarla va antes que cualquier trabajo nuevo.

La entrega continua (CD) amplía la CI para que el software esté siempre listo para lanzarse: cada cambio que supera el pipeline podría ponerse en producción pulsando un botón, y lanzar se convierte en una decisión de negocio rutinaria en lugar de un acontecimiento arriesgado. Jez Humble y David Farley expusieron este enfoque en su libro de 2010 Continuous Delivery. El despliegue continuo va un paso más allá y lanza automáticamente cada cambio que supera las comprobaciones, sin aprobación humana; los equipos que lo hacen pueden desplegar muchas veces al día.

La automatización que lleva un cambio desde el commit hasta producción es un pipeline. Como cada paso está automatizado y es idéntico cada vez, los lanzamientos dejan de depender de que una persona recuerde una lista de comprobación a medianoche.

Un pipeline de CI/CD: commit, build, pruebas automáticas, staging y producción, con la integración continua cubriendo las tres primeras etapasIntegración continua: en cada cambioEntrega / despliegueCommitpush o PRBuildcompila, empaquetaPruebasautom.Stagingcomo producciónProducciónpúblico realun fallo detiene la línea y vuelve al desarrollador en minutosentrega: una persona apruebadespliegue: 100% automático
La integración continua comprueba automáticamente cada cambio; la entrega y el despliegue llevan la compilación aprobada hasta producción.

Lista de comprobación: antes de que un cambio llegue a producción

Lo que comprueba el proceso de un equipo maduro, sobre todo de forma automática, en cada cambio.

  • El cambio está vinculado a una historia o incidenciaCualquiera puede averiguar después por qué se hizo.
  • Es pequeñoLos cambios pequeños son más fáciles de revisar, probar, desplegar y, si hace falta, deshacer.
  • Un colega lo ha revisadoMediante un pull request, con las preguntas respondidas y los comentarios resueltos.
  • Las pruebas automáticas pasan en todos los nivelesPruebas unitarias y de integración en la CI, y las comprobaciones de extremo a extremo que cubren el recorrido afectado.
  • Se ejecutó en stagingLa misma compilación, el mismo mecanismo de configuración y los mismos pasos de despliegue que en producción.
  • Hay una vía de vuelta atrásUn rollback o una feature flag pueden desactivarlo rápidamente si algo sale mal.
  • Alguien se dará cuenta si se rompeLa monitorización y las alertas cubren lo que toca el cambio (Capítulo 9, observabilidad).

Formas de trabajar: cascada, Scrum y Kanban

Los equipos también eligen cómo organizar el propio trabajo. En un enfoque secuencial, a menudo llamado en cascada, el proyecto avanza por fases en orden: requisitos, diseño, implementación, pruebas, despliegue. Cada fase termina antes de que empiece la siguiente. El nombre suele atribuirse a un artículo de Winston Royce de 1970, aunque Royce no usó esa palabra y de hecho advirtió que pasar una sola vez por las fases era arriesgado. Los planes secuenciales siguen siendo adecuados para trabajos en los que los requisitos son fijos y los cambios son muy costosos, como algunos proyectos regulados o que dependen del hardware. Su debilidad para la mayor parte del software es que los usuarios no ven nada hasta muy tarde, así que los malentendidos salen a la luz cuando son más caros de corregir.

Los enfoques ágiles, bautizados en el Manifiesto Ágil de 2001, entregan software que funciona en ciclos cortos y ajustan los planes a medida que aprenden. Scrum es el marco de trabajo más usado: un equipo pequeño trabaja en ciclos fijos llamados sprints, de un mes o menos, cada uno de los cuales empieza con una planificación y termina con una revisión del trabajo y una retrospectiva sobre cómo ha trabajado el equipo. La Guía de Scrum de 2020 define tres responsabilidades: el Product Owner (que decide qué es lo más valioso), el Scrum Master (que ayuda al equipo a usar Scrum con eficacia) y los Developers (que hacen el trabajo). Kanban, adaptado al software a partir del sistema de producción de Toyota, no tiene ciclos fijos: los elementos de trabajo fluyen por un tablero visible (por hacer, en curso, revisión, hecho), y el equipo limita cuántos elementos puede haber en curso a la vez para terminar el trabajo antes de empezar más.

Ninguno de ellos es adecuado para todos los equipos, y muchas organizaciones los combinan: Scrum para los equipos de producto, Kanban para soporte y operaciones, un plan más secuencial en torno a un plazo regulatorio fijo. Llamar "ágil" a un proceso no lo convierte en ágil; lo que importa es si el software que funciona llega a usuarios reales con la frecuencia suficiente para aprender de ellos.

DevOps: la responsabilidad de un solo equipo, del código al cliente

Tradicionalmente, los desarrolladores escribían el software y un equipo de operaciones separado lo hacía funcionar, con incentivos opuestos: a los desarrolladores se les recompensaba por el cambio y a operaciones por la estabilidad. DevOps es el movimiento, bautizado en la primera conferencia DevOpsDays de Gante en 2009, que une a ambos. Es ante todo una cultura de responsabilidad compartida ("you build it, you run it": quien lo construye, lo opera), apoyada en prácticas como CI/CD, la infraestructura como código, la monitorización y la revisión sin culpables de los incidentes. No es un puesto de trabajo ni una herramienta, aunque ambas cosas se venden con ese nombre. El programa de investigación DORA es conocido sobre todo por medir el rendimiento de entrega con cuatro métricas clave: con qué frecuencia despliega un equipo, cuánto tarda un cambio en llegar a producción, con qué frecuencia fallan los cambios y con qué rapidez se restablece el servicio tras un fallo.

Ejemplo práctico: el recorrido de un toque

Todo lo visto en este capítulo se une en un solo momento. Un cliente ha llenado un carrito en una app de reparto de comida y toca Hacer pedido. En un segundo o dos la pantalla dice "Pedido confirmado", y veinte minutos después el teléfono vibra: "Tu repartidor está en camino". Esto es lo que ocurre, paso a paso, con el concepto que hay detrás de cada paso y dónde se presentó.

Recorrido de un toque en Hacer pedido: del teléfono, por DNS, HTTPS y un balanceador de carga, al servicio de pedidos, la base de datos, el proveedor de pagos, la cola de mensajes y la notificación pushEmpresa de reparto, región de nubeApp móvilHacer pedidoDNSde nombre a IPProveedor de pagosAPI de tercerosBalanceadorfin de HTTPSServ. pedidosAPI + lógicaBD pedidostransacciónCola (mensajes)OrderPlacedServiciode avisosServicio pushApple / Google123456789
Un toque atraviesa el teléfono, internet, la región de nube de la empresa y dos proveedores externos; los números corresponden a los pasos de abajo.

Paso a paso

  1. 0. La app construye la solicitudLa app es software en el teléfono (Sección 0.1). Reúne el carrito a partir de sus estructuras de datos en memoria (Sección 0.2) y lo convierte en un cuerpo JSON: restaurante, artículos, dirección de entrega y una clave de pedido única generada en el teléfono.
  2. 1. DNSLa app necesita la dirección de api.fooddelivery.example. El teléfono pregunta a un resolutor DNS, que devuelve una dirección IP, a menudo desde una caché (Sección 0.4).
  3. 2. HTTPSLa app abre una conexión TCP y una sesión TLS, comprobando el certificado del servidor, y luego envía POST /v1/orders con un token de acceso que demuestra qué cliente ha iniciado sesión (Secciones 0.4 y 0.6).
  4. 3. Balanceador de cargaLa solicitud llega a un balanceador de carga en la región de nube de la empresa. Este descifra el HTTPS y reenvía la solicitud a una de varias copias en buen estado del servicio de pedidos, que se ejecutan en contenedores repartidos entre zonas de disponibilidad (Sección 0.7).
  5. 4. API y pagoAl servicio de pedidos se accede a través de su API REST. Su código, organizado en módulos (Sección 0.3), valida el carrito y luego llama a la API web del proveedor de pagos para autorizar la tarjeta, esperando de forma síncrona con un timeout, porque al cliente no se le debe decir "confirmado" hasta que el pago esté aprobado (Sección 0.6). Envía la clave del pedido como clave de idempotencia, para que, si la llamada se reintenta, el cargo a la tarjeta se haga una sola vez.
  6. 5. Transacción de base de datosEn una sola transacción ACID, el servicio inserta el pedido y sus artículos y registra la referencia del pago. O se guarda todo o no se guarda nada; una vez confirmada, la transacción sobrevive a un fallo del sistema (Sección 0.5). Un índice sobre el ID del cliente hará que su historial de pedidos cargue rápido.
  7. 6. ColaEl servicio pone un mensaje OrderPlaced en una cola de mensajes y responde de inmediato 201 Created. La app muestra "Pedido confirmado". Todo lo demás ocurre de forma asíncrona (Sección 0.6).
  8. 7. Otros servicios reaccionanEl servicio de tabletas del restaurante, el servicio de despacho de repartidores y el servicio de notificaciones leen el mensaje cuando están listos. Si uno de ellos se cae brevemente, sus mensajes esperan en la cola.
  9. 8. Notificación pushEl servicio de notificaciones reacciona a OrderPlaced, y más tarde a un mensaje similar cuando se asigna un repartidor, llamando al servicio push de Apple o Google, otra API de terceros, que entrega la notificación en el teléfono del cliente.
  10. 9. Y detrás de todoCada fragmento de código de este recorrido se escribió a partir de una historia de usuario, se revisó en un pull request, se probó en varios niveles y se lanzó mediante un pipeline de CI/CD, pasando por staging, hasta producción (esta sección).

Ejemplo práctico

Ejemplo práctico: lo que enseña el recorrido

Pregunta "¿y si...?" en cada paso y aparecerán las preguntas arquitectónicas.

¿Y si la llamada de pago supera el timeout?¿Se hizo el cargo o no? La clave de idempotencia permite al servicio de pedidos volver a preguntar con seguridad, sin cobrar dos veces.
¿Y si la confirmación (commit) en la base de datos falla después del pago?El pago y la base de datos son sistemas separados, así que ninguna transacción ACID única abarca ambos. El diseño necesita una forma de reembolsar o reintentar, un problema que el Capítulo 6 resuelve con sagas.
¿Y si el servicio de notificaciones está caído?No se rompe nada visible: se siguen recibiendo pedidos y los mensajes esperan en la cola. Esa es la razón para hacer asíncrono este paso.
¿Y si el tráfico de la hora de la cena se triplica?El balanceador de carga reparte las solicitudes entre más copias del servicio de pedidos, añadidas por el autoescalado; ahora el cuello de botella probable es la base de datos.
¿Y si un lanzamiento rompe el proceso de pago?Las pruebas del pipeline deberían detectarlo; si no, la monitorización lanza una alerta y el equipo hace rollback a la versión anterior.

Ninguna de estas preguntas trata de cómo escribir una función. Tratan de cómo se organizan las partes y de qué promete cada parte a las demás.

Por qué esto importa para la arquitectura

El recorrido de un toque usa una docena de componentes, tres organizaciones y comunicación tanto síncrona como asíncrona, y aun así hubo que diseñarlo: alguien decidió que el pago es síncrono y las notificaciones no, que los pedidos residen en una base de datos relacional, que el servicio se ejecuta en contenedores repartidos en dos zonas, que el proveedor de pagos queda aislado detrás de un único módulo. Decidir cómo se organizan estas partes, qué cualidades logra cada organización y cuánto cuesta, y dejar constancia de por qué, es arquitectura de software. La forma en que se construye el software también importa a la arquitectura: una arquitectura que no se puede probar por partes, o que no se puede lanzar sin coordinar a diez equipos, ralentiza cada cambio. El Capítulo 1 comienza con qué es la arquitectura de software.

Comprueba lo que has entendido

¿Cuál es la diferencia entre la entrega continua y el despliegue continuo?

Con la entrega continua, cada cambio que supera las comprobaciones puede lanzarse pulsando un botón, pero una persona decide cuándo. Con el despliegue continuo, cada cambio que supera las comprobaciones se lanza automáticamente.

¿Por qué la pirámide de pruebas pone las pruebas unitarias en la base?

Son rápidas, baratas y fiables, así que un equipo puede ejecutar miles con cada cambio y obtener respuesta en minutos. Las pruebas de extremo a extremo, más lentas y frágiles, se reservan para los pocos recorridos que las necesitan.

En el recorrido de un toque, ¿por qué la llamada de pago es síncrona y la notificación, asíncrona?

La app no debe decir "confirmado" hasta que el pago esté aprobado, así que espera esa respuesta. La notificación puede enviarse un poco más tarde, así que pasa por una cola y su fallo no puede bloquear los pedidos.

¿Cuáles son los dos principales beneficios de un pull request, además de detectar errores?

Difunde el conocimiento, porque al menos otra persona entiende cada cambio, y mantiene la coherencia del diseño del código, porque los revisores pueden cuestionar las decisiones estructurales.

Fin del capítulo 0Hacer la prueba del capítuloOpcional: 20 preguntas de opción múltiple y 2 respuestas escritas, en la app.Ir a la prueba →

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 afecta la forma en que mi equipo prueba y despliega el código a la arquitectura que deberíamos elegir?”