El sistema está construido y verificado; falta el último acto del oficio: entregarlo. Entregar no es enviar un ZIP — es lograr que otra persona pueda instalarlo sin ti, entender qué hace y por qué, y ver en diez minutos que funciona. En esta lección escribirás el README definitivo, prepararás una demostración con guion, redactarás el informe de datos como entregable de negocio (con el pedido de Sant Jordi como modelo), te evaluarás con una rúbrica honesta y harás la retrospectiva que convierte la experiencia en aprendizaje. Y como esta es la última lección del curso, terminaremos donde se debe terminar: mirando el camino completo desde print("Hola, Mundo") hasta aquí, y decidiendo — con criterio — cuál es tu siguiente paso.
Contenido
- Documentar para otros: el README completo
- La demostración: un guion de 10 minutos
- El informe final de datos como entregable
- Autoevaluación honesta: la rúbrica
- Retrospectiva personal: cinco preguntas
- Extensiones posibles, ordenadas por dificultad
- El viaje completo: de M1 a M12
- Próximos pasos con criterio
- Papyrus era tuyo desde el principio
Documentar para otros: el README completo
El README es la puerta del proyecto: se escribe para alguien que no estaba ahí (incluido tu yo de dentro de seis meses, que tampoco estará). La prueba de fuego es literal: otra persona, con solo el README, arranca el proyecto sin hacerte una pregunta. Plantilla real, sección a sección:
# Papyrus Online
Sistema de gestión para la librería Papyrus: catálogo, socios, ventas
con cupones, API REST e informe mensual de datos.
Proyecto final del curso de Programación en Python.
## Qué hace
- Gestión de catálogo (CRUD) y de socios con descuento del 5 %.
- Ventas con control de stock, cupones (PAPYRUS10, SOCIO5) e IVA.
- API REST (Flask): /api/libros y /api/ventas. ← o la web Django
- Informe mensual con pandas y gráfico (Matplotlib).
- Persistencia en JSON/CSV con guardado atómico y registro en log.
## Instalación
python -m venv .venv
.venv\Scripts\activate # Windows (source .venv/bin/activate en Linux/Mac)
pip install -r requirements.txt
## Uso
python app.py # API en http://localhost:5000
# Vender un Fausto a un socio con cupón:
curl -X POST http://localhost:5000/api/ventas \
-H "Content-Type: application/json" \
-d '{"titulo": "Fausto", "unidades": 1,
"socio": "LUIS-001", "cupon": "PAPYRUS10"}'
# → {"importe": 18.67, ...}
python -m papyrus.informe # genera datos/informe_2026.png
## Estructura
papyrus/ lógica de negocio (modelos, servicios, repositorios)
app.py interfaz Flask (solo traduce HTTP ↔ servicios)
datos/ catálogo, socios, ventas y log
tests/ suite pytest (~25 tests)
## Tests
pytest # toda la suite; no toca datos/ reales
## Limitaciones conocidas
- Sin autenticación: cualquiera puede usar la API.
- JSON/CSV como almacenamiento: válido para una librería, no para mil.
- Sin despliegue: pensado para ejecutarse en local.Dos detalles que separan un README profesional de uno de adorno: el ejemplo de uso copiable (el curl con su respuesta esperada: quien lo pega y ve el 18.67 ya confía en el proyecto) y la sección de limitaciones conocidas — documentar lo que falta no es debilidad, es criterio; todo software real la lleva, aunque no siempre escrita.
La demostración: un guion de 10 minutos
Una demo sin guion enseña pantallas; una demo con guion cuenta una historia. La historia de Papyrus Online es "de la venta al dato", y este orden la cuenta:
| Min | Qué enseñas | Qué demuestra |
|---|---|---|
| 0-1 | El README y el árbol del proyecto | Que hay un sistema organizado, no un script |
| 1-3 | Una venta feliz: Fausto + LUIS-001 + PAPYRUS10 → 18.67 € |
RF2, RF3: el núcleo del negocio, con el número canónico |
| 3-5 | Dos ventas que fallan bien: sin stock (409) y cupón falso (400), y sus WARNING en el log |
RF3, RF7: los errores son parte del diseño, no accidentes |
| 5-6 | catalogo.json antes y después: el stock persiste tras reiniciar |
RF4: el sistema tiene memoria |
| 6-8 | El informe: ejecución en vivo, los números (520 u, sábado 130) y el PNG | RF6: el sistema no solo opera — entiende |
| 8-9 | pytest -v: la suite en verde, en directo |
RNF1: nada de lo anterior es casualidad |
| 9-10 | Limitaciones y una extensión que harías | Madurez: sabes dónde termina tu sistema |
Tres consejos de demo: ensáyala una vez entera (la demo que no se ensaya, falla — ley empírica), ten los comandos ya escritos en un fichero para pegarlos (teclear en vivo es tirar minutos), y enseña un fallo controlado a propósito: nada genera más confianza que un sistema rechazando limpiamente una venta imposible. ¿Que no tienes audiencia? Grábate en pantalla siguiendo el guion. La disciplina de contarlo en voz alta delata cada rincón que no entiendes del todo — es autoevaluación disfrazada de teatro.
El informe final de datos como entregable
El informe de RF6 no es un script que imprime números: es un documento de negocio que Ana pueda leer un lunes por la mañana. El entregable (un Markdown o PDF con el PNG incrustado) debe contener exactamente tres cosas:
- Los números del periodo: total de unidades e importe, top 3 de títulos, mejor día de la semana, evolución mensual. Con
ventas_2026.csv: 520 unidades en el semestre, sábado como rey (130 u), abril desbocado (168 u). - El gráfico: uno, no seis. El que mejor cuenta la historia del periodo (la barra mensual con abril sobresaliendo, la de M11).
- Una recomendación accionable — la parte que casi todo el mundo omite y la que da valor a todo lo demás. El modelo es el pedido de Sant Jordi de 11-05:
«La regresión (MAE ±1.1 u/día) proyecta 172 unidades para abril de 2027. Recomendación: pedido de 190 unidades (proyección + margen del ~10 %), repartido en dos cuotas — 120 a inicio de abril, 70 la semana previa a Sant Jordi — para limitar el riesgo de sobrestock. Vigilar Fausto: 210 visitas y 11.9 % de conversión sugieren revisar su precio antes de la campaña.»
Fíjate en la anatomía: dato → recomendación concreta (con número) → gestión del riesgo → decisión que queda en manos de Ana. Los modelos recomiendan; las personas deciden — la regla de oro de M11 también se entrega por escrito.
Autoevaluación honesta: la rúbrica
Sin profesor, la nota te la pones tú — razón de más para que la escala sea explícita. Evalúa cada dimensión y anota el nivel en DECISIONES.md:
| Dimensión | Suficiente | Bueno | Excelente |
|---|---|---|---|
| Funcionalidad | RF1-RF4 completos; interfaz parcial | Los 7 RF con sus criterios de aceptación | Los 7 RF + algún extra con criterio (p. ej. reponer en la API) |
| Código | Funciona; capas reconocibles con alguna fuga (negocio en endpoints) | Capas limpias, type hints en el core, errores propios en todo el flujo | Además: nombres que se leen solos, funciones cortas, cero duplicación evidente |
| Tests | La mitad de la suite mínima; algún test toca datos/ |
Suite mínima completa, aislada con tmp_path, integración incluida |
Además: regresiones documentadas y el test del guardado atómico |
| Documentación | README con instalación | README completo con uso copiable y limitaciones | Además: DECISIONES.md con porqués e informe de negocio con recomendación |
Interpretación honesta: "Suficiente" en todo ya es un logro enorme — un sistema completo construido en solitario. "Bueno" es el estándar profesional razonable. "Excelente" es aspiracional: si has marcado todo excelente, o eres muy bueno o has sido poco honesto — y la rúbrica solo sirve con lo segundo descartado.
Retrospectiva personal: cinco preguntas
La experiencia no enseña; la experiencia examinada enseña. Cierra DECISIONES.md respondiendo por escrito, con calma:
- ¿Qué me costó más de lo esperado? (Señala tu próxima área de estudio.)
- ¿Qué me costó menos de lo esperado? (Señala una fortaleza que quizá no sabías que tenías.)
- ¿Qué decisión de diseño repetiría y cuál no? (Revisa tu tabla de decisiones de 12-02 con la verdad del código delante.)
- ¿Cuál fue el peor bug y qué lo habría evitado? (Un test antes, un contrato más claro, un tipo mejor definido…)
- ¿Qué haría distinto si empezara mañana? (La respuesta es tu lista personal de lecciones aprendidas — vale más que cualquier resumen nuestro.)
Extensiones posibles, ordenadas por dificultad
Las ideas aparcadas en 12-01 tienen ahora su sitio. Cada una con lo que tendrías que aprender — porque "querer hacerlo" sin saber qué implica es como estimar sin datos:
| Extensión | Dificultad | Qué tendrías que aprender |
|---|---|---|
| Control de versiones con git | ★ | git básico (commit, branch, push) y GitHub. Empieza por aquí: es la herramienta número uno del oficio y la echaste de menos en 12-03 |
| Base de datos real | ★★ | SQL básico y sqlite3 (biblioteca estándar) o SQLAlchemy; en Django ya la usas: sería migrar a PostgreSQL |
| Autenticación | ★★★ | Sesiones y tokens, hashing de contraseñas, flask-login o el auth de Django; y las formas en que se hace mal (OWASP) |
| Despliegue | ★★★ | Linux básico, un PaaS sencillo, variables de entorno, gunicorn; opcionalmente Docker |
| Front moderno | ★★★★ | JavaScript en serio y un framework (React/Vue); tu API REST ya está lista para servirle |
| Más ML | ★★★★ | Estadística con fundamento, validación cruzada, más modelos de scikit-learn; el aviso de 11-05 sigue vigente: primero la estadística, luego los modelos |
Regla para elegir: una extensión, llevada a acabada, enseña más que tres a medias. Ya sabes por qué: lo aprendiste terminando este proyecto.
El viaje completo: de M1 a M12
Mira atrás un momento, porque la distancia recorrida se ve mejor desde el final. En M1 escribiste print("Hola, Mundo") y pelear con el PATH era una aventura. En M2-M4 aprendiste a pensar en control y estructuras, y Papyrus era una lista con cuatro libros. En M5 esos libros se volvieron objetos con comportamiento; en M6 sobrevivieron a un reinicio; en M7 el sistema aprendió a fallar con elegancia y a dejar constancia en un log. M8 te dio las herramientas de adulto — type hints, decoradores, generadores, context managers — y M9 la que lo cambia todo: la capacidad de demostrar que tu código funciona. En M10 Papyrus salió al mundo por HTTP, dos veces y de dos maneras. En M11 sus datos hablaron: sábados de 130 unidades, un Sant Jordi de 168, un Fausto que se mira y no se compra, una regresión que proyectó 172 y una librera que pidió 190. Y en M12 no aprendiste nada nuevo — hiciste algo más difícil: lo ensamblaste todo, solo, y funciona. Esa frase, hace doce módulos, era impensable. Esa frase es el curso.
Próximos pasos con criterio
"¿Y ahora qué?" tiene mejor respuesta si la eliges por interés real, no por moda. Tres itinerarios según lo que más disfrutaste:
| Si disfrutaste más… | Itinerario | Primeros pasos concretos |
|---|---|---|
| M10 y el diseño de la API (backend) | Desarrollo backend | git a fondo → SQL y un ORM → un framework en serio (FastAPI o Django profundo) → despliegue y Docker |
| M11 y el informe (datos) | Análisis / ciencia de datos | Estadística con fundamento → pandas avanzado → visualización seria → scikit-learn con validación rigurosa → SQL (también aquí) |
| M6-M8 y los scripts que ahorran trabajo (automatización) | Automatización / scripting profesional | git → argparse y CLIs → APIs de terceros (requests) → tareas programadas → empaquetado y distribución de tus herramientas |
Los tres comparten dos peajes: git (ya no hay excusa) e inglés técnico (la documentación de verdad vive ahí). Y un consejo transversal: a partir de aquí se aprende construyendo — elige proyectos algo más grandes que tu comodidad, como lo fue este.
Papyrus era tuyo desde el principio
Una confesión final: Papyrus nunca fue el tema del curso. Fue un vehículo — lo bastante pequeño para caber en una lección, lo bastante real para tener stock que cuadrar, socios que validar y un Sant Jordi que planificar. El tema del curso eras tú trabajando sobre tu propia realidad. Así que el último ejercicio es obvio: mira tu trabajo, tu sector, tu día a día. ¿Qué es ahí el "catálogo"? ¿Expedientes, pólizas, reservas, pacientes, inventario? ¿Qué es la "venta con reglas": un cálculo con descuentos, una validación con excepciones, un proceso que hoy alguien hace a mano? ¿Y qué informe le darías a tu "Ana"? Todo lo construido aquí — capas, contratos, errores propios, tests, un CSV que se convierte en decisión — se traslada tal cual. El primer proyecto que hagas sobre tu dominio será más difícil que Papyrus, porque nadie te dará los requisitos numerados. También será el que te cambie el perfil profesional.
Errores Comunes y Consejos
- Entregar sin probar la instalación desde cero. Clona/copia tu proyecto a otra carpeta, crea un venv nuevo y sigue tu README al pie de la letra. Fallará en algo (una dependencia no anotada, una ruta) — mejor descubrirlo tú que tu lector.
- Demo sin ensayo. El servidor que no arranca, el JSON con una coma de más… La única vacuna es haberla hecho entera una vez antes.
- Informe de datos sin recomendación. Números sin decisión propuesta es trabajo a medias; la recomendación (con su riesgo gestionado) es lo que Ana no puede pedirle a una hoja de cálculo.
- Autoevaluarse al alza… o al baja. Inflarse impide crecer; machacarse, continuar. La rúbrica existe para sacarte de ambos: nivel por dimensión, con evidencia.
- No cerrar nunca. Siempre habrá un refactor más, una extensión más. Los proyectos se entregan: versión 1.0, README honesto con limitaciones, y lo siguiente ya es la versión 2 — o el siguiente proyecto.
Ejercicios
- Hito final — el paquete de entrega. Completa el README con la plantilla, verifica la instalación desde cero en un venv nuevo, y genera el informe de negocio (números + PNG + recomendación) como
INFORME.md. Verificación: una persona de confianza (o tú mismo, en otra máquina u otra carpeta, siguiendo solo el README) arranca el sistema y ejecuta los tests sin ayuda. - Hito final — la demo. Prepara el guion de 10 minutos con tus comandos en un fichero
demo.md, ensáyala una vez completa y, si puedes, grábala o muéstrasela a alguien. Verificación: la ejecutas entera sin improvisar ni consultar nada fuera del guion. - Hito final — cierre y siguiente paso. Rellena la rúbrica y las cinco preguntas de la retrospectiva en
DECISIONES.md, elige tu itinerario de la tabla de próximos pasos y escribe la primera acción concreta con fecha ("sábado: curso básico de git"). Verificación: la acción es tan concreta que el sábado sabrás exactamente qué abrir.
Soluciones
- No hay solución que copiar: hay una señal de éxito — la persona que sigue tu README no te hace ninguna pregunta. Cada pregunta que te haga es una línea que le falta al README; añádela y considera el ejercicio en curso hasta que las preguntas sean cero.
- Orientativa: los fallos de ensayo más comunes son el servidor arrancado desde la carpeta equivocada (rutas relativas — 12-03 lo avisó) y los datos "sucios" de pruebas anteriores; ten un
datos/de demo limpio y preparado. Si al narrar un paso no sabes explicar por qué funciona, apúntalo: es la última lección del curso diciéndote dónde repasar. - Ejemplo de acción bien formulada: «Sábado 10:00: tutorial oficial de git hasta branching; crear repo de Papyrus Online y hacer el primer commit con la versión entregada.» Mal formulada: «aprender git pronto». La diferencia entre ambas es la misma que llevas doce módulos practicando: lo verificable frente a lo vago.
Conclusión
Se acabó — y esta vez no hay "en la próxima lección". Empezaste este curso escribiendo una línea que saludaba al mundo y lo terminas con un sistema completo que gestiona un negocio: dominio con reglas y errores propios, persistencia que no pierde datos, una interfaz que lo sirve, una suite de tests que lo demuestra y un informe que convierte ventas en decisiones. Más importante que cualquier pieza: has demostrado que puedes recibir requisitos, diseñar, construir, verificar y entregar sin que nadie te lleve de la mano. Eso no se olvida como se olvida una sintaxis; es un cambio de categoría. Te llevas un método (contratos antes que código, validar-calcular-mutar, cada bug deja su test, los modelos recomiendan y las personas deciden), un proyecto real que enseñar, y un mapa de siguientes pasos elegido con criterio. La librería de Ana queda en buenas manos — las tuyas fueron las que la construyeron. Ahora ve y hazle a tu propio dominio lo que le has hecho a Papyrus. Ha sido un privilegio acompañarte desde el print("Hola, Mundo"). El resto del camino se recorre igual que este: una línea, un test y un proyecto cada vez. Buen viaje, y buen código.
Curso de Programación en Python
Módulo 1: Introducción a Python
- Introducción a Python
- Configuración del Entorno de Desarrollo
- Sintaxis de Python y Tipos de Datos Básicos
- Variables y Constantes
- Entrada y Salida Básica
- Entornos Virtuales y Gestión de Paquetes
Módulo 2: Estructuras de Control
- Sentencias Condicionales
- Bucles: for y while
- Herramientas de Control de Flujo
- Comprensiones de Listas
Módulo 3: Funciones y Módulos
- Definición de Funciones
- Argumentos de Función
- Funciones Lambda
- Módulos y Paquetes
- Visión General de la Biblioteca Estándar
Módulo 4: Estructuras de Datos
Módulo 5: Programación Orientada a Objetos
Módulo 6: Manejo de Archivos
- Lectura y Escritura de Archivos
- Trabajo con Archivos CSV
- Manejo de Datos JSON
- Operaciones con Archivos y Directorios
Módulo 7: Manejo de Errores y Excepciones
- Introducción a las Excepciones
- Manejo de Excepciones
- Lanzamiento de Excepciones
- Excepciones Personalizadas
- Buenas Prácticas y Registro de Errores con logging
Módulo 8: Temas Avanzados
- Anotaciones de Tipos (type hints)
- Decoradores
- Generadores
- Administradores de Contexto
- Concurrencia: Hilos y Procesos
- Asyncio para Programación Asíncrona
Módulo 9: Pruebas y Depuración
- Introducción a las Pruebas
- Pruebas Unitarias con unittest
- Pruebas con pytest
- Desarrollo Guiado por Pruebas
- Técnicas de Depuración
- Uso de pdb para Depuración
Módulo 10: Desarrollo Web con Python
- Introducción al Desarrollo Web
- Fundamentos del Framework Flask
- Construcción de APIs REST con Flask
- Introducción a Django
- Construcción de Aplicaciones Web con Django
Módulo 11: Ciencia de Datos con Python
- Introducción a la Ciencia de Datos
- NumPy para Computación Numérica
- Pandas para Manipulación de Datos
- Matplotlib para Visualización de Datos
- Introducción al Aprendizaje Automático con scikit-learn
