DEV Community

Cover image for matklad clavó la verdad incómoda: la arquitectura no se aprende en libros
lu1tr0n
lu1tr0n

Posted on • Originally published at elsolitario.org

matklad clavó la verdad incómoda: la arquitectura no se aprende en libros

El 12 de mayo de 2026, Alex Kladov —conocido como matklad, primer desarrollador de rust-analyzer y hoy maintainer de TigerBeetle— publicó un ensayo corto respondiendo a un físico investigador que le preguntó cómo aprender arquitectura de software. El post sacó 227 puntos en Hacker News en horas porque cristaliza una idea incómoda: la arquitectura no se aprende leyendo libros, se aprende tomando decisiones difíciles de revertir.

Pero ese ensayo es eso, un ensayo. Un junior o un mid-level que pregunta «¿cómo aprendo arquitectura?» necesita un mapa concreto, no solo «practicá más». Esta guía es ese mapa: cuatro fases, los libros que sí valen, los proyectos que conviene leer, y los anti-patrones que destruyen carreras tempranas.

TL;DR

  • matklad (autor de rust-analyzer) publicó el 12 de mayo de 2026 un ensayo sobre aprender arquitectura; sacó 227 puntos en HN en horas.- Su tesis: la arquitectura no se aprende leyendo libros, se aprende tomando decisiones difíciles de revertir y leyendo código maduro real.- Tres verdades clavadas: (1) se aprende haciendo, (2) la Ley de Conway es ineludible, (3) el contexto social y de incentivos domina cada decisión.- Fase 0 (3-6 meses): fundamentos de programación, Git, SQL, y escribir un intérprete pequeño con Crafting Interpreters.- Fase 1 (3-6 meses): leer redis, SQLite, ripgrep y los capítulos de Architecture of Open Source Applications.- Fase 2 (6-12 meses): diseñar módulos con Boundaries de Bernhardt y A Philosophy of Software Design de Ousterhout.- Fase 3 (1-3 años): sistemas distribuidos con DDIA de Kleppmann, modelo C4, ADRs y el ∅MQ guide de Hintjens.- Anti-patrones a evitar desde el día uno: cargo culting de Clean Architecture, microservicios por moda y DRY antes de tener tres usos reales.

Qué es (y qué no es) arquitectura de software

Antes del roadmap conviene desactivar tres confusiones que arruinan los primeros años. La arquitectura de software no es: diagramas UML decorativos, jerga de patrones de diseño aplicada a cada clase, ni replicar Clean Architecture en un CRUD de tres endpoints. Eso es performance, no diseño.

Sí es: el conjunto de decisiones tempranas y caras de revertir sobre cómo dividir el sistema en piezas, dónde poner los límites (boundaries) y cómo esas piezas se hablan entre sí. Ralph Johnson, uno de los autores de Design Patterns, lo definió en una frase que se cita hasta hoy: «Architecture is about the important stuff. Whatever that is.» Martin Fowler la operacionalizó así: arquitectura es lo difícil de cambiar después. Si renombrar una función es trivial pero cambiar el storage layer requiere seis meses de migración, ese storage layer es decisión arquitectónica; el rename no lo es.

💭 Clave: Lo que distingue una decisión arquitectónica de una decisión normal no es su tamaño, es su costo de reversión. Si te cuesta una tarde deshacerla, no es arquitectura. Si te cuesta un trimestre o un equipo entero, lo es —y ahí es donde tu juicio empieza a importar de verdad.

Las tres verdades que matklad clava

1. Se aprende haciendo, no leyendo

matklad lo dice sin filtro: «what really taught me how to do stuff was an accident of my career, where my second real project propelled me to a position of software leadership, and made design my problem». Los cursos universitarios de diseño, dice, eran «kindergarteners playing fire-fighters». Hasta no tener una decisión difícil de revertir con consecuencias reales —usuarios reales, dinero real, equipo real— no estás aprendiendo arquitectura. Estás coleccionando vocabulario.

2. La Ley de Conway es ineludible

