David Blume in 30 Seconds
This isn't an autobiography. I have one of those too, but it's (even more) boring and you don't have time for that. This is an overview of David's technical side and its impact on his life.
1980’s and early 1990's: Usenet and NetHack
In the late '80s and early '90s, Usenet news and NetHack 2.3e had a big influence on my life. As a matter of fact, because the movement keys in NetHack were the same as the navigation keys in vi, I still use vim on *nix and cygwin today.
I experienced my first crisis in time-management: I almost lost my first long-term girlfriend to NetHack.
My friend Ted Pederson and I revamped the wand and spellbook system to balance the game. The game was much improved, and we submitted our changes to rec.games.nethack (now rec.games.roguelike.nethack). Our patches didn’t compile on some of the target platforms that we didn’t have. We never fixed our code for the other platforms (because we were already playing the game with our patch), so our changes were never integrated into the codebase, but they did provoke discussion on Usenet.
Lessons Learned
- Test your code beyond the confines of your own computer.
- Don’t save a game with a character near death. If you die and reload, you’ll just be starting with a troubled character again. Let your character die and re-roll. Start fresh.
- Prioritize your time. Real life and real relationships are more important.
Late 1990’s and Early 2000’s: "Kinetic Art" and the Web
In the late ‘90s I was programming professionally in Windows and MFC. I wanted to learn more about the framework and the OS, so I wrote some small applications and screensavers.
My programs were a sandbox in which I could attempt to apply the Gang of Four's Design Patterns at my own discretion. Eventually, I'd try and apply Andrei Alexandrescu's generic policies to the Observer pattern.
What distinguished my screensavers at the time was that although they were generally made of simple vector graphics, they exhibited interesting behavior. I have an aquarium where fish hunted and ate each other, and another screen saver where spiders endlessly make piles of little balls.
I started my first static website at geocities. I still keep a copy of it. Joel Spolsky sold me on the idea that a rich desktop application was the right choice for maintaining a blog, so I started mine with FogCreek CityDesk.
It wasn't much later than that that I wanted my blog to be more flexible on the server side, so I wrote a Python script to export my CityDesk script to WordPress.
Now that I had the power of scripting languages on the server, I adapted and enhanced (by making it suggest new potential search referrers) Jim Flanagan's Perl module Zeitcode, which displays the search terms used to find your blog in various sizes depending on the frequency the term was used. It is the basis for the modern day "tag cloud." I still provide my version of his module at my wiki.
Once I started scripting in PHP and Python, (Perl is too hard to read,) new little opportunities for web services kept presenting themselves to me.
Later 2000's: Web Services
My day job still had me programming in C++, which is more tedious than the scripting languages, especially because one has to maintain both declaration (.hpp) and definition (.cpp) files. I helped improve Microsoft Visual Studio's workflow by creating the Add-In ToggleFile Tab Group. The Add-In automatically sorted files into homogenous tab groups.
I joined a group that was expected to work on Microsoft Windows computers, but deploy code from a Linux system. My experience with customizing my development environment and knowing just enough about PuTTY's Plink gave me the courage to tweak our environment to allow for developing on the Windows system via a Samba share and deploying Linux commands via Plink.
I developed such a strong appreciation for Sutter and Alexandrescu's C++ Coding Standards that I made note of my favorite C++ Guidelines from the book.
Around this time, I became very interested in improving productivity, and created a service that'd display only the one thing I was meant to be doing at the time. It was one of the most minimal home pages possible.
My desktop environment was highly optimized, and that made the web experience stick out like a sore thumb. What else could I do but try fix parts of the web, too?
Problems with the Web
- Some sites didn't have RSS or Atom feeds. I can't be bothered to visit them manually to check for updates. So I wrote a script to take in a YAML file describing the static sites, and create external feeds for them.
- FoxMarks was a great service for syncing bookmarks to the cloud, but it only supported one profile per login. I wanted different profiles for my work vs. my home computer. So, I wrote a Python Script for support of multiple profiles in Foxmarks. Foxmarks (now XMarks) eventually added something similar.
- Twitter doesn't collate external @mentions into its home timeline. (You only see your @mentions from those you follow.) I fixed that two ways, once with Yahoo Pipes, then with a Python script that uses FeedParser because the Yahoo Pipes implementation didn't update frequently enough.
- The sites I visited sometimes had non-standard feeds of my user activity. No current lifestream implementation worked right, so I rolled my own, in Python.
- My wife and I like to rent movies, but NetFlix's custom suggested rating isn't available at the IMDB. So I wrote a mashup that's minimal enough to use from older phones.
A Common Theme
I bother to fix things, especially when it improves my workflow. I don't want my development environment or my web experience to get in the way of my productivity. In the book The Pragmatic Programmer, the tip on fixing broken windows really resonated with me. I think it's because I have a penchant for identifying inefficiencies and being bothered enough to do something about it.