The system is built and verified; what remains is the last act of the craft: delivering it. Delivering is not sending a ZIP — it is making it possible for someone else to install it without you, understand what it does and why, and see in ten minutes that it works. In this lesson you will write the definitive README, prepare a scripted demo, write the data report as a business deliverable (with the Sant Jordi order as the model), grade yourself with an honest rubric and run the retrospective that turns experience into learning. And since this is the last lesson of the course, we will end where one should end: looking back over the whole road from print("Hello, World") to here, and deciding — with judgment — what your next step is.
Contents
- Documenting for others: the complete README
- The demo: a 10-minute script
- The final data report as a deliverable
- Honest self-assessment: the rubric
- Personal retrospective: five questions
- Possible extensions, ranked by difficulty
- The whole journey: from M1 to M12
- Next steps with judgment
- Papyrus was yours from the start
Documenting for others: the complete README
The README is the front door of the project: it is written for someone who wasn't there (including your six-months-from-now self, who won't be either). The acid test is literal: another person, with only the README, starts the project without asking you a single question. A real template, section by section:
# Papyrus Online
Management system for the Papyrus bookshop: catalog, members, sales
with coupons, a REST API and a monthly data report.
Final project of the Python Programming course.
## What it does
- Catalog management (CRUD) and members with a 5 % discount.
- Sales with stock control, coupons (PAPYRUS10, MEMBER5) and VAT.
- REST API (Flask): /api/books and /api/sales. ← or the Django site
- Monthly report with pandas and a chart (Matplotlib).
- JSON/CSV persistence with atomic saves and logging.
## Installation
python -m venv .venv
.venv\Scripts\activate # Windows (source .venv/bin/activate on Linux/Mac)
pip install -r requirements.txt
## Usage
python app.py # API at http://localhost:5000
# Sell one Faust to a member with a coupon:
curl -X POST http://localhost:5000/api/sales \
-H "Content-Type: application/json" \
-d '{"title": "Faust", "units": 1,
"member": "LUIS-001", "coupon": "PAPYRUS10"}'
# → {"amount": 18.67, ...}
python -m papyrus.report # generates data/report_2026.png
## Structure
papyrus/ business logic (models, services, repositories)
app.py Flask interface (only translates HTTP ↔ services)
data/ catalog, members, sales and log
tests/ pytest suite (~25 tests)
## Tests
pytest # the whole suite; never touches the real data/
## Known limitations
- No authentication: anyone can use the API.
- JSON/CSV as storage: fine for one bookshop, not for a thousand.
- No deployment: meant to run locally.Two details that separate a professional README from a decorative one: the copy-pastable usage example (the curl with its expected response: whoever pastes it and sees the 18.67 already trusts the project) and the known limitations section — documenting what is missing is not weakness, it is judgment; all real software has one, even when it isn't written down.
The demo: a 10-minute script
A demo without a script shows screens; a demo with a script tells a story. The story of Papyrus Online is "from the sale to the data", and this order tells it:
| Min | What you show | What it proves |
|---|---|---|
| 0-1 | The README and the project tree | That there is an organized system, not a script |
| 1-3 | A happy sale: Faust + LUIS-001 + PAPYRUS10 → 18.67 EUR |
FR2, FR3: the core of the business, with the canonical number |
| 3-5 | Two sales that fail well: no stock (409) and a fake coupon (400), and their WARNINGs in the log |
FR3, FR7: errors are part of the design, not accidents |
| 5-6 | catalog.json before and after: the stock persists across a restart |
FR4: the system has memory |
| 6-8 | The report: a live run, the numbers (520 u, Saturday 130) and the PNG | FR6: the system doesn't just operate — it understands |
| 8-9 | pytest -v: the suite going green, live |
NFR1: none of the above is a coincidence |
| 9-10 | Limitations and one extension you would build | Maturity: you know where your system ends |
Three demo tips: rehearse it once in full (the unrehearsed demo fails — an empirical law), keep the commands pre-written in a file to paste them (typing live is throwing minutes away), and show a controlled failure on purpose: nothing builds more trust than a system cleanly rejecting an impossible sale. No audience? Record your screen while following the script. The discipline of narrating it out loud exposes every corner you don't fully understand — it is self-assessment disguised as theater.
The final data report as a deliverable
The FR6 report is not a script that prints numbers: it is a business document Ana can read on a Monday morning. The deliverable (a Markdown or PDF with the PNG embedded) must contain exactly three things:
- The period's numbers: total units and amount, top 3 titles, best day of the week, monthly evolution. With
sales_2026.csv: 520 units over the half-year, Saturday as king (130 u), April running wild (168 u). - The chart: one, not six. The one that best tells the period's story (the monthly bar chart with April towering, the one from M11).
- One actionable recommendation — the part almost everyone omits and the one that gives value to everything else. The model is the Sant Jordi order from 11-05:
"The regression (MAE ±1.1 units/day) projects 172 units for April 2027. Recommendation: an order of 190 units (projection + a ~10 % margin), split into two batches — 120 at the start of April, 70 in the week before Sant Jordi — to limit overstock risk. Watch Faust: 210 visits and an 11.9 % conversion rate suggest reviewing its price before the campaign."
Look at the anatomy: data → concrete recommendation (with a number) → risk management → a decision that stays in Ana's hands. Models recommend; people decide — M11's golden rule is also delivered in writing.
Honest self-assessment: the rubric
With no teacher, you set your own grade — all the more reason for the scale to be explicit. Assess each dimension and note the level in DECISIONS.md:
| Dimension | Sufficient | Good | Excellent |
|---|---|---|---|
| Functionality | FR1-FR4 complete; partial interface | All 7 FRs with their acceptance criteria | All 7 FRs + some extra with judgment (e.g. restock in the API) |
| Code | It works; recognizable layers with some leaks (business in endpoints) | Clean layers, type hints in the core, custom errors throughout the flow | Plus: names that read themselves, short functions, zero obvious duplication |
| Tests | Half the minimum suite; some test touches data/ |
Full minimum suite, isolated with tmp_path, integration included |
Plus: documented regressions and the atomic-save test |
| Documentation | README with installation | Complete README with copy-pastable usage and limitations | Plus: DECISIONS.md with the whys and a business report with a recommendation |
An honest reading: "Sufficient" across the board is already a huge achievement — a complete system built alone. "Good" is the reasonable professional standard. "Excellent" is aspirational: if you marked everything excellent, either you are very good or you weren't very honest — and the rubric only works once the second option is ruled out.
Personal retrospective: five questions
Experience doesn't teach; examined experience does. Close DECISIONS.md by answering in writing, calmly:
- What cost me more than expected? (It points to your next area of study.)
- What cost me less than expected? (It points to a strength you perhaps didn't know you had.)
- Which design decision would I repeat, and which not? (Review your 12-02 decisions table with the truth of the code in front of you.)
- What was the worst bug and what would have prevented it? (An earlier test, a clearer contract, a better-defined type…)
- What would I do differently if I started tomorrow? (The answer is your personal list of lessons learned — worth more than any summary of ours.)
Possible extensions, ranked by difficulty
The ideas parked in 12-01 now have their place. Each with what you would have to learn — because "wanting to do it" without knowing what it involves is like estimating without data:
| Extension | Difficulty | What you would have to learn |
|---|---|---|
| Version control with git | ★ | Basic git (commit, branch, push) and GitHub. Start here: it is the number-one tool of the trade and you missed it in 12-03 |
| A real database | ★★ | Basic SQL and sqlite3 (standard library) or SQLAlchemy; in Django you already use one: it would mean migrating to PostgreSQL |
| Authentication | ★★★ | Sessions and tokens, password hashing, flask-login or Django's auth; and the ways it gets done wrong (OWASP) |
| Deployment | ★★★ | Basic Linux, a simple PaaS, environment variables, gunicorn; optionally Docker |
| A modern front end | ★★★★ | JavaScript in earnest and a framework (React/Vue); your REST API is already ready to serve it |
| More ML | ★★★★ | Statistics with foundations, cross-validation, more scikit-learn models; the 11-05 warning still stands: first the statistics, then the models |
A rule for choosing: one extension, carried to completion, teaches more than three left halfway. You already know why: you learned it by finishing this project.
The whole journey: from M1 to M12
Look back for a moment, because the distance traveled is best seen from the end. In M1 you wrote print("Hello, World") and fighting the PATH was an adventure. In M2-M4 you learned to think in control flow and structures, and Papyrus was a list with four books. In M5 those books became objects with behavior; in M6 they survived a restart; in M7 the system learned to fail with grace and to leave a record in a log. M8 gave you the grown-up tools — type hints, decorators, generators, context managers — and M9 the one that changes everything: the ability to prove that your code works. In M10 Papyrus went out into the world over HTTP, twice and in two ways. In M11 its data spoke: Saturdays of 130 units, a Sant Jordi of 168, a Faust that gets looked at but not bought, a regression that projected 172 and a bookseller who ordered 190. And in M12 you learned nothing new — you did something harder: you assembled it all, alone, and it works. That sentence, twelve modules ago, was unthinkable. That sentence is the course.
Next steps with judgment
"Now what?" has a better answer if you choose it out of real interest, not fashion. Three paths depending on what you enjoyed most:
| If you enjoyed most… | Path | Concrete first steps |
|---|---|---|
| M10 and designing the API (backend) | Backend development | git in depth → SQL and an ORM → a framework in earnest (FastAPI or deep Django) → deployment and Docker |
| M11 and the report (data) | Data analysis / data science | Statistics with foundations → advanced pandas → serious visualization → scikit-learn with rigorous validation → SQL (here too) |
| M6-M8 and the scripts that save work (automation) | Professional automation / scripting | git → argparse and CLIs → third-party APIs (requests) → scheduled tasks → packaging and distributing your tools |
All three share two tolls: git (no more excuses) and technical English (the real documentation lives there). And one cross-cutting piece of advice: from here on you learn by building — pick projects a bit bigger than your comfort zone, the way this one was.
Papyrus was yours from the start
A final confession: Papyrus was never the subject of the course. It was a vehicle — small enough to fit in a lesson, real enough to have stock to reconcile, members to validate and a Sant Jordi to plan for. The subject of the course was you, working on your own reality. So the last exercise is obvious: look at your job, your industry, your day-to-day. What is the "catalog" there? Case files, policies, bookings, patients, inventory? What is the "sale with rules": a calculation with discounts, a validation with exceptions, a process someone does by hand today? And what report would you hand to your "Ana"? Everything built here — layers, contracts, custom errors, tests, a CSV that turns into a decision — carries over as is. The first project you build on your domain will be harder than Papyrus, because nobody will hand you numbered requirements. It will also be the one that changes your professional profile.
Common Mistakes and Tips
- Shipping without testing the installation from scratch. Clone/copy your project to another folder, create a fresh venv and follow your README to the letter. It will fail on something (an unlisted dependency, a path) — better that you discover it than your reader.
- A demo without a rehearsal. The server that won't start, the JSON with one comma too many… The only vaccine is having run it once in full beforehand.
- A data report without a recommendation. Numbers without a proposed decision is work half done; the recommendation (with its risk managed) is the thing Ana cannot ask of a spreadsheet.
- Grading yourself up… or down. Inflating yourself blocks growth; beating yourself up blocks continuing. The rubric exists to pull you out of both: a level per dimension, with evidence.
- Never closing. There will always be one more refactor, one more extension. Projects get delivered: version 1.0, an honest README with limitations, and whatever comes next is version 2 — or the next project.
Exercises
- Final milestone — the delivery package. Complete the README with the template, verify the installation from scratch in a fresh venv, and produce the business report (numbers + PNG + recommendation) as
REPORT.md. Verification: a person you trust (or you yourself, on another machine or in another folder, following only the README) starts the system and runs the tests without help. - Final milestone — the demo. Prepare the 10-minute script with your commands in a
demo.mdfile, rehearse it once in full and, if you can, record it or show it to someone. Verification: you run it end to end without improvising or consulting anything outside the script. - Final milestone — closure and next step. Fill in the rubric and the five retrospective questions in
DECISIONS.md, pick your path from the next-steps table and write the first concrete action with a date ("Saturday: basic git course"). Verification: the action is so concrete that on Saturday you will know exactly what to open.
Solutions
- There is no solution to copy: there is a success signal — the person following your README asks you zero questions. Every question they ask is a line your README is missing; add it and consider the exercise in progress until the questions reach zero.
- Reference: the most common rehearsal failures are the server launched from the wrong folder (relative paths — 12-03 warned you) and "dirty" data from earlier trials; keep a clean demo
data/ready. If while narrating a step you can't explain why it works, write it down: it is the course's last lesson telling you where to review. - An example of a well-formed action: "Saturday 10:00: the official git tutorial through branching; create a repo for Papyrus Online and make the first commit with the delivered version." Badly formed: "learn git soon". The difference between the two is the same one you have been practicing for twelve modules: the verifiable versus the vague.
Conclusion
It's over — and this time there is no "in the next lesson". You began this course writing one line that greeted the world, and you finish it with a complete system that runs a business: a domain with rules and custom errors, persistence that loses no data, an interface that serves it, a test suite that proves it and a report that turns sales into decisions. More important than any single piece: you have shown that you can take requirements, design, build, verify and deliver with nobody holding your hand. That is not forgotten the way syntax is forgotten; it is a change of category. You take with you a method (contracts before code, validate-compute-mutate, every bug leaves its test, models recommend and people decide), a real project to show, and a map of next steps chosen with judgment. Ana's bookshop is in good hands — yours were the ones that built it. Now go and do to your own domain what you have done to Papyrus. It has been a privilege to walk with you since print("Hello, World"). The rest of the road is traveled the same way as this one: one line, one test and one project at a time. Safe travels, and good code.
Python Programming Course
Module 1: Introduction to Python
- Introduction to Python
- Setting Up the Development Environment
- Python Syntax and Basic Data Types
- Variables and Constants
- Basic Input and Output
- Virtual Environments and Package Management
Module 2: Control Structures
Module 3: Functions and Modules
- Defining Functions
- Function Arguments
- Lambda Functions
- Modules and Packages
- Standard Library Overview
Module 4: Data Structures
Module 5: Object-Oriented Programming
Module 6: File Handling
Module 7: Error and Exception Handling
- Introduction to Exceptions
- Handling Exceptions
- Raising Exceptions
- Custom Exceptions
- Best Practices and Error Logging
Module 8: Advanced Topics
- Type Hints
- Decorators
- Generators
- Context Managers
- Concurrency: Threads and Processes
- Asyncio for Asynchronous Programming
Module 9: Testing and Debugging
- Introduction to Testing
- Unit Testing with unittest
- Testing with pytest
- Test-Driven Development
- Debugging Techniques
- Using pdb for Debugging
Module 10: Web Development with Python
- Introduction to Web Development
- Flask Framework Fundamentals
- Building REST APIs with Flask
- Introduction to Django
- Building Web Applications with Django
Module 11: Data Science with Python
- Introduction to Data Science
- NumPy for Numerical Computing
- Pandas for Data Manipulation
- Matplotlib for Data Visualization
- Introduction to Machine Learning with scikit-learn
