DIY-ing a Stanford CS degree in one year

Sat Jan 30 2021

tags: public computer science self study learning

Introduction

Can we, through self-study, learn as much CS as a Stanford CS graduate would learn? And (stretch goal) can we do it in a year?

Spreadsheet tracking my progress here.

What would be the point?

If you wanted to optimise for getting a big job offer your time would probably be better spent grinding LC (for regular SWE jobs) or learning the ins and outs of C++ (for quant trading).

There is obviously no credential from doing this. That's not really important to me since I already have a degree from Oxford, so there would be very little (if any) marginal signaling value.

So what's the point? The main purpose for me is to fill up all the gaps in my knowledge. Having rubbed shoulders with folks like Bernard/Mark/WH/Julius/WN/Vig, I know there's still a lot I don't know, and I know there's a long way to go before I can match them. I want to fix this.

I also hope that some of these more "fundamental" concepts will be useful in my future work. In particular, I expect OS, networking, and databases to be particularly useful.

And of course, there's the joy of learning new things as well.

Why this? Why now?

Motivation is manyfold:

  1. IMDA has asked me to come up with a personal development plan, and Eric recommended several courses
  2. I want to fill in the gaps in my knowledge to become the best SWE I can be
  3. The pandemic has forced many lecturers to upload their (very high quality) resources online and think about how to teach in a non-lecture style
  4. CS is very easy to study online (many projects/lab-based with no final exams)
  5. As a corollary to 4: If I self-study CS that frees me up to study maths/stats/ML for Master's

"Rules of the game"

The (very much self-imposed) rules for each module are:

  1. Don't skip any of the lessons/work unless strictly necessary
  2. Have a final project, paper, or something "real" to show for every course taken

A corollary to point 2 is that I should look for courses that are lab-based/project based. It's fortunate that I enjoy those courses better anyway.

There's no real need to do all Stanford courses: I'm happy to mix-and-match with MIT/other similarly (or more) rigorous offerings. For instance, instead of doing Stanford's CS 244B Distributed Systems offering, I am currently working through MIT's 6.824 Distributed Systems course with the NUS SoC folks.

Also, there's no need to strictly follow any "honour code" to do all the work myself. This is for three reasons. Firstly, since this is a self-directed project with no signaling value, the only person I would be cheating is myself. Secondly, doing work with someone else may give me the motivation to push through periods of low motivation/a part that I am blocked on. Finally, technical issues might stygmie my going it alone: most recently for CS140E/CS107E WSL2 didn't support UART so Wei Neng and I had to pair program.

Can you really do it in a year?

To graduate, a Stanford CS student must finish courses in all of these topic areas source: Stanford website:

  1. Mathematics
  2. Science
  3. Technology in Society
  4. Engineering Fundamentals
  5. Writing in the Major
  6. CS Core
  7. Senior Project (Software Project)
  8. Electives

This takes four years for a regular Stanford undergrad, but there are several reasons why I can do it quicker:

I've already done equivalents of several courses

  • CS109 Introduction to Probability for Computer Scientists: I've done a lot of this in my own probability course in uni.
  • CS106B Programming Abstractions: already know a lot of what is covered.
  • CS161 Design and Analysis of Algorithms: did Tim Roughgarden's course on Coursera.
  • CS229 Machine Learning: done Andrew Ng's course on Coursera.

We are at liberty to skip many of the non-CS courses

A regular Stanford undergrad needs to do compulsory Science modules, but I will skip them. I will also skip "Technology in Society", "Engineering Fundamentals", "Writing in the Major", because they are fluffy, and God knows I got enough writing in my major...

After skipping the science courses and fluffy modules, what's left for me to do is the following (strikethroughs denote courses I either already did, or already know from my own self-assessment):

  1. CS 103 Mathematical Foundations of Computing
  2. CS 109 Introduction to Probability for Computer Scientists
  3. MATH 19 (Calculus I)
  4. MATH 20 (Calculus II)
  5. MATH 21 (Calculus III)
  6. MATH Elective 1 (PHIL 151/CS 157 Computational Logic?)
  7. MATH Elective 2 (linear algebra? real analysis)
  8. CS 106B Programming Abstractions
  9. CS 107E Computer Systems from the Ground Up
  10. CS 111 Operating Systems Principles
  11. CS 161 Design and Analysis of Algorithms
  12. CS 194W Software Project

I also need to do seven electives. Some electives that particularly interest me are:

  1. CS 140e Operating Systems
  2. CS 144 Introduction to Computer Networking
  3. CS 190 Software Design
  4. CS 228 Probabilistic Graphical Models
  5. CS 229 Machine Learning
  6. CS 230 Deep Learning
  7. CS 231n Convolutional Neural Networks
  8. CS 244B Distributed Systems
  9. CS 245 Principles of Data-Intensive Systems

The normal pace is for chumps

I took three years to do my degree, and by all metrics did it very well. That's 523=15652 * 3 = 156 weeks. But---thinking back---since the terms were only eight weeks long, and Trinity Term of final year doesn't really count, that's a total of 88=648 * 8 = 64 study weeks. Of course some of the holidays were spent revising, but on the flip side there were also many days during term where I didn't work much if at all.

If one devoted yourself full-time to the pursuit I am confident that one could do the PPE degree in a year. At the very least one could give it a damn good shake.

I can do it: should I do it?

Similarly, if I devoted myself to this I'm pretty sure I could do it in a year. The question as always is whether I could do it but whether I should do it. Is it better to spend my time doing blub studies instead? Or more Leetcode? Or more side projects? Or write more essays that nobody reads? I'm not sure.