If I got hit by a bus and forgot everything I knew about computer science [1], here is how’d I re-learn it [2].

Inspired by Robert Heaton’s “Projects for Advanced Beginners” (link) and a bunch of random knowledge I’ve accumulated over time.

<aside> ‼️

Are you already someone with knowledge in the field of computer science, and looking for resources or opportunities? I encourage you to look at csjobs2 instead. This is my curated list of every-resource-ever I considered in undergrad, and has suggestions for wannabe engineers, PMs, VCs, etc.

</aside>

Let’s get to it.

First: the number one thing to understand is ‘coding’ is something you learn by doing. There is a lot of theoretical stuff to know (—whose importance varies with your goals), but fundamentally you need to code. A lot.

So, let’s “learn by doing.” To give that some structure, your curriculum will come as a curated list of projects. This will be supplemented by things to read or look at when you get board. And then some philosophical advice how to have your projects be more than a tree that falls in the forest.

First, some principles.

Principles

  1. Digital assistants (Claude, ChatGPT) are good, but you can only use them like a university TA. That is, they cannot write code for you, you cannot copy text from them, etc., but you can (and should) ask them explanatory questions.

    ✅ “What does this bit of code do?” “Any hints for what’s wrong with my approach to this problem? DO NOT OUTPUT THE ANSWER. (problem) (approach)”

    ⛔ “Write a webpage skeleton for me,” “output a function to reverse a linked list in Python”

    You should use digital assistants (…you have a literal TA available at your disposal 24/7), but you must use them correctly. Discipline is key!

  2. You also must disable any code “complete” tools (i.e., anything that writes code for you in a text editor).

    Imagine learning to bike but never being able to take off the training wheels. Would you ever be able to do cool shit, like a wheelie?

    For example, if you use Visual Studio Code, add this in your editor.

    // at .vscode/settings.json
    {
      // ...
      "github.copilot.enable": {
        "*": false
      }
    }
    
  3. You journey must be in public. Once you finish a project, deploy it to a URL, post it on LinkedIn, Twitter, etc., send it to your friends, your mom, your dog, etc. Get people to use it, give you feedback, and fix their bugs. (This will pay off dividends down the line.)

Need a community of people to do this with? Look at Summer of Shipping, various sub-reddits (e.g., r/dailyprogrammer), or Discord communities. 4. Have fun!

Curriculum

Your first task will be to build a website. Not using like, Framer, or Bubble, or even Notion, but with HTML (”HyperText Markup Language” for page structure and content) and CSS (”Cascading Style Sheets”, for style).

Why a website? This will serve as your digital playground. You’ll build it, then re-build it, then re-build it again, and again, and again. Each iteration will represent a new milestone in your learning. Each feature will be a test of your knowledge.

“But Michael,” you say, “I have no interest in being a web programmer!” Good. You still need a website for sharing your work. And basically every project you make can (and should) be hosted or have an entrypoint on your website. (Think a “download” link for your desktop app, or a landing page for your mobile game.) In addition, a lot of frameworks support cross-platform development today, so you might be able to accidentally be good at web programming. Which is also good.

Here are some resources you can use to get you unstuck.