fedorthinks

Curso exprés · No. 02

No es un cargo, ni un título, ni el resultado de un examen. Es una manera de mirar un problema en el que la decisión de hoy define los próximos tres años.

31 conceptos · un diagrama para casi cada uno · hoja de referencia al final

§ 01

Lo que separa al arquitecto del ingeniero. No es conocimiento — es una manera de ver el problema.

Mapa del curso: 31 conceptos en ocho grupos

Un mapa del metro: primero ves todas las líneas juntas, luego viajas estación por estación.

La arquitectura no es un conjunto de tecnologías — es un conjunto de preguntas que se hacen antes de escribir código. Cada pregunta tiene su propio nombre en la industria: Trade-offs, Coupling, Idempotency, ADR. El curso las reúne en ocho grupos — los capítulos 1–8 los siguen.

1 · MindsetProblem framingLong-term thinking2 · Trade-offsTrade-offsSimplicity (KISS)ReversibilityTechnical debt3 · System designDecompositionCohesion / couplingDependency ruleInterface firstMonolith vs micro4 · Data & stateData modelSource of truthStateTransactionsCache5 · BoundariesAPI contractSync vs asyncIdempotencyExternal deps6 · Quality (NFRs)SecurityPerformanceScalabilityReliabilityObservability7 · EvolutionEvolvabilityMigrationYAGNI / deletion8 · CommunicationADRC4 modelStakeholders
Ocho grupos de conceptos — los capítulos 1–8 los siguen.

Cómo leer este curso

Un pasaporte: todos tienen los mismos campos, así que es fácil compararlos.

Cada concepto recibe el mismo trato: su nombre canónico (recuérdalo — es el término que vas a buscar y por el que te van a preguntar en entrevistas), una imagen de la vida real, un diagrama y una ficha con campos: qué es, por qué, ejemplo, trampa (dónde suele equivocarse la gente) y conceptos relacionados. Cada capítulo termina con su pregunta clave; el curso termina con listas de verificación y una hoja de referencia.

Problem Framing — cuestiona la tarea, no solo la solución

Un paciente entra al consultorio pidiendo una receta. El buen médico primero pregunta qué le duele — y puede descubrir que el remedio pedido habría sido un error.

Cuando alguien dice «haz X», el ingeniero pregunta «cómo hago X». El arquitecto pregunta «para qué hace falta X, y si otra cosa resolvería el problema real». Eso es problem framing. Con frecuencia la tarea está mal planteada — y la solución que alguien encargó se vuelve, un año después, el problema.

“Build X”request as posedWhy?Real problembehind the requestOption Xwhat was askedOption Ya simpler fixDo nothingalso an optionengineer: “how do I build X?” · architect: “why X at all?”
Primero «¿por qué?», luego el problema real, luego las opciones — incluida «no hacer nada».
PracticeProblem Framing· encontrar el problema real
Qué es

Encontrar el problema real detrás de un pedido antes de construir una solución.

Por qué
El error más caro es construir lo equivocado a la perfección.
Ejemplo

Te piden «agregar una exportación a Excel». Preguntas para qué — resulta que a la gente le cuesta usar el informe dentro del sistema. Arregla el informe.

Trampa
Saltar directo al «cómo» sin preguntar «por qué».
Relaciones

Produce las opciones para Trade-offs; «no hacer nada» suele ser la respuesta de YAGNI.

Long-term Thinking — un horizonte de años, responsabilidad por las consecuencias

Un ingeniero construye una casa para la familia que se muda el sábado. Un arquitecto pregunta: «¿Y cuando tengan el tercer hijo? ¿Y cuando la madre se mude con ellos? ¿Y si quieren alquilar la planta baja?»

El ingeniero resuelve el problema tal como está planteado. El arquitecto resuelve el problema tal como se verá dentro de tres años. Eso significa diseñar capacidades que aún no hacen falta, y dejar fuera, a conciencia, las que suenan elegantes pero nunca se van a usar.

Si el carpintero clava un clavo torcido, lo arregla en un día. Si el arquitecto pone un muro de carga en el lugar equivocado, la casa ya no se rehace — hay que vivir en ella.

Por eso el arquitecto responde por las consecuencias, no por el código. El error del ingeniero se corrige en una semana. El error del arquitecto la empresa lo paga durante años — en deuda técnica, en equipos perdidos, en oportunidades que no se aprovecharon. El arquitecto tiene que pensar antes de que se escriba la primera línea, y tener el coraje de frenar el desarrollo si la arquitectura no resiste los requisitos reales.

Engineer’s mistakefixed in a weekArchitect’s mistaketech debt · lost team · missed chancesweekmonth1 year3+ years
Un error de código se corrige en una semana. Un error de arquitectura se paga durante años.
ConceptLong-term Thinking· responsabilidad por las consecuencias
Qué es
Juzgar una decisión por cómo vivirá dentro de dos o tres años.
Por qué
Los errores de arquitectura son los más caros: se pagan durante años.
Ejemplo

Al elegir el esquema de una base de datos, pregunta: «¿Y si tenemos diez veces más clientes? ¿Y si aparece un segundo idioma?»

Trampa

Confundir «pensar a futuro» con «construir todo por adelantado». Pensar, sí; construir extras, no.

Relaciones

Lo equilibran Simplicity y YAGNI; ayuda a juzgar la Reversibility.

El ingeniero hace bien la cosa. El arquitecto hace la cosa correcta.

§ 02

La arquitectura es el arte de elegir qué perder. No existen soluciones perfectas.

Trade-offs — toda decisión gana algo y pierde algo

La bicicleta es más rápida que caminar, pero te mojas bajo la lluvia. El auto no te moja, pero queda atrapado en el tráfico. El metro no se atasca, pero no te deja en la puerta.

Cuando el ingeniero elige una tecnología, suele buscar «la mejor». Es una ilusión. El arquitecto sabe: cualquier elección es un compromiso sobre varios ejes — velocidad de desarrollo contra mantenibilidad, simplicidad contra flexibilidad, costo ahora contra costo dentro de tres años. Nombrar los ejes y elegir conscientemente es el trabajo arquitectónico.

