AmouAI Hub/Courses/Programming Fundamentals/Day 25
Testing, Delivery & Course Synthesis
Ship it. Then trace the through-line from print("hello") to a two-language OOP system, and see where it leads into AI and data science.
By the end of today you can
- Run a final testing pass that finds things, rather than confirming what works
- Write a README someone else can actually start from
- Package and submit a project cleanly
- Trace the through-line across all 25 days
- Name what you would learn next, and why
- Say what you can now do that you could not on Day 1
▶Today's videos
Watch each video, then work the matching sections below. Watching alone will not do it.
print("hello") to a two-language OOP system · NumPy, pandas and where this leads next.1The final testing pass
Try to break it. That is the job.
Every test you have written so far was trying to confirm the program works. For this hour, you are trying to make it fail. Those are different activities and they find different things.
| Attack | Try | Should |
|---|---|---|
| Empty | No data, empty file, empty string, zero items | Explain, not crash |
| One | Exactly one item — the classic off-by-one | Be correct |
| Boundary | The limit, and one either side | Be correct at all three |
| Wrong type | Letters where numbers go | Reject with a clear message |
| Huge | 10,000 items | Finish. If not — Day 11 |
| Hostile | Quotes, commas, newlines, emoji in text fields | Round-trip intact |
| Interrupted | Kill it mid-write, then reload | Not corrupt the data |
| Repeated | The same action twice | Be idempotent or refuse clearly |
A contact named O'Brien or an address containing a comma will break a hand-rolled CSV writer instantly. This is why Day 10 said do not write your own parser. Test it with a real apostrophe.
Coverage, and its limits
pip install pytest-cov
pytest --cov=. --cov-report=term-missingCoverage tells you which lines ran during your tests. That is genuinely useful for finding whole functions nobody exercises. But 100% coverage does not mean correct — a test that runs a line without asserting anything about it counts just the same. Use it to find gaps, not to award yourself a grade.
2Packaging and delivery
Someone else has to run this.
expense-tracker/
├── README.md
├── requirements.txt
├── .gitignore
├── src/
│ ├── models.py
│ ├── storage.py
│ └── main.py
├── tests/
│ ├── test_models.py
│ └── test_storage.py
└── data/
└── .gitkeepThe README, in order
- What it does — one paragraph, no jargon.
- How to install — the exact commands, copy-pasteable.
- How to run — the exact command.
- How to test —
pytest, and what a pass looks like. - Design notes — the structure, and one or two decisions you made and why.
- Known limitations — what does not work, and what you would do next.
An honest limitations section reads as judgement. Pretending a known gap does not exist reads as not having looked. Every experienced reviewer would rather see "search is case-sensitive; I would normalise on input" than discover it themselves.
Before you submit
- Clone it into a fresh folder and follow your own README exactly. It will fail. Fix that.
- No absolute paths, no
/Users/yourname/. - No secrets, no API keys, no personal data.
.gitignorecovers__pycache__/,.venv/,*.class, editor folders.- The tests pass on a clean checkout, not just on your machine.
The fresh-clone check catches it in five minutes, and it is the single highest-value thing on this page.
3The through-line
Twenty-five days, one argument.
| Days | What you learned | What it was really for |
|---|---|---|
| 1–5 | Variables, types, conditionals, loops, debugging | Programs are state that changes over time — and you can watch it |
| 6–7 | Functions, scope, recursion | Naming an idea is how you stop holding it all in your head |
| 8–10 | Lists, dicts, sets, files, modules | Choosing the right structure decides how hard everything else is |
| 11 | Algorithms and Big-O | Cost is a property you can reason about before measuring |
| 12–14 | Classes, encapsulation, inheritance | Bundling data with behaviour, and drawing boundaries |
| 15 | Exceptions and testing | Making failure explicit, and provable |
| 16–21 | Java | Which parts were the idea and which were Python's spelling |
| 22–25 | Craft, comparison, capstone | Software is written for people, and finishing is a skill |
Every day of this course was about managing complexity so it fits in a human head. Functions, data structures, classes, interfaces, modules and tests are all the same move: draw a boundary, name what is inside it, and let yourself stop thinking about the rest.
What you can do now
- Write a program of a few hundred lines and still be able to change it
- Read a traceback and go straight to the cause
- Choose a data structure for a reason you can state
- Decompose a problem into functions and classes with honest names
- Write tests that would catch your own mistakes
- Read code in two languages, and learn a third from documentation
- Finish something — which is rarer than it sounds
Where this leads
| Next | Uses | Because |
|---|---|---|
| NumPy | Lists → arrays | Whole-array operations instead of loops; Day 11's cost lesson applied |
| pandas | Dicts of lists → DataFrames | Day 9's grouping and counting, at scale |
| Testing at depth | Day 15 and 21 | Fixtures, mocking, property-based testing |
| Databases and SQL | Day 10's persistence | When a CSV stops being enough |
| Web APIs | Day 10's JSON, Day 12's classes | The same structures, over a network |
| ML frameworks | Days 12–14 | PyTorch and scikit-learn are OOP designs — Model, Layer, fit |
Do not start another course tomorrow. Build a second thing — something you actually want to exist, without a brief telling you what to do. The gap between following instructions and choosing your own is the last one this course cannot close for you, and the only way across is to build something nobody asked for.
The LM Playground builds a language model from scratch, and Diffusion Playground builds an image generator. Both assume exactly what you now have.
>_Python playground
A real Python interpreter running inside your browser. Nothing is installed, nothing is uploaded, nothing can break.
input(), comma separated →
✓Exercise set
Checked automatically the moment you submit. Work top to bottom — each one assumes the last. Your answers are saved in this browser.
That is the course
Twenty-five days, two languages, four mini-projects and a capstone. Now go and build something nobody asked you to build.