About Google Reader's Birth: Part 1.
Other posts about ReaderThis story of Google Reader's birth isn't just about me. But for a long, bad while it is. So here's how it started...
It's Kottke's Fault.Sometime around early 2001, while not working at work, I was reading a post on Jason Kottke's blog where he mentioned a company named Moreover. Moreover had a pitch about putting free headlines on your site. At the time, Moreover's pitch sounded like tin-toned boilerplate barkery with a voice about as authentic as a "sale" at Guitar Center. But I trust Jason, and, besides, could I write marketing copy any better? (Answer: no.)
I followed the instructions and put headlines on my site. It was easily accomplished.
I realized that instead of this neat solution, someone should replace it with something tedious and lame and less re-usable. I was clearly that someone.
All the choices of a Model T.I decided I wanted a site with headlines from many different sites. In the irrational exuberance days, these were sometimes referred to as "web directories" or "web portals" if they were customizable.
I made a poorly-written, open-sourced Java library to get headlines based on Moreover's "webfeeds." Then I made a mini-portal. It got the "mini" qualification because the customization was narrow since users could only choose headlines from sites I liked because I was too lazy to build the customization engine. Naturally, I included my own weblog, so my hand would have been raised high in a "raise your hand if you're a jerk" contest.
I finished and sent a link to friends. The site was alive and browsers could see it, so I was satisfied. Except CNN didn't have a feed, so I modified the code to scrape the lead story and some other links. Later that year, on September 11th, that would turn out to be a surreal snapshot on a bandwidth-choked day as the cache contained information from sites that remained inaccessible.
There are many copies.The mini-portal puttered along on a server in my apartment throughout the next couple of years as my professional life was significantly changed by joining Google. I remain grateful for this; I am exceedingly lucky this occurred.
I was working on Blogger, for whom syndication was an important and contentious topic. I'll elide over the technical details and specific history of the evolution of feeds and instead give you my bird's-eye first impression as a developer wading into the food fight over standards and implementation. My first impression?
Blogger had Moreover's webfeeds, except they were calling them just "feeds." And other people before Moreover had originally called them RDF for a while but simplified them to RSS. Except then they called them Echo. Which stopped after a while and they called them Atom though they planned several versions. Except there was still RSS. Also with several versions. And everyone hated each other. Weird, huh?
(If you're mad about the preceding paragraph, please know I think you are a beautiful person. And sexy. You are loved, it is presumed.)
The mini-portal kept breaking and friends kept telling me they relied on it, so I kept updating it. I was surprised anyone relied on it, especially as it wasn't very powerful. They seemed addicted.
Parser.At Google one day, like every day, I was really busy.
Which, for the non-geeks, is his asking me to make something that turns something into something else which could be used to represent data that was basically about cat photos. Generally the people who appreciate this kind of thing have been given a Lego-based Millenium Falcon as a birthday present.
So, okay. That sounded fun (kinda). And I was only doing several thousand things at the time, so it seemed a reasonable request.
Normalization.After writing an Atom parser and getting a way to run unit tests automatically for a group of Atom feeds I went back to the thousands of things I was supposed to be doing and rested with some contentment.
"You suck," mentioned Steve Jenson.
"Having a normalizer could fit every kind of feed content into your model," he continued while watching me review the unit tests in shame. "Then you would suck less. And I could write that in ten minutes. Nine, if I don't take time to blink."
Steve whipped together a Python-based normalizer based on the Universal Feed Parser and made me watch. He agreed to let me use it if I danced a jig which I performed mio gusto as requested. I'd already abandoned my dignity earlier in life so the joke was on him.
A moment of clarity.Normally, programmers are supposed to minimize duplication of effort so I wasn't thinking about making a feed reader, there were plenty of those - I was just making a web page that tested the parser. I narrowed the parser effort to just one bug that concerned me, and one night I finally discovered a workaround, posted about it, and ran the tests again to review the content.
Oh. Well, would you look at that.
See, that night a little wheel reinvention occurred ... as a square. The parser became a reader by accident.
It's difficult to describe my excitement at that moment.
For the non-geeks, I mostly work on the stuff you can actually see when you use software: the layout, forms, graphics, the logic behind what happens when you click on something.
Each time I'd want to do something useful that was also complex, I'd have to create a layer which described data in a way that I could easily transform. It almost never came out from a database that way.
But in this moment, I reviewed the tests and was reminded that a layer had been bypassed. Feeds were already describing data in a way that I could easily transform. This was more convenient than any other confluence of data and language than I'd seen. I could work less and take naps and just be lazier and that's all I'd really wanted anyways.
An anecdote for the geeks: I'd also realized it could be neat to attach events processing to individual items in a feed. I hoped that could be useful. (As Mihai has shown all of us in abundance: it has been. More on that later.)
The pages looked reasonably pretty.
I put it on the Google intranet to show Steve even though the reading interface had lots of bugs. Code quality seemed unimportant since, I thought, this is just a little thing. It's not like it's going to be something real.
Continue on to Google Reader's Birth: Part 2