No Ideas, but in Things
"No ideas, but in things" – by William Carlos Williams expresses an idea around learning that's only recently crystallized in my head.
I'm an auto-didact; most of what I know about programming is self-taught. One of the biggest challenges I face as a self-taught programmer is to gauge the depth of understanding I've built on a subject. Do I actually understand things, or just think I do?
Learning about both the Dunning-Kruger effect and impostor syndrome hasn't helped in the least: how do I distinguish between the two?
I have to admit that I don't believe most college exams – or MOOC assignments and tests – meaningfully measure understanding beyond a very superficial level 1. Looking backwards at attempts at learning: android, systems programming, neural networks, databases, programming languages… the knowledge that's stuck around in my head is the knowledge that I directly applied and built something with.
Which brings me to the point of this note: I only trust that I've mastered a topic once I can apply it to build something tangible.2
Accordingly, here's a list of projects I'm over-optimistically planning to work on over the next several years to feel reasonably competent as a programmer (along with some resources as I accumulate them over time).
This is obviously incomplete, and also very loosely structured; I'll prioritize based on what complements my professional work, and simply follow my nose on other occasions.
The idea is to build something more robust than a toy, but not necessarily something optimized for millions of computers and performance. I'll open source parts of these, write about them in others; and possibly simply publish the end products of the rest.
Algorithms, Data Structures, Automata, etc.
- Implement BTree
- Implement a CRDT
- Implement a regular expression engine.
- Implement a SAT Solver.
- Implement an RTree
- Implement Purely Functional Data Structures
- Implement Prof. Erik Demaine's advanced data structures
Databases
- Implement a Log-structured Key-value DB.
- Implement a SQL DB.
AI, ML & Statistics
- Implement a neural network from scratch.
- Implement learning algorithms from scratch.
- Test these out in real projects that help in my daily life.
Programming Languages, Virtual Machines, etc.
- Implement a Scheme interpreter and compiler.
- Implement a Virtual machine for a lisp.
- Implement a Garbage Collector.
- Implement a Type-Checker.
- Contribute to Python.
- Contribute to Rust.
Systems, networking, etc.
- Implement a production web server.
- Implement a complete operating system.
- Write my own shell.
- Implement a Simulator.
- Re-implement suckless software:
- dwm
- dmenu
- st
- Standard networking tools from scratch:
- dig
- tcpdump
- ping, ping6
- Implement some utilities
- rsync
- Contribute to the Linux Kernel.
Graphics, rendering, etc.
- Raytracer
- Image rendering, manipulation
- PNG renderer
- JPEG renderer
- Image manipulation
Tools / software
- Debugger powered tracers. (currently active)
- A web browser
- Implement a text editor.
- No prizes for guessing the inspiration.
- Factorio blueprint designer (presumably with the SAT solver)
History
- 2020-07-12: Copied over my accumulated list so far.
Footnotes:
It's extremely hard to make a question paper that makes a student truly engage with a subject and test his understanding; I'm grateful for Professors who made those exams and still remember them. Particularly Prof. G. V. Ramana, taught Geotechnical Engineering, and Prof. Ashok Gupta, who taught Structural Engineering.
This works out better for programming projects because the finished result either works; or doesn't. It's somewhat harder for english and writing, but is still better than simply reading through several books and assuming competence.