every choice is a point on several axesDev speedMaintainabilitySimplicityFlexibilityCost nowCost in 3 years
Una decisión es un punto en varios ejes a la vez. Si ganas por un lado, pierdes por otro.
ConceptTrade-offs· compromisos
Qué es
Toda elección da algo y quita algo. No existe «lo mejor».
Por qué

Un trade-off dicho en voz alta se puede discutir y revisar. Uno oculto, no.

Ejemplo

Un servicio gestionado en la nube: rápido para empezar (ganas), pero más caro con volumen y más difícil de dejar (pierdes).

Trampa
Buscar «la mejor tecnología» en lugar de la adecuada.
Relaciones

Se registra en un ADR; una pérdida consciente hoy es Technical Debt.

Simplicity (KISS) — la solución simple casi siempre es la más acertada

Una navaja suiza lo hace todo, y todo mal. Un buen cuchillo corta mejor que todos sus hermanos dentro de la navaja suiza.

El ingeniero teme perder un requisito y llena el sistema con todo lo que alguna vez podría hacer falta. El arquitecto sabe: cada capacidad que nadie usa es un impuesto permanente sobre el desarrollo. La complejidad se introduce a conciencia, cuando está justificada; por defecto — la solución simple, fácil de cambiar. Este principio se suele llamar KISS — Keep It Simple, Stupid.

Everything “just in case”featurefeatureunusedunusedunusedunusedSimple by defaultfeaturefeatureadded when really neededunused = a permanent taxeasy to change
A la izquierda pagas por lo que nadie usa. A la derecha añades cosas cuando de verdad hacen falta.
PrincipleSimplicity· KISS, Keep It Simple
Qué es
Por defecto, la solución más simple que resuelva el problema.
Por qué

Lo simple es fácil de entender, probar y cambiar. Lo complejo solo se soporta.

Ejemplo

¿Cien tareas en segundo plano al día? Una tabla en la base de datos y cron bastan — no hace falta un message broker aparte.

Trampa

Construir «por si acaso»: cada función extra es un impuesto permanente.

Relaciones
Hermano de YAGNI; abarata la Evolvability.

Reversibility — las decisiones difíciles de deshacer merecen más atención

En un restaurante puedes devolver un plato. Un «sí» en una boda no se devuelve.

No todas las decisiones arquitectónicas cuestan lo mismo si resultan erróneas. Elegir un lenguaje de programación o una base de datos es casi irreversible. Elegir una biblioteca de logs se revierte en un día. El arquitecto dedica un tiempo desproporcionado a las decisiones irreversibles y avanza rápido en las reversibles. En la industria suelen llamarlas one-way door (puerta de un solo sentido) y two-way door (puerta de doble sentido).

Two-way dooreasy to undologging librarydecide fastOne-way doorhard to undoprogramming languagedatabasethink slowspend your time where a mistake is expensive
Lo reversible se decide rápido. Lo irreversible, despacio y con el «porqué» por escrito.
ConceptReversibility· puerta de un sentido / de dos sentidos
Qué es
Cuánto cuesta deshacer una decisión si resulta errónea.
Por qué
El tiempo de reflexión debe ser proporcional al costo de un error.
Ejemplo

Una biblioteca de logs — se cambia en un día. La base de datos principal — años de migración.

Trampa

Discutir semanas sobre lo reversible y elegir lo irreversible en cinco minutos.

Relaciones

Las decisiones irreversibles merecen un ADR; una Interface y una capa propia sobre las External Dependencies vuelven las cosas más reversibles.

Technical Debt — una elección consciente, no pereza

Un crédito de negocio está bien si sabes cuándo y cómo lo vas a devolver. Un crédito sin plan de pago es el camino a la quiebra.

A veces lo correcto ahora es entregar algo que tendrás que reescribir después. Eso es technical debt (deuda técnica). Y es normal. Lo que no es normal es no reconocer que es una deuda. El arquitecto anota qué trade-offs se tomaron, por qué, y cuándo hay que volver a ellos.

Shortcut nowship fasterRecorded debtwhat · why · whenPaid backplanned rewriteHidden debtnobody wrote it downInterest growsslower every monthconsciousno record
La deuda registrada se paga según el plan. La deuda sin registrar acumula intereses — el equipo se vuelve más lento cada mes.
TermTechnical Debt· deuda técnica
Qué es
Un atajo ahora que pagarás después con una reescritura.
Por qué

A veces la velocidad de hoy importa más que la limpieza — un intercambio legítimo.

Ejemplo

Antes del lanzamiento se dejó una sola moneda fija en el código. Quedó anotado: «revisar cuando aparezca un segundo mercado».

Trampa

Una deuda sin registro: nadie recuerda que existe, y los intereses crecen.

Relaciones

Un Trade-off registrado en un ADR; se paga mediante una Migration.

§ 03

Cómo descomponer un problema grande en componentes que se puedan entender, cambiar y reemplazar por separado.

Decomposition — la habilidad central del arquitecto

No puedes comerte una ballena entera. Sí puedes — si la cortas en trozos que te caben en la boca.

Un sistema grande es incomprensible. Decomposition es la habilidad de cortarlo en partes. Una buena arquitectura es un conjunto de partes pequeñas, cada una comprensible por sí sola. Si para explicar un componente hay que traer otros tres — la descomposición es mala.

Whole systemtoo big to understandsplitOrdersexplainable alonePaymentsexplainable aloneCatalogexplainable aloneAccountsexplainable alone
El sistema entero no se puede entender. Las partes que se explican solas, sí.
PracticeDecomposition· dividir en partes
Qué es
Cortar el sistema en partes, cada una comprensible por sí sola.
Por qué

Una persona solo puede tener cierta cantidad en la cabeza. Las partes pequeñas se pueden entender y cambiar.

Ejemplo

Una tienda en línea: pedidos, pagos, catálogo, cuentas — cada parte con su propia responsabilidad.

Trampa

Cortar por tecnología («todos los controllers aquí») en lugar de por sentido.

Relaciones

El corte se mide con Cohesion & Coupling; las partes hablan a través de una Interface.

Cohesion & Coupling — alta cohesión por dentro, bajo acoplamiento por fuera

Un buen departamento: la cocina está organizada en torno a un solo propósito (la estufa junto al fregadero) y comparte con los vecinos una sola pared.

