<?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>Arc90 Blog &#187; Architecture</title>
	<atom:link href="http://blog.arc90.com/category/architecture/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.arc90.com</link>
	<description>Web Application Design &#38; Development</description>
	<lastBuildDate>Mon, 23 Jan 2012 19:51:42 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Quality, a User Problem</title>
		<link>http://blog.arc90.com/2010/02/08/quality-a-user-problem/</link>
		<comments>http://blog.arc90.com/2010/02/08/quality-a-user-problem/#comments</comments>
		<pubDate>Mon, 08 Feb 2010 20:33:59 +0000</pubDate>
		<dc:creator>Chris Dary</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Thoughts]]></category>
		<category><![CDATA[ai]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[information design]]></category>
		<category><![CDATA[social media]]></category>

		<guid isPermaLink="false">http://blog.arc90.com/?p=457</guid>
		<description><![CDATA[Bobby had just created something to be proud of, a real article of creativity. He had been working on his song for days, hunched over guitars, computers and microphones. A laborious process, but after he had his result, he was satisfied. It was an artifact worth the effort he had&#8230; <a href="http://blog.arc90.com/2010/02/08/quality-a-user-problem/">More</a>]]></description>
			<content:encoded><![CDATA[<p>Bobby had just created something to be proud of, a real article of creativity. He had been working on his song for days, hunched over guitars, computers and microphones. A laborious process, but after he had his result, he was satisfied. It was an artifact worth the effort he had put into it.</p>
<p>The only thing left to do was to get it out to the world. In the music industry this would probably be more painful than creating the music itself, but luckily for Bobby he wasn’t in it for the money &#8211; so he does what any other modern musician would do nowadays. He posts it on social networks. Namely, Facebook.</p>
<p style="text-align:center"><img class="aligncenter size-full wp-image-458" src="http://blog.arc90.com/files/2010/02/bzStatusUpdate.png" alt="Bobby's Status Update on Facebook" width="560" height="150" /></p>
<p>After submitting it (and breathing a sigh of relief), he moves on to browse elsewhere for awhile. In the back of his mind, though, is the constant thought &#8211; <em>are people listening? Are people enjoying my work</em>? Creativity is largely a social act, and Bobby is in the final stage of it—validation.</p>
<p>He checks back every few minutes, and watches his update begin its inevitable trudging down the feed wall into oblivion. His work is slowly overtaken with gems such as:</p>
<p style="text-align:center"><img class="aligncenter size-full wp-image-459" src="http://blog.arc90.com/files/2010/02/lameStatusUpdate.png" alt="A lame, anonymized status update on Facebook." width="541" height="64" /></p>
<p>This is a tragedy. And Facebook knows it.</p>
<h4>The Problem of Worth</h4>
<p>The problem here is simple: the gap between the quality of these two posts is very high. One of them is a genuine article of effort &#8211; someone truly creating something novel and sharing it with the world (whether your tastes align with the content or not). The other is half-hearted mumblings at best. Even the authors themselves wouldn’t deny the difference in quality.</p>
<p>Facebook has acknowledged this problem recently, with their introduction of the “News Feed” versus the “Live Feed”. The News Feed is meant to be a subset of the Live Feed &#8211; the things that are “important”, an algorithm primarily based on number of comments and likes. Both the implementation and the naming are a bit clumsy, but the effort is noted: Facebook understands the noise problem, and that it has only been exacerbated with the prevalence of third-party application notifications. They’ve tried to solve it, but haven’t really nailed a way to determine the quality of a post.</p>
<h4>Quality is a User Problem</h4>
<p>“Quality”, in this case, is a very nebulous concept. It’s not really measurable in machine terms &#8211; this makes it a particularly hard problem to solve by filtering. “Likes” are not exactly newsworthiness, for example. You could even make the argument that this enters the realm of Strong AI—machine intelligence that matches or exceeds a human’s—due to its requirement of very human characteristics like taste and emotion. And Strong AI is a very long way off from reality. This is simply not a problem made for machines to solve.</p>
<p>So if it’s not a machine problem, it’s a user problem. That means we have to rely on the authors, and their readers, to figure out the quality of their posts for us.</p>
<p>One way to implement this is below &#8211; a simple “update volume” slider, that asks the user “How loudly do you want to say this thing?”</p>
<p style="text-align:center"><img class="aligncenter size-full wp-image-460" src="http://blog.arc90.com/files/2010/02/statusVolume.png" alt="A mockup of 'status volume' when posting a new update in Facebook." width="543" height="226" /></p>
<p>Depending on the author&#8217;s choice (and a few other factors like frequency of posts), the update would be displayed more or less prominently on their readers’ update streams.</p>
<p>The authors themselves aren’t ignorant; by and large they know the worth of their own submissions. Putting the problem into their own hands to solve may seem a bit strange at first, but it provides us with a very valuable data point to begin from: <em>Are your words worth anything?</em></p>
<p>This is the hard part; this is the user problem. From this bit of data, we can begin to solve the simpler problems programmatically: Is a user being arrogant and loud by posting high-volume content too often? Automatically scale their volume based on post frequency. Are application notifications annoying, but still potentially useful for some users? Set them as the lowest volume by default, but allow a reader to specify individual modifiers on specific Applications. These are all solvable problems once we’ve pushed the intractable one of Quality into the authors’ hands. This single data point provides us a lot of ground to stand on when making otherwise-difficult decisions about the worth of a post.</p>
<p>I’d be interested to see how this would play out in the Facebook ecosystem. It seems a particularly more noisy system than other social streams like twitter, due to third party applications posting junk. In the end, we’ll either need better quality control, or fewer friends.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.arc90.com/2010/02/08/quality-a-user-problem/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Big Improvements Coming Soon to WADL</title>
		<link>http://blog.arc90.com/2009/02/03/big-improvements-coming-soon-to-wadl/</link>
		<comments>http://blog.arc90.com/2009/02/03/big-improvements-coming-soon-to-wadl/#comments</comments>
		<pubDate>Tue, 03 Feb 2009 16:08:31 +0000</pubDate>
		<dc:creator>Avi Flax</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://blog.daniell.acr90-dev-02/2009/02/03/big-improvements-coming-soon-to-wadl/</guid>
		<description><![CDATA[Marc Hadley, the creator of WADL, has started working on a new version, which he recently described in Draft WADL Update. My favorite enhancement is that method elements can now have multiple response child elements, and the status attribute has moved from the representation element to the response element. For&#8230; <a href="http://blog.arc90.com/2009/02/03/big-improvements-coming-soon-to-wadl/">More</a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://weblogs.java.net/blog/mhadley/">Marc Hadley</a>, the creator of <a href="http://en.wikipedia.org/wiki/Web_Application_Description_Language">WADL</a>, has started working on a new version, which he recently described in <a href="http://weblogs.java.net/blog/mhadley/archive/2009/02/draft_wadl_upda.html">Draft WADL Update</a>.</p>
<p>My favorite enhancement is that <code>method</code> elements can now have multiple <code>response</code> child elements, and the <code>status</code> attribute has moved from the <code>representation</code> element to the <code>response</code> element.</p>
<p><span id="more-197"></span></p>
<p>For example, if a POST method might return a 200, 201, 202, 400, or 409, and every response might return a JSON or an XML entity, it would be specified with the current version of WADL like this:</p>
<p><code></p>
<pre name="code" class="xml">&lt;method name=&quot;POST&quot;&gt;
	&lt;request&gt;
		&lt;representation mediaType=&quot;application/json&quot;/&gt;
		&lt;representation mediaType=&quot;application/xml&quot;/&gt;
	&lt;/request&gt;
	&lt;response&gt;
		&lt;representation status=&quot;200&quot; mediaType=&quot;application/json&quot;/&gt;
		&lt;representation status=&quot;200&quot; mediaType=&quot;application/xml&quot;/&gt;
		&lt;representation status=&quot;201&quot; mediaType=&quot;application/json&quot;&gt;
			&lt;param name=&quot;Location&quot; style=&quot;header&quot; required=&quot;true&quot;&gt;
				&lt;doc&gt;The location of the newly-created resource.&lt;/doc&gt;
			&lt;/param&gt;
		&lt;/representation&gt;
		&lt;representation status=&quot;201&quot; mediaType=&quot;application/xml&quot;&gt;
			&lt;param name=&quot;Location&quot; style=&quot;header&quot; required=&quot;true&quot;&gt;
				&lt;doc&gt;The location of the newly-created resource.&lt;/doc&gt;
			&lt;/param&gt;
		&lt;/representation&gt;
		&lt;representation status=&quot;202&quot; mediaType=&quot;application/json&quot;&gt;
			&lt;param name=&quot;Location&quot; style=&quot;header&quot; required=&quot;true&quot;&gt;
				&lt;doc&gt;The location of the resource which will be created, once the work is complete.&lt;/doc&gt;
			&lt;/param&gt;
		&lt;/representation&gt;
		&lt;representation status=&quot;202&quot; mediaType=&quot;application/xml&quot;&gt;
			&lt;param name=&quot;Location&quot; style=&quot;header&quot; required=&quot;true&quot;&gt;
				&lt;doc&gt;The location of the resource which will be created, once the work is complete.&lt;/doc&gt;
			&lt;/param&gt;
		&lt;/representation&gt;
		&lt;fault status=&quot;400&quot; mediaType=&quot;application/json&quot;&gt;
			&lt;doc&gt;Aside from a malformed or representation, Bad Request can be caused by a FNAME which is longer than 300 characters.&lt;/doc&gt;
		&lt;/fault&gt;
		&lt;fault status=&quot;400&quot; mediaType=&quot;application/xml&quot;&gt;
			&lt;doc&gt;Aside from a malformed or structurally invalid representation, Bad Request can be caused by a FNAME which is longer than 300 characters.&lt;/doc&gt;
		&lt;/fault&gt;
		&lt;fault status=&quot;409&quot; mediaType=&quot;application/json&quot;&gt;
			&lt;doc&gt;Conflicts can be caused if FNAME and LNAME are identical (case insensitive).&lt;/doc&gt;
			&lt;param name=&quot;Location&quot; style=&quot;header&quot; required=&quot;true&quot;&gt;
				&lt;doc&gt;The location of the conflicting resource.&lt;/doc&gt;
			&lt;/param&gt;
		&lt;/fault&gt;
		&lt;fault status=&quot;409&quot; mediaType=&quot;application/xml&quot;&gt;
			&lt;doc&gt;Conflicts can be caused if FNAME and LNAME are identical (case insensitive).&lt;/doc&gt;
			&lt;param name=&quot;Location&quot; style=&quot;header&quot; required=&quot;true&quot;&gt;
				&lt;doc&gt;The location of the conflicting resource.&lt;/doc&gt;
			&lt;/param&gt;
		&lt;/fault&gt;
	&lt;/response&gt;
&lt;/method&gt;
</pre>
<p></code></p>
<p>As you can see, only one <code>response</code> element, and each distinct status code and media type combination needs to be specified using a <code>representation</code> or <code>fault</code> element. This is repetitive, redundant, and confusing.</p>
<p>In the new version, this can be specified much more clearly and succinctly like this:</p>
<p><code></p>
<pre name="code" class="xml">&lt;method name=&quot;POST&quot;&gt;
	&lt;request&gt;
		&lt;representation mediaType=&quot;application/json&quot;/&gt;
		&lt;representation mediaType=&quot;application/xml&quot;/&gt;
	&lt;/request&gt;
	&lt;response status=&quot;200&quot;&gt;
		&lt;representation mediaType=&quot;application/json&quot;/&gt;
		&lt;representation mediaType=&quot;application/xml&quot;/&gt;
	&lt;/response&gt;
	&lt;response status=&quot;201&quot;&gt;
		&lt;param name=&quot;Location&quot; style=&quot;header&quot; required=&quot;true&quot;&gt;
			&lt;doc&gt;The location of the newly-created resource.&lt;/doc&gt;
		&lt;/param&gt;
		&lt;representation mediaType=&quot;application/json&quot;/&gt;
		&lt;representation mediaType=&quot;application/xml&quot;/&gt;
	&lt;/response&gt;
	&lt;response status=&quot;202&quot;&gt;
		&lt;param name=&quot;Location&quot; style=&quot;header&quot; required=&quot;true&quot;&gt;
			&lt;doc&gt;The location of the resource which will be created, once the work is complete.&lt;/doc&gt;
		&lt;/param&gt;
		&lt;representation mediaType=&quot;application/json&quot;/&gt;
		&lt;representation mediaType=&quot;application/xml&quot;/&gt;
	&lt;/response&gt;
	&lt;response status=&quot;400&quot;&gt;
		&lt;doc&gt;Aside from a malformed or structurally invalid representation, Bad Request can be caused by a FNAME which is longer than 300 characters.&lt;/doc&gt;
		&lt;representation mediaType=&quot;application/json&quot;/&gt;
		&lt;representation mediaType=&quot;application/xml&quot;/&gt;
	&lt;/response&gt;
	&lt;response status=&quot;409&quot;&gt;
		&lt;doc&gt;Conflicts can be caused if FNAME and LNAME are identical (case insensitive).&lt;/doc&gt;
		&lt;param name=&quot;Location&quot; style=&quot;header&quot; required=&quot;true&quot;&gt;
			&lt;doc&gt;The location of the conflicting resource.&lt;/doc&gt;
		&lt;/param&gt;
		&lt;representation mediaType=&quot;application/json&quot;/&gt;
		&lt;representation mediaType=&quot;application/xml&quot;/&gt;
	&lt;/response&gt;
&lt;/method&gt;
</pre>
<p></code></p>
<p>Each status code gets its own distinct <code>response</code> element, which can contain the various types of representations that may be provided along with that status code. (We also <a href="https://wadl.dev.java.net/issues/show_bug.cgi?id=13">decided</a> to remove the <code>fault</code> element, and just let the status codes speak for themselves.) Also, the Location header can be specified inside the <code>response</code> instead of the <code>representation</code>. Much better!</p>
<p>Progress!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.arc90.com/2009/02/03/big-improvements-coming-soon-to-wadl/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Mmmm . . . flaky</title>
		<link>http://blog.arc90.com/2009/01/30/mmmm-flaky/</link>
		<comments>http://blog.arc90.com/2009/01/30/mmmm-flaky/#comments</comments>
		<pubDate>Fri, 30 Jan 2009 17:01:02 +0000</pubDate>
		<dc:creator>Joel Potischman</dc:creator>
				<category><![CDATA[Architecture]]></category>

		<guid isPermaLink="false">http://blog.daniell.acr90-dev-02/2009/01/30/mmmm-flaky/</guid>
		<description><![CDATA[You know you&#8217;re a tech geek when the most exciting thing that happened to you during the week is GMail&#8217;s new offline mode. What struck me most about the announcement, though, is not that they added offline mode, but that they added &#8220;flaky connection mode&#8221;. Flaky connection mode attempts to&#8230; <a href="http://blog.arc90.com/2009/01/30/mmmm-flaky/">More</a>]]></description>
			<content:encoded><![CDATA[<p>You know you&#8217;re a tech geek when the most exciting thing that happened to you during the week is GMail&#8217;s new <a href="http://gmailblog.blogspot.com/2009/01/new-in-labs-offline-gmail.html" target="_blank">offline mode</a>. What struck me most about the announcement, though, is not that they added offline mode, but that they added &#8220;flaky connection mode&#8221;. Flaky connection mode attempts to bridge the gap between online and offline. Maybe I&#8217;m online right this second, maybe I&#8217;m not, so GMail works in offline mode and attempts to quietly synchronize in the background. If I&#8217;m online, great, but if my connection bombed, no problem, it will just queue up my changes and try again soon.</p>
<p>As devices get smarter and more portable and more connectable, they&#8217;re also going to get flakier. Laptops and the various mobile platforms and smart devices continue to push the envelope of the possible, but they all need to deal with the fact that sometimes you&#8217;re on an airplane, sometimes you&#8217;re in a tunnel, and sometimes, well, your connection is just plain flaky.</p>
<p>Google has built the most powerful software platform on earth by embracing flakiness. When you perform a search, that request may be farmed out to 1,000 different servers, but the platform doesn&#8217;t for one nanosecond assume that all those requests are going to succeed. Failures are expected, and the platform compensates by knowing how to identify them (bad responses, no responses) and work around them (re-send the work to a box that isn&#8217;t misbehaving). Flaky connection mode simply extends this server-to-server model down to server-to-client. It&#8217;s a recognition that we&#8217;ve moved incredible computing power from the tightly controlled confines of the data center and put it out there in the flaky, flaky wild.</p>
<p>When you build internet-scale distributed systems, you should <strong>always</strong> assume you are in flaky connection mode. Maybe the tubes are down today. Maybe your vendor&#8217;s server went down. Even with all the contracts and SLAs and angry phone calls in the world, you fundamentally don&#8217;t have any control over that box staying up and reachable when you need it.</p>
<p>I&#8217;m working on an application right now which communicates with numerous internal and external web services, each owned by different teams and companies. The business process I need to handle isn&#8217;t kicked off by a human, so I can&#8217;t ask the user to try again if I hit an error, and I can&#8217;t force distributed transactions across these systems, so starting over means I&#8217;d duplicate lots of calls.</p>
<p>There were two ways for me to meet the business requirements. The first option was to demand fault-tolerant servers, redundant hardware and software, bug-free software from several different companies, and pixie dust to sprinkle on it all to ensure that nothing ever went down. I went with the second option: expect flakiness and deal with it. Using commodity hardware and software I was able to achieve a very high degree of fault/flake-tolerance as follows:</p>
<ol>
<li>Break the business workflow down into the most atomic units possible. First I need to acknowledge the job request from System A. Then I need to retrieve the data from System B. Then I need to send it to vendor&#8217;s System C. Then I need to retrieve the response from System C and pass it to System D.<br />
etc.</li>
<li>Treat each of those workflow steps transactionally and durably. Either I have stored the job request from System A in my database <strong>and</strong> sent my acknowledgment of receipt <strong>and</strong> updated the job&#8217;s status in my database, or I must assume that the step was not begun at all.</li>
<li>Deal with the fact that #2 guarantees I will never miss a step, but it may occasionally cause me to execute it twice. Maybe I did store the job request from System A and send my acknowledgment but I blew up at the very end when I updated the job&#8217;s status. If I can&#8217;t make that step <a href="http://en.wikipedia.org/wiki/Idempotent#In_computing" target="_blank">idempotent</a>, it&#8217;s my responsibility to deal with the consequences of duplicate runs. The more atomic I make the steps, the easier this is to do.</li>
<li>Have my system understand the difference between system errors and business errors. Because my app is mainly hitting HTTP REST services, this is relatively easy. <a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#4xx_Client_Error" target="_blank">400 series errors</a><br />
mean the client (i.e. me) is wrong, and the job is doomed, so I abort it. <a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#5xx_Server_Error" target="_blank">500 series errors</a>, garbage responses, or simply no response at all tell me that the server is temporarily acting flaky and I should try again in a little while when I . . .</li>
<li>Have a sweeper process that runs in the background and calls the next step on any job that hasn&#8217;t been updated in, say, 15 minutes. No matter where a job died, all this process needs to know is to call the job&#8217;s CallNextStep method and it will resume after the last completed step.</li>
<li>Recognize that sometimes, success isn&#8217;t in the cards. Let&#8217;s say that after 20 tries over 12 hours, I&#8217;m going to raise a notification to our operations people that this one was just too flaky for me and they need to resolve it manually.</li>
</ol>
<p>My application will never have to worry about the machine on which it&#8217;s running going into a metal elevator, the neighbor changing his wi-fi password from &#8220;linksys&#8221;, or the complexity of running on a 1,000 node Google cluster. But the principles of flaky connection mode apply to any application with any degree of inter-system dependency. Designing for flakiness allows you to build highly reliable and fault tolerant systems out of very flaky parts.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.arc90.com/2009/01/30/mmmm-flaky/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>RESTful Hullabaloo</title>
		<link>http://blog.arc90.com/2008/08/18/restful-hullabaloo/</link>
		<comments>http://blog.arc90.com/2008/08/18/restful-hullabaloo/#comments</comments>
		<pubDate>Mon, 18 Aug 2008 14:53:24 +0000</pubDate>
		<dc:creator>Avi Flax</dc:creator>
				<category><![CDATA[Architecture]]></category>

		<guid isPermaLink="false">http://blog.daniell.acr90-dev-02/2008/08/18/restful-hullabaloo/</guid>
		<description><![CDATA[I&#8217;ve always wanted to use the word &#8220;hullabaloo&#8221; in a published piece of writing, and now I can finally cross that off my list of life goals. There&#8217;s been a lot of hullabaloo about REST in the web-tech-o-sphere lately, and rather than sum it all up here, and then add&#8230; <a href="http://blog.arc90.com/2008/08/18/restful-hullabaloo/">More</a>]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve always wanted to use the word &#8220;hullabaloo&#8221; in a published piece of writing, and now I can finally cross that off my list of life goals.</p>
<p>There&#8217;s been a lot of hullabaloo about REST in the web-tech-o-sphere lately, and rather than sum it all up here, and then add my 2&#162;, I just want to point out that Tim Bray has already done so, with his usual insight: <a href="http://www.tbray.org/ongoing/When/200x/2008/08/18/On-REST">REST Questions</a>.</p>
<p>When all is said and done, I agree with the moderate view that REST is a very useful architectural pattern, but nobody wins when it&#8217;s turned into a religion. There are pros and cons of following REST for a given situation, and they should be considered. No architectural approach is a good fit for all situations.</p>
<p>That said, I have found REST to be an excellent pattern for building web services, and I think it&#8217;s simpler &#8212; in a good way &#8212; than any RPC style (such as SOAP, XML-RPC, or anything homegrown) &#8212; <em>after you factor in many factors</em> such as documentation, caching, scalability, and many more.</p>
<p>I also think following REST is generally better than building &#8220;plain old XML&#8221; or &#8220;plain old JSON&#8221;, or &#8220;plain old anything&#8221; web services, because following any architectural style is generally better than following none. But even that&#8217;s not always true &#8212; there&#8217;s sometimes value in building something quick and dirty that just gets a job done, quickly.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.arc90.com/2008/08/18/restful-hullabaloo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Migrating from TFS to SVN</title>
		<link>http://blog.arc90.com/2007/12/27/migrating-from-tfs-to-svn/</link>
		<comments>http://blog.arc90.com/2007/12/27/migrating-from-tfs-to-svn/#comments</comments>
		<pubDate>Thu, 27 Dec 2007 20:41:57 +0000</pubDate>
		<dc:creator>Joel Potischman</dc:creator>
				<category><![CDATA[Architecture]]></category>

		<guid isPermaLink="false">http://blog.daniell.acr90-dev-02/2007/12/27/migrating-from-tfs-to-svn/</guid>
		<description><![CDATA[Our 180-day evaluation copy of Microsoft Team Foundation Server expired today. We had decided for a variety of reasons not to purchase it (let the blog comments begin!), and to migrate our .NET source code from TFS to Subversion, which we use for all other projects. Naturally we needed the final copy of the source, and any history we could migrate over easily would be gravy, but we decided that <b>for our needs</b> (and not necessarily yours!), it wasn't worth investing much time or money in preserving all historical details (let the blog comments continue!).
While I found lots of tools and blog posts about migrating from SVN to TFS, I couldn't find anything about going from TFS to SVN without writing lots of code or buying expensive software we'd use exactly once. With a little tinkering I came up with the following method to export source code snapshots by date from Team Foundation Server so that we could commit changes sequentially by week into Subversion.]]></description>
			<content:encoded><![CDATA[<p>Our 180-day evaluation copy of Microsoft Team Foundation Server expired today. We had decided for a variety of reasons not to purchase it (let the blog comments begin!), and to migrate our .NET source code from TFS to Subversion, which we use for all other projects. Naturally we needed the final copy of the source, and any history we could migrate over easily would be gravy, but we decided that <b>for our needs</b> (and not necessarily yours!), it wasn&#8217;t worth investing much time or money in preserving all historical details (let the blog comments continue!). While I found lots of tools and blog posts about migrating from SVN to TFS, I couldn&#8217;t find anything about going from TFS to SVN without writing lots of code or buying expensive software we&#8217;d use exactly once. With a little tinkering I came up with the following method to export source code snapshots by date from Team Foundation Server so that we could commit changes sequentially by week into Subversion.</p>
<p>Yes, it loses check-in and check-out comments, but migrating source metadata would be a lot more work than migrating the source itself, and again, <b>for our needs</b> it was not critical. After all, our code is well organized and self-documenting. Isn&#8217;t yours? Hope this is useful for someone else out there. Yeah, it&#8217;s a bit manual, but so what? In maybe an hour or two of total development+execution time I was all done, and TFS was retired. But by all means, feel free to automate this further and post your improvements.</p>
<ol>
<li>Create work folder &#8220;source&#8221; wherever you want</li>
<li>In the work folder&#8217;s parent, create the batch file TFSGet.bat containing the following three lines:
<pre>cd source
"c:\Program Files\Microsoft Visual Studio 8\Common7\IDE\TF.exe" get "*.*" /all /version:D%1 /recursive /overwrite
cd ..</pre>
</li>
<li>Using the File -&gt; Source Control -&gt; Workspaces command in Visual Studio, point your project workspace to the new work folder.</li>
<li>Run batch file with the first date, i.e. <b>TFSGet 09/01/2007</b> (must use MM/DD/YYYY format)</li>
<li>Use Subversion tools such as TortoiseSVN to add this initial revision to Subversion.</li>
<li>Delete all the source code from the work folder, leaving the hidden .svn folder created by Subversion.</li>
<li>Repeat steps 4 through 6, incrementing the date by day, week, month, etc. until you get to present day.</li>
<li>Back up your Team Foundation Server databases through SQL Server&#8217;s maintenance tools, just in case!</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://blog.arc90.com/2007/12/27/migrating-from-tfs-to-svn/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Whose Value Is It Anyway?</title>
		<link>http://blog.arc90.com/2007/12/17/whose-value-is-it-anyway/</link>
		<comments>http://blog.arc90.com/2007/12/17/whose-value-is-it-anyway/#comments</comments>
		<pubDate>Mon, 17 Dec 2007 18:39:19 +0000</pubDate>
		<dc:creator>Joel Potischman</dc:creator>
				<category><![CDATA[Architecture]]></category>

		<guid isPermaLink="false">http://blog.daniell.acr90-dev-02/2007/12/17/whose-value-is-it-anyway/</guid>
		<description><![CDATA[<p>I recently completed a software development project for a client. I came up with what I thought was a great design to meet their very unique needs, and I worked with a really smart team who thought deeply about every design decision and produced world-class technology. The only negative apparent to me at the time was that my original time estimate ended up looking like the sales tax on the actual effort.</p>
<p>Big deal. Another late IT project, right?</p>
<p>As I combed through the charred wreckage of my project plan for its black box. I thought about the projects I've worked on where my estimates were dead-on, and I thought about the ones where I didn't see my kids for days at a time. This project gave me a brutal reminder that <b>a software development project's ability to be estimated accurately is inversely proportional to the amount of new technology involved.</b></p>]]></description>
			<content:encoded><![CDATA[<p>I recently completed a software development project for a client. I came up with what I thought was a great design to meet their very unique needs, and I worked with a really smart team who thought deeply about every design decision and produced world-class technology. The only negative apparent to me at the time was that my original time estimate ended up looking like the sales tax on the actual effort.</p>
<p>Big deal. Another late IT project, right?</p>
<p>As I combed through the charred wreckage of my project plan for its black box. I thought about the projects I&#8217;ve worked on where my estimates were dead-on, and I thought about the ones where I didn&#8217;t see my kids for days at a time. This project gave me a brutal reminder that <b>a software development project&#8217;s ability to be estimated accurately is inversely proportional to the amount of new technology involved.</b></p>
<p>Some development projects are really deployment projects. You aren&#8217;t creating anything truly new. You&#8217;re mainly just gluing together pieces you&#8217;ve built or bought many times before. There&#8217;s nothing wrong with that. It might not be a thrill a minute, but it&#8217;s the lowest risk way to build software . . . if you can meet the requirements.</p>
<p>And that &#8220;if&#8221; is key. <u>If</u> all projects were that simple, you&#8217;d never do any new development. We&#8217;d call ourselves Mashup Engineers, not Software Developers, and projects would last a few hours and launch on time every time, instead of an <a href="http://en.wikipedia.org/wiki/Hofstadter%27s_Law" id="ziv5" title="Hofstadter's Law" target="_blank">unknowable</a> number of weeks, months, or years. New mashups might come along that blew everyone&#8217;s mind and created new zillionaires (Engadget + Amazon = <a href="http://www.whois.net/checkdomain/index.php?domain=ridiculousgadgetofthemonthclub&amp;tld=com" target="_blank">RidiculousGadgetOfTheMonthClub.com</a> !), but the value added by the people <u>actually coding</u> it would be low. After all, how much better can my glue be than yours?</p>
<p>But most projects require some new development. Let&#8217;s say the typical project is 90% familiar to you. You always need to design a database, generate reports, write classes to enforce business rules and security, etc. Because this is such cookie-cutter work, you may feel like you&#8217;re not doing &#8220;valuable&#8221; development, but remember that to your client, value = solved business problem, even if to you, value = new data persistence paradigm that&#8217;s 40% more performant in low-memory situations.</p>
<p>This is a fundamental disconnect between developers and humans. We developers want to develop, and it&#8217;s hard for us to turn that drive off, even when presented with a solved problem. Hell, <u>especially</u> when presented with a solved problem. Come on, if you had to be 5 minutes late for your 10th anniversary to make a chunk of code that nobody but you ever sees or complains about 30% faster, you know you&#8217;d at least be tempted.</p>
<p>And what about that 10% of the project that&#8217;s new development? I don&#8217;t just mean writing yet another CRUD class for yet another project. I mean &#8220;new&#8221; as in &#8220;novel&#8221;. As in &#8220;uncharted territory&#8221;. As in &#8220;this will be fun, but let&#8217;s face it, you don&#8217;t really know exactly what you&#8217;re getting yourself into.&#8221;</p>
<p>Even assuming your project is perfectly scoped (scope generally doesn&#8217;t creep; it just becomes more clear over time), estimating how long it will take to work with a piece of new technology is the riskiest part of software development. Dependencies come up you didn&#8217;t anticipate. The new thing doesn&#8217;t work the way you had hoped. Any estimate you give for this work is simply a guess, though there is no question that your client will reap great benefits if you manage to deliver it some day. By definition, if this functionality didn&#8217;t exist before, none of their competitors has it!</p>
<p>So to developers, it often seems that 90% of the project is boring and adds little value, but 10% is fun and glamorous and adds great value. Alas, <b>the client values the software differently than you</b>, and they cut the checks. Clients care deeply about being able to get back to business when you deliver the software they need. They do not care if their project is 90%, 95%, 99%, or even 100% boring to alpha geeks. They care about 100% complete and delivered.</p>
<p>The correct approach is thus to keep as much of your project out of that lawless 10% area as you can. Wherever possible, put on your Mashup Engineer hat and reuse existing software, libraries and frameworks until all that remains is the innovation directly necessary to address the client-specific business problem you were hired to solve, and no more. You may find that your project isn&#8217;t 90/10 after all. Maybe it&#8217;s 95/5. You&#8217;ve just reduced your project risk by 50%. Hey, maybe it&#8217;s 99/1 and you really will ship on time! The less innovation you do, the better your chances of doing it well when it&#8217;s actually beneficial to the client, not just intellectually stimulating to you.</p>
<p>If you know your software is going to be deployed numerous times or expanded immediately in ten different directions, investing the additional time, energy, and neurons up front can pay for itself many times over. But if you are building a system for one client, keep your innovation under control and deliver the value they want to get, not the kind you want to write.</p>
<p>So what <u>really</u> happened on my big late project? It had some fairly unique requirements that couldn&#8217;t be addressed with the usual tools in my toolbox, nor could we find much existing software that fit the bill either. We thus felt justified in developing more technology than usual. Still, once you scratch an itch it can be hard to stop. We found ourselves rapidly approaching our intended ship date, but instead of a finished client application, we had a far more flexible and powerful world-class software <u>platform</u> . . . but it was only halfway built. We did eventually ship, and I&#8217;m extremely proud of the technology we created, but maybe, just maybe, it was the solution to the much bigger and more abstract problem I wish existed, not the one the client actually had.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.arc90.com/2007/12/17/whose-value-is-it-anyway/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>On Programmers, Programming Languages, and Frameworks</title>
		<link>http://blog.arc90.com/2007/10/16/on-programmers-programming-languages-and-frameworks/</link>
		<comments>http://blog.arc90.com/2007/10/16/on-programmers-programming-languages-and-frameworks/#comments</comments>
		<pubDate>Tue, 16 Oct 2007 15:05:37 +0000</pubDate>
		<dc:creator>Avi Flax</dc:creator>
				<category><![CDATA[Architecture]]></category>

		<guid isPermaLink="false">http://blog.daniell.acr90-dev-02/2007/10/16/on-programmers-programming-languages-and-frameworks/</guid>
		<description><![CDATA[Derek Sivers writes 7 reasons I switched back to PHP after 2 years on Rails, an admirably plain-spoken article, chock-full of gems about programmers, programming languages, and frameworks. He puts a lot of things into perspective. Many of the hordes of commenters missed Derek&#8217;s point by a large margin. It&#8217;s&#8230; <a href="http://blog.arc90.com/2007/10/16/on-programmers-programming-languages-and-frameworks/">More</a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.oreillynet.com/pub/au/1841">Derek Sivers</a> writes <a href="http://www.oreillynet.com/ruby/blog/2007/09/7_reasons_i_switched_back_to_p_1.html">7 reasons I switched back to PHP after 2 years on Rails</a>, an admirably plain-spoken article, chock-full of gems about programmers, programming languages, and frameworks. He puts a lot of things into perspective.</p>
<p>Many of the hordes of commenters missed Derek&#8217;s point by a large margin. It&#8217;s edifying to search the web page for &#8220;Derek&#8221; and read his responses in the comments.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.arc90.com/2007/10/16/on-programmers-programming-languages-and-frameworks/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Sometimes you are truly better off starting from scratch</title>
		<link>http://blog.arc90.com/2007/08/06/sometimes-you-are-truly-better-off-starting-from-scratch/</link>
		<comments>http://blog.arc90.com/2007/08/06/sometimes-you-are-truly-better-off-starting-from-scratch/#comments</comments>
		<pubDate>Mon, 06 Aug 2007 21:37:46 +0000</pubDate>
		<dc:creator>Joel Nagy</dc:creator>
				<category><![CDATA[Architecture]]></category>

		<guid isPermaLink="false">http://blog.daniell.acr90-dev-02/2007/08/06/sometimes-you-are-truly-better-off-starting-from-scratch/</guid>
		<description><![CDATA[Reuse, Reuse, Reuse is a typical mantra these days, leaving me to wonder if any new ideas are ever written. Now of course I&#8217;m being a little sarcastic here, but it seems that the call to reuse code and use as much free code as you can get your hands&#8230; <a href="http://blog.arc90.com/2007/08/06/sometimes-you-are-truly-better-off-starting-from-scratch/">More</a>]]></description>
			<content:encoded><![CDATA[<p><em>Reuse, Reuse, Reuse</em> is a typical mantra these days, leaving me to wonder if any new ideas are ever written. Now of course I&#8217;m being a little sarcastic here, but it seems that the call to reuse code and use as much free code as you can get your hands on is the norm these days. I believe that there are very valid reasons to not only start from scratch but building certain code bases in-house.</p>
<p>The reasons why we often opt for prefab code (or previous incarnations) instead of coding from scratch are varied: our urge to rush to market, hesitation to throw away code, etc. Sometimes we feel that it would be a waste to not reuse old code, or even &#8220;why waste our time writing code that someone else already wrote?&#8221; Some good reasons why you should write from scratch:</p>
<ol>
<li><strong>Maintenance: </strong>Plugging 20 odd libraries from 20 separate sources into a single project can become a maintenance nightmare as they might try to step on each other and may not have been written with the most optimized or clean code.
<li><strong>Adding Features: </strong>Adding features to some prefab code bases can make the code unmanageable as hacks get frequently introduced to solve a simple issue.
<li><strong>Scalability:</strong> Do you know for a fact that the old code or the plugged in library will scale? Do you have the time to perform a thorough code walk through of the new code?&nbsp; If you do you might actually have time to write new code.
<li><strong>Use the Right Tool<em> (screwdrivers don&#8217;t make good hammers)</em>:</strong> Using old code (especially from legacy platforms written with older languages,&nbsp;such as non-web languages used in a web platform) will result in trying to leap hurdles that newer languages were designed to perform.
<li><strong>Learning:</strong> There&#8217;s nothing wrong with trying to figure out how to accomplish a task on your own, in the end you&#8217;ll be rewarded with the new knowledge and firm understanding of how the code you are using actually works.</li>
</ol>
<p>Don&#8217;t take these reasons as <em>&#8220;you should always&#8221;</em> write from scratch, but sometimes it&#8217;s just better than using <em>&lt;insert code here&gt;</em> into your next project.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.arc90.com/2007/08/06/sometimes-you-are-truly-better-off-starting-from-scratch/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>RESTful Revert</title>
		<link>http://blog.arc90.com/2007/06/13/restful-revert/</link>
		<comments>http://blog.arc90.com/2007/06/13/restful-revert/#comments</comments>
		<pubDate>Wed, 13 Jun 2007 23:29:35 +0000</pubDate>
		<dc:creator>Avi Flax</dc:creator>
				<category><![CDATA[Architecture]]></category>

		<guid isPermaLink="false">http://blog.daniell.acr90-dev-02/2007/06/13/restful-revert/</guid>
		<description><![CDATA[<p>One of our goals for this blog is to give a glimpse into how we work, and how we think. In that spirit, here's a recent discussion that took place in a Trac ticket. The task was to add, to a RESTful web service, a way to revert a resource to a previous version.</p>]]></description>
			<content:encoded><![CDATA[<p>One of our goals for this blog is to give a glimpse into how we work, and how we think. In that spirit, here&#8217;s a recent discussion that took place in a <a href="http://trac.edgewall.org/">Trac</a> ticket. The task was to add, to a RESTful web service, a way to revert a resource to a previous version.</p>
<p><span id="more-46"></span></p>
<div id="this_entry">
<p>Here&#8217;s what I first came up with for this operation:</p>
<blockquote>
<p class="step"><strong>In a nutshell:</strong> to revert a policy to a previous version, a client merely has to POST a representation of that version to the policy resource.</p>
<p class="step"><strong>Example Case:</strong> Policy HPXQ1-66544 is at version 10, and we want to revert it to version 9.</p>
<p><strong>Step 1:</strong> First, the client might want to retrieve a representation of the current state of the policy:</p>
<table class="step">
<tr>
<td><strong>Client:</strong></td>
<td>GET /policies/HPXQ1-66544</td>
</tr>
<tr>
<td><strong>Server:</strong></td>
<td>
<pre name="code" class="xml">
200 OK
Content-Type: application/xml
&lt;InsurancePolicy id="HPXQ1-66544" version="10"&gt;
...
&lt;/InsurancePolicy&gt;
</pre>
</td>
</tr>
</table>
<p><strong>Step 2:</strong> Now the client wants to check out version 9:</p>
<table class="step">
<tr>
<td><strong>Client:</strong></td>
<td>GET /policies/HPXQ1-66544?version=9</td>
</tr>
<tr>
<td><strong>Server:</strong></td>
<td>
<pre name="code" class="xml">
200 OK
Content-Type: application/xml
&lt;InsurancePolicy id="HPXQ1-66544" version="9"&gt;
...
&lt;/InsurancePolicy&gt;
</pre>
</td>
</tr>
</table>
<p><strong>Step 3:</strong> Let&#8217;s revert to version 9</p>
<table>
<tr>
<td><strong>Client:</strong></td>
<td>
<pre name="code" class="xml">
POST /policies/HPXQ1-66544
Content-Type: application/xml
&lt;InsurancePolicy id="HPXQ1-66544" version="9"&gt;
...
&lt;/InsurancePolicy&gt;
</pre>
</td>
</tr>
<tr>
<td><strong>Server:</strong></td>
<td>
<pre name="code" class="xml">
200 OK
Content-Type: application/xml
&lt;InsurancePolicy id="HPXQ1-66544" version="11"&gt;
...
&lt;History&gt;
....
&lt;Event type="revert" timeStamp="now" note="Reverted to version 9"/&gt;
&lt;/History&gt;
&lt;/InsurancePolicy&gt;
</pre>
</td>
</tr>
</table>
</blockquote>
<p>The developer whose app needed to interact with this API, Sima, was down with all this, but she had one question: &#8220;Just curious about the reason for a 2 step process?&#8221;</p>
<p>It was a good question! And since I&#8217;m always up for discussing REST theory, I replied with this missive:</p>
<blockquote>
<p>The reason for the &#8220;2-step process&#8221; rests in REST theory.</p>
<p>But before I get into that, I should make a correction to the API: the method used should be PUT, not POST.</p>
<p>If we look at <a href="http://www.w3.org/Protocols/">the official HTTP spec</a>, the <a class="ext-link" href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.5">definition of POST</a> is:</p>
<blockquote><p>
The POST method is used to request that the origin server accept the entity enclosed in the request as a new subordinate of the resource identified by the Request-URI in the Request-Line.
</p></blockquote>
<p>&#8230;example cases are provided, one of which is: &#8220;Providing a block of data, such as the result of submitting a form, to a data-handling process&#8221;</p>
<p>The <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.5">definition of PUT</a>:</p>
<blockquote><p>
The PUT method requests that the enclosed entity be stored under the supplied Request-URI. If the Request-URI refers to an already existing resource, the enclosed entity SHOULD be considered as a modified version of the one residing on the origin server.
</p></blockquote>
<p>Some people, trying to make REST more accessible, have correlated POST to the &#8220;Create&#8221; and PUT to the &#8220;Update&#8221; in CRUD. That does work, to a certain degree. But it doesn&#8217;t express one of the primary meanings of POST, which is: &#8220;please process this data&#8221;.</p>
<p>So hopefully you&#8217;ll all agree with me that PUT is more fitting to the operation at hand than POST.</p>
<p>&#8230;and that&#8217;s just my preamble! Now on to the real theory:</p>
<p><abbr title="Representation State Transfer">REST</abbr> stands for Representation State Transfer. The idea, in a nutshell, is that systems can function entirely by providing and accepting representations of the current state of resources, using a predefined set of methods, which are uniform for a given protocol.</p>
<p>Right now, our systems do a lot of providing representations, and not a lot of accepting.</p>
<p>But this case is a perfect fit for this side of REST.</p>
<p class="step">Let&#8217;s translate:</p>
<table class="step">
<tr>
<th>Request 1</th>
<th>HTTP</th>
<th>English</th>
</tr>
<tr>
<td><strong>Client:</strong></td>
<td>GET /policies/HPXQ1-66544?version=9</td>
<td>Please give me a representation of the current state of the resource &#8220;version 9 of the policy HPXQ1-66544&#8243;</td>
</tr>
<tr>
<td><strong>Server:</strong></td>
<td>
<pre name="code" class="xml">
200 OK
Content-Type: application/xml
&lt;InsurancePolicy id="HPXQ1-66544" version="9"&gt;
...
&lt;/InsurancePolicy&gt;
</pre>
</td>
<td>OK, here&#8217;s a representation of this resources&#8217; current state, of content-type application/xml, enjoy!</td>
</tr>
</table>
<table class="step">
<tr>
<th>Request 2</th>
<th>HTTP</th>
<th>English</th>
</tr>
<tr>
<td><strong>Client:</strong></td>
<td>
<pre name="code" class="xml">
PUT /policies/HPXQ1-66544
Content-Type: application/xml
&lt;InsurancePolicy id="HPXQ1-66544" version="9"&gt;
...
&lt;/InsurancePolicy&gt;
</pre>
</td>
<td>Please store this representation as the new content of the resource &#8220;the policy HPXQ1-66544&#8243;</td>
</tr>
<tr>
<td><strong>Server:</strong></td>
<td>
<pre name="code" class="xml">
200 OK
Content-Type: application/xml
&lt;InsurancePolicy id="HPXQ1-66544" version="11"&gt;
...
&lt;History&gt;
....
&lt;Event type="revert"  timeStamp="now" note="Reverted to version 9"/&gt;
&lt;/History&gt;
&lt;/InsurancePolicy&gt;
</pre>
</td>
<td>OK, done. And here&#8217;s a representation of this resources&#8217; current state, of content-type application/xml, enjoy!</td>
</tr>
</table>
<p>Hopefully that makes sense.</p>
<p>Now, at this point you may be shaking your head and saying, &#8220;fine, OK, but that all seems fairly complicated. I thought REST was supposed to be simple?! Wouldn&#8217;t it be even simpler if the server would just support a method to do this, something like revertPolicy(version)?&#8221;</p>
<p>That&#8217;s understandable. The benefits of using REST aren&#8217;t always apparent when you&#8217;re working on or with a single web service. But you just learned the deep nuances of POST and PUT. And the great thing is, that knowledge is <em>portable</em>. Because of REST&#8217;s <em>uniform interface</em>, you now know how to use almost any RESTful web service. All you need to learn is what its resources are &#8211; you already know what methods the service supports, and what they mean. In a non-RESTful, RPC architecture, such as SOAP, every single service has a completely unique API &#8211; a set of procedures &#8211; and no knowlege is portable from service to service. In the RPC model, every API has a steep learning curve, because you&#8217;re starting at zero every time.</p>
<p>I hope this made sense. I&#8217;m really into this head-space right now, &#8217;cause I just recently read the new book, <a href="http://www.crummy.com/writing/RESTful-Web-Services/">RESTful Web Services</a> &#8211; and it&#8217;s excellent. I highly recommend it.</p>
</blockquote>
<p>So, that&#8217;s the kinda stuff we talk about here at arc90. If you have anything to add, please feel free!</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.arc90.com/2007/06/13/restful-revert/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Finally, a REST Book!</title>
		<link>http://blog.arc90.com/2006/11/22/finally-a-rest-book/</link>
		<comments>http://blog.arc90.com/2006/11/22/finally-a-rest-book/#comments</comments>
		<pubDate>Wed, 22 Nov 2006 14:50:11 +0000</pubDate>
		<dc:creator>Avi Flax</dc:creator>
				<category><![CDATA[Architecture]]></category>

		<guid isPermaLink="false">http://blog.daniell.acr90-dev-02/2006/11/22/finally-a-rest-book/</guid>
		<description><![CDATA[I was very excited to stumble across a link to the book REST Web Services, by Leonard Richardson and Sam Ruby, which is slated to be released in May 2007. It can&#8217;t come soon enough for me. I&#8217;ve been building REST web services for about a year now, and I&#8230; <a href="http://blog.arc90.com/2006/11/22/finally-a-rest-book/">More</a>]]></description>
			<content:encoded><![CDATA[<p>I was very excited to stumble across a link to the book <a href="http://www.crummy.com/writing/REST-Web-Services/" title="REST Web Services">REST Web Services</a>, by <a href="http://www.crummy.com/">Leonard Richardson</a> and <a href="http://www.intertwingly.net/blog/">Sam Ruby</a>, which is slated to be released in May 2007. It can&#8217;t come soon enough for me.</p>
<p>I&#8217;ve been building REST web services for about a year now, and I was interested in the style well beforehand. Over the past year, I&#8217;ve become increasingly enamoured of the style, and I&#8217;ve enthusiastically embraced it as <strong>the</strong> way to build web services and APIs. I&#8217;ve gone so far as to become Arc&#8217;s Architect for Services, with the mandate to ensure that all our web APIs follow RESTful principles and design patterns.</p>
<p>The single biggest problem with REST has been a lack of clearly established best practices that an initiate could follow to get up to speed with the style quickly. Until now, someone wanting to create a REST service had to start with the <a href="http://www.ics.uci.edu/%7Efielding/pubs/dissertation/rest_arch_style.htm" title="Chapter 5 of Roy Fielding's dissertation, which described REST for the first time.">dissertation</a>, then a <a href="http://www.xfront.com/REST-Web-Services.html" title="Q &amp; A">Q &amp; A</a>, a <a href="http://naeblis.cx/articles/2004/12/12/rest-to-my-wife" title="Ryan Tomayko's insightful and entertaining retelling of his explanation of REST to his wife.">marital dialogue</a>, and a <a href="http://rest.blueoxen.net/cgi-bin/wiki.pl?RestFaq" title="REST FAQ at the REST Wiki">FAQ</a> &#8211; before they were ready to peruse hundreds of messages at <a href="http://tech.groups.yahoo.com/group/rest-discuss/" title="rest-discuss">rest-discuss</a>. It&#8217;s an exhausting series of hurdles to jump over; it&#8217;s no wonder that adoption of REST has been slow and uneven.</p>
<p>But lately things have started getting much better, rapidly. There&#8217;s now a publicly available example of a best-practices REST API, <a href="http://www.blinksale.com/api" title="Blinksale's">Blinksale&#8217;s</a>. And REST is getting <a href="http://www.loudthinking.com/arc/000593.html" title="all">all</a> <a href="http://del.icio.us/tag/rest?setcount=100" title="sorts">sorts</a> of high-profile attention. (Interestingly, much of the <a href="http://www.intertwingly.net/blog/2006/11/17/The-H-stands-for-Hyper" title="recent writing">recent writing</a> has been in the form of <a href="http://naeblis.cx/weblog/2006/11/17/the-rest-dialogues" title="dialogue">dialogue</a>, which isn&#8217;t as common as it should be in net-tech circles. Ryan Tomayko should get a lot of credit for <a href="http://naeblis.cx/articles/2004/12/12/rest-to-my-wife" title="kicking that off">kicking that off</a>.)</p>
<p>I have high hopes that this book will firmly establish REST as a practical, effective architectural style, one that&#8217;s as mature in its application as in its theory. I&#8217;m really looking forward to seeing it!</p>
<p>Now, since we&#8217;re finally getting practice cemented down on top of the ideas, it&#8217;s time for some better tool support! More on that later.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.arc90.com/2006/11/22/finally-a-rest-book/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

