< expLog

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.

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.

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:

1

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.

2

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.