Dentro de un módulo todo debe tratar de una sola cosa — eso es alta cohesión. Entre módulos — el mínimo contacto, a través de una interfaz clara — eso es bajo acoplamiento. Si cambias algo en un módulo y tienes que tocar otros cinco — el acoplamiento entre ellos es demasiado alto.

High cohesion · low couplingOrdersorderline itemstotalsBillinginvoicetaxpaymentone clear interfaceLow cohesion · high couplingModule AordertaxemailModule Binvoicetotalsuserschange one → touch five
Izquierda: cada módulo trata de una sola cosa, con un solo vínculo. Derecha: todo mezclado y conectado con todo.
PrincipleCohesion & Coupling· foco por dentro, pocos vínculos por fuera
Qué es

Cohesion — cuánto tratan de una sola cosa las partes de un módulo. Coupling — cuánto dependen los módulos entre sí.

Por qué

Así un cambio se queda dentro de un módulo en lugar de propagarse como una ola.

Ejemplo

El cálculo de impuestos vive en «Facturación», no esparcido entre pedidos, correos e informes.

Trampa
«Cambias uno, tocas cinco»: señal clara de alto acoplamiento.
Relaciones

La vara de medir de la Decomposition; se sostiene con una Interface.

Layers & the Dependency Rule — las capas tratan de la dirección de las dependencias

Los pisos de una casa: el tercero se apoya en el segundo, el segundo en el primero, el primero en los cimientos. No se pueden poner los cimientos sobre el tercer piso.

En una buena arquitectura, la lógica de negocio no sabe nada de la base de datos, la interfaz web ni el framework. Las capas internas no dependen de las externas — esa es la dependency rule (regla de dependencia). Cuando hay que cambiar la base de datos o el framework, la lógica de negocio no se toca. Eso es Clean Architecture en una frase.

outer layers = detailsdependencies point inward✗ the core never imports the databaseBusiness logicdomain rulesWeb UIDatabaseFramework
Los detalles (interfaz, base de datos, framework) dependen de la lógica de negocio — nunca al revés.
PrincipleDependency Rule· capas, Clean Architecture
Qué es

Las dependencias apuntan hacia adentro: los detalles conocen el núcleo, el núcleo no conoce los detalles.

Por qué

Puedes cambiar la base de datos o el framework sin tocar las reglas de negocio.

Ejemplo

La regla «10 % de descuento por tres artículos» no importa ni SQL ni HTTP — se puede probar sin base de datos.

Trampa
Consultas SQL y respuestas HTTP dentro de la propia lógica de negocio.
Relaciones

Funciona mediante una Interface; se ve a fondo en el curso de patrones de arquitectura (Hexagonal, Clean).

Interface over Implementation — importa más la interfaz

No te importa qué marca de ascensor hay en el edificio. Te importa que los botones funcionen igual, que las puertas abran con fiabilidad y que sea silencioso.

Cuando un módulo habla con otro, lo que importa es el contrato entre ellos (la interfaz), no cómo está construido por dentro el otro (la implementación). Primero se diseña la frontera (API, interfaz de clase, esquema de mensajes), luego la implementación. Las implementaciones se cambian con libertad; los contratos, solo siendo plenamente consciente del costo.

CallerInterfacethe contractImpl AtodayImpl Btomorrowthe caller sees only this
Quien llama ve solo la interfaz. La implementación detrás se puede reemplazar.
PrincipleInterface over Implementation· primero el contrato
Qué es
Diseñar primero la frontera entre las partes, después su interior.
Por qué

La implementación puede cambiar libremente mientras el contrato se mantenga.

Ejemplo

Una interfaz sendEmail(to, text): hoy detrás hay un proveedor de correo, mañana otro — el código que la llama no cambia.

Trampa

Quien llama mete la mano en las entrañas de otro módulo, saltándose la interfaz.

Relaciones

En el borde del sistema, una interfaz se convierte en un API Contract; es la base de la Dependency Rule.

Monolith vs Microservices — cuestión de madurez, no de moda

Un cocinero en una cocina pequeña hace un plato más rápido que diez cocineros negociando por Slack. Con cien platos por hora, diez cocineros lo hacen mejor.

Un monolito es una aplicación que se despliega entera. Los microservicios son muchos servicios pequeños, cada uno con su propio despliegue. Los microservicios resuelven problemas de escala organizativa y de carga, no de calidad del código. Un equipo pequeño con microservicios es una complejidad que nadie pidió. El arquitecto empieza con un monolito y lo divide cuando aparece dolor real, no «porque está de moda».

Monolithstart heresplit when it hurtsteam scale · loadOrdersown deployBillingown deploySearchown deployUsersown deploy✗ small team + microservices = complexity nobody asked for
Empieza con un monolito. Divide cuando de verdad duela: crece el equipo o la carga.
ConceptMonolith vs Microservices· una app o muchos servicios
Qué es
Una aplicación entera — o muchos servicios separados.
Por qué

Los microservicios dan despliegues y escalado independientes a equipos y cargas grandes.

Ejemplo

Un equipo de cinco construye un producto — monolito. Veinte equipos que se pisan en un solo despliegue — hora de dividir.

Trampa
Microservicios por moda: red, fallos y consistencia sin nada a cambio.
Relaciones

Se divide siguiendo la Decomposition; luego los servicios necesitan Sync vs Async e Idempotency.

§ 04

La parte más duradera del sistema. Los patrones de código se reescriben; el modelo de datos vive años.

Data Model — sobrevive a todo lo demás

Los cimientos de una casa sobreviven a todas las paredes y tejados que se construyen sobre ellos durante un siglo.

Los lenguajes se irán, los frameworks cambiarán, la interfaz se redibujará diez veces. El modelo de datos que se pone al principio se queda — porque cambiarlo en un sistema en marcha es carísimo. Es lo primero en lo que el arquitecto invierte tiempo y lo último que se apura a corregir.

UI designFrameworkLanguageData modellaid down at the start, lives for yearsyears →
La interfaz se redibuja muchas veces, el framework y el lenguaje cambian — el modelo de datos se queda.
ConceptData Model· entidades, campos, relaciones
Qué es
Qué entidades tiene el sistema, sus campos y relaciones.
Por qué
Es la parte que más vive — la más cara de cambiar después.
Ejemplo

