It’s summer, and that means road trips and eating ice cream on convenience store curbs! I’ve been painting houses as a summer job, and working in the prairie sun has been largely enjoyable. I didn’t want my programming skills to get rusty and a friend had recommended me Coursera’s Machine Learning course, so I thought I’d work through that slowly over the summer in the evenings. Unfortunately (or fortunately?), that kickstarted a mini-addiction and three months later, I’ve finished six Coursera MOOCs!

### What is a MOOC?

MOOCs, or massive open online courses, are pretty ubiquitous by this point, but in case you’re not familiar with them, I’ll give you a little run-down. My description is specific to Coursera, but my sister did a couple of courses on edX and the format was similar. Courses are taught by professors from pretty great universities, who put up video lectures and assignments. Some courses on Coursera require you to pay a fee to enroll, but most of the popular ones have a free audit option, which allows you to access all the course materials anyway. You just don’t get a certificate upon completion. Because I’m currently in university, I don’t really need the certificates, but they seem to be pretty well-recognised by employers, so if you’re teaching yourself programming with the goal of entering the industry, or if your organisation encourages continued learning, a Coursera certificate might meet your requirements.

The courses are sorted into weeks, with “deadlines” to keep you on track, but if you miss them, you simply bump into the next session, so none of your progress is lost. Likewise, there’s nothing stopping you from finishing a week’s material in a day and moving on, so if you understand the material relatively well, you could finish some of these courses pretty quickly.

### Machine Learning (Stanford University)

This 11-week course teaches the concepts behind machine learning. It’s taught by Prof. Andrew Ng of Stanford University, one of the founders of the Coursera platform. The material was extremely interesting and Prof. Ng’s lectures are clear, but be aware the course does use some linear algebra and multivariable calculus. I haven’t done the latter before, so I struggled with some of the math behind the algorithms, but there’s a lot of support in the discussion forums in case you get stuck. Programming assignments are done in Octave/MATLAB, which is not a language I enjoyed using, but definitely one that gets the job done efficiently. My only complaint would be that the programming assignments mainly consisted of translating a couple formulas into code to finish nearly-complete programs. The course would likely have been too difficult if it expected the student to implement the assignments from scratch, so it’s kind of a necessary evil. Ultimately, I would still recommend the Machine Learning course to anyone looking to demystify the subject and get a good basis to explore further.

### Introduction to Mathematical Thinking (Stanford University)

This 10-week course teaches the basics of reading and formulating mathematical proofs. I enrolled sort of on a whim and ended up actually enjoying it more than the more popular Machine Learning one! Taught by Prof. Keith Devlin of Stanford, the course touches on formal mathematical systems, boolean logic, and proof techniques before introducing number theory and real analysis. As someone who just finished my first year, “proof” was kind of a scary word (“You think Calc II was hard, wait till you start having to do proofs in second year!”) but Prof. Devlin explains the concepts clearly and encourages the student to ponder the steps of each problem slowly. The logic you learn in the course is also closely related to semantics in Linguistics and computational logic in Computer Science, so if you’re interested in those fields and are looking for a bit of supplemental learning, I’d strongly recommend this course.

### Programming Languages, Part A (University of Washington)

This 5-week course is the first of a three-part course on programming languages and paradigms. It’s taught by Prof. Dan Grossman, who has to be the most enthusiastic of the professors I’ve seen on Coursera. Part A covers basic functional programming in Standard ML, which is apparently an outdated language but I quite enjoyed using it! ML’s type-system and pattern-matching were the main things I picked up from this course and I’ve found it a good basis for learning Haskell, which I’ve been dabbling with recently.

### Programming Languages, Part B (University of Washington)

The 3-week second part of the course picks up right where Part A leaves off, this time using Racket to teach delayed evaluation, interpreters, and the differences between static and dynamic typing. I’d already been exposed to Scheme from the book *Structure and Interpretation of Computer Programs* so this section wasn’t quite as knock-your-socks-off for me as it could have been, but the highlight of the entire series was definitely the made-up programming language you get to write an interpreter for in this part.

### Programming Languages, Part C (University of Washington)

This 3-week course wraps up the Programming Languages series by talking about object-oriented programming — and it gets pretty in-depth! The language of choice this time is Ruby, and Prof. Grossman uses it to cover inheritance, links between functional and object-oriented decomposition, and subtyping. I enrolled in all three parts simultaneously, so by the time I got here I had a lot of overdue assignments and had to rush. This might be the reason I found this part the hardest but it’s probably also the most useful and applicable part. Prof. Grossman’s bias in favour of functional style shows quite often in his explanations of Ruby’s strict object-orientation, but the overall message of the series shines here, namely that all programming languages are different but equivalent tools for solving a problem. The three weeks I spent madly rushing all three parts was definitely the highlight of my Coursera experience!

### Algorithms, Part I (Princeton University)

This 6-week course teaches fundamental algorithms and data structures in Java. Taught by Prof. Robert Sedgewick of Princeton University, this is the most bread-and-butter Computer Science course I took, which is probably why it was hard for me to get too excited about it. That’s not a judgement of its quality, however, as the course materials are well-designed and the assignments are really challenging. Note that although the instructors try their best to teach in a language-agnostic way, the assignments still have to be submitted in Java, so if, like me, you’re not that comfortable with Java’s object-oriented data structures, you might have to put in extra time and effort to pass them. The auto-grader was pretty cool though, even analysing the memory usage and running times of your programs. I only managed to get full marks on one of the five assignments, and if you’re into optimisation and a bit of a perfectionist, you can spend a lot of time (and have tons of fun, hopefully!) chasing that 100%.

### Final thoughts

Altogether, I’m really glad I discovered Coursera. The courses probably aren’t as rigorous or challenging as their “real” university counterparts would be, but in conjunction with reading textbooks and working on personal projects, many self-taught programmers have no trouble using MOOCs to enter the industry. Personally, I think they’re a great complement to my traditional education and I plan on taking more online courses in the future.