54 40. Cierre: cómo piensa un backend developer
Qué stack elegirías para cada problema — la respuesta honesta
Empezaste con let tasks = [] y terminaste con un workspace colaborativo versionado, en tiempo real, auditado y desplegable. Este capítulo no agrega nada: ordena lo que ya sabes — el mapa completo del libro, la tabla final de qué pertenece al lenguaje vs al framework vs a la industria, y la respuesta honesta a “¿Node, Python o Go?”.
54.1 El mapa completo
Todo el libro fue una sola pregunta reformulada: “¿qué necesita el siguiente problema?”
Fundamentos (0-0.5) → terminal, HTTP, JSON — las piezas que todo usa
Frontend (fe-01..07) → el cliente que consumes y que ahora también entiendes
API (1-7) → rutas, contratos, validación, errores, capas
Datos (8-13) → diseño, SQL, drivers, migraciones, índices, tx
Identidad (14-18) → hashing, JWT, middleware, roles, sesiones vivas
Integraciones (19-22) → salir, concurrencia, jobs, recibir webhooks
Robustez (23-26) → logs, config, errores a escala, auditoría
Testing (27-29) → pirámide, BD real, mocks en la frontera
Docker→Prod (30-35) → imagen, compose, CI/CD, deploy sin downtime
Nube (nu-01..05) → servidores, frontera de responsabilidad, providers
Proyecto (36-39) → Nexus: todo junto, diseñado y endurecido
Repaso (ap-g..k) → 50 tickets, entrevistas, preguntas decisivas
Cada eslabón existe porque el anterior dejó un problema sin resolver — esa cadena de necesidades es la arquitectura, no una lista de temas.
Un array es una colección ordenada de elementos accedidos por posición: ["a","b","c"][0] es "a" (se cuenta desde 0). Python las llama listas, Go slices — misma idea, distinto acento.
54.2 La tabla final: ¿de quién es cada cosa?
Lo que confunde al junior es atribuir al lenguaje lo que es del framework, o al framework lo que es de la industria:
Un framework es un esqueleto de aplicación ya decidido: te da la estructura (rutas, validación, errores) y tú llenas la lógica. Diferencia con librería: la librería la llamas tú; el framework te llama a ti.
| Decisión | Del lenguaje | Del framework | De la industria (igual en todos) |
|---|---|---|---|
| Concurrencia | event loop / asyncio / goroutines | — | I/O-bound se paraleliza |
| Validación | — | zod / pydantic / manual | schema en la frontera |
| Auth | — | Depends / middleware / wrapper | JWT corto + refresh persistido |
| Errores | clases / excepciones / sentinel | exception handler / middleware | dominio → mapper → contrato |
| BD | — | drivers | pool, parametrizar, tx, índices |
| Deploy | binario vs runtime | — | imagen única, env vars, healthchecks |
| Testing | — | vitest / pytest / go test | pirámide + rollback-per-test |
La columna derecha es el libro entero: lo que aprendiste no fue “Express” o “FastAPI” — fue la industria: contratos, pools, migraciones, transacciones, rate limits, auditorías. Los lenguajes y frameworks son la sintaxis de esas ideas; por eso puedes leer un backend en el stack que no practicas y reconocerle la forma.
Una migración es un cambio versionado del esquema: un archivo que dice “crea esta columna” (up) y “bórrala” (down). Son el historial Git de la estructura de la BD — se aplican en orden y no se editan una vez aplicadas.
Una transacción es un grupo de operaciones que se confirman juntas o no se confirma ninguna: transferir dinero = restar de A y sumar a B. Si falla a la mitad sin transacción, el dinero desapareció.
Un pool es el staff de conexiones a la BD: abrir una conexión por request es caro, así que el pool mantiene ~10–20 abiertas y las presta. El request la usa, la devuelve, y la siguiente la reutiliza.
54.3 ¿Node, Python o Go? — la respuesta honesta
- Node/TypeScript: un solo lenguaje en front y back — el camino natural del fullstack pequeño; el ecosistema npm más grande; contrata más gente por oferta. Su precio: la concurrencia es cooperativa (un hilo) y el ecosistema se mueve rápido (dependencias que mueren).
Una dependencia es código de terceros que tu proyecto usa: npm install, pip install, go get las traen. Cada una es deuda — ahora funciona, pero hay que mantenerla, actualizarla y confiar en ella.
- Python/FastAPI: el framework más didáctico y el ecosistema de datos/AI — si el producto toca ML, pandas o LLMs, estás en casa. Su precio: el GIL (workers por núcleo) y el ecosistema de empaquetado.
El CPU es el cerebro que ejecuta instrucciones; cada núcleo puede ejecutar una cosa a la vez (por eso importan la concurrencia y los procesos paralelos). “CPU-bound” = el límite es el cálculo, no la espera.
- Go: rendimiento por núcleo, concurrencia real, un binario de deploy hermoso — para infra, workers, alto throughput. Su precio: más verboso, menos mágico (no hay framework que decida por ti).
El criterio, en orden: qué sabe el equipo → qué pide el dominio → mercado de empleos local → gustos. Y la verdad incómoda del capítulo: para un CRUD bien hecho, los tres son equivalentes — el cuello de botella será la BD, no el lenguaje.
Una base de datos es el programa que guarda datos de forma permanente y los responde rápido. Relacional (Postgres): tablas con relaciones. No relacional: documentos, clave-valor, grafos — cada una para una forma de dato distinta.
54.4 Lo que el libro dejó fuera — a propósito
Microservicios → el monolito modular primero (cap. 7, Ap. K #7)
CRDT/OT → LWW documentado; el merge fino es un proyecto aparte
Colas serias → in-process hasta que el volumen lo exija (cap. 21)
Caché/Redis → cuando un problema MEDIDO lo pida (Ap. K #14)
Kubernetes → la orquestación que necesitas cuando la necesitas
Event sourcing → diffs como transporte; snapshot como verdad (cap. 37)
No son vacíos: son decisiones — el senior sabe qué no construir todavía y por qué. Cada uno tiene su capítulo de decisión en el Ap. K.
54.5 Errores comunes (de carrera, esta vez)
| Error | Por qué pasa | Fix |
|---|---|---|
| Aprender el siguiente framework | “Falta NestJS en mi CV” | Falta fundamento: el framework nuevo es un sub-tab, no un mundo |
| Portafolio de tutoriales | Proyectos copiados que no se pueden defender | UN proyecto con ADRs que puedes discutir en la entrevista — Nexus |
| Memorizar preguntas | Listas de “las 50 preguntas” | Los Ap. H/I/J + K: repaso activo + criterio — responder es razonar |
| Esperar a “saber suficiente” | El libro nunca termina | Ya sabes el mapa — ahora se aprende construyendo y leyendo código real |
54.6 Buenas prácticas para seguir
- Lee backends reales: cal.com (Next/tRPC), immich (NestJS), miniflux (Go), paperless-ngx (Django) — mapea cada uno contra las capas del cap. 7: encontrarás los mismos huesos.
- Reconstruye una pieza desde cero: tu propio middleware de auth, tu propio versionado — la segunda implementación es la que enseña.
- Usa la AI como lead, no como autor: los “Prompt listo” del libro son tu formato — contexto + requisitos + criterios de aceptación; y el diff se revisa como PR de un junior (cap-terminal).
La terminal (consola, línea de comandos) es la interfaz de texto con el sistema operativo: escribes comandos, lees resultados. Es como hablarle a la computadora por cartas en vez de señalar con el mouse.
- El ADR es un hábito, no un documento: cada “¿por qué así?” merece un párrafo — tu yo del futuro es el equipo.
54.7 Ejercicio
- Toma la tabla “¿de quién es cada cosa?” y agrega tres filas que el libro no lista explícitas (ej. logging, config, webhooks).
- Tu equipo elige Go para un CRUD interno de 4 endpoints “porque es más rápido”. ¿Qué le respondes con el criterio del capítulo?
- De “lo que quedó fuera”: elige uno y escribe la condición concreta bajo la cual sí lo introducirías en Nexus.
54.8 Mini reto
Elegir un backend open-source real y mapear sus capas contra la arquitectura del libro.
Ejercicio.
- Ejemplos correctos: logging → industria (JSON + request_id en los tres); config → industria (12-factor + fail-fast); webhooks → industria (firma + dedupe + cola); rate limiting → industria; background jobs → industria (patrón) con mecanismo del framework (BackgroundTasks) o lenguaje (goroutine). La tabla crece — el criterio no cambia.
- “Rápido para qué — ¿el cuello de botella es el lenguaje o la BD de 3 tablas? Si el equipo conoce TS y esto es un CRUD de 4 endpoints, Go compra performance que no necesitamos y paga verbosidad que sí pagamos. Si mañana pide 10k req/s de streaming, hablamos.” — el criterio manda, no el hype.
- Ejemplos defendibles: cola seria — cuando el volumen de emails/ jobs haga que perder uno sea inaceptable o los workers in-process mueran con deploys frecuentes; Redis — cuando una query medida supere X ms tras índices, o rate limiting multi-instancia lo exija; CRDT — cuando el merge por carácter sea requisito del producto (colaboración tipo Google Docs), no antes.
Mini reto. El ejercicio de cierre del libro: abrir src/ de un backend real y etiquetar — “esto es el router (cap. 3), esto el schema (cap. 4), esto el pool (cap. 10), esto el middleware de auth (cap. 16), esto la migración (cap. 11)”. Cuando un repo de 200 archivos se lee como “capas que ya conoces”, el libro cumplió: la arquitectura es la constante; la sintaxis es el acento.
Repaso de entrevista: las preguntas de este tema viven en el Apéndice J (AI y conductual).
54.9 Vocabulario técnico del capítulo
Una variable es una caja con nombre donde guardas un valor: let total = 42 guarda el 42 bajo el nombre total. Puedes leerla y cambiarla después (total = 50). const = caja que no se puede reemplazar.
Un bucle repite una acción por cada elemento o hasta cumplir una condición: for task in tasks hace algo con cada tarea. map y filter son bucles disfrazados de funciones — transforman/filtran colecciones sin for explícito.
Una clase es el molde de un objeto: define qué datos y qué métodos tiene. class Task es el molde; new Task() es una instancia concreta. Go no tiene clases — usa struct + métodos sueltos.
Una goroutine es el hilo ultraligero de Go: go f() lanza una función en paralelo gastando casi nada — se pueden tener millones. Es la superpotencia de Go: concurrencia como palabra del lenguaje.
La autenticación responde “¿quién eres?” — login, contraseña, token. Se confunde con autorización (“¿qué puedes hacer?”), que es la pregunta siguiente. Primero te identificas, luego te dejan o no pasar.
Una sesión es la conversación continuada entre tú y el servidor: HTTP no recuerda nada entre requests, así que la sesión (vía cookie o token) es el “pulso de mano” que te identifica en cada llamada.
El runtime es el motor que ejecuta tu código: Node.js es el runtime de JavaScript fuera del navegador; CPython es el de Python; Go compila a binario y el runtime va empaquetado dentro. Es “quien corre” lo que escribiste.
Un repositorio (repo) es la carpeta del proyecto con todo su historial Git adentro. GitHub/GitLab son servicios que hospedan repos para compartirlos y respaldarlos.
Una query es la pregunta que le haces a la base de datos en SQL: SELECT * FROM tasks WHERE done = false. La BD traduce la pregunta a un plan de búsqueda — por eso los índices importan.
El esquema es el plano de la base de datos: qué tablas hay, qué columnas tiene cada una y de qué tipo. Es contrato: una fila que no cumple el esquema no entra. Se cambia con migraciones, no a mano.
Un índice es la tabla de contenido de una tabla: sin él, buscar un usuario es leer las 10 millones de filas (seq scan); con él, es ir directo a la página. Se crea según cómo se consulta, y cada uno cuesta escrituras.
54.10 Lo que deberías saber hacer ahora
Fin del camino planeado — inicio del tuyo. El libro te enseñó el mapa; el territorio se camina construyendo. Nexus es tu prueba de que puedes; los apéndices son tu kit de repaso. A construir.