Tag Archives: Coursera

End of Algorithms 2 class

Part 2 of Princeton’s Algorithms course on the Coursera platform officially ended last week but I haven’t had time to write about it until today. I gushed about the first part of the course in a post last year and this is just the follow-up. It was originally meant to be offered at the end of 2012 (and the lecture videos have dates indicating that they were indeed filmed last year) but due to apparent problems with finalizing the exercises and assignments, the course was only opened at the end of March of this year. My thoughts:

  • I thought that Algorithms 1 was the best educational experience I’ve ever had and part 2 only goes on to confirm it. It is amazing in all respects. Based on discussions on the online forums with other students, it is my understanding that no other course available on the Coursera platform currently can match its wealth of teaching materials. It has lecture videos, PDF copies of the slides used in the lectures, extensive exercises, very interesting programming assignments, the code on the booksite provides a vast amount of examples to look at and its fiendish difficult interview questions will challenge you for weeks after the end of the course.
  • As to be expected part 2 is markedly more difficult than part 1. I’m pretty sure that the graph structures we learn in the first weeks of the course are more complex than anything else seen in part 1. I note that the official forums were pretty much devoid of dumb posts asking for help with elementary topics quite early on. There were some posts talking about the difficulty of the material early on and then everything was down to business. I surmise that the initial difficulty curve scared off plenty of people.
  • Part 2 only has four programming assignments whereas part 1 had five but they are all much trickier. Many students had high praises for the week 2 assignment which involved implementing the seam carving algorithm invented in 2007 and now used in many graphics editing software. It’s not just a toy program either since our own implementations can be used as elementary clients to perform seam carving on our own photos. I also liked the WordNet project which uses graphs to capture the relationships between words in the English language and is apparently used as part of the core of many programs that need to understand English, including IBM’s Watson computer. The other two projects were implementing the Burrows-Wheeler data compression algorithm and using graphs in an unconventional way to figure out whether or not teams have been effectively eliminated in baseball (or any other sports) leagues.
  • The latter stages of the course become increasingly theoretical. For example the professors provide an implementation of a linear programming solver but admit that it is only a toy solver and stress that serious users should look towards industrial-strength versions. This contrasts with previous work in the course in which the textbook implementations we study are suited for general use. The course ends with a discussion on reductions and a look at the classic P vs. NP problem in computer science.
  • The exercises used share the same format as part 1 of the course. The main purpose seems to determine if a student can manually trace how an algorithm works on pencil and paper. But the final exam in part 2 is a surprise in that it has a strong focus on the theoretical. Several students posted in the forums to note that the final exam feels like it wouldn’t be out of place in Tim Roughgarden’s Design and Analysis of Algorithms course. This is great of course since theoretical questions like this really test whether or not you understand the algorithms in question in a deep and intuitive way but tests like this are much harder for me.
  • While I could complete all of the assignments and exercises with a 100% score and I scored over 90% in the final exam, I feel that the difficulty of this course comes close to hitting my limits of what I can do. For example, for some algorithms, such as the fiendish Kosaraju-Sharir, while I can certainly follow the implementation and trace its results, I find that I can’t quite wrap my head around why it works and hence a deep, intuitive understanding of it. Similarly, for the data compression assignment, I can implement it and get it to work perfectly and why it works the way it does feels like magic to me.

So yeah, I greatly enjoyed the time and effort I spent on this course. My next Coursera course won’t be starting until mid-June or so which means I have some free time on hand until then.

Learn to Program: Crafting Quality Code on Coursera

One of the MOOC courses I’m taking on Coursera, Learn to Program: Crafting Quality Code, has effectively ended. It was taught by professors Jennifer Campbell and Paul Gries of the University of Toronto. It is by a large margin, the most disappointing of the online courses I’ve taken so far. What follows is a long post that I wrote on the official forums explaining why I was disappointed with the quality of the course:

 

This post will probably be unpopular. Judging from the tone of the posts in this forum, this course seems to be well-liked by many students. Yet I note that for many of these posters the first Learn to Program, which I did not take, appears to have been their very first programming course. I disagree with that assessment and have a low opinion of the quality and usefulness of this course. I started this thread to set out my reasons for holding this opinion.

Continue reading Learn to Program: Crafting Quality Code on Coursera

End of Programming Languages class

So the Programming Languages course is just about over. There’s actually one peer assessment yet to go and it will probably be a few weeks until the course staff tabulates and releases the results, but all of the serious work is over. I wanted to get this post written before I start on two new courses next week. It’s run by Dan Grossman of the University of Washington and ran for 10 weeks. This course used a slightly different schedule than other Coursera courses which usually had weekly sections. For this course, the eight course sections were spread out over the ten weeks so we didn’t have a predictable schedule of when each section would be released.

The course used three different languages, starting with SML for the first four sections, Racket for the next two sections and ending with Ruby for the final two sections. There was a programming assignment for each section, with exception of section 4 when we had a mid-term exam. At the end of it all, we have the final exam which is still ongoing as of the time of writing. There were no other quizzes though each section’s programming assignment had to be submitted twice. Once to the autograding system to test for correctness and once again to the peer assessment system to check for style issues and correctness isssues for which it was difficult to get the autograder to test for. One cool thing is that most of the programming assignments have optional challenge questions which award a small number of bonus points for a comparatively huge amount of extra work, just for those who want to run the extra mile.

Continue reading End of Programming Languages class