I started programming when I was 13, but I had no formal education in computer science (nor did I plan to) until my sophomore year. Here’s an account of what I was like in the dark ages.
Like many other young white male programmers, I was introduced to computing through gaming. I became obsessed with the Pokémon video game series, creating new characters, locations, and even ideas for plug-ins. But my dad didn’t want me to be a video game developer; my mom didn’t want me to be a programmer at all. They just gave me the same doctor-lawyer talk I’m sure we middle-class Americans have all heard as kids. (Can’t they at least choose between the two?)
When I was about 12, my dad thought of a dream job for me: a quantitative analyst, or quant — someone who works on Wall Street and makes millions from high-frequency trading. I had my whole life planned out — I would go to college, major in something like mathematics, astronomy, or philosophy (i.e. not computer science), and then forget everything I learned except the math and spend the rest of my days on Wall Street, exploiting fraction-of-a-second, fraction-of-a-cent changes in stock prices. Despite allegations that “flash boys” like Future Me contributed to the 2008 financial crisis, I didn’t feel the least bit evil. In fact, I was going to donate my profits to help the poor.
I was so excited about becoming a quant that I drew up elaborate plans for AI stock-trading software — the “Stock Trading System,” a backronym for Space Transportation System (STS), commonly known as the Space Shuttle. The original plan involved a “dumb kernel” (Linux) and a “smart kernel” (custom-written in Java), on which the application code (written in C#, because it was cool or something) would run. The application code would connect to an Oracle database, where time-series data would be stored in MP3 format. But I didn’t understand what I was doing, so I hit a wall.
Then, one day in December, my dad showed me how to write a hello world program in Java. I picked up the rest of the language on my own quickly, assisted by the copy of The Java Programming Language, Third Edition lying around the house and my easy access to the Javadoc. The standard library had everything — two GUI libraries (AWT and Swing), two XML parsers, a networking library, cryptography, and a bunch of packages like org.omg.CORBA and org.omg.CosNaming that I didn’t understand. The almighty Oracle also had something called “Java Enterprise Edition,” which they said was powerful, scalable, and overall awesome, but didn’t seem to have many users. I tried to use it to create a streaming radio service, but I couldn’t tell where the thing starts and ends.
In my confuzzledness, I looked around for other languages to code in. I’d heard of Perl, PHP, Python, Ruby, C#, F#, J#, and a bunch of JVM languages like Scala, Jython, JRuby, and Clojure. So I window-shopped for a programming language to use based on language features that I didn’t understand. And then, I stumbled on an essay by veekun in which he ranted about how awful PHP is. Oh yeah, veekun, one of the sites that’s affiliated with The Cave of Dragonflies, I thought. But I didn’t know that he had a blog.
At the same time, I was becoming interested in the open source movement. I wanted open-source implementations of programming languages and file formats based on open standards, and as I learned, MP3 as well as most popular video formats are based on closed standards. Closed standards are worse than closed software: if someone sells you a proprietary app that implements an open standard, then you can make your own, open-source version of it. But if the standard itself is closed — which always means it’s covered by patents — then you can’t make an open-source app that implements it. The challenge for designers of open video formats such as Ogg Theora and Google’s WebM, therefore, is to circumvent the patents and only use open technology, even if it’s worse than the patented technology. But that’s a story for another time.
Anyway, I wanted to help create and improve open audio and video formats, but most of the codecs I saw were in C or C++, and I didn’t know those languages. So I tried to implement Ogg Vorbis in Java, but it was too complicated. (Just seeing the names C and C++ still intimidates me — see how the ++ juts out of the C like a spiky dagger thing!)
A year and a half after I started programming, I didn’t have the motivation to keep doing it. Thanks to Stuyvesant’s computer science classes, I learned the right way to code. We learned by starting with small projects before moving up to bigger and bigger ones using increasingly complex algorithms and syntactic constructs. At the end of each semester was a final project, which we did in pairs (or sometimes triples), and which we were supposed to be capable of doing with only the knowledge we learned from class. Stuyvesant taught me computer science from the bottom up; before then, I had been trying to learn computer programming from the top down.
I had been doing it all wrong.