Decide desde el principio: ¿un pedido tiene una dirección de entrega o varias? Cambiarlo después significa migrar millones de filas.

Trampa
Esbozar tablas en una tarde y construir sobre ellas durante años.
Relaciones

Dónde vive cada dato — Single Source of Truth; cómo cambiarlo — Migration.

Single Source of Truth — cada dato vive en un solo lugar

Si cada miembro de la familia lleva su propia lista de compras, dos comprarán leche y nadie comprará pan.

La misma información en dos lugares es un camino seguro hacia la divergencia. El principio de single source of truth (SSOT): el arquitecto determina dónde vive cada dato del sistema. Si los datos se duplican (por rendimiento, por ejemplo), debe quedar explícito qué es la fuente de verdad y qué es una caché o una proyección.

WritesSource of truthprimary databaseCachederived copyRead replicaderived copyProjectionderived copycopies are derived; writes go to the truth only
Las escrituras van solo a la fuente de verdad; la caché, la réplica y la proyección son copias derivadas.
PrincipleSingle Source of Truth· SSOT
Qué es
Cada dato tiene un hogar principal; todo lo demás son copias.
Por qué
Cuando las copias divergen, está claro en cuál confiar.
Ejemplo

El precio de un producto vive en el catálogo. El índice de búsqueda y la caché del sitio son copias, reconstruidas desde el catálogo.

Trampa
Dos sistemas que creen ser dueños del mismo campo.
Relaciones

Las copias son Cache y proyecciones; menos copias — menos State.

State — complejidad; cuanto menos, mejor

Un escritorio despejado facilita el trabajo. Uno desordenado te obliga a recordar dónde está cada cosa y te distrae todo el tiempo.

Cada pieza de estado guardada en algún lugar es algo que puede desincronizarse, perderse o contradecir a otro estado. La buena arquitectura apunta a funciones sin memoria (stateless) y variables de vida corta. El estado queda donde de verdad hace falta — normalmente en la base de datos.

App instancestatelessApp instancestatelessApp instancestatelessDatabasestate lives here
Las instancias de la app no recuerdan nada — todo el estado vive en un solo lugar, la base de datos.
ConceptState· stateless vs stateful
Qué es
Todo lo que el sistema recuerda entre peticiones.
Por qué
Menos estado — menos lugares donde algo puede divergir o perderse.
Ejemplo

El carrito de compras vive en la base de datos, no en la memoria del servidor: el servidor se reinicia — el carrito sobrevive.

Trampa

Estado en la memoria de un solo servidor: el servidor muere — los datos desaparecen.

Relaciones

Los servicios stateless son fáciles de multiplicar — eso es Scalability.

Transactions — la atomicidad de la intención

Una transferencia de dinero son dos acciones pero una sola intención. O ocurrieron las dos escrituras, o ninguna. A medias es una catástrofe.

Cuando varios cambios deben ocurrir como una sola unidad, hacen falta transacciones. Esa propiedad se llama atomicidad. El arquitecto sabe qué operaciones del sistema son atómicas, cuáles pueden fallar a medias y cómo convivir con eso. En los sistemas distribuidos esto se vuelve un problema central (two-phase commit, sagas, idempotency).

one intent = one transactionDebit A−100Credit B+100Both writtencommitNeither writtenrollbackOnly one✗ never allowed
Las dos escrituras o ninguna. No existe el a medias.
ConceptTransaction· atomicidad
Qué es
Varios cambios que ocurren por completo o no ocurren.
Por qué

De lo contrario el sistema se queda atascado en un estado «a medio hacer».

Ejemplo

Una transferencia: débito en A y crédito en B — en una sola transacción.

Trampa

Suponer que una transacción abarca varios servicios. Ahí hacen falta sagas e idempotency.

Relaciones

Entre servicios se apoya en la Idempotency; mira el patrón Saga en el curso de patrones de arquitectura.

Cache — una segunda verdad, y puede mentir

El calendario del refrigerador es más rápido que mirar el teléfono. Pero si alguien cambió el horario en el teléfono — el refrigerador ya está mintiendo.

Una caché da velocidad pero quita la garantía de frescura. El arquitecto siempre entiende: qué se cachea, por cuánto tiempo y qué pasa si la caché miente. La pregunta más difícil sobre una caché no es cómo agregarla — es cómo invalidarla (cache invalidation).

AppCachefast · may be staleDatabasesource of truthUpdatereadon missinvalidate!the hard part is not adding a cache — it is invalidating it
La caché responde rápido, pero tras un cambio en la base de datos hay que reiniciarla — si no, miente.
ConceptCache· invalidación de caché
Qué es
Una copia rápida de los datos cerca de quien los lee.
Por qué
Velocidad y menos carga sobre la fuente.
Ejemplo

El precio cambió en la base de datos — la caché aún tiene el viejo. El cliente ve un precio y paga otro.

Trampa
Agregar una caché sin decidir cuándo y cómo reiniciarla.
Relaciones
Una copia bajo Single Source of Truth, no una segunda verdad.
§ 05

Los mayores problemas nacen no dentro de los componentes, sino entre ellos.

API Contract — la frontera de un sistema es un contrato, no código

La frontera entre países no es una valla — son las reglas: qué se puede cruzar, quién entra, qué pasaporte hace falta.

Una API, un esquema de mensajes, un formato de archivo — son una promesa a todos los que los usan. Cambiar el contrato es cambiar la promesa, y eso cuesta mucho. Un buen arquitecto diseña los contratos para poder ampliarlos sin romper a los clientes existentes (añadir campos, nunca quitarlos). Esa propiedad se llama backward compatibility (compatibilidad hacia atrás).

Client v1Client v2API contracta promiseadd a field✓ old clients fineremove a field✗ breaks v1extend the contract; never take things away
Añades un campo — los clientes viejos siguen vivos. Quitas un campo — los clientes viejos se rompen.
ConceptAPI Contract· compatibilidad hacia atrás
Qué es
Una promesa pública: qué peticiones se aceptan y qué se devuelve.
Por qué
Dependen de él clientes que no controlas.
Ejemplo

Se añadió un campo currency a la respuesta — la app vieja simplemente lo ignora. Se renombró price — la app vieja se cayó.

