My most recent foray into MOOC offerings has been Coursera’s second iteration of the Programming Languages course by Dan Grossman from the University of Washington. I read the review and was sold from the description;
“This course is an introduction to the basic concepts of programming languages, with a strong emphasis on functional programming. The course uses the languages ML, Racket, and Ruby as vehicles for teaching the concepts, but the real intent is to teach enough about how any language “fits together” to make you more effective programming in any language — and in learning new ones.”
As I have alluded to previously, I am a firm believer in learning about programming through the concepts of Functional Programming. The FP family of languages include Lisp, Racket, Scala, Haskell and many more. This time I recruited some volunteers, my two eldest children (children[0..1] aged 14 & 12) to take the course with me, so that 50% of our family could discuss abstract concepts over meals, whilst the remaining family members (children[2..3] & wives) could refrain from passing comment about our geekiness if they so wished…as it turned out they did not wish to maintain silent admiration of our nerd time but that’s a different matter.
The course material is delivered in eight modules over as many weeks. There are two multi choice tests and seven programming assignments. The material is presented through three distinct programming languages, two functional programming languages (ML & Racket) and one Object Oriented language (Ruby). The rational for why the concepts and particular languages were chosen is explained in week 3, thereby allowing some of the original content to sink in beforehand so that when the course motivation is explained it simply ‘makes more sense’. One of the fundamental concepts running throughout the course is that there is no one best language. The idea is to use the language best suited to the task at hand. Another low-level recurrent theme is that to fully understand all programming concepts, it is essential to study the idea itself rather than the ‘how to implement an idea in a particular language’. The semantics of language structures may differ but the core concepts, and by extension of this course, the understanding of those core concepts is a very powerful way to approach the task of learning a language.
With the programming assignments, students are presented with some automated tests to employ for confirmation that code is working as expected. The test driven approach isn’t discussed much in the course material, but it is assumed that the student will avail of the method and learning that it provides. Ruby in particular is famed for its Test Driven approach to development to speed up complex coding through consistent tests applied to unit modules as more features get added. Another extremely beneficial aspect to this course is the notion of peer reviewed homework. For each homework the student must review three other homework submissions, and have their homework similarly assessed by three other peers. This has the double benefit of seeing how other people write and having them comment on your code. Style is a major contributing factor to code readability and having good style makes it easier to write and troubleshoot. In some ways this course is a ‘how to program with style in any language that you already know’. This has been one of my most enjoyable learning experiences, once again Coursera has lived up to my expectations. With the final results in, I compared grades with my kids; I got the worst result on the two multi choice tests but the best on the programming assignments …. woo hoo!
One of the homework assignments had us add some new block formations to tetris, which obviously needed rigorous testing by my course colleagues (not counted as free game time!).
Upon completion I asked my two course buddies to provide a review; here is what they wrote:
IrishWrath (Aged 14):
For the record, I didn’t volunteer for this course I was conscripted, but in the end I was glad I took it. The course teaches many tricks and tips for coding through three specially chosen languages, ML, Racket, and Ruby. Some of the highlights of the course are learning Functional vs. Object Oriented Programming, and dynamic vs. static typing. It presses heavily on the importance of no mutation, showing several examples of how it breaks everything. The instructor seems to favour Functional Programming, and static typing, so, naturally, I like the opposite (dynamic typing, and Object Oriented Programming). The exercises are easy enough if you pay attention to the videos, however, you may have to rewatch the odd couple. After each successful homework, you are given a link to a picture of the instructor’s dog, which is one of the highlights for me. Other highlights include the fact that the instructor’s shirt doesn’t change until the end of the eight weeks, and it comes as a shock when it does change. Overall I found this an enjoyable and engaging course.
IrishCyborg (Aged 12):
In this course I learnt 3 languages, and although I had done Racket before, it helped me to understand it better. It also helped me learn programming concepts which I’ll be using in other languages. I really recommend this course to anyone who has done a language or two and would like to do some more. Plus, it helps learning languages not in the course. My favourite homework assignment was configuring the tetris game to add new shapes, and testing it after…by playing it.