Dan Grossman Teaching Materials
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, for 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:
The course uses Standard ML for the first half of the course, Racket for two-three weeks, and Ruby for roughly two weeks. It includes occasional contrasts with Java. "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.
I have taught this course several times at the University of Washington. For recent offerings, which make the course materials publicly available, see my Spring 2013 (April-June 2013) offering or the slightly older Winter 2013 (January-March 2013) offering. The only pre-requisites are two quarters of introductory programming (in Java), though many students have taken several other computer-science courses.
I have also taught the material as a MOOC on Coursera. I anticipate the course to be offered again. 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 description of recommended background is: The course assumes students are familiar with programming covered by most introductory courses, but it is explicitly designed not to be a particularly advanced course. Students should be comfortable with variables, conditionals, arrays, linked lists, stacks, and recursion (though recursion will be reviewed and expanded upon), and the difference between an interface and an implementation. Students should be eager to write programs in languages new to them. Parts of the course analyze basic object-oriented concepts and contrast them with those of other languages, so familiarity with Java or a closely related language (e.g., C#) is helpful, but not required for homework assignments.
Course instructors at academic institutions are welcome to use and adapt my materials. Please contact me for any source materials:

Last updated: April 2013