Trampa
Cambiar el contrato con la misma ligereza que el código interno.
Relaciones

El rostro exterior de Interface over Implementation; se cambia mediante una Migration.

Sync vs Async — una elección de acoplamiento en el tiempo

Una llamada telefónica: ambos tienen que estar en línea al mismo tiempo. Una carta: el destinatario la lee cuando le conviene.

Una llamada síncrona acopla dos servicios en el tiempo: si el receptor está caído, el emisor también se atasca. La mensajería asíncrona a través de una cola rompe ese acoplamiento: el emisor deja la carta y sigue. Eso da resiliencia pero añade complejidad — retrasos, duplicados, orden.

Synchronous: coupled in timeService Awaits…Service BdowncallA is stuck tooAsynchronous: decoupledService Amoves onQueueholds messagesService Breads when readyprice of async: delay · duplicates · ordering
Arriba: A espera a B y cae con él. Abajo: A deja un mensaje en una cola y sigue.
ConceptSync vs Async· llamada o carta
Qué es

Esperar la respuesta de inmediato (una llamada) — o enviar y no esperar (una carta).

Por qué
Async desacopla los servicios: que uno falle no detiene al otro.
Ejemplo

Hacer un pedido — síncrono (el cliente espera). El correo con el recibo — asíncrono, mediante una cola.

Trampa

Olvidar el precio de async: retrasos, duplicados, mensajes desordenados.

Relaciones

Los duplicados exigen Idempotency; es habitual entre microservicios.

Idempotency — una operación se puede repetir sin riesgo

Se llama al ascensor al tercer piso. Si diez personas vuelven a pulsar el mismo botón, el ascensor sigue yendo al tercer piso y no se rompe nada.

En los sistemas reales las llamadas se reintentan — por timeouts, fallos de red, reinicios. Una operación idempotente da el mismo resultado al repetirse. Una operación peligrosa de reintentar es una bomba de tiempo. El arquitecto hace idempotentes por defecto las operaciones críticas (pagos, procesamiento de mensajes).

Clientsame request ×3 (timeouts)Payment APIidempotentCharged once$100, not $300repeating the operation gives the same result
La misma petición llegó tres veces — el dinero se cobró una sola vez.
ConceptIdempotency· seguro de repetir
Qué es
Repetir una operación da el mismo resultado que ejecutarla una vez.
Por qué
Los reintentos son inevitables: timeouts, fallos de red, reinicios.
Ejemplo

El cliente envía un pago con una clave única. Llega otra vez la misma clave — el servidor devuelve el resultado anterior en lugar de cobrar de nuevo.

Trampa

«Nunca recibimos reintentos» — sí los recibes, solo que aún no los has visto.

Relaciones

Necesaria con Async y reintentos; un cimiento de la Reliability.

External Dependencies — siempre un riesgo

Si la cena depende de la pizzería de enfrente — no pasa nada, hay alternativas. Si depende del único proveedor de carne de la ciudad — es crítico.

Toda dependencia externa — API, servicio, biblioteca — puede caerse, volverse lenta o cambiar su contrato. El arquitecto decide qué pasará cuando eso ocurra: ¿cae todo el sistema, o sigue funcionando con degradación? Muchas veces conviene aislar la dependencia externa detrás de una capa propia (un adapter) — para poder cambiarla después.

Your coreYour adapterown layerVendor APIcan be slow / downOther vendorswap laterFallbackdegraded mode
El núcleo habla con su propio adapter. Detrás: el proveedor, un proveedor de respaldo o un modo degradado.
PracticeExternal Dependencies· tu propio adapter
Qué es
Todo lo que no controlas: las API, servicios y bibliotecas de otros.
Por qué
Cuando fallan o cambian, tu sistema no debe caer con ellos.
Ejemplo

El proveedor de pagos se esconde detrás de tu propia interfaz PaymentGateway. Cambiar de proveedor significa un adapter nuevo, no reescribir los pedidos.

Trampa
Llamadas al SDK de un proveedor esparcidas por todo el código.
Relaciones

Una aplicación de Interface over Implementation; parte de la Reliability (fallback).

§ 06

No «qué hace el sistema» sino «qué tan bien lo hace». Se llaman requisitos no funcionales (NFR) o atributos de calidad — lo que el cliente nunca va a formular, pero que exigirá sin falta.

Security — no es una función, es una forma de vida del sistema

En un museo, la seguridad no es una cámara en la puerta — son capas: torniquetes, guardias, cámaras en cada sala, cerraduras en las vitrinas.

La seguridad no se puede añadir al final. Se construye en cada capa: autenticación, autorización, cifrado, aislamiento, auditoría, mínimo privilegio. Este enfoque por capas se llama defense in depth. El arquitecto piensa en ella desde el primer día y en cada decisión pregunta: «¿Y si un atacante entra por aquí?»

Authentication — who are you?Authorization — what may you do?EncryptionIsolationDataleast privilegeAudit — every access is logged
Defensa por capas: si pasas una, el atacante choca con la siguiente.
QualitySecurity· defense in depth, least privilege
Qué es

Protección en todos los niveles del sistema, no un solo candado en la puerta.

Por qué
Tarde o temprano una capa será vulnerada — las demás deben resistir.
Ejemplo

El servicio de informes tiene acceso de solo lectura a la base de datos — aunque lo hackeen, no se pueden borrar los datos.

Trampa
«Añadiremos la seguridad antes del lanzamiento».
Relaciones

La auditoría se apoya en la Observability; el aislamiento se apoya en fronteras claras.

Un taxi para tres personas no debe viajar como un tren bala. Un tren bala no cabe por una calle lateral.

«Hazlo rápido» es un requisito sin sentido. El arquitecto expresa el rendimiento en números: cuántas peticiones por segundo (throughput), qué latencia es tolerable, cómo se comporta el sistema en el pico, qué pasa al pasar el límite. Optimizar demasiado pronto es un desperdicio; no pensar en absoluto es una catástrofe.

latencyload (req/s)tolerable latencyexpected peakpast the limit:then what?
Un requisito son números: qué latencia es tolerable, con qué carga. Y qué pasa al pasar el límite.
QualityPerformance· latency, throughput
Qué es
Cuánto maneja el sistema y qué tan rápido responde — en números.
Por qué
Sin números no se sabe si alcanza, ni dónde parar.
Ejemplo

