dburrows/ me

A brief history of me

I was born in 1980 and raised in State College, Pennsylvania, the nicest town on the face of the Earth. I graduated from State College Area High School in 1998 and moved to Providence, Rhode Island to attend Brown University, where I concentrated my studies in the areas of computer science, mathematics, and music. After receiving an Sc.B. in computer science in 2002, I enrolled in a Master's degree program at the Pennsylvania State University, aka PSU (not to be confused with the University of Pennsylvania, aka UPenn), where I received an MSc in computer science in 2005.

Upon receiving my Master's degree, I followed my girlfriend to the soggy but temperate wilds of Greater Seattle. It turns out -- I'm sure non-Seattlites will be shocked to hear this -- that if you're from out of town, know no-one, and don't particularly want to work for Microsoft, it's not so easy to find a software job in the Seattle area. Nonetheless, I eventually found work as a developer at a small company writing software to process postal addresses.

So much for an overview. What follows is more information than anyone is likely to ever want to know, divided by topic, with new topics added as I feel like it.

Computers

My first exposure to a computer was at the age of four or so, when my father bought an XT.

Young Daniel using the computer

Almost immediately, I was hooked. One of my earliest memories is of learning that typing games would bring up a menu of kids' games for me to play, but that typing ganes would simply result in the message Bad command or file name. I was a particular fan of the game Frankenstein, which was a bit like Hangman ecept that each error added a body part to an ASCII-art depiction of Frankenstein's monster. When you lost, the monster would wave its arms up and down and the computer speaker would rumble. I don't remember whether I ever actually understood the game or not, but that didn't matter: it was the coolest thing ever.

At some point when I was a kid, I learned to program in BASIC. I didn't write any particularly spectacular programs; some representative code from this time includes the program I wrote to play the guess a number between one and a hundred game and a program that would fill in a box by randomly drawing white pixels. As I grew older, I learned to use Borland's Pascal compiler to write simple programs, and one summer I implemented the game of Hearts in Hypertext on my grandparents' Mac Classic, complete with a simple-minded AI player. It was the coolest thing ever.

In fact, many of the early programs I wrote were games: for instance, a program where evil dots would chase your good dot and you had to run away while gobbling apples (which, in keeping with my artistic expertise, were slightly larger dots), or a computer version of the Mad Magazine Card Game. Thankfully, I never distributed the latter, which meant that my family did not get sued into financial ruin by Parker Brothers.


In high school, I bought a copy of Andre LaMothe's book the black art of 3d game programming, which was quite up-to-date at the time, and studied it religiously. I didn't know C, so I started writing graphical video games in Pascal with inline assembly (a Borland extension). This of course necessitated that I reimplement every example in the book, which meant that I got far more out of the exercise than if I had been able to just copy Andre's sample code. My first few graphical games were purely 2d, as I learned how to drive the graphics and keyboard hardware from Pascal: for instance, I wrote a program in which a small wizard figure would run around on the ground and shoot fireballs at flying imps (in imitation of the contemporary game Hocus Pocus). If you hit the imps, they fell to the ground, trailing smoke, and exploded in a shower of sparks. It was the coolest thing ever.

But the one that I'm still proud of to this day -- which, sadly, may be lost in the mists of time -- is the Connect 4 game I wrote for my high school Computer Science class. When I took the class, I already basically knew everything the teacher was going to talk about; luckily, she was a very nice woman who would let me just sit in the front row and screw around while she lectured (although I occasionally broke in to correct mistakes that she made). None of the assignments posed a challenge for me, so, to make things interesting, I combined the assignment with the library of game-development code I had been accumulating. In my Connect 4 program, each piece had a little face drawn on it. During the game, the pieces would spontaneously change their expressions -- smile, frown, look bored, and so on. Sometimes they would even fall asleep and snore, or start whistling to themselves. I didn't have access to sound hardware -- it wasn't even installed on the school's computers -- so I just drew in glyphs above the faces to show what they were doing. When you won, all your pieces would smile, while your opponents' would look sad or even cry.

My Connect 4 also had an AI player that looked 7 ply ahead and was rather tough to beat. But the faces were the killer feature.

Oh, and my 3d game engine? I got it to display spinning cubes and tetrahedra, but my grand plans to build a space shooter ... well, they never really panned out.


