Course Description
CS 146: Elementary Algorithm Design and Data Abstraction (Advanced Level)
CS146 is an advanced-level version of CS136.
While CS136 introduces imperative programming solely through C, CS146 begins its exploration of imperative programming using both Racket and C. The course also covers various methods to understand and execute programming semantics, including stepping rules, compilers, and interpreters. CS146 presents interpreters in Haskell and invents toy languages SIMPL (a simple imperative language) and PRIMPL (an assembly-like language) to understand imperative semantics at a lower level. We briefly discuss what compilation and assembly looks like for these languages. Finally, students are exposed to MMIX as a method to briefly introduce binary encoding of instructions and data, and to understand how CPU architectures may practically impact instructions and timings.
Student Course Perceptions
Explanations of course concepts: 94%
Creating a supportive learning environment: 100%
Stimulating student interest: 94%
Overall instructor effectiveness: 96%
My Thoughts
CS 146 marked firsts for my teaching experience in a lot of ways: first time teaching a CS 1XX course (1st time really teaching anything BUT CS 246/7 1 ), first time teaching programming in non-C++ languages, first time teaching the enriched group of students. Somewhat surprisingly to myself as well, this was the first time in almost 3 years I taught a group of CS students, recently it’s just been the yearly batch of UWaterloo Software Engineering students.
CS 146 is an interesting course to teach, I can’t think of any class that is quite like it. It is a whirlwind tour of imperative programming through many lenses, including stepping rules, interpreters, compilers, and assemblers. It builds upon the functional programming taught to students in CS135/CS145, and draws deep contrasts between the functional and imperative paradigms.
I had an enjoyable time teaching this course, the work was of a different flavour, even if it took as long (perhaps slightly longer) than previous terms teaching. In my previous two years teaching the SE students, I spent a lot of time designing assignments and test questions, since there was a relatively small reserve of appropriate questions. The SE students also required more administrative attention/time on Piazza. In CS 146, the assignment questions remain similar over years, eliminating that burden. However, having never taught the course prior, preparing for lectures took significantly longer, often requiring an hour or so of work each evening before class. With CS 146 using imperative Racket, C, Haskell, MMIXAL, and teaching languages SIMPL 2 and PRIMPL 3 , I needed to spend a lot of time figuring the best way to word my explanations.
Nevertheless, student feedback turned out positive, and I managed to make substantial progress on my next major research project, so it was a pretty good term overall. I also received NSERC, which is a huge relief, meaning that I have guaranteed funding for years 3-5 of the PhD, and I can save some time now that I no longer have to write scholarship applications.
This is the first teaching post in a while where I haven’t felt “burnt out” at the end of the term. I enjoyed the students this term, even if I didn’t get a ton of interaction in office hours, the students were attentive and asked good questions in class. I guess it’s nice to just feel like I somewhat know what I’m doing with my research for once, and that I’m finally starting to get some results that I am proud of. Even though I still often feel like an imposter in my lab amongst the other really talented, smart, and hard-working grad students, I’m starting to feel like I do know an area (blackout-resistant apps and Bluetooth) well enough to speak confidently on it.
In undergrad you have the pleasant experience of (for the most part) being matched by peers who know similar amounts to you. Even for students who may have spent more time outside-of-class tinkering and learning, everyone was still on the same fundamental course progression, and if you didn’t know something major, then it was just because you hadn’t taken the course yet. But in grad studies, peoples’ individual knowledge-bases are all diverse, with most people in the lab having a very specific area of deep knowledge, with a wide understanding for the CrySP-y topics in general. For me at least, this causes the heightened worry of not knowing something obvious, or getting something incorrect. I still reflect on instances where I haven’t known something obvious and feel mortified; that level of self-criticism is probably something I still need to work on. All in time, I tell myself.
This post has diverged from this term’s teaching experience into a general reflection on 2nd-year PhD feelings. In terms of what’s next for teaching, I will be taking MATH 900 with Dan Wolczuk in the next term. The course is on University Mathematics Teaching Techniques, and Dan is one of the best teachers in the Math faculty, so I am excited to learn a lot from him. I find that while I feel quite confident in the public speaking aspect of lecturing, that I sometimes struggle to engage students with leading questions. I will often pause and ask “any questions?” after each bit of content, but I don’t do as much in terms of giving them explicit challenges or problems to think about independently. I hope that the course will give some better strategies to improve the interactivity of my lectures.
-
I taught CS136L for one term, but it didn’t really feel like this counted, since it was flipped classroom style.↵
-
A mock imperative language↵
-
A mock assembly language↵
profQUOTES
As quoted in mathNEWS.
Volume 160, Issue 1, January 16th, 2026
- You’d be better off going outside and touching grass.
- They’ll be like “Racket? What the fuck is that?”
Volume 160, Issue 2, January 30th, 2026
- The important thing about Among Us is that it was the first ever video game.
- Chat GPT? I don’t know what that is.
Volume 161, Issue 1, May 22nd, 2026
- Bill Gates said if you could get through The Art of Computer Programming, he would give you a job. Although nowadays you don’t really want to be associated with him.
- Module 3 was SIMPL, module 4 was PRIMPL, and module 5 is IMPL… ementing functional languages.