A couple of months ago, I’ve wrote about how impressed I was with Harvard University’s OpenCourseWare, namely the Computer Science 50 online materials. Back then I had just started watching a few videos of the lectures; now I feel as if I just completed the course — which I could, since you can be graded for a (expensive) fee. I watched the lectures (fastforwarding through the web programming and the silly parts) and completed almost all problem sets (again, skipping the PHP exercises): during the last couple of months, as per the exercises’ specifications, I wrote simple games such as a Sudoku with a rudimentary text-based UI, manipulated the raw data of BMP images, extracted JPEGs off a ‘formatted’ memory card, and implemented a command line spell-checker using some byzantine (at least for a newbie) data structures. All in good, old-fashioned C.
There’s something in the concept of video lectures that addresses both my instinct for self-learning and the inevitable need for some sort of formal training in technical subjects. Programming-wise, my learning process has been quite a mess, and my only formal training on the subject was a quick course in Visual Basic back in 1999, and a Web Technologies course during my Master’s, which may have filled some gaps in my knowledge of stuff such as HTML, PHP or SQL, but in the end didn’t add much to subjects I have been learning on my own since years earlier. Perhaps I could have dived into something more genuinely ‘computer-sciencey’ such as C as well, but these were matters I always found too arcane when read about. On top of that, I’d hear people referring to C++, perhaps because of its weird name (we all obvously missing the joke), as the ultimate in unnatainable programming-fu (which it is definitely not — unnatainable or ultimate in any way), and as my life took me to other places I just lost interest in learning more programming.
Slowly I came around as my plunge into web programming brought a few nagging questions I felt related to a lack of some basic insights. And in that process I noticed that indeed there are some matters that seem much easier and attainable if you listen to a verbal explanation instead of just reading a manual; and that is why I found video lectures the perfect balance between formal training (without the formalities of schedules or not wearing pajamas to class, etc) and self-teaching (without the dryness and the sudden inferences of readers’ knowledge found in most programming books*). And two particular insights are worth mentioning:
Firstly, C isn’t complicated: what it is is really basic, in a way that forces you to write everything. After learning about memory management in C, never again will I mumble when PHP forces me to type array(…) to get a hashtable — other languages may have prettier syntax, but I take PHP’s gladly over implementing the hashtable myself. Anyway, now I feel I able to take on learning any new language with more confidence. Perhaps I’ll have a go at some LISP, through the Abelson and Sussman MIT lectures. Or perhaps I’ll try the printed page again and Seven Languages in Seven Weeks.
Second, I found new respect for the command line. Like many who endured the MS-DOS prompt in order to get the right memory settings to play Dune II, I had a deep-set dislike of command line interfaces. But while learning C I started to get the Unix command line a lot better, moving a bit beyond a handful of often used commands or the incantations copied and pasted from help forums. Being used to the Windows desktop for my work, a decent Unix-like CLI like Cygwin quickly became an important part of it. I’m too old and wary of fetishism to engage in the h4x0r pretense command lines are the Only True Way, or to believe ordinary computer users are somehow ‘lusers’ **. I say go for what you need to do, and go for you want to do, the most confortable way. I found the CLI indeed more confortable for many tasks.
At the moment, I actually don’t intend to do much with my new knowledge in C. I might cross the short bridge into C++ in order to do stuff with OpenFrameworks, but don’t feel compelled just now. I wasn’t, after all, specifically motivated to learn C. What I wanted was to know more, and I got it.
* Which is why I found Daniel Schiffman’s Learning Processing such an incredibly refreshing exception.
** Something must be said of some communities’ pathological need to generate unintuitive jargon and drive towards user-unfriendliness (and quite often despite pleasing-looking websites). Look at the Unix man(ual) pages for (some) contrast, or PHP’s thorough and easy to read documentation, which I believe to be the reason for the runaway success of a language often derided as a ‘verbose monstruosity’.