Over the next 12 months, I’m going to learn the entire 4-year MIT curriculum for computer science, without taking any classes.
UPDATE: The MIT Challenge is now complete. I finished on September 26, 2012, just under 12 months after beginning October 1st, 2011. Click on “See More…” for any class to access my exams, official solutions or code I wrote.
Computers have always fascinated me. From finance to Facebook, algorithms are the hidden language that underlies most of our life. The largest transformations of our world are being written in code, and advancements in artificial intelligence allow us to use computers to understand what it means to be human.
Beyond the poetry of the machine, computer science is also immensely practical. Fortunes have been made and revolutions sparked on lines of code.
I’ve always wanted to speak that language. But, I didn’t want to invest four years of my life and hundreds of thousands of dollars to learn it.
I’m embarking on this experiment because I want to show that learning doesn’t require acceptance boards and SAT tests, thousands of dollars in debt, or even the 4-year pace most students assume is necessary to learn a subject.
Will I fail? It’s definitely a possibility—people a lot smarter than myself struggle through immense workloads at institutions like MIT, and I’m attempting to learn the same material at 4x the speed, without the benefit of instructors.
All I can promise is to share what I find with you. Listed below are all 33 classes I’ll be covering. For each of them, I’ll write the final exam and you can compare my answers to the MIT official solutions. I’ll also post any failures, so you can be sure I’m not omitting my mistakes.
Post-MIT Challenge Update
Since the challenge was completed, I’m using this space to share some of the new courses I complete or programs I’ve finished related to computer science.
- WordSmith – This is an AI I built that plays Scrabble. Free and open-source.
LEARNING PROGRESS (33/33):
Click on "See More" to view videos, access the courses and see my results
8.01: Physics I – Classical Mechanics – COMPLETED See more...
I completed this class in July as part of a pilot experiment to see if I was up to doing the entire program. The course is brilliant, Prof. Walter Lewin does an amazing job bringing physics to life without sacrificing intellectual rigor. Scott's rating: 5/5
18.01: Single Variable Calculus – COMPLETED See more...
This was the first official class I completed for the MIT Challenge. Solid lectures gave me a good sense of the basics of calculus starting from limits and going up to more advanced integration. Scott's rating: 4/5
18.02: Multi-Variable Calculus – COMPLETED See more...
This class extends the basic principles of single-variable calculus into more than one dimension. Very useful to know for understanding electricity, magnets, light or anything involving 3D objects. Scott's rating: 4/5
8.02: Physics II – Electromagnetism – – COMPLETED See more...
Another class taught by Prof. Walter Lewin, the demonstrations are amazing. Rigorous for those who want the technical details, but still approachable, discussing everyday concepts like rainbows and metal detectors. Scott's rating: 5/5
6.01: Introduction to EE and CS I - COMPLETED See more...
This is a good class, but I don't recommend taking it if you have no programming background, since it dives right into object-orientation with relatively little explanation. I really enjoyed the blending of more advanced concepts from AI and state machines into the core course. The course notes are free and excellent, although a lot of the focus is on robotics which use specialized equipment I don't have access to. (As a side note, many people have pointed out that the final exam I wrote wasn't fully comprehensive, you can read my in-depth reply here) 4/5
5.111: Principles of Chemical Science - COMPLETED* See more...
Good introduction to quantum chemistry, Lewis diagrams, acid/base and redox reactions. Also includes a more advanced section on transition metals and crystal field theory. Unfortunately the class did not have a viable final exam, so I was forced to use my practice midterms as the basis of evaluation. 4/5
7.012: Introduction to Biology - COMPLETED See more...
Excellent biology course which explores biology from an experimentalist's viewpoint, giving a grounding in the basics of biochemistry, immunology, genetics and ecology. Textbook is a good supplement as well, also showing the experimental mindset leading to the discoveries. 4/5
18.03: Differential Equations - COMPLETED See more...
An extension of calculus, differential equations allow you to model and analyze complex systems. They play a particularly important role in electrical engineering where they (and their discrete counterparts) are essential for understanding circuits, signals and systems. The video lectures associated with this class have significant deviations from the rest of the course content, which caused me to waste some time.3/5
6.02: Introduction to EE and CS II - COMPLETED See more...
This was a trickier class to take on since there isn't a class for it in MIT's OCW. Learning it meant sifting through the mostly hidden recesses of MIT's public archives to try to find notes and exams. A consequence of that is that filter design, a major topic, was completely missing in the notes and I was unable to complete the labs (6 & 7) or the exam sections that dealt with it. There was no final exam, so I completed all three midterms and graded them collectively.3/5
6.042J: Mathematics for Computer Science - COMPLETED See more...
Graphs, number theory, proofs, probability and counting are just a few of the topics covered in this excellent class. There aren't any video lectures, but the free course textbook is incredible and engaging. There is also a huge amount of resources to practice the problems, offering interesting challenges.5/5
6.006: Introduction to Algorithms - COMPLETED See more...
An introduction to algorithms and complexity theory. The course provides a good opportunity to apply algorithmic design concepts (dynamic programming, greedy algorithms, etc.) to actual programming problems, giving this class a concreteness that was missing in 6.042J. Unfortunately, I did not realize the final exam wasn't comprehensive before writing it, so I've also included my quizzes I had done for practice. I completed most of the assignments, however as there were no solutions, I have left them ungraded. 4/5
18.06: Linear Algebra - COMPLETED See more...
Excellent video lectures and abundant materials made this one of the more approachable courses in OCW's catalog. Prof. Gilbert Strang gives fluent, easily understood lectures. My first exam for this class was only a 56%, so I decided to take another day to write the higher-scoring exam I posted below. 5/5
6.041: Probabilistic Systems Analysis - COMPLETED See more...
A course in probability, it goes into the foundations of probability using calculus to analyze more difficult probabilistic questions than those posed in 6.042J. The textbook is designed for this course specifically, so it is extremely useful.4/5
6.002: Circuits and Electronics - COMPLETED See more...
This course covers the basics of digital and analog circuits. The exam was quite challenging and it marked the first exam where I actually ran out of time running it. Unfortunately the official solutions are MIT-access only, so I can't upload them here as a comparison. This class serves as a basis for many of the later EE classes, so I'm sure I'll get another chance to really be tested on the core concepts.4/5
6.046J: Design and Analysis of Algorithms - COMPLETED See more...
One of my favorite courses thus far! The class explores some of the more advanced concepts in algorithms not found in 6.006 such as proving particular problems are NP-Complete, approximation algorithms, encryption, sublinear algorithms and parallel processing. I had to be careful though since the OCW version of this course is prior to MIT's curriculum change where 6.006 was added, so it covers substantially easier material than the current versions. 5/5
6.034: Artificial Intelligence - COMPLETED See more...
Great class that covered a survey of different AI techniques including search, constraint propagation, neural networks, kernel machines, concept learning and natural language processing. I also completed 6 assignments for this class which required me to learn the programming language Scheme. One of the challenges with writing exams for this class was the variety in the syllabi, since so many different techniques were covered and the specifics differed from class to class.5/5
6.003: Signals and Systems - COMPLETED See more...
This class teaches the basics of signal and systems analysis, extending the mathematical techniques first discussed in 18.03. While useful for more than just circuits, the class is particularly important for understanding things like frequency modulation, audio filters, noise reduction and even serves as a basis for image analysis and manipulation. This also was the first exam which I failed initially, luckily I improved and scored a 69% on my second attempt. 4/5
6.004: Computation Structures - COMPLETED See more...
Great class teaching the crossover between electrical engineering and computer science. The design project involved building a gate-level CPU specification, that is building the circuitry to allow for a computer to be built. The only weakness was the class's relative lack of material, however the assignments and labs are strongly supported. 4/5
24.241: Logic I - COMPLETED See more...
Intro to sentential and predicate calculus, their derivation systems and metatheoretical proofs. I found the class rather dry and technical, but the class did offer good practice into more rigorous proof methods, as opposed to the more informal styles taught in computer science classes. Unfortunately, the exam answers I used to correct my paper aren't public, so I can't post them here. 3/5
14.01: Principles of Microeconomics - COMPLETED See more...
I had already taken microeconomics when doing my business degree, so the vast majority of this course was a recap. However, since MIT has a much stronger math basis than my alma mater, it was refreshing to see more rigorous technical definitions of many of the concepts. I spent a little under four days on this course, so most of my errors were from forgetting technical definitions and formulas since none were provided on the exam. 3/5
6.033: Computer Systems Engineering - COMPLETED See more...
A useful class teaching the basics of computer networks, encryption, client-server paradigm and the Internet. I found some of the class repetitive after 6.004 and 6.02, which had overlapping content, but it was still useful. I made the mistake of not focusing enough of the reading assignments since that's where a bulk of the learning comes from. 4/5
6.013: Electromagnetics and Applications - COMPLETED See more...
Without a doubt, the hardest class I've taken in the program thus far. The class makes heavy use of vector calculus, transforms and complex notation in addition to generally extending the principles of electromagnetism taught in 8.02. A strong foundation in the topics of 6.003, 6.002, 18.02, 18.03 and 8.02 is a good idea if you want to attempt this class. I only passed the exam just barely, so it's definitely a topic I'd like to revisit and refine at some point in the future, since it expressed a lot of interesting ideas.3/5
14.02: Principles of Macroeconomics - COMPLETED See more...
I had also done macroeconomics before when I did my undergraduate degree, so this was a recap mostly. That said, I thought the MIT version of the course and supporting material were much more accessible. It's a great class to take if you want to understand the economy as a whole.3/5
24.242: Logic II - COMPLETED See more...
This class was entirely based on 8 homework assignments, so the amount of testing material I went through was weaker than many others, unfortunately. That said, I loved this class, as Godel's incompleteness theorems represent one of the most profound ideas I've ever seen in a class.5/5
6.011: Intro to Comm., Control and Signals - COMPLETED See more...
This class was an extension of 6.003, Signals and Systems. It takes the basic concepts of signal analysis and filters and extends it to state-machine representations and stochastic signals. The inclusion of random signals is very useful for handling noise, so many of the concepts in this class are more practical than their ideal counterparts in 6.003. The free textbook/course notes was very useful.4/5
24.244: Modal Logic - COMPLETED See more...
Modal logic is the logic of possibility and necessity and extends the basic predicate calculus. It's an interesting logic to study because it can represent many diverse systems of logic, depending on the axioms taken (deontic, alethic, tense, etc.). The final exam was a take-home final, so I completed it over the course of two days. 3/5
14.20: Industrial Organization - COMPLETED See more...
Intro economics courses typically simplify analysis by assuming perfect competition or monopoly. This class removes that assumption and considers how firms compete strategically against one another. This class really sparked my interest in learning more about game theory. Unfortunately I didn't realize the sample final exam was fairly limited as a coverage of the content, but it was the best I could do. 3/5
14.23: Government Regulation of Industry - COMPLETED See more...
The content of this class was very similar to 14.20, although it focused more on the historical context and political framework than the game-theory side. An interesting class, the textbook reading sections were quite lengthy (nearly 900 pages) however the level of mathematical analysis was light, so it made for easy reading.3/5
14.48J: Economics of Education - COMPLETED See more...
Given the nature of my challenge, this was a fun class since it explored the various theories of education. Most of the class felt like a discussion in basic econometrics, as it appears the literature is inconclusive on many core ideas (are smaller classes better? do voucher programs work?). The class also explored the differences between the standard human-capital theory of education versus the signaling explanation, although, once again, the literature presented was mostly inconclusive.3/5
6.005: Elements of Software Construction - COMPLETED See more...
This is MIT's required software development class. It was a tough one, not because it is too intellectually demanding, but because of the amount of work. It consists of 3 team projects, 3 individual projects and several labs (assignments, in their own right). I was hesitant about taking this class on because the time constraints of the challenge make it difficult to take on classes like this, however, in the end I figured the only way was simply to do all the work.
I managed to finish the class in about 3 weeks, spread over around two months. It was one of the most rewarding classes, even if it was also the most time consuming. I would have liked to stay longer with each project, particularly the final instant messaging application I built from scratch, to embellish it with more features. The class is an excellent choice if you're already a novice programmer, but want to learn more high-level design ideas for not just writing working code, but well-designed code.
I've posted all of the projects I wrote here, although you'll need Java installed to run them. I also included the write-ups for the three design projects (sorry for the lack of contrast in the scans!)5/5
6.801: Machine Vision - COMPLETED See more...
This class teaches the basics of how to use computer algorithms to see, primarily under the context of guiding a robot to perform actions based on those images. Topics include binary image processing, edge detection, Gaussian extended surfaces, orientation and photogrammetry. The course was evaluated by two take home quizzes and counted as one of two graduate-level classes I took in the challenge.
Overall, the class was challenging, using techniques of Fourier analysis, vector calculus, linear algebra, quadratic programming and calculus of variations, so it was likely the most challenging class I've taken in applying mathematics. Unfortunately there were no programming assignments, which would have been interesting.5/5
6.837: Computer Graphics - COMPLETED See more...
This class teaches the basics of computer graphics, primarily ray tracing, although scanline methods are taught. The evaluation was based entirely on assignments (there were two minor quizzes, but they had no solutions so I didn't use them). Starting with a basic ray caster and flat shading, the assignments progressively built up the ray tracer to include matte shading, glossy reflections, cast shadows, transparent surfaces with indices of refraction, mirror reflection and procedural texturing. A project was also done on creating a grid acceleration data structure, which has no visual effect but greatly speeds up the relatively slow ray tracing approach to graphics.
Details on the programming environment used are included in the README.rtf for the code. The file is quite large, but it also includes all the images rendered so that you can take a look at the output even if you don't compile/run the specific scenes in question. (For comparison, MITs official outputs are included as sample_res.pdf for each assignment, so you can see how my raytracer compares).5/5
COSC 545: Theory of Computation - COMPLETED See more...
This class wasn't an MIT course but a graduate class in the theory of computation taught by Cal Newport at Georgetown University. This was a topic I had really wanted to study after enjoying both of MITs algorithm courses, but the MIT complexity theory course lacked any evaluation tools I could use. Some interesting ideas from the course are which types of problems can be solved by algorithms (meaning there is a process for solving any instance of the problem) and the restrictions on the speed and memory required to solve certain classes.
It also includes an extensive discussion on one of the most important and unsolved problems in mathematics, whether P=NP, which would have profound implications for society depending on its answer and despite decades of work and a one million dollar prize for its solution, nobody has been able to answer it.
There were two exams which I wrote and graded because they were non-cumulative.
FAQ for the MIT Challenge
- What rules are you following?
- Are you doing all the assignments, papers and projects?
- Does your curriculum differ from MIT's?
- What happens if you fail a class?
- Why are you doing this? Do you just love studying?
- Will you get a diploma for doing this?
- You're doing classes serially, isn't that just cramming for tests?
- What kind of past experience do you have with the subject?
- I'm a blogger/reporter/journalist--how can I contact you to share the story?
Because I’m not enrolled in MIT (or affiliated with them in any way) I’ve had to construct my own rules to make the challenge fair, yet feasible. The basic rules are simple:
- I consider a class successfully completed if I can pass the final exam (which typically means getting a grade of at least 50% although I aim for much higher).
- I write the exam under the same constraints of a student: no looking at the questions or solutions beforehand, no notes or forbidden material, same time constraints (the default is 3 hours if not specified).
- I grade the papers myself, comparing them to the actual MIT solutions. I’ll post both, so anyone can double-check my grading methods.
Keep in mind these are only the minimum requirements of my challenge. For classes which have a significant programming component, I try to do representative programming assignments, to the extent that this is possible.
For theory or math-based classes, final exams are generally a comprehensive basis of evaluation, so I'll use those as my evaluation. I still end up doing most or parts of the assignments and quizzes as preparation, but since I can't maintain consistency with this criteria over the entire challenge (many assignments are either unavailable or impossible to evaluate objectively) I'm doing them in an informal manner.
For classes with a significant amount of programming work or practical design problems, I'll try to complete most the assignments. However, since these are harder to evaluate, I'm still relying on final exams as the major criterion for these classes.
I spent nearly a month trying to piece together the closest mirror of MIT’s actual computer science curriculum to follow. Unfortunately, I can’t do this perfectly since some classes are impossible to evaluate (including labs and research classes), and others didn’t have any access online.
I am taking the same number of credit hours as an actual MIT degree, so where I couldn’t take one class, I replaced it with a similar alternative. In terms of volume of knowledge to learn, therefore, my curriculum is similar to the one suggested by MIT to its students.
The only other exception with MIT has to do with electives. I’m taking various non-computer science classes, to best mimic the HASS requirements for MIT students. These aren’t a perfect match, as the online courseware for arts is considerably weaker than for sciences at MIT.
You can see the actual MIT curriculum for computer science here.
Given the pace I’m attempting, I think it’s inevitable that I’ll fail a class. My main requirement is that I pass a final exam, so if I fail one, I’m allowing myself to take a different exam after.
My strategy is to take a fail-first approach, to be more efficient with my time on classes where I have several final exams I can use as the basis of evaluation. This is very different from university where a failure can be a real setback. That’s a benefit of self-education over rigid formal institutions.
Nobody likes studying, but everyone wants to be smart. Learning, getting to those insights and feeling smarter about a subject are immensely rewarding. Too bad many of us have forgotten this after years of punitive formal education.
I’ll admit, I may be a bit crazy, or arrogant, for wanting to complete a 4-year program in only 12 months. However, my real motivation is to show people that learning faster is possible and that it can be more fun at the same time.
No, and that’s exactly the point. Our society incorrectly equates knowledge with accreditation. Getting a piece of paper is great, and for many lines of work, it's completely necessary. But the equation is made so strongly that people forget the two things are different.
I already have a career as a writer and small business owner. I never want to work for a large corporation, where HR might scrutinize over my lack of a diploma. For me, I just want to learn computer science in case I want to start a new business or work for a start-up.
I have nothing against college. University was an amazing and worthwhile experience for me, and it could be for you as well. All I hope is that by showing an alternative, people who feel the current system doesn’t work for them can find another path.
No, but the difference is subtle. Most the classes build on past concepts, so my goal with each is to develop a deep understanding that I can leverage. Cramming is typically a resort to memorization to quickly pass a test then forget it. Understanding is harder, but not necessarily more time consuming (and a requirement if each class builds on the one before it).
As an update, Since the first four classes, I've been proceeding 3-4 classes in parallel at a time. Although this involves reviewing over a much shorter time span than is typical (1 month instead of 1 semester), it increases the benefits of spaced repetition.
Ultimately, my ability to comprehend and perform adequately on higher level classes will be the test of my method, since most freshman classes serve primarily as grounding for more difficult senior classes.
When I was still in high-school I did a fair bit of programming, mostly creating small computer games. In addition, I've taken 4 university-level computer science classes, when I attended the University of Manitoba for my business degree. Yes, I do have some prior experience with programming which will give me an advantage in the challenge. That being said, my prior level of skill isn't probably far from many of the CS students actually attending MIT and for whom the curriculum is based.
In addition, I completed the first course 8.01 Classical Mechanics as a pilot experiment for this main challenge in July of 2011. Therefore the number of classes I'm attempting in the 12 month period is officially 32.
You can contact me at firstname.lastname@example.org or use the form here. I'm going to be fairly busy (for obvious reasons) so apologies in advance if it takes me awhile to get through my emails, as I usually go offline when I'm working through a course.