In my senior year of high school, I learned C++. For various reasons, I had ended up with a lot of free time during the day, and I arranged to spend it all in the computer lab. Although no-one was required to learn C++ for class (at this time, the AP tests were given in Pascal), the lab had a copy of a book called C++ for Pascal Programmers. This book was, in my opinion, everything that a manual for a programming language should be: it explained clearly and concisely all the important constructs in C++, and (since it was for Pascal programmers) described which Pascal constructs each was analogous to. The Pascal I had learned was basically isomorphic to C++, minus some of the odder bits of C++ (like textual inclusion of headers), so I picked it up fairly easily.

Of course, moving to C++ meant that I could no longer use all the graphics libraries I had developed in Pascal. My compiler of choice, DJGPP (which had the tremendous virtues of being free, available, and allowing the user to create 32-bit code in a DOS environment), didn't provide any graphics support that was obvious to my 17-year-old self. And besides, I was kind of bored with graphics programming. So, I reasoned, there was only one interesting thing you could do without graphics, and that was text adventure games! I had played Zork and Adventure as a kid, and found some newer text adventures as a teenager, such as the multidimensional thief, so I knew the genre reasonably well, and I thought it was kind of neat in a retro sort of way.

But just coding up a text adventure in C++ seemed too straightforward. Somewhere or other, I had picked up the notion that programs should be configurable. And, also, there was this hot new technology in the news. It was called Java, and it ran on something called a virtual machine, using something called bytecode. I'd even heard that Zork used something similar back in its day.

Well, I figured, that sounds straightforward enough. So I set out to build my own virtual machine, for text adventure games, using compiled bytecode. And of course if you have compiled bytecode, you need a compiler, so I figured I'd write one of those too. There were a lot of them around, so clearly it wasn't hard. Even adults could do it!


So I set out to write my own Zork, armed with three key weapons and not much else:

  1. Complete and utter ignorance that what I was trying to do ought to be hard.
  2. Complete and utter indifference to the fact that it had already been done, better, by people who were much smarter and more experienced than myself.
  3. Absolute confidence that I could solve the problem if I just tried.

As an aside: although perhaps they aren't necessary, all these conditions seem to me to be great assets when one is attempting to tackle a new problem. I'm a bit sad that so much of my ignorance has been eliminated by education, that so much of my indifference has been burned away by maturity, and that so much of my confidence has been melted by experience. I suspect, sometimes, that these three factors are the real reason that young people seem to be behind so many of the great discoveries and inventions in history: they're the only ones who are stupid enough to think that it's possible to find something new.

Regardless, this project has to go down as my first unqualified success as a programmer. The program I produced wasn't spectacularly designed, brilliantly implemented, or even bug-free -- the way I handled operator precedence was especially scary -- but it was complete and it worked. It wasn't much as a game: the whole game that I designed consisted of just a few rooms and objects, and you could solve it in under a half hour. But the compiler worked, the bytecode interpreter worked, and the game was playable. It was the coolest thing ever.

When I wrote this game, I had the notion that I might send it to a contest I had heard about. I don't remember who was giving the contest, but it was some sort of programming contest for teenagers and there was a cash prize. When I finished my program, I slapped the GPL on it, stuck it on a floppy, and mailed it to them. I never heard back from them.

I have the code lying around on a hard disk somewhere, and I even ported it to curses and Linux. Someday, if I can get over my embarassment at its bletcherousness, I may dig it up and publish it.


Around the time I graduated from high school, I discovered Linux. I had been introduced to Unix systems at the age of 10 or so, but I only knew enough to read my mail in <a href="http://en.wikipedia.org/wiki/mailx">mailx</a> and read Usenet via <a href="http://en.wikipedia.org/wiki/gnus">gnus</a>. I had installed Linux on my own computer at the age of 16, but without a reliable Internet connection there wasn't a lot to do with it at the time, and I never really understood how the system worked.

The summer after I graduated, I got a copy of the book Beginning Linux Programming and read it cover to cover. This was the perfect book for me at the time: it laid out all the pieces of the system in a thorough and no-nonsense way, described how to interact with Unix systems as a user, and explained the core Unix programming environment. Suddenly, Linux stopped being a mysterious place I didn't understand and turned into something that I could work with and comprehend. It was the coolest thing ever.

At school we had a reliable Internet connection; I installed Debian and started following the development release so that I could have the latest shiny software.


To be continued...