<?xml version="1.0" encoding="iso-8859-1"?>

<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:admin="http://webns.net/mvcb/" xmlns="http://purl.org/rss/1.0/">

<channel rdf:about="http://www.stucharlton.com/blog/">
<title>Stu says stuff</title>
<link>http://www.stucharlton.com/blog/</link>
<description>Partially-baked ideas and commentary on technology and society.</description>
<dc:language>en-us</dc:language>
<dc:creator></dc:creator>
<dc:date>2011-06-09T05:45:20-08:00</dc:date>
<admin:generatorAgent rdf:resource="http://www.movabletype.org/?v=4.34-en" />

<items>
<rdf:Seq>
<rdf:li rdf:resource="http://www.stucharlton.com/blog/archives/2011/06/the-trouble-with-apis.html" />

<rdf:li rdf:resource="http://www.stucharlton.com/blog/archives/2011/03/ws-rest-keynote-slides-and-rec.html" />

<rdf:li rdf:resource="http://www.stucharlton.com/blog/archives/2011/02/ws-rest-2011-keynote.html" />

<rdf:li rdf:resource="http://www.stucharlton.com/blog/archives/2011/01/ws-rest-2011-workshop-call-for.html" />

<rdf:li rdf:resource="http://www.stucharlton.com/blog/archives/2010/11/time-for-rest-is-over.html" />

<rdf:li rdf:resource="http://www.stucharlton.com/blog/archives/2010/10/put-on-your-thinking-cap.html" />

<rdf:li rdf:resource="http://www.stucharlton.com/blog/archives/2010/10/confused-cap-arguments.html" />

<rdf:li rdf:resource="http://www.stucharlton.com/blog/archives/2010/10/still-hunting-for-that-silver.html" />

<rdf:li rdf:resource="http://www.stucharlton.com/blog/archives/2010/05/wsrest.html" />

<rdf:li rdf:resource="http://www.stucharlton.com/blog/archives/2010/05/ws-rest-musings-put-down-the-g.html" />

<rdf:li rdf:resource="http://www.stucharlton.com/blog/archives/2010/05/ws-rest-musings-investment-in.html" />

<rdf:li rdf:resource="http://www.stucharlton.com/blog/archives/2010/05/ws-rest-workshop-themes.html" />

<rdf:li rdf:resource="http://www.stucharlton.com/blog/archives/2010/03/building-a-restful-hypermedia.html" />

<rdf:li rdf:resource="http://www.stucharlton.com/blog/archives/2010/03/versioning-restful-web-resources---a-survey.html" />

<rdf:li rdf:resource="http://www.stucharlton.com/blog/archives/2010/02/i-need-home-for-a-rest.html" />
</rdf:Seq>
</items>

</channel>