«La búsqueda responde en menos de 300 ms con 200 peticiones por segundo; en el pico — una cola, no una caída.»

Trampa
«Hazlo rápido» sin números — y optimizar lo que no duele.
Relaciones

Si crece la carga — Scalability; se mide mediante Observability.

Scalability — la capacidad de crecer sin reescribir

Una casa diseñada con la opción de añadir un segundo piso se amplía sin demoler. Una casa sin esa opción — solo reconstruyéndola desde cero.

Scalability: el sistema debe crecer en dos direcciones — más usuarios (horizontalmente — añadir servidores) y más funciones (de forma modular — añadir módulos sin romper los viejos). Eso se incorpora al diseño, no se añade después.

Systemmore users → add servers (horizontal)serverserverservermore features → add modulesmodulemodulemodule+ new module
Dos ejes de crecimiento: a la derecha — más servidores, hacia abajo — más módulos.
QualityScalability· horizontal y modular
Qué es
La capacidad de crecer en carga y en funciones sin reescribir.
Por qué
Un sistema exitoso crece — reescribirlo sobre la marcha es caro.
Ejemplo

Un servicio stateless detrás de un balanceador de carga: subió la carga — añade tres copias más.

Trampa
Construir para un millón de usuarios cuando tienes cien.
Relaciones

Se apoya en State (stateless) y en Cohesion & Coupling (módulos).

Reliability — el comportamiento del sistema cuando algo se rompe

Un buen barco no es el que no se hunde (esos no existen) — es el que tiene diez compartimentos, de modo que si se perfora uno, los demás siguen a flote.

Cada parte de un sistema termina por romperse. Reliability no es «nunca se rompe» — es «sobrevive a la rotura». El arquitecto no intenta evitar el fallo — diseña cómo sobrevive el sistema: aislamiento de fallos, reintentos, degradación elegante, fallbacks. La regla principal: el fallo de un componente no debe matar todo el sistema.

bulkheads: one breach stays localokokbreachsealed offokokokIsolationcontain failureRetriestry againFallbackplan BDegradationwork partly
Compartimentos de un barco: una brecha no hunde el resto. Abajo — cuatro tácticas de fiabilidad.
QualityReliability· tolerancia a fallos
Qué es
Cómo se comporta el sistema cuando una parte se ha roto.
Por qué

Todo se rompe — la única pregunta es si un fallo arrastra a los demás.

Ejemplo

El servicio de recomendaciones cayó — la tienda muestra «lo más popular» en lugar de sugerencias personales, pero sigue vendiendo.

Trampa
Construir como si los fallos no fueran a ocurrir.
Relaciones

Los reintentos requieren Idempotency; la Observability permite ver el fallo.

Observability — no puedes arreglar lo que no ves

Un coche sin indicador de combustible, sin termómetro, sin indicador de presión de aceite. Anda hasta que muere para siempre.

Observability: el sistema debe contarte su propio estado — logs, métricas, trazas. Cuando algo sale mal a las tres de la mañana, tienes minutos para encontrar el problema. Si la observabilidad no se diseña desde el principio, ya es tarde para añadirla — ni siquiera sabes dónde mirar.

SystemLogswhat happenedMetricshow much / how fastTraceswhere time wentYou, at 3 a.m.find it in minutes
Tres señales — logs, métricas, trazas — convierten una caída nocturna en una búsqueda de minutos.
QualityObservability· logs, métricas, trazas
Qué es

La capacidad de entender lo que pasa dentro del sistema a partir de sus señales.

Por qué
Sin señales, una caída se busca durante horas, a ciegas.
Ejemplo

Una métrica muestra un pico de errores a las 03:00, una traza muestra una API externa lenta, un log muestra qué error.

Trampa
Añadir logs después de la primera gran caída.
Relaciones

Los ojos de la Reliability y la Performance; la base de la auditoría en Security.

§ 07

Un sistema vive mucho tiempo. Se va a cambiar. La buena arquitectura es la que se cambia con facilidad.

Evolvability — estar listo para el cambio importa más que tener razón hoy

En una ciudad nueva, las calles se hacen más anchas de lo que hoy hace falta. Diez años después hay más coches, y las calles estrechas habría que levantarlas.

El arquitecto no intenta predecir cada función futura (es imposible). Deja la opción de añadir funciones sin romper lo existente. Esa propiedad se llama evolvability. En la práctica significa: fronteras claras, contratos extensibles, separar el «qué» del «cómo».

QualityEvolvability· preparación para el cambio
Qué es
Qué tan barato es añadir o cambiar algo en el sistema.
Por qué
Los requisitos van a cambiar seguro — lo único que se ignora es cómo.
Ejemplo

Un método de pago nuevo se añade como un adapter nuevo, no como ediciones en veinte lugares.

Trampa
Intentar adivinar cada función futura y construirla por adelantado.
Relaciones

Nace de la Interface, de Cohesion & Coupling, de un API Contract extensible.

Mudarse de una casa vieja a una nueva es un proceso de meses. No puedes tirar todo y volver a comprarlo todo.

Cuando un sistema necesita cambiar (nueva base de datos, nuevo protocolo, nuevo modelo de datos) — eso no es «reescribir desde cero», es «llevar el sistema a través de una transición». Eso es una migration. Los sistemas reales funcionan durante los cambios. El arquitecto piensa en el camino de la migración desde el principio; si no, la transición se vuelve imposible.

Phase 1Old system100% trafficNew system0%Phase 2Old system50%New system50%Phase 3Old system0% → deleteNew system100% trafficthe system keeps running the whole time
Lo viejo y lo nuevo conviven, el tráfico se traslada poco a poco, el sistema nunca se detiene.
PracticeMigration· periodo de transición
Qué es
Mover un sistema en marcha de lo viejo a lo nuevo — paso a paso.
Por qué
Un sistema real no se puede apagar por obras.
Ejemplo

Una base de datos nueva: primero se escribe en ambas, luego se lee de la nueva, luego se apaga la vieja.

Trampa

«Lo reescribimos desde cero en un trimestre» — y se vive con dos sistemas durante dos años.

Relaciones

Cómo cambian el Data Model y el API Contract; cómo se paga la Technical Debt.

