Closing · Lesson 94 of 94

Course wrap-up

Watch this lesson

View full playlist ↗

Read the lesson

What you'll learn

Concept

Ninety-two lessons ago you installed Python and printed a line of text. Since then you have learned a language, then how to organize code into objects and modules, then how professionals write it, with types, tests, and lazy pipelines, and finally how it is shipped: packaged, configured, containerized, checked on every push. The distance between lesson 2 and lesson 90 is the distance between someone who can write Python and someone a team can rely on. You covered it one small idea at a time, which is the only way anyone ever does.

Course wrap-up: Fundamentals; print, variables, loops, functions → Beginner; collections, files, OOP, stdlib → Advanced; generators, decorators, typing, tests, HTTP → Expert; concurrency, packaging, CI, Docker, security → production-ready developer
Course wrap-up · Figure 1 · Open for full size

The facts will fade and come back when you need them; help() and the documentation are always there. What stays are the habits, and they are what this course was really teaching. Read the error message from the bottom. Measure before you optimize. Never build a command or a query from untrusted text. Keep the library free of the shell around it. Write the test before you trust the code. Pin the versions. Name the thing after what it means. Commit small and explain why. Configure from outside. Log, do not print. Read other people's code every week.

Habit Lesson where it took root
read tracebacks bottom-up Reading error messages
one concept per function, one job per class Functions; Composition and object design
test the behavior, mock the boundary Testing with pytest; Mocking and testing side effects
measure, then fix the order of growth Algorithmic complexity; Profiling
never let data become code Databases with sqlite3; Security essentials
configuration and secrets outside code Configuration and secrets
lock, lint, type-check, test, on every push Project structure; Code quality and CI
finish small things, then reflect every project lesson; How to keep practicing

You also built four things you can show: a quiz game, a file organizer, a typed and tested library, and a packaged, containerized command with CI. They are proof, and they are a template. The next project starts from the capstone's shell and is about the problem, not the plumbing.

Next week has three tasks and you already know them. Start the first project on the path you chose in lesson 91. Write your learning_log.md line after each session. Send the scope document to one real person. Everything else follows from those, at the pace of a lesson a day, which is how you got here.

Course wrap-up: this week: start the project · log the session · send the scope → next month: a finished project and a first PR → next year: work you are paid for, code others depend on
Course wrap-up · Figure 2 · Open for full size

Thank you for spending this time with the course. Teaching is the last stage of learning, and building these lessons taught me the language again. You did the harder part: you typed every example, ran into every error, and kept going. That persistence is the actual skill, and it is now yours. Go build something, then tell someone about it.

Code

Where you started, and where you ended, in the same file. The first block is lesson 2's program; the second is a compressed version of what the capstone can do. Both are real Python; the gap between them is you.

# then_and_now.py
print("Hello, world!")

# --- ninety lessons later ---
import json
import logging
from dataclasses import dataclass
from datetime import date

logging.basicConfig(level=logging.INFO, format="%(levelname)s %(message)s")
log = logging.getLogger("expenses")


@dataclass(frozen=True, order=True)
class Expense:
    day: date
    category: str
    amount: float


def report(expenses: list[Expense]) -> str:
    by_category: dict[str, float] = {}
    for e in sorted(expenses):
        by_category[e.category] = round(by_category.get(e.category, 0) + e.amount, 2)
    log.info("reported %d expenses", len(expenses))
    return json.dumps({"total": round(sum(e.amount for e in expenses), 2), "by_category": by_category})


print(report([Expense(date(2026, 9, 1), "rent", 950), Expense(date(2026, 9, 2), "food", 12.5)]))
Output
Hello, world!
INFO reported 2 expenses
{"total": 962.5, "by_category": {"rent": 950, "food": 12.5}}

The course by the numbers, computed rather than claimed: what you actually worked through.

# by_the_numbers.py
levels = {"Fundamentals": 21, "Beginner": 28, "Advanced": 22, "Expert": 19, "Closing": 4}
projects = ["quiz game", "file organizer", "typed tested library", "production package (capstone)"]
minutes = 854

print("lessons:", sum(levels.values()), "|", ", ".join(f"{k} {v}" for k, v in levels.items()))
print("projects built:", len(projects), "->", "; ".join(projects))
print(f"video: about {minutes // 60} hours {minutes % 60} minutes; typing and exercises: many more")
print("next step: one lesson-sized session, tomorrow")
Output
lessons: 94 | Fundamentals 21, Beginner 28, Advanced 22, Expert 19, Closing 4
projects built: 4 -> quiz game; file organizer; typed tested library; production package (capstone)
video: about 14 hours 14 minutes; typing and exercises: many more
next step: one lesson-sized session, tomorrow

Try it yourself

Open the folder where you did the first exercise and run hello.py once more. Then open the capstone and run its test suite. Write one paragraph in your learning log about what changed between those two commands, and schedule tomorrow's session.

Common mistakes

What's next

That is the end of Python: Beginner to Production. Thank you for learning with Hexcursion Studio.

Course overview