<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" xml:lang="en-US" xml:base="http://www.subbu.org/wp-atom.php">
	<title type="text">subbu.org</title>
	<subtitle type="text">Subbu Allamaraju's blog</subtitle>

	<updated>2013-04-14T01:25:10Z</updated>

	<link rel="alternate" type="text/html" href="http://www.subbu.org" />
	<id>http://www.subbu.org/feed/atom</id>
	

	<generator uri="http://wordpress.org/" version="3.5">WordPress</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/SubbuDotOrg" /><feedburner:info uri="subbudotorg" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><geo:lat>37.75735</geo:lat><geo:long>-121.952138</geo:long><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2FSubbuDotOrg" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FSubbuDotOrg" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/SubbuDotOrg" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2FSubbuDotOrg" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2FSubbuDotOrg" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FSubbuDotOrg" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><entry>
		<author>
			<name>Subbu Allamaraju</name>
						<uri>http://www.subbu.org</uri>
					</author>
		<title type="html"><![CDATA[Code the Infra]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SubbuDotOrg/~3/iMkUBX9-LoU/code-the-infra" />
		<id>http://www.subbu.org/?p=2068</id>
		<updated>2013-04-14T01:25:10Z</updated>
		<published>2013-04-13T23:31:55Z</published>
		<category scheme="http://www.subbu.org" term="Uncategorized" />		<summary type="html"><![CDATA[Code the infra. There is no other way to make operations predictable and repeatable. The opposite of coding the infra is what I call as &#8220;box hugging&#8221;. If you log into boxes to configure, install packages, start/stop services, or do any maintenance, you are a box hugger. Coding the infra requires that you treat automation [...]]]></summary>
		<content type="html" xml:base="http://www.subbu.org/blog/2013/04/code-the-infra">&lt;p&gt;&lt;/p&gt;&lt;p&gt;Code the infra. There is no other way to make operations predictable and repeatable. The opposite of coding the infra is what I call as &amp;#8220;box hugging&amp;#8221;. If you log into boxes to configure, install packages, start/stop services, or do any maintenance, you are a box hugger. Coding the infra requires that you treat automation artifacts (shell scripts, puppet manifests, fabric scripts etc) and configuration as code. If you&amp;#8217;ve no repeatable code to bring up bare infra into a desirable operational state, then you are a box hugger. Box hugging is a bad habit, and is bad for the business. It makes recovery from failures time-consuming. It does not scale with needs. Most fat-finger and &lt;a href="http://www.infoq.com/presentations/Event-Sourced-Architectures-for-High-Availability"&gt;admin cockup&lt;/a&gt; related outages start with box hugging. Sure, it may have worked 100 times, but just one fat-finger mistake is enough to make your team&amp;#8217;s life miserable.&lt;/p&gt;

&lt;p&gt;Two steps to cure box hugging &amp;#8211; first, internalize the idea that the box you&amp;#8217;ve just finished setting up meticulously is going to burst into flames the very next minute, second treat operations the same way as you would treat software development.&lt;/p&gt;

&lt;p&gt;Coding the infra is not hard.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Treat infra as ephemeral&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Infra is not permanent. It will fail. You can estimate &lt;a href="http://en.wikipedia.org/wiki/Mean_time_between_failures"&gt;MTBF&lt;/a&gt; with some assumptions, but failures won&amp;#8217;t follow estimates. &lt;a href="http://www.kitchensoap.com/2010/11/07/mttr-mtbf-for-most-types-of-f/"&gt;MTTR is more important that MTBF&lt;/a&gt;. When you treat infra as ephemeral, the act of bringing up new infra to a desired operational state becomes a normal and known practice. You ignore the dead nodes, and focus on bringing up new nodes as quickly as possible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Think of system setup as a series of state changes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Start with the basic infra, and apply a sequence of steps to change the state of the infra to bring it to a desired state. The steps could be installing packages, configuring them, starting servers, setting cron jobs and so on. This is no different from most coding exercises &amp;#8211; start from a known state, apply some computations, and arrive at a new state.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Make the steps repeatable&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is like coding any math problem. You first solve it on paper to arrive at an algorithm. Then you would code the algorithm so that you can repeat it every time you need to solve the same math problem again. It is the same with operational changes. It might seem time-consuming to treat operations this way, but unless you make the steps repetable through automation, you can&amp;#8217;t recover from failures easily. Repeatability is a way of rehearsing recovery. Node died? Cool &amp;#8211; just run the automation to bring up a new node. You&amp;#8217;re back in business.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Implement idempotency&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Repeatability alone is not sufficient when the state changes are numerous. You need to make each state change idemotent. Apply the same change again &amp;#8211; the system should not burn up. Practicing idempotency makes the outcome certain. If something breaks in the middle you can replay the whole sequence of changes when you know that each step is idempotent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Review, test and version control&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Finally, apply the same engineering rigor to automation artifacts as you would apply to software development &amp;#8211; that is, ensure that the automation scripts are peer-reviewed, tested and maintained in source control. There should be no difference.&lt;/p&gt;

&lt;p&gt;DevOps is not just about integrating dev and ops, but is about treating operations as development, and development as operations.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/SubbuDotOrg?a=iMkUBX9-LoU:69zzCKAF4Sg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SubbuDotOrg?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/SubbuDotOrg?a=iMkUBX9-LoU:69zzCKAF4Sg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SubbuDotOrg?i=iMkUBX9-LoU:69zzCKAF4Sg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/SubbuDotOrg?a=iMkUBX9-LoU:69zzCKAF4Sg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SubbuDotOrg?i=iMkUBX9-LoU:69zzCKAF4Sg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SubbuDotOrg/~4/iMkUBX9-LoU" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.subbu.org/blog/2013/04/code-the-infra#comments" thr:count="39" />
		<link rel="replies" type="application/atom+xml" href="http://www.subbu.org/blog/2013/04/code-the-infra/feed/atom" thr:count="39" />
		<thr:total>39</thr:total>
	<feedburner:origLink>http://www.subbu.org/blog/2013/04/code-the-infra</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Subbu Allamaraju</name>
						<uri>http://www.subbu.org</uri>
					</author>
		<title type="html"><![CDATA[Getting Paid to do What you Love]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SubbuDotOrg/~3/7qhVu0a4v7s/getting-paid-to-do-what-you-love" />
		<id>http://www.subbu.org/?p=2048</id>
		<updated>2012-12-31T15:59:16Z</updated>
		<published>2012-12-31T15:57:05Z</published>
		<category scheme="http://www.subbu.org" term="Uncategorized" />		<summary type="html"><![CDATA[Just imagine being able to get group of so-called &#34;individual contributors&#34; together and build software with freedom to execute in a manner that works best for the team, with minimal or no project management overhead, no architect(s) or committees to ratify design decisions, and the empowerment to quickly change the course as necessary. There is [...]]]></summary>
		<content type="html" xml:base="http://www.subbu.org/blog/2012/12/getting-paid-to-do-what-you-love">&lt;p&gt;&lt;/p&gt;&lt;p&gt;Just imagine being able to get group of so-called &amp;quot;individual contributors&amp;quot; together and build software with freedom to execute in a manner that works best for the team, with minimal or no project management overhead, no architect(s) or committees to ratify design
decisions, and the empowerment to quickly change the course as necessary. There is just one catch &amp;#8211; the team must be after a mission to accomplish some measurable and timely business goals. How the team gets there is up to the team. I&amp;#39;ve had opportunities to form teams and execute in this manner twice so far in my 20 months at eBay, and I love the experience. What&amp;#39;s better than getting paid to solve problems for real customers and scale without the overhead and slowness that is typically attributed to large companies!&lt;/p&gt;

&lt;p&gt;During this course we blended a number of ideas from open source projects so that we get the best of the both worlds.&lt;/p&gt;

&lt;p&gt;Having been in this trade for years, I&amp;#39;ve come to realize that how a team organizes itself and conducts its activities is a critical contributor to the quality and agility as well as the enthusiasm and happiness of the team members. One of the ways to get a team of people behind a set of goals with passion and enthusiasm is to let the team decide the how. Unfortunately, that does not happen in most places of work.&lt;/p&gt;

&lt;p&gt;Let&amp;#39;s imagine that there is a mission and set of goals to accomplish. The typical model I&amp;#39;ve seen used goes like this &amp;#8211; One or more architects (or some senior equivalents) define how the big picture ought to look like to meet those goals. An architecture is drawn as pretty diagrams and published into slide decks and wikis. The big picture is presented and discussed, and then is broken into parts that smaller teams can execute. Smaller teams are then formed. Finally coordinators like project/program managers get assigned to conduct the development process so that dependencies and communication can be streamlined. This model creates an hierarchical organization supposedly to help reach the goals.&lt;/p&gt;

&lt;p&gt;Then &lt;a href="http://www.melconway.com/Home/Committees_Paper.html"&gt;Conway&amp;#39;s Law&lt;/a&gt; happens. First, the organization will start to influence and dictate choices. Second, since each team is going after a part of the mission, the parts may not necessarily guarantee an
integrated experience for the customer irrespective how well they were built. Third, coordination of the development of parts creates an extra layer of friction and slowness that most productive engineers hate. I&amp;#39;ve seen things that take 10 minutes to fix get discussed between teams for hours and days only to get dropped in the end.&lt;/p&gt;

&lt;p&gt;Such an organization is counter-productive.&lt;/p&gt;

&lt;p&gt;How are successful open source projects organized? The rules of engagement in open source model are not organization-driven but are organic:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Individuals come from different parts of the organization, often working in different timezones. There is no direct mapping from managers to things that engineers work on. &lt;/li&gt;
&lt;li&gt;Individuals get to work on the things they work on because they have established their credentials with the rest of the group, and not because they work for such and such part of the organization or they&amp;#39;ve been assigned to.&lt;/li&gt;
&lt;li&gt;Decisions don&amp;#39;t get taken because some senior person said so. In stead, individuals have the power to make, and the responsibility to socialize and defend their choices.&lt;/li&gt;
&lt;li&gt;There is no one paid to coordinate. Open source projects don&amp;#39;t have the luxury of support and coordination roles. Certain members may volunteer to coordinate things like prioritization, and releases but it usually takes a small amount of their time. Such roles are often rotated.&lt;/li&gt;
&lt;li&gt;Inferior ideas are voted out as the group tends to recognize innovators and strong executors &amp;#8211; community recognition is a key perk in open source projects. Consequently, you don&amp;#39;t get to hide behind a manager curtain and build stuff in isolation.&lt;/li&gt;
&lt;li&gt;There are no mundane tasks. Consequently, things that are manual or that require inferior skills don&amp;#39;t exist.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;All these are easy to apply even in non-open source projects irrespective of the size of a company, and it is well worth it. But it opens up an important question since you&amp;#39;ve some business goals to accomplish and work for a man.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How do you make sure that things that are needed to be done get done. In a community-centric model, some work items may attract no attention. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is easily solvable.&lt;/p&gt;

&lt;p&gt;To start with, the team must get behind the mission and stated goals and make the mission their own. What I&amp;#39;ve learned is that,
when individuals are given the ownership and freedom to execute and a mission, they usually get things done end to end. You don&amp;#39;t need to tell them how. Things fall through the cracks when they don&amp;#39;t have that freedom. Of course, this is contingent on creating a reward structure that rewards meeting the end goals and not specific tasks or actions.&lt;/p&gt;

&lt;p&gt;In a system where anyone can join and pick up anything, mundane things won&amp;#39;t get done because those are tedious and repetitive. This usually leads to a subpar team structure with lower tiers of engineers doing mundane tasks. The only way to avoid this is replace
mundane tasks with clever solutions. Create those solutions such that you can make yourself redundant from doing those ever again.&lt;/p&gt;

&lt;p&gt;Finally, let the mission and goals help decide what needs to be done and what does not need to be. Feature creep happens when teams are looking at parts and not the big picture. You can minimize this by making every one part of the big picture.&lt;/p&gt;

&lt;p&gt;The net result is a team that is focused on the mission with the freedom to figure out how to organize and conduct itself. This may sound anarchic, but I would argue that is it is objective.&lt;/p&gt;

&lt;p&gt;But does it work when you have hundreds of developers all working on a large project, or any project for that matter? I don&amp;#39;t know but I think it is important for the people involved to take the time to figure out.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/SubbuDotOrg?a=7qhVu0a4v7s:V2nBfHFytfs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SubbuDotOrg?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/SubbuDotOrg?a=7qhVu0a4v7s:V2nBfHFytfs:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SubbuDotOrg?i=7qhVu0a4v7s:V2nBfHFytfs:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/SubbuDotOrg?a=7qhVu0a4v7s:V2nBfHFytfs:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SubbuDotOrg?i=7qhVu0a4v7s:V2nBfHFytfs:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SubbuDotOrg/~4/7qhVu0a4v7s" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.subbu.org/blog/2012/12/getting-paid-to-do-what-you-love#comments" thr:count="19" />
		<link rel="replies" type="application/atom+xml" href="http://www.subbu.org/blog/2012/12/getting-paid-to-do-what-you-love/feed/atom" thr:count="19" />
		<thr:total>19</thr:total>
	<feedburner:origLink>http://www.subbu.org/blog/2012/12/getting-paid-to-do-what-you-love</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Subbu Allamaraju</name>
						<uri>http://www.subbu.org</uri>
					</author>
		<title type="html"><![CDATA[Milestone.js &#8211; Project Tracking for GitHub Projects]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SubbuDotOrg/~3/FuNVebwfK-0/milestone-js-project-tracking-for-github-projects" />
		<id>http://www.subbu.org/?p=2036</id>
		<updated>2012-12-28T22:06:42Z</updated>
		<published>2012-12-28T22:06:42Z</published>
		<category scheme="http://www.subbu.org" term="Uncategorized" />		<summary type="html"><![CDATA[We use GitHub Enterprise at work for almost all of our activities at work. In addition to maintaing source in git, we also use GitHub for code reviews, issue tracking, milestones, incident reports etc. However, what we lack most are (a) an ability to quickly track project progress, and (b) someway to track large features [...]]]></summary>
		<content type="html" xml:base="http://www.subbu.org/blog/2012/12/milestone-js-project-tracking-for-github-projects">&lt;p&gt;&lt;/p&gt;&lt;p&gt;We use GitHub Enterprise at work for almost all of our activities at work. In addition to maintaing source in git, we also use GitHub for code reviews, issue tracking, milestones, incident reports etc. However, what we lack most are (a) an ability to quickly track project progress, and (b) someway to track large features that can take one or more milestones to complete &amp;#8211; like &lt;a href="http://launchpad.net"&gt;Launchpad&lt;/a&gt;&amp;#8216;s &lt;a href="https://blueprints.launchpad.net/"&gt;Blueprints&lt;/a&gt;. Here is how Launchpad describes a blueprint.&lt;/p&gt;

&lt;blockquote&gt;
Blueprint is a lightweight way to manage releases of your software and to track the progress of features and ideas, from initial concept to implementation.
&lt;/blockquote&gt;

&lt;p&gt;Enter &lt;a href="https://github.com/s3u/milestone.js"&gt;Milestone.js&lt;/a&gt; &amp;#8211; the idea of Milestone.js is to fill these gaps. It grew out of our needs at work.&lt;/p&gt;

&lt;p&gt;First, it uses GitHub APIs and &lt;a href="http://timeline.verite.co/"&gt;Timeline JS&lt;/a&gt; to map milestones on a timeline so that you can find what is happening in any given milestone.&lt;/&gt;

&lt;a href="http://www.subbu.org/blog/2012/12/milestone-js-project-tracking-for-github-projects/screen-shot-2012-12-28-at-1-54-40-pm" rel="attachment wp-att-2037"&gt;&lt;img src="http://wp.subbu.org/wp-content/uploads/2012/12/Screen-Shot-2012-12-28-at-1.54.40-PM.png" width="600px"&gt;&lt;/a&gt;

&lt;p&gt;Second, it follows some simple conventions to manage blueprints:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create each blueprint as an issue, and label it as a &amp;#8220;blueprint&amp;#8221; &amp;#8211; it does not matter what you label it as.&lt;/li&gt;
&lt;li&gt;Create issues for all work items for each blueprint.&lt;/li&gt;
&lt;li&gt;For each blueprint, add the work items as comments starting with &lt;code&gt;{issue_id}:&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Milestone.js will then show all related work items for each blueprint. Here is an example.&lt;/p&gt;

&lt;img src="https://raw.github.com/s3u/milestone.js/master/example/example.png" width="600px"&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/SubbuDotOrg?a=FuNVebwfK-0:_cwzlZey4R8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SubbuDotOrg?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/SubbuDotOrg?a=FuNVebwfK-0:_cwzlZey4R8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SubbuDotOrg?i=FuNVebwfK-0:_cwzlZey4R8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/SubbuDotOrg?a=FuNVebwfK-0:_cwzlZey4R8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SubbuDotOrg?i=FuNVebwfK-0:_cwzlZey4R8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SubbuDotOrg/~4/FuNVebwfK-0" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.subbu.org/blog/2012/12/milestone-js-project-tracking-for-github-projects#comments" thr:count="11" />
		<link rel="replies" type="application/atom+xml" href="http://www.subbu.org/blog/2012/12/milestone-js-project-tracking-for-github-projects/feed/atom" thr:count="11" />
		<thr:total>11</thr:total>
	<feedburner:origLink>http://www.subbu.org/blog/2012/12/milestone-js-project-tracking-for-github-projects</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Subbu Allamaraju</name>
						<uri>http://www.subbu.org</uri>
					</author>
		<title type="html"><![CDATA[HTTP Pipelining is a Hit and Miss]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SubbuDotOrg/~3/iV7eA7T1y64/http-pipelining-hit-and-miss" />
		<id>http://www.subbu.org/?p=1957</id>
		<updated>2012-07-21T00:09:41Z</updated>
		<published>2012-07-20T05:20:09Z</published>
		<category scheme="http://www.subbu.org" term="Uncategorized" />		<summary type="html"><![CDATA[The idea behind pipelining in HTTP 1.1 is to allow clients submit multiple idempotent HTTP requests over a connection to a host, let the server to process them in parallel and respond in the order in which the requests were made. In theory, pipelining has some benefits: Increased parallelism on the server &#8211; this seems [...]]]></summary>
		<content type="html" xml:base="http://www.subbu.org/blog/2012/07/http-pipelining-hit-and-miss">&lt;p&gt;&lt;/p&gt;&lt;p&gt;The idea behind pipelining in HTTP 1.1 is to allow clients submit multiple idempotent HTTP requests over a  connection to a host, let the server to process them in parallel and respond in the order in which the requests were made.&lt;/p&gt;

&lt;p&gt;In theory, pipelining has some benefits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Increased parallelism on the server &amp;#8211; this seems obvious since the client is able to dispatch many requests over a connection.&lt;/li&gt;
&lt;li&gt;Reduced amount of the time an HTTP request is waiting to be made in the browser &amp;#8211; in stead of queuing up requests behind one another, the browser can dispatch them as soon as it knows that a resource needs to be fetched&lt;/li&gt;
&lt;li&gt;Improved connection reuse &amp;#8211; as a consequence of increased parallelism and reduction in queued times, it is arguable that pipelining would result in a reduction in number of connections that the browser needs to open.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These may result in reduced latencies. However, finding data with consistent patterns to prove benefits of pipelining is hard to come by. The first set of charts below show total time requests were in the queue for each connection. The red circles show requests made without pipelining and green circles show requests made with pipelining &lt;a href="https://gist.github.com/3148816"&gt;enabled&lt;/a&gt;. The size of each circle is proportional to the number of resources requested for each connection. The results show 100 runs made from a pool of private instances of &lt;a href="http://www.webpagetest.org/"&gt;WebPagetest&lt;/a&gt; on Windows XP with Firefox over DSL profile. &lt;/p&gt;

&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src="http://wp.subbu.org/wp-content/uploads/2012/07/bbc-blocked.png"&gt;&lt;/img&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="http://wp.subbu.org/wp-content/uploads/2012/07/youtube-blocked.png"&gt;&lt;/img&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src="http://wp.subbu.org/wp-content/uploads/2012/07/amazon-blocked.png"&gt;&lt;/img&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="http://wp.subbu.org/wp-content/uploads/2012/07/espn-blocked.png"&gt;&lt;/img&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src="http://wp.subbu.org/wp-content/uploads/2012/07/yahoonews-blocked.png"&gt;&lt;/img&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="http://wp.subbu.org/wp-content/uploads/2012/07/ebay-blocked.png"&gt;&lt;/img&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src="http://wp.subbu.org/wp-content/uploads/2012/07/flickr-blocked.png"&gt;&lt;/img&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="http://wp.subbu.org/wp-content/uploads/2012/07/nytimes-blocked.png"&gt;&lt;/img&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src="http://wp.subbu.org/wp-content/uploads/2012/07/overstock-blocked.png"&gt;&lt;/img&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="http://wp.subbu.org/wp-content/uploads/2012/07/cnbc-blocked.png"&gt;&lt;/img&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;Any pattern showing that pipelining reduces queued times is absent in these charts.&lt;/p&gt;

&lt;p&gt;The second set of charts below show the number of connections used by the browser for each run. The red lines show runs without pipelining, and green lines show runs made with pipelining.&lt;/p&gt;

&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src="http://wp.subbu.org/wp-content/uploads/2012/07/bbc-sockets.png"&gt;&lt;/img&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="http://wp.subbu.org/wp-content/uploads/2012/07/youtube-sockets1.png"&gt;&lt;/img&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src="http://wp.subbu.org/wp-content/uploads/2012/07/amazon-sockets1.png"&gt;&lt;/img&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="http://wp.subbu.org/wp-content/uploads/2012/07/espn-sockets1.png"&gt;&lt;/img&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src="http://wp.subbu.org/wp-content/uploads/2012/07/yahoonews-sockets1.png"&gt;&lt;/img&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="http://wp.subbu.org/wp-content/uploads/2012/07/ebay-sockets1.png"&gt;&lt;/img&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src="http://wp.subbu.org/wp-content/uploads/2012/07/flickr-sockets1.png"&gt;&lt;/img&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="http://wp.subbu.org/wp-content/uploads/2012/07/nytimes-sockets1.png"&gt;&lt;/img&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src="http://wp.subbu.org/wp-content/uploads/2012/07/overstock-sockets1.png"&gt;&lt;/img&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="http://wp.subbu.org/wp-content/uploads/2012/07/cnbc-sockets1.png"&gt;&lt;/img&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;Again there is no consistent pattern in these charts to show the pipelining improves connection reuse. &lt;/p&gt;

&lt;p&gt;The point is here is that though the idea of pipelining is simple in theory, making tangible benefits out of pipelining may be hard.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/SubbuDotOrg?a=iV7eA7T1y64:lBBNLa2f_Nw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SubbuDotOrg?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/SubbuDotOrg?a=iV7eA7T1y64:lBBNLa2f_Nw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SubbuDotOrg?i=iV7eA7T1y64:lBBNLa2f_Nw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/SubbuDotOrg?a=iV7eA7T1y64:lBBNLa2f_Nw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SubbuDotOrg?i=iV7eA7T1y64:lBBNLa2f_Nw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SubbuDotOrg/~4/iV7eA7T1y64" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.subbu.org/blog/2012/07/http-pipelining-hit-and-miss#comments" thr:count="19" />
		<link rel="replies" type="application/atom+xml" href="http://www.subbu.org/blog/2012/07/http-pipelining-hit-and-miss/feed/atom" thr:count="19" />
		<thr:total>19</thr:total>
	<feedburner:origLink>http://www.subbu.org/blog/2012/07/http-pipelining-hit-and-miss</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Subbu Allamaraju</name>
						<uri>http://www.subbu.org</uri>
					</author>
		<title type="html"><![CDATA[Your MVC may be Slowing Down Your Site]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SubbuDotOrg/~3/SkevrG52YpY/mvc-may-be-slowing-down-your-site" />
		<id>http://www.subbu.org/?p=1919</id>
		<updated>2012-07-03T18:56:13Z</updated>
		<published>2012-07-02T19:44:55Z</published>
		<category scheme="http://www.subbu.org" term="Uncategorized" />		<summary type="html"><![CDATA[One of most common design patterns used on the Web is the model-view-controller. Though some variations of this pattern exist, the basic idea is simple &#8211; a controller parses and processes the incoming HTTP request, thinks for a while, and then writes a view as HTTP response. The point of this post is not to [...]]]></summary>
		<content type="html" xml:base="http://www.subbu.org/blog/2012/07/mvc-may-be-slowing-down-your-site">&lt;p&gt;&lt;/p&gt;&lt;p&gt;One of most common design patterns used on the Web is the &lt;a href="http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller"&gt;model-view-controller&lt;/a&gt;. Though some variations of this pattern exist, the basic idea is simple  &amp;#8211; a controller parses and processes the incoming HTTP request, thinks for a while, and then writes a view as HTTP response. &lt;/p&gt;

&lt;p&gt;&lt;img src="http://wp.subbu.org/wp-content/uploads/2012/07/mvc.png"&gt;&lt;/img&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;strong&gt;The point of this post is not to blame MVC, but to point out that implementations in web frameworks may be leading to higher time to first byte times.&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;p&gt;But did you know that, this style, as commonly implemented, may be slowing down your site? See the waterfall charts below for some of the Alexa&amp;#39;s &lt;a href="http://www.alexa.com/topsites/countries/US"&gt;top 500 sites in US&lt;/a&gt;, captured using &lt;a href="http://www.webpagetest.org"&gt;webpagetest&lt;/a&gt; over the DSL network profile with Firefox.&lt;/p&gt;

&lt;table&gt;
&lt;tr&gt;&lt;td&gt;&lt;img src="http://wp.subbu.org/wp-content/uploads/2012/07/1.png"&gt;&lt;/img&gt;&lt;/td&gt;&lt;td&gt;&lt;img src="http://wp.subbu.org/wp-content/uploads/2012/07/2.png"&gt;&lt;/img&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;img src="http://wp.subbu.org/wp-content/uploads/2012/07/3.png"&gt;&lt;/img&gt;&lt;/td&gt;&lt;td&gt;&lt;img src="http://wp.subbu.org/wp-content/uploads/2012/07/4.png"&gt;&lt;/img&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;img src="http://wp.subbu.org/wp-content/uploads/2012/07/5.png"&gt;&lt;/img&gt;&lt;/td&gt;&lt;td&gt;&lt;img src="http://wp.subbu.org/wp-content/uploads/2012/07/6.png"&gt;&lt;/img&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;When you look from the network perspective, all these charts share a common pattern &amp;#8211; &lt;em&gt;deafening silence&lt;/em&gt;, followed by a &lt;em&gt;log jam&lt;/em&gt;. &lt;/p&gt;

&lt;p&gt;The network is silent when the server is thinking (the green area). As soon as response starts to trickle down (the blue area), the browser starts new network activity and immediately gets into a log jam mode. In this mode, the browser is busy making DNS look ups, TCP handshakes, followed by several HTTP requests over a limited number of connections.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://wp.subbu.org/wp-content/uploads/2012/07/pattern.png"&gt;&lt;/img&gt;&lt;/p&gt;

&lt;p&gt;From a user experience point of view, this is bad as it leads to a rapid backlog of HTTP requests. As the number of connections is limited, it takes a while for this log jam to clear up which increases the overall page latency. A protocol like SPDY can deal with the log jam better, but reducing the jam is better for the user.&lt;/p&gt;

&lt;p&gt;The problem here is not with MVC per se, but how it is commonly implemented. Most often, the thinking part consists of talking to back-end systems and/or some computation completely blocking response generation. Even in implementations that do some of this thinking asynchronously, view rendering ofter starts after the thinking part is done. This contributes to higher &amp;quot;time to first byte&amp;quot; times and the subsequent log jam. &lt;/p&gt;

&lt;p&gt;Below is a waterfall chart of a site that minimizes this log jam.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://wp.subbu.org/wp-content/uploads/2012/07/better.png"&gt;&lt;/p&gt;

&lt;p&gt;In this case, the server is starting HTML delivery as soon possible so that the browser can start to download some of those resources sooner. The HTML delivery continues even after some of the subsequent resources complete. This is possible by interleaving HTML delivery with backend work and stream chunks of response as they become ready.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://wp.subbu.org/wp-content/uploads/2012/07/better-mvc.png"&gt;&lt;/img&gt;&lt;/p&gt;

&lt;p&gt;Though such sooner delivery does not completely avoid the log jam, it does help ease it. &lt;/p&gt;

&lt;p&gt;If you do MVC, don&amp;#8217;t forget to think from the network point of view.&lt;/p&gt;

&lt;p&gt;Update: See the Hacker News thread for more comments: &lt;a href="http://news.ycombinator.com/item?id=4194500"&gt;http://news.ycombinator.com/item?id=4194500&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/SubbuDotOrg?a=SkevrG52YpY:7fWLVGSBN7U:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SubbuDotOrg?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/SubbuDotOrg?a=SkevrG52YpY:7fWLVGSBN7U:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SubbuDotOrg?i=SkevrG52YpY:7fWLVGSBN7U:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/SubbuDotOrg?a=SkevrG52YpY:7fWLVGSBN7U:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SubbuDotOrg?i=SkevrG52YpY:7fWLVGSBN7U:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SubbuDotOrg/~4/SkevrG52YpY" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.subbu.org/blog/2012/07/mvc-may-be-slowing-down-your-site#comments" thr:count="39" />
		<link rel="replies" type="application/atom+xml" href="http://www.subbu.org/blog/2012/07/mvc-may-be-slowing-down-your-site/feed/atom" thr:count="39" />
		<thr:total>39</thr:total>
	<feedburner:origLink>http://www.subbu.org/blog/2012/07/mvc-may-be-slowing-down-your-site</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Subbu Allamaraju</name>
						<uri>http://www.subbu.org</uri>
					</author>
		<title type="html"><![CDATA[QCon NY Slides on &#8220;Making Things Work Together&#8221;]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SubbuDotOrg/~3/46xfPu3RIcE/qcon-ny-slides-on-making-things-work-together" />
		<id>http://www.subbu.org/?p=1913</id>
		<updated>2012-06-20T16:28:09Z</updated>
		<published>2012-06-20T16:12:46Z</published>
		<category scheme="http://www.subbu.org" term="Uncategorized" />		<summary type="html"><![CDATA[Here are the slides from my QCon NY talk where I presented ql.io as a way to interop across servers. Making Things Work Together View more PowerPoint from Subbu Allamaraju See qcon2012.pptx for the original deck.]]></summary>
		<content type="html" xml:base="http://www.subbu.org/blog/2012/06/qcon-ny-slides-on-making-things-work-together">&lt;p&gt;&lt;/p&gt;Here are the slides from my QCon NY talk where I presented ql.io as a way to interop across servers.

&lt;div style="width:425px" id="__ss_13394731"&gt; &lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/sallamar/making-things-work-together" title="Making Things Work Together" target="_blank"&gt;Making Things Work Together&lt;/a&gt;&lt;/strong&gt; &lt;iframe src="http://www.slideshare.net/slideshow/embed_code/13394731" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC;border-width:1px 1px 0" allowfullscreen&gt;&lt;/iframe&gt; &lt;div style="padding:5px 0 12px"&gt; View more &lt;a href="http://www.slideshare.net/thecroaker/death-by-powerpoint" target="_blank"&gt;PowerPoint&lt;/a&gt; from &lt;a href="http://www.slideshare.net/sallamar" target="_blank"&gt;Subbu Allamaraju&lt;/a&gt; &lt;/div&gt; &lt;/div&gt;

See &lt;a href="https://github.com/s3u/talks/blob/master/qcon2012.pptx"&gt;qcon2012.pptx&lt;/a&gt; for the original deck.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/SubbuDotOrg?a=46xfPu3RIcE:SS1HHdCY2gQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SubbuDotOrg?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/SubbuDotOrg?a=46xfPu3RIcE:SS1HHdCY2gQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SubbuDotOrg?i=46xfPu3RIcE:SS1HHdCY2gQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/SubbuDotOrg?a=46xfPu3RIcE:SS1HHdCY2gQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SubbuDotOrg?i=46xfPu3RIcE:SS1HHdCY2gQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SubbuDotOrg/~4/46xfPu3RIcE" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.subbu.org/blog/2012/06/qcon-ny-slides-on-making-things-work-together#comments" thr:count="1" />
		<link rel="replies" type="application/atom+xml" href="http://www.subbu.org/blog/2012/06/qcon-ny-slides-on-making-things-work-together/feed/atom" thr:count="1" />
		<thr:total>1</thr:total>
	<feedburner:origLink>http://www.subbu.org/blog/2012/06/qcon-ny-slides-on-making-things-work-together</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Subbu Allamaraju</name>
						<uri>http://www.subbu.org</uri>
					</author>
		<title type="html"><![CDATA[Want SPDY?]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SubbuDotOrg/~3/sWOtQjvEm_A/want-spdy" />
		<id>http://www.subbu.org/?p=1862</id>
		<updated>2012-06-27T16:04:28Z</updated>
		<published>2012-06-15T13:53:12Z</published>
		<category scheme="http://www.subbu.org" term="Uncategorized" />		<summary type="html"><![CDATA[Web performance is a complex topic with many contributors to poor latency. Of all the bottlenecks to site speed, HTTP traffic interests me the most. We know that both Google and Twitter run their primary domains on SPDY for performance reasons. But does this approach make sense for other sites? Here is my observation from [...]]]></summary>
		<content type="html" xml:base="http://www.subbu.org/blog/2012/06/want-spdy">&lt;p&gt;&lt;/p&gt;&lt;script type="text/javascript"
    src='http://www.google.com/jsapi?autoload={"modules":[{"name":"visualization","version":"1","packages":["corechart"]}]}'&gt;
&lt;/script&gt;
&lt;script type="text/javascript" src="http://www.subbu.org/scripts/parseuri.js"&gt;&lt;/script&gt;

&lt;p&gt;Web performance is a complex topic with many contributors to poor latency. Of all the bottlenecks to site speed, HTTP traffic interests me the most. We know that both &lt;a href="https://www.google.com"&gt;Google&lt;/a&gt; and &lt;a href="https://www.twitter.com"&gt;Twitter&lt;/a&gt; run their primary domains on SPDY for performance reasons. But does this approach make sense for other sites? Here is my observation from the data collected for a very small set of domains &amp;#8211; SPDY makes most sense for domains that meet two criteria &amp;#8211; those that serve a large proportion of resources on a page, and those that consequently make the browser put requests in the &amp;#8220;blocked&amp;#8221; state for the longest time. For other domains it may not matter, which most likely explains &lt;a href="http://www.guypo.com"&gt;Guy Podjarny&lt;/a&gt;&amp;#8216;s observations in &lt;a href="http://www.guypo.com/technical/not-as-spdy-as-you-thought/"&gt;Not as SPDY as You Thought&lt;/a&gt; earlier this week. SPDY&amp;#8217;s multiplexing can help minimize blocked times.&lt;/p&gt;

&lt;img src="http://wp.subbu.org/wp-content/uploads/2012/06/Screen-Shot-2012-06-14-at-Jun-14-2012-11.50.37-PM.png" alt="" title="Blocked request" width="356" height="168" class="alignnone size-full wp-image-1879" /&gt;

&lt;p&gt;See the charts below for some popular sites. Each chart shows two bars for the top five domains for the resources in a page (including the page&amp;#8217;s domain itself) that meet the above criteria. The blue bar shows the number of resources per domain, and the red bar shows the average number of milliseconds that a request to each resource was in the &amp;#8220;blocked&amp;#8221; state. For a given resource, the difference between the time a connection is made to the time a request is made is the &amp;#8220;blocked&amp;#8221; time. You can find blocked times in &lt;a href="http://www.softwareishard.com/blog/har-12-spec/"&gt;HAR&lt;/a&gt; files. You can use a simple &lt;a href="http://bl.ocks.org/d/2934860/"&gt;visualization tool&lt;/a&gt; I wrote to draw these charts for your HAR files.&lt;/p&gt;

&lt;p&gt;Though a large blocked time does not necessarily mean that the user perceived latency is poor, it can be a contributor to latency particularly when the network is bad &amp;#8211; like the time I captured this data. I captured the data for these sites when I was on a Hotel wifi network &amp;#8211; I got lucky a couple of days ago as the hotel I stayed at had very low download speeds, and I could not get any other work done.&lt;/p&gt;

&lt;p&gt;Here are my observations from these charts:&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;In most cases, domains serving large number of static resources contribute to most of the blocked time. This is prominent on sites that change the content frequently or for each request (such as search, news etc.) due to their low cacheability.&lt;/li&gt;

    &lt;li&gt;In most cases, such domains are hosted on homegrown or commercial CDNs, and so enabling SPDY on those domains will be a key contributor to SPDY adoption.&lt;/li&gt;

    &lt;li&gt;Serving root domains of such sites over SPDY may not help, but serving those resource intensive domains over SPDY might.&lt;/li&gt;

    &lt;li&gt;Undoing some or all of the domain sharding via SPDY capable domains will be necessary to take advantage of SPDY. This is because SPDY requires one connection per domain, and domain sharding may force the browser into making multiple connections to the same host.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Note that my tests are not scientific and my sample size is tiny. Caveat emptor!&lt;/p&gt;

&lt;div id="yahoo"&gt;&lt;/div&gt;
&lt;div id="bbc"&gt;&lt;/div&gt;
&lt;div id="cnn"&gt;&lt;/div&gt;
&lt;div id="nytimes"&gt;&lt;/div&gt;
&lt;div id="linkedin"&gt;&lt;/div&gt;
&lt;div id="ebay"&gt;&lt;/div&gt;
&lt;div id="twitter"&gt;&lt;/div&gt;

&lt;script type="text/javascript"&gt;

    var yahoo = {"cols":[{"id":"","label":"Domain","pattern":"","type":"string"},{"id":"","label":"No of resources","pattern":"","type":"number"},{"id":"","label":"Average blocked msec","pattern":"","type":"number"}],"rows":[{"c":[{"v":"l.yimg.com","f":null},{"v":26,"f":null},{"v":1284,"f":null}]},{"c":[{"v":"l1.yimg.com","f":null},{"v":5,"f":null},{"v":964,"f":null}]},{"c":[{"v":"l2.yimg.com","f":null},{"v":6,"f":null},{"v":606,"f":null}]},{"c":[{"v":"l3.yimg.com","f":null},{"v":5,"f":null},{"v":27,"f":null}]},{"c":[{"v":"mi.adinterax.com","f":null},{"v":5,"f":null},{"v":12,"f":null}]},{"c":[{"v":"ad.yieldmanager.com","f":null},{"v":2,"f":null},{"v":4,"f":null}]},{"c":[{"v":"tr.adinterax.com","f":null},{"v":4,"f":null},{"v":0,"f":null}]},{"c":[{"v":"blank","f":null},{"v":3,"f":null},{"v":0,"f":null}]},{"c":[{"v":"a1.interclick.com","f":null},{"v":2,"f":null},{"v":0,"f":null}]},{"c":[{"v":"static.ak.facebook.com","f":null},{"v":2,"f":null},{"v":0,"f":null}]},{"c":[{"v":"news.yahoo.com","f":null},{"v":1,"f":null},{"v":0,"f":null}]},{"c":[{"v":"ar.voicefive.com","f":null},{"v":1,"f":null},{"v":0,"f":null}]},{"c":[{"v":"view.atdmt.com","f":null},{"v":1,"f":null},{"v":0,"f":null}]},{"c":[{"v":"connect.facebook.net","f":null},{"v":1,"f":null},{"v":0,"f":null}]},{"c":[{"v":"us.bc.yahoo.com","f":null},{"v":1,"f":null},{"v":0,"f":null}]},{"c":[{"v":"csc.beap.bc.yahoo.com","f":null},{"v":1,"f":null},{"v":0,"f":null}]},{"c":[{"v":"bs.serving-sys.com","f":null},{"v":1,"f":null},{"v":0,"f":null}]},{"c":[{"v":"s-static.ak.facebook.com","f":null},{"v":1,"f":null},{"v":0,"f":null}]},{"c":[{"v":"www.facebook.com","f":null},{"v":1,"f":null},{"v":0,"f":null}]},{"c":[{"v":"rma-api.gravity.com","f":null},{"v":1,"f":null},{"v":0,"f":null}]}],"p":null};
    draw('yahoo', yahoo, 'http://www.yahoo.com');
    var bbc = {"cols":[{"id":"","label":"Domain","pattern":"","type":"string"},{"id":"","label":"No of resources","pattern":"","type":"number"},{"id":"","label":"Average blocked msec","pattern":"","type":"number"}],"rows":[{"c":[{"v":"static.bbci.co.uk","f":null},{"v":40,"f":null},{"v":3276,"f":null}]},{"c":[{"v":"newsimg.bbc.co.uk","f":null},{"v":2,"f":null},{"v":726,"f":null}]},{"c":[{"v":"ad.doubleclick.net","f":null},{"v":9,"f":null},{"v":0,"f":null}]},{"c":[{"v":"ichef.bbci.co.uk","f":null},{"v":7,"f":null},{"v":0,"f":null}]},{"c":[{"v":"node1.bbcimg.co.uk","f":null},{"v":3,"f":null},{"v":0,"f":null}]},{"c":[{"v":"s0.2mdn.net","f":null},{"v":3,"f":null},{"v":0,"f":null}]},{"c":[{"v":"www.bbc.co.uk","f":null},{"v":2,"f":null},{"v":0,"f":null}]},{"c":[{"v":"ds.serving-sys.com","f":null},{"v":2,"f":null},{"v":0,"f":null}]},{"c":[{"v":"b.scorecardresearch.com","f":null},{"v":2,"f":null},{"v":0,"f":null}]},{"c":[{"v":"js.revsci.net","f":null},{"v":1,"f":null},{"v":0,"f":null}]},{"c":[{"v":"www.googletagservices.com","f":null},{"v":1,"f":null},{"v":0,"f":null}]},{"c":[{"v":"sa.bbc.co.uk","f":null},{"v":1,"f":null},{"v":0,"f":null}]},{"c":[{"v":"bs.serving-sys.com","f":null},{"v":1,"f":null},{"v":0,"f":null}]},{"c":[{"v":"js.dmtry.com","f":null},{"v":1,"f":null},{"v":0,"f":null}]},{"c":[{"v":"log.dmtry.com","f":null},{"v":1,"f":null},{"v":0,"f":null}]},{"c":[{"v":"pix04.revsci.net","f":null},{"v":1,"f":null},{"v":0,"f":null}]},{"c":[{"v":"sa.bbc.com","f":null},{"v":1,"f":null},{"v":0,"f":null}]},{"c":[{"v":"survey.112.2o7.net","f":null},{"v":1,"f":null},{"v":0,"f":null}]},{"c":[{"v":"secure-us.imrworldwide.com","f":null},{"v":1,"f":null},{"v":0,"f":null}]},{"c":[{"v":"me-cdn.effectivemeasure.net","f":null},{"v":1,"f":null},{"v":0,"f":null}]},{"c":[{"v":"www9.effectivemeasure.net","f":null},{"v":1,"f":null},{"v":0,"f":null}]}],"p":null};
    draw('bbc', bbc, 'http://bbc.co.uk');
    var cnn = {"cols":[{"id":"","label":"Domain","pattern":"","type":"string"},{"id":"","label":"No of resources","pattern":"","type":"number"},{"id":"","label":"Average blocked msec","pattern":"","type":"number"}],"rows":[{"c":[{"v":"i2.cdn.turner.com","f":null},{"v":23,"f":null},{"v":8472,"f":null}]},{"c":[{"v":"static.ak.fbcdn.net","f":null},{"v":7,"f":null},{"v":2357,"f":null}]},{"c":[{"v":"z.cdn.turner.com","f":null},{"v":3,"f":null},{"v":2329,"f":null}]},{"c":[{"v":"i.cdn.turner.com","f":null},{"v":35,"f":null},{"v":302,"f":null}]},{"c":[{"v":"ads.cnn.com","f":null},{"v":12,"f":null},{"v":0,"f":null}]},{"c":[{"v":"external.ak.fbcdn.net","f":null},{"v":4,"f":null},{"v":0,"f":null}]},{"c":[{"v":"www.cnn.com","f":null},{"v":2,"f":null},{"v":0,"f":null}]},{"c":[{"v":"cnn.com","f":null},{"v":1,"f":null},{"v":0,"f":null}]},{"c":[{"v":"content.dl-rms.com","f":null},{"v":1,"f":null},{"v":0,"f":null}]},{"c":[{"v":"icompass.insightexpressai.com","f":null},{"v":1,"f":null},{"v":0,"f":null}]},{"c":[{"v":"ad.insightexpressai.com","f":null},{"v":1,"f":null},{"v":0,"f":null}]},{"c":[{"v":"js.revsci.net","f":null},{"v":1,"f":null},{"v":0,"f":null}]},{"c":[{"v":"turnerbroadcastingsy.tt.omtrdc.net","f":null},{"v":1,"f":null},{"v":0,"f":null}]},{"c":[{"v":"www.facebook.com","f":null},{"v":1,"f":null},{"v":0,"f":null}]}],"p":null};
    draw('cnn', cnn, 'http://www.cnn.com');
    var linkedin = {"cols":[{"id":"","label":"Domain","pattern":"","type":"string"},{"id":"","label":"No of resources","pattern":"","type":"number"},{"id":"","label":"Average blocked msec","pattern":"","type":"number"}],"rows":[{"c":[{"v":"m4.licdn.com","f":null},{"v":14,"f":null},{"v":1295,"f":null}]},{"c":[{"v":"cdn.slidesharecdn.com","f":null},{"v":3,"f":null},{"v":915,"f":null}]},{"c":[{"v":"m3.licdn.com","f":null},{"v":11,"f":null},{"v":359,"f":null}]},{"c":[{"v":"ad.doubleclick.net","f":null},{"v":3,"f":null},{"v":35,"f":null}]},{"c":[{"v":"cdn.widgetserver.com","f":null},{"v":10,"f":null},{"v":19,"f":null}]},{"c":[{"v":"www.google-analytics.com","f":null},{"v":5,"f":null},{"v":1,"f":null}]},{"c":[{"v":"s4.licdn.com","f":null},{"v":8,"f":null},{"v":0,"f":null}]},{"c":[{"v":"public.liss.slidesharecdn.com","f":null},{"v":8,"f":null},{"v":0,"f":null}]},{"c":[{"v":"www.linkedin.com","f":null},{"v":7,"f":null},{"v":0,"f":null}]},{"c":[{"v":"static01.linkedin.com","f":null},{"v":6,"f":null},{"v":0,"f":null}]},{"c":[{"v":"s3.licdn.com","f":null},{"v":5,"f":null},{"v":0,"f":null}]},{"c":[{"v":"static02.linkedin.com","f":null},{"v":5,"f":null},{"v":0,"f":null}]},{"c":[{"v":"cdn.lmodules.com","f":null},{"v":3,"f":null},{"v":0,"f":null}]},{"c":[{"v":"b.scorecardresearch.com","f":null},{"v":3,"f":null},{"v":0,"f":null}]},{"c":[{"v":"blank","f":null},{"v":2,"f":null},{"v":0,"f":null}]},{"c":[{"v":"pixel.quantserve.com","f":null},{"v":2,"f":null},{"v":0,"f":null}]},{"c":[{"v":"files.widgetbox.com","f":null},{"v":2,"f":null},{"v":0,"f":null}]},{"c":[{"v":"www.widgetserver.com","f":null},{"v":1,"f":null},{"v":0,"f":null}]},{"c":[{"v":"media03.linkedin.com","f":null},{"v":1,"f":null},{"v":0,"f":null}]},{"c":[{"v":"media01.linkedin.com","f":null},{"v":1,"f":null},{"v":0,"f":null}]},{"c":[{"v":"t.widgetserver.com","f":null},{"v":1,"f":null},{"v":0,"f":null}]},{"c":[{"v":"secure-us.imrworldwide.com","f":null},{"v":1,"f":null},{"v":0,"f":null}]},{"c":[{"v":"edge.quantserve.com","f":null},{"v":1,"f":null},{"v":0,"f":null}]},{"c":[{"v":"img.widgetbox.com","f":null},{"v":1,"f":null},{"v":0,"f":null}]}],"p":null};
    draw('linkedin', linkedin, 'http://www.linkedin.com');
    var ebay = {"cols":[{"id":"","label":"Domain","pattern":"","type":"string"},{"id":"","label":"No of resources","pattern":"","type":"number"},{"id":"","label":"Average blocked msec","pattern":"","type":"number"}],"rows":[{"c":[{"v":"thumbs1.ebaystatic.com","f":null},{"v":7,"f":null},{"v":678,"f":null}]},{"c":[{"v":"srx.main.ebayrtm.com","f":null},{"v":7,"f":null},{"v":1,"f":null}]},{"c":[{"v":"rover.ebay.com","f":null},{"v":3,"f":null},{"v":1,"f":null}]},{"c":[{"v":"ebay-stories.com","f":null},{"v":2,"f":null},{"v":1,"f":null}]},{"c":[{"v":"p.ebaystatic.com","f":null},{"v":10,"f":null},{"v":0,"f":null}]},{"c":[{"v":"thumbs4.ebaystatic.com","f":null},{"v":6,"f":null},{"v":0,"f":null}]},{"c":[{"v":"ir.ebaystatic.com","f":null},{"v":6,"f":null},{"v":0,"f":null}]},{"c":[{"v":"rtm.ebaystatic.com","f":null},{"v":6,"f":null},{"v":0,"f":null}]},{"c":[{"v":"pics.ebaystatic.com","f":null},{"v":5,"f":null},{"v":0,"f":null}]},{"c":[{"v":"thumbs2.ebaystatic.com","f":null},{"v":4,"f":null},{"v":0,"f":null}]},{"c":[{"v":"q.ebaystatic.com","f":null},{"v":4,"f":null},{"v":0,"f":null}]},{"c":[{"v":"thumbs3.ebaystatic.com","f":null},{"v":3,"f":null},{"v":0,"f":null}]},{"c":[{"v":"pages.ebay.com","f":null},{"v":3,"f":null},{"v":0,"f":null}]},{"c":[{"v":"gh.ebaystatic.com","f":null},{"v":2,"f":null},{"v":0,"f":null}]},{"c":[{"v":"www.ebay.com","f":null},{"v":1,"f":null},{"v":0,"f":null}]}],"p":null};
    draw('ebay', ebay, 'http://www.ebay.com');    
    var twitter = {"cols":[{"id":"","label":"Domain","pattern":"","type":"string"},{"id":"","label":"No of resources","pattern":"","type":"number"},{"id":"","label":"Average blocked msec","pattern":"","type":"number"}],"rows":[{"c":[{"v":"si0.twimg.com","f":null},{"v":29,"f":null},{"v":3580,"f":null}]},{"c":[{"v":"api.twitter.com","f":null},{"v":11,"f":null},{"v":0,"f":null}]},{"c":[{"v":"twitter.com","f":null},{"v":3,"f":null},{"v":0,"f":null}]},{"c":[{"v":"ssl.google-analytics.com","f":null},{"v":2,"f":null},{"v":0,"f":null}]},{"c":[{"v":"image","f":null},{"v":1,"f":null},{"v":0,"f":null}]},{"c":[{"v":"blank","f":null},{"v":1,"f":null},{"v":0,"f":null}]}],"p":null};
    draw('twitter', twitter, 'https://twitter.com');    

    function draw(div, data, title) {
        var options = {
            width: 600, height: 300,
            title: title
        };

        var datatable = new google.visualization.DataTable(data);
        var view = new google.visualization.DataView(datatable);
        var rows = [];
        for(var i = 0; i &lt; Math.min(datatable.getNumberOfRows(), 5); i++) { rows.push(i);}
        view.setRows(rows);
        var chart = new google.visualization.BarChart(document.getElementById(div));
        chart.draw(view, options);
    }
&lt;/script&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/SubbuDotOrg?a=sWOtQjvEm_A:qlO4_iH18Ac:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SubbuDotOrg?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/SubbuDotOrg?a=sWOtQjvEm_A:qlO4_iH18Ac:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SubbuDotOrg?i=sWOtQjvEm_A:qlO4_iH18Ac:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/SubbuDotOrg?a=sWOtQjvEm_A:qlO4_iH18Ac:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SubbuDotOrg?i=sWOtQjvEm_A:qlO4_iH18Ac:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SubbuDotOrg/~4/sWOtQjvEm_A" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.subbu.org/blog/2012/06/want-spdy#comments" thr:count="10" />
		<link rel="replies" type="application/atom+xml" href="http://www.subbu.org/blog/2012/06/want-spdy/feed/atom" thr:count="10" />
		<thr:total>10</thr:total>
	<feedburner:origLink>http://www.subbu.org/blog/2012/06/want-spdy</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Subbu Allamaraju</name>
						<uri>http://www.subbu.org</uri>
					</author>
		<title type="html"><![CDATA[Code Coverage Games]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SubbuDotOrg/~3/upafNYTAEcg/code-coverage" />
		<id>http://www.subbu.org/?p=1846</id>
		<updated>2012-05-07T20:33:38Z</updated>
		<published>2012-05-07T20:28:00Z</published>
		<category scheme="http://www.subbu.org" term="Uncategorized" />		<summary type="html"><![CDATA[You can easily game this. But not this.]]></summary>
		<content type="html" xml:base="http://www.subbu.org/blog/2012/05/code-coverage">&lt;p&gt;&lt;/p&gt;You can easily game this.

&lt;a href="http://wp.subbu.org/wp-content/uploads/2012/05/code-coverage3.png"&gt;&lt;img src="http://wp.subbu.org/wp-content/uploads/2012/05/code-coverage3.png" alt="" title="code-coverage" width="304" height="108" class="alignnone size-full wp-image-1859" /&gt;&lt;/a&gt;

But not this.

&lt;a href="http://wp.subbu.org/wp-content/uploads/2012/05/test-coverage.png"&gt;&lt;img src="http://wp.subbu.org/wp-content/uploads/2012/05/test-coverage.png" alt="" title="test-coverage" width="241" height="172" class="alignnone size-full wp-image-1848" /&gt;&lt;/a&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/SubbuDotOrg?a=upafNYTAEcg:eO611AHKiH0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SubbuDotOrg?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/SubbuDotOrg?a=upafNYTAEcg:eO611AHKiH0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SubbuDotOrg?i=upafNYTAEcg:eO611AHKiH0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/SubbuDotOrg?a=upafNYTAEcg:eO611AHKiH0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SubbuDotOrg?i=upafNYTAEcg:eO611AHKiH0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SubbuDotOrg/~4/upafNYTAEcg" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.subbu.org/blog/2012/05/code-coverage#comments" thr:count="4" />
		<link rel="replies" type="application/atom+xml" href="http://www.subbu.org/blog/2012/05/code-coverage/feed/atom" thr:count="4" />
		<thr:total>4</thr:total>
	<feedburner:origLink>http://www.subbu.org/blog/2012/05/code-coverage</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Subbu Allamaraju</name>
						<uri>http://www.subbu.org</uri>
					</author>
		<title type="html"><![CDATA[Protocols vs Styles]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SubbuDotOrg/~3/8rSIFmofl0w/protocols-vs-styles" />
		<id>http://www.subbu.org/?p=1817</id>
		<updated>2012-05-03T03:41:19Z</updated>
		<published>2012-04-29T06:21:24Z</published>
		<category scheme="http://www.subbu.org" term="Uncategorized" />		<summary type="html"><![CDATA[My RESTful Web Services Cookbook has been out for nearly 26 months. From Feb 2010 till the end of 2011, O&#8217;Reilly sold 13,052 copies (both print and eBook format combined, per the royalty statements received to date) of this book. Given that O&#8217;Reilly&#8217;s eBooks are DRM free, I would like to think that several thousands [...]]]></summary>
		<content type="html" xml:base="http://www.subbu.org/blog/2012/04/protocols-vs-styles">&lt;p&gt;&lt;/p&gt;&lt;p&gt;My &lt;a href="http://shop.oreilly.com/product/9780596801694.do"&gt;RESTful Web Services Cookbook&lt;/a&gt; has been out for nearly 26 months. From Feb 2010 till the end of 2011, O&amp;#8217;Reilly sold 13,052 copies (both print and eBook format combined, per the royalty statements received to date) of this book. Given that O&amp;#8217;Reilly&amp;#8217;s eBooks are DRM free, I would like to think that several thousands more copies were downloaded for free on torrent sites, but there is no way to know.&lt;/p&gt;

&lt;a href="http://shop.oreilly.com/product/9780596801694.do"&gt;&lt;img src="http://akamaicovers.oreilly.com/images/9780596801694/cat.gif"/&gt;&lt;/a&gt;

&lt;p&gt;Writing this book was a painful exercise. I spent most of 2009 writing the drafts &amp;#8211; at that time Yahoo allowed me to spend about 20% of my time for nearly 4 months to write the first draft (for which they own the copyright of the book). It was painful because REST was about style. Not having seen all aspects of the style work in reality, I was not fully convinced about parts of the style. Separating style from protocols was a time consuming yet learning exercise. How could I say that following such and such &lt;a href="http://roy.gbiv.com/untangled/"&gt;Roy Fielding&lt;/a&gt;&amp;#8217;s constraint leads to evolvability without dissecting evolvability into concrete details? The last thing I wanted was to write a book that paints a nice picture with the benefits one would get out of REST without discussing the specifics. I wanted to avoid handwaving at all cost.&lt;/p&gt;

&lt;p&gt;In these two years, I changed quite a bit. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I no longer actively engage myself in discussions about REST.&lt;/li&gt;
&lt;li&gt;I unsubscribed out of &lt;a href="http://tech.groups.yahoo.com/group/rest-discuss/"&gt;rest-discuss&lt;/a&gt; in 2011.&lt;/li&gt;
&lt;li&gt;I don&amp;#8217;t even subscribe to Roy&amp;#8217;s idea that &lt;a href="http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven"&gt;REST APIs must be hypertext-driven&lt;/a&gt; or that &amp;#8220;A REST API should spend almost all of its descriptive effort in defining the media types&amp;#8221;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What I learned in these two years were the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Don&amp;#8217;t confuse styles with protocols.&lt;/li&gt;
&lt;li&gt;Understand what you are going to interoperate with and make tradeoffs as necessary.&lt;/li&gt;
&lt;li&gt;Interoperating between style deviations is more important than arguing for style adherence.&lt;/li&gt;
&lt;li&gt;Interoperability is partly a protocol problem and partly a software problem.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Architecture styles are guides, but protocols specify rules. Roy&amp;#8217;s REST codifies (to some extent reverse-engineeres) the Web into a set of constraints. Constaints are what they are &amp;#8211; guides sans context. They are subject to tradeoffs. They postulate benefits when applied. But protocols are different. They set ground rules for different systems to work together. Just like you don&amp;#8217;t start driving on the left side of the road (in the US), you don&amp;#8217;t break TCP or HTTP&amp;#8217;s messaging formats. When you break such protocols, you prevent networked systems from working together.&lt;/p&gt;

&lt;p&gt;But we tend to mistake the style (i.e, REST) for the protocols. I made that mistake several times (shame on me!) in the past, and I still see it being made. I took care to avoid this while writing the book, but I may not have succeeded fully. Strong belief in a style often leads to zealotry. This is no different from the zealotry we see in socio-political debates. &lt;/p&gt;

&lt;p&gt;Yet not all Protocols are the same. I tend to view protocols making up a pyramid. Where a protocol stays in this pyramid shows how widely it helps interoperability.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    /\
   /  \
  /    \
 /______\
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Towards the bottom are protocols that strive for the widest range of interoperability possible. TCP is an example. HTTP is another example. As you go up the pyramid, the amount of relevance and influence a protocol carries becomes narower. For instance, I would keep RFC 2616 towards the bottom of the pyramid, but an RFC like 5023 (&lt;a href="http://tools.ietf.org/html/rfc5023"&gt;AtomPub&lt;/a&gt;) towards the top. AtomPub&amp;#8217;s reign of influence was limited then and is even now. I would similarly place a media type like &lt;code&gt;application/json&lt;/code&gt; towards the bottom, and a type like &lt;code&gt;application/my-grand-fathers-facebook-profile+json&lt;/code&gt; at the top. A perspective of where a protocol belongs in this pyramid certainly helps ration energy. &lt;/p&gt;

&lt;p&gt;So, would I write this book differently now? I certainly would. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I would change the title to something along the lines of &amp;#8220;Recipes to Build Client Server Apps Using Web Protocols&amp;#8221;, though the editor might ask me to change to include some current trending words.&lt;/li&gt;
&lt;li&gt;I would emphasize even more on protocols.&lt;/li&gt;
&lt;li&gt;I would cut down or clearly demarcate the parts of the book that suggested design styles (such as designing formats).&lt;/li&gt;
&lt;li&gt;I would spend a big chunk on how to interopere without necessarily agreeing on the style.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you&amp;#8217;ve read my book, and built some interoperable Web based systems, you might come to the same conclusion as I did. If that happens, I count my book as a success.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/SubbuDotOrg?a=8rSIFmofl0w:bdZqWTO3YKs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SubbuDotOrg?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/SubbuDotOrg?a=8rSIFmofl0w:bdZqWTO3YKs:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SubbuDotOrg?i=8rSIFmofl0w:bdZqWTO3YKs:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/SubbuDotOrg?a=8rSIFmofl0w:bdZqWTO3YKs:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SubbuDotOrg?i=8rSIFmofl0w:bdZqWTO3YKs:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SubbuDotOrg/~4/8rSIFmofl0w" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.subbu.org/blog/2012/04/protocols-vs-styles#comments" thr:count="48" />
		<link rel="replies" type="application/atom+xml" href="http://www.subbu.org/blog/2012/04/protocols-vs-styles/feed/atom" thr:count="48" />
		<thr:total>48</thr:total>
	<feedburner:origLink>http://www.subbu.org/blog/2012/04/protocols-vs-styles</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Subbu Allamaraju</name>
						<uri>http://www.subbu.org</uri>
					</author>
		<title type="html"><![CDATA[Node.js &#8211; Cost of IPC]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SubbuDotOrg/~3/Ar9Ne7hkj_g/node-js-cost-of-ipc" />
		<id>http://www.subbu.org/?p=1802</id>
		<updated>2012-03-23T17:52:06Z</updated>
		<published>2012-03-23T17:40:47Z</published>
		<category scheme="http://www.subbu.org" term="Uncategorized" />		<summary type="html"><![CDATA[I ran a quick test to quantify the cost of IPC between workers and the master in a node.js cluster. The test code is below (which I borrowed from node&#8217;s docs). On receiving an HTTP request, each worker process sends a message to the master. I ran three variations &#8211; no messages, send one message, [...]]]></summary>
		<content type="html" xml:base="http://www.subbu.org/blog/2012/03/node-js-cost-of-ipc">&lt;p&gt;&lt;/p&gt;I ran a quick test to quantify the cost of IPC between workers and the master in a node.js cluster. The test code is below (which I borrowed from node&amp;#8217;s &lt;a href="http://nodejs.org/docs/v0.6.12/api/cluster.html"&gt;docs&lt;/a&gt;).

&lt;!-- more --&gt;

&lt;script src="https://gist.github.com/2172946.js"&gt; &lt;/script&gt;

On receiving an HTTP request, each worker process sends a message to the master. I ran three variations &amp;#8211; no messages, send one message, and send 5 messages. 

1. Don&amp;#8217;t send a message.

&lt;script src="https://gist.github.com/2172713.js?file=gistfile1.txt"&gt;&lt;/script&gt;

2. Send one message per request

&lt;script src="https://gist.github.com/2172768.js?file=gistfile1.txt"&gt;&lt;/script&gt;

3. Send five messages per request

&lt;script src="https://gist.github.com/2172744.js?file=gistfile1.txt"&gt;&lt;/script&gt;

These are done on Ubuntu 11.04 on a quad-core Xeon box using node 0.6.12. 
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/SubbuDotOrg?a=Ar9Ne7hkj_g:576DRImCsGQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SubbuDotOrg?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/SubbuDotOrg?a=Ar9Ne7hkj_g:576DRImCsGQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SubbuDotOrg?i=Ar9Ne7hkj_g:576DRImCsGQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/SubbuDotOrg?a=Ar9Ne7hkj_g:576DRImCsGQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SubbuDotOrg?i=Ar9Ne7hkj_g:576DRImCsGQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SubbuDotOrg/~4/Ar9Ne7hkj_g" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.subbu.org/blog/2012/03/node-js-cost-of-ipc#comments" thr:count="13" />
		<link rel="replies" type="application/atom+xml" href="http://www.subbu.org/blog/2012/03/node-js-cost-of-ipc/feed/atom" thr:count="13" />
		<thr:total>13</thr:total>
	<feedburner:origLink>http://www.subbu.org/blog/2012/03/node-js-cost-of-ipc</feedburner:origLink></entry>
	</feed>