YAGNI & Deletion — borrar importa más que añadir

Un armario no se puede ampliar para siempre. A veces hay que tirar lo viejo para hacer sitio a lo nuevo.

Todo sistema exitoso acumula código muerto, funciones sin uso, integraciones obsoletas. Es un impuesto que cada desarrollador paga todos los días. El arquitecto se pregunta con regularidad: «¿Qué podemos borrar?» — y a veces esa es la decisión arquitectónica más útil del año.

El muro más fuerte es el que nunca hubo que derribar, porque nada superfluo quedó encajado detrás de él.

A veces la decisión arquitectónica correcta es no tomar una decisión arquitectónica. No introducir una capa de abstracción «para el futuro». No dividir el monolito «porque algún día». No construir un sistema de plugins «por si acaso». El principio se llama YAGNI — You Aren't Gonna Need It (no lo vas a necesitar). Un buen arquitecto sabe cuándo decir «todavía no» o «esto no hace falta».

PrincipleYAGNI & Deletion· You Aren't Gonna Need It
Qué es

No construir lo que no hace falta ahora, y borrar lo que ya no hace falta.

Por qué
La mejor arquitectura es la que no hizo falta: cuesta cero.
Ejemplo

Se borró una integración que usaban dos clientes: menos mil líneas, menos una dependencia, menos alertas nocturnas.

Trampa
Abstracciones y plugins «por si acaso».
Relaciones

Una extensión de Simplicity; libera espacio para la Evolvability.

§ 08

Una arquitectura que nadie entiende no existe. La mitad del trabajo es transmitirla.

ADR — una decisión arquitectónica se anota, o se pierde

Un testamento oral muere con su autor. Uno escrito sobrevive a generaciones.

Toda decisión arquitectónica importante debe registrarse: qué se eligió, cuáles eran las alternativas, por qué se descartaron, qué compromisos se aceptaron. El documento no hace falta ahora — hace falta dentro de un año, cuando llega una persona nueva y pregunta «¿por qué esto está hecho de una forma tan rara?». El formato estándar es el ADR (Architecture Decision Record).

ADR-007: Use PostgresContextDecisionAlternativesWhy not themTrade-offsRevisit whenwritten now,read a yearlater
Una página corta por decisión: contexto, elección, alternativas, trade-offs, cuándo revisarla.
ToolADR· Architecture Decision Record
Qué es
Un registro breve de una decisión arquitectónica y sus razones.
Por qué
Un año después nadie recuerda el porqué. El registro sí.
Ejemplo

«ADR-007: Postgres, no MongoDB. Necesitamos transacciones entre pedido y pago. Coste — un esquema más estricto. Revisar si aparecen datos no estructurados.»

Trampa
Escribir solo el «qué», sin el «por qué» ni las opciones descartadas.
Relaciones

Contiene Trade-offs, Technical Debt y decisiones irreversibles.

C4 Model — un diagrama vale más que mil palabras

Describir con palabras cómo llegar a una casa es largo y a menudo inútil. Mostrar un mapa lleva un segundo.

El arquitecto siempre tiene un diagrama del sistema: qué componentes hay, cómo se conectan, dónde están las fronteras. No perfecto — funcional. Sirve para explicar rápido a una persona nueva y para ver el sistema entero. El modelo C4 (Context, Container, Component, Code) es simple y suficiente para la mayoría de los casos.

zoom in →Contextsystem + usersContainerapps · databasesComponentparts of an appCodeclassesone diagram per zoom level — not one giant picture
Cuatro niveles de zoom — como un mapa: país, ciudad, calle, casa.
ToolC4 Model· Context · Container · Component · Code
Qué es
Cuatro niveles de diagramas — del sistema entero hasta el código.
Por qué

Cada audiencia recibe su propio nivel de zoom, no una sola imagen para todo.

Ejemplo

Context: la tienda, el cliente, el proveedor de pagos. Container: app web, API, base de datos, cola.

Trampa

Un diagrama gigante donde todo está en un solo nivel y nada se entiende.

Relaciones

Dibuja la Decomposition y sus fronteras; complementa al ADR.

Un buen médico explica el diagnóstico al paciente con palabras que este entiende. Uno malo usa términos médicos tras los cuales el paciente asiente y no entiende nada.

Si el arquitecto solo sabe explicar una decisión a otros ingenieros, se ha perdido la mitad del trabajo. Negocio, producto, legal, seguridad — todos los stakeholders necesitan entender las consecuencias. Traducir una decisión técnica al lenguaje del negocio (costo, riesgo, tiempo) es una de las habilidades centrales del arquitecto.

Un cirujano que acepta todas las peticiones pierde pacientes. Uno bueno se niega cuando la operación mataría.

El equipo a menudo pide decisiones que suenan razonables pero crean problemas a largo plazo. El arquitecto tiene que saber negarse, explicar el riesgo y a veces mantener su postura — aunque sea impopular. Y también — saber admitir que se equivoca y cambiar la decisión cuando el contraargumento es más fuerte.

PracticeStakeholder Communication
Qué es

Explicar las decisiones en el lenguaje de quien escucha: costo, riesgo, tiempo.

Por qué
Una decisión que nadie entendió no tendrá apoyo — o será revertida.
Ejemplo

No «necesitamos una cola de mensajes», sino «sin ella, cuando falle el servicio de correo perdemos pedidos — más o menos tantos al mes».

Trampa
Hablar en jerga — o aceptarlo todo para evitar una discusión.
Relaciones
Se apoya en Trade-offs, ADR y el C4 Model.
§ 09

Listas de verificación que el arquitecto repasa antes de cualquier decisión y al final del día. Y todos los conceptos del curso en una sola página.

Antes de cualquier decisión arquitectónica
  • ¿Qué problema se está resolviendo realmente? No la tarea tal como se planteó, sino el problema que hay detrás.
  • ¿Cuáles son las alternativas? Al menos tres, incluida «no hacer nada».
  • ¿Qué pierdo con esta elección? Nombra al menos dos desventajas.
  • ¿Qué tan reversible es esta decisión? Si es reversible — decide rápido. Si no — piensa más.
  • ¿Cómo se verá esto dentro de dos o tres años? No idealmente — de forma realista.
  • ¿Quién, además de mí, necesita entender esta decisión? Y cómo se la voy a explicar.
