Saltar al contenido
Framework Ecosystems LabsUn contrato, muchos ecosistemas, la misma prueba.

Empezar — de una máquina vacía a tu primer verde#

🏠 Repositorio · 🎓 Clases · 📚 Programa

Este documento es el prĂłlogo del programa. No enseña ningĂșn framework: prepara la mĂĄquina y el vocabulario para que las 149 clases se puedan ejecutar de verdad en vez de leerse como un artĂ­culo.

Estå pensado para alguien que nunca ha instalado un entorno de desarrollo. Si ya tienes Node, Python y Java funcionando, salta a «El primer verde» y tardarås dos minutos.

Paso Qué consigues Tiempo
1. Lo que hay que saber antes Entender qué es un puerto, una petición y un gestor de paquetes 30 min
2. Las ocho cadenas de herramientas Poder ejecutar las implementaciones de cada ecosistema 20 min – 2 h
3. El primer verde Ver una clase ejecutarse contra su contrato 5 min
4. Cómo se lee una clase Saber qué mirar y en qué orden 10 min
5. La ruta completa Saber por dónde seguir hasta el nivel experto —

1. Lo que hay que saber antes#

El programa no exige experiencia previa con frameworks —de eso trata—, pero sí da por sabidas seis cosas. Están explicadas, una por una y sin dar por supuesto nada, en Conocimientos previos:

  1. La terminal — abrir una, moverse por directorios, ejecutar un comando y leer su código de salida.
  2. Cliente, servidor y puerto — quĂ© proceso escucha, dĂłnde, y por quĂ© dos programas no pueden usar el mismo nĂșmero a la vez.
  3. PeticiĂłn y respuesta HTTP — mĂ©todo, ruta, cabeceras, cuerpo, cĂłdigo de estado. Es el idioma comĂșn de todo el laboratorio [rfc9110].
  4. JSON — el formato en el que viajan los datos y en el que están escritos los contratos de cada clase [rfc8259].
  5. Gestor de paquetes y dependencias — quĂ© es pnpm install, y por quĂ© cada ecosistema tiene el suyo.
  6. Git — clonar este repositorio y volver atrás cuando rompas algo.

Ninguna de las seis es un framework. Todas aparecen en la primera clase.

2. Las ocho cadenas de herramientas#

Una cadena de herramientas es el conjunto de ejecutables que una implementaciĂłn necesita para arrancar. Cada implementaciĂłn la declara en su ejecutar.json, y el ejecutor de clases la comprueba antes de intentar nada:

{ "framework": "spring-boot", "requiere": ["java", "mvn"] }

Si falta un ejecutable, esa implementaciĂłn se declara omitida — nunca fallida, y nunca aprobada en silencio. Por eso no hace falta instalarlas todas para empezar: con Node ya puedes ejecutar una parte grande del laboratorio, y cada cadena que añadas amplĂ­a lo que puedes ver.

Para saber en qué punto estås:

node scripts/doctor.mjs
Cadenas de herramientas del laboratorio

  ✔ Node.js                3 impl ·   2 clases   v22.14.0
  ✔ Node.js + pnpm        86 impl ·  69 clases   10.15.0
  ✔ Python                86 impl ·  67 clases   Python 3.12.7
  ⊘ JDK + Apache Maven    65 impl ·  65 clases   falta `java` y `mvn`
  ...

RESUMEN: 197/353 implementaciones ejecutables en esta mĂĄquina (55 %)

Ese porcentaje es la mĂ©trica honesta: no dice cuĂĄnto has aprendido, dice cuĂĄnto puedes comprobar por ti mismo. Lo que no puedas ejecutar en local se ejecuta igualmente en la integraciĂłn continua del repositorio, y su resultado es pĂșblico.

<!-- generado: cadenas -->

