by Gil Fewster
Of hidden features, messages in bottles, and demented bakers.
I’ve had enough chocolate over the last few days to last me a lifetime. Or at least until next week. But I’m still thinking about easter eggs and, specifically, easter eggs in software.
For the uninitiated, easter eggs is the name of those hidden features and secret messages that programmers are so fond of sneaking into their work. These secret messages are entirely incidental to the purpose of the software they’re hidden in; typical easter egg content can include photos or names of the developers, jokey pop culture references, mini games, and other flights of fancy that happen to tickle a programmer’s funny bone*.
Easter eggs can be found within even the most buttoned-down, serious software. Microsoft developers famously hid entire pinball games and flight simulators in early versions of Excel. Google developers are well known for sneaking jokes and animations into their search and maps products. I once released online corporate training software which would play the James Bond theme song if you created an asset with a numerical ID of 007.
As corny as they may be, easter eggs bring a warm glow to my otherwise cold, dark heart.
It’s not because they are universally hilarious (they’re not), or because they are the most interesting things to code (they aren’t), but because they’re evidence of something easily forgotten: software, for the most part, is written by humans, for humans.
That may sound obvious, but in truth the relationship between software developer and software user is distant and relatively abstract.
To programmers, users exist in the future. Developers build software with hypothetical users in mind, modeled according to a combination of demographic data and functional requirements. A user is an initiator of system tasks, a bundle of needs which the system is aiming to satisfy. Users are archetypes, not individuals.
And what are programmers to users? Anonymous and impersonal, programmers wrangle impenetrable arcana into page upon page of coded gibberish. Programmers talk to machines so that other people don’t have to (the more unkind amongst you may have even mentally rephrased that to read “machines listen to programmers so that other people don’t have to”).
To the casual observer, raw code resembles functional software in much the same way that a cup of flour, some warm water and a ball of yeast resembles a crusty loaf of fresh bread.
But when your spreadsheet Rickrolls you, or when Google slyly answers your search for “anagram” by asking “did you mean nag a ram?”, something cool is happening. For a few seconds the relationship is no longer abstract. It’s personal. The functional process of requirement-task-result is fleetingly replaced with something more like communication.
An easter egg is a conversation between humans. An acknowledgement that no matter how much time and space is between us, this software was made by real people, for real people. Not programmer and user, but me and you.
Finding an easter egg in your software is proof of its human origin, like finding the baker’s fingertip in that crusty loaf of bread we were talking about a couple of paragraphs ago. Except not as disgusting or alarming. And probably the fingertip wasn’t left in there deliberately. I mean, what kind of deranged baker leaves severed body parts inside loaves of bread for people to…actually, you know what? This is a terrible analogy. Forget the whole fingertip thing. I’m sorry I brought it up.
My point (and I can make a point here because, unlike a demented baker, I still have fingertips with which to point) is that I love easter eggs because they’re like handprints in cement or heart-encircled initials scratched onto the underside of a desk. They are a message in a bottle, cast into the ocean and declaring, in the unlikely event that they are found, simply: here we are.
It’s hard to think of anything more human than that.
*You can see a stellar example of an easter egg at http://digg.com/.
Just wait for the page to load and then press the following sequence of keys (use arrow keys for the up/down/left/right — don’t spell out the actual words):