Or, Everything That Had to Happen, Is Happening, and Will Happen When You Submit a Form
A year-long course from the fine folks who run https://teachyourselfcs.com, but more in-depth, more accountable, and more over Zoom. Eight modules leading up to a capstone project, where we are expected to build something we would not have been able to create previously, whether because of a series of missing pieces of knowledge or because our foundation knowledge was shaky due to leaky abstractions.
Six different subjects, though with my limited time, I definitely over-indexed on learning C. The Go project was fun after working with C—the lineage is noticeable, to say the least, and the task more meaty. With sufficient planning, I rarely felt stuck.
There’s this loop that’s constantly running, humming along at four instructions a nanosecond (that’s 4,000,000,000 instructions a second), and it’s at the heart of every key pressed, packet received, and pixel painted by a modern computer. Fetch, decode, execute, repeat. How data is stored, where is it stored when it’s used, and what form does that data take? Caches and cache lines (64 bits in a cache line on modern systems). Understanding how a computer is really programmed, and cutting through the abstractions to the level of what the machine does with machine code—this is what we’re here for.
You can write some code. Cool. What do you do next, and why? We examine these questions through the lens of the Go programming language. You can start by looking at the abstractions that are your data structures: what’s underlying your string variable, and what can you glean from it? What about the language’s intermediate representation, Go Assembly, and the recent switch to a register-based calling system? How can we use concurrency well (starting with an understanding that it ain’t parallelism); and how can we use a deeper understanding of memory models to write more correct code? How do scheduling, memory allocation, and garbage collection fit together? Figure out these answers to figure out how to solve the next, big problems you’ll face.
Reproducing some of the structures used by LevelDB, as well as plumbing through the C++ source and a Go implementation to discover how this key-value store works. Reading through “Skip Lists: A Probablistic Alternative to Balanced Trees” (pdf) and implementing the algorithm. Peeking behind the veil and learning how Postgres and LevelDB store their data, using
pg_filedump for the former. Ending with aspirations to dig into Roaring bitmaps.