Cadena Qué desbloquea Frameworks Instalación oficial
Node.js · 22 o superior 12 impl. en 7 clases alpinejs, htmx, nodejs nodejs.org [nodejs-downloads]
Node.js + pnpm · Node 22 · pnpm 10 210 impl. en 109 clases angular, astro, drizzle, express, fastify, hotwire-turbo, htmx, lit, nestjs, nextjs, nuxt, prisma, react, remix, solid, svelte, sveltekit, typeorm, vue pnpm.io [pnpm-installation]
Python · 3.11 o superior 101 impl. en 82 clases django, fastapi, flask, sqlalchemy python.org [python-downloads]
JDK + Apache Maven · JDK 21 · Maven 3.9 79 impl. en 79 clases hibernate, spring-boot adoptium.net [adoptium-temurin]
.NET SDK · 8 o superior 71 impl. en 71 clases aspnet-core, dapper, entity-framework-core dotnet.microsoft.com [dotnet-sdk-downloads]
PHP + Composer · PHP 8.2 · Composer 2 15 impl. en 15 clases eloquent, laravel getcomposer.org [composer-download]
Ruby + Bundler · Ruby 3.3 · Bundler 2 14 impl. en 14 clases activerecord, rails ruby-lang.org [ruby-installation]
Go · 1.22 o superior 11 impl. en 11 clases gin go.dev [go-downloads]
Rust · 1.80 o superior 1 impl. en 1 clases axum rust-lang.org [rust-install]

Ocho cadenas, 514 implementaciones. Ninguna es obligatoria: el ejecutor corre las que encuentre y declara las que omitiĂł.

Node.js#

Es el requisito del propio laboratorio: los verificadores, el generador del sitio y el ejecutor de clases son scripts de Node sin dependencias.

Windows

winget install OpenJS.NodeJS.LTS

macOS

brew install node

Linux (Debian/Ubuntu)

curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt-get install -y nodejs

ComprobaciĂłn:

node --version

⚠ El paquete nodejs de Debian y Ubuntu suele ir varias versiones por detrĂĄs; por eso la receta añade primero el repositorio oficial.

Node.js + pnpm#

Es el gestor de paquetes admitido para JavaScript y TypeScript. Instala una sola copia de cada dependencia y enlaza el resto, que es lo que hace viable tener decenas de implementaciones con node_modules propio.

Cualquier sistema, con Node ya instalado

corepack enable pnpm

ComprobaciĂłn:

pnpm --version

⚠ Corepack viene dentro de Node, asĂ­ que no hace falta descargar nada aparte. Si corepack no estĂĄ en el PATH, la alternativa oficial es npm install -g pnpm.

Python#

Ejecuta las implementaciones de Flask, Django, FastAPI y SQLAlchemy — el ecosistema con más clases del laboratorio junto a Node.

Windows

winget install Python.Python.3.12

macOS

brew install python@3.12

Linux (Debian/Ubuntu)

sudo apt-get install -y python3 python3-venv python3-pip python-is-python3

ComprobaciĂłn:

python --version

⚠ En Debian y Ubuntu el ejecutable se llama python3; el paquete python-is-python3 crea el alias python que las recetas de arranque esperan.

JDK + Apache Maven#

Compila y ejecuta Spring Boot e Hibernate. Maven no es opcional: las implementaciones declaran sus dependencias en pom.xml y se empaquetan antes de arrancar.

Windows

winget install EclipseAdoptium.Temurin.21.JDK
winget install Apache.Maven

macOS

brew install temurin maven

Linux (Debian/Ubuntu)

sudo apt-get install -y default-jdk maven

ComprobaciĂłn:

java -version
mvn --version

⚠ Es la cadena mĂĄs lenta en la primera ejecuciĂłn: Maven descarga el ĂĄrbol de dependencias entero antes de compilar. Por eso ejecutar.json le concede 60 s de espera y no 15.

.NET SDK#

Compila y ejecuta ASP.NET Core, Entity Framework Core y Dapper. Un Ășnico ejecutable —dotnet— restaura, compila y arranca.

