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, since my last few terms as an instructor were all CS 247 with the Software Engineering cohort.
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. 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.
I really enjoyed this term. The students were attentive and asked good questions in class, even if I didn’t get a ton of interaction in office hours. It also helped that I’m finally starting to get some research results that I am proud of, and I’m starting to feel like I know an area (blackout-resistant apps and Bluetooth) well enough to speak confidently on it.
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 as a flipped lab it involved very little lecturing.↵
-
A mock imperative language↵
-
A mock assembly language↵