Description
(I'll update this as I go along)
Proof of completion (you have to scroll sideways a bit)
Originally written: Tuesday, June 9, 2020
Course-by-course review (FINISHED!)
Took 2 years (late May 2018 - early June 2020)
My significant advantages:
- used to teach college math. So I skipped math classes
(there used to be A LOT MORE math in the curriculum, some of you might remember!) - worked on OSSU full time
Disadvantages:
- easily demotivated, difficulty feeling rewarded
I am Strongly biased towards math and functional programming, biased against object oriented programming. I learn by doing, I dislike long lectures/concepts/info dumps.
What happened in 2 years?
- two deaths in the family
- got demotivated and "quit" twice: once for 3 weeks, once for around 2-3 months
- lots of stress from economic/political/war stuff that happened where I live. Had a few panic attacks! Financially OK (quit stock market early enough to avoid losses)
- hardware problems:
GPU broke right when I was taking CUDA programming. The irony!
Burnt motherboard's CPU socket from too long parallel execution. CPU is fine though! - COVID-19 (right at the end, during my Spec. Quarantine took a psychological toll on me. Also good luck finding hardware in a pandemic!)
- Lost much weight, built a little muscle
Courses I took, roughly in this order:
- CS50
- How to Code 1,2
- PLABC
- Learn Prolog Now!
- Haskell from First Principles
- Nand2Tetris 1,2
- Intro to Networking
- Hack the Kernel
- Intro to CS and Programming using Python
- Core Theory
- Databases (Stanford)
- Computer Graphics (skipped last assignment)
- Machine Learning
- Compilers (from Udacity)
- Software Debugging
- Software Testing
- Software Architecture & Design
- LAFF - On programming for correctness
- Intro to Parallel Programming (very hard!)
- Functional Programming in Scala (5 courses, free to audit the whole thing!)
Courses I took that are NO LONGER on the curriculum:
- Software Construction 1,2
- Cryptography 1 (very hard MATH course)
Courses I took that are NOT on the curriculum:
- CS50's second half and its final project
- Software Processes (from Coursera)
- Software Architecture (from Coursera)
- Functional Programming in Haskell (from FutureLearn)
- Design of Computer Programs (Udacity CS212)
Courses I did NOT take that ARE on the curriculum:
- Software Engineering Intro/Capstone
- The Security courses that were added recently
Things I wish I knew / I wish somebody told me before:
- difference between Computer Science and Programming. Apparently it's huge! I was more interested in Programming since I have theory from my math background. Ironically it turns out I don't like Programming that much. Much prefer CS, especially algorithms.
- How to create a "learning lifestyle" and stay motivated, feel rewarded.
Those "Mindshift" classes buried at the bottom of EXTRAS should be the first thing we are required to take!
The "shining core" of OSSU
- CS50, PLABC, N2T, Core Theory and Machine Learning.
Best Courses:
- Core Theory (Kruskal's Minimum Spanning Tree algorithm with Union by Rank and Path Compression and its running time analysis with the Inverse Ackermann function are so beautiful, I had tears in my eyes!)
- Nand 2 Tetris (makes you feel like you can do ANYTHING)
Most useful courses: Core Theory and PLABC (by far)
Takeaways:
- Be very clear about your goals and expectations from the beginning. OSSU might not give you what you expect!
- If you only "kinda" like CS/programming, it looks "cool", but you don't "love" it, it's gonna be hard. Maybe reconsider? Or do only as much as interests you? Put things into a long term perspective.
- Specializations are no big deal. Like "normal" courses. By far the most useful to prepare me for the Spec were PLABC and the Haskell book. The rest were not relevant. I could have EASILY taken the Spec after those (I had not even taken Core Theory at that point).
- Don't pay! Not even for Specializations. They offer very little support and some stuff is outdated. Not worth the money.
- Sometimes I focused way too much on finishing a course as quickly as possible and getting it out of the way, moving on to the next. I did not learn too well. When confronted with courses that were not very good / that I did not enjoy, my motivation would switch from learning to "getting it over with", forcing my way through. Don't do this! Better to skip such courses entirely.
- Physical exercise is extremely important to stay consistent and motivated.
- I pushed my "challenge yourself" thing a bit too far I think. At the same time I started OSSU I also started lifting weights and intermittent fasting. You should adjust things so that what you're doing feels A LITTLE challenging but does not overwhelm you.
What now?
- I feel very burnt out. Don't want to see a single line of code for a while! Not even clever functional one-liners that magically process gigabytes of data.
- I want to do some fun stuff later. I'll take CS50's intro to Game Development, then maybe audit the Game Specialization.
- My goal was not to get a job (although a low-key part-time remote job would be nice), but to challenge myself. MISSION ACCOMPLISHED! By a lot.
- My original goal was to take all of Advanced Programming. I'll do that at some point. Advanced Systems and Theory are left. Should take another 3 months or so.
- Eventually I should bite the bullet and stop avoiding the topics I disliked: web programming and Javascript.
- Looked at Scala jobs, Functional jobs, Triplebyte, and some local jobs. All want "senior" devs with 5+ years experience and lots of other tech I don't know yet. I can only work remotely. So I gotta keep at it! In addition to Spark, I will look into learning other tools in the Scala sphere: Akka, Play, Scala.JS
The Most Difficult Thing:
- Reading an existing code base. Reading is extremely hard. This is probably why so much software goes unmaintained, rewritten and into the garbage.
The Most Important Thing:
- Everything is at least 20x easier than Hack the Kernel.