<item rdf:about="http://www.stucharlton.com/blog/archives/2011/06/the-trouble-with-apis.html">
<title>The trouble with APIs</title>
<link>http://www.stucharlton.com/blog/archives/2011/06/the-trouble-with-apis.html</link>
<description><![CDATA[<p>I posted a couple of thoughts on Twitter and a few comments elsewhere recently as a results of a discussion <a href="http://broadcast.oreilly.com/2011/06/the-good-the-bad-the-ugly-of-rest-apis.html">on George Reese's blog</a> and <a href="http://stage.vambenepe.com/archives/1777">William's followup</a>.   I thought I'd repost these thoughts here with annotation as it seems to be evolving an interesting discussion.</p>

<p><B>1. REST APIs are a case of good intentions run amok. The point of REST was to *eliminate* specific APIs. Not cause their proliferation.  </p>

<p>2. When someone says you shouldn't document a REST API, they're saying you shouldn't have an API. Not that you shouldn't document.<br />
</B></p>

<p>I mean by this, Network APIs.   I also mean APIs that aren't re-implementable across sites.    The point is that the uniform interface isn't just HTTP - it's a small number of evolving media types, and the goal is to enable <i>sharing of information</i> at a global scale.  Your pet JSON format may not be the way to do this.</p>

<p><B>3.   That said, RESTians saying you shouldn't have an API are somewhat vacuous because they offer no good alternative. Custom media types ain't.</p>

<p>4.  Thus, IMO, until we have a workable generic media type or two for the 80% case of "REST APIs", we're just growing a frustrating mess.</B></p>

<p> In other words, I completely recognize that crafting a media type is a bit heady, and even still a custom media type for generic use is quite hard.    With a REST API at least you get the benefits of HTTP GET (to some degree).    It does the job, if all you want is a trendy vaguely hopeful way of building something for the long term without getting too bogged down in philosophy.   I get it.</p>

<p>What I would like to see is a generic media type (above & beyond a "format" like JSON) to cover the 80/20 cases.   This is seemingly contrary to where many RESTheads are at - they prefer often prefer opinionated media types, media types that "say something".    </p>

<p>I'm actually asking for that too, I think -- say something about the <b>programming model</b> that breaks people's habits away from RPCs.   Find a programming model that doesn't orient all "write-side" communication in terms of a flat list of actions, and into something that can be extended & shared across the web via hyperlinks and URIs.  Hierarchical statecharts is my stab at this.   There may be others.</p>

<p><b>5.   From William's blog (with a couple tweaks)....</b></p>

<p>I've sort of half given up on REST advocacy because it's pretty impossible these days. People want to ship APIs that will be valid for the next next 6 months, not build systems that will evolve over a decade or more.</p>

<p>Jan Algermissen's comment about how when you've documented an API, you're not really doing REST, is actually spot on, fundamentally, but is met with ridicule. I can completely understand how vacuous the comment sounds if you just want to ship an API nownownow, are being short-term practically minded, or are just playing buzzword bingo with architectural styles. But if we actually want to leverage the benefits of the style, we'd work on the core issue of having a generic media type or two for these sorts of use cases.</p>

<p>If one is thinking of "how to methods map to my URI structures", we've basically lost the plot as to why we have HTTP, URIs and media types in the first place. The goal is to *eliminate* the API as we normally think of it.   (It's not about a library of calls over a network).</p>

<p>Five points. The consequences of REST changes some rules:</p>

<p>1. The assumption can't be that the end user of your information service is going to be a programmer. Building an API bakes that assumption in how you expose your information or controls to manipulate it. The assumption rather should be that "this can be any agent of any sort". If your goal really is "I want a programmer to learn my API and program against this", then there's really no reason to use REST other than that it's trendy (and HTTP GET).</p>

<p>2. The assumption can't be that you will be the only site implementing your interface. The whole point of the Web is sharing information - publishing an API bakes in the assumption that YOU, the publisher, are in control. It is the consumer, on the other hand - the agent itself, that's in control of how/what the information is consumed or manipulated.</p>

<p>3. The semantics of the interface that need to be documented are the media type that you use to describe your data and links. The structure of your URIs really shouldn't be a part of said semantics.</p>

<p>4. But doing this in a custom media type implies #2, that you're the only person implementing your interface. Of course, every media type has to start somewhere, but it really doesn't help matters unless you understand that others may be *implementing* your interface, not just *talking* to it. Facebook's Open Graph, for example, is an example of a custom overlay media type that takes great pains to be generic in either direction.</p>

<p>5. All of the above is really heady stuff that is above most developer's pay grades, so it won't ever happen. The best we can hope for is some person/organization to step up with a generic media type or two + guidelines that help describe and document a Web of Data interface for accessibility by programmers. Call it a description language, if you'd like. Some RESTians don't like the idea of a description language. I think it's an essential 80/20 piece if developers are going to actually *use* the architecture the way it was meant to be used.</p>

<p>Currently (as I mentioned in my WS-REST keynote) I think some kind of hierarchical lifecycle/state machine might be the right abstraction for such an interface. I'd like to demonstrate this if I ever got past my day job sucking up most of my time.   (But I may have an opportunity to work on this there soon.)</p>]]></description>
<dc:subject>Tech</dc:subject>

<dc:creator>stu</dc:creator>
<dc:date>2011-06-09T05:45:20-08:00</dc:date>
</item>

<item rdf:about="http://www.stucharlton.com/blog/archives/2011/03/ws-rest-keynote-slides-and-rec.html">
<title>WS-REST Keynote Slides and Recording</title>
<link>http://www.stucharlton.com/blog/archives/2011/03/ws-rest-keynote-slides-and-rec.html</link>
<description><![CDATA[<p>Slides for my keynote, <a href="http://ws-rest.org/2011/program/keynote">"I'll See you on the Write Side of the Web"</a> at the 2nd International Workshop for RESTful Design, WWW 2011 in Hyderabad, India are <a href="/stuff/WSREST2011Keynote.pdf">available here.</a>   </p>

<p>Recording (75 minutes) is now <a href="http://stucharlton.com/stuff/WSREST2011.m4a">available at this link.</a>   (It's an M4A / AAC file, sorry).</p>

<p>I'll eventually post my thoughts on the workshop along with feedback & discussion from this keynote.</p>]]></description>
<dc:subject>Tech</dc:subject>

<dc:creator>stu</dc:creator>
<dc:date>2011-03-28T08:56:37-08:00</dc:date>
</item>

<item rdf:about="http://www.stucharlton.com/blog/archives/2011/02/ws-rest-2011-keynote.html">
<title>WS-REST 2011 Keynote</title>
<link>http://www.stucharlton.com/blog/archives/2011/02/ws-rest-2011-keynote.html</link>
<description><![CDATA[<p>I will be giving the keynote at the 2nd International Workshop on RESTful Design, entitled:  <B>I'll See You on the Write Side of the Web</B>.  </p>

<p>Yes, I do wonder if I have <a href="http://www.youtube.com/watch?v=T1bgxfxchkQ">Brain Damage</a> some days ;)</p>

<p>Here's the abstract:</p>

<p>While global-scale digital information sharing has become synonymous with REST, <br />
state manipulation remains an inconsistent experience.  Many so-called "RESTful <br />
APIs" are specified out of band, through documentation, rather than in <br />
hypermedia.  Developers struggle with constructing their own custom <br />
hypermedia-driven media types, falling back on lightweight site-specific data <br />
structures.  And the few standardized publishing media types, such as the Atom <br />
Publishing Protocol, have had limited adoption.  All of this serves to undermine <br />
the serendipitous reuse of "writes", a quality we take for granted when dealing <br />
with "reads".  Of course, state-changing actions are semantically much more <br />
difficult to describe generically than a simple HTTP GET, and it is an open <br />
question as to whether it's even possible to do so practically.  </p>

<p>This talk will explore whether there's an opportunity to provide generalized <br />
media types and programming frameworks to assist with resource state <br />
manipulation, and what they might look like, drawing inspiration from other <br />
computing domains with dynamic environments, such as video games, robotics, and <br />
embedded systems controllers.</p>

<p><br />
Slides will be posted around the same time as the keynote.</p>

<p><br />
</p>]]></description>
<dc:subject>Tech</dc:subject>

<dc:creator>stu</dc:creator>
<dc:date>2011-02-21T14:52:45-08:00</dc:date>
</item>

<item rdf:about="http://www.stucharlton.com/blog/archives/2011/01/ws-rest-2011-workshop-call-for.html">
<title>WS-REST 2011 Workshop Call for Papers</title>
<link>http://www.stucharlton.com/blog/archives/2011/01/ws-rest-2011-workshop-call-for.html</link>
<description><![CDATA[<p>The Second International Workshop on RESTful Design (WS-REST 2011) is a forum for discussion and dissemination of research on the the Web's architectural style, Representational State Transfer (REST).  It will be held on March 28, 2011 as part of WWW 2011 in Hyderabad, India.</p>

<p>Last year had a high quality set of attendees and submissions, and was a great opportunity to meet those involved in this community. </p>

<p>I'm on the program committee again this year.  We are accepting four-page position papers, or eight-page full research papers on your favourite REST topic.  <a href="http://ws-rest.org/2011/cfp">Send your papers in by Jan 31st!</a>  Even if you can't make it to India, it will be a great forum to disseminate your research!<br />
  </p>]]></description>
<dc:subject>Tech</dc:subject>

<dc:creator>stu</dc:creator>
<dc:date>2011-01-06T07:14:25-08:00</dc:date>
</item>

<item rdf:about="http://www.stucharlton.com/blog/archives/2010/11/time-for-rest-is-over.html">
<title>Time for REST is over</title>
<link>http://www.stucharlton.com/blog/archives/2010/11/time-for-rest-is-over.html</link>
<description><![CDATA[<p>Just read William's <a href="http://stage.vambenepe.com/archives/1665"> Partial resource update, one more time</a>, which is another kick at the partial resource update can.</p>

<p>The problem is that few web services or RESTful hypermedia describe a data model.   Representations themselves don't often describe a data model, they describe a format.    This is the same problem as WS-RT, in that they're trying to describe updates to a format (XML), not a data model.   </p>

<p>In Atom, this doesn't matter, as it kicks the responsibility to the entry.<br />
In HTML, this doesn't matter, as the machinery of browser & server only needs the format for interoperability.</p>

<p>In systems-to-systems communication, this matters a whole lot, as you're coupling your expectations differently with every media type.</p>

<p>A data model is foundational, it describes the mathematical basis for how <b>data is managed</b>.  Examples (for better or worse) include:<br />
<OL><br />
<LI>Key/Value</LI><br />
<LI>Arrays</LI><br />
<LI>Relations</LI><br />
<LI>Logical Graph</LI><br />
<LI>Inverted List</LI><br />
</OL></p>

<p><a href="http://odata.org/">OData</a> describes an implicit data model, based on relations.   <a href="http://en.wikipedia.org/wiki/Resource_Description_Framework">RDF</a> and OWL describe graph data models with an explicit theoretic foundation that makes them more powerful than Relations.    </p>

<p>"Your New JSON Service" probably has a data model, but I bet it's unpublished, and in your head.  And even if you did publish it, it probably is different from "this other guy's JSON Service".</p>

<p>What does all of this mean?   I think it means that there's two big pieces of work to be done to help evolve RESTful web services to better interoperability:</p>

<p>(a) a data model that covers 80% of common use cases and can be formatted with JSON and XML.  This needs to be a closed-world model, like most databases, and thus I don't think RDF qualifies. </p>

<p>(b) a media type that covers 80% of common use cases to describe a resource's lifecycle and state transitions -- in other words, to make POSTs self-descriptive in hypermedia.   Because the world of computing isn't just about updating data, it's about abstractions.  </p>

<p>It is passe' to perform SQL updates directly from your GUI.  It's just as passe' to expect every RESTful hypermedia API to just behave like a database entity.  So, we need something in between, something that gives POST meaning to systems.   POST is the method which powers most of what we DO (vs. read) on the Web anyway.  This "roll your own media type" trend works for simple situations, but really isn't sustainable in the long run, in my opinion.</p>

<p>p.s. yes, that "Part 2" of building a hypermedia agent article is coming ;-)</p>]]></description>
<dc:subject>Tech</dc:subject>

<dc:creator>stu</dc:creator>
<dc:date>2010-11-12T07:05:59-08:00</dc:date>
</item>

<item rdf:about="http://www.stucharlton.com/blog/archives/2010/10/put-on-your-thinking-cap.html">
<title>Put on your Thinking CAP</title>
<link>http://www.stucharlton.com/blog/archives/2010/10/put-on-your-thinking-cap.html</link>
<description><![CDATA[<p>In light of some interesting twitter, blog, and IM discussions over yesterday's post (thanks to <a href="http://twitter.com/chad_walters">Chad Walters</a>, <a href="http://twitter.com/billynewport">Billy Newport</a>, <a href="http://twitter.com/ryanobjc">Ryan Rawson</a>, <a href="http://twitter.com/dehora">Bill de hOra</a>, <a href="http://twitter.com/obdurodon">Jeff Darcy</a>, and others), I've been pondering three CAP points.  Last post on this topic (for a bit), I promise, before I return to your regularly scheduled RESTful programming.</p>

<p><B>1.  Definitions Matter.  Or, are CA/CP are the same thing?</B></p>

<p>Gilbert & Lynch's paper defines the following (I'm not going to use their exact terms, so as to keep this accessible)</p>

<p><UL><LI><B>Consistency (big-C)</B>- aka Atomicity, or a total order on operations (as visible to any user); aka. by database practitioners as serializable isolation.  Makes distributed systems look like a single system.</LI></p>

<p><LI><B>Eventual Consistency (little-C)</B>- aka Delayed-t Consistency, or a bounded amount of time before a data object is consistent, also implies a minimum latency between writes on a single piece of data (without specialized conflict resolution)</LI></p>

<p><LI><B>Weak Availability (little-A)</B>- every request received  from a non-failing node must result in a response, but this response may take forever to come  (i.e. latency is not a part of this definition)</LI></p>

<p><LI><B>Strong Availability (big-A)</B>- every request received from a non-failing node must result in a response even when network partitions occur, but this response may take forever to come (i.e. latency is not a part of this definition)</LI></p>

<p><LI><B>Strong Network Partition Tolerance (big-P)</B>- the network will be allowed to lose arbitrarily many messages sent from one node to another (not counting total network outage).  When a network is partitioned, all messages sent across the partition are lost.   </p>

<p></UL><br />
I'm going to add the following:<br />
<UL><br />
<LI><B>Weak Network Partition Tolerance (little-P)</B>- a system that can tolerate some network partitions, but not all combinations of them. </LI><br />
</UL></p>

<p>I add this due to my reading of their definition of Big-P and sections 3.2.1 and 3.2.2:  "If there are no partitions, it is clearly possible to provide atomic, available data.  In fact the centralized algorithm described in Section 3.2.1 meets these requirements.  Systems that run on intranets and LANs are an example of these type of algorithms".    Section 3.2.1 defines an algorithm for Consistent & Partition Tolerant systems.    Hang on to this one, I'll finish my point in a moment.</p>

<p>So, by these definitions, you basically can have (assuming mixed reads & writes):<br />
- AP:  eventual consistency, strong availability, strong partition tolerance<br />
- CP:  strong consistency, weak availability, strong partition tolerance<br />
- CA:  strong consistency, strong availability, weak partition tolerance</p>

<p>Clearly an AP system is different from CP/CA.  But the crux is whether CA and CP are the same kind of system.   If you consider the idea of weak vs. strong partition tolerance, the difference becomes clear (to me, anyway, but I'm admittedly blonde).</p>

<p>A CA system might be able to handle <b>some</b> partitions, but not <b>all</b>.  Simply put, it has a single point of failure, somewhere.  The example I like to give is a shared-disk cluster database with a SAN.   Partition the SAN, and you're hosed.  Partition the nodes, or even the interconnect, and you will still be available, albeit with higher latency.  Redundancy is the common way to reduce this risk.</p>

<p>Whereas a CP system is designed to handle <b>all</b> partitions, i.e. it has no single point of failure.   But some non-failed nodes may not be able to service clients at all during a partition.  This can suck.    Anyone who's managed a synchronous log shipping setup or EMC SRDF probably knows about this one.</p>

<p><br />
<B>2.  Scope matters</B></p>

<p>The definition of "node" and "network" can vary depending on your granularity and scope.   </p>

<p>The above definitions only make sense if the scope of the system is the server-side of a client/server relationship.   (i.e. How can non-failed nodes experiencing a partition still receive and respond to a request?  Only if the client isn't the one being partitioned.)</p>

<p>A database that's normally a CA system can be considered CP if you zoom out to notice that it's in a multi-node synchronous replication ring.   Or AP if it's in an asynchronous multi-node replication ring.   But notice that, probabilistically, it's behaving like a CA system for 99.9% of the time (or however long your MTBF is).</p>

<p>An AP system on the other hand has one big drawback, one that's not spoken about often.   It's about the scope of the partition: is it recoverable or not?</p>

<p>An unrecoverable partition in a CP or CA system is "no data loss", even if you can't get at the system.   That's not true in an AP system, if there's an unrecoverable error in a certain set of nodes during the "delayed consistency" time window.   This occurs during catastrophic media failures, like a bug in the SAN controller corrupting all the disks, trucks driving through a data center, or floods, or bombs, hurricanes, etc.   </p>

<p>Even with backups, during this "replication latency", you have to re-enter those transactions, or hope that a CP or CA system somewhere has a copy.</p>

<p><B>3.  Definitions are too easy to get hung up on.</B></p>

<p>One of the main reasons I'm talking about this is because I see bolded, underlined claims that can be easily misconstrued, like, "you can't choose consistency and availability together in a distributed system".  This gives me The Fear.</p>

<p>This point of the above quote, is not to say you can't have <b>some consistency</b>.   You just can't have <b>fully serializable consistency and isolation</b>.  </p>

<p>But in practice, when you think about it, this claim is actually rather banal.   Practitioners have long understood that there are a spectrum of consistency & isolation tradeoffs at scale, even at a single node.    Why?   </p>

<p>Because the definition of availability arguably <b>needs to also include latency</b>, which is something Daniel Abadi brought up.   Serializability means locks, in practice, and that means increased latency, and thus reduced availability.  This is why we don't like Two Phased-Commit very much these days.   </p>

<p>But, for kicks,  go back to the <a href="http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.50.9657&rep=rep1&type=ps">ANSI SQL isolation level debate</a> that Jim Gray stirred up.   It was because databases like Oracle (gasp) don't provide serializable consistency, and haven't since the late 1980s!   They provide snapshot consistency, which is a different beast where readers don't block writers, and arguably was the primary technical reason for Oracle's success in the market place through the 1990s.   Amusingly, this is the same argument that Jim Starkey keeps bringing up when discussing CAP, having invented the idea of multi-version concurrency control, when he's talking about his new baby, Nimbus DB.</p>

<p>So the idea that you can't have fully serializable consistency at scale -- even in a single node database -- is completely uncontroversial.   It's when the followup feels like "...and therefore you need to throw out your RDBMS", that cognitive dissonance and tempests in a tweetpot stirs up.  </p>]]></description>
<dc:subject>Tech</dc:subject>

<dc:creator>stu</dc:creator>
<dc:date>2010-10-28T09:35:55-08:00</dc:date>
</item>

<item rdf:about="http://www.stucharlton.com/blog/archives/2010/10/confused-cap-arguments.html">
<title>Confused CAP Arguments</title>
<link>http://www.stucharlton.com/blog/archives/2010/10/confused-cap-arguments.html</link>
<description><![CDATA[<p>A bit of a Twittergasm lately over the CAP Theorem, with relevant blog posts<br />
<UL><br />
<LI><A href="http://codahale.com/you-cant-sacrifice-partition-tolerance/">You Can't Sacrifice Partition Tolerance</A> by coda hale </LI><br />
<LI><A href="http://dbmsmusings.blogspot.com/2010/04/problems-with-cap-and-yahoos-little.html">Problems with CAP</A> by Daniel Abadi</LI><br />
<LI><A href="http://voltdb.com/blog/clarifications-cap-theorem-and-data-related-errors">Clarifications on the CAP Theorem</A> by Mike Stonebraker</LI><br />
<LI><A href="http://pl.atyp.us/wordpress/?p=3068">Reactions to Coda's CAP Post</A> by Jeff Darcy</LI><br />
<LI><a href="http://pl.atyp.us/wordpress/?p=3110">Someone is Wrong on the Internet</A> by Jeff Darcy</LI><br />
</UL></p>

<p>I am confused.   I've narrowed it down to 7 matters.</p>

<p><B>Confusion #1:  Changing system scope from underneath our feet</B><br />
The biggest confusion I have is that the scope of "distributed system" under the CAP theorem seems to have changed, silently.  </p>

<p>If you look at the original papers:<br />
<UL><br />
<LI><a href="http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.83.4274&rep=rep1&type=pdf">Lessons from Giant-Scale Services</a> by Brewer</LI><br />
<LI><a href="http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.24.3690&rep=rep1&type=pdf">Harvest, Yield, and Scalable Tolerant Services</a> by Fox & Brewer</LI><br />
<LI><a href="http://www.cs.berkeley.edu/~brewer/cs262b-2004/PODC-keynote.pdf">Toward Robust Distributed Systems</A> presentation by Brewer</LI><br />
<LI><a href="http://citeseerx.ist.psu.edu/viewdoc/download;jsessionid=A0C9E7FE6DCCECF8844DBB1358D399CB?doi=10.1.1.20.1495&rep=rep1&type=pdf">Brewer's Conjecture and the Feasibility of Consistent Available Partition-Tolerant Web Services</a></LI> by Gilbert & Lynch</LI><br />
</UL></p>

<p>All of them seem to scope the CAP theorem to the <B>server side of a client/server relationship</B>.   That is, it's assumed that the distributed system under consideration is a client/server architecture, but the server-side is distributed in some way.   This is a reasonable assumption, since the Web is a client/server architecture variation, and CAP was originally about the tradeoffs in huge scale web sites.  </p>

<p>But practically speaking, this is particularly important when considering Partition Tolerance.   In the original papers, CA (Consistent, Available) was absolutely common, and in fact, the most common scenario, with Brewer giving examples like cluster databases (on a LAN), single-site databases, LDAP, etc.   The most popular commercial cluster databases today arguably retain this definition of CA, such as Oracle's RAC.   </p>

<p>But now, AP (availability, partition tolerance) advocates are questioning if CA distributed systems are even possible, or merely just something that insane people do.    It's a very strange, extreme view, and I don't think it offers any enlightenment to this debate.   It would be good to clarify or at least offer two scopes of CAP, one within a server scope, and another in a system-wide scope.</p>

<p><B>Confusion #2:  What is Partition Intolerance?</B></p>

<p>This is never well defined.   Like lactose intolerance, the results, can be, err, unpredictable.   It seems to imply one of: complete system unavailability, data  inconsistency, or both.   It's also unclear if this is recoverable or not.   Generally it seems to depend on the implementation of the specific system.    </p>

<p>But because of this confusion, it's easy to let one's mind wander and say that a CA system "acts like" an AP or CP system when experiencing a partition.  That leads to more confusion as to whether a CA system really was just a CP system in drag all along.</p>

<p><B>Confusion #3:  Referring to Failures Uniformly</B></p>

<p>It seems to be a simplifying assumption to equate failures with network partitions, but the challenge is that there are many kinds of failures:   node failures, network failures, media failures, and each are handled differently in practice.    </p>

<p>Secondly, there are systems with many different kinds of nodes, where they tolerate partitions in one kind of node, but not another kind, or just maybe just not a "full" partition" across two distinct sets of nodes.   Surely this is an interesting property, worthy of study? </p>

<p>Taking Oracle RAC or IBM DB2 pureScale, as an example.  It actually tolerates partitions of many sorts - cluster interconnect failures, node failures, media failures, etc.  What it doesn't tolerate is a total network partition of the SAN.    That's a very specific kind of partition.   Even given such a partition, the failure is generally predictable in that it still prefers consistency over availability.</p>

<p><B>Confusion #4:  Rejecting Weak vs. Strong Properties</B></p>

<p>Coda hale sez: "You cannot, however, choose both consistency and availability in a distributed system [that also tolerates partitions]".</p>

<p>Yet this seems very misleading.  Brewer's original papers and Gilbert/Lynch talk about Strong vs. Weak consistency and availability.    The above statement makes it sound as if there is no such thing.</p>

<p>Furthermore, most distributed systems are layered or modular.   One part of that system may be CA-focused, the other may be AP-focused.   How does this translate to a global system?</p>

<p><B>Confusion #5:  Conflating Reads & Writes</B></p>

<p>Consider the Web Architecture.   The Web is arguably an AP system for reads, due to caching proxies, but is a CP system for writes.    </p>

<p>Is it useful to categorize a system flatly as binary one or the other?</p>

<p><br />
<B>Confusion #6:   Whether AP systems can be a generic or the "default" database for people to choose </B></p>

<p>AP systems to my understanding are application-specific, as weak consistency is difficult to correct without deep application knowledge or business involvement.   </p>

<p>The question and debate is, what's the default database for most IT systems... should it be a traditional RDBMS that's still a CA system, like MySQL or Oracle?   Or should it be an AP system like a hacked-MySQL setup with Memcached (as AP), or Cassandra?</p>

<p> When I see claims that CA advocates as "not getting it", or "not in their right mind", I have a severe case of cognitive dissonance.   Most IT systems don't require the scale of an AP system.   There are plenty of cases of rather scalable, highly available CA systems, if one looks at the TPC benchmarks.    They're not Google or Amazon scale, and I completely agree that an AP system is necessary under those circumstances.   I even agree that consistency needs to be sacrificed, especially as you move to multi-site continuous availability.   But it's very debatable that the <b> basic database itself </b> should be CA by default or AP by default.</p>

<p>For example, many IT shops have built their mission-critical applications in a CA manner within a single LAN/rack/data-centre, and an AP manner across racks or data-centres via asynchronous log shipping.   Some can't tolerate any data loss and maintain a CP system with synchronous log shipping (using things like WAN accelerators to keep latency down).       And not just for RDBMS - this is generally how I've seen Elastic Data Cache systems (Gigaspaces or Coherence or IBM WebSphere ExtremeScale) deployed.    They deal with the lack of partition tolerance at a LAN level through redundancy.    </p>

<p>It's useful to critique the CA single-site / AP multi-site architecture, since it's so common, but it's still not clear this should be replaced with AP-everywhere as a useful default.</p>

<p><B>Confusion #7:   Why people are being a mixture of dismissive and douchey in their arguments with Stonebraker</B></p>

<p>Stonebraker's arguments make a lot of sense to IT practitioners (I count myself as one).   He speaks their language.  Yes, he can be condescending, but he's a rich entrepreneur - they get that way.  Yes, he gets distracted and talks about somewhat off-topic matters.  Neither of those things implies he's wrong overall.   Neither of these things imply that you're going to get your point across more by being dismissive or douchey, however good it feels.   (I'm not referring to anyone specifically here, just a general tone of twitter and some of the snark in the blog posts.  )</p>

<p><br />
One particular complaint I find rather naive - that he's characterizing CAP theorem (more AP system) proponents as <b>only</b> using CAP theorem to evaluate distributed system availability.   Clearly that's not true, but on the other hand, it is kind of true.</p>

<p>Here's the problem:   when I hear venture capitalists discussing the CAP theorem over cocktails because of their NoSQL investments, or young newly-graduated devs bugging their IT managers to use Cassandra, you can bet that plenty of people are making decisions based on a twisted version of the new fad, rather than reality.   But that's how <b>every technology fad</b> plays out.   I think Stonebraker has seen his share of them, so he's coming from that angle, from my view.   Or he could just be an out of touch dinosaur like many seem fond of snarking.   I personally doubt it.</p>]]></description>
<dc:subject>Tech</dc:subject>

<dc:creator>stu</dc:creator>
<dc:date>2010-10-27T11:13:27-08:00</dc:date>
</item>

<item rdf:about="http://www.stucharlton.com/blog/archives/2010/10/still-hunting-for-that-silver.html">
<title>Still Hunting for that Silver Lining</title>
<link>http://www.stucharlton.com/blog/archives/2010/10/still-hunting-for-that-silver.html</link>
<description><![CDATA[<p>Yeah, I've been kind of silent lately.  Hopefully that will change now that I'm out of my cave.</p>

<p>I'm no longer involved full-time with Elastra; I do remain a part time advisor.   One day the story will be told.   Until then, I highly recommend reading <a href="http://steveblank.com/">Steve Blank's</a> blog & books for an apropos understanding of how startups often struggle and remain stubborn in the face of said struggle.  On the bright side, the current team has their head screwed on straight and is still doing great work.</p>

<p>What am I up to?   Consulting, for now at least!  Jetstream Cirrus is my company, and yes, there are intentionally many ways of reading into that name.   I'm offering independent advice & implementation on integration architecture, REST, agile operations, scalable systems, and cloud computing consulting in the U.S. and Canada.</p>]]></description>
<dc:subject>Blather</dc:subject>

<dc:creator>stu</dc:creator>
<dc:date>2010-10-27T11:01:37-08:00</dc:date>
</item>

<item rdf:about="http://www.stucharlton.com/blog/archives/2010/05/wsrest.html">
<title>WS-REST Musings:  Interoperability is Hard Work</title>
<link>http://www.stucharlton.com/blog/archives/2010/05/wsrest.html</link>
<description><![CDATA[<p>Part of my <a href="http://www.stucharlton.com/blog/archives/2010/05/ws-rest-workshop-themes.html">continued series</a> of reflections on the WS-REST workshop.</p>

<p>It may continue to amaze, but the most basic aspects of interoperability continue to have a common problem:   the implementation almost always violates the protocol specs that it supports.	And that violation often gets encoded into practice, and back into the spec.  Sometimes this is for good reasons, sometimes not.</p>

<p><a href="intertwingly.net/">Sam</a> drew from his experience with early SOAP interoperability to illustrate the problem.	Apache SOAP, for example, a descendent of IBM SOAP4J, and the predecessor to Apache Axis, had a history of supporting the early SOAP spec, when it was a vendor-led W3C note. It had encoded data with the SOAP encoding section of the SOAP specification, because the <a ref="http://www.w3.org/2001/XMLSchema">XML Schema</a> data type system was not due to be out until mid 2001.</p>

<p>Of course, early specifications often under-specify, and that leads to implementation leaking through.   A classic borderline cases is representing "Infinity".	XML Schema suggests that infinity should be represented as the characters "INF". Apache SOAP, predating this, used the java.util.Number class, whose toString() method generated "Infinity".	</p>

<p>The fix is simple enough, but there were deployed systems out there already. The solution was to continue to produce "Infinity", but to accept both "INF" and "Infinity".   Future SOAP stacks, like Axis, which were built around XSD in mind, both produced and consumed INF.</p>

<p>My first reaction to a lot of this was, "conform to the (damn) specification".	If it were only so simple.    Sometimes the spec is wrong or incomplete.	Sometimes a boundary condition is missed by implementers.	And organizational inertia makes it hard to upgrade.	So, documenting what is implemented becomes the preference.</p>

<p>None of the above has really any difference with REST.	   One of the takeways:  <strong>contracts matter</strong>.   <br />
 <br />
I know that there's trepidation about the term "contract" among those in the REST community, in that it may envision a rigid interface.  I think it's a price worth paying -- you cannot eliminate the notion of "contract" when interoperability is a concern.  Contracts are not about how rigid or flexible the interface is. They are about ensuring complete, understood, and compliant expectations.	And, frustratingly, they cannot be well-specified if there isn't any implementation experience.</p>

<p>One might argue that the Web has proven very good at composing contracts together -- transfer protocol, media types, identifiers, etc.   It didn't eliminate the painstaking need for agreement, it depends on it.   Those interested in philosophy might find this an interesting paradox, that the explosion of freedom & diversity of web content and applications requires strong control at the lower layers -- an idea Alexander Galloway explores in his book, <a href="http://books.google.com/books?id=7ePFlE5oo7kC&printsec=frontcover&dq=protocol+galloway&source=bl&ots=9oEAYx5auW&sig=ZIL5rRs7mfQ6KGgxuSIzLVGoHJg&hl=en&ei=HXjpS-SRN5HStgPFwsHNBw&sa=X&oi=book_result&ct=result&resnum=2&ved=0CB0Q6AEwAQ#v=onepage&q&f=false">Protocol:  how control exists after decentralization</a>.  Practically speaking, the areas of the Web where there was lax specification and/or complex implementation compromises are the areas where there's not a lot of diversity - such as browsers, which have to deal with HTML, CSS, JS, etc.   Servers haven't been immune from this, but they have somewhat more understandable specs to follow, with HTTP, MIME, URI, etc., though ambiguity with HTTP has led to a dearth of complete HTTP 1.1 deployments (most use a subset).  This has led to the work on <a href="http://datatracker.ietf.org/wg/httpbis/charter/">HTTPbis</a> to clean up and clarify the spec based on over a decade of experience.   </p>

<p>Considering today's new generation of RESTful APIs on social media & cloud platforms, there are some curious trends.  JSON-based RESTful services, for example, do not specify dates, or formal decimals.  XML (schemas) do have standardized simple types, but the syntax and infoset is off-putting due to its lack of fidelity with popular programming languages.    Which is better for interoperability?   Maybe the answer is because JSON is so easy to parse, it's ok that each endpoint needs to adapt to a particular set of quirks, like differing date/time formats.	But that sounds like a very developer-centric argument, something that serves the lazy side of the brain.  We can do better.</p>]]></description>
<dc:subject>Tech</dc:subject>

<dc:subject>interoperability</dc:subject>

<dc:subject>rest</dc:subject>

<dc:subject>workshop</dc:subject>

<dc:subject>ws-rest</dc:subject>


<dc:creator>stu</dc:creator>
<dc:date>2010-05-11T07:43:00-08:00</dc:date>
</item>

<item rdf:about="http://www.stucharlton.com/blog/archives/2010/05/ws-rest-musings-put-down-the-g.html">
<title>WS-REST musings:  Put Down the Gun, Son</title>
<link>http://www.stucharlton.com/blog/archives/2010/05/ws-rest-musings-put-down-the-g.html</link>
<description><![CDATA[<p>Part of my continuing <a href="http://www.stucharlton.com/blog/archives/2010/05/ws-rest-workshop-themes.html">series</a> of reflections on the REST workshop at WWW 2010...</p>

<p>Sam Ruby's <a href="http://intertwingly.net/blog/2010/04/26/WS-Rest-Slides">keynote</a> began with a call for technologists to back off the extreme positions often taken in technical arguments (likely because he's knee deep in the middle of the <a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/">mother of all technical standards debates</a>).	Using Mark Pilgrim's parable of the <a href="http://diveintomark.org/archives/2004/07/06/nfc">web services spec developer</a> fighting to the death over Unicode Normalization Forms, he illustrates that technical advocacy can lead to knee jerk, us vs. them reactions on very minute details, especially when different mindsets collide and have to work out a path to interoperability.</p>

<p>Relating this to the "REST community" (whatever that means), I think we seem to have a built-in defensive posture, and aren't quite used to being in the driver's seat for innovation. There were so many attempts to "fix" the Web into some other architecture: HTTP-ng <a href="http://www.w3.org/Protocols/HTTP-NG/1998/08/draft-frystyk-httpng-arch-00.txt">tried with a distributed object model</a>, the Web Services crowd <a href="http://www.w3.org/TR/ws-arch/">tried again</a>. The slow counter-revolution of "using the Web" was largely grown out of Mark Baker's <a href="http://www.markbaker.ca/blog/2008/01/rest-vs-soap-the-personal-cost/">health and savings account</a>.  And now, REST is now a technical pop culture buzzword, being perverted in meaning as all buzzwords are prone to.     Roy's <a href="http://permalink.gmane.org/gmane.comp.web.services.rest/3995">gotta defend</a> the meaning of the word if it's to mean anything.  So, in a way, it's completely understandable why RESTafarians honed a defence mechanism against misleading arguments that they fought ad nauseam.</p>

<p>Unfortunately, today, this defence mechanism seems to have limited free discussion of the limitations of REST, the areas of useful extension, the design of media types, and the ability to relate or objectively discuss extensions to REST that may evaluate the benefits of decades-old ideas like transactions, reliable messaging, or content-level security, without being patronizing ("you don't need transactions", or "reliable messaging isn't really reliable", "use SSL, it's easier", etc.).  Researchers and standards working groups try to follow the style, or publish extensions, but anticipate the dreaded <a href="http://roy.gbiv.com/untangled/2008/no-rest-in-cmis">Roy bitchslap</a>, perhaps because there seems to be a lack of resources (tools, documentation, frameworks, examples in different use cases) to learn how to apply the style, or perhaps because people are being lazy in applying the style (glomming onto a buzzword).   Hard to tell.</p>

<p>In short, this is a hard problem to resolve, as there are good reasons for people's strong opinions.   Compromise can only be achieved if there's shared understanding of the facts & shared values.   Mostly I see shared values in terms of the properties that people find desirable in a networked system (interoperability, extensibility, visibility, etc.), we still seem to be missing a shared understanding of the facts (such as the basic idea of "emergent properties" in software architecture, and the idea that they can be induced through constraints -- which I think many still reject.)</p>

<p>To be fair, there have been plenty of extensions out there, include the <a href="http://www.ics.uci.edu/~rohit/ARRESTED-ICSE.pdf">ARRESTED thesis</a> from Rohit Khare, various public <a href="http://developer.netflix.com/">RESTful</a> <a href="http://wiki.zimbra.com/index.php?title=ZCS_6.0:Zimbra_REST_API_Reference">APIs</a> and <a href="http://www.infoq.com/news/2009/11/restfulie-hypermedia-services">frameworks</a> out there, Henrik Nielsen's use of RESTful SOAP services in <a href="http://msdn.microsoft.com/en-us/robotics/default.aspx">Microsoft Robotics</a> studio, etc.</p>

<p>Look at the <a href="http://msdn.microsoft.com/en-us/library/bb905471(v=MSDN.10).aspx">reference to the latter</a>, for example. There are plenty of "specific methods" being defined while fitting under the POST semantics.	Some would have a problem with that, but I'm not sure what the alternative would be.	There are "state replacement" methods under the PUT semantics if you prefer that.	But some clients may prefer the more specific, precision state transfer of a POST method.	Would you consider this heresy?   Or would you stop and realize that Henrik was in the front row of the WS-REST workshop, and co-authored too many W3C notes and IETF RFC's to enumerate here?</p>

<p>I'll speak more about this problem with the "write side of the web" soon, but in short, we don't really have a good way of describing the pre-conditions, post-conditions and side-effects of a POST in a media type, which would be probably the more "RESTful" thing to do.   Mark Baker took a <a href="http://www.markbaker.ca/2002/05/GettingStuffDoneOnTheWeb/">stab at this 8 years ago</a>, but there's hasn't been much pickup.    In lieu of that, the simplest thing might be to make an engineering decision, slap a method name & documentation on the URI+POST interaction, and move on.   You'd be no worse than a WSDL-based Web Service, with the added benefit of GET and URIs.    Or, depending on your use case, it may mean crafting a full media type for your system, though I'm not sure that's "simple".   </p>

<p>This dilemma is why I tend not to have a problem with description languages like WSDL 2.0 or WADL -- they're not complete, certainly, but they're a start  to wrapping our heads around how to describe actions on the Web without breaking uniformity.</p>]]></description>
<dc:subject>Tech</dc:subject>

<dc:subject>post</dc:subject>

<dc:subject>rest</dc:subject>

<dc:subject>workshop</dc:subject>

<dc:subject>write web</dc:subject>

<dc:subject>ws-rest</dc:subject>


<dc:creator>stu</dc:creator>
<dc:date>2010-05-07T08:25:59-08:00</dc:date>
</item>

<item rdf:about="http://www.stucharlton.com/blog/archives/2010/05/ws-rest-musings-investment-in.html">
<title>WS-REST musings:  Investment in REST (it&apos;s not where we might have expected)</title>
<link>http://www.stucharlton.com/blog/archives/2010/05/ws-rest-musings-investment-in.html</link>
<description><![CDATA[<p>Most of those I spoke to at WS-REST felt was that media types, tools, and frameworks for REST have been growing slowly and steadily since 2008, but lately there's been a major uptick in activity: HTML5 is giving browsers and web applications a makeover, OAuth is an RFC, several Atom extensions have grown, Facebook has adopted RDFa, Jersey is looking at Hypermedia support, etc.</p>

<p>But, coming out of the WS-* vs. REST debates, it is interesting in noting what hasn't happened the past two years, since the W3C Workshop on the Web of Services, which was a call to bridge-building.	As expected, SOAP web services haven't really grown on the public-facing Internet.	And, also as expected, RESTful services have proliferated on the Internet, though with varying degrees of quality.	What hasn't happened is any real investment in REST on the part of traditional middleware vendors in their servers and toolsets.	Enterprises continue to mostly build and consume WSDL-based services, with REST being the exception. There has been, at best, "checkbox" level features for REST in toolkits ("Oh, ok, we'll enable PUT and DELETE methods").	Most enterprise developers still, wrongly, view REST as "a way of doing CRUD operations over HTTP".	The desire to apply REST to traditional integration and enterprise use- cases has remained somewhat elusive and limited in scope.</p>

<p>Why was this?</p>

<p>Some might say that REST is a fraud and can't be applied to enterprise integration use cases.	I've seen the counter-evidence, and obviously disagree with that assessment, though I think that REST-in-practice (tools, documentation, frameworks) could be improved on quite a lot for the mindset and skills of enterprise developers & architects. In particular, the data integration side of the Web seems confused, with the common practice being "make it really easy to perform the required neurosurgery" with JSON. I still hold out hope for reducing the total amount of point-to-point data mapping & transformation through SemWeb technologies like OWL or SKOS.</p>

<p>Perhaps it was the bad taste left from SOA, or a consequence of the recession. Independently of the REST vs. WS debate, SOA was oversold and under-performed in the market place.	Money was made, certainly, but no where near as much as BEA, IBM, TIBCO, or Oracle wanted, and certainly not enough for most Web Services-era middleware startups to thrive independently. It's kind of hard to spend money chasing a "new technology" after spending so much money on the SOAP stack (and seeing many of the advanced specs remain largely unimplemented and/or unused, similar to CORBA services in the 90's).</p>

<p>Or, maybe it was just the consequence of the REST community being a bunch of disjointed mailing list gadflys, standards committee wonks, and bloggers, who all decided to get back to "building stuff" after the AtomPub release, and haven't really had the time or inclination to build a "stack", as vendors are prone to.</p>

<p>Regardless the reason, the recent uptick in activity hasn't come from the enterprise or the enterprise software vendors offering a new stack. The nascent industries that have invested in REST are social computing, exemplified by Twitter, Facebook, etc. and cloud computing, with vCloud, OCCI and the Amazon S3 or EC2 APIs leading the way.</p>

<p>The result has been a number of uneven media types, use of generic formats (application/xml or application/json), mixed success in actually building hypermedia instead of "JSON CRUD over HTTP", and a proliferation of toolkits in JavaScript, Java, Ruby, Python, etc. </p>

<p>We're going to be living with the results of this first generation of HTTP Data APIs for quite some time.  It's time to apply our lessons learned into a new generation of tools and libraries.</p>]]></description>
<dc:subject>Tech</dc:subject>

<dc:subject>rest</dc:subject>

<dc:subject>workshop</dc:subject>

<dc:subject>ws-rest</dc:subject>


<dc:creator>stu</dc:creator>
<dc:date>2010-05-06T10:32:01-08:00</dc:date>
</item>

<item rdf:about="http://www.stucharlton.com/blog/archives/2010/05/ws-rest-workshop-themes.html">
<title>WS-REST Workshop Themes</title>
<link>http://www.stucharlton.com/blog/archives/2010/05/ws-rest-workshop-themes.html</link>
<description><![CDATA[<p>The First Workshop on RESTful Design (WS-REST, hur hur) was held at WWW 2010 in Raleigh last week.	I attended and was also on the program committee.	It was great to finally meet a number of folks from rest-discuss and the #rest IRC channel, along with seeing again folks working to improve REST in the trenches.</p>

<p>This turned into the mother of all blog posts, so I've chunked it up into a series.	The tl;dr version of my workshop takeaways are the following:</p>

<p>- <a href="http://www.stucharlton.com/blog/archives/2010/05/ws-rest-musings-investment-in.html">Investment in RESTful technology</a> is growing, particularly with cloud and social computing. Enterprise and vendor investment has been low.</p>

<p>- <a href="http://www.stucharlton.com/blog/archives/2010/05/ws-rest-musings-put-down-the-g.html">Technical disagreements and arguments</a> from authority are counter-productive, and seem to be ubiquitous. Now is the time to build stuff, and make stuff interoperate, not split hairs. On the other hand....</p>

<p>- In building interoperable systems, sometimes domain experts are wrong, sometimes they're right. Sometimes it's better to document and standardize what works, sometimes that's not good enough.</p>

<p>In short, <a href="http://www.stucharlton.com/blog/archives/2010/05/wsrest.html">interoperability is hard</a>, REST doesn't change that, better get a good helmet if you're in a group specification or standards body these days.	The most important thing is if you're going to willfully violate someone else's idea of "the Right Thing", then be explicit and honest about it, so that it can be discussed. (This is, in part, the saga of the <a class="zem_slink" href="http://en.wikipedia.org/wiki/HTML5" title="HTML5" rel="wikipedia">HTML5</a> standards effort.)</p>

<p>- REST has become a buzzword among those that aren't architects and don't want to be architects.	That means there needs to be better documentation, tools, and frameworks; most developers can't derive the right design from first principles.	Most published RESTful APIs published today are not as interoperable as they could be; there will be a price to pay to maintain these.</p>

<p>- Having said that, for architects, progress has been slow in driving a true discipline for architecture, though there is some great work afoot to make this easier</p>

<p>- Hypermedia tends to be a somewhat jarring user experience to those that still love their desktop applications, especially when we build small protocols like OAuth , but fall back on HTML to do other pieces like authentication and authorization policy selection.</p>

<p>- Developers tend to love dynamic binding nature of REST so long as they're not the ones that have to maintain the client.	We need a better way of handling dynamic binding (my suggestion is a work in progress) to hypermedia.</p>

<p>- It's high time to work on the "write side" of the web.	We know that HTTP GET works well for interoperability.	We have had less success with write actions, and need to think through interoperability there to a much greater degree than we have.	Enterprise<br />
integration use cases, for example, could really benefit from describing POST interfaces for domain application protocols.	The best we have is WSDL, WADL, and generic forms like XForms, HTML Forms, and generic publishing containers like AtomPub.	We can do better.</p>

<p>- You can use REST in the enterprise, for legacy integration, successfully.</p>

<p>- Peer to Peer systems quite achievable in RESTful systems.	The nature of hypermedia itself is peer-to-peer. And minor extensions to HTTP can lead to full data propagation style systems.</p>

<p>- Progress is being made to formally describe a RESTful Semantic Web, one that leverages the formal descriptions of tuple spaces with the <a class="zem_slink" href="http://en.wikipedia.org/wiki/Pi_calculus" title="Pi calculus" rel="wikipedia">polyadic pi-calculus</a> and extends them to RESTful architectures.</p>

<p>- While HTML 5 is progressing to be a rich platform for the next generation web, there's experimentation happening for alternatives. Some drive traditional desktop UIs through RESTful resources, others are describing mixed reality worlds.</p>

<p>I have some forthcoming blog posts musing on these themes.</p>

<div class="zemanta-pixie" style="margin-top:10px;height:15px"><a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/7eb3894b-4db5-499a-abcb-0ea4c06ba853/" title="Reblog this post [with Zemanta]"><img class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=7eb3894b-4db5-499a-abcb-0ea4c06ba853" alt="Reblog this post [with Zemanta]" style="border:none;float:right"></a><span class="zem-script more-related pretty-attribution"><script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"></script></span></div>]]></description>
<dc:subject>Tech</dc:subject>

<dc:subject>rest</dc:subject>

<dc:subject>workshop</dc:subject>

<dc:subject>ws-rest</dc:subject>


<dc:creator>stu</dc:creator>
<dc:date>2010-05-06T10:25:48-08:00</dc:date>
</item>

<item rdf:about="http://www.stucharlton.com/blog/archives/2010/03/building-a-restful-hypermedia.html">
<title>Building a RESTful Hypermedia Agent, Part 1</title>
<link>http://www.stucharlton.com/blog/archives/2010/03/building-a-restful-hypermedia.html</link>
<description><![CDATA[<p>Building a hypermedia-aware client is rather different from building a typical client in a client/server system.    It may not be immediately intuitive.     But, I believe the notions are rooted in (quite literally) decades of experience in other computing domains that are <b><a href="http://en.wikipedia.org/wiki/Software_agent">agent-oriented</a></b>.   Game behaviour engines, <a class="zem_slink" href="http://en.wikipedia.org/wiki/Control_system" title="Control system" rel="wikipedia">control systems</a>, reactive or event-driven systems all have been developed with this programming approach in mind.</p>

<p>The normal way we build clients, in a client/server architecture, looks something like this:<br />
<a href="http://www.stucharlton.com/blog/assets_c/2010/03/cs-programming-model-14.html" onclick="window.open('http://www.stucharlton.com/blog/assets_c/2010/03/cs-programming-model-14.html','popup','width=555,height=406,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://www.stucharlton.com/blog/stuff/cs-programming-model-thumb.png" width="320" height="234" alt="cs-programming-model.png" class="mt-image-none" style=""></a></p>

<p><br />
The logic of the application - its objectives and how it wants to achieve them through one or more remove services, is often procedural.   A rich OO domain model is sometimes preferred to procedural logic,  but this isn't usually used in conjunction with remote services because of the latency involved; a service facade coalesces communication into coarse grained interactions.   </p>

<p>This idea of a service facade culminates in SOA, where interfaces, along with all their possible message exchange patterns, are registered for others to lookup:</p>

<p><a href="http://www.stucharlton.com/blog/assets_c/2010/03/soa-programming-model-18.html" onclick="window.open('http://www.stucharlton.com/blog/assets_c/2010/03/soa-programming-model-18.html','popup','width=581,height=594,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://www.stucharlton.com/blog/stuff/soa-programming-model-thumb.png" width="320" height="327" alt="soa-programming-model.png" class="mt-image-none" style=""></a></p>

<p>A agent-oriented client, on the other hand, looks something this (which I've adapted from Russell & Norvig's <a href="http://books.google.com/books?id=2LEDbFXvGbgC&lpg=PA27&dq=russell%20norvig%20agent&pg=PA52#v=onepage&q=russell%20norvig%20agent&f=false">diagram</a>):</p>

<p><a href="http://www.stucharlton.com/blog/assets_c/2010/03/agent-model-10.html" onclick="window.open('http://www.stucharlton.com/blog/assets_c/2010/03/agent-model-10.html','popup','width=588,height=585,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://www.stucharlton.com/blog/stuff/agent-model-thumb.png" width="320" height="318" alt="agent-model.png" class="mt-image-none" style=""></a></p>

<p>The application agent has several pools of pre-defined logic:</p>

<p>a) <b>Application Logic:</b>  some logic for the application itself (e.g.  the basic states of a hypermedia application, the goals of the application if it has any.   A browser has no goals other than rendering; whereas a product ordering &amp; payment agent would have the goal of completing e-commerce transactions on behalf of a user)</p>

<p>b) <b>Action Logic:</b>   some logic for the implications of actions (e.g. how does a payment & product ordering agent know, interpret, or infer that PUT/POST/DELETEing to a particular sequence of URIs will result in a paid product order)?</p>

<p>c)  <b>Protocol Logic:</b>   some built-in logic for handling protocols &amp; media types (e.g. URI, MIME, HTTP, and maybe some mix of HTML, Atom, Atompub, etc.).  </p>

<p>The problem of bridging together application and action logic together is known as  Action Selection.   <a class="zem_slink" href="http://en.wikipedia.org/wiki/Action_selection" title="Action selection" rel="wikipedia">Action selection</a> doesn't require fancy algorithms.   Its study has often dealt with complex subject matter, which has often lead to complex solutions.    But in most agents, the bread and butter for action selection is simple: the <b><a class="zem_slink" href="http://en.wikipedia.org/wiki/Finite-state_machine" title="Finite-state machine" rel="wikipedia">Finite State Machine</a></b> (FSM).    An agent responds to changes in the environment based on its current state and a set of known transitions.    There are other approaches to agent programming that are growing in popularity, like planners, but let's start with FSMs.</p>

<p>Firstly, an agent's application logic requires a state machine to describe the relationship between sensing ("safe") actions and changing ("unsafe") actions.   In a hypermedia application it looks something like this:</p>

<p><a href="http://www.stucharlton.com/blog/assets_c/2010/03/state-machines-23.html" onclick="window.open('http://www.stucharlton.com/blog/assets_c/2010/03/state-machines-23.html','popup','width=506,height=324,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://www.stucharlton.com/blog/stuff/state-machines-thumb.png" width="320" height="204" alt="state-machines.png" class="mt-image-none" style=""></a></p>

<p>This basic hypermedia application state machine is sandwiched hierarchically between the super-state machine for the application's goals and the sub-state machines for the protocols:</p>

<p><a href="http://www.stucharlton.com/blog/assets_c/2010/03/state-sandwich-25.html" onclick="window.open('http://www.stucharlton.com/blog/assets_c/2010/03/state-sandwich-25.html','popup','width=377,height=282,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://www.stucharlton.com/blog/stuff/state-sandwich-thumb.png" width="320" height="239" alt="state-sandwich.png" class="mt-image-none" style=""></a></p>

<p><br />
The trick with building a RESTful agent based on FSMs would be to figure out a way such that</p>

<p>a) The application's goals can be expressed in terms of hypermedia agent logic (e.g.  sensing &amp; effecting) </p>

<p>b) The hypermedia types and link relations themselves contains enough interpretable action logic that can be mapped to the application's domain</p>

<p>c) The action and protocol state machines are modular.  RESTful applications tend to have standardized and relatively small number of generic protocols, so they need to be repurposed for different applications and/or contexts.</p>

<p>Two ways of accomplishing this include <b>hierarchical FSMs</b> and <b>behaviour trees</b>.</p>

<p><a href="http://en.wikipedia.org/wiki/UML_state_machine#Hierarchically_Nested_States">Hierarchical FSMs</a> are popular in control systems and game engines.   They are great for reactive systems, where the correct interpretation &amp; response to input and events is the intent of the application.   Managing <a href="http://www.w3.org/TR/ccxml/">call control</a>, or a climate control system are examples.  There are powerful generic Hierarchical FSM standards out there like <a href="http://www.w3.org/TR/scxml/">SCXML</a> that provide a code-on-demand approach to interpreting and managing states across a set of resources (though it probably could use some RESTful-friendly polish).  </p>

<p><a href="http://aigamedev.com/open/articles/bt-overview/">Behaviour trees</a> have the same power as hierarchical FSMs, but tend to be more oriented towards goal-based applications, where the purpose of the application is to transition a bunch of resource state to some new state.    For example, a calendar scheduling agent, or a payment &amp; ordering agent, are examples of <a href="http://en.wikipedia.org/wiki/Intelligent_agent">goal-oriented agents</a>.    </p>

<p>In future, I'm going to explore how to build a behaviour tree-based agent; probably for the <a href="http://my.safaribooksonline.com/9781449383312/restbucks_formats">Restbucks</a> domain that Jim Webber, Savas Parastatidis, and Ian Robinson have been using for the past year or so and including in their "REST in Practice" book.<fieldset class="zemanta-related"><legend class="zemanta-related-title">Related articles by Zemanta</legend><ul class="zemanta-article-ul"><li class="zemanta-article-ul-li"><a href="http://oreilly.com/catalog/9781449383169/">REST in Practice: Rough Cuts Version</a> (oreilly.com)</li></ul></fieldset></p>

<div class="zemanta-pixie" style="margin-top:10px;height:15px"><a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/b1e32502-77d2-40d1-a5c3-ad5a276ae01c/" title="Reblog this post [with Zemanta]"><img class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=b1e32502-77d2-40d1-a5c3-ad5a276ae01c" alt="Reblog this post [with Zemanta]" style="border:none;float:right"></a><span class="zem-script more-related pretty-attribution"><script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"></script></span></div>]]></description>
<dc:subject>Tech</dc:subject>

<dc:subject>action selection</dc:subject>

<dc:subject>agent programming</dc:subject>

<dc:subject>behavior tree</dc:subject>

<dc:subject>finite state machine</dc:subject>

<dc:subject>fsm</dc:subject>

<dc:subject>representational state transfer</dc:subject>

<dc:subject>rest</dc:subject>

<dc:subject>SOA</dc:subject>


<dc:creator>stu</dc:creator>
<dc:date>2010-03-29T16:44:39-08:00</dc:date>
</item>

<item rdf:about="http://www.stucharlton.com/blog/archives/2010/03/versioning-restful-web-resources---a-survey.html">
<title>Versioning RESTful Web Resources - A Survey</title>
<link>http://www.stucharlton.com/blog/archives/2010/03/versioning-restful-web-resources---a-survey.html</link>
<description><![CDATA[<p><B>Update:</B> Comments should be working now.</p>

<p>This is my attempt to summarize an overview of my thinking on RESTful versioning.   It's a follow up to <a href="http://stage.vambenepe.com/archives/1300">Square Peg, REST hole</a>.   These concepts can be tricky concepts to describe, and I don't really want to write a small book on this topic, so I may get some of this wrong.   Thus, expect updates to this entry to improve it in the future.</p>

<p><strong>Data Versioning vs. Language Versioning</strong></p>

<p>Extensibility and versioning in RESTful services can be viewed in terms of two domains of agreement.  The two domains are:  resource and representation, which could also be thought of as the "data" vs. "language" domains.    </p>

<p>First, let's recall what a resource is:   <b>a <i>time varying</i> membership function</b>, where the members are instances of a representation at various points in time.  The resource can return different values at different times.   BUT resources can be narrowed down into very specific semantics, if resource owner wishes.   A resource might be "the most recent version" of a record, whose state might change often, or it might be a "specific version" of a record, and thus unchanging in state.   These are two different resources, even though they may have the same representation for a period of time.     A resource may even contain format metadata and constrain the language emitted, though <a href="http://en.wikipedia.org/wiki/Content_negotiation">content negotiation</a> may be preferred.</p>

<p>Regardless of how often the values change, the semantics of the resource should not change.    "Revision 3 of purchase order 123" should retain that meaning.    If they do change the meaning, it hurts consumers that relied on the old meaning.</p>

<p>When we think of <b>URI versioning</b>, this is a design choice when resources are immutable across time and we create new resources for state changes  (similar to how we manage time-series data in a database).   </p>

<p>With <b>language extension or versioning</b>, on the other hand, the state is unchanged, but the way that data is represented has changed.     </p>

<p><strong>On Language Versioning</strong></p>

<p>Rule #1:  Prefer to extend a language in a forwards and/or backwards compatibile manner.   Version indicators are a <a href="http://www.subbu.org/blog/2008/05/avoid-versioning-please">last resort</a>, to denote incompatible changes.    </p>

<p>Extension, of course, requires thought.   It implies well-specified interpretation policies for language consumers, and in the case of a machine-readable schema, well-specified extension points.   But the range of choices aren't too hard to understand.</p>

<p>This table summarizes the current techniques in practice for extensible or versioned languages, using the terminology from the W3C TAG's draft <a href="http://www.w3.org/2001/tag/doc/versioning-compatibility-strategies#iddiv2125080648">versioning compatibility strategies</a> document, by David Orchard, which I'm going to butcher through my own brief summaries.</p>

<table border="1" cellpadding="10" align="left" valign="top">
<tbody><tr>
<th width="20%">&nbsp;</th><th width="40%">Consumer</th><th width="40%">Producer</th></tr>
<tr><td>Backwards-Compatible</td><td><UL><LI>Lookup version notifications</LI></UL></td><td><UL><LI><em>Replacement</em> or <em>Side-by-side</em></LI><LI><em>Version notification</em> via out-of-band channel or links</LI></UL></td></tr>
<tr>
<td>Forwards-Compatible</td><td><UL><LI>Must accept unknowns</LI><LI>Must preserve unknowns if persisting state</LI><LI>Version identifier substitution model</LI></UL></td>
<td><UL><LI>Media type specification clearly defines consumer <a class="zem_slink" href="http://en.wikipedia.org/wiki/Forward_compatibility" title="Forward compatibility" rel="wikipedia">forward compatibility</a> expectations (and/or uses a machine-readable schema to denote forward-compatibility extension areas)</LI></UL></td>	</tr>
<tr><td>Incompatible</td><td><UL><LI>Check for <em>version identifier</em></LI></UL></td><td><UL><LI><em>Side-by-side</em> or <em>Breaking Replacement</em></LI></UL></td></tr>
</tbody></table>

<p>Some explanations...</p>

<p><strong>Version Notifications</strong></p>

<p>Agents should be notified of new versions.   This can be done out-of-band (email, physical letter, carrier pigeon), but it helps to complement this with links.   These links could be an extended, and agreed to <a href="http://tools.ietf.org/html/draft-nottingham-http-link-header-08">link relation</a>, and/or as part of the media type specification.  The links may point to a description of the version change, or, in the case of a Side-by-Side, the URI that emits the resource in the new language version.  </p>

<p><strong>Replacement</strong></p>

<p>This implies that origin server is replaced by a new <a class="zem_slink" href="http://en.wikipedia.org/wiki/Backward_compatibility" title="Backward compatibility" rel="wikipedia">backwards-compatible</a> version that is able to accept both old versions and new versions of representations sent by a client (usually via a POST link).   This is useful in combination with a forward compatible change -- none of the links need to change.</p>

<p><strong>Side by Side</strong></p>

<p>This implies that the origin server provides a new MIME type or URI-space for resources using the new language, along side old resources using the old language.   In either case,  you are impyling "this language changes everything".   In the case of changing URIs to reflect the new language verison, in effect, you're using "resource versioning", something usually relegated to storing time series data , as a means to work around your language compatibility problems.  </p>

<p>To make this RESTful, your media type must include a link from the old resources to their new version, along with metadata indicating the version of the language used at the URI, possibly including a link to a machine-readable schema of the new version (if your media type has such a thing, like XML with Relax NG or XSD).   In the case of a new MIME type, you would want a link relation that notes an alternate format is available.</p>

<p>Let me underscore this:   <b>You cannot expect clients to understand your URI format and swap out all occurrences of "v1" with "v2".</b>, if you do, you're placing a heavy burden of coupling on your client, that YOUR SERVER is so special, that they need to understand YOUR URI format.  This is completely antithetical to why we would want to use REST in the first place, unless you're really just tunnelling XML over HTTP for the heck of it.    I note that many "REST APIs" out there actually are built this way, which means they're just as point-to-point coupled as other interface styles.</p>

<p><strong>Must Accept Unknowns</strong></p>

<p>If the consumer sees elements in the data it doesn't recognize, it still accepts the representation.   Generally, it ignores these elements for processing.</p>

<p><strong>Must preserve unknowns if persisting state</strong></p>

<p>This is an optional follow-on from "Must accept unknowns", and is often forgotten.   If  representation state is being persisted (i.e. cached) in the consumer's domain for later use, the unrecognized elements <b>should be preserved</b>, and not stripped.   This could greatly assist forward compatibility when the client is upgraded to handle the previously unrecognized elements.</p>

<p><strong>Version identifier substitution model</strong></p>

<p>I defer to Section 5.3 of the <a href="http://www.w3.org/2001/tag/doc/versioning-compatibility-strategies#iddiv2123033680">compatibility strategies</a> document.</p>

<p><strong>Where do you place the version identifier?</strong></p>

<p>In order of preference:<br />
<ol><br />
<li>In the media type content </li><br />
<li>In the MIME type itself, or as a MIME type parameters</li><br />
<li>In the URI</li><br />
</ol></p>

<p><strong>Version identifier inside the media type content</strong></p>

<p>This has many examples in the wild, such as HTML DOCTYPE, some uses of XMLNS, a version identifier inside your PDF document.</p>

<p>This requires the replacement model for backwards-compatibility, and encourages the greater use of forwards compatibility.  It's the way that most web media types have long worked, with varying degrees of success, but note that those formats were long designed with forward compatibility in mind.    </p>

<p>It's still possible to combine this approach into side-by-side versioning if need be, especially if you are changing the semantics of your resources.</p>

<p><strong>Version identifier in the MIME type</strong></p>

<p>e.g.  application/vnd.mytype;version=2</p>

<p>This is currently a non-standard and debatable technique.   The benefit here is that this enables side-by-side versioning without impacting the URI-space.  On the other hand, this reeks of avoiding hypermedia and trying to push things to the other layers of the Web Architecture (HTTP and/or URIs).   But in many cases this is preferable to a new URI space.</p>

<p><strong>Version identifier in the URI</strong></p>

<p>e.g.  http://example.com/data/v1/po/123</p>

<p>I described the primary problem here earlier:  <b>you can't assume you are a special snowflake and the client will know that 'v1' is your magic crystal</b>.   You must provide a link or a URI template in the media itself (and/or in a service resource) to denote new versions.   </p>

<p>The secondary problem is bookmarks, or inbound hyperlinks.    In a database system these are known as "foreign keys".    Anyone with a relational data background knows that their primary keys really shouldn't change, as it's expensive to propagate that change to foreign keys.</p>

<p>There is, however, one case, where this approach is preferred over the others.   This ties back to the beginning of this entry, when I discussed "Resource Versioning".   It's clear we mint URIs when the <b>semantics of the resource itself</b> changes.  So, if they change with the language, then mint new URIs -- using hypermedia, if possible, to link old concepts to new ones, as this requires a side-by-side compatibility approach.</p>

<p>For example, if we have an Account resource, and a new version of our resources and language we are deprecating the notion of account, and adding two new resources, "Customer" and "Agreement".   It makes no sense to preserve the Account URIs for new Customer resources in this case, as the changed meaning would be confusing to clients expecting an Account.    </p>

<p><strong>Some Q&amp;A</strong></p>

<p><b>Aren't bookmarks the problem? Wouldn't life be better if we rejected bookmarked URIs?</b></p>

<p>Well, yes, they're a problem, but no, life would suck if we rejected bookmarks, because there's no different between a hyperlink and a bookmark.    It would be like saying "no one can hyperlink to me", which is absurd.</p>

<p><b>Wouldn't versioning be simpler if we separated access from identification, like with WSDL services?</b></p>

<p>If my data identifiers become opaque primary keys like <I>123</I> instead of <i>http://example.org/po/123</i>, then they're tightly coupled to the service that produced the document, as it would be the only context in which I could resolve details for that identifier.    Now clearly one  benefit is, if I create a new incompatible side-by-side service version, technically (assuming I don't need to re-key my database), the stored foreign keys don't change.</p>

<p>In a RESTful approach, URIs are your "foreign keys", and if you embed a version identifier in them, they need to change when you upgrade to the next version if you embed those versions in the URI.   Assuming you can't convince your resource owners to use languages with version identifiers as a MIME parameter or inside the language itself, how is that done?</p>

<p>In a word, lazily.   </p>

<p>As I've discussed above, your media type should have an extensibility section or link relation(s) that points to the new version.   And upon retiring a language at a particular URI, you would use a permanent redirect (301) to tell all consumers to update their bookmarks / foreign keys.    In either case, the agent would have the ability to update their persistent reference.      </p>

<p>Again, this is a special case -- there really shouldn't be that many incompatible versions, they should be forward-compatible changes that <b>dont' require new URIs</b> unless you're completely mucking with the resource semantics.</p>

<p><strong>In Summary</strong></p>

<ol>
<li>Prefer extensible, forwards &amp; backwards compatible languages and the replacement approach to compatibility.  Note the W3C TAG's position on <a href="http://www.w3.org/QA/2007/12/version_identifiers_reconsider.html">version identifiers</a></li>
<li>Be judicious when you use version identifiers in URIs, as <a href="http://www.w3.org/Provider/Style/URI">cool URIs don't change</a></li>
<li>For side-by-side deployments, always include a section in your media, or link relation(s), to point to new/old versions, and update references lazily as the consumer refreshes its cached value.   Use permanent redirects to retire URIs bound to old language versions.</li>
<li>Version URIs if the semantics of the resource changed, but be courteous to consumers by ensuring links are available to denote the old vs. new alternates</li>
<li>Chapter 13 of Subbu's wonderful new book <a href="http://my.safaribooksonline.com/9780596809140">RESTful Web Services Cookbook</a> provides more detailed illustrations of several versioning techniques.
</ol>
</pre>

<div class="zemanta-pixie" style="margin-top:10px;height:15px"><a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/4c880e38-4a86-4f93-b307-ef9a5b1bb8a0/" title="Reblog this post [with Zemanta]"><img class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=4c880e38-4a86-4f93-b307-ef9a5b1bb8a0" alt="Reblog this post [with Zemanta]" style="border:none;float:right"></a><span class="zem-script more-related pretty-attribution"><script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"></script></span></div>]]></description>
<dc:subject>Tech</dc:subject>

<dc:subject>Representational State Transfer</dc:subject>

<dc:subject>REST</dc:subject>

<dc:subject>versioning</dc:subject>


<dc:creator>stu</dc:creator>
<dc:date>2010-03-03T02:26:24-08:00</dc:date>
</item>

<item rdf:about="http://www.stucharlton.com/blog/archives/2010/02/i-need-home-for-a-rest.html">
<title>I need home for a REST</title>
<link>http://www.stucharlton.com/blog/archives/2010/02/i-need-home-for-a-rest.html</link>
<description><![CDATA[<p><br />
Time to dust off my microphone and bring up a couple of topics on REST and the Web Architecture<br />
- Versioning, or "Cool URIs don't change -- but my data format does!"<br />
- Why the Web Architecture could use a Programming Model for the Enterprise</p>

<p>Which I'll try to get to this weekend.   </p>

<p>For now, I leave you with two things:</p>

<p>First, reflecting on Wiliams' recent <a href="http://stage.vambenepe.com/archives/1300">Square Peg, REST Hole</a>, I draw from  the archives, <a href="http://www.stucharlton.com/blog/archives/000142.html">What are the benefits of WS-* or proprietary services?</a></p>

<p>Let's keep our eye on the prize.   REST is a style aimed at extensible, low entry-barrier, multi-organizational, <a href="http://en.wikipedia.org/wiki/Confederation">confederate</a> information sharing and communication.    I note that most IT organizations are confederacies, adopting a <a href="http://books.google.com/books?id=xI5KdR21QTAC&amp;lpg=PA60&amp;ots=VAMgc-MaqN&amp;dq=it%20governance%20federal%20feudal&amp;pg=PA60#v=onepage&amp;q=it%20governance%20federal%20feudal&amp;f=false">federal or feudal</a> governance model.   </p>

<p>The Web Architecture itself (MIME types, HTTP, URIs) provides a much-needed <a href="http://books.google.com/books?id=OT8NntOdjU0C&amp;lpg=PA61&amp;ots=DZfdytt_Od&amp;dq=rechtin%20%22stable%20intermediate%20form%22&amp;pg=PA115#v=onepage&amp;q=stable%20intermediate%20form&amp;f=false">stable intermediate form</a> for interoperability among many different systems and applications -- something that an general-purpose orientation, like SOA, doesn't really provide.   Or, fitting for RESTafarians, it is a <a href="http://doi.ieeecomputersociety.org/10.1109/MS.2010.4">shared hallucination</a> ;-) </p>

<p>Not every system, or layer of an enterprise's architecture, has the same requirements for scalability or interoperability.    The post from 2007 highlights such examples.</p>

<p>Secondly, the song, which ruled my college years in Canada....</p>

<p><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/sPJD3qcIL7s&amp;hl=en_US&amp;fs=1&amp;"><param name="allowFullScreen" value="true"><param name="allowscriptaccess" value="always"><embed src="http://www.youtube.com/v/sPJD3qcIL7s&amp;hl=en_US&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object><fieldset class="zemanta-related"><legend class="zemanta-related-title">Related articles by Zemanta</legend><ul class="zemanta-article-ul"><li class="zemanta-article-ul-li"><a href="http://www.computerworld.com/s/article/9161699/Why_REST_security_doesn_t_exist?source=rss_news">Why REST security doesn't exist</a> (computerworld.com)</li><li class="zemanta-article-ul-li"><a href="http://blogs.zdnet.com/service-oriented/?p=4144">Where REST may not always be a good fit</a> (blogs.zdnet.com)</li></ul></fieldset></p>

<div class="zemanta-pixie" style="margin-top:10px;height:15px"><a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/d595b3ed-90f7-49c3-af15-f227e22bc7b6/" title="Reblog this post [with Zemanta]"><img class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=d595b3ed-90f7-49c3-af15-f227e22bc7b6" alt="Reblog this post [with Zemanta]" style="border:none;float:right"></a><span class="zem-script more-related pretty-attribution"><script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"></script></span></div>]]></description>
<dc:subject>Tech</dc:subject>

<dc:subject>Architecture</dc:subject>

<dc:subject>Data</dc:subject>

<dc:subject>Representational State Transfer</dc:subject>

<dc:subject>REST</dc:subject>


<dc:creator>stu</dc:creator>
<dc:date>2010-02-26T21:40:10-08:00</dc:date>
</item>


</rdf:RDF>
