Programming and Pocket Universes

Programming is an odd activity. The goal of the exercise is to build something completely abstract that somehow does something useful. To build this abstract network of symbols and interactions, one uses a rigidly-defined set of linguistic constructs.

On many occasions I have declared, with a level of absoluteness proportional to my blood alcohol level, that good programmers are spatial thinkers. That programming is inherently visual. But the thing is, it’s not visual at all, because physical vision is bound to the real world.

Geeks corral the abstract concepts and in their heads build fantastic frameworks that only they can “see”. The deepest part of the programming is often done with boxes and lines on a whiteboard. The implementation is just details.

But those flat whiteboard representations don’t fully capture the life of the system. And we talk about the “problem space”, which is a rough definition of the world this software is supposed to improve, and a host of other spaces that aren’t like the space Captain Kirk flies through, or even the space Martin Short navigates. It is a space entirely in the heads of the people working on the project, and maybe not even all of them see it.

But it is beautiful in its own way. That space is not bound by physical al law; it is bound by the requirements of the project: rules created by some guy in a suit who wants to sell more used cars or by some lady in jeans who wants to identify people at risk of heart attacks. For each problem the programmer builds a world, a new space, unbound by that old, “traditional” space that has finite dimensions and entropy all those other distractions.

Programmers create small, specific universes. Pocket Universes. Most of those universes would be pretty boring to you; as you listen to Jane Geek at your class reunion go on about how she streamlined insurance claims, remember this: even if Jane Geek didn’t create a new universe, she sure as hell improved on someone else’s crappy universe (there are myriad crappy universes now). She is right to feel proud. How many Universes have you improved lately?

3

… its own Reward

I just prevailed in a design discussion with my boss. The result: I get to implement the feature.

2

And Now We Wait

I have been working on a big project for the better part of a year now. It is a massive overhaul of the systems my department uses in their daily grind. Over time, those systems have become downright awful, and much of the awfulness was beyond our ability to address. A key part of the system was run by our IT department.

That system was never very good, but as our needs changed, the system… stayed the same. Any change would cost hundreds of thousands of funny-money dollars and take a year just to find out that it was going to be another year, and another bucket of funny-money. It’s budget-dollars, not real dollars, but spending on that system would take budget-dollars away from other projects.

This antique system left the rest of our tools making terrible compromises so that the missing functionality could be wedged in. It was time for a change, and I set out to replace that system we didn’t control with a better one that we did.

Hand in hand with that, is that my department’s servers are very, very old in server years. My employer, meanwhile, has created new services so departments like ours don’t need to maintain our own hardware. So this change became not just a massive software update, but a major infrastructure upgrade as well.

I underestimated just how much our applications had been warped to accommodate the crazy compromises. Unwarping them was worthwhile, but time-consuming, and none of these applications had been built with testing in mind. On top of that, the new infrastructure placed its own limits on the applications that required further refactoring.

The goal: to pull the tablecloth off the table without disturbing the dishes, then to slip in a new tablecloth.

For the first few months I worked alone, but as the Big Day approached (and receded), the rest of my team got increasingly involved. I managed to hand off the DNS and server config stuff to my boss just in the nick of time, before the complexity of that exploded in my face.

Not totally alone; I must amend. There were people in many other groups — the people creating the pretty dang awesome new infrastructure tools we are using, who went out of their way to accommodate me and help me along, even though my group is tiny in the scheme of things.

I mentioned the Big Day. That’s not quite accurate. Much like “Happy Hour from 3-7 p.m.”, the Big Day started three hours ago and lasts through the weekend. Right now a script is running, a complex bit of software I have devoted hundreds of hours to, that pulls the data out of the old databases, reconciles an incredible number of different ways the data can disagree, patches the Definitive Data together and houses them in their new, shiny home. When the script is done tomorrow morning, it will never be run again. It will be archived as a historical curiosity and that’s that.

So this evening my boss put all our systems on hold, and we began the migration. After the first giddy flurry of excitement as we all worked to make sure we were ready, I started my script. “And now we wait,” I wrote to the team.

6

Facebook, Continuous Integration, and Fucking Up

If you ask the engineers at Facebook (I have), they are experts at continuously evolving their platform almost invisibly to the users. If you ask the users, Facebook is really fucking annoying because shit is breaking all the time and the button that was there yesterday is nowhere to be found.

Continuous Integration is a development practice that means that each little tweak to the software goes through the tests and then goes live. It’s a powerful idea, and can massively decrease the risk of publishing updates — rather than push out the work of several geek-years all at once, with all the risk of something going terribly wrong, you push out the result of a couple of geek-weeks of effort on a regular basis, taking baby-steps to the promised land. Tick, tick, tick, with an army of robots making sure no old bugs sneak back in again.

I fully embrace this idea.

Never has a company been more proud of accomplishing this than Facebook. They crow about it around here. Also, never has a company been so bad at actually doing it. What Facebook has managed to do is annoy users with endless changes that affect how people work, while still publishing bugs.

The key is that a continuous, minor set of tweaks to software is good, but endless tweaks to how people experience the software is bad. People don’t want to be constantly adjusting to improvements. So in continuous integration, you can enhance the user experience, but you can’t lightly take away something that was there before. You can’t move things around every couple of weeks.

Back in the day when I went on Facebook more frequently, I was constantly bemused by a user interface that felt like quicksand. Meanwhile, frequent users reported a never-ending stream of bugs.

Facebook, you are the champion of Continuous Integration, and the poster child for CI Gone Wrong.

1