Changelog
Formato basado en Keep a Changelog.
No publicado
Dos avances: la capa pedagógica —el programa deja de ser un catálogo de clases para explicarse a sí mismo de principio a fin— y el hito 2.1, en el que el núcleo ejecutable pasa de dos laboratorios a cinco y el validador deja de ser el único componente sin pruebas.
Añadido — coherencia y documentación
- Guía de estudio enlazada desde la portada, y sección Programa reescrita: cinco tramos con su mapa, qué se resuelve en cada uno, y una tabla que ya no dice solo cuántas clases tiene cada parte sino qué sabrás hacer al terminarla, con su nivel y su prerrequisito.
- La parte 00 entra en las siete rutas. El currículo ya la incluía y la
insignia —generada— la contaba, pero el cuerpo de las siete guías se había
quedado una parte corto: ninguna la mencionaba y
rutas/README.mdseguía diciendo que todas empiezan por la parte 01. - Página de documentación del sitio agrupada por la pregunta que responde cada documento —empezar, practicar, evaluarse, cómo está construido, seguridad, historia— en lugar de veintiún enlaces en fila, con un párrafo de entrada para quien llega por primera vez.
- Estado
CADENAen el comprobador de enlaces y clasificación del motivo real de cada fallo de red.db-engines.comsirve una cadena TLS a la que le falta un intermedio: los navegadores lo recuperan solos, OpenSSL no. Se informaba como enlace roto, y no lo era. Ahora se declara aparte y no tumba el trabajo; un certificado caducado o un dominio sin DNS siguen siendoROTO. - 7 pruebas nuevas (
tests/test_numeracion.pyy ampliación detests/test_coherencia.py, 150 en total) que comprueban que la etiqueta de un enlace coincide con su destino, que cada guía de ruta recorre las partes que declara, que la tabla de tramos suma lo que suman sus partes, que la insignia del glosario está al día, y que ningún documento presenta como actuales las cifras del programa anterior.
Corregido — coherencia
- 73 referencias cruzadas mentían. Al insertar la parte 00 se renumeraron las
74 clases y los scripts actualizaron las rutas de los enlaces, pero no su
texto: quedaron 55 etiquetas de clase diciendo «017 — Agregación» sobre un
enlace a
027-agregacion…, y 18 etiquetas de parte diciendo «Parte 13» sobrepart-14-…. Los enlaces funcionaban y la validación pasaba; el material mentía al lector en cada referencia. Corregidas tomando el destino como verdad. - Conteos del programa anterior presentados como actuales:
rutas/README.mddecía 64 clases y 210 horas,assessments/diagnostic.mdhablaba de un programa de 210 horas y la clase 071 usaba «64 clases» en su ejemplo. Las apariciones del CHANGELOG y del ROADMAP se conservan: narran lo que pasó. - El «About» de GitHub, que anunciaba las cifras de la versión 2.0 a todo el
que llegaba. No vive en el árbol de ficheros, así que ningún
greplo alcanza y ninguna revisión lo mira; ahoradocs/ARCHITECTURE.mdlo documenta como la excepción que hay que comprobar a mano.
Añadido — capa pedagógica
- Glosario del programa (
GLOSARIO.md, generado desdecatalog/glosario.json): los 306 conceptos que declaran las 74 clases, definidos una sola vez. Cada entrada trae la definición, la clase donde el término se introduce, la fuente que la respalda y sus términos relacionados. La cobertura contra el currículo es exacta en los dos sentidos y la comprueba el validador. - Pauta pedagógica en
curriculum.yaml: cada clase declara ahora suresumen—para qué está y qué cambia al terminarla— y susprerrequisitos; cada parte declara suintroduccion, susresultadosde aprendizaje y loserroresfrecuentes que desmonta. Son 1 207 líneas nuevas de material escrito, no metadatos. - Portada de parte reconstruida: donde antes había un resumen de tres líneas y una tabla, ahora hay «antes de esta parte», «de qué trata», «al terminar podrás», un mapa de las clases encadenadas, una ficha explicada por clase, los errores frecuentes, el vocabulario completo de la parte y su bibliografía agregada con las clases que citan cada obra.
- Tres secciones nuevas en cada una de las 74 clases: «De qué trata esta clase», «Antes de empezar» —qué se da por sabido, con enlace a la clase donde se explicó— y «Vocabulario de la clase», que define cada concepto antes de que el texto lo use.
- Guía de estudio: los cuatro niveles de lectura, el método de ocho pasos por clase, el orden y sus atajos legítimos con lo que cuesta cada uno, tres ritmos con su duración, la autocomprobación de fin de parte y qué hacer cuando algo no sale.
- Página de glosario en el sitio (
site/glosario.html), con filtro en vivo, navegación alfabética y enlace cruzado a la clase de cada término; más el vocabulario y la bibliografía de cada parte en su página. - 16 pruebas nuevas (
tests/test_glosario.py, 143 en total): comprueban la cobertura del glosario en los dos sentidos, que ninguna remisión apunte al vacío, que cada término se defina en una clase que lo declara, que toda clase publique su vocabulario y sus prerrequisitos, y que la portada de cada parte explique todas sus clases. Además someten al validador a cinco repositorios rotos a propósito —concepto sin definir, definición huérfana, remisión rota, resumen vacío y prerrequisito circular— y exigen que los detecte.
Cambiado — capa pedagógica
scripts/validate_repository.pyincorporavalidar_glosarioyvalidar_pauta. La segunda regla del repositorio pasa a ser explícita: ningún concepto se usa sin estar definido en el glosario. Un prerrequisito que no precede a su clase se trata como dependencia circular y falla.- El índice general (
classes/README.md) explica cómo se lee el material y resume cada clase en una línea, en lugar de listar solo títulos.
Añadido
- Laboratorio 03 ejecutable (
labs/03-transactions/run_transactions_lab.py): reproduce una actualización perdida con dos hilos reales sincronizados en una barrera, y la corrige con actualización atómica, control optimista por versión y bloqueo pesimista (BEGIN IMMEDIATE). La evidencia es el invariante —una plaza, una reserva—, no un tiempo. - Laboratorio 04 ejecutable (
labs/04-indexing/run_indexing_lab.py): 20 000 filas deterministas,EXPLAIN QUERY PLANy trabajo contado en instrucciones de la máquina virtual conset_progress_handler. Muestra el prefijo izquierdo de un índice compuesto, el recorrido por saltos (skip-scan) cuando hay estadísticas, y el costo en trabajo y páginas de mantener dos índices. - Laboratorio 05 ejecutable (
labs/05-nosql-workloads/run_nosql_lab.py): mide TTL frente a coherencia, incrustar frente a referenciar bajo carga de lectura y de escritura, el techo de un arreglo incrustado ante el límite de 16 MiB por documento, y el reparto de una clave de partición caliente. - Pruebas (
tests/): una batería que ejecuta los laboratorios, comprueba que no importan dependencias externas, verifican la idempotencia de los generadores y su modo--check, y someten al validador a un repositorio roto a propósito —clase con una sola fuente, cita al vacío, fuente huérfana, libro sin ISBN, artículo sin DOI ni sede, motor fuera del catálogo, lección sin una sección obligatoria, lección demasiado corta, enlace relativo roto, codificación corrupta y archivo obligatorio ausente— exigiendo que lo detecte. requirements-dev.txtypytest.inipara el entorno de desarrollo.- Trabajo
pruebasen integración continua, y los tres laboratorios nuevos en la matriz de Python 3.11, 3.12 y 3.13. - Sitio como producto: barra de navegación y pie comunes a las 120 páginas, tema claro y oscuro con conmutador que recuerda la elección, progreso de lectura por clase guardado en el navegador, filtro «solo pendientes», anterior/siguiente y migas en cada clase, barra de avance, copiar bloque de código, enlace para saltar al contenido y estilos de impresión.
- Páginas nuevas: laboratorios
(qué mide cada uno, cómo se ejecuta y de qué fuente sale su criterio),
autoevaluación
con las 256 preguntas enlazadas a su clase, 17 páginas de documentación
publicadas desde los
.mddel repositorio, y una página 404. - Aplicación instalable:
manifest.webmanifesty service worker con nombre de caché derivado de la huella del contenido, para que una versión nueva invalide la anterior sin recordar subir ningún número a mano. - Descubrimiento:
sitemap.xml,robots.txt, enlace canónico, etiquetas Open Graph y Twitter con portada social, y datos estructurados schema.org (Courseen la portada,LearningResourceen cada clase). - Marca gráfica generada (
scripts/brand_assets.py): iconos de 192 y 512 px y portada social de 1200×630, dibujados conzlibystructde la biblioteca estándar —sin Pillow— y reproducibles byte a byte. - Laboratorios como datos: sección
laboratoriosencurriculum.yamlcon el comando, la marca de éxito, lo que mide y sus fuentes; el validador comprueba que el guion existe y que imprime de verdad la marca que declara. - Análisis CodeQL semanal y en cada cambio, y Dependabot mensual para acciones y dependencias de Python.
- Rutas por rol con guía de carrera (
rutas/): las cuatro rutas por objetivo pasan de una fila en una tabla a siete recorridos con guía completa —qué es el puesto, un día en el trabajo, qué necesitas saber, la ruta por partes con sus clases clave, qué tienes que poder demostrar, credenciales, progresión, mitos y siguientes pasos—. Se añaden Analytics engineer / BI, Ingeniero de IA aplicada y recuperación, y Gobierno y privacidad del dato, con lo que las 14 partes quedan cubiertas por alguna ruta. - Las rutas viven como datos en
curriculum.yaml(nivel, foco, partes, clases clave, laboratorios, cargos y fuentes) y el validador comprueba que todo lo que prometen existe, que la guía trae sus diez secciones y que las horas que declara son las que suman sus partes. - Seis fuentes nuevas para sostener las afirmaciones de oficio y de mercado: el Occupational Outlook Handbook del U.S. Bureau of Labor Statistics, la Stack Overflow Developer Survey 2025, el DB-Engines Ranking y los temarios oficiales de DP-300, Google Professional Data Engineer y CDMP. Donde no hay fuente pública para el mercado local, las guías no publican cifras.
- Nueve páginas más en el sitio: índice de rutas, cómo elegir y una por rol, con datos estructurados de itinerario y las fuentes enlazadas a su ficha.
- Pruebas de coherencia del README: la tabla del programa, la de rutas y las cifras de las
insignias se comprueban contra
curriculum.yamly contra el propio repositorio. - Laboratorio 07 ejecutable (
labs/07-replication/run_replication_lab.py): un líder y dos seguidores con retraso declarado. Cuenta las lecturas que no ven la escritura propia del cliente y las no monótonas al repartir entre réplicas, y aplica las tres correcciones —leer del líder, esperar la posición propia, exigir quórum— midiendo lo que cuesta cada una. - Laboratorio 08 ejecutable (
labs/08-recovery/run_recovery_lab.py): respalda una base real con la API del motor, archiva cada transacción, provoca un borrado sin filtro y compara tres recuperaciones. Solo la restauración a un punto en el tiempo devuelve el estado bueno, y se demuestra comparando el contenido, no mirándolo por encima. - Guías de laboratorio completas: las ocho pasan de una página de instrucciones a una guía con qué demuestra, hipótesis que predecir antes de ejecutar, la salida real, por qué el experimento está hecho así, lo que no demuestra, extensiones, cómo llevarlo a un motor real, y las clases, rutas y certificaciones donde encaja.
- Certificaciones (
certificaciones/): mapeo del temario oficial de DP-300, DP-900 y AWS Data Engineer Associate contra las clases del programa, con la cobertura calculada desde los pesos que publica cada proveedor. Dos métodos declarados —medición por subáreas oficiales y estimación por dominio— y la brecha explicada en cada ficha. - Google Professional Data Engineer, CDMP y las credenciales de Oracle se listan sin porcentaje, con el motivo: su ponderación no está disponible en una fuente verificable, y este repositorio no publica un número que no pueda comprobar.
scripts/generar_certificaciones.pycalcula la cobertura y genera las fichas, con--checken integración continua como el resto de los generadores.- Evaluación como datos: la rúbrica del proyecto final pasa a
curriculum.yamlcon diez dimensiones, sus cuatro niveles descritos, el mínimo exigido por dimensión, la evidencia que hay que ver y las clases y laboratorios donde se aprende. Se genera conscripts/generar_evaluacion.py, así que no puede contradecir al programa. - Examen final por rol (
assessments/examen-por-rol.md): teoría, práctica y defensa para cada una de las siete rutas, con sus laboratorios y clases clave, generado desde el currículo. - Diagnóstico inicial con clave de corrección: qué menciona una respuesta sólida, qué es señal de alarma, y a qué parte o ruta te encamina cada resultado.
- Evidencias de laboratorio: qué cuenta como evidencia —hipótesis previa, comando, entorno, salida completa y límite declarado—, con plantilla, la afirmación que debe sostener cada uno de los ocho laboratorios y el criterio de corrección.
- Proyectos: el proyecto final pasa de nueve viñetas a nueve fases con su entregable y su dimensión de rúbrica, las siete preguntas de la defensa, la estructura de entrega y la lista de comprobación previa. Los cinco dominios canónicos declaran ahora su invariante, su patrón de acceso, su dato sensible y la forma concreta en que cada uno rompe.
- Portafolio verificable: cómo convertir la evidencia acumulada en algo que se enseñe, qué llevar a una entrevista según el puesto y qué no es un portafolio.
- Seis páginas más en el sitio: cómo se evalúa, rúbrica, examen por rol, evidencias, proyectos y portafolio.
Cambiado
scripts/validate_repository.pyexige la presencia de los cinco laboratorios ejecutables, valida la secciónlaboratoriosy cuenta también sus citas al buscar fuentes huérfanas.labs/README.mddeclara qué mide cada laboratorio y por qué ninguno afirma nada en milisegundos.scripts/generate_site.pypasa de 82 a 120 páginas y admite artefactos binarios, con--checkbyte a byte también para los iconos.- Los README de clase pierden la tabla de metadatos y las cifras del README raíz dejan de duplicar las insignias; la ficha de clase pasa a una línea corrida.
- El bloque «Laboratorio» de cada clase publica el comando real del laboratorio: antes
anunciaba un
run_lab.pyque solo existe en el primero. - Corregidas las horas de las partes 08 y 09 en la tabla del README, que declaraban 19 y suman 17.
- El sistema visual se reescribe sobre variables CSS: un solo bloque de tokens define color y ritmo, y de ahí sale el tema claro sin excepciones.
- Las clases de réplica (043, 046) y de respaldo (048) pasan a apuntar a su laboratorio propio en vez de a uno prestado.
- El flujo de Pages vigila todas las entradas del generador; antes ignoraba
docs/,assessments/,projects/y los documentos de la raíz, así que un cambio en ellos no llegaba a publicarse.
3.0.0 — 2026-08-20
El repositorio cambia de modelo. Hasta aquí una clase explicaba un concepto y citaba motores de pasada; a partir de aquí declara un caso, lo resuelve en varios motores y escribe, con el mismo peso, por qué sí y por qué no conviene resolverlo en cada uno. Los motores que no resuelven el caso aparecen también, con el motivo y con lo que se hace en su lugar.
Añadido
- Eje comparado en las 74 clases. Cada una trae su
motores.yaml—el caso, la salida esperada y la matriz de motores— y su carpetaimplementaciones/con el código real de cada uno. 408 implementaciones, de las que 267 se ejecutan contra el motor real y el resto se declaran como material revisado y no ejecutado. scripts/verificar_equivalencia.py. Ejecuta cada implementación y compara su resultado con el contrato de su clase. Tres niveles declarados: núcleo (SQLite y DuckDB, sin servicios, en cualquier máquina), servicio (PostgreSQL, MySQL, MongoDB, Redis y Neo4j contra el contenedor real, con el cliente oficial de cada uno) y declarado (se muestra y se revisa; la máquina no lo ejecuta).scripts/motores_lib.py. Carga y valida las comparaciones. Exigeporque_noen todo motor —un motor que solo tiene ventajas no se entendió, se copió del folleto— y exige que el enlacedoc:cuelgue del dominio oficial que registracatalog/databases.json.- Parte 00 nueva, la rampa de entrada. Diez clases para quien nunca ha
escrito una consulta: qué es un dato, por qué la hoja de cálculo deja de
servir, crear/insertar/leer, filtrar y ordenar, cambiar datos y el
WHEREque salva, tipos, clave primaria, dos tablas y una clave foránea, cuándo no hace falta una base de datos, y el mapa de las seis familias de motores. - Trabajo de CI
equivalencia. Levanta los cinco motores de servicio condocker compose --profile todo up -d --waity ejecuta todas las implementaciones contra ellos. - Servicio
neo4jendocker-compose.yml, y perfiltodopara levantar los cinco de una vez. - El verificador de enlaces cubre los dos registros: las fuentes
bibliográficas y ahora también los
doc:de cada motor —347 enlaces—, con--solo motorespara comprobar solo estos.
Cambiado
- Renumeración. Partes 00–13 pasan a 01–14 y clases 001–064 pasan a 011–074,
para dejar sitio a la parte 00. Las referencias por identificador se
reescribieron en los dos únicos sitios donde viven —
curriculum.yamlycertificaciones/_mapeo.json—, más las rutas de enlace de los.md. - La parte 00 entra en las siete rutas por rol como rampa común, y las horas declaradas en cada guía se actualizaron en consecuencia.
scripts/build_classes.pyrenderiza la sección comparada en cada README, y escapa la barra vertical en las celdas de tabla —que aparece de verdad en cuanto se habla del operador de concatenación.- Dos pruebas de coherencia dejan de escribir cifras a mano: la que exigía la parte «13» como cierre lee ahora la primera y la última del currículo, y la que fijaba 210 horas comprueba que la portada dice las que el currículo suma.
Corregido
docker-compose.yml: el volumen de PostgreSQL 18 se montaba en/var/lib/postgresql/datay el contenedor nunca llegaba a estar sano. La imagen 18 coloca los datos en un subdirectorio con la versión dentro, así que el punto de montaje es/var/lib/postgresql.- Puertos configurables por variable de entorno, para poder levantar el stack en una máquina que ya tenga un PostgreSQL o un MySQL escuchando.
scripts/generate_site.py: los enlaces amotores.yamly aimplementaciones/apuntan al archivo en GitHub en vez de morir en el sitio.- Tres enlaces de documentación oficial rotos (DuckDB y dos de Cassandra), detectados por el verificador de enlaces en su primera ejecución sobre el registro de motores.
2.0.0 — 2026-08-19
Reescritura del programa en torno a una regla: ninguna clase se publica sin fuentes, y ninguna cita apunta al vacío.
Añadido
- Registro de fuentes (
catalog/sources.json): 109 entradas —27 libros, 36 artículos, 9 normas y 37 documentaciones oficiales— con autoría, año, URL, ISBN o DOI y una nota que explica su papel en el programa. - 64 clases repartidas en 14 partes y 210 horas, cada una con propósito, resultados de aprendizaje, fundamentos, ejemplo trabajado con números o código reales, tabla comparativa, diagrama, errores frecuentes, paso a la operación, reto de transferencia y preguntas de evaluación.
curriculum.yamlcomo fuente única de verdad: partes, clases, horas, niveles, conceptos, motores, laboratorios, fuentes, rutas y evaluación.- Sitio de GitHub Pages (
site/): 82 páginas con búsqueda en el cliente, filtros por parte, nivel y motor, diagramas Mermaid, bibliografía renderizada y catálogo de motores. - Generadores:
scripts/build_classes.pyyscripts/generate_site.py, ambos con modo--checkpara detectar artefactos desactualizados. - Verificador de enlaces (
scripts/check_external_links.py) que distingue enlace roto de enlace protegido contra clientes automáticos. - Integración continua en cuatro trabajos: estructura y fuentes, artefactos regenerados, lint de Markdown y laboratorios sobre Python 3.11, 3.12 y 3.13.
- Comprobación semanal del estado de las 109 fuentes.
- Apache Kafka en el catálogo de motores.
Cambiado
scripts/validate_repository.pypasa de comprobar la existencia de unos archivos a hacer cumplir el contrato completo: mínimo de fuentes por clase, citas existentes, ausencia de fuentes huérfanas, ISBN en libros y DOI o sede en artículos, motores presentes en el catálogo, secuencia de clases sin huecos, secciones obligatorias en cada lección, enlaces relativos resueltos y codificación UTF-8 sin mojibake.docs/SOURCES.mddeja de ser un listado y pasa a ser la política de citación; el listado vive solo en el registro.PROMPT_MAESTRO.mdydocs/ARCHITECTURE.mdreescritos alrededor de la separación entre fuentes y artefactos derivados.- El README raíz declara las cifras del programa y cómo se verifican.
Eliminado
curriculum/(13 archivos Markdown): sustituido porcurriculum.yamlmás las 64 clases. Mantener ambos garantizaba que acabaran contradiciéndose.
0.1.0 — 2026-08-19
- estructura inicial del programa;
- prompt maestro interno;
- doce módulos progresivos;
- catálogo extensible de sistemas de datos;
- dominio educativo y laboratorio SQLite ejecutable;
- perfiles de contenedores para laboratorios;
- evaluaciones, proyectos y plantillas.