Conway (1967) escribió que cualquier organización que diseña un sistema produce un diseño que copia la estructura de comunicación de la organización. Si tenés cuatro equipos, vas a tener cuatro módulos. Si tu equipo de backend no habla con el de frontend, tu API va a ser horrible. matklad cita esto como la idea más importante de su carrera. Aplicado: cuando podés mover la estructura social del proyecto, hacelo. Cuando no podés, adaptate al mapa social, no contra él.

3. El contexto domina

matklad usa rust-analyzer como ejemplo. Insistió en cuatro cosas que parecían obsesivas: que no requiera compilar rustc, que buildee en stable Rust, que no tenga dependencias en C, y que el test suite corra en segundos. Esas no fueron decisiones «best practice» abstractas. Fueron decisiones para atraer dos audiencias distintas: contributors profundos del compilador, y «weekend warriors» aprendiendo Rust con dos horas el sábado. El catch_unwind tras feature flag existía para que los weekend warriors no pudieran romper el core. Toda decisión arquitectónica responde a un contexto social y de incentivos concreto.
Las cuatro fases del roadmap: cada una desbloquea la siguiente.

El roadmap en 4 fases

graph LR
  A["Fase 0: Programar bien"] --> B["Fase 1: Leer codigo real"]
  B --> C["Fase 2: Disenar modulos"]
  C --> D["Fase 3: Disenar sistemas"]
  D --> E["Decisiones con costo real"]
Enter fullscreen mode Exit fullscreen mode

Fase 0 — Fundamentos programáticos (3-6 meses)

Antes de pensar arquitectura hay que poder programar bien. Esta fase no es opcional: si la saltás, todo el resto se vuelve cargo culting. Lo mínimo incluye:

  • Dominio de un lenguaje: tipos, scope, lifetime de variables, manejo de errores, concurrencia básica.- Estructuras de datos: arrays, hash maps, árboles, grafos. Saber leer complejidad O(n) de un vistazo.- Git de verdad: branches, rebase interactivo, resolución de conflictos. Si no podés hacer un git rebase -i sin pánico, no estás listo para diseñar nada que toquen otros.- SQL básico: joins, índices, transacciones. Es la abstracción más longeva del software, te va a sobrevivir.

El recurso ancla de esta fase es Crafting Interpreters de Robert Nystrom, gratis en craftinginterpreters.com. Escribir un intérprete pequeño te enseña más sobre arquitectura que cualquier libro de patterns: te fuerza a separar parser, AST, evaluator y runtime, y cuando una decisión temprana es mala lo notás en el capítulo siguiente.

Fase 1 — Leer código real (3-6 meses)

Empezar a leer codebases maduros públicos. La meta no es entenderlo todo, es entrenar el ojo:

  • redis (C): la simplicidad llevada al límite, estructuras de datos clásicas implementadas con cuidado extremo. github.com/redis/redis- SQLite (C): probablemente el código más testeado del planeta, con un ratio test-to-code de 745x. sqlite.org/testing.html- ripgrep (Rust): herramienta de Andrew Gallant. Mediano, idiomático, profundamente comentado. github.com/BurntSushi/ripgrep- Architecture of Open Source Applications: libro gratis en línea en aosabook.org. Cada capítulo lo escribió el maintainer real del proyecto. Es lo más cerca de un «libro de arquitectura por ejemplos» que existe.

💡 Tip: No leas linealmente. Empezá por main.{c,rs,py} y seguí el flujo de una operación simple end-to-end: «¿qué pasa cuando hago GET /foo?» o «¿qué pasa cuando ejecuto ripgrep foo .?». Tomá notas en un cuaderno aparte. Vas a entender más en una tarde con esa técnica que en una semana de scroll.

Fase 2 — Diseñar módulos (6-12 meses)

Acá es donde «arquitectura» empieza a aplicar de verdad: aprender a separar código dentro de un proceso. Dos recursos no negociables:

Boundaries de Gary Bernhardt (destroyallsoftware.com/talks/boundaries) es la charla que matklad cita primero. El concepto «Functional Core, Imperative Shell» —código puro adentro, side-effects en una capa fina afuera— cambia cómo pensás testing y composición. Es una hora bien gastada.

A Philosophy of Software Design de John Ousterhout: libro corto (unas 190 páginas), no académico. La idea central es «deep modules» (interfaz pequeña, implementación grande) versus «shallow modules» (interfaz grande, implementación trivial). Su tesis incómoda: el 80% del código Java enterprise son shallow modules disfrazados de buen diseño.