Al mirar cualquier sistema
  • ¿Qué es lo más frágil de este sistema? ¿Qué se rompe primero bajo carga?
  • ¿Qué cambios son fáciles y cuáles dolorosos? Esa es la medida de la calidad arquitectónica.
  • ¿Dónde vive la verdad de cada dato importante? ¿Y dónde están sus copias — cachés, réplicas, proyecciones?
  • ¿Qué fronteras entre componentes son explícitas y cuáles accidentales? Las accidentales son deuda técnica.
  • ¿Qué pasa si se rompe cada dependencia externa? Una por una.
  • Si empezara de nuevo hoy, ¿qué haría distinto? Esa es la dirección de la evolución.
Señales de que piensas como arquitecto
  • Dedicas más tiempo a discutir y diseñar que a escribir código.
  • A menudo preguntas «por qué» antes que «cómo».
  • Nombras los trade-offs en voz alta, en lugar de intentar esconderlos.
  • Escribes documentos y diagramas más que la mayoría.
  • Ves el sistema entero y puedes explicar cualquier parte en su contexto.
  • Piensas en las personas que trabajarán en esto dentro de un año — y escribes para que les resulte cómodo.
  • De vez en cuando rechazas una tecnología hermosa porque no hace falta.

Cómo se conectan los conceptos

Una caja de herramientas: un martillo es inútil sin clavos, y los clavos sin martillo.

Los conceptos del curso no viven solos. Una decisión empieza con Problem Framing, se sopesa como un Trade-off, se revisa su Reversibility y se anota en un ADR. Un sistema se corta con Decomposition, el corte se juzga con Cohesion & Coupling, y las partes se encuentran en una Interface. Las copias de los datos viven bajo una Single Source of Truth, y los reintentos en un mundo async exigen Idempotency.

DecideProblem framingTrade-offsReversibilityADRweigh optionscost to undo?write it downStructureDecompositionCohesion / couplingInterface / contractMonolith → microjudge bymeet atlater splitData & runtimeSource of truthCachecopied toSync vs asyncIdempotencyretries needneeds
Tres cadenas: cómo tomar decisiones, cómo cortar un sistema, cómo vivir con datos y fallos.

Hoja de referencia: los 31 conceptos

Mentalidad

Problem Framingencontrar el problema real

Primero «por qué», luego «cómo». Encuentra el problema detrás del pedido.

Long-term Thinkingresponsabilidad por las consecuencias

Mira una decisión a tres años; responde por las consecuencias, no por el código.

Trade-offs y decisiones

Trade-offscompromisos

Toda elección da algo y quita algo. Nombra los ejes en voz alta.

SimplicityKISS

Simple por defecto. Una función sin uso es un impuesto permanente.

Reversibilitypuerta de un sentido / de dos sentidos

Decide rápido lo reversible, despacio lo irreversible.

Technical Debtdeuda técnica

Un atajo ahora, el pago después. Está bien — si queda anotado.

Diseño del sistema

Decompositiondividir en partes

Partes que se pueden entender cada una por sí sola.

Cohesion & Couplingfoco por dentro, pocos vínculos por fuera

Dentro de un módulo — una sola cosa; entre módulos — vínculos mínimos.

Dependency Rulecapas, Clean Architecture

Las dependencias apuntan hacia adentro: la lógica de negocio no sabe nada de la base de datos ni del framework.

Interface over Implementationprimero el contrato

Primero la frontera, después la implementación. Cambia las implementaciones con libertad.

Monolith vs Microservicesuna app o muchos servicios

Empieza con un monolito, divide cuando de verdad duela.

Datos y estado

Data Modelentidades, campos, relaciones

Sobrevive al código. Piénsalo primero.

Single Source of TruthSSOT

Cada dato tiene un hogar principal; el resto son copias.

Statestateless vs stateful

El estado es complejidad. Mantenlo pequeño y en un solo lugar.

Transactionatomicidad

Varios cambios — todo o nada.

Cacheinvalidación de caché

Una copia rápida que puede mentir. Lo difícil es cuándo reiniciarla.

Conexiones y fronteras

API Contractcompatibilidad hacia atrás

Una promesa a los clientes. Amplía, nunca quites.

Sync vs Asyncllamada o carta

Sync acopla en el tiempo; async es más resiliente pero trae retrasos y duplicados.

Idempotencyseguro de repetir

Una repetición da el mismo resultado. Imprescindible para pagos y mensajes.

External Dependenciestu propio adapter

Los sistemas ajenos fallarán y cambiarán. Escóndelos detrás de tu capa, planifica la degradación.

Requisitos no funcionales

Securitydefense in depth

Protección por capas desde el primer día, mínimo privilegio.

Performancelatency, throughput

No «rápido» sino números: carga, latencia, comportamiento en el pico.

Scalabilityhorizontal y modular

Crecer en servidores y módulos, sin reescribir.

Reliabilitytolerancia a fallos

El fallo de una parte no debe matar todo el sistema.

Observabilitylogs, métricas, trazas

El sistema te cuenta sobre sí mismo. Diséñalo desde el principio.

Evolución

Evolvabilitypreparación para el cambio

Deja sitio para lo nuevo sin adivinarlo por adelantado.

Migrationperiodo de transición

No «reescribir desde cero», sino llevar el sistema a través de la transición.

YAGNI & DeletionYou Aren't Gonna Need It

No construyas extras; borra lo que ya no hace falta.

Comunicación

ADRArchitecture Decision Record

Qué se eligió, las alternativas, por qué, a qué costo.

C4 ModelContext · Container · Component · Code

Diagramas del sistema en cuatro niveles de zoom.

Stakeholder Communication

Habla en costo, riesgo y tiempo; ponte firme cuando haga falta, admite cuando te equivocas.

Un arquitecto no es quien sabe más. Es quien piensa más tiempo antes de empezar.

Fin del curso exprés · 9 capítulos · 31 conceptos

La práctica viene después. Cada capítulo se despliega en libros: Designing Data-Intensive Applications, Clean Architecture, Software Architecture in Practice, System Design Interview. Pero antes de leerlos — hazte las preguntas de este documento. Importan más que las respuestas.