A Programmer's Tale
I have been a professional software engineer since 2004. Here is my résumé.
I first wrote code on a Radio Shack TRS-80 in the late seventies, playing around in BASIC in math class in middle-school. Everyone kept telling me this computer thing was going to be big and I could get rich. So, I started a Computer Science degree at Hampshire College in the early eighties, but ran out of money for school and wound up taking a twenty-year detour through “life, the music, and everything” (the answer is 42, of course).
I finally finished up that degree in 2004, but you can read about that on my school page. Right now, I want to talk about what I’ve been doing since then.
I was lucky enough to stumble onto a temp job at Beluga Software Cooperative in Olympia, WA, barely a month out of school. They had gone over-budget on a Java app, and needed someone to work as cheaply as possible to finish. Well, that application (tracking fish genetics samples for the WA Dept. of Fish and Wildlife) wound up taking until the following spring to write. And by then, the folks at Beluga were pleased enough with my ability to solve my own problems and to crank out code. They voted to make me a member of the cooperative… less than a year out of school and I was part owner of a company!
I worked at Beluga through the summer of 2006, working on a loan processing web application, a timesheet system, a website for tracking scientific collection permits, a hatchery management system (again for the Dept. of Fish and Wildlife), and various other things. This was all in Java, using at various times, JSPs/JSTL, Servlets, Struts, Spring, Acegi, JBoss, Tomcat, Eclipse, iBatis, Sybase, Sql Server, etc.
In the winter of 2006 while I was “on the bench” for a while, I decided to look into all the hype I kept hearing about this new Ruby on Rails framework. I was impressed. It seemed that the creators of Rails had thought of everything. I even managed to make it to the very first conference on Rails held anywhere: Canada on Rails, held in Vancouver BC in January 2006.
But soon work came back again (with a vengeance), and I was doing 60+ hours a week of Java. A few months later, I was getting burned out and had promised my girlfriend that we would move back to Portland right after I got out of school.
I wrote to an acquaintance in Portland to see what the job market was like down there, and it turned out that he had taken a contract job in Hawaii. One thing led to another, and by Labor Day 2006 I was working for a web startup called ChipIn in Honolulu, HI. They had created a Flash widget for collecting donations online and had written the first version of the site in PHP, but had started rewriting it in Java (with WebWork and iBatis) around the time I joined.
Soon after I started, some hard analysis of this second version of the site made them realize they were adding a lot of features the users had never asked for. So, they threw that all out and started again, building a “simpler” version. This time we used AndroMDA, which allowed us to generate code from domain models. It gave us generated Spring services, Hibernate DAOs and XML config files. We also used the then brand-new jQuery library quite a bit.
Startup life being what it is, management soon decided to create yet another version of this app. They wanted to sell companies on “white-label” installations of our app for their fundraising needs. I campaigned to use Ruby on Rails, which I’d wanted to use professionally for a year at that point, and everyone agreed.
So, we had a crash course in Rails and cranked out yet another version of the ChipIn application. Along the way we developed a complex domain model and extensively used REST web services to have different pieces talk to each other. We also built a data warehouse using the classic “star schema.”
Back to Portland
That company continued to flounder and try to find its monetization dreams. (It even diverged into making Facebook games right after Facebook opened its platform.) Soon the idea of selling off the original fundraising part of the business came up. That was my cue to exit stage left. My plan before ChipIn had been to get back to Portland and that still sounded good to me. I’ve always loved Portland.
I found Rails work at another startup, this one a new game website called Kongregate. I was employee number eleven and quickly found myself really sinking my teeth into meaty Rails work. The site was growing and we were adding new features as fast as we could.
One of the first major projects I worked on was an attempt to port some of the more popular games on Kongregate to Facebook. The idea was that friends on Facebook could challenge each other to get better scores. It seemed like a good idea, but took months and involved some very complicated code. When we finally unveiled the first handful of games, the response was underwhelming. At least that’s how the product manager felt. He pulled the plug on them within a few months. To be fair, each new game meant adding a new Facebook app and involved a lot of setup, especially if we wanted staging versions too. That’s not very scalable. And ultimately, there was no monetization! I think we were just hoping that Facebook’s rocket-like ascendance would yank us along with it.
Money Money Money
Speaking of monetization, as with any web startup, we existed on investor funds and a bit of ad money. Building our user base and traffic would mean more ad money, but wouldn’t it be great if we had another revenue stream? We took a gamble on the fairly new concept of “micro-transactions” or virtual currency. We had no idea if the work would pay off (I don’t think anyone was doing it for Flash web games), but plunged ahead.
The core transaction logic was designed and implemented initially by a consulting firm we hired, but man, would I work on that code many, many, many times over the coming decade. (I came to loathe the deep class hierarchy.) I also worked on integrating payment gateways. Initially this was Braintree (credit cards) and PayPal, but we went on to add mobile-phone payments (Zong, then Boku), gift cards (UGC, Paysafe, and GameStop cards), and earning the virtual currency (Kreds) through offers (Offerpal, then Trialpay). We even integrated with a Russian gateway that let you use everything from Subway to 7-11 gift cards.
The micro-transaction thing did very well (in 2010, the company was acquired by GameStop) and that meant paying people! We had built a payment tracking system for ad revenue (Kongregate shares ad revenue with game developers), but now had to expand that to Kred revenue. We pulled all the behavior up into an abstract superclass, which came in handy down the road when we had to add payments for rewarded video (users watch ads to get in-game rewards) and then desktop game sales.
noConflict setting to map it to the
$j global function instead of just
$ (which was taken by Prototype).
This wasn’t the only SPA we built at Kongregate. When the company branched out into mobile game publishing, we wanted to have a common company presence in each game. Thus was born “the Kong panel”, an SPA written in Ember that rendered in a WebView launched from a “K” button in all the games. Ember was quite a change from just sprinkling JQuery everywhere. And we compounded the context shift by also using EmberScript, an Ember-specific variant of CoffeeScript, which was unfortunately abandoned before too long. Oh the joys of shiny new toys, leaving you left with technical debt.
Adding It Up With Ads
Display ads are one thing, but showing people videos clearly makes more money. We built a system for showing a pre-roll ad before the game loaded early on. That homespun pre-roll system grew and grew until it was something of a nightmare. Eventually, the Interactive Media Ads standard came about, and I wound up trashing the nightmare for an IMA integration using the open-source Video.js and its IMA plugin.
Not All That Glitters Is Gold
There were so many projects over my decade-plus at Kongregate. I could go on and on. But we don’t want to be here all day. Ha. There are a couple more projects that are worth mentioning however: tax forms and GDPR.
Back when we started paying developers, we had to collect an IRS Form W-9 from them. Handling a bunch of paper forms would be pretty 20th century, so we built an online form to capture all the required information. After GameStop acquired us, they pointed out that we should be having foreign developers fill out a Form W-8, not a W-9. So that was added. Fast-forward a few years until GameStop again pointed out that we were out of compliance. The FATCA treaty meant yet more forms: the W-8-BEN and W-8-BEN-E. The latter is eight pages long with thirty possible sections to fill out, some of which then also require corresponding sections to be completed.
Anyway, this landed on my plate, and I spent a couple months putting into place all the hiding and showing of sections and validating everything. The punch line? After GameStop sold us off, the next accountant told us we really didn’t need a lot of the more complex stuff because it pertained to financial firms, not game developers. Ha.
One of the last things I worked on there was a similarly unglamorous endeavor: bringing our huge website (and mobile game integrations) in compliance with the European GDPR regulations. Basically, the European Union decided that (theoretically) protecting kids under thirteen online was not complicated enough. We had always followed COPPA, asking people their age on signup and disallowing anyone under thirteen. GDPR wanted to “strengthen” this by requiring kids between thirteen and sixteen to get parental permission! Then all the countries in the EU started bickering about what age a kid is actually savvy, and some chose different age cutoffs.
So I had to rework all the places we had registration, making them check the user’s country and what age they claimed to be, as well as collecting a parent email for the “tweeners” in order to send a verification email to the parent. Oh, and we didn’t want to store any personal information anymore (including gender or birthdate) meaning we didn’t even want the birthdate sent to the server!
On To New Adventures
Anyway, I was downsized out of there soon after. I was pretty bummed at first, but quickly realized that I really needed a change of scenery. Eleven years at one job is a long time! On to new projects and new learnings.
And so, I started working on a startup idea in early 2019. It is a mobile/web app to help car dealers when purchasing cars at auction. I also took the plunge (twelve years after dabbling in Erlang) into using Elixir for the web app and React Native for the mobile app. All new tools to me. I applied for and was accepted for the state self-employment assistance program. When that ran out, however, I was still a long way from having a functioning mobile app and certainly nowhere near being ready to try to make money on it.
I applied at lots of places, more for Ruby positions than Elixir, though I really wanted to do Elixir professionally. I consider myself very fortunate to wind up as a full-time, fully-remote, senior backend engineer at Weedmaps. All Elixir, all the time! I still try to work on my app when I have time, but not as often as I would like. It is especially frustrating when I make no progress for months due to a bizarre bug. I’ll keep plugging away though. Onward and upward!