Designing a Computer Science Program for Free (or Cheap)
By Matt Galvin · May 4, 2017
This blog post is for people like me who are interested in improving their knowledge about computers, software and technology in general but are inundated with an abundance of resources and no clear path to follow. Many of the courses online tend to not have any real structure. While it's great that this knowledge is available to anyone with access to the internet, it often feels overwhelming and confusing. I always enjoy a little more structure to study, much like in a traditional college setting. So, to that end I began to look at MIT's OpenCourseWare and compare it to their actual curriculum.
I'd like to begin by acknowledging that some time ago Scott Young completed the MIT Challenge where he "attempted to learn MIT’s 4-year computer science curriculum without taking classes". My friend Najmi here at End Point also shared a great website with me to "Teach Yourself Computer Science". So, this is not the first post to try to make sense of all the free resources available to you, it's just one which tries to help organize a coherent plan of study.
I wanted to mimic MIT's real CS curriculum. I also wanted to limit my studies to Computer Science only, while stripping out anything not strictly related. It's not that I am not interested in things like speech classes or more advanced mathematics and physics, but I wanted to be pragmatic about the amount of time I have each week to put in to study outside of my normal (very busy) work week. I imagine anyone reading this would understand and very likely agree.
I examined MIT's course catalog. They have 4 undergraduate programs in the Department of Electrical Engineering and Computer Science:
- 6-1 program: Leads to the Bachelor of Science in Electrical Science and Engineering. (Electrical Science and Engineering)
- 6-2 program: Leads to the Bachelor of Science in Electrical Engineering and Computer Science and is for those whose interests cross this traditional boundary.
- 6-3 program: Leads to the Bachelor of Science in Computer Science and Engineering.(Computer Science and Engineering)
- 6-7 program: Is for students specializing in computer science and molecular biology.
Because I wanted to stick what I believed would be most practical for my work at End Point, I selected the 6-3 program. With my intended program selected, I also decided that the full course load for a bachelor's degree was not really what I was interested in. Instead, I just wanted to focus on the computer science related courses (with maybe some math and physics only if needed to understand any of the computer courses).
So, looking at the requirements, I began to determine which classes I'd require. Once I had this, I could then begin to search the MIT OpenCourseWare site to ensure the classes are offered, or find suitable alternatives on Coursera or Udemy. As is typical, there are General Requirements and Departmental Requirements. So, beginning with the General Institute Requirements, lets start designing a computer science program with all the fat (non-computer science) cut out.
I removed that which was not computer science related. As I mentioned, I was aware I may need to add some math/science. So, for the time being this left me with:
Notice that it says
one subject can be satisfied by 6.004 and 6.042J in the Department Program
It was unclear to me what "if taken under joint number 18.062[J]" meant (nor could I find clarification) but as will be shown later, 6.004 and 6.042[J] are in the departmental requirements, so let's commit to taking those two which would leave the requirement of one more REST course. After some Googling I found the list of REST courses here. So, if you're reading this to design your own program, please remember that later we will commit to 6.004 and 6.042[J] and go here to select a course.
So, now on to the General Institute Requirements Laboratory Requirement. We only need to choose one of three:
- - 6.01: Introduction to EECS via Robot Sensing, Software and Control
- - 6.02: Introduction to EECS via Communications Networks
- - 6.03: Introduction to EECS via Medical Technology
So, to summarize the general requirements we will take 4 courses:
Major (Computer Science) Requirements:
In keeping with the idea that we want to remove non-essential, and non-CS courses, let's remove the speech class. So here we have a nice summary of what we discovered above in the General Requirements, along with details of the computer science major requirements:
As stated, let's look at the list of Advanced Undergraduate Subjects and Independent Inquiry Subjects so that we may select one from each of them:
Lastly, it's stated that we must
Select one subject from the departmental list of EECS subjects
a link is provided to do so, however it brings you here and I cannot find a list of courses. I believe that this link no longer takes you to the intended location. A Google search brought up a similar page, but with a list of courses, as can be seen here. So, I will pick one from that page.
The next step was to find the associated courses on MIT OpenCourseWare
Sample List of Classes
So, now you will be able to follow the links I provided above to select your classes. I was not always able to find courses that matched by exact name and/or course number. Sometimes I had to read the description and look through several courses which seemed similar. I will provide my own list in case you'd just like to us mine:
- 6.0001: Introduction to Computer Science Programming in Python : 2 parts consisting of Introduction to Computer Science and Programming Using Python and Introduction to Computational Thinking and Data Science
- 6.042[J]: Mathematics for Computer Science: Mathematics for Computer Science
- 6.S080: Brief Introduction to Python : A Gentle Introduction to Programming Using Python
- 6.01 : Introduction to EECS via Robot Sensing, Software and Control : Introduction to Electrical Engineering and Computer Science I
- 6.004: Computation Structures : Computation Structures
- 6.006: Introduction to Algorithms : Introduction to Algorithms
- 6.009: Fundamentals of Programming : closest I could find (based on class description), Introduction to Computer Science and Programming Using Python
- 6.005 (6.031) Elements of Software Construction : Elements of Software Construction
- 6.033: Computer System Engineering (CI-M) : Computer System Engineering
- 6.036: Introduction to Machine Learning : Machine Learning
- 6.045[J]: Automata, Computability, and Complexity : Automata, Computability, and Complexity
- 6.814: Database Systems : Database Systems
- 6.035: Computer Language Engineering : Computer Language Engineering
So there you have it, please feel free to comment with any of your favorite resources.