La práctica concreta para cerrar la fase: refactorizá un proyecto propio de 5.000+ líneas separando el core (lógica de negocio pura) del shell (IO, base de datos, HTTP). Si para testear el core seguís necesitando mocks, fallaste: todavía tenés acoplamiento. El siguiente paso es How to Test de matklad (matklad.github.io/2021/05/31/how-to-test.html): la pirámide de testing es un mito; lo que importa es velocidad (milisegundos), determinismo, y end-to-end selectivos.
Functional Core e Imperative Shell: la idea más rentable de la fase 2.

Fase 3 — Diseñar sistemas (1-3 años)

Múltiples procesos, múltiples máquinas, múltiples equipos. Acá empieza el territorio donde las decisiones cuestan trimestres enteros si se equivocan. El stack mínimo:

  • Designing Data-Intensive Applications (DDIA) de Martin Kleppmann. El libro de sistemas distribuidos modernos, unas 600 páginas. Si tu trabajo toca datos en más de un nodo, no es opcional. Cubre replicación, particionado, transacciones, consenso, batch y stream processing.- Modelo C4 de Simon Brown (c4model.com). Notación liviana para diagramar arquitectura en cuatro niveles: System Context, Container, Component, Code. Reemplaza UML en la mayoría de equipos modernos.- ADRs (Architecture Decision Records). Un documento de una página por cada decisión arquitectónica importante: contexto, decisión, consecuencias. Plantillas en github.com/joelparkerhenderson/architecture-decision-record. Los ADRs son lo más cerca que vas a estar de no repetir errores propios.- Reflections on a decade of coding de Jamii (scattered-thoughts.net). Citado por matklad como su primer link de referencia. Meta, profundo, incómodo. Leelo en serio.- Pieter Hintjens y el ∅MQ Guide (zguide.zeromq.org). El capítulo 6 sobre patrones de código distribuido es de los mejores textos prácticos que existen sobre el tema. Bonus: el optimistic merging de Hintjens es lo que matklad aplica en rust-analyzer.

Ejemplo práctico: leer rust-analyzer como caso de estudio

Para aterrizar todo lo anterior, conviene leer una decisión real. Tomemos las cuatro restricciones de matklad para rust-analyzer y traducirlas a código mental:

// Pseudo-restricciones de diseno en rust-analyzer:
//
// 1. No requerir compilar rustc
//    -> reimplementar el front-end del compilador
//    -> trade-off: duplicacion vs. velocidad de iteracion
//
// 2. Builda en stable Rust
//    -> nada de #![feature(...)] nightly-only
//    -> trade-off: menos potencia, mas contributors
//
// 3. Cero dependencias en C
//    -> sin libgit2, sin libxml2, sin nada que necesite CC
//    -> trade-off: reescribir cosas, build trivial en Windows
//
// 4. Test suite en segundos
//    -> cargo test sin features pesadas
//    -> trade-off: ejercitar menos rutas, ciclo dev rapido
Enter fullscreen mode Exit fullscreen mode

Cada restricción es una compensación. No hay una «mejor arquitectura»: hay una arquitectura que sirve a un contexto social específico (compiler contributors + weekend warriors) y descarta otros (e.g., usar lo último de nightly Rust para velocidad de feature). Saber leer ese mapeo entre restricción técnica e incentivo humano es el skill central de arquitectura.

Casos de uso del roadmap

  • Junior con 0-1 año: pasa la Fase 0 sin saltarse Git ni SQL. Si ya programás cómodo, empezá a leer redis en Fase 1 mientras seguís construyendo cosas pequeñas.- Mid-level con 2-4 años: tu cuello de botella suele ser Fase 2. Estás programando bien pero diseñando shallow modules sin notarlo. Bernhardt + Ousterhout te van a desbloquear.- Mid-level con 4-6 años subiendo a senior: Fase 3 te va a doler. DDIA es largo y denso, leelo en grupo si podés. Empezá a escribir ADRs en tu trabajo aunque nadie te los pida.- Cambio de stack o de dominio: volvé a Fase 1 con codebases del nuevo dominio. La intuición de patrones se transfiere; la intuición de incentivos sociales de la industria, no.

