It’s been a long month. A busy month too, thankfully. I have lots of things to write about, namely my family vacation and httpsrc, but I have little time to write them.
However, a friend of mine recently asked how I learned to program… This month’s story is my reply to that question.
But first, I will give you a story about great deeds. About armies of light, and soldiers of darkness. About the places where they lived, and fought, and loved, and died. About great empires, terrible mistakes. A true story.
You get bonus points for naming the TV show that came from.
It all started more or less when I was born. My Dad was an avid programmer, and I would watch him program when I was young. Five or six years old or so. I did this for many reasons – back then, we had a NeXT computer which had Xox on it. This game was similar to asteroids in many regards. Essentially, a space ship that you fly around and you shoot stuff. However, to play this game, it had to be run in a special way, so I had to ask Dad to do it. Asking my Dad to do something invariably resulted in me having to wait for some time, so I could remind him every few minutes that I wanted to play Xox.
As I grew older, I continued watching my Dad program, but because of other reasons. At one point I became fascinated with the game “Management” by Avalon Hill. I told him that we should make it into a video game. He obliged, and I watched him type out the game, all five hundred lines, in RScheme, a variant of Lisp that he wrote. My Mom didn’t particularly enjoy playing as much, so the computer and I became good friends, for about thirty minutes each day. I was about 9 when my Dad wrote ah-management, and I still had to live under oppressive computer time rules. Thirty minutes per day. This was also my first experience with a text-based game – that is, a game based entirely in the terminal. A genre that I would come to revisit – and master – many years later.
That was in early 2004. The next two years were filled with other such projects – the civ4 project started shortly after management. The premise of Civ4 was to clone Civilization 3, except on a true globe, not on a flat map. It wasn’t long before I decided that I too could make a game with graphics. I decided I would clone the arcade game Hydro Thunder, my personal favorite to this day, in a PC-based version so that I could play it.
The complexity of that project proved to be daunting, and I quickly lost interest in that project, but not before I found my Dad’s Apple II manual. I didn’t have access to an Apple II, but that didn’t stop me from studying the schematics and the instruction sets and slowly internalizing how a computer works. One day, as I was sitting at my desk at school, my teacher wordlessly dropped a copy of PC LOGO on my desk. As you can imagine this was a little awkward for me, since he didn’t preface or explain it. So I left it, figuring that he would realize his mistake and come collect it. It didn’t take long for me to be absorbed in the reference manual. For the rest of the school year I was entranced by the wonders of moving this turtle around the screen. It was here that I truly conceptualized the meaning of what I then called “conditional programming,” not realizing that almost all (if not all) programming had to be done with these conditional statements. Loops, ifs, and switches floated through my head during recess when I would stay inside to make little games to tell the turtle what to do. At the same time, I held my first paid programming position: my Dad had recently started a company called Xynthesis, and he paid me to write programs that generated images that he would later use in reports or advertising or whatever.
However, all good things must come to an end, and I lost interest in programming that summer (summer of 2005). I left programming to hang with my mechanical engineering friends. This is when I did things such as start my water gun engineering tradition – at the end of every school year, it was traditional that I build a water gun from scratch (PVC pipes and valves) and use it in the school water fight. This tradition lasted until my last year in middle school.
I continued playing outside with the mechanical engineering gang until September 30th, 2007. I had recently started middle school, and I had settled into the habit of coming home from school, grabbing a box of granola bars, and eating them while I read the funnies. On that day, Scott Adams (creator of Dilbert) published his infamous carpet fishing comic. The concept was simple – Dilbert divided the carpet in his cubicle into a grid, and hung a fishing line into one of the squares. He then wrote a program that randomly selected a type of fish, and the location that the fish was in. If you happened to be fishing in the right spot, you got a fish. Otherwise, you didn’t. I stood up, and said something along the lines of “I can do that.” I proceeded to the nearest computer, the MacBook I would come to adore, and typed out carpetfish in the C programming language. I do not recall exactly where I got the knowledge required to do this, as my only previous experience in C was years before and nowhere near as complex, but if there is a God then that would definitely explain how I wrote that program before my Dad came home. Most of it, anyway.
On the social scene, this radically altered the way that I was perceived by the people around me, for better or for worse (it varied person to person). Having recently arrived didn’t help – I had always been seen as being good with computers, but showing up at a new school and writing programs from the start cemented my position as the computer nerd.
Carpetfish led very quickly to airline, the other program that I credit with kicking off my career. It was a take on AIRLINE (http://www.airlinesimulation.com/homeusers.aspx), which I had a copy of, fervently enjoyed, and fervently thought I could do better. AIRLINE was poorly written, as corporate programs often are, and between turns (it was turn based) it would sit for 15-30 minutes, and 50% of the time it would crash. Needless to say, I thought I could do better.
I spent the rest of that year developing airline. It became quite fully-featured. Code reviews with my Dad led to me learning lots of neat tricks, how to deal with the file system, and so forth.
Airline started my tradition of, every year, creating a new year-long project. Of course, I always had side projects, usually in the form of short scripts I would write for class. The next year, I wrote A&A. A&A attempted to be a RPG, but that’s where I learned both Python and object-oriented programming. The year after I wrote Gal5NG in the fall, and the Civ4 revival in the spring. Gal5NG taught me both network programming, graphics programming, and audio programming. It was a multiplayer game based on the Star Trek episode The Galileo Seven (http://en.wikipedia.org/wiki/The_Galileo_Seven) – the goal to fly your spaceship within a certain distance of the shuttle, after finding it. There was an audible pinging sound that changed frequency the closer you got to the shuttle.
The Civ4 revival project didn’t go very far, but it stressed my graphical programming farther than ever before. It did such things as normal mapping, texture mapping, and so forth.
My programming life took another boost in the summer of 2010. That summer I traveled to Barstow, California to work in my Uncle’s machine shop. While I was there, he mentioned in passing that he had often wanted to write a submarine combat simulator. But, unlike all others, he wanted the player to be able to play any ship, and thus be an asymmetric game. While in Barstow, I sketched out the architecture for Blue November. This is the first program where I wrote out a structure before hand, then programmed it. It was also the largest program I’ve written to this day – I wrote 7000 lines in the first two weeks, and the project now spans over 35,000 lines of graphics code, network code, python extension modules, audio speech recognition libraries and text to speech libraries. The entire game can be unrecognizable changed without having to compile a single line of source code. Most things are done using Python scripts which are called from within the Blue November executable.
But, alas, this is not a technical summary of my projects. Around the same time, I setup carbonate. At the time, it was simply a print server, but it introduced me to servers as a concept. It took until that summer for me to be able to grasp how much can be done with a server. One day, in Pre Calc, a friend casually referred to the fact that somebody had mentioned something about an internship, and that he thought I might want to look into it. The plan up until this point was for me to go to California to work in the shop, and learn to fly airplanes, which has been another recurring interest of mine. But, as fate would have it, I tracked this rumor to Fred, and said I had heard something about an internship with “Linux.” That was when I first met Fred, and he seemed doubtful, but he referred me to the right people at WPEngine. And thus started my first paid summer internship.
That was in the summer of 2011. The next year was a flurry of activity – I met Michael, and he (for better or for worse) caught wind of the rumor that I could program, and had a slew of websites and robots and Christmas light controllers that we worked on. The other half the of the activity was the LASA Minecraft bubble. I found myself swept up in it enough to start the official LASA Minecraft server. These occupied my time, honing my skills in PHP, until the summer when my Dad recommended me to Click Security. At Click I got to integrate with the team using source control and bug tracking and meetings and so forth.
And that brings me to the Summer of 2012. My story continues, but the rest of the story remains to be written.