El sistema està construït i verificat; falta l'últim acte de l'ofici: lliurar-lo. Lliurar no és enviar un ZIP — és aconseguir que una altra persona pugui instal·lar-lo sense tu, entendre què fa i per què, i veure en deu minuts que funciona. En aquesta lliçó escriuràs el README definitiu, prepararàs una demostració amb guió, redactaràs l'informe de dades com a lliurable de negoci (amb la comanda de Sant Jordi com a model), t'avaluaràs amb una rúbrica honesta i faràs la retrospectiva que converteix l'experiència en aprenentatge. I com que aquesta és l'última lliçó del curs, acabarem on s'ha d'acabar: mirant el camí complet des del print("Hola, món!") fins aquí, i decidint — amb criteri — quin és el teu proper pas.
Contingut
- Documentar per a altres: el README complet
- La demostració: un guió de 10 minuts
- L'informe final de dades com a lliurable
- Autoavaluació honesta: la rúbrica
- Retrospectiva personal: cinc preguntes
- Extensions possibles, ordenades per dificultat
- El viatge complet: de M1 a M12
- Propers passos amb criteri
- Papyrus era teu des del principi
Documentar per a altres: el README complet
El README és la porta del projecte: s'escriu per a algú que no hi era (inclòs el teu jo d'aquí a sis mesos, que tampoc hi serà). La prova de foc és literal: una altra persona, només amb el README, arrenca el projecte sense fer-te ni una pregunta. Plantilla real, secció a secció:
# Papyrus Online
Sistema de gestió per a la llibreria Papyrus: catàleg, socis, vendes
amb cupons, API REST i informe mensual de dades.
Projecte final del curs de Programació en Python.
## Què fa
- Gestió de catàleg (CRUD) i de socis amb descompte del 5 %.
- Vendes amb control d'estoc, cupons (PAPYRUS10, SOCI5) i IVA.
- API REST (Flask): /api/llibres i /api/vendes. ← o la web Django
- Informe mensual amb pandas i gràfic (Matplotlib).
- Persistència en JSON/CSV amb guardat atòmic i registre en log.
## Instal·lació
python -m venv .venv
.venv\Scripts\activate # Windows (source .venv/bin/activate a Linux/Mac)
pip install -r requirements.txt
## Ús
python app.py # API a http://localhost:5000
# Vendre un Faust a un soci amb cupó:
curl -X POST http://localhost:5000/api/vendes \
-H "Content-Type: application/json" \
-d '{"titol": "Faust", "unitats": 1,
"soci": "LLUIS-001", "cupo": "PAPYRUS10"}'
# → {"quantia": 18.67, ...}
python -m papyrus.informe # genera dades/informe_2026.png
## Estructura
papyrus/ lògica de negoci (models, serveis, repositoris)
app.py interfície Flask (només tradueix HTTP ↔ serveis)
dades/ catàleg, socis, vendes i log
tests/ suite pytest (~25 tests)
## Tests
pytest # tota la suite; no toca el dades/ real
## Limitacions conegudes
- Sense autenticació: qualsevol pot usar l'API.
- JSON/CSV com a emmagatzematge: vàlid per a una llibreria, no per a mil.
- Sense desplegament: pensat per executar-se en local.Dos detalls que separen un README professional d'un d'ornamental: l'exemple d'ús copiable (el curl amb la seva resposta esperada: qui l'enganxa i veu el 18.67 ja confia en el projecte) i la secció de limitacions conegudes — documentar el que falta no és debilitat, és criteri; tot el software real la porta, encara que no sempre escrita.
La demostració: un guió de 10 minuts
Una demo sense guió ensenya pantalles; una demo amb guió explica una història. La història de Papyrus Online és "de la venda a la dada", i aquest ordre l'explica:
| Min | Què ensenyes | Què demostra |
|---|---|---|
| 0-1 | El README i l'arbre del projecte | Que hi ha un sistema organitzat, no un script |
| 1-3 | Una venda feliç: Faust + LLUIS-001 + PAPYRUS10 → 18.67 € |
RF2, RF3: el nucli del negoci, amb el número canònic |
| 3-5 | Dues vendes que fallen bé: sense estoc (409) i cupó fals (400), i els seus WARNING al log |
RF3, RF7: els errors formen part del disseny, no són accidents |
| 5-6 | cataleg.json abans i després: l'estoc persisteix després de reiniciar |
RF4: el sistema té memòria |
| 6-8 | L'informe: execució en viu, els números (520 u, dissabte 130) i el PNG | RF6: el sistema no només opera — entén |
| 8-9 | pytest -v: la suite en verd, en directe |
RNF1: res de l'anterior no és casualitat |
| 9-10 | Limitacions i una extensió que faries | Maduresa: saps on acaba el teu sistema |
Tres consells de demo: assaja-la una vegada sencera (la demo que no s'assaja, falla — llei empírica), tingues les ordres ja escrites en un fitxer per enganxar-les (teclejar en viu és llençar minuts), i ensenya una fallada controlada a propòsit: res no genera més confiança que un sistema rebutjant netament una venda impossible. Que no tens audiència? Grava't la pantalla seguint el guió. La disciplina d'explicar-ho en veu alta delata cada racó que no entens del tot — és autoavaluació disfressada de teatre.
L'informe final de dades com a lliurable
L'informe de RF6 no és un script que imprimeix números: és un document de negoci que l'Anna pugui llegir un dilluns al matí. El lliurable (un Markdown o PDF amb el PNG incrustat) ha de contenir exactament tres coses:
- Els números del període: total d'unitats i quantia, top 3 de títols, millor dia de la setmana, evolució mensual. Amb
vendes_2026.csv: 520 unitats al semestre, dissabte com a rei (130 u), abril desbocat (168 u). - El gràfic: un, no sis. El que millor explica la història del període (la barra mensual amb l'abril sobresortint, la de M11).
- Una recomanació accionable — la part que gairebé tothom omet i la que dona valor a tota la resta. El model és la comanda de Sant Jordi de 11-05:
«La regressió (MAE ±1.1 u/dia) projecta 172 unitats per a l'abril de 2027. Recomanació: comanda de 190 unitats (projecció + marge del ~10 %), repartida en dues quotes — 120 a principi d'abril, 70 la setmana prèvia a Sant Jordi — per limitar el risc de sobreestoc. Vigilar Faust: 210 visites i un 11.9 % de conversió suggereixen revisar-ne el preu abans de la campanya.»
Fixa't en l'anatomia: dada → recomanació concreta (amb número) → gestió del risc → decisió que queda en mans de l'Anna. Els models recomanen; les persones decideixen — la regla d'or de M11 també es lliura per escrit.
Autoavaluació honesta: la rúbrica
Sense professor, la nota te la poses tu — raó de més perquè l'escala sigui explícita. Avalua cada dimensió i anota el nivell a DECISIONS.md:
| Dimensió | Suficient | Bo | Excel·lent |
|---|---|---|---|
| Funcionalitat | RF1-RF4 complets; interfície parcial | Els 7 RF amb els seus criteris d'acceptació | Els 7 RF + algun extra amb criteri (p. ex. reposar a l'API) |
| Codi | Funciona; capes recognoscibles amb alguna fuita (negoci als endpoints) | Capes netes, type hints al core, errors propis a tot el flux | A més: noms que es llegeixen sols, funcions curtes, zero duplicació evident |
| Tests | La meitat de la suite mínima; algun test toca dades/ |
Suite mínima completa, aïllada amb tmp_path, integració inclosa |
A més: regressions documentades i el test del guardat atòmic |
| Documentació | README amb instal·lació | README complet amb ús copiable i limitacions | A més: DECISIONS.md amb perquès i informe de negoci amb recomanació |
Interpretació honesta: "Suficient" en tot ja és un èxit enorme — un sistema complet construït en solitari. "Bo" és l'estàndard professional raonable. "Excel·lent" és aspiracional: si ho has marcat tot excel·lent, o ets molt bo o has estat poc honest — i la rúbrica només serveix amb el segon descartat.
Retrospectiva personal: cinc preguntes
L'experiència no ensenya; l'experiència examinada ensenya. Tanca DECISIONS.md responent per escrit, amb calma:
- Què m'ha costat més del que esperava? (Assenyala la teva propera àrea d'estudi.)
- Què m'ha costat menys del que esperava? (Assenyala una fortalesa que potser no sabies que tenies.)
- Quina decisió de disseny repetiria i quina no? (Revisa la teva taula de decisions de 12-02 amb la veritat del codi al davant.)
- Quin ha estat el pitjor bug i què l'hauria evitat? (Un test abans, un contracte més clar, un tipus més ben definit…)
- Què faria diferent si comencés demà? (La resposta és la teva llista personal de lliçons apreses — val més que qualsevol resum nostre.)
Extensions possibles, ordenades per dificultat
Les idees aparcades a 12-01 tenen ara el seu lloc. Cadascuna amb el que hauries d'aprendre — perquè "voler fer-ho" sense saber què implica és com estimar sense dades:
| Extensió | Dificultat | Què hauries d'aprendre |
|---|---|---|
| Control de versions amb git | ★ | git bàsic (commit, branch, push) i GitHub. Comença per aquí: és l'eina número u de l'ofici i la vas trobar a faltar a 12-03 |
| Base de dades real | ★★ | SQL bàsic i sqlite3 (biblioteca estàndard) o SQLAlchemy; a Django ja la fas servir: seria migrar a PostgreSQL |
| Autenticació | ★★★ | Sessions i tokens, hashing de contrasenyes, flask-login o l'auth de Django; i les maneres com es fa malament (OWASP) |
| Desplegament | ★★★ | Linux bàsic, un PaaS senzill, variables d'entorn, gunicorn; opcionalment Docker |
| Front modern | ★★★★ | JavaScript de debò i un framework (React/Vue); la teva API REST ja està llesta per servir-lo |
| Més ML | ★★★★ | Estadística amb fonament, validació creuada, més models de scikit-learn; l'avís de 11-05 continua vigent: primer l'estadística, després els models |
Regla per triar: una extensió, portada fins a acabada, ensenya més que tres a mitges. Ja saps per què: ho has après acabant aquest projecte.
El viatge complet: de M1 a M12
Mira enrere un moment, perquè la distància recorreguda es veu millor des del final. A M1 vas escriure print("Hola, món!") i barallar-te amb el PATH era una aventura. A M2-M4 vas aprendre a pensar en control i estructures, i Papyrus era una llista amb quatre llibres. A M5 aquells llibres es van tornar objectes amb comportament; a M6 van sobreviure a un reinici; a M7 el sistema va aprendre a fallar amb elegància i a deixar-ne constància en un log. M8 et va donar les eines d'adult — type hints, decoradors, generadors, context managers — i M9 la que ho canvia tot: la capacitat de demostrar que el teu codi funciona. A M10 Papyrus va sortir al món per HTTP, dues vegades i de dues maneres. A M11 les seves dades van parlar: dissabtes de 130 unitats, un Sant Jordi de 168, un Faust que es mira i no es compra, una regressió que va projectar 172 i una llibretera que en va demanar 190. I a M12 no has après res de nou — has fet una cosa més difícil: ho has acoblat tot, sol, i funciona. Aquesta frase, fa dotze mòduls, era impensable. Aquesta frase és el curs.
Propers passos amb criteri
"I ara què?" té millor resposta si la tries per interès real, no per moda. Tres itineraris segons el que més has gaudit:
| Si has gaudit més… | Itinerari | Primers passos concrets |
|---|---|---|
| M10 i el disseny de l'API (backend) | Desenvolupament backend | git a fons → SQL i un ORM → un framework de debò (FastAPI o Django en profunditat) → desplegament i Docker |
| M11 i l'informe (dades) | Anàlisi / ciència de dades | Estadística amb fonament → pandas avançat → visualització seriosa → scikit-learn amb validació rigorosa → SQL (també aquí) |
| M6-M8 i els scripts que estalvien feina (automatització) | Automatització / scripting professional | git → argparse i CLIs → APIs de tercers (requests) → tasques programades → empaquetatge i distribució de les teves eines |
Els tres comparteixen dos peatges: git (ja no hi ha excusa) i anglès tècnic (la documentació de veritat viu allà). I un consell transversal: a partir d'aquí s'aprèn construint — tria projectes una mica més grans que la teva comoditat, com ho ha estat aquest.
Papyrus era teu des del principi
Una confessió final: Papyrus mai no va ser el tema del curs. Va ser un vehicle — prou petit per cabre en una lliçó, prou real per tenir estoc per quadrar, socis per validar i un Sant Jordi per planificar. El tema del curs eres tu treballant sobre la teva pròpia realitat. Així que l'últim exercici és obvi: mira la teva feina, el teu sector, el teu dia a dia. Què hi és, allà, el "catàleg"? Expedients, pòlisses, reserves, pacients, inventari? Què és la "venda amb regles": un càlcul amb descomptes, una validació amb excepcions, un procés que avui algú fa a mà? I quin informe li donaries a la teva "Anna"? Tot el que has construït aquí — capes, contractes, errors propis, tests, un CSV que es converteix en decisió — es trasllada tal qual. El primer projecte que facis sobre el teu domini serà més difícil que Papyrus, perquè ningú no et donarà els requisits numerats. També serà el que et canviï el perfil professional.
Errors Comuns i Consells
- Lliurar sense provar la instal·lació des de zero. Clona/copia el teu projecte a una altra carpeta, crea un venv nou i segueix el teu README al peu de la lletra. Fallarà en alguna cosa (una dependència no anotada, una ruta) — millor descobrir-ho tu que el teu lector.
- Demo sense assaig. El servidor que no arrenca, el JSON amb una coma de més… L'única vacuna és haver-la fet sencera una vegada abans.
- Informe de dades sense recomanació. Números sense decisió proposada és feina a mitges; la recomanació (amb el seu risc gestionat) és el que l'Anna no pot demanar-li a un full de càlcul.
- Autoavaluar-se a l'alça… o a la baixa. Inflar-se impedeix créixer; matxucar-se, continuar. La rúbrica existeix per treure't de tots dos llocs: nivell per dimensió, amb evidència.
- No tancar mai. Sempre hi haurà un refactor més, una extensió més. Els projectes es lliuren: versió 1.0, README honest amb limitacions, i el següent ja és la versió 2 — o el següent projecte.
Exercicis
- Fita final — el paquet de lliurament. Completa el README amb la plantilla, verifica la instal·lació des de zero en un venv nou, i genera l'informe de negoci (números + PNG + recomanació) com a
INFORME.md. Verificació: una persona de confiança (o tu mateix, en una altra màquina o una altra carpeta, seguint només el README) arrenca el sistema i executa els tests sense ajuda. - Fita final — la demo. Prepara el guió de 10 minuts amb les teves ordres en un fitxer
demo.md, assaja-la una vegada completa i, si pots, grava-la o ensenya-la a algú. Verificació: l'executes sencera sense improvisar ni consultar res fora del guió. - Fita final — tancament i pas següent. Omple la rúbrica i les cinc preguntes de la retrospectiva a
DECISIONS.md, tria el teu itinerari de la taula de propers passos i escriu la primera acció concreta amb data ("dissabte: curs bàsic de git"). Verificació: l'acció és tan concreta que dissabte sabràs exactament què obrir.
Solucions
- No hi ha solució per copiar: hi ha un senyal d'èxit — la persona que segueix el teu README no et fa cap pregunta. Cada pregunta que et faci és una línia que li falta al README; afegeix-la i considera l'exercici en curs fins que les preguntes siguin zero.
- Orientativa: les fallades d'assaig més comunes són el servidor arrencat des de la carpeta equivocada (rutes relatives — 12-03 ho va avisar) i les dades "brutes" de proves anteriors; tingues un
dades/de demo net i preparat. Si en narrar un pas no saps explicar per què funciona, apunta-t'ho: és l'última lliçó del curs dient-te on repassar. - Exemple d'acció ben formulada: «Dissabte 10:00: tutorial oficial de git fins al branching; crear el repo de Papyrus Online i fer el primer commit amb la versió lliurada.» Mal formulada: «aprendre git aviat». La diferència entre l'una i l'altra és la mateixa que fa dotze mòduls que practiques: el verificable davant del vague.
Conclusió
S'ha acabat — i aquesta vegada no hi ha "a la propera lliçó". Vas començar aquest curs escrivint una línia que saludava el món i l'acabes amb un sistema complet que gestiona un negoci: domini amb regles i errors propis, persistència que no perd dades, una interfície que el serveix, una suite de tests que ho demostra i un informe que converteix vendes en decisions. Més important que qualsevol peça: has demostrat que pots rebre requisits, dissenyar, construir, verificar i lliurar sense que ningú et porti de la mà. Això no s'oblida com s'oblida una sintaxi; és un canvi de categoria. T'emportes un mètode (contractes abans que codi, validar-calcular-mutar, cada bug deixa el seu test, els models recomanen i les persones decideixen), un projecte real per ensenyar, i un mapa de passos següents triat amb criteri. La llibreria de l'Anna queda en bones mans — les teves són les que l'han construïda. Ara ves i fes-li al teu propi domini el que li has fet a Papyrus. Ha estat un privilegi acompanyar-te des del print("Hola, món!"). La resta del camí es recorre igual que aquest: una línia, un test i un projecte cada vegada. Bon viatge, i bon codi.
Curs de Programació en Python
Mòdul 1: Introducció a Python
- Introducció a Python
- Configuració de l'Entorn de Desenvolupament
- Sintaxi de Python i Tipus de Dades Bàsics
- Variables i Constants
- Entrada i Sortida Bàsica
- Entorns Virtuals i Gestió de Paquets
Mòdul 2: Estructures de Control
Mòdul 3: Funcions i Mòduls
- Definició de Funcions
- Arguments de Funció
- Funcions Lambda
- Mòduls i Paquets
- Visió General de la Biblioteca Estàndard
Mòdul 4: Estructures de Dades
Mòdul 5: Programació Orientada a Objectes
Mòdul 6: Gestió de Fitxers
- Lectura i Escriptura de Fitxers
- Treball amb Fitxers CSV
- Gestió de Dades JSON
- Operacions amb Fitxers i Directoris
Mòdul 7: Gestió d'Errors i Excepcions
- Introducció a les Excepcions
- Gestió d'Excepcions
- Llançament d'Excepcions
- Excepcions Personalitzades
- Bones Pràctiques i Registre d'Errors amb logging
Mòdul 8: Temes Avançats
- Anotacions de Tipus (type hints)
- Decoradors
- Generadors
- Gestors de Context
- Concurrència: Fils i Processos
- Asyncio per a la Programació Asíncrona
Mòdul 9: Proves i Depuració
- Introducció a les Proves
- Proves Unitàries amb unittest
- Proves amb pytest
- Desenvolupament Guiat per Proves
- Tècniques de Depuració
- Ús de pdb per a la Depuració
Mòdul 10: Desenvolupament Web amb Python
- Introducció al Desenvolupament Web
- Fonaments del Framework Flask
- Construcció d'APIs REST amb Flask
- Introducció a Django
- Construcció d'Aplicacions Web amb Django
Mòdul 11: Ciència de Dades amb Python
- Introducció a la Ciència de Dades
- NumPy per a la Computació Numèrica
- Pandas per a la Manipulació de Dades
- Matplotlib per a la Visualització de Dades
- Introducció a l'Aprenentatge Automàtic amb scikit-learn
