Courses
Courses are where a lot of the public-facing story becomes concrete.
This page gives a cleaner overview of the kinds of courses I teach and the kinds of materials that can grow here over time: notes, prompts, reading lists, project pathways, and course-adjacent resources.
Introductory programming and the move toward implementation confidence
These courses help students move from syntax anxiety toward structured problem solving, code reading, debugging, testing, and explanation.
Data structures, algorithms, and the discipline of technical choices
This lane is where design decisions become more explicit: tradeoffs, complexity, representation, and why one implementation strategy is better than another.
Logic, proof, abstraction, and mathematical structure in computing
These courses help students write clearer arguments, inspect assumptions, and see why abstract structure matters in technical practice.
What can grow here
Over time this page can become a useful public layer for students, collaborators, and anyone trying to understand how I teach.
I do not want this to become a dumping ground. The goal is a clean set of well-scoped materials: course overviews, selected notes, project prompts, office-hours guidance, and links that help students get oriented without clutter.
- Course maps and concise descriptions of what students practice.
- Selective notes or reading lists when they are genuinely useful publicly.
- Project prompts and independent-study entry points.
- Practical guidance on office hours, advising, and how to start a conversation well.
Teaching themes that recur across courses
- Clarity before cleverness.
- Formal reasoning as part of technical practice.
- Revision as a normal part of strong work.
- Projects that end with something another person can read, inspect, or use.
Representative course areas
A table works well when the page needs to be concrete without turning into a CV dump.
| Course area | Examples | What students practice |
|---|---|---|
| Programming foundations | Introduction to Programming I and II | Problem decomposition, debugging, testing, and communication through code |
| Core CS structure | Data Structures and Algorithms, Discrete Structures in CS | Representation, efficiency, proof, abstraction, and technical argument |
| Formal reasoning | Foundations in Discrete and related proof-oriented work | Logical precision, symbolic thinking, and the habit of justifying claims carefully |
| Interdisciplinary foundations | Analytical Inquiry, mathematics background courses, cybersecurity-adjacent teaching | Bridging concepts across domains and helping students see structure clearly |
Where to go next