Ventajas y desventajas de este enfoque

Ventajas

  • Orden honesto: no te promete «arquitecto en 30 días», te promete una progresión de 2 a 5 años con hitos verificables.- Sesgado a leer código real, no a coleccionar vocabulario de patrones.- Incorpora la Ley de Conway desde temprano: vas a saber leer la estructura social que produjo cada decisión técnica.- Los libros recomendados (Ousterhout, Kleppmann) son los que cita casi todo senior con criterio.

Desventajas y limitaciones

  • Es lento. Tres a seis meses de Fase 0 sin atajo. Si esperás un fast-track, este no es el camino.- Sesgado a sistemas backend y herramientas dev. Si tu carrera apunta a frontend pesado, embedded o ML, vas a tener que adaptar Fases 2 y 3 con material específico.- Requiere proyectos propios con consecuencias reales. Sin eso, las Fases 2 y 3 se vuelven teóricas.

⚠️ Ojo: Cargo culting Clean Architecture, microservicios por moda y DRY antes de tener tres usos reales son los tres anti-patrones que destruyen carreras tempranas. Las cuatro capas de Uncle Bob valen cuando hay 50+ casos de uso compartiendo entities; en un CRUD de tres endpoints son complejidad accidental pura. Y la regla de oro para microservicios: número de servicios ≤ número de equipos que pueden mantenerlos en oncall.

📖 Resumen en Telegram: Ver resumen

Preguntas frecuentes

¿Cuánto tarda completar este roadmap?

En la práctica, entre dos y cinco años de trabajo con consecuencias reales. La Fase 0 toma de tres a seis meses si venís de cero. Las Fases 1 y 2 se solapan y suman otro año. La Fase 3 es un proceso largo de uno a tres años porque requiere proyectos en producción y feedback de equipos reales, no solo lectura.

¿Necesito leer Clean Architecture de Uncle Bob?

No es prioritario. Tiene ideas útiles pero promueve una rigidez (cuatro capas obligatorias) que en sistemas pequeños es complejidad accidental. Leelo después de Ousterhout y de tener al menos un proyecto donde hayas sentido el dolor del acoplamiento. Si lo leés antes, vas a aplicar las recetas mecánicamente.

¿Qué pasa con Design Patterns (Gang of Four)?

Es un libro histórico importante, pero hoy en día la mayoría de sus patrones están absorbidos por features de los lenguajes (closures, traits, generics) o son contraproducentes en código moderno. Leelo como referencia, no como manual. Más útil: aprender de qué problemas surgieron esos patrones, no copiar las soluciones.

¿Microservicios sí o no?

Casi siempre no, al principio. La regla operativa: número de servicios ≤ número de equipos capaces de mantener cada servicio en oncall. Equipo único = un servicio (monolito modular). Si tu app sirve menos de 100.000 usuarios diarios y tu equipo es de menos de diez personas, un monolito bien hecho casi siempre gana.

¿Sirve aprender arquitectura con IA y agentes?

Sí, pero como acelerador, no como sustituto. Una IA puede explicarte por qué un módulo está acoplado, qué dice DDIA sobre consenso, o cómo refactorizar un trozo. No puede tomar la decisión arquitectónica por vos: vos sos quien convive con las consecuencias seis meses después. Usá agentes para leer codebases más rápido y para criticar tus propios ADRs.

¿Cómo demuestro arquitectura en una entrevista sin experiencia de liderazgo?

Tres formas concretas: (1) presentá un proyecto open source propio explicando por qué los módulos están donde están y qué descartaste; (2) llevá ADRs escritos de decisiones reales, aunque sean de proyectos personales; (3) reseñá un codebase público que estudiaste (redis, ripgrep, SQLite) explicando qué decisión arquitectónica encontraste interesante y por qué. Las tres muestran criterio, no vocabulario.

Referencias

📱 ¿Te gusta este contenido? Únete a nuestro canal de Telegram @programacion donde publicamos a diario lo más relevante de tecnología, IA y desarrollo. Resúmenes rápidos, contenido fresco todos los días.

Top comments (0)