A month ago I was saying to myself, "I know a large amount of stuff. I believe that I'm well off in terms of knowledge." I was confident that I'd be ready to be plopped on the front lines of the job market wearing shiny armor and carrying a mighty-powerful axe. This vision, however, has been slightly tarnished by the realization that I might not be as well-prepared as I had thought.
Let's pretend my future boss says, "For this, you'll probably want to create blabbity-blah and write your own parser." A parser, madame? Erm, uh, kinda, well, gee, uhm, hlaughalugah, context-free grammar? What? Yes, I understand the basics. I'm aware that LL is easier than LR, but I'm a bit unclear as to why left-recursive grammars can't be handled by top-down parsers.
Compilers is a part of my brain that, when accessed, responds with unnerving silence. Recalling the time in New Hampshire when I was planting anti-gopher bombs and accidentally inhaled some of the orange, peas-and-carrots-smelling poisonous gas, I feel like that event formed some gaping cavity in my skull. Cut away half of Ian's brain and you'll see said cavity, and inside will be a small, crumpled Post-it note enscrawled with "TODO: learn compilers."
The worry is that I can't fill this hole in my head the way I curb all other knowledge cravings. When I want to know something, the magical Internet showers me with all sorts of material I can submerge myself in. XSLT's key()
function? Currying? JavaScript as a programming language? Etymology of the word truant? Give me a day, sir, and I shall digest, consume, surround myself with this material, and I will store it among the other fine truffles of information in my head.
Enter parser-generators. The VH1 true story of yacc
and lex
. "Ian, you know automata, right," I'll think to myself. This subject, unlike the aforementioned, is like the rock-climbing wall with slippery pegs. Kwowing the why of compilers and parser-generators isn't just documented in a HOWTO somewhere. This subject, unlike the aforementioned, requires a significant guru, to give me a hand from over the top of the rock-climbing wall. This subject isn't just Ajax or knowing why you can modify a shell script while it's running -- this is bad-ass knowledge.
Programming Languages. Algorithms. Automata. Operating systems. Databases. Compilers. Grab your college/university's Computer Science course listing and look at the bottom half. This is bad-ass knowledge. This is the stuff that, when known, lets one understand not just how, but why.
I'm confident that I'll always be able to get the how; I'm scared that I don't know enough why.
For various reasons that I won't get into here, I switched from a Computer Science degree to a dual major in Computer Science and Cognitive Psychology. The reasons, however, do not outweigh the fact that I won't be able to take a compilers, algorithms or operating systems class. My fault? Likely.
A lot of my education has been memorize. Ask me why drive reduction theory is silly. Or characteristics of a well-managed team. Or how it's possible to calculate the size of a distant object at the other end of the galaxy. These are all things I've had to memorize and, for the longest time, I mistakingly thought that, in this field, piles of facts was the path to go.
Here's the solution, assuming that time-travel is possible. Future Ian borrows a time machine and warps back in time to Early Ian, just as he's entered college. Future Ian sits Past Ian down and asks, "You want to be a bad-ass computer science ninja, right?" Past Ian nods even though the questions was obviously rhetorical. "Don't switch majors. Take all the hard CS classes you can get your hands on. It's not about learning lots of things, it's about learning why things are." Past Ian nods despite obvious time-continuum paradoxes. Before Future Ian warps out he leaves some cliche last advice: "Oh, and when you're offered tons of peach schnapps, don't make a night out of it. You'll get sick and lose a pair of pants."