For almost two years now, I have taken a number of online courses of the type that has become quite wide-spread and popular – MOOCs (Massive Open Online Course). The time has come for me to try and collect my thoughts about this experience. In this post, I will focus on the course format of the courses supplied by Coursera (http://www.coursera.org), since the courses I have taken have almost exclusively been supplied by them.
The structure of a course is rather similar to the others – a course spans over a number of weeks (typically 5 – 10), each week new material, in the form of videos, quizzes, programming assignments etc. is released and you have a certain time before you must hand in answers. In some courses there is a final exam as well. All assignments are handed in on-line, and are either automatically corrected or peer reviewed, which means that the particpants of the course correct each other’s material. All courses are free, but for some courses, one can select a so called “signature track”, which means that you get an official “verified certificate” upon completion of the course. For most of the courses, you will receive an “unverified” downloadable certificate upon completion also if you don’t choose the signature track. Typically, you need to achieve about 70% or higher on the assignments to receive a certificate. For some courses, there is also a certificate “with distinction” if you do even better.
The first course I took was called Introduction to Databases, in October 2011. It was actually not on Coursera (I believe this was before Coursera was founded), but you can reach it here. Taught by professor Jennifer Widom at Stanford University, this course included information about relational databases, normalization, SQL, constraints, triggers, transactions, views, authorization, NoSQL systems, XML validation, XML querying and UML. What I took away from the class was first and foremost a much deeper understanding about SQL, knowledge which I have been able to apply many times since. A very good class which sparked my interest in MOOCs.
The second course was Software Engineering for SaaS (February 2012) taught by professor David Patterson and associate professor Armando Fox from Berkeley. It described concepts such as service-oriented architecture, MVC, REST, BDD and TDD. It taught how to build a web application using Ruby on Rails. Given that my experience with web applications is completely different (using Delphi and the IntraWeb framework), it was very interesting to see how to achieve it using RoR. This class contained a lot of different concepts (especially when going into BDD and TDD), so much so that I think it would have benefited from a few more weeks, and a bit more structure in its lessons. The course has been given since, so it may well be that it has improved in those areas.
Next up was Design and Analysis of Algorithms I, in March 2012. Taught by professor Tim Roughgarden of Stanford University, it started by describing asymptotic notation (big-O and its siblings), then went on to divide & conquer algorithms, sorting algorithms, graph algorithms, heaps and hash tables. This class included 5 problem sets (quizzes), 5 programming assignments and a final exam. The programming assignments could be solved any way you wanted to; typically a complex problam was given, which had a very simple answer. All you had to do was implement an algorithm to calculate the answer and hand in the answer. For this course, I chose to code the assignments in Delphi. This was an extremely interesting course, from which I leared (and re-learned) a lot. Professor Roughgarden also has a marvelous dry sence of humor, with quotes such as “Imagine that all your friends’ parents were unusually unimaginative and that their names were all integers”.
Next up: Compilers, starring professor Alex Aiken of Stanford University. I started this in April 2012, and it kept me sleepless for about 10 weeks. Covering lexical analysis, parsing, syntax-directed translation, abstract syntax trees, types and type checking, intermediate languages, dataflow analysis, program optimization, code generation and runtime systems, this is the course from which I feel I have learned the most. The course had two options – either you just watched the lectures and took quizzes and the final exam, or you also did the programming assignments. I did the programming assignments, and at the time I was not at all sure whether that was a good idea (my family certainly didn’t think so). When I was done, however, I was extremely satisfied with having done so. I started using C++ for the first two assignments, but switched to Java for the final two.
Function Programming Principles in Scala, by professor Martin Odersky from École Polytechnique Fédérale de Lausanne, was the next course, starting in September 2012. Another very good course, taught by the inventor of the Scala language. It covered the principles of functional programming using Scala, including the use of functions as values, recursion, immutability, pattern matching, higher-order functions and collections, and lazy evaluation. Having used functional programming very little since I left university, this course was a welcome eye-(re)opener. Obviously the programming assignments here were done in Scala, but since then my re-awakened interest in functional programming has made me pick up a few books on Haskell and continue studying on my own.
After all the software courses, it was time for something different. Starting in November 2012, Think Again: How to Reason and Argue by professor Walter Sinnott-Armstrong of Duke University and associate professor Ram Neta of University of North Carolina, taught students “how to analyze and reconstruct arguments, how to assess arguments for deductive validity and inductive strength, and how to avoid common fallacies”. (I just couldn’t resist taking that sentence from the certificate, given it was a course in argumenation). It is hard to pin-point exactly what this course taught me (apart from a bunch of words in English that I believe not many Swedes know), but somehow I think (that’s a guarding term, by the way) that learning something completely different once in a while gives you a better capacity for thinking “outside the box” also when you are in your own field.
Design and Analysis of Algorithms II starting in December 2012, the sequel to professor Roughgarden’s class from March, included more dry humor and more interesting assignments. Another great course, it introduced greedy algorithms, dynamic programming and both exact and approximation algorithms for NP-complete problems. This time, I decided to brush up on my Java, by using it for the assignments.
In March 2013, it was time for Web Intelligence and Big Data by doctor Gautam Shroff of Indian Institute of Technology, in Delhi, India. This course was an introduction to “web intelligence” programming, describing the map-reduce concept for parallel processing of data, and teaching various machine learning concepts. This was a rather advanced course, and I felt happy for my programming experience. This time, I used Python for the programming assignments.
Starting in April 2013, An Introduction to Interactive Programming in Python was a bit different in that it was taught by four teachers: professor Joe Warren, associate professor Scott Rixner, Stephen Wong and John Greiner, all from Rice University. Professors Warren and Rixner were the ones doing most of the teaching, and between them they had a kind of geeky humor than appealed to me. I found the course rather easy to pass, given extensive programming experience, but I still feel that I learned a lot of Python from it. Development was done this time in an online tool called CodeSkulptor which was a very nice acquaintance. The course consisted of eight programming assignments, each one introducing new Python concepts, and leading up to the final project which was a nice Asteroids clone called RiceRocks. All in all a very nice introductory programming course.
I am currently enrolled in two courses, the first one being Discrete Optimization given by professor Pascal Van Hentenryck of the University of Melbourne. This is a very advanced course, building on information from the second algorithms course, dealing with NP-complete problems. These are problems for which there are no solutions in polynomial time (i.e. there are no solutions which run in time proportional to the size of the problem raised to a constant factor). A very fascinating course, with superb lectures given by the professor. I have been able to submit solutions good enough for me to pass this course, for which I am very happy.
The other course in which I am enrolled is Maps and the Geospatial Revolution given by doctor Anthony Robinson of Pennsylvania State University. For as long as I can remember, I have been fascinated with maps, and in this course I have come to realize that I am not alone. The course describes different ways to use maps, how to construct maps and different concepts that are vital in the field of Geography. I had hoped for a bit more technical details surrounding e.g. map projections (the art of representing the three-dimensional nature of earth in two dimensions) since I sometimes need a deeper understanding of it in my work, but it is a nice introduction to maps.
You may think that I have taken a lot of software related courses and that I ought to mix them up with something different. I think so too – the next course I am about to take deals with the history of mankind and starts in a few days. There are a lot of different courses on Coursera, and certainly not just technical ones. Enjoy!
By the way, here is a map I have created, which displays the courses that I have taken so far.