<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Untangled &#187; software architecture</title>
	<atom:link href="http://roy.gbiv.com/untangled/category/architecture/feed" rel="self" type="application/rss+xml" />
	<link>http://roy.gbiv.com/untangled</link>
	<description>musings of Roy T. Fielding</description>
	<lastBuildDate>Fri, 21 May 2010 03:46:17 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>ICSE Most Influential Paper award</title>
		<link>http://roy.gbiv.com/untangled/2010/icse-most-influential-paper-award</link>
		<comments>http://roy.gbiv.com/untangled/2010/icse-most-influential-paper-award#comments</comments>
		<pubDate>Fri, 21 May 2010 03:46:17 +0000</pubDate>
		<dc:creator>Roy T. Fielding</dc:creator>
				<category><![CDATA[open source]]></category>
		<category><![CDATA[software architecture]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[ICSE]]></category>
		<category><![CDATA[MIP]]></category>
		<category><![CDATA[REST]]></category>

		<guid isPermaLink="false">http://roy.gbiv.com/untangled/?p=131</guid>
		<description><![CDATA[On the same day that Liam was born, I received news that one of my two papers published at the ICSE 2000 conference has been given the International Conference on Software Engineering&#8217;s Most Influential Paper Award for its impact on software engineering research over the past decade. The paper, A case study of open source [...]]]></description>
			<content:encoded><![CDATA[<p>On the same day that <a href="http://roy.gbiv.com/untangled/2010/some-people-call-him-liam">Liam was born</a>, I received news that one of my two papers published at the ICSE 2000 conference has been given the <a href="http://www.icse-conferences.org/mostinfluential.html">International Conference on Software Engineering&#8217;s Most Influential Paper Award</a> for its impact on software engineering research over the past decade. The paper, <em><a href="http://doi.acm.org/10.1145/337180.337209">A case study of open source software development: the Apache server</a></em>, is co-authored by Audris Mockus, myself, and James Herbsleb.  The <a href="http://www.sigsoft.org/awards/mostInfPapAwd.htm">MIP</a> is an important award within the academic world; my thanks to the award committee and congrats to Audris and Jim. I wish I could have been there in South Africa for the presentation. This year&#8217;s award is shared with a paper by Corbett et al. on <a href="http://doi.acm.org/10.1145/337180.337234">Bandera</a>.</p>
<p>Interestingly, my other paper in ICSE 2000 was the <a href="http://doi.acm.org/10.1145/337180.337228">first conference paper about REST</a>, co-authored with my adviser, <a href="http://www.ics.uci.edu/~taylor/">Dick Taylor</a>. That must have caused some debate within the awards committee. As I understand it, the MIP award is based on academic citations of the original paper and any follow-up publication in a journal. Since I encouraged people to read and <a href="http://www.ics.uci.edu/~fielding/pubs/dissertation/faq.htm">cite my dissertation</a> directly, rather than the ICSE paper&#8217;s summary or its corresponding <a href="http://doi.acm.org/10.1145/514183.514185">journal version</a>, I am not surprised that the REST paper is considered less influential. However, it does make we wonder what would have happened if I had never published my dissertation on the Web.  Would that paper have been cited more, or would nobody know about REST? <em>shrug</em>. I like the way it turned out.</p>
<p>The next two International Conferences on Software Engineering will be held in Hawaii (<a href="http://2011.icse-conferences.org/">ICSE 2011</a>), with Dick as the general chair, and Zürich (<a href="http://www.ifi.uzh.ch/arvo/req/events/ICSE2012/">ICSE 2012</a>). That is some fine scheduling on the part of the conference organizers! Fortunately, I have a pretty good excuse to attend both.</p>
]]></content:encoded>
			<wfw:commentRss>http://roy.gbiv.com/untangled/2010/icse-most-influential-paper-award/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>It is okay to use POST</title>
		<link>http://roy.gbiv.com/untangled/2009/it-is-okay-to-use-post</link>
		<comments>http://roy.gbiv.com/untangled/2009/it-is-okay-to-use-post#comments</comments>
		<pubDate>Sat, 21 Mar 2009 03:24:29 +0000</pubDate>
		<dc:creator>Roy T. Fielding</dc:creator>
				<category><![CDATA[software architecture]]></category>
		<category><![CDATA[web architecture]]></category>
		<category><![CDATA[REST]]></category>

		<guid isPermaLink="false">http://roy.gbiv.com/untangled/?p=69</guid>
		<description><![CDATA[Tim Bray&#8217;s article on RESTful Casuistry revisits an odd meme in the REST debates that I&#8217;ve been meaning to discredit for a while. Some people think that REST suggests not to use POST for updates.  Search my dissertation and you won&#8217;t find any mention of CRUD or POST. The only mention of PUT is in [...]]]></description>
			<content:encoded><![CDATA[<p>Tim Bray&#8217;s article on<a href="http://www.tbray.org/ongoing/When/200x/2009/03/20/Rest-Casuistry"> RESTful Casuistry</a> revisits an odd meme in the REST debates that I&#8217;ve been meaning to discredit for a while.</p>
<p>Some people think that REST suggests not to use POST for updates.  Search my dissertation and you won&#8217;t find any mention of CRUD or POST. The only mention of PUT is in regard to HTTP&#8217;s lack of write-back caching.  The main reason for my lack of specificity is because the methods defined by HTTP are part of the Web&#8217;s architecture definition, not the REST architectural style. Specific method definitions (aside from the retrieval:resource duality of GET) simply don&#8217;t matter to the REST architectural style, so it is difficult to have a style discussion about them. The only thing REST requires of methods is that they be uniformly defined for all resources (i.e., so that intermediaries don&#8217;t have to know the resource type in order to understand the meaning of the request). As long as the method is being used according to its own definition, REST doesn&#8217;t have much to say about it.</p>
<p>For example, it isn&#8217;t RESTful to use GET to perform unsafe operations because that would violate the definition of the GET method in HTTP, which would in turn mislead intermediaries and spiders.  It isn&#8217;t RESTful to use POST for information retrieval when that information corresponds to a potential resource, because that usage prevents safe reusability and the network-effect of having a URI.  But why shouldn&#8217;t you use POST to perform an update? Hypertext can tell the client which method to use when the action being taken is unsafe. PUT is necessary when there is no hypertext telling the client what to do, but lacking hypertext isn&#8217;t particularly RESTful.</p>
<p>POST only becomes an issue when it is used in a situation for which some other method is ideally suited: e.g., retrieval of information that should be a representation of some resource (GET), complete replacement of a representation (PUT), or any of the other standardized methods that tell intermediaries something more valuable than &#8220;this may change something.&#8221; The other methods are more valuable to intermediaries because they say something about how failures can be automatically handled and how intermediate caches can optimize their behavior. POST does not have those characteristics, but that doesn&#8217;t mean we can live without it. POST serves many useful purposes in HTTP, including the general purpose of &#8220;this action isn&#8217;t worth standardizing.&#8221;</p>
<p>I think the anti-POST meme got started because of all the arguments against tunneling other protocols via HTTP&#8217;s POST (e.g., SOAP, RSS, IPP, etc.).  Somewhere along the line people started equating the REST arguments of &#8220;don&#8217;t violate HTTP&#8217;s method definitions&#8221; and &#8220;always use GET for retrieval because that forces the resource to have a URI&#8221; with the paper tiger of &#8220;POST is bad.&#8221;</p>
<p>Please, let&#8217;s move on. We don&#8217;t need to use PUT for every state change in HTTP. REST has never said that we should.</p>
<p>What matters is that every important resource have a URI, therein allowing representations of that resource to be obtained using GET.  If the deployment state is an important resource, then I would expect it to have states for <em>undeployed</em>, <em>deployment requested</em>, <em>deployed</em>, and <em>undeployment requested</em>. The advantage of those states is that other clients looking at the resource at the same time would be properly informed, which is just good design for UI feedback. However, I doubt that Tim&#8217;s application would consider that an important resource on its own, since the deployment state in isolation (separate from the thing being deployed) is not a very interesting or reusable resource.</p>
<p>Personally, I would just use POST for that button. The API can compensate for the use of POST by responding with the statement that the client should refresh its representation of the larger resource state.  In other words, I would return a 303 response that redirected back to the VM status, so that the client would know that the state has changed.</p>
]]></content:encoded>
			<wfw:commentRss>http://roy.gbiv.com/untangled/2009/it-is-okay-to-use-post/feed</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Specialization</title>
		<link>http://roy.gbiv.com/untangled/2008/specialization</link>
		<comments>http://roy.gbiv.com/untangled/2008/specialization#comments</comments>
		<pubDate>Fri, 24 Oct 2008 15:16:06 +0000</pubDate>
		<dc:creator>Roy T. Fielding</dc:creator>
				<category><![CDATA[blogging]]></category>
		<category><![CDATA[software architecture]]></category>
		<category><![CDATA[systems engineering]]></category>
		<category><![CDATA[web architecture]]></category>
		<category><![CDATA[Connections]]></category>
		<category><![CDATA[James Burke]]></category>
		<category><![CDATA[precision]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[specialization]]></category>

		<guid isPermaLink="false">http://roy.gbiv.com/untangled/?p=59</guid>
		<description><![CDATA[As you may have noted, my last post seems to have hit a nerve in various communities, particularly with those who are convinced that REST means HTTP (because, well, that&#8217;s what they think it means) and that any attempt by me to describe REST with precision is just another elitist philosophical effort that won&#8217;t apply [...]]]></description>
			<content:encoded><![CDATA[<p>As you may have noted, my last post seems to have hit a nerve in various communities, particularly with those who are convinced that REST means HTTP (because, well, that&#8217;s what they think it means) and that any attempt by me to describe REST with precision is just another <em>elitist philosophical effort</em> that won&#8217;t apply to those <em>practical web developers</em> who are just trying to get their javascript to work on more than one browser.</p>
<p>Apparently, I use words with too many syllables when comparing design trade-offs for network-based applications.  I use too many general concepts, like hypertext, to describe REST instead of sticking to a concrete example, like HTML. I am supposed to tell them what they need to do, not how to think of the problem space. A few people even complained that my dissertation is too hard to read. Imagine that!</p>
<p>My dissertation is written to a certain audience: experts in the fields of software engineering and network protocol design. These are folks with long industry careers or graduate degrees, usually Ph.D.s who have spent decades learning about their field, identifying an untrodden path to pursue advanced research, and eventually becoming so familiar with that path that they are (hopefully) able to learn something that nobody else in the world has revealed before. In the process, they become <em>specialists</em>, because it is only through specialization that a human being can become sufficiently knowledgeable to find what has yet to be known in a field as large as computing. It is only by becoming specialists that we can understand each other when we explain what we have learned, and thereby grow the field of knowledge over time.</p>
<p><a href="http://www.palmersguide.com/jamesburke/">James Burke</a> described the problem of specialization in the final episode of his first series on BBC, <a href="http://en.wikipedia.org/wiki/The_Trigger_Effect_(Connections)">Connections</a>. If you are having a hard time following my work, then I strongly suggest you go find a copy of the old episodes somewhere and watch them, bearing in mind that it was first broadcast in 1978, when the folks who brought you the Web were at their most impressionable early age. Mr. Burke would appreciate that connection, I think. What he said deserves a bit of transcripting on my part:</p>
<blockquote><p>The other, general thing to be said about how change comes about through innovation, and especially about the rate in which that change occurs, is that: <b>the easier you can communicate, the faster change happens</b>.</p>
<p>I mean, if you look back at the past, in that light, you&#8217;ll see that there was a great surge in invention in the European Middle Ages, as soon as they had reestablished safe communication between their cities, after the so-called dark ages. There was another one, in the sixteenth century, when these [books] gave scientists and engineers the opportunity to share their knowledge with each other, thanks to a German goldsmith called <a href="http://en.wikipedia.org/wiki/Johannes_Gutenberg">Johannes Gutenberg</a> who&#8217;d invented printing back in the 1450s. And then, when that developed out there, telecommunications, oh a hundred-odd years ago, then things really started to move.</p>
<p>It was with that second surge, in the sixteenth century, that we moved into the era of specialization: people writing about technical subjects in a way that only other scientists would understand. And, as their knowledge grew, so did their need for specialist words to describe that knowledge. If there is a gulf today, between the man-in-the-street and the scientists and the technologists who change his world every day, that&#8217;s where it comes from.</p>
<p>It was inevitable. Everyday language was inadequate. I mean, you&#8217;re a doctor. How do you operate on somebody when the best description of his condition you have is &#8220;a funny feeling in the stomach?&#8221; The medical profession talks mumbo jumbo because it needs to be exact. Or would you rather be dead?</p>
<p>And that&#8217;s only a very obvious example. Trouble is, when I&#8217;m being cured of something, I don&#8217;t care if I don&#8217;t understand. But what happens when I do care? When, say, the people we vote for are making decisions that effect our lives deeply, `cause that is, after all, when we get our say, isn&#8217;t it? When we vote? But say the issue relates to a bit of science and technology we don&#8217;t understand? Like, how safe is a reactor somebody wants to build? Or, should we make supersonic airplanes? Then, in the absence of knowledge, what is there to appeal to except our emotions? And then the issue becomes &#8220;national prestige,&#8221; or &#8220;good for jobs,&#8221; or &#8220;defense of our way of life,&#8221; or something. And suddenly you&#8217;re not voting for the real issue at all.</p>
<p>[James Burke, "Yesterday, Tomorrow and You" (19:02-21:30), 1978]</p></blockquote>
<p>Still timely after all these years, isn&#8217;t it?</p>
<p>As scientists go, I am a generalist: the topics that I care about range from international politics to physics, with most applications of computing somewhere in between. However, when I send out a message to <a href="http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven">API designers</a>, I expect the audience to be reasonably competent in the field. I have to talk to them as a specialist because I want them to understand, as specialists themselves, exactly what I am trying to convey and not some second-order derivatives. Most of the terms that I use should already be familiar to them (and thus it is a waste of everyone&#8217;s time for me to define them). When there is a concern about a particular term, like <a href="http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven#comment-718">hypertext</a>, it can be resolved by pointing out the relevant definitions that I use as an expert in the field.</p>
<p>I don&#8217;t try to tell them exactly what to do because, quite frankly, I don&#8217;t have anywhere near enough knowledge of their specific context to make such a decision. What I can do is tell them what isn&#8217;t REST or that doesn&#8217;t fit my definitions, because that is something about which I am guaranteed to know more than anyone else on this planet. That&#8217;s what happens when you complete a dissertation on a topic.</p>
<p>So, when you find it hard to understand what I have written, please don&#8217;t think of it as talking above your head or just too philosophical to be worth your time. I am writing this way because I think the subject deserves a particular form of precision. Instead, take the time to look up the terms. Think of it as an opportunity to learn something new, not because I said so, but because it will do you some personal good to better understand the depth of our field. Not just the details of what I wrote, but the background knowledge implied by all the strange terms that I used to write it.</p>
<p>Others will try to decipher what I have written in ways that are <a href="http://www.intertwingly.net/blog/2008/10/21/Progressive-Disclosure">more direct</a> or applicable to some <a href="http://www.25hoursaday.com/weblog/2008/10/24/RESTAPIDesignInventMediaTypesNotProtocolsAndUnderstandTheImportanceOfHyperlinks.aspx">practical concern of today</a>.  I probably won&#8217;t, because I am too busy grappling with the next topic, preparing for a conference, writing another standard, traveling to some distant place, or just doing the little things that let me feel I have I earned my paycheck. I am in a permanent state of not enough time. Fortunately, there are more than enough people who are specialist enough to understand what I have written (even when they disagree with it) and care enough about the subject to explain it to others in more concrete terms, provide consulting if you really need it, or just hang out and metablog. That&#8217;s a good thing, because it helps refine my knowledge of the field as well.</p>
<p>We are communicating really, really fast these days. Don&#8217;t pretend that you can keep up with this field while waiting for others to explain it to you.</p>
]]></content:encoded>
			<wfw:commentRss>http://roy.gbiv.com/untangled/2008/specialization/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>REST APIs must be hypertext-driven</title>
		<link>http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven</link>
		<comments>http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven#comments</comments>
		<pubDate>Mon, 20 Oct 2008 12:20:20 +0000</pubDate>
		<dc:creator>Roy T. Fielding</dc:creator>
				<category><![CDATA[software architecture]]></category>
		<category><![CDATA[web architecture]]></category>
		<category><![CDATA[hypertext]]></category>
		<category><![CDATA[REST]]></category>

		<guid isPermaLink="false">http://roy.gbiv.com/untangled/?p=56</guid>
		<description><![CDATA[I am getting frustrated by the number of people calling any HTTP-based interface a REST API. Today&#8217;s example is the SocialSite REST API. That is RPC. It screams RPC. There is so much coupling on display that it should be given an X rating. What needs to be done to make the REST architectural style [...]]]></description>
			<content:encoded><![CDATA[<p>I am getting frustrated by the number of people calling any HTTP-based interface a REST API. Today&#8217;s example is the <a href="http://wikis.glassfish.org/socialsite/Wiki.jsp?page=FinalizeRESTAPI">SocialSite REST API</a>. That is RPC. It screams RPC. There is so much coupling on display that it should be given an X rating.</p>
<p>What needs to be done to make the REST architectural style clear on the notion that hypertext is a constraint? In other words, if the engine of application state (and hence the API) is not being driven by hypertext, then it cannot be RESTful and cannot be a REST API.  Period.  Is there some broken manual somewhere that needs to be fixed?</p>
<p>API designers, please note the following rules before calling your creation a REST API:</p>
<ul>
<li>A REST API should not be dependent on any single communication protocol, though its successful mapping to a given protocol may be dependent on the availability of metadata, choice of methods, etc. In general, any protocol element that uses a URI for identification must allow any URI scheme to be used for the sake of that identification. <em>[Failure here implies that identification is not separated from interaction.]</em></li>
<li>A REST API should not contain any changes to the communication protocols aside from filling-out or fixing the details of underspecified bits of standard protocols, such as HTTP&#8217;s PATCH method or Link header field. Workarounds for broken implementations (such as those browsers stupid enough to believe that HTML defines HTTP&#8217;s method set) should be defined separately, or at least in appendices, with an expectation that the workaround will eventually be obsolete. <em>[Failure here implies that the resource interfaces are object-specific, not generic.]</em></li>
<li>A REST API should spend almost all of its descriptive effort in defining the media type(s) used for representing resources and driving application state, or in defining extended relation names and/or hypertext-enabled mark-up for existing standard media types. Any effort spent describing what methods to use on what URIs of interest should be entirely defined within the scope of the processing rules for a media type (and, in most cases, already defined by existing media types). <em>[Failure here implies that out-of-band information is driving interaction instead of hypertext.]</em></li>
<li>A REST API must not define fixed resource names or hierarchies (an obvious coupling of client and server). Servers must have the freedom to control their own namespace. Instead, allow servers to instruct clients on how to construct appropriate URIs, such as is done in HTML forms and URI templates, by defining those instructions within media types and link relations. <em>[Failure here implies that clients are assuming a resource structure due to out-of band information, such as a domain-specific standard, which is the data-oriented equivalent to RPC's functional coupling].</em></li>
<li>A REST API should never have &#8220;typed&#8221; resources that are significant to the client. Specification authors may use resource types for describing server implementation behind the interface, but those types must be irrelevant and invisible to the client. The only types that are significant to a client are the current representation&#8217;s media type and standardized relation names. <em>[ditto]</em></li>
<li>A REST API should be entered with no prior knowledge beyond the initial URI (bookmark) and set of standardized media types that are appropriate for the intended audience (i.e., expected to be understood by any client that might use the API). From that point on, all application state transitions must be driven by client selection of server-provided choices that are present in the received representations or implied by the user&#8217;s manipulation of those representations. The transitions may be determined (or limited by) the client&#8217;s knowledge of media types and resource communication mechanisms, both of which may be improved on-the-fly (e.g., code-on-demand).  <em>[Failure here implies that out-of-band information is driving interaction instead of hypertext.]</em></li>
</ul>
<p>There are probably other rules that I am forgetting, but the above are the rules related to the hypertext constraint that are most often violated within so-called REST APIs. Please try to adhere to them or choose some other buzzword for your API.</p>
]]></content:encoded>
			<wfw:commentRss>http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven/feed</wfw:commentRss>
		<slash:comments>51</slash:comments>
		</item>
		<item>
		<title>Economies of scale</title>
		<link>http://roy.gbiv.com/untangled/2008/economies-of-scale</link>
		<comments>http://roy.gbiv.com/untangled/2008/economies-of-scale#comments</comments>
		<pubDate>Tue, 23 Sep 2008 03:36:14 +0000</pubDate>
		<dc:creator>Roy T. Fielding</dc:creator>
				<category><![CDATA[software architecture]]></category>
		<category><![CDATA[system dynamics]]></category>
		<category><![CDATA[systems engineering]]></category>
		<category><![CDATA[web architecture]]></category>
		<category><![CDATA[economies of scale]]></category>
		<category><![CDATA[jabber]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[scalability]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://roy.gbiv.com/untangled/?p=36</guid>
		<description><![CDATA[I need to address that teaser I included in my last post on paper tigers and hidden dragons: People need to understand that general-purpose PubSub is not a solution to scalability problems — it simply moves the problem somewhere else, and usually to a place that is inversely supported by the economics. I am talking [...]]]></description>
			<content:encoded><![CDATA[<p>I need to address that teaser I included in my last post on <a href="http://roy.gbiv.com/untangled/2008/paper-tigers-and-hidden-dragons">paper tigers and hidden dragons</a>:</p>
<blockquote><p>People need to understand that general-purpose PubSub is not a solution to scalability problems — it simply moves the problem somewhere else, and usually to a place that is inversely supported by the economics.</p></blockquote>
<p>I am talking here about the economics of sustainable systems, which I consider to be part of <a href="http://en.wikipedia.org/wiki/System_dynamics">System Dynamics</a> and <a href="http://en.wikipedia.org/wiki/Systems_engineering">Systems Engineering</a>. Software Architecture and System Dynamics are deeply intertwined, just as Software Engineering and Systems Engineering are deeply intertwined, but they are <strong>not</strong> the same thing.</p>
<p>Fortunately, this discussion of economics has nothing to do with the financial economy or the proposed bailout on Wall Street. At least, I don&#8217;t think it does, though event-based integration and publish-subscribe middleware are most popular within financial institutions (and rightly so, since it matches their natural data stream of buy/sell events and news notifications that drive financial investing/speculation).</p>
<p>Economists have a well-known (but often misunderstood) notion of the <a href="http://www.linfo.org/economies_of_scale.html">economies of scale</a>, which can be summarized as the effect of increased production on the average cost of production (see also <a href="http://en.wikipedia.org/wiki/Economies_of_scale">Wikipedia</a> and <a href="http://www.investopedia.com/terms/e/economiesofscale.asp">Investopedia</a>). For most types of business, the average cost of producing some item is expected to go down as the business expands. This is a natural consequence of both the spreading of fixed costs over many more customers and the ability of larger distributors to demand more competitive pricing from their upstream suppliers (e.g., <a href="http://www.pbs.org/newshour/bb/business/wal-mart/ripple.html">Walmart</a>).</p>
<p>If we look at such a business in terms of its system dynamics, we should see &#8220;load&#8221; on the system increase at a much lower rate than the increase in customers. In other words, the additional customers should not, on average, create more cost than they generate in revenue once the business passes the initial fixed infrastructure cost break-even point. If they do create more cost, then the business is not sustainable at larger scales. For many businesses, that&#8217;s just fine &#8212; most of the personal services economy is based on models with a small window between &#8220;enough customers to survive&#8221; and &#8220;too many customers to handle without degrading service.&#8221;</p>
<p>The same is true of software architectures for network-based applications. As the number of consumers increase, the per-consumer cost of the overall system must decrease in order to sustain the system. Relative economies of scale were used by <a href="http://sunset.usc.edu/~mehta/">Nikunj Mehta</a> in his dissertation to compare architectural choices: <em>&#8220;A system is considered to scale economically if it responds to increased processing requirements with a sub-linear growth in the resources used for processing.&#8221;</em> I like that as a quantifiable definition for the architectural property of <a href="http://www.ics.uci.edu/~fielding/pubs/dissertation/net_app_arch.htm#sec_2_3_2">scalability</a>. However, Nikunj is focused on comparing the relative scalability of particular implementations within an architecture-driven modular framework, not the type of economics that I alluded to in my post.</p>
<p>It is important to think of system dynamics in terms of economics and not just system throughput, since the impact of growth in non-sustainable systems is often unrelated to the individual data transfers or protocols in use. In fact, some architectures that are more efficient from the standpoint of per-event network usage are also more susceptible to inverse economies of scale. PubSub is one such example.</p>
<p><a href="http://en.wikipedia.org/wiki/Publish/subscribe">PubSub</a> (short for publish/subscribe) is a derivative of one of the most analyzed architectural styles in software: event-based integration (EBI). From a purely theoretical perspective, event-based integration is a natural fit for systems that monitor real-time activities, particularly when the number of event sources outnumber the recipients of event notifications (e.g, graphical user interfaces and process control systems). However, EBI does not scale well when the number of recipients greatly outnumbers the sources. Researchers have been studying <a href="http://www.isr.uci.edu/events/twist/wisen98/">Internet-scale event notification systems</a> for over two decades. Several derivative styles have been proposed to help reduce the issue of scale, including PubSub, EventBus, and flood distribution. There are probably others that I have left out, but they usually boil down into the use of event brokers (intermediaries) and/or a shared data stream (multicast and flood).</p>
<p>PubSub improves EBI scalability by filtering events, either by publisher-driven topics or subscriber-chosen content, and only delivering notifications to the matching subscribers of those topics/content. In theory, if we are careful in choosing the topics such that they partition the events into relatively equal, non-overlapping subsets, and if the consumers of those events are only interested in subscribing to a small subset of those topics, then the corresponding reduction in notification traffic is substantial. Group chat, as in Jabber rooms, is one such example. For most applications, however, such a partitioning does not exist.</p>
<p>EventBus takes a slightly different tack on scalability by forcing traffic onto shared distribution streams, usually IP multicast or flood-distribution channels, and having all subscribers pick their own events off that stream. Unfortunately, multicast does not scale socially (a tragedy of the commons) and rarely succeeds across organizational domains, whereas flooding only succeeds when the signal/noise ratio is high.</p>
<p>Of course, there are many examples of successful EBI systems. USENET news, for example, combined both hierarchical PubSub and flood-distribution to great effect. Adam Rifkin and Rohit Khare did an extensive <a href="http://www.4k-associates.com/4K-Associates/evolution-of-isens.pdf">survey of Internet-scale event notification systems</a> that still stands the test of time. And, as I said at the beginning, EBI is the most popular style of system architecture within the financial industry, where scalability is offset by relatively high subscription costs.</p>
<p>So, what&#8217;s the point of this rambling post? Ah, yes, now I remember: the inverse economics of general-purpose PubSub.</p>
<p>People are greedy. They tend to be event-gluttons, wishing to receive far more information than they actually intend to read, and rarely remember to unsubscribe from event streams. When they stop using a service, they tend to remove the software that reports the notifications locally, not the software or subscriptions that cause it to be delivered. If it were not for automatic bounce handling, Apache mailing lists would have melted down years ago. The only way to constrain such users is a tax on either subscriptions or deliveries.</p>
<p>PubSub systems have an imbalance of effort to subscribe versus effort to deliver. In other words, a single user request results in a potentially large number of server obligations. As such, a benevolent user can produce a disproportionate load on the publisher or broker that is distributing notifications. On the Internet, we don&#8217;t have the luxury of designing just for benevolent users, and thus in HTTP systems we call such requests a denial-of-service exploit. Any request architecture that allows a malevolent user to create load as a multiple of the effort required to make the request will result in denial of service attacks, since they succeed without overwhelming the attacker&#8217;s own connectivity.</p>
<p>The only solution to the inverse economics of PubSub that I know of is to match the costs to the revenue stream. In other words, charge consumers for the subscriptions they choose to receive, at a rate corresponding to the cost of delivering the subscribed stream at the subscribed rate and over the subscribed medium. That is exactly why there is no standard mechanism for notifications in HTTP: there is no scalable solution for subscribing to events without also standardizing the creation of user accounts and event filtering mechanisms, neither of which tend to be standardized because user management is an application of its own and event filtering is always domain-specific.</p>
<p>What does this mean for a system like <a href="http://www.jabber.com/">Jabber</a>? It means that each jabber server (the broker) needs to keep watch on the types of systems being supported via its infrastructure and adjust their subscription model accordingly. Applications like chat will work great, as will most applications wherein the event sources far outnumber the notification recipients. Applications with inverse economics need to pay their own way.</p>
<p>What does this mean for a system like <a href="http://twitter.com/">Twitter</a>? Well, that&#8217;s an interesting case because it incorporates both subscription-based following of events and RESTful interfaces for event logs. When a user only follows a small set of twitters, or the set of twitters being followed are mostly quiet, then they might be more economically supported by an EBI system instead of polling their twitter home stream. However, that won&#8217;t be true for people who want to follow many twitters or who are only interested in looking at twits in batch (basically, anyone who polls at a lower frequency than their incoming twit rate). In particular, malevolent followers (those robots that follow everyone, for whatever reason) are much more dangerous to an EBI system.</p>
<p>My guess is that Twitter will eventually move to an ad-supported revenue stream on their Web interfaces, since ad revenue increases at the same rate as RESTful applications need to scale (i.e., RESTful systems have a natural economy of scale that makes them sustainable even when their popularity isn&#8217;t anticipated). Likewise, Twitter&#8217;s event-based interfaces will move toward a more sustainable subscription model that charges for excessive following and premium services like real-time event delivery via XMPP or SMS. That kind of adjustment is necessary to rebalance the system dynamics.</p>
]]></content:encoded>
			<wfw:commentRss>http://roy.gbiv.com/untangled/2008/economies-of-scale/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Paper tigers and hidden dragons</title>
		<link>http://roy.gbiv.com/untangled/2008/paper-tigers-and-hidden-dragons</link>
		<comments>http://roy.gbiv.com/untangled/2008/paper-tigers-and-hidden-dragons#comments</comments>
		<pubDate>Thu, 04 Sep 2008 04:49:12 +0000</pubDate>
		<dc:creator>Roy T. Fielding</dc:creator>
				<category><![CDATA[software architecture]]></category>
		<category><![CDATA[web architecture]]></category>
		<category><![CDATA[notifications]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[scalability]]></category>
		<category><![CDATA[webarch]]></category>
		<category><![CDATA[XMPP]]></category>

		<guid isPermaLink="false">http://roy.gbiv.com/untangled/?p=12</guid>
		<description><![CDATA[One of the sessions that I attended at OSCON was “Beyond REST? Building Data Services with XMPP PubSub” by Evan Henshaw-Plath and Kellan Elliott-McCrea. I think you can guess why that made me curious, but it was interesting to see how much that curiosity was shared by the rest of the conference: the room filled [...]]]></description>
			<content:encoded><![CDATA[<p>One of the sessions that I attended at OSCON was “<a href="http://en.oreilly.com/oscon2008/public/schedule/detail/4359">Beyond REST? Building Data Services with XMPP PubSub</a>” by <a href="http://anarchogeek.com/">Evan Henshaw-Plath</a> and <a href="http://laughingmeme.org/">Kellan Elliott-McCrea</a>. I think you can guess why that made me curious, but it was interesting to see how much that curiosity was shared by the rest of the conference: the room filled up long before the scheduled start. They certainly gave a very entertaining talk and one that spilled over into the blogosphere in posts by <a href="http://redmonk.com/sogrady/2008/07/30/xmpp_rest/">Stephen O&#8217;Grady</a>, <a href="http://joshua.schachter.org/2008/07/beyond-rest.html">Joshua Schachter</a>, and <a href="http://debasishg.blogspot.com/2008/07/programmable-web-is-getting-more.html">Debasish Ghosh</a>.</p>
<p>Unfortunately, the technical argument was a gigantic paper tiger, which is a shame given that there are plenty of situations in which event-based architectures are a better solution than REST-based architectures. I made a brief comment about notification design and how they seemed to be ignoring a good twenty years of research on <a href="http://www.isr.uci.edu/events/twist/wisen98/">Internet-scale event notification systems</a>. People need to understand that general-purpose PubSub is not a solution to scalability problems &#8212; it simply moves the problem somewhere else, and usually to a place that is inversely supported by the economics. I&#8217;ll have to explain that in a later post, since this one is focused on the technical.</p>
<p>Here&#8217;s the tiger:</p>
<blockquote><p>On July 21st, 2008, friendfeed crawled flickr 2.9 million times to get the latest photos of 45,754 users, of which 6,721 of that 45,754 <em>potentially</em> uploaded a photo.</p>
<p>Conclusion: Polling sucks.</p></blockquote>
<p>If you&#8217;d like to learn more about their XMPP solution, the slides are available from the OSCON website. I do think there is a lot to be learned from using different interaction styles and true stream-oriented protocols (the kind that don&#8217;t care about lost packets), but this FriendFeed example is ridiculous. It took me less than 30 seconds to design a better solution using nothing more than HTTP, and that while sitting in the middle of a conference session. This is exactly what Dare means by: &#8220;<a href="http://www.25hoursaday.com/weblog/2008/07/14/ScalabilityIDontThinkThatWordMeansWhatYouThinkItDoes.aspx">If a service doesn&#8217;t scale it is more likely due to bad design than to technology choice.</a>&#8221;</p>
<p>They are comparing the efficiency of blind polling using HTTP crawls to a coordinated PubSub services setup with XMPP.  Spidering an entire site is obviously not going to be efficient if you are only interested in what has changed. One advantage it has is that you don&#8217;t need to cooperate with the information provider. However, for the specific example of FriendFeed polling Flickr, cooperation is easy (both companies gain immensely by cooperating) and essential (2.9 million requests per day will get you blocked from any site that doesn&#8217;t want cooperation).</p>
<p>The solution, which I mentioned briefly at the talk, is to provide a resource that reflects all of the changes on Flickr during a given time period. Anyone (not just FriendFeed) can perform a GET on that resource to find out what has changed. In fact, one such example is the <a href="http://blog.friendfeed.com/2008/08/simple-update-protocol-fetch-updates.html">SUP (Simple Update Protocol)</a> just introduced by FriendFeed. However, I had something more efficient in mind.</p>
<p>Web architects must understand that resources are just consistent mappings from an identifier to some set of views on server-side state. If one view doesn&#8217;t suit your needs, then feel free to create a different resource that provides a better view (for any definition of &#8220;better&#8221;). These views need not have anything to do with how the information is stored on the server, or even what kind of state it ultimately reflects. It just needs to be understandable (and actionable) by the recipient.</p>
<p>In this case, we want to represent the last-updated state of all Flickr users in a way that minimizes the lag between event and notification (let&#8217;s just assume that one minute is &#8220;fast enough&#8221; to receive a change notification). The simplest way of doing that is to log state changes by userid in a sequence of journal-style resources named according to the server&#8217;s UTC clock minutes.  For example,</p>
<pre>http://example.com/_2008/09/03/0000

http://example.com/_2008/09/03/0001

http://example.com/_2008/09/03/0002

...

http://example.com/_2008/09/03/2359</pre>
<p>This URI pattern instantly drops the poll count from 2.9 million to 1440 (the number of minutes in a day) plus whatever pages are retrieved after we notice a user has changed their state. Alternatively, we could define a single append-only resource per day and use partial GET requests to retrieve only the bits since the last poll, but that tends to be harder on the server.  Representations for the above resources can be generated by non-critical processes, cached, and even served from a separate distribution channel (like SUP).</p>
<p>What, then, should we include in the representation? Well, a simple list of relative URIs is good enough if the pattern is public, but that would be unwise for a site that features limited publication (obscured identifiers so that only people who have been given the URI can find the updated pictures). Likewise, the list might become unwieldy during event storms, when many users happen to publish at once. Of course, like any good CS problem, we can solve that with another layer of indirection.</p>
<p>Instead of a list of changed user ids or URIs, we can represent the state as a sparse bit array corresponding to all of Flickr&#8217;s users.  I don&#8217;t know exactly how many users there are at Flickr, but let&#8217;s be generous and estimate it at one million.  One million bits seems like a lot, but it is only 122kB in an uncompressed array.  Considering that this array will only contain 1s when an update has occurred within the last minute, my guess is that it would average under 1kB per representation.</p>
<p>I can just imagine people reading &#8220;sparse bit array&#8221; and thinking that I must be talking about some optimal data structure that only chief scientists would think to use on the Web. I&#8217;m not. Any black-and-white GIF or PNG image is just a sparse bit array, and they have the nice side-effect of being easy to visualize. We can define our representation of 1 million Flickr users to be a 1000&#215;1000 pixel black-and-white image and use existing tools for its generation (again, something that is easily done outside the critical path by separate programs observing the logs of changes within Flickr). I am quite certain that a site like Flickr can deliver 1kB images all day without impacting their scalability.</p>
<p>Finally, we need a way to map from the bits, each indicating that a user has changed something, to the much smaller set of users that FriendFeed knows about and wishes to receive notifications. If we can assume that the mapping is reasonably persistent (a month should be long enough), then we can define another resource to act as a mapping service.  Such as,</p>
<pre>http://example.com/_2008/09/03/users?{userid}</pre>
<p>which takes as input a userid (someone that a friend already knows and wants to monitor for changes) and returns the coordinate within the sparse array (the pixel within the 1000&#215;1000 image) that corresponds to that user. FriendFeed can store that accumulated set of &#8220;interesting users&#8221; as another image file, using it like an &#8220;AND mask&#8221; filter to find the interesting changes on Flickr.</p>
<p>Note that this is all just a quick thought experiment based on the general idea. In order to build such a thing right, I&#8217;d have to know the internals of Flickr and what kinds of information FriendFeed is looking to receive, and there are many potential variations on the representations that might better suit those needs (for example, periods could be overlapped using gray-scale instead of B&#038;W). The implementation has many other potential uses as well, since the sequence of images provide an active visualization of Flickr health.</p>
<p>I should also note that the above is not yet fully RESTful, at least how I use the term. All I have done is described the service interfaces, which is no more than any RPC. In order to make it RESTful, I would need to add hypertext to introduce and define the service, describe how to perform the mapping using forms and/or link templates, and provide code to combine the visualizations in useful ways. I could even go further and define these relationships as a standard, much like Atom has standardized a normal set of HTTP relationships with expected semantics, but I have bigger fish to fry right now.</p>
<p>The point is that you don&#8217;t need to change technologies (or even interaction styles) to solve a problem of information transfer efficiency. Sometimes you just need to rethink the problem. There are many systems for which a different architecture is far more efficient, just as XMPP is far more efficient than HTTP for something like group chat. Large-scale collaborative monitoring is not one of them. An XMPP solution is far more applicable to peer-to-peer monitoring, where there is no central service that is interested in the entire state of a big site like Flickr, but even then we have to keep in mind that the economics of the crowd will dictate scalability, not the protocol used for information transfer.</p>
]]></content:encoded>
			<wfw:commentRss>http://roy.gbiv.com/untangled/2008/paper-tigers-and-hidden-dragons/feed</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>On software architecture</title>
		<link>http://roy.gbiv.com/untangled/2008/on-software-architecture</link>
		<comments>http://roy.gbiv.com/untangled/2008/on-software-architecture#comments</comments>
		<pubDate>Sat, 22 Mar 2008 21:24:01 +0000</pubDate>
		<dc:creator>Roy T. Fielding</dc:creator>
				<category><![CDATA[software architecture]]></category>
		<category><![CDATA[web architecture]]></category>
		<category><![CDATA[architectural style]]></category>
		<category><![CDATA[blackboard]]></category>
		<category><![CDATA[Linda]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[ROA]]></category>
		<category><![CDATA[tuplespace]]></category>

		<guid isPermaLink="false">http://roy.gbiv.com/untangled/2008/on-software-architecture</guid>
		<description><![CDATA[I ran across a spout yesterday about the uniform interface in REST. Actually, it is more of an attack on resource-oriented architecture (ROA) with the usual sideswipes at REST. Like most criticisms of my work, it got me thinking&#8230; not just about what was being criticized (in this case, the lack of REST constraint enforcement [...]]]></description>
			<content:encoded><![CDATA[<p>I ran across a <a href="http://blog.bwtaylor.com/2008/03/20/uniform_interface">spout</a> yesterday about the uniform interface in REST. Actually, it is more of an attack on resource-oriented architecture (ROA) with the usual sideswipes at REST. Like most criticisms of my work, it got me thinking&#8230; not just about what was being criticized (in this case, the lack of REST constraint enforcement in HTTP), but how to fix the underlying problem that a lot of folks simply don&#8217;t understand the differences between software architecture and implementation, let alone between architectural styles and software architecture.</p>
<blockquote><p>A <a href="http://www.ics.uci.edu/~fielding/pubs/dissertation/software_arch.htm#sec_1_1">software architecture</a> is an abstraction of the run-time elements of a software system during some phase of its operation. A system may be composed of many levels of abstraction and many phases of operation, each with its own software architecture.</p></blockquote>
<p>Let&#8217;s start with a simple (yet surprisingly complex) example. My blog is a network-based application — a specific grouping of functionality and behavior that allows me to accomplish a desired task using multiple computers that communicate via a network. That&#8217;s what <em>application</em> means in our industry: applying computing to accomplish a given task.</p>
<p><span id="more-10"></span>The implementation of my blog consists of, at the time of this writing, an installation of <a href="http://httpd.apache.org/">Apache HTTP Server 2.0.61</a> that is executing <a href="http://php.net/">PHP 5.2.3</a> in order to run the scripts from <a href="http://wordpress.org/">WordPress 2.3.3</a> which use sockets to interact with another server running <a href="http://mysql.com/">MySQL 5.0</a> in order to store, manipulate, and retrieve database entries that form the content of my blog when passed through various template scripts and delivered to any number of specific versions of Web-based clients, usually via HTTP, many of which apply stylesheets prior to rendering said content in a form that is (hopefully) readable by you. Phew! And that&#8217;s just the Web interface. WordPress has at least four other interfaces that are not Web-based, and each has its own set of network or server-side clients with their own specific versions, and the sum of all of these individual components make up the implementation of what I call <a href="http://roy.gbiv.com/untangled/">Untangled</a>.</p>
<p>Note that some of this blog&#8217;s implementation (the clients used by other readers) is not under my control. The vast majority of it, in fact, regardless of whether we count in lines of code or software installs. If you don&#8217;t think the clients should be considered part of the implementation, then think again: all this effort would be wasted if the words can&#8217;t be read.</p>
<p>Within my blog implementation there are many software architectures. A huge number of architectures, in fact, at various levels of abstraction and component granularity. I could probably spend months trying to describe them all and would still miss a few valid abstractions. If we limit ourselves to just the network-based architectures (the ones where component interaction is limited to message exchange), then we might just have a chance to discuss them in a week. However, just one example should be enough to get the idea, and the Atom publishing mechanism within WordPress is ideally suited for our purpose.</p>
<p><a href="http://www.intertwingly.net/wiki/pie/FrontPage">Atom</a> is a great example of how architectures are often nested within other architectures. Using typed links (hypertext), a couple XML media types, and a subset of HTTP, Atom defines a range of expected behaviors and interactions for the purpose of authoring blog entries and syndicating feeds. The Atom implementation within my blog consists of the various Web browsers and Atom clients out on the Internet (which are thankfully pretty consistent at the moment) and a couple scripts, utility functions, and links within the theme headers of my WordPress installation. Compare that to the Atom <em>architecture</em> within my blog,  which consists of just the externally observable behavioral abstraction: clients that consume or produce the atom formats, send AtomPub  request messages, and receive AtomPub responses; a server that identifies and provides specific resources that accept HTTP requests, stores entries, and responds in accordance with the Atom protocols.</p>
<p>Note that when we talk about the implementation of my blog versus an architecture of my blog, we are still talking about the same software — the only difference between the two is the amount of extraneous detail being ignored. Of course, another advantage of the architecture view is that we can talk about the interactions independent of the specific implementations, and thus find common ground in which to standardize the interactions in the form of an application-level protocol. It is also easier to perceive systemic effects at the higher architectural levels (architectural properties, such as evolvability, that encompass many implementations over time).</p>
<p>So, where do software architectural styles fit within this scheme?</p>
<p><a href="http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm">Representational State Transfer (REST)</a> is a <a href="http://www.ics.uci.edu/~fielding/pubs/dissertation/software_arch.htm#sec_1_5">software architectural style</a>, not a software architecture. REST is just one of <a href="http://www.ics.uci.edu/~fielding/pubs/dissertation/net_arch_styles.htm">many software architectural styles</a>. Specifically, REST is a named set of constraints on component interaction that, when obeyed, cause the resulting architecture to have certain properties (preferably, desirable properties). Like software patterns, an architectural style packages a set of constraints under a convenient name and tells us about the properties that are induced by those constraints <strong>when we follow the style</strong>. There are some subtle differences between architectural patterns and architectural styles, mainly due to the different audiences/communities, but they are equivalent from the point of view of an architect of network-based software.</p>
<p>We can talk about architectural styles as an abstraction in general. We can also talk about the architectural styles found within specific architectures, such as the Web architecture as a whole, or within the Atom publishing protocols as standardized, or even the architecture observed by abstracting a specific implementation of WordPress. We can compare different architectures that perform the same function, along with the different styles found within those architectures, in terms of their architectural properties. Furthermore, we can talk about how a given implementation matches (or fails to match) an intended architecture that is supposed be an example of a given style.</p>
<p>Discussion of software architecture therefore falls into the same tracks that we often hear when real-world architects talk about the architecture of buildings. They might have discussions about the <a href="http://oncampus.richmond.edu/classics/students/Olsen/doric.html">Doric style</a>, compare examples of that style found within <a href="http://www.fotosearch.com/photos-images/doric-style.html">various architectures</a>, or just admire the <a href="http://www.greatbuildings.com/buildings/The_Parthenon.html">Parthenon</a>. Likewise, different styles that perform the same function can be compared, as can slight differences in the specific implementations that are used as examples of a given style.</p>
<p>Architecture is therefore an abstraction of implementation, and styles are the named patterns by which we can understand architectures and architectural design. Simple, right?</p>
<p>Then why is it that SOA advocates insist on comparing REST to specific implementations and then complain about how <em>vague</em> the style is compared to the implementation? ROA is not REST. ROA is supposed to be a kind of design method for RESTful services, apparently, but most folks who use the term are talking about REST without the hypertext constraint. In other words, not RESTful at all. REST without the hypertext constraint is like pipe-and-filter without the pipes: completely useless because it no longer induces any interesting properties. The <a href="http://www.oreilly.com/catalog/9780596529260/">RESTful Web Services</a> book doesn&#8217;t help the situation by renaming the hypertext engine as <em>connectedness</em>. That does nothing but obscure its role as the driving force in RESTful applications.</p>
<p><a href="http://en.wikipedia.org/wiki/Linda_(coordination_language)">Linda</a> is another example of oddly construed comparisons with REST, though in this case it is generally abused by REST advocates. <a href="http://www.markbaker.ca/blog/">Mark Baker</a> was the first to notice the similarity between Linda&#8217;s uniform interface and the uniform interface constraints within REST. However, Linda is not a style — it is an architecture for coordination via a shared tuplespace (an example of the blackboard architectural style). It makes sense to compare REST to the blackboard style (they do have a lot in common, as styles go).  Likewise, there are some limited comparisons that can be made between Linda and the Web architecture, but one must keep in mind that they serve completely different functions (Linda being a coordination language and the Web being a distributed hypermedia system). But to make any comparison at all between REST (a style) and Linda (an architecture designed to support a different style in order to accomplish an entirely different function) is absurd; just as absurd as trying to compare the Doric style to my condo&#8217;s garage door opener. Unlike Mark, some REST advocates have a tendency to lose track of when they are talking about REST versus when they are talking about Web architecture versus when they are talking about specific implementations that attempt to match the Web architecture.</p>
<p>In summary:</p>
<ol>
<li>Web implementation consists of the current universe of information identified by URIs and all of the specific versions of software currently operating within that information space (like Safari, Firefox, Apache httpd, WordPress, &#8230;).</li>
<li>Web architecture consists of the protocols and data formats that define the syntax and semantics of interactions between Web components: the standards for URI, HTTP, HTML, XML, and many others. All of these standards are designed to optimize RESTful interaction, with varying degrees of success, but not to require such interaction because RESTful interaction is not the only way they are used.</li>
<li>REST is an architectural style that, when followed, allows components to carry out their functions in a way that maximizes the most important architectural properties of a multi-organizational, network-based information system. In particular, it maximizes the growth of identified information within that system, which increases the utility of the system as a whole.</li>
</ol>
<p>Web implementations are not equivalent to Web architecture and Web architecture is not equivalent to the REST style. REST constraints do not constrain Web architecture — they constrain RESTful architectures (including those found within the Web architecture) that voluntarily wish to be so constrained. HTTP/1.1 was designed to enable and improve RESTful architectures, just as REST was designed to reflect and explain all of the best things about Web architecture. That does not mean that HTTP/1.1 is constrained to a single style; it means those other styles are not part of the design (i.e., we don&#8217;t care if future changes to HTTP will cause them to break). Only some of the architectures found on the Web are RESTful, but that doesn&#8217;t change the fact that RESTful architectures do work better on the Web than any other known styles. They work better because REST induces the architectural properties that the Web needs most — reusability, anarchic scalability, evolvability, and synergistic growth — and thus the Web architecture has been updated over time to promote RESTful styles over all others, by design.</p>
]]></content:encoded>
			<wfw:commentRss>http://roy.gbiv.com/untangled/2008/on-software-architecture/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic Page Served (once) in 1.287 seconds -->
