Like it says on the home page, Nothing Works is a website for programmers who care about old school, hacker culture. That is, programmers who want to learn how programming works at a fundamental level so they can build robust, performant software.

To that aim, we're going to learn programming from the ground up.

It's probably going to be a three to five year process, and at the end of it we'll probably be in the top 1%-5% of programmers.

Notes & Assumptions

Unlike most programming content on the internet, I'm not here to hold your hand through a process. My content requires active problem solving on your part. For example, I'm using Unix based operating systems (Mac & Linux). Therefore, I'll use the tools for those platforms. If you're on Windows it's up to you to figure out how to use the compilers, assemblers, etc. for that platform.

Also, I'm going to assume you know the basics of at least one programming language (js, php, python, etc.). By "basics" I mean you understand loops, variables, if/else statements, and functions. If you know those things you'll be able to follow along.


We're going to start by learning Assembly, C, and Go.

Assembly is how we interface with the CPU. If we don't understand assembly we don't understand what the computer is doing. We don't have to be experts, but we should be able to read and write assembly programs.

Next, is C. In some ways C is syntactic sugar on top of assembly. Additionally, it's considered the lingua franca of programming. Like assembly, if we're not proficient in C we're not serious about programming.

Lastly, with regards to the imperative languages, we'll learn Go. Go is similar to C in that it's an statically typed, imperative language. However, Go is garbage collected and has a large runtime library, so it's quite different in some respects. Initially, I thought about learning Python, but I've come to the conclusion that dynamic languages are a bad idea, at least if you want to build serious software.

After that, we'll move on to functional programming. We'll learn Haskell and then a language with dependant types, like Coq. The goal is to develop a good understanding of the heavy PL theory languages.

To round things out we're going to learn Verilog or VHDL. Both of those are hardware description languages.

While we're working through this content we're going to build systems, things like compilers, file systems, assemblers, linkers, and so on. We need some way to practice what we're learning, and building systems - even if they are simplistic - is good practice.

Anyway, that's the plan. It should be fun!


The content list above is taken from George Hotz during an interview on Lex Fridman's podcast.

About Me

My name is Michael Spangler.

I look like this guy:

My favorite movie is Office Space.

You can email me at ms@michaelspangler.io or follow me on Twitter