I’ve finally finished what was, for me, a fairly gruelling ten week slog.
Using Coursera, a platform offering free University-level courses to anyone who’s interested, I tried Introduction To Programming Languages as a first course. I met the requirements (just, sort of, not really), and figured “eh, it’s an introduction. How hard could it be?”
I made the mistake of thinking that this was going to be an introduction to the three programming languages on the course. It was actually an introduction to programming languages in general, and concepts in programming language design. I found even the first homework difficult, and struggled through much of the course. It was frustrating, and ate up almost all my free time for the entire ten weeks the course ran (and although I’ve completed the final exam, I still need to complete some peer assessments).
The lesson from this is that open courses are not an easy option, and it is probably not something that most people will be able to do in their spare time without major sacrifices. The courses can be extremely challenging at an extremely high level. It’s not simple stuff. For me, this difficulty was exactly what rendered the courses such a rewarding experience, and really re-affirmed my assumption that what I was learning was really worthwhile rather than just coding busy-work.
On that note, the lectures were top quality. Concepts were taught in a way that seemed very natural, code provided to explain ideas was very clear and useful, and the entire staff (from University of Washington) were extremely dedicated. My thanks to them. Moreover, the concepts built and fed into each other in a very subtle, unassuming way that made ideas that would have frazzled my brain at the start of the course fairly clear by the end. Professor Dan Grossman regularly interacted with and helped students in the forums, and following on from that, the community was incredible. The interaction between people who’d been programming in C for 16+ years, Haskell evangelists and complete novices (like me) was invariably friendly and invariably helpful. It was a great experience.
Just thinking about how much I learned on this course staggers me a little now. Before the course, I had no idea what thunks, streams, or mixins even were, and (as it turns out) I only had a shaky grasp of interfaces, subclassing, and data structures. It would take me twenty minutes to work out what a simple recursive function did, and twenty more to implement my own. I’m now fairly comfortable with functional programming (more comfortable than I am with OOP, in fact), I can edit SML and Ruby with confidence, and I can write programs in Racket. My understanding of Java and its seemingly arbitrary rules and regulations has improved no end, although the syntax looks a lot uglier and more verbose than it used to (and it always looked quite verbose).
In the end I think I got a grade of around 80 (scores aren’t finalised until peer assessments finish), and I would be upset with anything below 70 given the huge amount of effort I put into this course. That’s another thing about these courses – theoretically, the grade doesn’t matter, but once you’ve invested some time into them it becomes just as important as if you’d paid for the course.
I’d recommend this course to absolutely anyone interested in programming should it come up again, and I personally enjoyed my experience with Coursera immensely. I should probably note that there were a few bugs in the autograder, but that these were always found extremely quickly and dealt with almost instantly.