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.


Who am I?

A valid reason for discounting my views is that I am not the target audience for this course, hence the question of who I am and my level of programming expertise is relevant. I am a self-taught hobbyist programmer of moderate ability. I have never had any formal education in computer science and my profession does not in any way involve programming. Nevertheless I have taught myself programming through online tutorials and experimentation for about three years now and have recently been an enthusiastic participant in the MOOC phenomenon.

I will list the other CS courses I have taken on Coursera here because I will frequently refer to them to compare with this course. They are: An Introduction to Interactive Programming in Python from Rice University, Algorithms Parts 1 & 2 (still ongoing) from Princeton University and Programming Languages from the University of Washington.

I concede that this course is too easy for me. I knew that going in but still thought that this course had something to offer for me. In particular as a self-taught programmer I have never had to program in a collaborative environment and never had to show my code to anyone else. As such I wanted to learn how to properly document code, how to construct and run unit tests, how to debug systematically.

I do try to keep in mind who the target audience for this course and I believe that my comments here are still valid for them. Here comes the litany of complaints. Sorry.

Production Quality

Video production quality is pretty poor. They look like they were filmed in a classroom with harsh lighting with a poor quality camera. All of the other Coursera courses I have taken have much better quality than this, in most cases being filmed in a dedicated studio and with much better care taken about proper lighting. The Rice University lectures seemed to be filmed at home or in the professors’ offices, but they had a much better camera and appropriately soft lighting.

Sound quality is below average but overall acceptable.

Lecture Delivery

The professors look uptight and unrelaxed. They speak with precise correctness and enunciate every syllable with care. This may be great for hearing comprehension but I do not believe that the professors speak like this in front of real-life students at the University of Toronto. The video lectures give the impression that they are delivering an infodump, not actually trying to communicate to the student.

There is no attempt to convey passion or kindle enthusiasm. Contrast this with Dan Grossman of the Programming Languages course who jumped up and down on a chair to make a point that he wanted to ensure that the students could remember. Or the warmth and light-heartedness of the Rice University professors (they even invite a celebrity guest at one point!)

This point is further made by the lack of any welcome video laying out the goals of the course or any goodbye video giving suggestions to the student on where to go from here. In the Rice University course, professor Scott Rixner memorably promised that he would make course participants “dangerous” by the end of the course and indeed he ends the course by declaring that “you are now officially dangerous”.

Quantity of Content

The workload is far too light with less than one hour of video lectures per week. Often much less. Week 5 in particular has so little content that it’s mystifying why it wasn’t simply folded into Week 4, or greatly expanded in depth. Professor Gries ends the lecture on exceptions by saying that it is only a whirlwind tour. Indeed. But why is it a whirlwind tour? It’s not like you’ve exceeded your time limit or anything.

Similarly, there are far too few exercises and assignments. I find it astonishing that a beginner programming course would not give a programming assignment every week, no matter how simple. The only way to learn programming is to actually program. How many lines of code would a typical student in this course write if he or she worked through all the content? A couple hundred lines maybe? Three hundred? That’s far too few!

My final project for the Rice University course alone is over 800 lines. Admittedly I went way beyond the required specifications and but that’s just one project out of a dozen projects. Plus they have have weekly quiz Exercises and weekly peer grading work, which is especially useful in this case because the game projects allow so much leeway for individual creativity.

As an aside, I do give kudos to the Exercises which were sometimes more subtle than I expected, requiring a very precise understanding of the content being taught to answer correctly. However it could have been much improved by having a much larger set of questions to draw from. This would have solved the problem that emerged part way through this course of whether or not to show the student the correct answer to each question after submission.

Princeton’s Algorithms course sidesteps this by having all questions being randomly generated according to a preset pattern so the Exercises always show the correct answer and students are even encouraged to post the questions they don’t understand on the forums and discuss them.

A non-CS course that I took on Coursera, Introduction to Finance from the University of Michigan solved this by allowing only two attempts per week, and your overall score is based on the best of the two attempts. However, each of the two attempts are for a completely different set of questions but based on the same topic being taught. Of course this involves a lot more work since the professor had to create double the number of questions.

Finally I note that this course has more in-video quizzes than any other course I’ve taken here, which is great. They are sometimes used to fill out gaps in the lectures, which is not as good, and I note that the number of in-video quizzes seemed to decline over time.

Quality of Content

My main problem with the quality of the content comes down to the fact that the professors rarely take the time to provide a broad overview of each topic before delving straight into the content. There is no context, there is no explanation of how the topic being taught this week stands in the overall scheme of computer science.

For example, professor Gries delves straight into a discussion of specific algorithms without bothering to talk about what they are used for. Even professor Sedgewick of Princeton felt the need to explain why and how sorts are needed in the real world before beginning discussion of the elementary sorts. His example that a sorting algorithm was probably used to sort the transactions on your monthly credit card bill gives real-world context to the topic being discussed and provides something solid that a student, especially a novice student, can relate to.

Similarly, in Week 5 Gries starts talking about passing in functions as argument to functions, and I thought he might actually take some time to briefly explain that there is such a concept as functional programming and how it contrasts with the object-oriented programming used in most of the course. But he never does.

Furthermore I believe that his treatment of the subject would leave most novices bewildered. Yes, you can pass functions as arguments, but his example is so pointless that students would be left wondering why that would ever be useful. This would be the perfect opportunity to demonstrate the map function for example, but again he skips by this opportunity.

I also think that the lectures are woefully incomplete in ways that might mislead students. The algorithms section ends with a presentation of insertion sort and then nothing. I would have thought it prudent to note that the point of these lectures is to demonstrate how sorting can be accomplished in different ways (as with finding palindromes) and that these are indeed classic sorting algorithms. But modern systems do not actually use these sorts (with the exception of insertion sort in some cases) and that much more sophisticated and fast sorts exist.

Another example of lack of context in course lectures: teaching OOP without actually providing an overview of what it is and why it is used (an example of doing it right for example might be Oracle’s OOP tutorial about how objects encapsulate state and behaviour).

Conclusion

Finally I find that the course is badly organized with no clearly stated intent of what is meant to be achieved at its conclusion. Week 5 feels like an afterthought! Each week’s topic stands more or less independently of each other and there is no sense of building towards a goal. I hesitate to say that this is a bad course. As Dan Grossman pointed out at the end of the Programming Languages, students might have spent their time watching cat videos on YouTube instead. In that sense, participating in Learn to Program: Crafting Quality Code is not a waste of time. But I strongly feel that it would be a disservice to the many other great courses on Coursera to call this a good course.

Note that this has nothing to do with whether the courses are for novices or for advanced students. The Rice University course assumes no prior programming language at all but students go from zero programming knowledge to building their own version of the classic Asteroids game, gradually building up a body of immediately useful knowledge at each step.

This course is like a series of appetizers with no main course and certainly no dessert at the end. Each of the individual topics is a worthwhile area of study: OOP, unit testing, algorithms etc. but they are treated so shallowly that I doubt that the lectures would be of much use to a serious student. Instead this course looks to me like it may be of most use to students who are just venturing out to study programming and could use it as a sampler of the topics covered under computer science. Great if you’re still trying to decide whether or not programming is for you. Not so great if you actually want to learn something.

Leave a Reply

Your email address will not be published. Required fields are marked *