1. Build a synchronous API
Begin with a request you can explain and a response you can test. Then make that small application reproducible through configuration, health checks and declared dependencies.
Read and practise · Nine modules · 26 lessons
Build a first HTTP endpoint, then work through validation, PostgreSQL, testing, authentication, async I/O and delivery.
Read every lesson in any order without an account. Knowledge checks are optional practice; they never block reading. Certificates are not available.
Your place can be remembered on this device. Sign in to save across devices.
Begin with a request you can explain and a response you can test. Then make that small application reproducible through configuration, health checks and declared dependencies.
Now that the application runs, decide what callers may send and what they can expect back. Shape validated resources, organize routes and make failure responses dependable.
The in-memory service loses its state on restart. Add synchronous PostgreSQL, give sessions clear ownership and record the schema through an explicit Alembic migration.
Persistence adds new promises: a successful response follows a committed change, pages have stable boundaries, capacity decisions survive contention and migrations preserve existing rows.
With synchronous persistence understood, explore what happens while work waits. Convert database I/O to async, retain the HTTP behavior and give concurrent tasks independent sessions.
Identify a local synthetic user, validate a JWT and decide what that current user may do. Carry the same role and ownership decisions into an alternative policy representation.
External work can be malformed, slow or unavailable. Validate provider responses, bound retries and deadlines, then admit only the background work the process can handle.
Follow requests across their work without exposing secrets. Distinguish operational signals, then investigate a deliberate pagination incident with a failing regression and a precise repair.
Rehearse the application from declared inputs in a fresh environment. Finish with a complete domain change whose migration, permissions, transaction and evidence another person can review.