As you may or may not know, I have zero formal training is programming or software development. I am self-taught, which really means I have learned at the hands of those willing to share their experience and know-how, and by digging around the internet and must bookstores for helpful resources.
All told, I’m pretty proud of what I’ve been able to accomplish thus far. Over the course of a few years, I consider myself to be reasonably skilled, and I have found I can hold my own in discussions with those I tend to call “real developers.”
The more I learn, of course, the more I realize I don’t know. With the high-level tools and frameworks available today, it is easy to delude oneself into thinking “I know something,” when in reality, you are only scratching the surface. Down underneath the frameworks, and the CLR and/or the JVM and/or the V8 engine which runs your Node.js code, there are layer upon layer of additional abstractions, which, while making our coding lives much easier in some respects, also serve to obscure some of the central concepts of computing.
Hungry to Learn
I am one of those who “discovered” programming late (I am no longer in my twenties. Or thirties). I am not currently in a position to go back to school to get a CS degree, nor do I necessarily think it would serve me effectively at this point. But I am hungry to learn, as much as I can, always.
Iris Classon recently tweeted that she was taking Harvard CS50 on line, for free through the Harvard Open Learning Initiative, one of a slew of programs available through top-level universities which make certain course lectures available on line, along with notes, problem sets, and other supporting information. If you are not following Iris on Twitter, or subscribed to her blog, go do both now. Like myself, Iris appears to be in love with learning, and has a steady stream of terrific content in both places.
Inspired by Iris’ example, I decided that I, too, would take this course, both to review what I think I know against the academic perspective, and to hopefully fill in some fundamental gaps in my knowledge.
Finding the Right Course and Materials
The course in question is Intensive Introduction to Computer Science, Harvard CS50. The lecture series is presented by David J. Malan, PhD. The course is most easily located at the Harvard Extension School site under Free Online Computer Science Course. However, the video downloads/links available here are actually from 2008, and there are no links to course exercises, lecture notes, or other supporting materials.
To find the most recent lecture series (the content changes slightly from year-to-year to match pace with technology), you need to navigate to the main CS50 course page at the Harvard.edu domain. From here, there are links to the most recent lecture series (2013 as of this writing), as well as a plethora of problem sets, video “shorts” which focus in tightly on specific topics, and lecture notes/slides.
You Get What You Put In – Even When it is Review
The course is called Intensive Introduction to Computer Science. It is both an introduction, and it is intense. In other words, the course targets a wide range of folks, from those with very little technical know-how, to those who maybe have some coding background, but who lack the formal academic experience (like me!). What does this mean?
It means that a good deal of the course material (particularly in the first two weeks’ lectures) is in part review. But it is a good review, from a new perspective. Obviously I already know and understand things like conditionals, loops, and data types. However, learning about these things from another perspective is helpful. There is value to be had in re-visiting these, and other familiar topics, from an academic perspective, and from the ground up.
Reviewing basic concepts from the lowest level, leading towards programming in straight C, reveals many of the underpinnings of high-level abstractions we may take for granted in our higher-level languages. For example, there is no such thing as a string data type in C. All C knows about are arrays of characters, which (as you likely know) are merely numbers mapped to a specific character set. While at some level I already understood these ideas, the understanding was reinforced through the lecture discussion.
In other words, a lot of this course will be examining things I already know, to varying degrees. The value for me is:
- Reinforce my current understanding of familiar topics
- Validate what I think I already know
- Invalidate where I may have it wrong
- Complete the picture in cases where my understanding in incomplete
- Provide a new perspective
With all of the above in mind, my plan is to go through each lecture as if I were enrolled. I will watch the whole of each lecture segment, complete the problem sets assigned for each week, and in general do my best to make the most of the time invested. No skipping ahead. No deciding I already know this part. Up to and including coding up the most rudimentary “Hello World” exercises.
A Great Balance of Depth and Breadth
Linux and C
Much of the course content focuses on teaching concepts using Linux, and the C programming language.
Having “grown up” so to speak in the world of Windows and GUI’s, I have nonetheless in recent years stepped out of my comfort zone into Linux. I consider myself an accomplished beginner with *nix. I understand some of the most basic underpinnings of C, but look forward to expanding my know-how of this low-level, high performance language through this course.
I do not expect to do much day-to-day programming in C outside of courses like this. However, it will be exceptionally helpful to understand how things work deep down. Also, learning the ins and outs of C compilation, makefiles, and linking have real-world application while using any *nix-based OS.
I DO intend to continue learning and using Linux. Most of what I already know from using Linux appears to be sufficient for most of what we will be doing in the course. However, any opportunity to flex the *nix muscle is welcome, and now I will be able to add programming in C to that equation.
I intend to blog through this experience. While nothing here is earthshaking for most who might read this, for me it is as much about making the commitment to see the course through, review or not, which will determine (to some degree) the value I will get from the effort.
More to come. I hope to post at least one item each week detailing what I feel to be the most interesting or valuable take-aways (for me) form that week’s learning.
Additional Resources and Items of Interest
- This is CS50 – The On-Line Course and materials at Harvard.edu
- The Harvard Extension School
- In Love with Code – Iris Classon’s Blog