Windows

winget install Microsoft.DotNet.SDK.8

macOS

brew install --cask dotnet-sdk

Linux (Debian/Ubuntu)

sudo apt-get install -y dotnet-sdk-8.0

ComprobaciĂłn:

dotnet --version

⚠ Hay que instalar el SDK, no el runtime: el runtime ejecuta binarios ya compilados y aquĂ­ se compila desde el cĂłdigo fuente.

PHP + Composer#

Ejecuta Laravel y Eloquent. Composer aporta ademĂĄs el autocargador PSR-4, que es lo que permite que el controlador frontal de la clase 011 encuentre las clases sin un solo require.

Windows

winget install PHP.PHP.8.3
winget install Composer.Composer

macOS

brew install php composer

Linux (Debian/Ubuntu)

sudo apt-get install -y php-cli php-xml php-mbstring php-sqlite3 composer

ComprobaciĂłn:

php --version
composer --version

⚠ Laravel necesita las extensiones mbstring, xml y sqlite3. En Windows vienen en la distribuciĂłn oficial pero hay que descomentarlas en php.ini.

Ruby + Bundler#

Ejecuta Ruby on Rails y Active Record — el origen de casi todas las convenciones que el resto del catĂĄlogo copiĂł despuĂ©s.

Windows

winget install RubyInstallerTeam.RubyWithDevKit.3.3
gem install bundler

macOS

brew install ruby
gem install bundler

Linux (Debian/Ubuntu)

sudo apt-get install -y ruby-full
gem install bundler

ComprobaciĂłn:

ruby --version
bundle --version

⚠ En Windows hace falta la variante with DevKit: algunas gemas de Rails se compilan al instalarse y sin compilador fallan a mitad.

Go#

Ejecuta Gin. Es la Ășnica cadena que no necesita paso de preparaciĂłn: go run resuelve dependencias, compila y arranca en un solo comando.

Windows

winget install GoLang.Go

macOS

brew install go

Linux (Debian/Ubuntu)

# El paquete de la distribuciĂłn suele ir por detrĂĄs; descarga desde go.dev/dl
sudo rm -rf /usr/local/go && sudo tar -C /usr/local -xzf go1.23.0.linux-amd64.tar.gz
export PATH="$PATH:/usr/local/go/bin"

ComprobaciĂłn:

go version

⚠ go version no lleva guiones, a diferencia de casi todos los demĂĄs. Es un detalle, pero es el que hace fallar el primer intento.

Rust#

Ejecuta axum. Es la Ășnica cadena donde el modo de compilaciĂłn cambia los nĂșmeros de rendimiento en un orden de magnitud: cargo build a secas compila sin optimizar, y medir eso no compara nada.

Windows

winget install Rustlang.Rustup

macOS

brew install rustup && rustup-init -y

Linux (Debian/Ubuntu)

# rustup instala la cadena en el directorio del usuario, sin tocar el sistema
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
source "$HOME/.cargo/env"

ComprobaciĂłn:

cargo --version
rustc --version

⚠ La primera construcciĂłn descarga y compila el ĂĄrbol entero de dependencias y tarda minutos. Las siguientes son rĂĄpidas porque target/ guarda lo compilado — y por eso target/ no se versiona.

<!-- fin generado: cadenas -->

3. El primer verde#

Con Node instalado —y nada más— ya se puede recorrer el repositorio entero:

git clone https://github.com/vladimiracunadev-create/framework-ecosystems-labs.git
cd framework-ecosystems-labs
node scripts/doctor.mjs

El primer contrato completo no necesita instalar ninguna dependencia, porque la implementaciĂłn de referencia estĂĄ escrita solo con la biblioteca estĂĄndar de Node [nodejs-docs]:

node scripts/run-acceptance.mjs reference-node

Y la primera clase:

node scripts/run-class.mjs 011

La salida distingue tres estados y nunca los mezcla:

