After a year spent learning MIT’s computer science program independently, I’ve gotten a number of emails from people who want to do the same thing. People who want a computer science education but don’t want to wait four years and pay thousands of dollars to get it.
I’m very happy with how I conducted the challenge, but I wouldn’t recommend most people follow my plan identically.
My goal was to publicly tackle a hard academic program. I wanted to learn practical skills, but because I’m a full-time blogger, not a full-time programmer, I didn’t mind taking classes which were more math or science.
Many of the people writing me want to repeat the MIT Challenge so that they can become great programmers, possibly landing jobs in the industry. Given that’s a more popular goal than investing a year full-time just for intellectual satisfaction, I would definitely make some modifications to my challenge for those interested in repeating it.
Downsides to an MIT Education
Whenever you design a curriculum, you’re making tradeoffs. You choose what to emphasize and what to downplay. MIT does this. Every school does.
There are many advantages of an MIT education. The material is excellent and the teachers are world class. The expectations are high, so passing an exam is a good sign you really understand the ideas. The material, especially for graduate classes, is focused on cutting-edge innovations in the field.
But there are also tradeoffs MIT makes when teaching it’s students which I feel are important to take into account if you’re wanting to self-study the program and not receive a degree for your effort.
MIT is Math and Theory Heavy
Doing the MIT Challenge I learned a lot of math. Now don’t get me wrong, I enjoyed those classes and I wouldn’t have changed it if I had gone back. But the amount of math was probably unnecessary for being a decent programmer.
MIT’s bias towards theory and math-heavy classes, and the relative dearth of programming, was a contentious point during my challenge. Many people claimed it was impossible to do the programming work of a 4-year challenge in one year. Except that MIT doesn’t do nearly as much programming as other schools.
In the four classes of computer science I took from my alma mater, the primary emphasis was programming. Even the exams were more than half handwritten computer programs we had to make.
MIT does have programming assignments, and I did a lot of them (and there were also lab classes which had more programming which I had to substitute out during my challenge). The difference is only relative to my experience with other schools which did tons of programming but probably wouldn’t have gone into the full correctness proof of the SVM algorithm using Lagrangian multipliers.
My impression of MIT is that it assumes learning to program is the easy part, so it puts more emphasis on the big theoretical ideas of computer science. This is an understandable position, because they want to prepare their graduates to do innovative work, not just prepare them for their first entry-level job.
MIT Teaches a Rounded Program
Another laudable goal of MIT instruction is that they expect all their graduates to be well-versed in the science and arts. This roundedness to the curriculum is noble, but perhaps impractical for someone who mainly wants employable skills.
During the program I studied biology, chemistry, physics and economics. These were great classes, and I enjoyed them, but they could probably be omitted if you only wanted to learn about computer science.
MIT is Highly Extracurricular
Another reason I feel MIT’s course curriculum downplays the programming aspect is that they expect you’ll learn that on your own. Most MIT students will do summer internships or extracurricular projects which will supplement the theory-heavy courses.
Since my challenge, and any self-education attempt to replicate MIT’s curriculum would omit these side projects, it’s important to take that into account.
MIT Merges Electrical Engineering and Computer Science
Another quirk of the MIT program is that it also covers electrical engineering. As a result, I learned quite a bit about electrical engineering which is arguably only distantly related to computer science in the day-to-day work of a programmer.
I think there is some value of learning the basics of electrical engineering, particularly computation structures which shows how computers are made of wires and semiconductors. However if my main goal had been practical, not intellectual, I would have skipped most the EE courses to put extra emphasis on the CS.
I’m glad I followed MIT’s curriculum, but I’m aware that many people aiming to follow me have different goals and are unaware of these emphases in MIT.
What I Would Change for a Programmer
You can see the curriculum I followed here, and MIT’s actual 4-year computer science curriculum. It’s not a perfect replica, but my main goal was to get as close as humanly possible, both in volume and in subject matter.
However, if your goal is to become an excellent programmer or have the foundation of a computer science degree to serve as the foundation of a professional skill, I don’t think perfect imitation is the ideal benchmark.
Here’s how I would change the curriculum I used to better suit those aims.
What I Would Keep
Here are the courses I thought were particularly useful to know, as a programmer. The list is not exhaustive, and there are useful classes I didn’t take. Many of these are more theory oriented, but they teach useful theory for someone who wants to build things in code:
18.01: Single Variable Calculus
6.01: Introduction to EE and CS I*
6.02: Introduction to EE and CS II
6.042J: Mathematics for Computer Science
6.006: Introduction to Algorithms
18.06: Linear Algebra
6.046J: Design and Analysis of Algorithms
6.034: Artificial Intelligence
6.004: Computation Structures**
6.033: Computer Systems Engineering
6.005: Elements of Software Construction
*Technically, this class requires having done the two intro physics classes, but considering the only reason for this is to understand voltages and simple circuits, you could just learn those from KhanAcademy videos and skip the two physics classes (although they are very well taught).
**This class requires Circuits as a prerequisite, but I believe you’d have sufficient coverage from 6.01 and 6.02 to cover it and taking 6.002 would be overkill.
These are the core CS courses I took. I would also consider taking additional courses based on your particular interests in computer science. I did machine vision, computer graphics and theory of computation as well, but the above 11 classes would be the most beneficial, even though it’s only a third of the classes I took.
What I Would Add
In terms of more classes, I would first consider adding an intro programming class if you’re starting from scratch. 6.01 is technically MIT’s first class, but it races through the beginnings of Python which could be daunting for someone who is new. I’d also include Khan Academy to make sure you have the appropriate math background to start taking calculus (not strictly necessary, but useful for understanding AI, graphics and some more advanced topics).
Some other academic subjects I would like to cover better, but weren’t explored deeply for the MIT Challenge would be:
- Operating Systems – This is covered in 6.004, but only as a section.
- Programming Paradigms – I did this separately from the challenge, but this set of lectures from Stanford is really good.
- C and C++ – Most of MIT’s classes are done in Python. One used Scheme and the main software development class used Java. I didn’t use any C during the MIT Challenge, and I only used C++ in the computer graphics course which didn’t teach using the language beyond the basics.
More Projects, Fewer Courses
Given the stripped down courses I listed plus the few additions I mentioned, you would have roughly 15 courses, less than half of the ones I took in the challenge. Adding to that, I would put the rest of my emphasis on working on interesting projects, not more academic classes.
The MIT Challenge did have projects, but school projects are very different from self-started ones. With an academic project the constraints and aims of the project are provided. With a self-started project, you must discover and create the constraints for yourself.
I’m in this phase myself, doing self-started projects to learn more about computer science and get to a higher level of skill as a programmer. I don’t have a perfect guide, but here are some rough categories of projects I want to work on to test my skills in different areas:
- Create a project that involves some machine learning
- A web application
- A project involving interesting uses of graphics or sound
- Build something using robotics
I’m not sure I’ll get to all of these projects, but they are interesting areas and allow me to expand on the theoretical foundations I’ve picked up in classes. Were I doing the MIT Challenge again with the sole aim of becoming a programmer, I would have spent at least half my time doing these kind of unstructured projects.
Since the MIT Challenge, I’ve finished one project on that end. I built an AI which plays Scrabble, so you can play against a computer that always plays the highest scoring word. For my next mini project I think I’m going to redevelop it so that it can be a JavaScript application I can put online for free.
Self-Education and Impractical Knowledge
I learn because I’m interested in many things and I’d love to be educated on many topics even if they don’t have any real practical necessity in my life.
One of my favorite classes was Theory of Computation, a graduate class exploring what computation is and the inherent powers and limitations of algorithms. It was fascinating, but the material was so esoteric I doubt I’ll ever need it when writing a computer program.
I’m aware that most people don’t share my love for knowledge, even impractical, so I feel my above modifications are better suited for someone who wanted to follow the MIT Challenge, but strip away the superfluous.
To me, the power of self-education is that the world is a fascinating place that I’d like to know more about. Not needing to pay tuition or deal with labyrinthine bureaucracy to get at it is a huge advantage. I know many people who paid thousands to study a useless major because they didn’t realize that learning doesn’t need to be expensive.
But self-education is also a tool you can apply to get better jobs, clients or business opportunities. If that is your primary aim, then the power of self-education is that you can tailor it specifically to your goal.