UW Programming Languages
Introduction
Programming Languages is a Coursera course from the University of Washington, taught by Professor Dan Grossman. The course uses three languages — SML (Standard ML), Racket, and Ruby — to teach three different programming paradigms: functional, functional (with macros), and object-oriented.
The course's unique value is that it doesn't just teach you three languages — it uses them to help you understand core programming language concepts: pattern matching, recursion, closures, type inference, macros, polymorphism, subtyping vs parametric polymorphism. After this course, you'll be able to quickly identify the design patterns and core features of any new language you encounter.
Dan Grossman's teaching is rated by students as "unreasonably clear" — he makes complex concepts simple and accessible.
Prerequisites
- Programming experience: Familiar with at least one programming language
- No prior knowledge of SML, Racket, or Ruby required (the course teaches them from scratch)
- No functional programming experience required
Difficulty
🌟🌟⭐ (Medium)
The first half (SML basics) is relatively accessible. The second half (Racket's macro system, Ruby's object model) is more challenging. The programming assignments are demanding.
Estimated Study Hours
Approximately 50-70 hours
- Video lectures: ~20 hours
- Programming assignments: ~30-50 hours
Resources
- Coursera: Programming Languages
- Course website: cs.washington.edu/education/courses/cse341
- Textbook: Dan Grossman's course notes (free, available on the course website)
Self-Study Tips
-
Do the programming assignments. The assignments are the core of this course — skipping them means you haven't really learned. You'll implement various language features in SML, Racket, and Ruby, which is the best way to understand programming paradigms.
-
Don't skip the SML section. Many students skip SML because they think it's not practical, but SML's pattern matching and type inference are the best entry point to understanding functional programming.
-
Racket's macro system is worth special focus. Macros are Racket's most powerful feature and the key to understanding the Lisp philosophy of "code as data."
-
After finishing, compare with languages you already know. For example, Java's generics are parametric polymorphism, while Python's duck typing is subtyping polymorphism. These comparisons deepen your understanding of language design.
-
This course is best taken after learning your first language and before learning your second. It builds "meta-knowledge" about programming languages, making every subsequent language easier to learn.
-
If time is limited, prioritize Part A (SML) and Part B (Racket). Part C (Ruby) is relatively independent and can be done later.