An ambitious course on programming paradigms, semantics, and types

We have completed this course.
I hope others find the design or some of the material helpful.
See more about reuse below.

- Parsing and interpretation in Prolog
- Basics of small-step and big-step semantics
- Basics of untyped and typed lambda calculi
- Introduction to Haskell
- Basics of denotational semantics
- Denotational semantics in Haskell
- Basics of static program analysis
- Static program analysis in Haskell
- OO programming in Haskell
- The Expression Problem
- Basics of Constraint-Logic Programming
- Basics of Process Algebra (CCS)
- ... a few more specialized lectures

- English as the course language
- Slides, videos, exercises available online publicly
- 42 hours (45mins each) of lectures over 4 months
- 12 programming-oriented, interactive labs
- Transparent scheme for midterm and final exam
- Heavy reuse of material from other courses
- Use of Twitter for notification and aggregation

This course is my only chance to tell many students at my department about semantics, type systems, bits of interesting functional programming, declarative language processors, and sophisticated declarative methods such as process algebra or constraint-logic programming. Luckily there was a similar module in our curriculum, but I admit that I had to hijack this module a bit. (That is, the module is designed for the last semester of Bachelors, whereas the actual course is probably meant for Masters.) The students have complained in a friendly manner that the course is very heavy, but in return, I have designed the exam to be feasible for Bachelors. So everyone is happy: me because I could do loads of material and topics; the students because they receive unusual help in preparation for the exam. As to the content, students are relatively happy with the techniques that we studied---in particular because we are running the course in such a pragmatic mode, where we basically leverage Prolog and Haskell throughout---for every bit of type systems and semantics and programming concepts. In this manner, the CS students can improve the programming skills in paradigms and domains to which they used before. I also admit guilty by saying that there was no way of selling the formal details of many topics. (For instance, an attempt to do soundness proofs almost triggered a riot.) As to the use of twitter, it seems that not enough students were keen to use Twitter; so we had to continue using a newsgroup in parallel.

But again, I am confident that the design of such a course with broad coverage, low formal depth, but operational depth based on declarative programming and a transparent exam is an effective way of exposing Bachelor students (possibly some of them future Master students) to critically important foundations of computer science and modern programming techniques.

The future
I will mature the course next year. I will be happy if others use the design of the course to some extent, or any specific material. Please note that more than half of the material is directly based on other people's work. I probably used 3 resources heavily, and about another 7 for some bits. Each non-original slide has credits on it in the header area. If you want to reuse anything, please let me know.

Vadim Zaytsev did an excellent job in running the lab and helping me to prepare the exam at the level of quality that we had in mind. It is good to have such a committed (emerging) declarative programmer next to you for a course like this! As to the reused material, detailed credits are online and on the slides, but I want to emphasize a few sources because of the degree of reuse and my admiration of their work: Hanne Riis Nielson and Flemming Nielson (for their book "Semantics with Applications" with slides); Graham Hutton (for his wonderful introduction to Haskell); Jaakko Järvi (for the slides of his mainly TAPL-based programming course).


No comments:

Post a Comment