[Update: See also the follow-up post to this piece, An Intensive Bachelor's Level Computer Science Curriculum Program.]
A few months back we took an in-depth look at MIT’s free online Introduction to Computer Science course, and laid out a self-study time table to complete the class within four months, along with a companion post providing learning benchmarks to chart your progress. In the present article, I'll step back and take a much more broad look at com-sci course offerings available for free on the internet, in order to answer a deceptively straightforward question: is it possible to complete the equivalent of a college bachelor’s degree in computer science through college and university courses that are freely available online? And if so, how does one do so?
Yet, this does not mean that all the necessary elements for such a curriculum are not freely accessible. Indeed, today there are undoubtedly more such resources available at the click of a button than any person could get through even in an entire lifetime of study. The problem is that organizing a series of random lecture courses you find on the internet into a coherent curriculum is actually rather difficult, especially when those courses are offered by different institutions for different reasons and for considerably different programs of study, and so on. Indeed, colleges themselves require massive advisory bureaucracies to help students navigate their way through complicated degree requirements, even though those programs already form a coherent curriculum and course of study. But, still, it’s not impossible to do it yourself, with a little bit of help perhaps.
The present article will therefore attempt to sketch out a generic bachelor’s level curriculum in computer science on the basis of program requirements distilled from a number of different computer science departments at top universities from around the country. I will then provide links to a set of specific college and university courses that are freely available online which, if taken together, would satisfy the requirements of our generic computer science curriculum.
A Hypothetical Curriculum
So, what are the requirements of our hypothetical computer science program? Despite overarching similarities, there are actually many differences between courses of study offered at different colleges and universities, especially in computer science. Some programs are more geared toward electrical engineering and robotics, others toward software development and programming, or toward computer architecture and hardware design, or mathematics and cryptography, or networking and applications, and on and on. Our curriculum will attempt to integrate courses that would be common to all such programs, while also providing a selection of electives that could function as an introduction to those various concentrations.
There are essentially four major parts to any bachelor’s level course of study, in any given field: pre-requisites, core requirements, concentration requirements and electives.
Pre-requisites are what you need to know before you even begin. For many courses of study, there are no pre-requisites, and no specialized prior knowledge is required or presumed on the part of the student, since the introductory core requirements themselves provide students with the requisite knowledge and skills.
Core requirements are courses that anyone in a given field is required to take, no matter what their specialization or specific areas of interest within the field may be. These sorts of classes provide a general base-level knowledge of the field that can then be built upon in the study of more advanced and specialized topics.
Concentration requirements are classes that are required as part of a given concentration, focus or specialization within an overall curriculum. For example, all students who major in computer science at a given university may be required to take two general introductory courses in the field, but students who decide to concentrate on cryptography may be required to take more math classes, while students interested in electrical engineering may take required courses on robotics, while others interested in software development may be required to study programming methodologies and so on.
Finally, electives are courses within the overall curriculum that individuals may decide to take at will, in accordance with their own particular interests. Some people may prefer to take electives which reenforce sub-fields related to their concentration, while others may elect to sign on for courses that may only be tangentially related to their concentration.
Our hypothetical curriculum will simplify this model. We will assume no prerequisites are necessary other than an interest in learning the material and a basic high school education. Our curriculum will also not offer any concentration tracks in the traditional sense, as that would require specialized resources that are not within the scope of our current domain. Instead, our planned curriculum shall provide for introductory courses, general core requirements, and a choice of electives that may also serve as a basis for further concentration studies.
A quick survey of curricular requirements for programs in computer science at a number of the country’s top colleges and universities reveals a wide spectrum of possibilities for our proposed curriculum, from a ten course minor in computer science to a twenty-five course intensive major in the field along with an interdisciplinary concentration. (See, for example, MIT, Carnegie Mellon, Berkeley, Stanford and Columbia, or the comp-sci page for a college or university near you.)
Our proposed curriculum will attempt to stake out a space between those two poles, and aim for a program that consists of about 15 courses: 3 introductory classes, 7 core classes and 5 electives. The required topics and themes of a generic computer science degree program are fairly easy to distill from the comparison: introduction to the field, data structures, algorithms, programming languages, operating systems, networking, data communications, systems engineering, software development, and so on. Our program will consist of university or college level courses from around the world that cover our basic requirements and are freely available in full online.
Note: I have, unfortunately, not watched every single video from all of the courses below. However, I have completed three of them in full, viewed a handful lectures from a number of the other courses, and spot checked the videos from the rest for quality.
Intro to Computer Science, pick two of three:
- Introduction to Computer Science and Programming: MIT
- Intensive Introduction to Computer Science: Harvard
- Introduction to Computer Science and Programming Methodology: Stanford
- Programming Abstractions (Second Course in Unit): Stanford
Data Structures and Algorithms, pick one of two:
- Programming Paradigms: Stanford
- Computer Architecture: Carnegie Mellon
- Fundamentals of Computer Networking: Manhattan College
- Introduction to Data Communications: Thammasat University
- Introduction to Cryptography: Ruhr University
- Building Dynamic Websites: Harvard
- Computer Graphics: Berkeley
UPDATE: There has been a ton of great feedback on this post, with suggestions for additions, critiques of the overall form, identification of "glaring holes" and more. Thanks everyone! However, rather than address them one by one in the comments, or include them all into an update of some sort, I think I may just begin work on a new version of the piece which provides a more intensive track of study and tries to incorporate as many of those suggestions as possible, assuming that examples of such courses are available for free in full online from a college or university. So be sure to check back in future!
UPDATE II: See also the companion post to this piece, An Intensive Bachelor's Level Computer Science Curriculum Program.