#+TITLE: 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 . 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.
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
- 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.
- An incremental approach to compiler construction
- 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:
- Standard networking tools from scratch:
- ping, ping6
- Implement some utilities
- Contribute to the Linux Kernel.
* Graphics, rendering, etc.
- Raytracing in one weekend
- 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)
- 2020-07-12: Copied over my accumulated list so far.
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.