SĂ­mbolo Significado
✔ la implementación arrancó y pasó todos los casos del contrato
✘ arrancó y falló un caso — hay algo que arreglar
⊘ no se ejecutó: falta una herramienta o el entorno no estaba listo

Un informe que dijera «todo bien» habiendo ejecutado tres de diez estaría mintiendo. Esa distinción es la que hace creíble el verde de este repositorio, y es el mismo principio que Nygard aplica a la instrumentación de un sistema en producción: un indicador que no puede estar en rojo no informa de nada [nygard-release-it].

4. CĂłmo se lee una clase#

Cada clase es una carpeta con tres piezas y una constante:

081-mejora-progresiva/
├── README.md               la clase: problema, contrato, código y comparación
├── contrato.json           los casos, ejecutables, idĂ©nticos para todos
├── porque-si-porque-no.md  dónde cada framework es natural y dónde es forzado
└── implementaciones/       un directorio por framework, código real
    ├── htmx/
    ├── alpinejs/
    ├── react/
    └── svelte/

El orden de lectura que funciona:

  1. El problema — quĂ© situaciĂłn se plantea. Sin frameworks todavĂ­a.
  2. El contrato — quĂ© se va a exigir exactamente. AquĂ­ es donde se decide si la comparaciĂłn significa algo: es el mismo para todos y no se adapta a ninguno.
  3. El código — la implementación de cada framework, en su forma idiomática, a la vista en la propia clase. No hay que abrir archivos para seguir la explicación.
  4. La comparación — la tabla que pone las diferencias juntas, y el texto que explica de dónde vienen.
  5. Por quĂ© sĂ­ y por quĂ© no — el juicio: para quĂ© producto y quĂ© equipo cada opciĂłn es la natural.

Y una regla que conviene conocer antes de la primera clase: si un framework no hace de verdad lo que la clase mide, sale del elenco con su explicación. No se simula. Una simulación enseñaría el comportamiento que le programamos, no el real, y con eso el laboratorio entero dejaría de valer.

5. La ruta completa: de cero a experto#

El programa estĂĄ ordenado para que cada nivel dependa solo del anterior.

Nivel Dónde estås Qué sabes hacer al salir
InstalaciĂłn este documento Ejecutar el laboratorio y leer su informe sin creerte un verde falso
Fundamentos Parte 0 — El mĂ©todo · mĂłdulo 00 Distinguir biblioteca de framework, y saber quĂ© hace comparable una comparaciĂłn
Básico 🟱 Partes 1–3 Responder, encadenar middleware, validar y contratar una API
Intermedio 🟡 Partes 4–7 Persistir sin contaminar el dominio, autenticar, renderizar donde toque
Avanzado 🔮 Partes 8–10 Tiempo real, trabajo en segundo plano, móvil y escritorio, calidad y operación
Experto Parte 11 · módulo 11 · módulo 12 Migrar sistemas vivos sin pararlos, elegir con criterio declarado y saber salir

El salto de «avanzado» a «experto» no es mås tecnología: es decidir bajo restricciones y hacerse responsable de la decisión. Hunt y Thomas lo formulan como la diferencia entre saber usar una herramienta y saber cuåndo no usarla [hunt-thomas-pragmatic].

Qué hacer cuando algo falla#

Síntoma Causa habitual Qué hacer
⊘ falta la herramienta \X\`` la cadena no está instalada node scripts/doctor.mjs y sigue la receta
⊘ entorno no preparado la herramienta está, pero faltan las dependencias del proyecto ejecuta el preparar de su ejecutar.json en ese directorio
El puerto sigue ocupado un proceso de una ejecución anterior no murió ciérralo; el ejecutor comprueba el puerto antes de arrancar y espera a que se libere
pnpm: command not found Node estĂĄ, Corepack no se ha activado corepack enable pnpm
Errores de acentos en Windows consola en una pĂĄgina de cĂłdigos antigua usa Windows Terminal, que habla UTF-8

Fuentes#