Computing becomes easier to learn when difficult ideas are made visible without being made dishonest. This section is for learners, educators, and engineers who want explanations that preserve the important behaviour of the systems underneath the abstraction.
Choose a learning path
Foundations
For learners building confidence in programming and computer science. The emphasis is on clear mental models, careful examples, and experiments that make abstract ideas concrete.
University and early career
For students and newer engineers moving from syntax towards software engineering. Topics include C++, algorithms, data structures, debugging, testing, Git, memory, and systems behaviour.
Advanced and professional
For engineers who want to reason more deeply about performance, concurrency, profiling, architecture, empirical software engineering, and the trade-offs hidden by high-level abstractions.
How I teach
I favour a cycle of explanation, observation, experimentation, and reflection. A useful abstraction should reduce unnecessary detail without teaching something false. Where behaviour matters, we should be able to inspect it, measure it, and challenge our assumptions.
- Explain: build a clear mental model before adding complexity.
- Observe: make the relevant behaviour visible with tools, diagrams, or instrumentation.
- Experiment: change one thing and measure what happens.
- Reflect: connect the result back to the model and identify its limits.
Topics in development
- C++ memory, lifetime, layout, and undefined behaviour
- Performance and systems programming
- Software engineering practice, testing, and DevOps
- Empirical research methods for software engineering
- AI-assisted programming and how to evaluate generated code
Where to go next
If you want practical examples first, start with the educational articles. If you want the research argument behind the teaching approach, continue to the Research section.