Curriculum
Every lesson across all tracks and tiers. Filter by topic, and your completed lessons are checked off automatically as you go.
Overall progress0/399 lessons
Fundamentals
Beginner
- What is a program?foundationsmental-models
- How a computer runs your codefoundationsmental-models
- Data and typesfoundationsmental-models
- Logic and control flowfoundationsmental-models
- Decompositionfoundationsmental-models
- Reading error messages and stack tracesfoundationsdebugging
- Working with an AI coding agentfoundationsai-agents
- The shape of a projectfoundationsproject-structure
- Lab: reason about a programLabfundamentalslab
- How to read documentationfoundationsdocumentation
- Reading a reference entrydocumentationself-reliance
- Finding answers yourselfdocumentationself-reliance
- Searching effectivelydocumentationself-reliance
- Lab: find the answerLabfundamentalslab
- Version control, conceptuallyfoundationsversion-control
- Your first repositorygitself-reliance
- Seeing what changedgitself-reliance
- Branching and switchinggitself-reliance
- Working with remotesgitself-reliance
- Lab: run the git workflowLabfundamentalsgit
Intermediate
- Systems thinkingsystemsarchitecture
- Abstraction and interfacessystemsarchitecture
- Data structures: choosing the right shapesystemsdata-structures
- Algorithms and complexitysystemsalgorithms
- Reading unfamiliar source codesystemsreading-code
- Software architecture basicssystemsarchitecture
- APIs and protocolssystemsapis
- Concurrencysystemsconcurrency
- Testing and verificationsystemstesting
- Designing with AI agentssystemsai-agents
- Debugging as a disciplinesystemsdebugging
- Performance and tradeoffssystemsperformance
- Lab: think in systemsLabfundamentalslab
- Writing a README people usedocumentationwriting
- Docstrings and commentsdocumentationwriting
- Writing a good commit messagedocumentationgit
- Architecture Decision Recordsdocumentationarchitecture
- Changelogs and release notesdocumentationwriting
- Lab: document it wellLabfundamentalslab
- Merge vs rebasegitself-reliance
- Resolving conflicts by handgitdebugging
- Undoing anythinggitself-reliance
- Stash and cherry-pickgitself-reliance
- Reviewing changes and pull requestsgitreview
- Finding a bad commit with git bisectgitdebugging
- Lab: handle git troubleLabfundamentalsgit
Advanced
- Build and release pipelinesproductiondelivery
- Deployment strategiesproductiondelivery
- Configuration and environmentsproductiondelivery
- Lab: ship safelyLabfundamentalslab
- Logging, metrics, and tracingoperationsobservability
- Monitoring and alertingoperationsobservability
- Incident responseoperationsincidents
- Lab: diagnose in productionLabfundamentalslab
- Thinking like an attackersecurity
- Authentication and authorizationsecurity
- Secrets and dependenciessecurity
- Common vulnerabilitiessecurity
- Lab: spot the vulnerabilityLabfundamentalslab
- Why distributed is harddistributed-systems
- State and consistencydistributed-systems
- Cachingdistributed-systemsperformance
- Designing for failuredistributed-systemsreliability
- Lab: reason about distributionLabfundamentalslab
- Measure before you scaleperformancescaling
- Scaling strategiesperformancescaling
- Load testing and bottlenecksperformancescaling
- Lab: scale deliberatelyLabfundamentalslab
Python
Beginner
- Variables and typespythonsyntax
- Control flowpythonsyntax
- Functionspythonsyntax
- Stringspythonsyntax
- Lab: text and numbersLabpythonlab
- Lists and tuplespythonsyntax
- Dictionaries and setspythonsyntax
- Lab: choosing the right structureLabpythonlab
- Errors and exceptionspythonsyntax
- Modules and importspythonsyntax
- Boolean logicpythonsyntax
- Reading and writing filespythonfiles
- Working with strings in depthpythonstrings
- Lab: filter and reportLabpythonlab
Intermediate
- Comprehensionspythonidioms
- Generatorspythonidioms
- Lab: think in comprehensionsLabpythonlab
- Decoratorspythonidioms
- Classes and dataclassespythonidioms
- Context managerspythonidioms
- Type hintspythonidioms
- Reading and writing CSVpythondata-io
- Working with JSONpythondata-io
- Data transformation patternspythondata-io
- String manipulation and pattern matchingpythondata-io
- Lab: data pipelineLabpythonlab
Advanced
- The GIL, threads, and processespythonconcurrency
- asynciopythonconcurrency
- Profiling and optimizationpythonperformance
- Lab: make it fast and correctLabpythonlab
- Virtual environments and pippythontooling
- Packaging with pyprojectpythontooling
- Testing with pytestpythontooling
- Lab: survive the test suiteLabpythonlab
- Binary data and bytespythonbinary
- Database IO with sqlite3pythondatabase
- Bitwise operations and advanced boolean patternspythonbitwise
- Filesystem and path manipulationpythonfilesystem
- Lab: database-backed data pipelineLabpythonlab
- Challenge: best time to buy and sellChallengepythonchallenge
- Challenge: maximum subarrayChallengepythonchallenge
- Challenge: product of array except selfChallengepythonchallenge
- Challenge: subarray sums (boss)Challengepythonchallenge
JavaScript / TS
Beginner
Intermediate
Advanced
- Microtasks and the event loopjavascriptruntime
- Memory and garbage collectionjavascriptruntime
- Performance profilingjavascriptperformance
- Lab: optimize itLabjavascriptlab
- Modules, bundlers, and buildsjavascripttooling
- Advanced TypeScriptjavascripttypescript
- Testing JavaScriptjavascripttooling
- Lab: robust codeLabjavascriptlab
SQL
Beginner
Intermediate
Advanced
Dialect appendices
Rust
Beginner
Intermediate
Bash
Beginner
Intermediate
- Conditionals In Depthbashscripting
- Loops In Depthbashscripting
- Functionsbashscripting
- Exit Codesbashscripting
- Lab: Scripting patternsLabbashscripting
- Grep Patternsbashtext-processing
- Sed Basicsbashtext-processing
- Awk Basicsbashtext-processing
- Cut, Sort, and Uniqbashtext-processing
- Lab: Text processingLabbashtext-processing
Go
Beginner
Intermediate
Data Science
Beginner
- What is data?data-sciencedata-fundamentals
- Reading data filesdata-sciencepython
- Data shapesdata-sciencedata-fundamentals
- Inspecting with pandasdata-sciencepython
- Data qualitydata-sciencedata-fundamentals
- Cleaning datadata-sciencepython
- Lab: explore a datasetLabdata-sciencepython
- Statistics conceptsdata-sciencestatistics
- Calculating statsdata-sciencepython
- Grouping conceptsdata-sciencedata-fundamentals
- Filtering and groupingdata-sciencepython
- Lab: mini analysisLabdata-sciencepython
Intermediate
- Joining datadata-sciencejoins
- Merging DataFramesdata-sciencepython
- Reshaping datadata-sciencereshaping
- Window operationsdata-sciencepython
- Apply and transformdata-sciencepandas
- Custom aggregationsdata-sciencepython
- Lab: merge and reshapeLabdata-sciencepython
- Choosing a chartdata-sciencevisualisation
- Matplotlib essentialsdata-sciencepython
- Seaborn statistical plotsdata-sciencevisualisation
- Seaborn in practicedata-sciencepython
- Anatomy of a good chartdata-sciencevisualisation
- Lab: visual summaryLabdata-sciencepython
- What is a feature?data-sciencefeature-engineering
- Encoding categoricalsdata-sciencepython
- Scaling and normalisationdata-sciencefeature-engineering
- Scaling in practicedata-sciencepython
- Lab: prepare a datasetLabdata-sciencepython
Advanced
- Supervised vs unsupervised learningdata-sciencemachine-learning
- The bias-variance tradeoffdata-sciencemachine-learning
- The model lifecycledata-sciencemachine-learning
- Choosing a modeldata-sciencepython
- Lab: compare classification modelsLabdata-sciencepython
- fit(), predict(), transform()data-sciencesklearn
- Linear regression in sklearndata-sciencepython
- Decision treesdata-sciencemachine-learning
- Decision tree practicedata-sciencepython
- Sklearn pipelinesdata-sciencepython
- Saving and loading modelsdata-sciencepython
- Lab: build a sklearn pipelineLabdata-sciencepython
- Classification metricsdata-sciencemodel-evaluation
- Regression metricsdata-sciencepython
- Cross-validationdata-sciencemodel-evaluation
- Hyperparameter tuningdata-sciencepython
- Lab: evaluate honestlyLabdata-sciencepython
- Time series structuredata-sciencetime-series
- Decomposing a time seriesdata-sciencepython
- Autocorrelationdata-sciencetime-series
- Simple forecasting methodsdata-sciencepython
- Lab: forecast a time seriesLabdata-sciencepython
- ETL vs ELTdata-sciencedata-engineering
- Reproducible pipelinesdata-sciencedata-engineering
- Testing data pipelinesdata-sciencepython
- Lab: build a complete ML pipelineLabdata-sciencepython
Game Dev
Beginner
- What makes a game?game-devgame-concepts
- Your first pygame windowgame-devpython
- The game loopgame-devgame-concepts
- Moving thingsgame-devpython
- State in gamesgame-devgame-concepts
- Player inputgame-devpython
- Lab: Build a basic gameLabgame-devpython
- Collision conceptsgame-devgame-concepts
- Collision in codegame-devpython
- Lab: Polish the basic gameLabgame-devpython
Intermediate
- Game state machinesgame-devarchitecture
- Scene managementgame-devpython
- Entity designgame-devarchitecture
- Event systemsgame-devpython
- Camera and viewportgame-devcamera
- Lab: State machine refactorLabgame-devpython
- The Sprite classgame-devpygame
- Sprite groups in practicegame-devpython
- Sprite animationgame-devanimation
- Animated spritesgame-devpython
- Tile mapsgame-devtile-maps
- Lab: Tile platformerLabgame-devpython
- Sound effectsgame-devaudio
- Sound in practicegame-devpython
- Saving game stategame-devpersistence
- Save, load, and configgame-devpython
- Lab: Polish and persistenceLabgame-devpython
Advanced
- Vectors and mathgame-devmath
- Velocity and accelerationgame-devpython
- Gravity and jumpinggame-devphysics
- Gravity in codegame-devpython
- Lab: Physics systemLabgame-devpython
- Finite state machines for NPC AIgame-devai
- NPC state machine in codegame-devpython
- Pathfinding conceptsgame-devpathfinding
- A* on a gridgame-devpython
- Lab: Enemy AILabgame-devpython
- Particle systemsgame-devvfx
- Particle system in codegame-devpython
- Screen effectsgame-devvfx
- Screen effects in codegame-devpython
- Lab: Visual effectsLabgame-devpython
- The observer patterngame-devdesign-patterns
- Component architecturegame-devarchitecture
- Spatial hashinggame-devalgorithms
- Packaging conceptsgame-devdistribution
- PyInstaller packaginggame-devpython
- Cross-platform concernsgame-devcross-platform
- Lab: Publish your gameLabgame-devpython
Workflow
Beginner
- What is automation?workflowautomation
- Reading and writing filesworkflowpython
- Paths and directoriesworkflowfilesystem
- Automating file operationsworkflowpython
- What makes a good script?workflowscript-design
- Building a CLI scriptworkflowpython
- Lab: Automate a taskLabworkflowpython
- Structured data conceptsworkflowdata-formats
- Parsing JSON and CSVworkflowpython
- Lab: Wrangle some dataLabworkflowpython
Intermediate
- HTTP fundamentalsworkflowhttp
- Making requestsworkflowpython
- Authenticationworkflowauthentication
- Auth in practiceworkflowpython
- Pagination and rate limitingworkflowhttp
- Lab: API reportLabworkflowpython
- Subprocess fundamentalsworkflowsubprocess
- Subprocess in practiceworkflowpython
- Building pipelinesworkflowshell
- Python subprocess pipelineworkflowpython
- Lab: Subprocess pipelineLabworkflowpython
- Cron conceptsworkflowscheduling
- Python schedulersworkflowpython
- Config filesworkflowconfiguration
- Config and loggingworkflowpython
- Lab: Scheduled jobLabworkflowpython
Advanced
- Idempotency in practiceworkflowreliability
- Checkpoints and atomic writesworkflowpython
- Retry logicworkflowreliability
- Retry in practiceworkflowpython
- Lab: harden a pipelineLabworkflowpython
- Why scripts need testsworkflowtesting
- Mocking the filesystemworkflowpython
- Mocking HTTPworkflowtesting
- Mocking HTTP in practiceworkflowpython
- Lab: test suiteLabworkflowpython
- DAG thinkingworkfloworchestration
- Makefiles for pipelinesworkflowmake
- Prefect conceptsworkflowprefect
- Prefect in practiceworkflowpython
- Lab: DAG pipelineLabworkflowpython
- Docker conceptsworkflowdocker
- Writing a Dockerfileworkflowdocker
- Docker Compose workflowsworkflowdocker
- Lab: containerise a pipelineLabworkflowdocker
- GitHub Actions basicsworkflowgithub-actions
- Running Python in CIworkflowgithub-actions
- Secrets and environmentsworkflowgithub-actions
- Lab: Deploy workflowLabworkflowgithub-actions
Utilities
Beginner
- What is a utility?utilitiesunix-philosophy
- Input and outpututilitiespython
- Composabilityutilitiesunix-philosophy
- CLI argumentsutilitiespython
- Exit codes and errorsutilitiesexit-codes
- Building a CLI toolutilitiespython
- Lab: build a utilityLabutilitiespython
- Packaging conceptsutilitiespackaging
- Packaging in Pythonutilitiespython
- Lab: package and shareLabutilitiespython
Intermediate
- Why output design mattersutilitiesux
- Rich text outpututilitiespython
- Progress barsutilitiesux
- Rich progressutilitiespython
- Tables and treesutilitiesux
- Colour conventionsutilitiesux
- Lab: Rich toolLabutilitiespython
- Click vs argparseutilitiesclick
- Click basicsutilitiespython
- Subcommands with groupsutilitiesclick
- Groups in practiceutilitiespython
- Configuration filesutilitiesconfiguration
- Lab: Click toolLabutilitiespython
- Testing with CliRunnerutilitiestesting
- CliRunner in practiceutilitiespython
- Mocking stdin and envutilitiestesting
- Snapshot testingutilitiespython
- Lab: CLI coverageLabutilitiespython
Advanced
- PyPI and the registryutilitiespackaging
- Build backendsutilitiespython
- Versioningutilitiespackaging
- Release workflowutilitiespython
- Lab: Publish to TestPyPILabutilitiespython
- Don't buffer what you can streamutilitiesperformance
- Streaming in practiceutilitiespython
- Memory profilingutilitiesperformance
- Profiling in practiceutilitiespython
- Lab: Optimise a utilityLabutilitiespython
- TUI conceptsutilitiestui
- Textual basicsutilitiespython
- Interactive formsutilitiestui
- Live dashboardsutilitiespython
- Lab: TUI log viewerLabutilitiespython
- Entry points as extensionsutilitiesplugins
- Designing a plugin APIutilitiesplugins
- Dynamic loadingutilitiespython
- Lab: Plugin systemLabutilitiespython
- Path portabilityutilitiescross-platform
- Platform-specific behaviourutilitiescross-platform
- Shebang and executablesutilitiescross-platform
CS Fundamentals
Beginner
- How to approach problemscs-fundamentalsproblem-solving
- Solving with listscs-fundamentalspython
- Key-value thinkingcs-fundamentalsdata-structures
- Solving with dictscs-fundamentalspython
- Big-O intuitioncs-fundamentalsbig-o
- Measuring speedcs-fundamentalspython
- Lab: algorithm practiceLabcs-fundamentalspython
- Recursion conceptscs-fundamentalsrecursion
- Recursion in Pythoncs-fundamentalspython
- Search conceptscs-fundamentalssearch
- Search in Pythoncs-fundamentalspython
- Lab: searchLabcs-fundamentalspython
Intermediate
- Stackscs-fundamentalsdata-structures
- Stacks in practicecs-fundamentalspython
- Queuescs-fundamentalsdata-structures
- Queues in practicecs-fundamentalspython
- Heaps and priority queuescs-fundamentalsdata-structures
- Heaps in practicecs-fundamentalspython
- Lab: structure problemsLabcs-fundamentalspython
- Why sorting matterscs-fundamentalssorting
- Merge sortcs-fundamentalspython
- Python's sortcs-fundamentalspython
- Custom sortingcs-fundamentalspython
- Binary search variationscs-fundamentalsbinary-search
- Lab: sorting problemsLabcs-fundamentalspython
- Graph representationcs-fundamentalsgraphs
- BFS and DFScs-fundamentalspython
- Tree fundamentalscs-fundamentalstrees
- Tree traversalscs-fundamentalspython
- Binary search treescs-fundamentalstrees
- Lab: graphs and treesLabcs-fundamentalspython
Advanced
- DP intuitioncs-fundamentalsdynamic-programming
- Memoisationcs-fundamentalspython
- Tabulationcs-fundamentalsdynamic-programming
- Classic DP patternscs-fundamentalspython
- 2D DPcs-fundamentalspython
- Lab: DP problemsLabcs-fundamentalspython
- Weighted graphscs-fundamentalsgraphs
- Dijkstra's algorithmcs-fundamentalspython
- Topological sortcs-fundamentalsgraphs
- Topo sort and cycle detectioncs-fundamentalspython
- Lab: graph algorithmsLabcs-fundamentalspython
- Sliding windowcs-fundamentalssliding-window
- Sliding window practicecs-fundamentalspython
- Two-pointer on stringscs-fundamentalstwo-pointer
- Hashing stringscs-fundamentalspython
- Lab: string problemsLabcs-fundamentalspython
- Greedy algorithmscs-fundamentalsgreedy
- Greedy in practicecs-fundamentalspython
- Divide and conquercs-fundamentalsdivide-and-conquer
- Backtrackingcs-fundamentalspython
- Lab: paradigm problemsLabcs-fundamentalspython
- Challenge: trapping rain waterChallengecs-fundamentalschallenge
- Challenge: longest substring without repeating charactersChallengecs-fundamentalschallenge
- Challenge: word breakChallengecs-fundamentalschallenge
- Challenge: number of islandsChallengecs-fundamentalschallenge