Yaron Goland has an entertaining post entitled Interoperability Wars - Episode 6 - Part 1 - Revenge of Babble about some of the philosophical discussions we’ve been having at work about the Atom Publishing Protocol (RFC 5023). The entire post is hilarious if you are an XML protocol geek and I recommend reading it. The following excerpt is a good starting point for another discussion about APP’s suitability as a general purpose editing protocol for the Web. Yaron writes
Emperor Babble: Excellent, Weasdel's death will serve us well in lulling the forces of interoperability into thinking they are making progress. Welcome Restafarian, it is time you understood your true place in my plans. Luke Restafarian: Do what you want to me emperor, but the noble cause of interoperability will prevail! The Emperor turns to the center of the chamber where a form, almost blinding in its clarity, takes shape:GET /someuser/profile HTTP/1.1host: example.comcontent-type: application/xml<profile xmlns="http://example.com"> <professional> <workTitle>…</workTitle> … </professional> <personal> <spouseName> … </spouseName> … </personal> <clothingPreferences> <favoriteColors> <shirts>…</shirts> … </favoriteColors> … </clothingPreferences> …</profile> Darth Sudsy is momentarily taken aback from the appearance of the pure interoperable data while Luke Restafarian seems strengthened by it. The Emperor turns back to Luke and then speaks. Emperor Babble: I see it strengthens you Restafarian, no matter. But look again at your blessed interoperability. When the Emperor turns back to the form the form begins to morph, growing darker and more sinister:GET /someuser/profileFeed HTTP/1.1host: example.comcontent-type: application/ATOM+xml<feed xmlns="http://www.w3.org/2005/Atom"> <title/> <updated>2000-01-01T00:00:00Z</updated> <author> <name/> </author> <id>http://www.example.com/someuser/profileFeed</id> <category scheme="http://example.com/categories" term="Profile"/> <entry> <title/> <id>http://www.example.com/someuser/profilesFeed/professional</id> <updated>2000-01-01T00:00:00Z</updated> <content type="Application/XML" xmlns:e="http://example.com"> <workTitle>…</workTitle> … </content> </entry> <entry> <title/> <id>http://www.example.com/someuser/profilesFeed/personal</id> <updated>2000-01-01T00:00:00Z</updated> <content type="Application/XML" xmlns:e="http://example.com"> <spouseName> … </spouseName> … </content> </entry> <entry> <title/> <id>http://www.example.com/someuser/profilesFeed/clothingPreferences</id> <updated>2000-01-01T00:00:00Z</updated> <content type="Application/XML" xmlns:e="http://example.com"> <favoriteColors> <shirts>…</shirts> … </favoriteColors> … </content> </entry></feed> Luke, having recognized the syntax, clearly expects to get another wave of strength but instead he feels sickly. The emperor, looking slightly stronger, turns from the form to look at Luke. Luke Restafarian: What have you done? That structure is clearly taken from Princess Ape-Pea's system, she is a true follower of interoperability, I should be getting stronger but somehow it's making me ill. Emperor Babble: You begin to understand young Restafarian. Used properly Princess Ape-Pea's system does indeed honor all the qualities of rich interoperability. But look more carefully at this particular example of her system. Is it not beautiful? Its needless complexity, its useless elements, its bloated form, they herald true incompatibility. No developer will be able to manually deal with such an incomprehensible monstrosity. We have taken your pure interoperable data and hidden it in a mud of useless scaffolding. Princess Ape-Pea and your other minions will accept this poison as adhering to your precious principles of interoperability but in point of fact by turning Princess Ape-Pea's system into a generic structured data manipulation protocol we have forced the data to contort into unnatural forms that are so hard to read, so difficult to understand that no programmer will ever deal with it directly. We will see no repeat of those damned Hit-Tip Knights building their own stacks in a matter of hours in order to enable basic interoperability. In this new world even the most trivial data visualizations and manipulations become a nightmare. Instead of simple transversals of hierarchical structures programmers will be forced into a morass of categories and artificial entry containers. Behold!
Emperor Babble: Excellent, Weasdel's death will serve us well in lulling the forces of interoperability into thinking they are making progress. Welcome Restafarian, it is time you understood your true place in my plans.
Luke Restafarian: Do what you want to me emperor, but the noble cause of interoperability will prevail!
The Emperor turns to the center of the chamber where a form, almost blinding in its clarity, takes shape:
GET /someuser/profile HTTP/1.1host: example.comcontent-type: application/xml<profile xmlns="http://example.com"> <professional> <workTitle>…</workTitle> … </professional> <personal> <spouseName> … </spouseName> … </personal> <clothingPreferences> <favoriteColors> <shirts>…</shirts> … </favoriteColors> … </clothingPreferences> …</profile>
Darth Sudsy is momentarily taken aback from the appearance of the pure interoperable data while Luke Restafarian seems strengthened by it. The Emperor turns back to Luke and then speaks.
Emperor Babble: I see it strengthens you Restafarian, no matter. But look again at your blessed interoperability.
When the Emperor turns back to the form the form begins to morph, growing darker and more sinister:
GET /someuser/profileFeed HTTP/1.1host: example.comcontent-type: application/ATOM+xml<feed xmlns="http://www.w3.org/2005/Atom"> <title/> <updated>2000-01-01T00:00:00Z</updated> <author> <name/> </author> <id>http://www.example.com/someuser/profileFeed</id> <category scheme="http://example.com/categories" term="Profile"/> <entry> <title/> <id>http://www.example.com/someuser/profilesFeed/professional</id> <updated>2000-01-01T00:00:00Z</updated> <content type="Application/XML" xmlns:e="http://example.com"> <workTitle>…</workTitle> … </content> </entry> <entry> <title/> <id>http://www.example.com/someuser/profilesFeed/personal</id> <updated>2000-01-01T00:00:00Z</updated> <content type="Application/XML" xmlns:e="http://example.com"> <spouseName> … </spouseName> … </content> </entry> <entry> <title/> <id>http://www.example.com/someuser/profilesFeed/clothingPreferences</id> <updated>2000-01-01T00:00:00Z</updated> <content type="Application/XML" xmlns:e="http://example.com"> <favoriteColors> <shirts>…</shirts> … </favoriteColors> … </content> </entry></feed>
Luke, having recognized the syntax, clearly expects to get another wave of strength but instead he feels sickly. The emperor, looking slightly stronger, turns from the form to look at Luke.
Luke Restafarian: What have you done? That structure is clearly taken from Princess Ape-Pea's system, she is a true follower of interoperability, I should be getting stronger but somehow it's making me ill.
Emperor Babble: You begin to understand young Restafarian. Used properly Princess Ape-Pea's system does indeed honor all the qualities of rich interoperability. But look more carefully at this particular example of her system. Is it not beautiful? Its needless complexity, its useless elements, its bloated form, they herald true incompatibility. No developer will be able to manually deal with such an incomprehensible monstrosity. We have taken your pure interoperable data and hidden it in a mud of useless scaffolding. Princess Ape-Pea and your other minions will accept this poison as adhering to your precious principles of interoperability but in point of fact by turning Princess Ape-Pea's system into a generic structured data manipulation protocol we have forced the data to contort into unnatural forms that are so hard to read, so difficult to understand that no programmer will ever deal with it directly. We will see no repeat of those damned Hit-Tip Knights building their own stacks in a matter of hours in order to enable basic interoperability. In this new world even the most trivial data visualizations and manipulations become a nightmare. Instead of simple transversals of hierarchical structures programmers will be forced into a morass of categories and artificial entry containers. Behold!
Yaron’s point is that since Atom is primarily designed for representing streams of microcontent, the only way to represent other types of data in Atom is to tunnel them as custom XML formats or proprietary extensions to Atom. At this point you’ve added an unnecessary layer of complexity.
The same thing applies to the actual Atom Publishing Protocol. The current design requires clients to use optimistic concurrency to handle conflicts on updates which seems like unnecessary complexity to push to clients as opposed to a “last update wins” scheme. Unfortunately, APP’s interaction model doesn’t support granular updates which means such a scheme isn’t supported by the current design. A number of APP experts have realized this deficiency as you can see from James Snell of IBM’s post entitled Beyond APP - Partial updates and John Panzer of Google’s post entitled RESTful partial updates: PATCH+Ranges.
A potential counter argument that can be presented when pointing these deficiencies of the Atom Publishing Protocol when used outside it’s core scenarios of microcontent publishing is that Google exposes all their services using GData which is effectively APP. This is true, but there are a couple of points to consider
It seems that while we weren’t looking, Google move us a step away from a world of simple, protocol-based interoperability on the Web to one based on running the right platform with the right libraries.
Usually I wouldn’t care about whatever bad decisions the folks at Google are making with their API platform. However the problem is that it sends out the wrong message to other Web companies that are building Web APIs. The message that it’s all about embracing and extending Internet standards with interoperability being based on everyone running sanctioned client libraries instead of via simple, RESTful protocols is harmful to the Internet. Unfortunately, this harkens to the bad old days of Microsoft and I’d hate for us to begin a race to the bottom in this arena.
On the other hand, arguing about XML data formats and RESTful protocols are all variations of arguments about what color to paint the bike shed. At the end of the day, the important things are (i) building a compelling end user service and (ii) exposing compelling functionality via APIs to that service. The Facebook REST APIs are a clusterfuck of inconsistency while the Flickr APIs are impressive in how they push irrelevant details of the internals of the service into the developer API (NSIDs anyone?). However both of these APIs are massively popular.
From that perspective, what Google has done with GData is smart in that by standardizing on it even though it isn’t the right tool for the job, they’ve skipped the sorts of ridiculous what-color-to-paint-the-bike-shed discussions that prompted Yaron to write his blog post in the first place.
With that out of the way they can focus on building compelling Web services and exposing interesting functionality via their APIs. By the way, am I the last person to find out about the YouTube GData API?.
Now playing: DJ Khaled - I'm So Hood (feat. T-Pain, Trick Daddy, Rick Ross & Plies)