Dan Grossman   Teaching Materials

Programming Languages

This course is taught at CSE 341 at UW and the materials have been adapted for use at various other institutions. I am happy to try to help instructors make use of them! The only pre-requisites are two quarters of introductory programming (in Java), though many CSE 341 students have taken several other computer-science courses.

This course is a lower-level (but not introductory) course that introduces functional programming and many of the most important topics in programming languages. I consider this material essential for every computer scientist and software developer (in addition to including some pragmatic material on using some particular programming languages). The material is methodical and precise, but it is not formal or foundational in the programming-languages sense.

Course topics include:

“What languages do you use?” is far from the most important question to ask about a programming-languages course. The course-motivation materials (which are near the middle of the course so students can appreciate them) discuss language choice. That said, language choice clearly affects the course materials -- it does not work to use materials that make a different choice without substantial adaptation effort.

Through the Spring 2019 offering, the course used Standard ML for the first half of the course, Racket for two-three weeks, and Ruby for roughly two weeks. It included occasional contrasts with Java. For this now-older version, I have full course materials, including lecture videos (mp4 files), slides (Powerpoint or pdf), reading notes (pdf, somewhat like a textbook), programming assignments, and sample exams.

Starting in Fall 2020, James Wilcox [key initiator], Zach Tatlock, and I adapted the course to use OCaml for the first half of the course and Racket for the second half of the course, including both “standard” Racket and using Racket's object system for better understanding object-oriented programming. Occasional contrasts with Java remain. For this up-to-date version, we have slides (Google Slides), reading notes (except for the last two weeks or so), programming assignments, and sample exams. I have lecture videos, but only from in-class uses, so I cannot share them publicly due to student-privacy policies. See my Winter 2022 offering (which, due to the Omicron surge started on Zoom and then returned to the classroom) for the most recent offering by me.

I have also offer the material as a MOOC on Coursera (divided into three parts to make each "course" closer to the typical workload of a MOOC) and thouands of students have completed the MOOC. The MOOC utilizes many of the same materials, but includes automatic grading of programming assignments (test cases and checking for use/non-use of language constructs), peer assessments of programming assignments using provided rubrics and sample solutions, and different exams (containing only multiple choice and check-all-that-apply questions). The MOOC web-page describes recommended background in considerable detail. The MOOC course has not been updated since 2015.

Course instructors at academic institutions are welcome to use and adapt my materials. Please contact me for any source materials not already publicily available on course websites:

picture of Dan's email address


Last updated: May 2022