Programming Abstractions & Paradigms
How to think in abstractions — functional, OOP, interpreters.
Abstraction & Computational Thinking
Abstraction is the single most powerful idea in all of computer science — the art of hiding complexity behind clean interfaces so that each layer of a system can be understood, built, and reasoned about independently.
Recursion & Recursive Data
Recursion is not just a programming trick — it is the natural language of self-referential structure, and mastering it means learning to see problems as they really are.
Higher-Order Functions & Functional Programming
Functions are data too — mastering higher-order functions unlocks a way of thinking that transforms how you design, compose, and reason about programs.
Data Abstraction & Abstract Data Types
Data abstraction is the art of drawing a clean boundary between what a type does and how it does it — the foundational discipline that makes large software possible.
Object-Oriented Programming
Object-Oriented Programming is a paradigm that organizes computation around objects — bundled data and behavior — enabling modularity, reuse, and expressive modeling of complex systems.
Generic Programming & Polymorphism
Generic programming lets you write code that is correct for all types at once — the closest thing computer science has to mathematical universality.
Modularity, State & Environments
Master the environment model of evaluation, closures, and mutable state — the conceptual bedrock that explains how every function, variable, and module in every language actually works.
Building an Interpreter
Build a language from scratch by writing an interpreter that evaluates itself — the metacircular evaluator reveals that a programming language is just a program.