Tumbling tumbleweeds.

Wonder if Tumblr has an API?
May 17
Permalink

About Google Reader's Birth: Part 1.

This 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.

Turns out that with Jason Shellen that wasn’t really much of a deterrent. “Why don’t you make an Atom parser in Javascript?”, he asked.

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.

End Part 1. (via massless)
May 16
Permalink

Considering Google Reader lore.

I’m very lucky. Let’s start with that.

Partly I’m lucky because I get to share thoughts and work with developers all over the world thanks to my day job. My co-workers can be shy, though, so this year’s Google Developer Day seems like a great opportunity for like minds to figuratively cross the dance floor and do the Hora.

I love sharing stories with developers I meet. We should share stories more often. Matt Cutts mentioned something similar a while back. The meet and greet at Google on May 31st is all about our serious stuff - APIs, debugging, templating, project hosting - which is also showcased at Google Code. But what about our silly stuff? What about our lore?

A lot of interesting developments on the web don’t have a folklore.org. Do the following have collected stories/wisdom? Metafilter, Blogger, Flickr, Etsy, YouTube, Gmail, Wordpress, Winamp, MSIE? If they don’t they should.

Recently I’ve been inspired to contribute a little lore over the next few posts about the birth of Google Reader, a project I inadvertently started though I’m not sure I should be considered its mother or godfather or even town elder. Saying I’m responsible for Reader would be like saying the hardening of the earth’s crust is responsible for the script to Raging Bull. One event gave way to the other but I think the credit of creative genius should read “Martin Scorsese” and not “ball of ferrous material.”

The excellent parts of Reader are due to a team of people much smarter than myself. They’re the Scorseses. In any Reader lore, I’d prefer to be considered more of a ferrous ball.

Tech lore can also be useful and informative, particularly for other developers, though I’m hoping I can also relate something my non-tech friends and family can appreciate. I’m also hoping I can at least be a little funny, especially since Justin and I recently discussed how it would be challenging to make a story about an Atom parser interesting.

Now about that Atom parser…

(First anecdote: I made this image for the login screen a mere day before the launch of the redesign for Reader. Wanted it to suggest a folded newspaper. Funny, it doesn’t come close.) (via massless)

Apr 03
Permalink

The Wifi nodes are trying to tell us something. Anything.

Expression is leaky - it seems to fill nearly any text input available. Here’s a sample list of SSIDs I’ve noticed while riding to work.

iPeedInThePool
Bachelorette Pad
touch_it_or_die
VioxxDeaths=50,000
Figity
BriggsyAir
CanYouHearMeNow
pravda
RUBY LOVER
MadDog
Cheese and Crackers
babydaddy
frisky
Nini’s super duper network
m00nbase
MooseNet
parsonage
typhoon
Cuernavaca
MistyMountainTop
Atappa Deva
Go Brooklyn
youngstar
batcave
stayonline
El Chupacabra
Extraneous
FOLSOM BITCH!
crack alley
Middlesex
MASIKAT INPATIENT SERVICES
sfmoviebears
kingDemi
despierta america
Dallyn
Compound
YellowMenace
CitrusSalt
Soul Chicken
Asphodel Airport
JAZZ ROOM
herforthmadsen
zoeunplugged
Naboo-23
forever
GBP
Broken
Massoumeh
Kirkwoo
cats
Movement
MustardBizzle
daisygirl
alabaster
MyPlace
Copper
Pookiehood
animalhouse
N.W.I
weddingpics
The Raging Patellas
VirusSpreader54G
Babaloo
Saberty
Free the Net
Man Alive!
BeanBag
Neoplastic Stereo Broadcast
ducks
pairofpants
classy ladies
airBot
Amalgam
KGB
The_page_g
love2haight
furniture
mi jugo
sUcKeR fReE
(via massless)

Mar 29
Permalink

I like torturing Firefox.

Poor little browsers.

At work we often approach, and occasionally shove past, the limits of what browsers can handle. On my home laptop it appears that Firefox has crashed around 220 times and that 37 of these crashes occured in March of this year alone. I’ve had several different OSes and machines while at Google (including, thankfully, a new Macbook Pro as of yesterday) so the number of crashes that occur during my normal work day aren’t easily retrievable, which is too bad since that’d likely be a higher total.

Mihai pointed out to me that the crash log is just a text file, so the following command with the correct username used should retrieve the number of Firefox crashes for most Macs:

grep "Command: " /Users/[your username]/Library/Logs/CrashReporter/firefox-bin.crash.log | wc -l

I’m thinking of starting an advocacy and protection group: People for the Ethical Treatment of Browsers. It would decry the inhumane level of browser testing that results in the deaths of millions of processes and threads every year. Of course, the other side (our side, really) will haughtily note good intentions, a desire to prevent further surf stoppage, and the benefits that You People enjoy thanks to the sacrifices made by software in cubicle farms all across the world.

Little-known fact: If you lean in close to your computer’s speaker when a browser crashes you can hear its reedy last breath. Some say it’s like a little scream.

I say it’s like music. Sing! (via massless)

Mar 05
Permalink

Me and The Merlin Show.



Recently, Merlin Mann of 43 Folders asked me some questions in an interview about how I manage the information gorilla in my life that is email. It’s about 15 minutes long (Merlin is inspiring) and I had a long-winded answer to how I manage a communcation deluge that is best summarized as: poorly.

When I somehow manage email well, Mihai’s helpful Greasemonkey scripts for Gmail are an essential factor.

Look at me working that smoothie. Dork. Merlin was nice enough to ignore my classlessness. (via massless)

Mar 02
Permalink

Google Reader Optimized Keyboard.


Image created by Flickr user, paolovalde

Lovely. Though I feel a little sorry for “k.”

For those who don’t know, pressing “j” moves to the next item to read in Google Reader. (via massless)