<?xml version="1.0" encoding="UTF-8"?>
<!--Generated by Squarespace V5 Site Server v5.13.156 (http://www.squarespace.com) on Sun, 19 May 2013 19:50:34 GMT--><feed xmlns="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/"><title>Web Performance Matters</title><subtitle>Journal</subtitle><id>http://www.webperformancematters.com/journal/</id><link rel="alternate" type="application/xhtml+xml" href="http://www.webperformancematters.com/journal/"/><link rel="self" type="application/atom+xml" href="http://www.webperformancematters.com/journal/atom.xml"/><updated>2010-07-14T21:11:44Z</updated><generator uri="http://five.squarespace.com/" version="Squarespace V5 Site Server v5.13.156 (http://www.squarespace.com)">Squarespace</generator><entry><title>Generalizing The Apdex Standard [2]</title><category term="Blogs and Publications"/><category term="Metrics"/><category term="Reporting on Performance"/><category term="Standards (Apdex, ITIL, etc.)"/><id>http://www.webperformancematters.com/journal/2010/7/14/generalizing-the-apdex-standard-2.html</id><link rel="alternate" type="text/html" href="http://www.webperformancematters.com/journal/2010/7/14/generalizing-the-apdex-standard-2.html"/><author><name>Chris Loosley</name></author><published>2010-07-14T20:37:58Z</published><updated>2010-07-14T20:37:58Z</updated><content type="html" xml:lang="en-US"><![CDATA[<span class="PageIllustration" ><img title="Apdex Logo" alt="Illustration: Apdex Logo" src="http://www.webperformancematters.com/storage/post-graphics/Apdex-Logo.JPG" /></span>

<p>Today the <a class="offsite-link-inline" href="http://apdex.org/specs.html">Apdex specification</a> is entirely focused on application response time. Its first paragraph defines Apdex as “a method for calculating and reporting a metric of transactional application response time in the form of an index with a value of 0 to 1.” But in reality, the Apdex method has much wider applicability. A more appropriate description might be the general statement that <em>Apdex is a metric that reflects the degree to which a set of performance measurements achieves designated targets</em>.

<p>The idea of generalizing the Apdex standard has been discussed periodically within the Apdex community. To turn those discussions from an abstract idea into a concrete proposal, I’m writing a series of posts on the <a class="offsite-link-inline" href="http://apdex.org/blog/">Apdex Exchange</a> blog. Posts to date are:</p>

<ul>
<li><a class="offsite-link-inline" href="http://apdex.org/blog/?p=178">Generalizing Apdex</a></li>
<li><a class="offsite-link-inline" href="http://apdex.org/blog/?p=221">Core Apdex Qualities</a></li>
<li><a class="offsite-link-inline" href="http://apdex.org/blog/?p=259">Metrics and Performance Indicators: A Bibliography</a></li>
<li><a class="offsite-link-inline" href="http://apdex.org/blog/?p=630">Apdex as a (Key) Performance Indicator</a></li>
<li><a class="offsite-link-inline" href="http://apdex.org/blog/?p=710">An Extensible Apdex Glossary</a></li>
<li><a class="offsite-link-inline" href="http://apdex.org/blog/?p=855">Which Apdex Features Can Be Generalized?</a></li>
<li><a class="offsite-link-inline" href="http://apdex.org/blog/?p=1009">Generalizing the Apdex Language</a></li>
<li><a class="offsite-link-inline" href="http://apdex.org/blog/?p=920">Separately Configurable Thresholds in Apdex-G</a></li>
<li><a class="offsite-link-inline" href="http://apdex.org/blog/?p=1154">Apdex Specification Templates</a></li>
</ul>

<p>Planned posts will address the issues of:</p>

<ul>
<li class="part2">Configurable Zone Alignment</li>
<li class="part4">Configurable Scoring</li>
<li class="part5">Configurable Reporting</li>
<li class="part5">Configurable Rating Bands</li>
</ul>

<h3>Contribute Your Input</h3>

<p>If you’ve ever used Apdex, or thought about how it could be used, consider contributing your own thoughts in the comments on the <a class="offsite-link-inline" href="http://apdex.org/blog/">Apdex Exchange</a> blog. I will definitely reply, and also take your input into account as I draft a new generalized Apdex specification. The result will be much more authoritative if it reflects the consensus view of people who want to apply the Apdex method for reporting in their own organizations.</p>]]></content></entry><entry><title>Apdex as a (Key) Performance Indicator</title><category term="Blogs and Publications"/><category term="Metrics"/><category term="Reporting on Performance"/><category term="Standards (Apdex, ITIL, etc.)"/><id>http://www.webperformancematters.com/journal/2010/6/28/apdex-as-a-key-performance-indicator.html</id><link rel="alternate" type="text/html" href="http://www.webperformancematters.com/journal/2010/6/28/apdex-as-a-key-performance-indicator.html"/><author><name>Chris Loosley</name></author><published>2010-06-28T23:45:00Z</published><updated>2010-06-28T23:45:00Z</updated><content type="html" xml:lang="en-US"><![CDATA[<span class="PageIllustration" ><img title="Apdex Logo" alt="Illustration: Apdex Logo" src="http://www.webperformancematters.com/storage/post-graphics/Apdex-Logo.JPG" /></span>

<p>On the <a class="offsite-link-inline" href="http://apdex.org/blog/">Apdex Exchange</a> blog, I’m writing a series of posts about <em>Generalizing The Apdex Standard</em>. The ideas I developed (together with any public input) will evolve into a new draft of the Apdex specification. The latest post is on <a class="offsite-link-inline" href="http://apdex.org/blog/?p=630">Apdex as a (Key) Performance Indicator</a>. Here's a brief introduction:</p>

<h3>Metrics, Performance Indicators, and KPIs</h3>

<p>If you spend more than a few minutes learning about Key Performance Indicators, you will surely read words like these: <em>All KPIs are metrics, but not all metrics are KPIs</em>. Furthermore, for the adjective <em>Key</em> in "KPI" to have any real meaning, it must also be true that <em>not all performance indicators are KPIs</em>. Jonathan Becher writes:</p>

<blockquote>
While metrics can be a measure of just about anything, KPIs are the measures that matter most 
<p class="quoteSource">-- <a href=http://bit.ly/NhcFH">Cutter IT Journal Vol. 19 No. 4, April 2006, pp13-16</a></p>
</blockquote>

<p>So we have defined a three level hierarchy: metrics, performance indicators, and KPIs.</p> 

<p>An Apdex index is certainly a metric, and--based on the Apdex definition alone--it is also a performance indicator, because an Apdex score <em>indicates</em> the degree to which individual measurements of <em>actual performance</em> meet previously defined targets. This applies regardless of the data being summarized in the Apdex score. But can an Apdex index also be used as a <em>Key</em> Performance Indicator, or KPI?  The answer depends on how you define "KPI", a term with no single universally accepted meaning.</p> 

<p>Many authors have proposed definitions, so I evaluate Apdex against a list of proposed KPI characteristics found in the articles and papers I listed in my <a class="offsite-link-inline" href="http://apdex.org/blog/?p=259">metrics bibliography</a>. For the details, read my post on the <a class="offsite-link-inline" href="http://apdex.org/blog/?p=630">Apdex Exchange</a> blog.</p> 


<h3>Contribute Your Input</h3>

<p>The first three posts in the series are:</p>
<ul>
<li><a class="offsite-link-inline" href="http://apdex.org/blog/?p=178/">Generalizing Apdex</a></li>
<li><a class="offsite-link-inline" href="http://apdex.org/blog/?p=221">Core Apdex Qualities</a></li>
<li><a class="offsite-link-inline" href="http://apdex.org/blog/?p=259">Metrics and Performance Indicators: A Bibliography</a></li>
</ul>

<p>If you’ve ever used Apdex, or thought about how it could be used, consider contributing your own thoughts in the comments on the <a class="offsite-link-inline" href="http://apdex.org/blog/">Apdex Exchange</a> blog. I will definitely reply, and also take your input into account as I draft a new generalized Apdex specification. The result will be much more authoritative if it reflects the consensus view of people who want to apply the Apdex method for reporting in their own organizations.</p>]]></content></entry><entry><title>Measuring Mobile Web Sites</title><category term="Blogs and Publications"/><category term="Measuring Performance"/><category term="Performance and Usability "/><category term="Standards (Apdex, ITIL, etc.)"/><category term="Web Analytics"/><id>http://www.webperformancematters.com/journal/2010/6/14/measuring-mobile-web-sites.html</id><link rel="alternate" type="text/html" href="http://www.webperformancematters.com/journal/2010/6/14/measuring-mobile-web-sites.html"/><author><name>Chris Loosley</name></author><published>2010-06-14T07:01:03Z</published><updated>2010-06-14T07:01:03Z</updated><content type="html" xml:lang="en-US"><![CDATA[<span class="PageIllustration" ><img title="Web Analytics Report" alt="Illustration: Web Analytics Report" src="http://www.webperformancematters.com/storage/post-graphics/Web analytics.JPG" /></span>

<p>The methods commonly used to measure Web sites often don't work for mobile sites, because of differences among mobile platforms and devices. The biggest obstacles are lack of support on mobile devices for <em>Cookies</em>, <em>JavaScript</em>, and <em>client IP addresses</em>.</p>

<p>The Wikipedia article on <a class="offsite-link-inline" href="http://en.wikipedia.org/wiki/Mobile_Web_Analytics">Mobile Web Analytics</a> provides a succinct introduction to these and other challenges -- see the section on "Problems with tracking visitors, visits and clickpaths in the Mobile Web". Because of these limitations, the tagging methods used by traditional Web analytics tools do not work on most mobile devices.</p>

<p>While researching this subject, I discovered <a class="offsite-link-inline" href="http://www.kaizen-analytics.com/">Kaizen Analytics</a>, an excellent blog by Michael Notté. In a recent post, Michael provides a useful overview -- see <a class="offsite-link-inline" href="http://bit.ly/9POk1U">Mobile Analytics: vertical-specific vs. traditional Web Analytics solutions</a>. Michael points out that there are other ways to collect data about mobile Web sites. He outlines four solution approaches, illustrating each with a helpful diagram, reproduced below:</p>

<div class="full-image-float-right"><img title="Mobile analytics: log-server based solution. Image by Michael Notté." alt="Mobile analytics: log-server based solution" src="http://www.webperformancematters.com/storage/post-graphics/Michael%20Notte%20mobile_analytics_log_files.png" /></div>

<div class="full-image-float-right"><img title="Mobile analytics: packet sniffing based solution. Image by Michael Notté." alt="Mobile analytics: packet sniffing based solution" border="0" height="152" src="http://www.webperformancematters.com/storage/post-graphics/Michael%20Notte%20mobile_analytics_packet_sniffing.png" /></div>

<div class="full-image-float-right"><img title="Mobile analytics: tag-based solution. Image by Michael Notté." alt="Mobile analytics: tag-based solution" border="0" height="147" src="http://www.webperformancematters.com/storage/post-graphics/Michael%20Notte%20mobile_analytics_image_tag.png"/></div>

<div class="full-image-float-right"><img border="0" height="141" title="Mobile analytics: server script solution. Image by Michael Notté." alt="Mobile analytics: server script solution" src="http://www.webperformancematters.com/storage/post-graphics/Michael%20Notte%20mobile_analytics_server_script.png" /></div>

<ul>
<li><b>Server log-based:</b> Process the raw data coming from your web server. Michael recommends ignoring this one unless you are a geek with spare time on your hands.</li>

<li><b>Packet sniffing:</b> A device is added between your server and the Web. It listens and analyzes requests sent and received by the server. This method does not require adding any tags to the page content, but does involve installing additional hardware and/or software in (all) datacenter(s) serving content to be tracked. This may present scalability challenges for large sites.</li>

<li><b>Image tag-based:</b> Each time a page is rendered, the client device sends tracking data to a collector server using an image request that has parameters in the querystring. These tracking parameters can be set dynamically by the server when the content is generated. This method is easy to implement, but has limitations, and can not be used for event tracking.</li>

<li><b>Server-side script:</b> A script is added on server side that sends data directly to a collector server when requests are processed. By extracting data from requests and content received at the server, this method avoids the complications of sending tracking data from diverse mobile device platforms. According to Michael, this solution is gaining popularity among traditional Web Analytics vendors.</li>
</ul>
<div class="clearBoth"></div>

<p>These helpful diagrams caught my eye, because they are closely related to another current project of mine -- organizing a Webinar on June 30 for the Apdex Alliance on <em>Choosing Application Performance Management (APM) Tools</em> [<a class="offsite-link-inline" href="http://apdex.org/blog/?p=595">details</a>; <a class="offsite-link-inline" href="https://apdex.invisionmeeting.com/register/vrwyrfx">register</a>].</p>

<p>In the Webinar, Peter Sevcik will describe a systematic framework for evaluating performance management tools--and a key component of that framework is the location of measurement devices. There are at least half a dozen places to collect data these days, extending all the way from server logs in the backend to scripts on the client device. </p>

<h3>Will performance and analytics tools converge?</h3>

<p>Performance management tools have traditionally been regarded as a separate market segment from from Web Analytics tools, because they were purchased by different people -- namely IT staff and Marketing/Business Management respectively. But as business becomes increasingly mobile, and tool vendors continue to merge and expand their portfolios, I expect to see these two separate segments evolve and become closer.</p>

<p>Both tool segments face a similar--in some cases, identical--challenge of needing to collect and consolidate data about customers in a networked world. And while site performance and customer behavior are different issues, which focus on different metrics, the ultimate reasons for tracking those metrics are closely related. I have written about that here before, see <a class="PMref" href="http://www.webperformancematters.com/journal/2005/11/9/the-dimensions-of-usability.html">The Dimensions of Usability</a>.</p>

<p>In preparation for his Webinar (and a report on performance management tools), Peter will be surveying tools vendors. I am interested to find out whether Peter sees any signs of performance management and analytics tools converging.]]></content></entry><entry><title>Choosing Performance Management Tools</title><category term="Events"/><category term="Measuring Performance"/><category term="Metrics"/><category term="Performance Management"/><category term="Reporting on Performance"/><category term="Software products"/><category term="Standards (Apdex, ITIL, etc.)"/><id>http://www.webperformancematters.com/journal/2010/6/11/choosing-performance-management-tools.html</id><link rel="alternate" type="text/html" href="http://www.webperformancematters.com/journal/2010/6/11/choosing-performance-management-tools.html"/><author><name>Chris Loosley</name></author><published>2010-06-11T07:01:24Z</published><updated>2010-06-11T07:01:24Z</updated><content type="html" xml:lang="en-US"><![CDATA[<span class="PageIllustration" ><img title="Apdex Logo" alt="Illustration: Apdex Logo" src="http://www.webperformancematters.com/storage/post-graphics/Apdex-Logo.JPG" /></span>

<p>With over 30 application performance management (APM) tool vendors offering scores of products, buyers face hundreds of confusing choices. Compounding the problem, the lack of a common taxonomy, or standard APM nomenclature, makes cross-vendor product comparisons especially challenging.</p>

<p>To address this challenge, <a class="offsite-link-inline" href="http://netforecast.com/">NetForecast</a> has developed an APM tools framework anyone can use to define APM requirements and map them to vendor offerings. On June 30 2010, <a class="offsite-link-inline" href="http://netforecast.com/biography%20Peter%20S.htm">Peter Sevcik</a> will describe this framework in a Webinar hosted by the <a class="offsite-link-inline" href="http://apdex.org/">Apdex Alliance</a>.</p>

<h3>Webinar details</h3>

<ul class="group">
<li><strong>Title: </strong>Choosing Application Performance Management (APM) Tools<l/i>
<li><strong>Date: </strong>Wed June 30, 2010<l/i>
<li><strong>Time: </strong>12:00 noon EDT (1 hour)</li>
<li><strong>Speaker: </strong>Peter Sevcik, NetForecast</li>
<li><strong>Register: </strong><a class="offsite-link-inline" href="https://apdex.invisionmeeting.com/register/vrwyrfx" target="_blank">https://apdex.invisionmeeting.com/register/vrwyrfx</a></li>
</ul>

<p> The APM framework is a comprehensive description of application management functions and features. Building on essential infrastructure management concepts, it provides a common nomenclature that makes it easy to compare APM tools. The framework also places Apdex elements in their appropriate contexts.</p>

<p>Good performance is delivered with tools that directly support APM processes and best practices. The APM framework lets you describe and prioritize the functions and features appropriate for your environment, and helps guide your APM strategy.</p>

<h3>Presentation outline</h3>

<ul class="group">
<li>Technique: How performance is measured</li>
<li>Location: Where performance is measured</li>
<li>Data: What information is gathered</li>
<li>Analysis: Making the data useful</li>
<li>Process: How the tool supports operations</li>
<li>Business: How the tool integrates with the business</li>
</ul>
 
<h3>Customizable product selection checklist</h3>

<p>As a Webinar attendee, you will receive an Excel tool to help you intelligently select the framework elements you need to create your own custom product selection checklist to evaluate APM tools. For example, you will be able to define the level of Apdex support you require. </p>

<p>Attend this Webinar before investing in your next performance management tool. Find out how to avoid decisions based on vendor hype, and select APM tools whose features match the needs of your enterprise.</p> 

<p><a class="offsite-link-inline" href="https://apdex.invisionmeeting.com/register/vrwyrfx" target="_blank">Register now</a>, bookmark the event, tune in on June 30, ask questions, or contribute comments!</p>

<h3>The Apdex standard</h3>

<p><a class="offsite-link-inline" href="http://apdex.org/overview.html">Apdex</a> (Application Performance Index) is an open standard that is a numerical measure of user satisfaction with the performance of enterprise applications. It converts many measurements into one number on a uniform scale of 0-to-1 (0 = no users satisfied, 1 = all users satisfied).</p>

<p>Properly implemented, Apdex enables an organization to link application performance to business needs. Apdex is supported by the <a class="offsite-link-inline" href="http://www.apdex.org/alliancefaq.html" >Apdex Alliance</a>, a group comprising software vendors who support the standard, and over 1000 supporting members who are applying the Apdex method today, or considering its use, in their organizations.</p>

<h3>Apdex Webinar program</h3>

<p>This event is the second in a series of educational Webinars by the Apdex Alliance. Apdex Webinars aim to address a variety of performance management topics, with an emphasis on how to apply the Apdex methodology. You can view the previous Webinar here:</p>

<ul class="group">
<li><a class="offsite-link-inline" href="http://apdex.org/blog/?p=564">Service Level Management with Apdex</a></li>
</ul> 

<p>Further events are currently planned in September and November. I will post announcements to future speakers and topics as they are confirmed.</p>]]></content></entry><entry><title>Service Level Management with Apdex</title><category term="Events"/><category term="Performance Management"/><category term="Reporting on Performance"/><category term="Standards (Apdex, ITIL, etc.)"/><id>http://www.webperformancematters.com/journal/2010/6/10/service-level-management-with-apdex.html</id><link rel="alternate" type="text/html" href="http://www.webperformancematters.com/journal/2010/6/10/service-level-management-with-apdex.html"/><author><name>Chris Loosley</name></author><published>2010-06-10T07:01:15Z</published><updated>2010-06-10T07:01:15Z</updated><content type="html" xml:lang="en-US"><![CDATA[<span class="PageIllustration" ><img title="Apdex Logo" alt="Illustration: Apdex Logo" src="http://www.webperformancematters.com/storage/post-graphics/Apdex-Logo.JPG" /></span>

<p>Service level management (SLM) is the art and science of keeping application services running properly once in production. The key to successful SLM is the ability to use <a class="offsite-link-inline" href="http://apdex.org/blog/?p=259" >metrics or performance indicators</a> that are linked to the business.</p>

<p><a class="offsite-link-inline" href="http://apdex.org/overview.html">Apdex</a> (Application Performance Index) is an open standard that is a numerical measure of user satisfaction with the performance of enterprise applications. It converts many measurements into one number on a uniform scale of 0-to-1 (0 = no users satisfied, 1 = all users satisfied).</p>

<p>Properly implemented, Apdex enables an organization to link application performance to business needs. Apdex is supported by the <a class="offsite-link-inline" href="http://www.apdex.org/alliancefaq.html" >Apdex Alliance</a>, a group comprising software vendors who support the standard, and over 1000 supporting members who are applying the Apdex method today, or considering its use, in their organizations.</p>

<h3>Webinar outline</h3>

<p>To find out how you can start using Apdex in your enterprise, check out a recent Apdex Alliance Webinar, <a class="offsite-link-inline" href="http://apdex.org/blog/?p=564">Service Level Management with Apdex</a> [slides and a recording]. The executive director of the Alliance, <a class="offsite-link-inline" href="http://www.netforecast.com/biography%20Peter%20S.htm">Peter Sevcik</a>, describes how the Apdex standard works, and shows why implementing the standard leads to effective service level management. Outline:</p>

<ul class="group">
	<li>Apdex Overview</li>
	<li>Defining Apdex Parameters</li>
	<li>Service Level Management Using Apdex</li>
	<li>Apdex SLM Case Studies</li>
</ul>

<p>The presentation is illustrated using case studies drawn from the Apdex community, and is followed by about 20 minutes of audience Q&A.<p>

<h3>Apdex Webinar program</h3>

<p>This event is the first of a series of educational Webinars planned by the Apdex Alliance. Apdex Webinars aim to address a variety of performance management topics, with an emphasis on how to apply the Apdex methodology. The second event in the series, <a class="offsite-link-inline" href="http://apdex.org/blog/?p=595">Choosing Application Performance Management (APM) Tools</a>, is planned for June 30, 2010, with further events planned for September and November. I'll follow up with posts about each Webinar as they are scheduled.</p>]]></content></entry><entry><title>Generalizing The Apdex Standard</title><category term="Apdex"/><category term="Blogs and Publications"/><category term="Metrics"/><category term="Reporting on Performance"/><category term="Standards (Apdex, ITIL, etc.)"/><category term="metrics performance indicators"/><category term="standard"/><id>http://www.webperformancematters.com/journal/2010/6/9/generalizing-the-apdex-standard.html</id><link rel="alternate" type="text/html" href="http://www.webperformancematters.com/journal/2010/6/9/generalizing-the-apdex-standard.html"/><author><name>Chris Loosley</name></author><published>2010-06-09T08:08:17Z</published><updated>2010-06-09T08:08:17Z</updated><content type="html" xml:lang="en-US"><![CDATA[<span class="PageIllustration" ><img title="Apdex Logo" alt="Illustration: Apdex Logo" src="http://www.webperformancematters.com/storage/post-graphics/Apdex-Logo.JPG" /></span>

<p>Today the <a class="offsite-link-inline" href="http://apdex.org/specs.html">Apdex specification</a> is entirely focused on application response time. Its first paragraph defines Apdex as “a method for calculating and reporting a metric of transactional application response time in the form of an index with a value of 0 to 1.”</p>

<p>But in reality, the Apdex method is much more widely applicable, and a more appropriate description is already spelled out in the first paragraph of the Wikipedia article on Apdex:</p>

<blockquote>
(Apdex) defines a standard method for reporting and comparing the performance of software applications in computing. Its purpose is to convert measurements into insights about user satisfaction, by specifying a uniform way to analyze and report on the degree to which measured performance meets user expectations.
<p class="quoteSource">-- <a class="offsite-link-inline" href="http://en.wikipedia.org/wiki/Apdex">Wikipedia article on Apdex</a>, June 8, 2010</p>
</blockquote>

<p>Over the years, the idea of generalizing the Apdex standard to apply in other domains has been discussed periodically within the Apdex community, but no progress has been made over the last 18 months. To revive those discussions, I’m writing a series of posts on the <a class="offsite-link-inline" href="http://apdex.org/blog/">Apdex Exchange</a> blog. Here’s my rough outline for exploring this subject matter:</p>

<ol class="group">
<li>Core Apdex qualities and/or features that apply across measurement and reporting domains</li>
<li>Features that can (and should) be generalized, and why</li>
<li>Ideas for implementing configuration options</li>
<li>Ensuring compatibility with existing standards, methods, and metrics</li>
<li>Targets, zones, scores, and thresholds</li>
</ol>

<p>Each of these topics will probably require more than one post; I’m still working on #1. The first three posts in the series are:</p>
<ul>
<li><a class="offsite-link-inline" href="http://apdex.org/blog/?p=178/">Generalizing Apdex</a></li>
<li><a class="offsite-link-inline" href="http://apdex.org/blog/?p=221">Core Apdex Qualities</a></li>
<li><a class="offsite-link-inline" href="http://apdex.org/blog/?p=259">Metrics and Performance Indicators: A Bibliography</a></li>
</ul>

<h3>Contribute Your Ideas</h3>

<p>If you’ve ever used Apdex, or thought about how it could be used, please do consider contributing your own thoughts in the comments on the Apdex Exchange blog. I will definitely reply, and also do my best to take any public input into account. The resulting conclusions will be much more authoritative, and closer to becoming a usable and useful standard, if they reflect the consensus view of the people who want to apply Apdex.</p>]]></content></entry><entry><title>jQuery Library Performance Alert</title><category term="Performance in the News"/><category term="Rich Internet Applications"/><category term="Slowness"/><category term="Software products"/><category term="jQuery"/><id>http://www.webperformancematters.com/journal/2009/8/21/jquery-library-performance-alert.html</id><link rel="alternate" type="text/html" href="http://www.webperformancematters.com/journal/2009/8/21/jquery-library-performance-alert.html"/><author><name>Chris Loosley</name></author><published>2009-08-21T22:51:53Z</published><updated>2009-08-21T22:51:53Z</updated><content type="html" xml:lang="en-US"><![CDATA[<h2 class="Metadata">jQuery libraries moved to Google AJAX Libraries API</h2>

<span class="PageIllustration" style="background-color: #0F1923;"><img title="jQuery Logo" alt="Illustration: jQuery logo" src="http://www.webperformancematters.com/storage/post-graphics/jQuery_logo_215x53.gif" /> </span>

<p>Recently I've been doing a lot Web design and development work, using the <a href="http://www.squarespace.com/" class="offsite-link-inline">Squarespace</a> platform, a "A fully hosted, completely managed environment for creating and maintaining a website, blog or portfolio." I like Squarespace because it is xhtml/CSS based and lets me focus on a site's content and appearance. I get great performance and never have to deal with installing and managing any Web server software. Normally ...</p>

<p>Last night was the exception. I was working on some site updates, and every time I refreshed a page, there was an interminable delay while the page loaded. Coincidentally, I've been experiencing intermittent short outages in my AT&T U-verse service lately, so I put this down to another AT&T problem. But it was already after midnight anyway, so after trying a few things, I finally gave up and went to bed.  </p>

<p>This morning, all was explained, thanks to a post about a recent <a href="http://developers.squarespace.com/design-coding/post/869888" class="offsite-link-inline">jQuery change</a> on the Squarespace Community Forum, by <a href ="http://www.mrhobday.com/" class="offsite-link-inline">Stuart Hobday</a>, a Web designer in the UK who (naturally) also uses Squarespace. </p>

<p><a href="http://jquery.com/" class="offsite-link-inline">jQuery</a> is a lightweight JavaScript library that many people find extremely useful for coding site UI behaviors, because its syntax lets you focus on the relationships between JavaScript, HTML, and CSS. That is why it is now very <a href="http://en.wikipedia.org/wiki/List_of_Ajax_frameworks" class="offsite-link-inline">popular</a> among Web developers who rely on JavaScript or <a href="http://en.wikipedia.org/wiki/Ajax_framework" class="offsite-link-inline">Ajax frameworks</a> to animate their sites.</p>

<p>When a Web page contains JavaScript code that uses a library, the library code must first be downloaded to the client. jQuery has always offered Web developers two ways to do this: download the code and upload it (along with the rest of your content) from your own server, or let the page download it directly from a jQuery server located at <em>code.jquery.com</em>.</p> 

<p>The first approach is ideal once your site is in production and everything is working, but while you're in development, it's convenient to be able to grab the latest library code and be sure that you'll automatically get the benefit of any recent bug fixes or enhancements. So I think a lot of developers take that approach. And I imagine that there's quite a lot of jQuery code out there, in every day use, and still relying on a download from <em>code.jquery.com</em>.</p>

<p>And here's where the performance problem arises. Yesterday, that library was relocated to <em>ajax.googleapis.com</em>: 

<blockquote> 
<h4>code.jquery.com Redirected to Google Ajax APIs</h4>

<small>Posted August 20th, 2009 by Mike Hostetler</small>

<p>Starting at 10PM MT on August 20th, <a href="http://code.jquery.com/">code.jquery.com</a> will start redirecting (301) to <a href="http://ajax.googleapis.com/">ajax.googleapis.com</a> [<a href="http://code.google.com/apis/ajaxlibs/documentation/index.html#jquery">http://code.google.com/apis/ajaxlibs/documentation/index.html#jquery</a>].</p>
<p><strong>Immediate Impact:  </strong></p>

<ul>
<li>None</li>
<li>Redirection will occur using <a href="http://en.wikipedia.org/wiki/URL_redirection#HTTP_status_codes_3xx">301 “Permanent Moved”</a></li>
<li>Packed version will be replaced with minified version</li>
</ul>
<p><strong>  Long Term:  </strong></p>
<ul>
<li>Migrate any sites using <a href="http://code.jquery.com/">code.jquery.com</a> to <a href="http://code.google.com/apis/ajaxlibs/documentation/index.html#jquery">Google’s AJAX Libraries API</a></li>
</ul>

<p>Full documentation of Google’s Ajax API are available at <a href="http://code.google.com/apis/ajaxlibs/documentation/index.html#jquery">http://code.google.com/apis/ajaxlibs/documentation/index.html#jquery</a>. <a id="more-259"></a> For your convenience here are the old URLs on <a href="http://code.jquery.com/">code.jquery.com</a> and their new Google Ajax API counterpart:</p>
<dl>
<dt>jquery-latest.js</dt>
<dd><a href="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.js">http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.js</a></dd>
<dt>jquery-latest.pack.js</dt>

<dd><a href="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js">http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js</a></dd>
<dt>jquery-latest.min.js</dt>
<dd><a href="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js">http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js</a></dd>
<dt>jquery.js</dt>
<dd><a href="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.js">http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.js</a></dd>
<dt>jquery-1.3.2.min.js</dt>
<dd><a href="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js">http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js</a></dd>

<p> ... </p>

<p class="QuoteSource">--for the full list, see the <a href="http://blog.jquery.com/2009/08/20/codejquerycom-redirected-to-google-ajax-apis">jQuery blog</a></p>
</blockquote> 

<p></p>

<p>Although the old downloads still work, it's been taking <em>code.jquery.com</em> a long time to issue those 301 redirects to the google library. In the meantime, your browser will sit there (probably with a message at the bottom saying "waiting for code.jquery.com" or something similar). If you see that, look in the source code, usually in the &lt;head&gt; section, for a jquery download that may be causing the problem. If you control the code, fix it. Otherwise call the tech support for the site and tell them what to do.
</p>
 
<strong>Tags:</strong>
<a href="http://technorati.com/tag/jquery" rel="tag">jQuery</a>,  
<a href="http://technorati.com/tag/performance" rel="tag">performance</a>,
<a href="http://technorati.com/tag/ajax" rel="tag">ajax</a>,
<a href="http://technorati.com/tag/google" rel="tag">Google</a>,
<a href="http://technorati.com/tag/download+time" rel="tag">download time</a>,
<a href="http://technorati.com/tag/performance+matters" rel="tag">Performance Matters</a>,
<a href="http://technorati.com/tag/web+performance" rel="tag">Web performance</a>
</p>]]></content></entry><entry><title>Where Performance Meets Availability</title><category term="Availability Management"/><category term="Performance and Usability "/><category term="Reporting on Performance"/><category term="Slowness"/><category term="Standards (Apdex, ITIL, etc.)"/><id>http://www.webperformancematters.com/journal/2009/2/9/where-performance-meets-availability.html</id><link rel="alternate" type="text/html" href="http://www.webperformancematters.com/journal/2009/2/9/where-performance-meets-availability.html"/><author><name>Chris Loosley</name></author><published>2009-02-09T08:01:00Z</published><updated>2009-02-09T08:01:00Z</updated><content type="html" xml:lang="en-US"><![CDATA[<h2 class="Metadata">Response Time Standards for Web Sites and Web Applications</h2>

<span class="PageIllustration" ><img title="Stopwatch" alt="Illustration: Stopwatch" src="http://www.webperformancematters.com/storage/post-graphics/Stopwatch2-JPG.JPG" /> </span>

<p>Earlier posts about <a href="http://www.webperformancematters.com/journal/2007/7/10/acceptable-response-times.html" class="PMref">Acceptable Response Times</a> have discussed how a Web site or application's responsiveness can <a href="http://www.webperformancematters.com/journal/2005/10/24/delight-satisfy-or-frustrate.html" class="PMref">Delight, Satisfy, or Frustrate</a> customers. </p>

<p>Availability, on the other hand, is a measure of a system's stability. It is not a performance metric, it is a software (or hardware) quality metric. </p>

<p>So, technically speaking, performance and availability are orthogonal issues. You would not call a London taxicab a high performance vehicle just because it runs for 300,000 miles without ever breaking down. Conversely, for broken software, or a car that will not start, performance measures are irrelevant.</p>

<p>Practically speaking, however, <em>availability</em> and <em>responsiveness</em> are interconnected concepts. How slow does a user interface have to be before the application becomes unusable, and might as well be completely <em>unavailable</em>?  Slowness matters; how long will you wait before you click away? Maybe you'll come back later if you really need to see that page. If not, how often do you ever revisit a page that didn't load when you were interested in reading it?</p> 

<p>Posing the question in this way reveals that <em>performance</em> and <em>availability</em> have a complicated relationship, one that involves business objectives, the user's experience, overall workload volumes, system scalability, and cost per transaction processed:</p>

<blockquote> 
<h4>Availability</h4>

<p>While availability is not actually a measure of performance, it certainly has an effect on performance:</p>
<ul>
<li>Unstable systems often have specific effects on performance in addition to the other consequences of system failure. For example, instability affects the average processing time of large batch workloads, because of the possibility of failures during processing.</li>
<li>Additional processing is inevitable as users try to catch up with their work following a period of down time, thereby creating artificial peaks in the distribution of work, leading to higher system utilization levels and longer response times.</li>
<li>Highly available systems ... usually invest in redundant hardware and software and impose a need for careful design that often benefits performance. In this case availability (and any improved performance) is being traded for cost.</li>
</ul>

<p class="QuoteSource">--High-Performance Client/Server</p>
</blockquote> 

<p>This is one reason why I particularly like the analysis methodology underlying the <a href="http://www.webperformancematters.com/journal/2005/10/19/apdex-application-performance-index.html" class="PMref"><strong>Apdex</strong></a> [Application Performance Index] standard. Once you have defined a response-time target, an Apdex-compliant reporting tool allocates every measurement into one of just three zones: <em>Satisfied</em>, <em>Tolerating</em>, and <em>Frustrated</em>. Measurements in the <em>Satisfied</em> zone score a full point, those in the <em>Tolerating</em> zone score half a point, and those in the <em>Frustrated</em> zone score <strong>zero</strong>. Nothing. Zilch.</p>

<p>For more about Apdex, see the <a href="http://www.apdex.org/index.html" class="offsite-link-inline" >Apdex Alliance</a> Web site. To receive occasional updates about Apdex-related activities, you can sign up to become a <a href="http://www.apdex.org/supporting.aspx" class="offsite-link-inline" >supporting member</a>. It's still free. 
</p>
 
<p class="Footnote"><strong>This post</strong> contains material first published in <a class="offsite-link-inline" href="http://www.amazon.com/exec/obidos/tg/detail/-/0471162698/002-1562714-5063248?v=glance" >High-Performance Client/Server</a>, Chapter 3: Performance Fundamentals, p61.
<strong>Tags:</strong>
<a href="http://technorati.com/tag/Apdex" rel="tag">Apdex</a>,  
<a href="http://technorati.com/tag/performance" rel="tag">performance</a>,
<a href="http://technorati.com/tag/availability" rel="tag">availability</a>,
<a href="http://technorati.com/tag/response+time" rel="tag">response time</a>,
<a href="http://technorati.com/tag/download+time" rel="tag">download time</a>,
<a href="http://technorati.com/tag/performance+matters" rel="tag">Performance Matters</a>,
<a href="http://technorati.com/tag/web+performance" rel="tag">Web performance</a>
</p>]]></content></entry><entry><title>Why Technorati is Not Usable</title><category term="About this site"/><category term="Blogs and Publications"/><category term="Performance and Usability "/><id>http://www.webperformancematters.com/journal/2007/9/26/why-technorati-is-not-usable.html</id><link rel="alternate" type="text/html" href="http://www.webperformancematters.com/journal/2007/9/26/why-technorati-is-not-usable.html"/><author><name>Chris Loosley</name></author><published>2007-09-26T10:30:00Z</published><updated>2007-09-26T10:30:00Z</updated><content type="html" xml:lang="en-US"><![CDATA[<span><img class="PageIllustration" title="Usability Model" alt="Illustration: Four dimensions of usability" src="http://www.webperformancematters.com/storage/post-graphics/Usability Model.jpg" />

<p>I was going to write about performance and availability today, but this was not the post I had in mind. Technorati sidetracked me. So I'm going to write about Usability instead. Because Technorati provides a good counter-example -- how <em>not</em> to build a usable Web application that satisfies and retains customers. </p>

<p>In <a href="http://www.webperformancematters.com/journal/2005/10/17/web-usability-a-simple-framework.html" class="PMref">Web Usability: A Simple Framework</a>, I described a way to think about Web site or Web application usability.</p>

<p>In a second post, <a href="http://www.webperformancematters.com/journal/2005/11/9/the-dimensions-of-usability.html" class="PMref">The Dimensions of Usability</a>, I presented the graphic shown here, and discussed the four dimensions in a bit more detail. </p>

<p>These four dimensions are not alternative functional goals, to be weighed against one another and prioritized. Web application effectiveness is a four-step challenge:</p>

<blockquote>
<p>To satisfy customers, a Web site must fulfill four distinct needs: </p>

<ul>
<li><strong>Availability:</strong> A site that's unreachable, for any reason, is useless.</li>
<li><strong>Responsiveness:</strong> Having reached the site, pages that download slowly are likely to drive customers to try an alternate site.</li>
<li><strong>Clarity:</strong> If the site is sufficiently responsive to keep the customer's attention, other design qualities come into play. It must be simple and natural to use – easy to learn, predictable, and consistent.</li>
<li><strong>Utility:</strong> Last comes utility -- does the site actually deliver the information or service the customer was looking for in the first place?</li>
</ul>
<p class="QuoteSource">--<a href="http://www.webperformancematters.com/journal/2005/10/17/web-usability-a-simple-framework.html" class="PMref">Web Usability: A Simple Framework</a>, October 17, 2005</p>
</blockquote>

<p>As in a quiz show, to win the grand prize -- satisfied customers -- you have to get it right at every stage. Fail at any one and you <em>will</em> lose customers. Fail consistently at any one, and you will be out of business.</p>

<p><strong>As I experienced their service today, Technorati seemed to be failing on all four fronts</strong>.</p>

<h3>Availability</h3>

<p>First I noticed that my browser was replacing the thumbnail portrait that usually appears (near the bottom of my sidebar) under <em>technorati links</em> with alternative text. Next I tried Technorati's link to <em>Blogs that link here</em> and, eventually, was rewarded with:</p>

<span class="SectionIllustrationInline"><img src="http://www.webperformancematters.com/storage/post-graphics/Firefox%20Connection%20Reset.JPG" alt="Illustration: Firefox Connection Reset screen" title="Firefox Connection Reset screen"/></span> 
</p>

<p>It's not that I desperately need to see my own picture there at all times, or that I think my readers are dying to see the inbound links (or <em>blog reactions</em>, as Technorati calls them). I know that widget in my sidebar has marginal utility -- a few people may use it occasionally. That's why I put it near the bottom, where it doesn't interfere with anyone's ability to browse the site. If it works, it does no harm. On the other hand, if it's broken, it becomes a distinct liability. <strong>Broken links lower the quality of the whole site.</strong>.</p>

<p>In this case, the <em>connection reset</em> error means that the Web server accepted the request, but then took so long to respond that the browser timed out. While this may not qualify as a <em>broken link</em>, it had the same effect: <strong>the requested page was unavailable</strong>. </p>

<p>Upon checking back a few hours later, the sidebar link was working. Again, not a surprise. Intermittent outages like this have been characteristic of Technorati for a long time -- see my post on <a href="http://www.webperformancematters.com/journal/2007/6/6/taming-the-technorati-monster.html" class="PMref">Taming the Technorati Monster</a>.

<h3>Performance</h3>

<p>I'm not going to dwell on this, because if you've tried to find things on Technorati lately, you already know how the service performs. For me, it typically ranges from slow to glacial, for a search engine. Maybe it's just my particular interests -- <em>Web Performance</em> and <em>Application Responsiveness</em> are not especially hot topics. Perhaps other people who are interested in more popular topics are scoring cache hits and are actually getting good Web performance. That would be ironic!</p>

<h3>Clarity</h3>

<p>Returning to my problems with the <em>blog reactions</em> widget, normally I would let this incident pass without comment. But today I actually noticed the problem while I was doing a blog search about problems with Technorati's tag indexing and search functions, because my blog seems to have fallen off their radar lately. </p>

<p>In the past, tags used in a post would be indexed and returned in a search within the hour, often within minutes. Today, Technorati's search function was sure I had not published anything for the last 27 days. But when I navigated manually to their page for my blog, they displayed excerpts of all my more recent posts.</p>

<p>Some more digging revealed that even though Technorati's site was up, and even though I could use it to navigate manually to a page listing blog reactions, the sidebar link to that same information, which Technorati's widget was generating, did not work. <strong>In any Web site or application, these kinds of internal inconsistencies are hugely frustrating. They make me doubt the accuracy and completeness of any information the application returns.</strong></p>

<p> And not surprisingly, searching for help on Technorati itself does nothing to reassure me that they will be fixing these problems anytime soon. Quite the contrary, it confirms their problems, as in this amusing response:</p>

<span class="SectionIllustrationInline" style="margin:0 0 10px 0; padding:5px;"><img src="http://www.webperformancematters.com/storage/post-graphics/Technorati%20Search%20Problems.JPG" alt="Illustration: Technorati Search Problems" title="Technorati Search Problems"/></span>

<p>(Is Technorati <a href="http://www.uprightmatters.com/blog-home/2007/9/25/lets-stop-beatin-round-the-bush.html" class="offsite-link-inline">beatin' 'round the bush</a> here? Can a search engine actually lie about what it <em>really</em> knows? :)</p>

<h3>Utility</h3> 

<p>Google's <em>Blog Search</em> feature, however, did know something. It pointed me to this sensible post by <a href="http://www.blogger.com/profile/17388497877158577422" class="offsite-link-inline">ChristineMM</a>:</p>

<blockquote>
<h4>Trying Out Blog Widgets and Tools</h4>

<p>I would like a search box on my blog that lets my readers (and me) search for content from within the pages of my blog. The Google one that I used to use was not working right, I’d search for a word that was right in front of me or even in a blog post title and it would say there were no matches, so I dumped that function.</p>

<p>I then for a long time used a Technorati box. At some point I realized it was not working well either. Again I’d search for a keyword that was in a blog post title and it would say there were no matches. So this week I deleted it from my sidebar. What is the point of having a blog reader search for a topic on my blog, be told I never blogged on it, when in reality, I actually did?</p>

<p>...</p>

<p>One last thing I’ll mention is that I get a ton, and I mean a ton of blog readers through Google primarily and also some other Internet search engines. I feel that my regular use of Technorati tags helps my blog posts be found by Google and the other search engines. This drives traffic to my blog. So if you want to drive traffic to your blog, use Technorati tags in every blog post of substance.</p>

<p class="QuoteSource">--<a href="http://thethinkingmother.blogspot.com/2007/09/trying-out-blog-widgets-and-tools.html" class="offsite-link-inline">The Thinking Mother</a>, September 23, 2007</p>
</blockquote>

<p>Well said, Christine! If an application does not deliver the service you need, it's useless. I dropped Technorati's search box some time ago, for similar reasons. The integrated Squarespace search box is 1000 times more useful for searching the blog, and Google has the Web covered far more effectively than Technorati, in my opinion.</p>

<h3>The bottom line</h3>

<p>I think Christine may have homed in on the essence of the matter, sad though it may be. Unless Technorati can recover its original sense of purpose and fix its technical problems, it's not going to survive as an independent, useful, service. Perhaps its most significant contribution will be its promotion of a standard tagging format that is easily recognized and reused <em>by other search engines</em>.</p>

<p>So I'm not giving up on my Technorati tags yet, but I'm not counting on getting much value from their blog indexing or searching tools either. I've already removed their <em>blog search</em> and <em>tag cloud</em> functions from my sidebar, and their <em>blog reactions</em> widget is now on probation. Any more problems and it will be the next to go.</p>

<p class="Footnote"><strong>Tags:</strong> 
<a href="http://technorati.com/tag/technorati" rel="tag">Technorati</a>,
<a href="http://technorati.com/tag/tagging" rel="tag">tagging</a>,
<a href="http://technorati.com/tag/blog+reactions" rel="tag">blog reactions</a>,  
<a href="http://technorati.com/tag/problems" rel="tag">problems</a>,
<a href="http://technorati.com/tag/usability" rel="tag">usability</a>,
<a href="http://technorati.com/tag/availability" rel="tag">availability</a>,
<a href="http://technorati.com/tag/consistency" rel="tag">consistency</a>,
<a href="http://technorati.com/tag/clarity" rel="tag">clarity</a>,
<a href="http://technorati.com/tag/utility" rel="tag">utility</a>,
<a href="http://technorati.com/tag/Christinemm" rel="tag">Christinemm</a>,
<a href="http://technorati.com/tag/Thinking+Mother" rel="tag">Thinking Mother</a>,
<a href="http://technorati.com/tag/web+performance" rel="tag">Web performance</a>,
<a href="http://technorati.com/tag/performance+matters" rel="tag">Performance Matters</a>
</p>]]></content></entry><entry><title>Human Factors and Blog Design</title><category term="About this site"/><category term="Blogs and Publications"/><id>http://www.webperformancematters.com/journal/2007/9/22/human-factors-and-blog-design.html</id><link rel="alternate" type="text/html" href="http://www.webperformancematters.com/journal/2007/9/22/human-factors-and-blog-design.html"/><author><name>Chris Loosley</name></author><published>2007-09-22T07:30:00Z</published><updated>2007-09-22T07:30:00Z</updated><content type="html" xml:lang="en-US"><![CDATA[<div class="PageIllustration"><img src="http://www.webperformancematters.com/storage/post-graphics/coding-horror-official-logo-small.png" alt="Illustration: Coding Horror logo" title="Coding Horror logo"/>
<br /><span class="PictureCaption"><a href="http://www.codinghorror.com/blog/" class="offsite-link-inline">Coding Horror</a></span></div>

<p>The best products are designed with <a href="http://en.wikipedia.org/wiki/Human_factors" class="offsite-link-inline">Human Factors</a> in mind. That's why <a href="http://www.webperformancematters.com/display/ShowJournal?moduleId=1113404&categoryId=95637" class="PMref">Web design and usability</a> is a frequent topic of my <em>Web Performance Matters</em> blog.</p>

<p>Jeff Atwood's blog -- <em>Coding Horror</em> -- focuses on <em>programming and human factors</em>. And according to a recent <a href="http://www.dailyblogtips.com/interview-with-jeff-atwood-from-coding-horror/" class="offsite-link-inline">interview</a> with Jeff on the site <em>Daily Blog Tips</em>, "the blog is attracting over 500,000 unique visitors every month, and it also counts 60,000 RSS readers, meaning that Jeff probably knows what he is talking about".</p>

<p>The <em>Coding Horror</em> logo was originally created to mark examples of dangerous code in the programming classic <a href="http://www.amazon.com/exec/obidos/ASIN/0735619670/" class="offsite-link-inline">Code Complete</a> by <a href="http://www.stevemcconnell.com/" class="offsite-link-inline">Steve McConnell</a>, which <a href="http://www.codinghorror.com/blog/archives/000021.html" class="offsite-link-inline">Jeff rates</a> as his "all-time favorite programming book."</p>

<p>I have <a href="http://www.amazon.com/gp/reader/0735619670/ref=sib_books_pg/105-5052943-5499615?ie=UTF8&keywords=Chris%20Loosley&p=S002&checkSum=X870d5rEZ6o3p7%252FpTRIE33KEyKo8%252FsKXBj4Qz4k3Ob0%253D" class="offsite-link-inline">recommended <em>Code Complete</em></a> myself.  <a href="http://www.codinghorror.com/blog/archives/000020.html" class="offsite-link-inline">Jeff's favorite books</a> are on my shelf too. So I respect his judgment and recommend his blog, which I have added to the blogroll on <em>Web Performance Matters</em>.
</p>

<h3>Thirteen blog clichés</h3>

<p>Jeff recently published <a href="http://www.codinghorror.com/blog/archives/000834.html" class="offsite-link-inline"><em>Thirteen Blog Clichés</em></a>, a post summarizing his "opinions about what makes blogs work well, and what makes blogs sometimes not work so well." These are presented as a list of common mistakes to avoid (or <a href="http://en.wikipedia.org/wiki/Anti-pattern" class="offsite-link-inline">anti-patterns</a>). If you have a blog, or are designing one, you've probably read similar articles before. Even so, Jeff's checklist is worth a look. All such lists tend to contain a core set of common guidelines to follow and/or pitfalls to avoid, but some of Jeff's opinions step outside the conventional wisdom.</p>

<p>Because I maintain two blogs -- <em>Web Performance Matters</em> and <a href="http://www.uprightmatters.com/" class="offsite-link-inline"><em>UpRight Matters</em></a> -- I decided to rate both blogs against Jeff's criteria. Here are edited versions of his recommendations, and my responses. To read Jeff's full discussions of each guideline, see the original. And for the full story, see the many responses posted by Jeff's readers in the comments section of his blog. </p>

<blockquote class="highlight">
<span class="full-image-float-right"><img src="http://www.webperformancematters.com/storage/post-graphics/blog-calendar_opt.jpg" title="Blog Cliche -- Calendar" alt="Illustration: Blog Cliche -- Calendar" /></span>

<h4>1. The Useless Calendar Widget</h4>

<p>I can't think of a <em>single</em> time I have ever found the blog calendar widget helpful. My computer already has a calendar function, so it's not like I need another calendar displayed in my web browser.</p>
<p>Every post carries an obvious datestamp, so I can easily discern when it was published. But knowing whether someone posted an entry on the third Tuesday of the month? Utterly useless. </p>

<p class="QuoteSource">--Jeff Atwood, <a href="http://www.codinghorror.com/blog/archives/000834.html" class="offsite-link-inline"><em>Thirteen Blog Clichés</em></a> [edited]</p>
</blockquote>

<p>I agree! Someone reading a blog like <a href="http://www.dailykos.com/" class="offsite-link-inline">Daily Kos</a>, that publishes daily about politics or current affairs, might find a calendar useful. But a calendar isn't appropriate for our content, so we've never thought of including one. Even if we had, the Squarespace publishing platform we use (see bottom of sidebar) doesn't offer such a blog calendar widget -- another sign that it's not in great demand.</p> 

<blockquote class="highlight">
<h4>2. Random Images Arbitrarily Inserted In Text</h4>

<p>One of the cardinal rules of <a href="http://www.useit.com/papers/webwriting/" class="offsite-link-inline">web writing</a> is to <em>avoid large blocks of text</em>. There are plenty of <a href="http://www.useit.com/alertbox/9703b.html" class="offsite-link-inline">excellent web writing guides</a> that exhort you to break up your text, using bullets, numbered lists, quotes, paragraph breaks, images -- anything to avoid creating an intimidating wall of dense, impenetrable text. </p>
<p>But like all good advice, (this) can be taken too far. For example, when you find yourself inserting random pictures into your writing for the sole purpose of breaking up the text. As the old adage goes, <em>a picture is worth a thousand words</em>. <strong>But you should no more insert a random image into your writing than you would insert a thousand random words into your writing.</strong></p>
<p>Images are <em>not</em> glorified paragraph breaks. Images should contribute to the content and meaning of the article in a substantive way. And if they don't, they should be cut. Mercilessly.</p>
<p class="QuoteSource">--Jeff Atwood, <a href="http://www.codinghorror.com/blog/archives/000834.html" class="offsite-link-inline"><em>Thirteen Blog Clichés</em></a> [edited]</p>
</blockquote>

<p>I know I am sometimes guilty of writing long posts. But I won't write a thousand words unless I have something worthwhile (I hope :-) to explain, and I try to keep all my posts interesting by breaking up the text using <a href="http://www.webperformancematters.com/journal/2006/3/25/managing-rias-6-measurement-challenges.html" class="PMref">headings</a> or <a href="http://www.webperformancematters.com/journal/2007/8/21/asynchronous-architectures-4.html" class="PMref">images</a>. And I promise that we will <em>never</em> include an image that bears no relationship to the subject matter!</p>

<blockquote class="highlight">
<h4>3. No Information on the Author </h4>

<p>Every time a reader encounters a blog with no name in the byline, no background on the author, and no simple way to click through to find out <em>anything</em> about the author, it devalues not only the author's writing, but the credibility of blogging in general.</p>

<p>Maintaining a blog of any kind takes quite a bit of effort. It's irrational to expend that kind of effort without putting your name on it so you can benefit from it. And so we can too. It's a win-win scenario for you, Mr. Anonymous.</p>

<p class="QuoteSource">--Jeff Atwood, <a href="http://www.codinghorror.com/blog/archives/000834.html" class="offsite-link-inline"><em>Thirteen Blog Clichés</em></a> [edited]</p>
</blockquote>

<p>I agree! That's why we provide <a href="http://www.webperformancematters.com/objectives/" class="PMref">brief</a> <a href="http://www.uprightmatters.com/author-184886/" class="UMref">introductions</a> and <a href="http://www.uprightmarketing.com/principals/" class="UMref">longer</a> author pages.</p>

<blockquote class="highlight">
<h4>4. Excess Flair</h4>

<span class="full-image-float-none"><img src="http://www.webperformancematters.com/storage/post-graphics/social-bookmarks.png" alt="Illustration: Social bookmark icons" title="Social bookmark icons"/></span>

<p>Blogs work because they're simple. When we clutter up our blogs with a zillion widgets, features, and add-ons, we're destroying an essential part of what makes blogs worthwhile. Examples include "crazy" JavaScript image loading techniques, annoying pop-up image previews of links, and pictures of the last 10 visitors to your blog.</p>
    
<p>Before adding any new "feature" to your blog, consider whether its value outweighs the additional complexity it introduces. </p>

<p class="QuoteSource">--Jeff Atwood, <a href="http://www.codinghorror.com/blog/archives/000834.html" class="offsite-link-inline"><em>Thirteen Blog Clichés</em></a> [edited]</p>
</blockquote>

<p>This recommendation can be controversial -- see the comments on <a href="http://www.codinghorror.com/blog/archives/000587.html" class="offsite-link-inline">Jeff's original post</a> on this topic. But I agree with Jeff, and I do try to <em>reduce</em> the clutter whenever possible. See my decision on item 6 below, for example. </p>

<blockquote class="highlight">
<h4>5. The Giant Blogroll</h4>

<span class="full-image-float-none"><img src="http://www.webperformancematters.com/storage/post-graphics/giant-blogroll-2.JPG" alt="Illustration: Giant Blogroll" title="Giant Blogroll"/></span>

<p>Citing your references and influences is a great and necessary thing, but obsessively listing every single blog you read is just noise. If you're really reading this many blogs, you should be linking to them organically in your blog posts, in a sort of natural quid pro quo. Wearing a giant blogroll on your sleeve is an empty gesture that feels artificial and insincere.</p>

<p class="QuoteSource">--Jeff Atwood, <a href="http://www.codinghorror.com/blog/archives/000834.html" class="offsite-link-inline"><em>Thirteen Blog Clichés</em></a> [edited]</p>
</blockquote>

<p>Agreed! On <em>Web Performance Matters</em>, I aim to keep <a href="http://www.webperformancematters.com/journal/2007/5/20/a-web-performance-blogroll.html" class="PMref">my blogroll</a> focused, and group the links into categories. We have not added a blogroll on <em>UpRight Matters</em> yet, but we plan to adopt the same approach.</p>

<blockquote class="highlight">
<h4>6. The Nebulous Tag Cloud</h4>

<span class="full-image-float-right"><img src="http://www.webperformancematters.com/storage/post-graphics/tagcloud.png" alt="tagcloud.png" title="tagcloud.png"/></span>
<p>Tagging content easily beats organizing everything into <a href="http://www.codinghorror.com/blog/archives/000246.html" class="offsite-link-inline">hierarchical folders</a>, and tag categories on blogs are moderately useful, particularly for bloggers who tend to bounce around among many different topics. What I've <em>never</em> found useful, however, is the stereotypical tag cloud visualization, where the size of the tag word varies with its frequency. </p>

<p>The perception is that tag cloud visualizations are cool, like badges of honor for the tagging club. The reality is that tag cloud visualizations are chaotic, noisy, and unusable. Keep the tagging, lose the cloud. A simple sorted list of tags, along with the number of posts associated with each tag, is much more effective.</p>

<p class="QuoteSource">--Jeff Atwood, <a href="http://www.codinghorror.com/blog/archives/000834.html" class="offsite-link-inline"><em>Thirteen Blog Clichés</em></a> [edited]</p>
</blockquote>

<p>Content tagging and indexing is a complex subject, and one I have given much thought while developing our blogs. [I even read <a href="http://www.everythingismiscellaneous.com/" class="offsite-link-inline">Everything is Miscellaneous</a>, and started to write a post about it until I realized that I was just adding to the <em>echo-chamber</em> on that topic. See item 11 below.]</p>

<p>I believe that tagging with keywords has value, but the resulting <a href="http://en.wikipedia.org/wiki/Folksonomy" class="offsite-link-inline"><em>folksonomy</em></a> is most useful as a supplement to, not a replacement for, a carefully designed and consistently applied classification scheme or <a href="http://en.wikipedia.org/wiki/Information_architecture" class="offsite-link-inline">information architecture</a>. Therefore we will continue to index our content using both methods. </p>

<p>However, despite investing a lot of time implementing a <a href="http://www.webperformancematters.com/journal/2007/5/27/customizing-the-technorati-tag-cloud.html" class="offsite-link-inline">Technorati tag cloud</a> for <em>Web Performance Matters</em>, which has been sitting in my sidebar for 4 months, I have come to the same conclusion as Jeff -- it takes up space without adding any value. So I've now removed it.</p>

<p>I see this as an example of the dynamic nature of blogging. It's agile publishing: you don't have to get everything right the first time. You can create something, try it out for a while, refine it, or remove it altogether. In this vein, revising your blog's layout is greatly simplified if your publishing platform is CSS-based, like <a href="http://www.squarespace.com/?partnerTag=cj&planTag=blg" class="offsite-link-inline">Squarespace</a>.</p> 

<blockquote class="highlight">
<h4>7. Excessive Advertisements</h4>

<p>Advertising is a fact of life, but your blog is not <a href="http://www.flickr.com/photos/stuckincustoms/440698504/" class="offsite-link-inline">Times Square</a>. Does every square inch of whitespace <i>have</i> to be filled with paid links, Google AdSense, and ad banners? </p>

<p>Here's a related article on <a href="http://www.sitepronews.com/archives/2007/jan/15.html" class="offsite-link-inline">blog usability</a> that's a perfect -- even ironic -- example of how you can hurt your usability with excessive, obnoxious advertising. It's everywhere.</p>

<p>It is almost <i>never</i> in the reader's interest to see advertisements, so tread very lightly, and be respectful of your audience. If you take the time to advertise responsibly, you may find that readers appreciate you for it.</p>

<p>Well, probably not, but it can't hurt to try.</p>

<p class="QuoteSource">--Jeff Atwood, <a href="http://www.codinghorror.com/blog/archives/000834.html" class="offsite-link-inline"><em>Thirteen Blog Clichés</em></a> [edited]</p>
</blockquote>

<p>We do have a few ads. I try to organize them tastefully, so that they don't interfere with the content.</p>

<blockquote class="highlight">
<h4>8. This Ain't Your Diary</h4>

<p>Let's be perfectly clear: readers aren't coming to your blog <a href="http://www.codinghorror.com/blog/archives/000536.html" class="offsite-link-inline">to read about you</a>. They're coming to find out <a href="http://headrush.typepad.com/creating_passionate_users/2005/01/users_shouldnt_.html" class="offsite-link-inline">what it can do for them</a>.</p>

<span class="full-image-float-right"><img src="http://www.webperformancematters.com/storage/post-graphics/diary.jpg" alt="Illustration: Diary" title="Diary"/></span>

<p>That said, blogs are a place for writers to find an interested audience, and a place for readers to find a helpful peer and a unique voice. It's OK to <a href="http://software.ericsink.com/entries/Goodbye_Sadie.html" class="offsite-link-inline">be yourself</a>; at some level, it is a cult of personality: people are reading not only because your content is useful to them, but because they like you. </p>

<p>It's normal to inject a regular dose of yourself into the conversation. But like Tabasco sauce and other powerful seasonings, a little YOU goes a long way. A <i>really</i> long way.  Write accordingly.</p>

<p class="QuoteSource">--Jeff Atwood, <a href="http://www.codinghorror.com/blog/archives/000834.html" class="offsite-link-inline"><em>Thirteen Blog Clichés</em></a> [edited]</p>
</blockquote>

<p>Agreed! I won't be writing about my experiences remodeling my house, unless I see a connection worth exploring.</p>

<blockquote class="highlight">
<h4>9. Sorry I Haven't Written in a While</h4>

<p>If you haven't posted anything new to your blog in a while, don't waste our time with apologies. Just write! The best apology is new and improved content. Maybe with a wee bit more consistency this time, though:</p>

<ul class="grouptight">
<li>Pick a schedule you can live with, and stick to it</li>
<li>Don't produce <a href="http://www.codinghorror.com/blog/archives/000910.html" class="offsite-link-inline">substandard</a> posts, just to keep to a schedule</li>
<li>Talent is far less important than <a href="http://www.codinghorror.com/blog/archives/000187.html" class="offsite-link-inline">enthusiasm</a></li>
</ul>
 
<p>And the best way to demonstrate your enthusiasm -- and to improve -- is to get out there and <i>write</i>. Regularly.<p>

<p class="QuoteSource">--Jeff Atwood, <a href="http://www.codinghorror.com/blog/archives/000834.html" class="offsite-link-inline"><em>Thirteen Blog Clichés</em></a> [edited]</p>
</blockquote>

<p>My <a href="http://www.webperformancematters.com/objectives/" class="PMref">objectives</a> for <em>Web Performance Matters</em> are much the same as when I started the blog two years ago -- <em>to contribute <strong>an organizing framework</strong> and <strong>a regular supply of ideas</strong></em>.  I have to admit, I've had a few long gaps in my writing. I've also apologized and promised to do better! But after reading Jeff's advice, I'm in a bind. Should I apologize for apologizing? I guess not. I'll just keep writing. 

<blockquote class="highlight">
<h4>10. Blogging About Blogging</h4>

<p>I find meta-blogging -- blogging about blogging -- <i>incredibly</i> boring. I said as much in a recent <a href="http://www.dailyblogtips.com/interview-with-jeff-atwood-from-coding-horror/" class="offsite-link-inline">interview</a> on a site that's all about blogging (hence the title, Daily Blog Tips). If you accept the premise that most of your readers are <i>not</i> bloggers, then it's highly likely they won't be amused, entertained, or informed by a continual stream of blog entries on the art of blogging.</p>
        
<p>Meta-blogging is like masturbating. Everyone does it, and there's nothing wrong with it. But writers who regularly get out a little to explore other topics will be healthier, happier, and ultimately more interesting to be around -- regardless of audience.</p>

<p class="QuoteSource">--Jeff Atwood, <a href="http://www.codinghorror.com/blog/archives/000834.html" class="offsite-link-inline"><em>Thirteen Blog Clichés</em></a> [edited]</p>
</blockquote>

<p>Of course, Jeff's post and this one <em>are</em> about blogging. But the reason we care enough to research and write about these ideas comes back to the <em>Human Factors</em> dimension. As we work to improve our ability to serve and communicate more clearly, we want to share what we learn to help you connect with your own readers and communities.</p>

<p><a href="http://www.uprightmatters.com/author-184886" class="UMref">Cynthia</a> writes:


<div class="InlineTextBox">
<p>Since my <a href="http://www.webperformancematters.com/objectives/" class="UMref">blogging objective</a> is to make a competitive difference in the world, I took special note of Jeff’s post on <em>Thirteen Blog Clichés</em>, and of his focus on human factors.  Why?  Because I want to have conversations that matter -- presumably with humans! </p>

<p>While Chris and I stay focused on our respective blogging objectives, we work to apply the right technology to enhance understanding and to make the experience of conversing valuable for readers. Jeff’s opinions about effective technologies and techniques resonated with my blogging experience and my blogging <strong><em>intentions</em></strong>. If you have similar intentions, we think you will find them useful too.</p>
</div>

<blockquote class="highlight">
<h4>11. Mindless Link Propagation</h4>

<p>One of the most pernicious problems in blogging is the <a href="http://chris.pirillo.com/2006/08/18/10-ways-to-eliminate-the-echo-chamber/" class="offsite-link-inline"> echo chamber effect</a>. Most blog entries merely regurgitate what other people have said or add vapid commentary on top of news articles and press releases. Only the tiniest fraction of blog entries are original content, and only a tiny fraction of that fraction is worth your time.</p>
     
<p>If everyone knows about it, what value does that information have? My advice here is almost contrarian: if everyone else is talking about it, that means you should <em>avoid</em> talking about it. Switch things up. Seek out uncommon sites with unique information. If all you can find to talk about is what's already popular, you're not trying hard enough. Form your own opinion. Do your own research. Go out of your way to blaze a new trail and create something we haven't already seen hundreds of times before.</p>

<p class="QuoteSource">--Jeff Atwood, <a href="http://www.codinghorror.com/blog/archives/000834.html" class="offsite-link-inline"><em>Thirteen Blog Clichés</em></a> [edited]</p>
</blockquote>

<p>That is so true! This issue is exactly what stopped me from completing my review of David Weinberger's book, <em>Everything is Miscellaneous</em>, even though I had read the book and dozens of pages of reviews by others. But then I found myself summarizing other readers' feedback, which amounted to a <em>folksonomy</em> about the topic of <em>folksonomies</em> -- that is, a <em>meta-folksonomy</em>. I began to wonder whether, if I were to review other similar discussions, and add some Technorati tags to my review, would I then be contributing to a <em>meta-meta-folksonomy</em>?!</p>

<p>People criticize <em>Web 2.0</em>, and the <em>blogosphere</em> in general, claiming that it's just a giant echo-chamber in which uninformed opinion is amplified, and true expertise is drowned out by uneducated bleating, like the sheep in <a href="http://en.wikipedia.org/wiki/Animal_Farm" class="offsite-link-inline">Animal Farm</a>. While that criticism may sometimes be true, it is not the whole story, and it does not do justice to the educational power of the Web.</p>

<p>In this case, I concluded that the world did not really need me to summarize what everyone else was saying about David Weinberger's opinions about tagging, folksonomies, and the wisdom of crowds. In fact, to write such a post would just fuel the critics' argument (and by the way, it was turning into a very long post). So I went back to writing about Web performance!</p>

<blockquote class="highlight">
<h4>12. Top (n) Lists</h4>

<span class="full-image-float-right"><img src="http://www.webperformancematters.com/storage/post-graphics/Following%20Instructions%20for%20Dummies.JPG" alt="Illustration: Following Instructions for Dummies" title="Following Instructions for Dummies"/></span>

<p>Yes, exactly like this one.</p>

<p>Lists are a great convention. They make sense, people understand them, and they're a logical way to structure your writing. But <a href="http://www.codinghorror.com/blog/archives/000932.html" class="offsite-link-inline"> don't let lists become a crutch</a>. I'm always taken aback when I see the "most popular" posts on a blog dominated by Top (n) Lists. Shortcuts are only meaningful if you know what it is, exactly, you're cutting.</p>
    
<p>If you find that the Top (n) List convention is a go-to tool in your writing toolkit, consider re-balancing your writing portfolio with longer, more in-depth pieces as well. Not everything should be a sprint; throw a few small marathons in there somewhere to complement your short distance skills.</p>

<p class="QuoteSource">--Jeff Atwood, <a href="http://www.codinghorror.com/blog/archives/000834.html" class="offsite-link-inline"><em>Thirteen Blog Clichés</em></a> [edited]</p>
</blockquote>

<p>I agree that it's good to aim for a balance of short and longer posts. Having written technical articles for years before blogs existed, I'm actually more likely to write long essays -- see my comment on item 2 above. So to balance those marathon posts, I've found that deliberately trying to compose shorter posts whose structure is a list of guidelines or principles helps me keep that balance. My series on <a href="http://www.webperformancematters.com/display/ShowJournal?moduleId=1113404&categoryId=98044" class="PMref">Performance Wisdom</a> contains several examples of this approach.

<blockquote class="highlight">
<h4>13. No Comments Allowed</h4>

<p><a href="http://www.codinghorror.com/blog/archives/000538.html" class="offsite-link-inline">A blog without comments is not a blog</a>. Yes, there are exceptions for massively popular blogs where <a href="http://many.corante.com/archives/2007/07/20/spolsky_on_blog_comments_scale_matters.php" class="offsite-link-inline">comments don't scale</a>. But until that applies, the value of the two-way conversation far outweighs any minor inconvenience on your part. It's an open secret in the blogging community that <b>the comments are often better than the original blog entry itself</b>. Would you browse Amazon without the user reviews?</p>

<p>Don't be afraid of comments. Embrace them. Moderate them. The community will respect you for it, and your blog will be better for it as well.</p>

<p class="QuoteSource">--Jeff Atwood, <a href="http://www.codinghorror.com/blog/archives/000834.html" class="offsite-link-inline"><em>Thirteen Blog Clichés</em></a> [edited]</p>
</blockquote>
</ol>

<p>We want comments! One of the primary reasons for blogging is to have conversations about the things that matter. It's not about us. Well, most of the time, anyway -- so we won't apologize if our writing occasionally lapses into introspection or vanity.</p>

<p class="Footnote"><strong>Note:</strong> This is cross-posted on <a href="http://www.webperformancematters.com/journal/2007/9/21/human-factors-and-blog-design.html" class="PMref"><em>Web Performance Matters</em></a> and <a href="http://www.uprightmatters.com/blog-home/2007/9/22/human-factors-and-blog-design.html" class="UMref"><em>UpRight Matters</em></a>. </p>

<p class="Footnote"><strong>Tags:</strong>
<a href="http://technorati.com/tag/human+factors" rel="tag">human factors</a>,
<a href="http://technorati.com/tag/Jeff+Atwood" rel="tag">Jeff Atwood</a>,
<a href="http://technorati.com/tag/Coding+Horror" rel="tag">Coding Horror</a>,
<a href="http://technorati.com/tag/blog+clichés" rel="tag">blog clichés</a>,
<a href="http://technorati.com/tag/calendar+widget" rel="tag">calendar widget</a>,
<a href="http://technorati.com/tag/random+images" rel="tag">random images</a>,
<a href="http://technorati.com/tag/social+bookmarks" rel="tag">social bookmarks</a>,
<a href="http://technorati.com/tag/blogroll" rel="tag">blogroll</a>,
<a href="http://technorati.com/tag/tagging" rel="tag">tagging</a>,
<a href="http://technorati.com/tag/folksonomy" rel="tag">folksonomy</a>,
<a href="http://technorati.com/tag/Web20" rel="tag">Web 2.0</a>,
<a href="http://technorati.com/tag/tag+cloud" rel="tag">tag cloud</a>,
<a href="http://technorati.com/tag/blog+advertising" rel="tag">blog advertising</a>,
<a href="http://technorati.com/tag/meta-blogging" rel="tag">meta-blogging</a>,
<a href="http://technorati.com/tag/echo+chamber" rel="tag">echo chamber</a>,
<a href="http://technorati.com/tag/David+Weinberger" rel="tag">David Weinberger</a>,
<a href="http://technorati.com/tag/Everything+is+Miscellaneous" rel="tag">Everything is Miscellaneous</a>,
<a href="http://technorati.com/tag/Animal+Farm" rel="tag">Animal Farm</a>,
<a href="http://technorati.com/tag/blog+comments" rel="tag">blog comments</a>,
<a href="http://technorati.com/tag/blog+design" rel="tag">blog design</a>,
<a href="http://technorati.com/tag/Web+Performance+Matters" rel="tag">Web Performance Matters</a>,
<a href="http://technorati.com/tag/UpRight+Matters" rel="tag">UpRight Matters</a>
</p>]]></content></entry><entry><title>If I Had A Hammer ...</title><category term="Life, The Universe, and Everything"/><category term="Optimization and Tuning"/><category term="Software Engineering "/><id>http://www.webperformancematters.com/journal/2007/9/10/if-i-had-a-hammer.html</id><link rel="alternate" type="text/html" href="http://www.webperformancematters.com/journal/2007/9/10/if-i-had-a-hammer.html"/><author><name>Chris Loosley</name></author><published>2007-09-10T21:45:00Z</published><updated>2007-09-10T21:45:00Z</updated><content type="html" xml:lang="en-US"><![CDATA[<span class="PageIllustration"><img src="http://www.webperformancematters.com/storage/post-graphics/Hammer.JPG" alt="Illustration: Ultimate Geeks Multi-Tool Hammer" title="Ultimate Geeks Multi-tool Hammer"/></span>

<p><em>If I had a hammer<br />
I'd hammer in the morning<br />
I'd hammer in the evening<br />
All over this land<br />
I'd hammer out danger<br />
I'd hammer out a warning<br />
I'd hammer out love between my brothers and my sisters<br />
All over this land</em></p>
<p class="QuoteSource">--Pete Seeger and Lee Hays, 1949 [<a href="http://en.wikipedia.org/wiki/If_I_Had_a_Hammer" class="offsite-link-inline">Wikipedia</a>]</p>

<p>In May 2007, after I wrote about <a href="http://www.webperformancematters.com/journal/2007/5/15/controlling-what-you-cant-measure.html" class="PMref"><em>Controlling What You Can't Measure</em></a>, I had a conversation with Ben Simo (see the comments) about metrics and tools, during which I wrote:

<blockquote>
<p>Hammers and chisels can be very dangerous, but carpenters use them every day, and we don't brand them as "bad tools" just because some people don't know how to use them properly. Human nature being what it is, there will always be some incompetent fools who try to use a hammer and chisel to drive in a screw or open a bottle of beer, just because they have those tools handy. </p>
</blockquote> 

<p>A few days later, while reading a series of articles on <a href="http://www.webperformancematters.com/journal/2007/5/22/performance-engineering.html" class="PMref">Performance Engineering</a> written by Scott Barber, I noticed the following quotation:</p>

<blockquote>
<p>All parts should go together without forcing. You must remember that the parts you are reassembling were disassembled by you. Therefore, if you can't get them together again, there must be a reason. <strong>By all means, do not use a hammer.</strong></p>
<p class="QuoteSource">--IBM maintenance manual, 1925 [emphasis added]</p>

</blockquote>

<p>This priceless piece of advice is quoted by Scott in <a href="http://www-128.ibm.com/developerworks/rational/library/4266.html" class="offsite-link-inline">part 9</a> of his 14-part series. At the time I made a note to write something about this, but after that it just sat in the "ideas for blog posts" folder for the next 3 months.</p>

<p>Until today, when I happened across the <a href="http://nexus404.com/Blog/2007/04/15/clever-multi-tool-hammer/" class="offsite-link-inline">Ultimate Geeks Multi-Tool Hammer</a>. Now, if I had <em>this</em> hammer, it turns out that I actually <em>could</em> use it to drive in a screw or open a bottle of beer, without being branded as an incompetent fool!</p>

<p class="Footnote"><strong>Tags:</strong>
<a href="http://technorati.com/tag/Scott+Barber" rel="tag">Scott Barber</a>,
<a href="http://technorati.com/tag/Ben+Simo" rel="tag">Ben Simo</a>,
<a href="http://technorati.com/tag/multi-tool" rel="tag">multi-tool</a>,
<a href="http://technorati.com/tag/hammer" rel="tag">hammer</a>,
<a href="http://technorati.com/tag/Performance+Matters" rel="tag">Performance Matters</a>
</p>]]></content></entry><entry><title>Scalability is Not Optional</title><category term="Architecture"/><category term="Blogs and Publications"/><category term="Software Engineering "/><id>http://www.webperformancematters.com/journal/2007/9/7/scalability-is-not-optional.html</id><link rel="alternate" type="text/html" href="http://www.webperformancematters.com/journal/2007/9/7/scalability-is-not-optional.html"/><author><name>Chris Loosley</name></author><published>2007-09-07T22:00:00Z</published><updated>2007-09-07T22:00:00Z</updated><content type="html" xml:lang="en-US"><![CDATA[<span class="PageIllustration"><img src="http://www.webperformancematters.com/storage/post-graphics/Kent%20Langley.jpg" alt="Illustration: Kent Langley" title="Kent Langley"/></span>

<p>My recent post, <a href="http://www.webperformancematters.com/journal/2007/8/21/asynchronous-architectures-4.html" class="PMref">Asynchronous Architectures [4]</a>, summarized a presentation by Werner Vogels at the 2007 <a href="http://qcon.infoq.com/london-2007/conference/" class="offsite-link-inline">QCON</a> conference in London.</p>

<p>A subsequent post by <a href="http://www.productionscale.com/kent/" class="offsite-link-inline">Kent Langley</a> in his new <a href="http://www.productionscale.com/" class="offsite-link-inline">ProductionScale</a> blog -- entitled <a href="http://www.productionscale.com/home/2007/8/11/getting-rid-of-the-relational-database.html" class="offsite-link-inline"><em>Getting Rid of the Relational Database</em></a> -- supports the arguments advanced by Vogels.</p>

<p>Describing the relational database model as "the proverbial ball and chain in the relationship between scalable applications and the underlying infrastructure," Kent writes:</p>

<blockquote>
<p>The quest for seamless linear growth for technology applications is being hindered by the “elephant database.”</p>

<p>What would Amazon do? In a recent talk2 at QCON London Werner Vogel, the CTO of Amazon.com clearly noted that the relational database model is a essentially outdated for the needs of modern applications as a primary data storage medium. In other words, it is simply to slow and cumbersome.</p>

<p>Additionally, Mr. Vogel makes a critical point that in many, many cases relational databases are simply not necessary. Simple key/value pairs (hashes) are all you need.</p>

<p class="QuoteSource">--Joseph Kent Langley, <a href="http://www.productionscale.com/home/2007/8/11/getting-rid-of-the-relational-database.html" class="offsite-link-inline"><em>Getting Rid of the Relational Database</em></a>, August 11, 2007</p>
</blockquote>

<p>Kent goes on to describe why he believes "you should break out of a one-size-fits-all way of thinking when it comes to databases, data storage, and scalable systems. Vertical scaling by throwing hardware at it is no longer sufficient for modern web scale applications".</p>

<p>Kent also points to <a href="http://future.gigaom.com/2007/08/10/data-20-how-the-web-disrupts-our-relational-database-world/" class="offsite-link-inline">Data 2.0: How the Web disrupts our relational database world</a>, which he admits he has not read. Maybe if he had read the article he might have omitted this link.</p>

<p>Although the author of that article, Nitin Borwankar, supports Vogel's general conclusions, his style is to make sweeping pronouncements. He advances no technical arguments that lead up to his conclusion that <em>"The days of Data 1.0 are past. The days of Data 2.0 are dawning, and it promises to be very disruptive for mainstream database architectures on the Web"</em>.</p>

<h3>Other posts about scalability</h3>

<p>I recommend Kent's new blog, and I'm adding it to my blogroll. It looks as if it will contain regular discussions of performance topics. For example, since launching the blog in early August, Kent has already written about:</p>

<ul class="group">
<li><a href="http://www.productionscale.com/home/2007/8/5/scalable-lamp-caching.html" class="offsite-link-inline">Scalable LAMP: Caching</a></li>
<li><a href="http://www.productionscale.com/home/2007/8/5/varnish-a-web-accelerator.html" class="offsite-link-inline">Varnish - A Web Accelerator</a> [a fast reverse proxy caching system]</li>
<li><a href="http://www.productionscale.com/home/2007/8/21/the-power-of-mod_deflate.html" class="offsite-link-inline">The Power of mod_deflate</a> [about content compression]</li>
<li><a href="http://www.productionscale.com//home/2007/8/22/scalability-and-performance-a-few-resources.html" class="offsite-link-inline">Scalability and Performance: A Few Resources</a></li>
<li><a href="http://www.productionscale.com/home/testing-with-wbox.html" class="offsite-link-inline">Testing with WBox</a> [about scalability testing]</li>
</ul>

<h3>Proofread before publishing</h3>

<p>I do have one small complaint. As a blogger, I know the feeling of writing down my thoughts and wanting to get them published -- right now! The short publishing cycle is one of the attractions of a blog. But if Kent could just curb his enthusiasm for long enough to proofread his posts once carefully before hitting that <em>Publish</em> button, his thoughts would be a lot easier to follow:</p>

<blockquote>
<h4>Huh?</h4>
<ul class=group>
<li>Afterwards, I will follow up with a brief analysis or executive summary if you will of this infobit might mean for businesses. <span class="aside">Needs commas around "if you will," and "of" should be "of what".</span></li>
<li>By way if example using the techniques of bond arbitrage Stonebraker notes quite earnestly that it is a “latency arms race.” <span class="aside">Needs commas around "using ... arbitrage," and "if" should be "of".</span></li>
<li>So, is this inconclusive evidence of the pending death of the Relational Database? Of course not. <span class="aside">"Inconclusive" should be "conclusive".</span></li>
<li>But, it is trend spotting in that people are again noticing that there are other ways and that those other ways just might quite faster with modern applications. <span class="aside">"might quite" should be "might be".</span></li>
</ul>
<p class="QuoteSource">--Joseph Kent Langley, <a href="http://www.productionscale.com/home/2007/8/11/getting-rid-of-the-relational-database.html" class="offsite-link-inline"><em>Getting Rid of the Relational Database</em></a>, August 11, 2007</p>
</blockquote>

<p>Although I can infer what Kent is trying to say here, these glitches spoil the overall effect by forcing me to re-read his sentences to get the point. In elementary school, I learned the old English proverb: <a href="http://www.usingenglish.com/reference/idioms/spoil+the+ship+for+a+ha%27pworth+of+tar.html" class="offsite-link-inline"><em>Don't spoil the ship for a ha'pworth of tar</em></a>. I believe bloggers should consider readability to be as important as their message, if they want to build a faithful following. </p>

<p class="Footnote"><strong>Tags:</strong>
<a href="http://technorati.com/tag/scalability" rel="tag">scalability</a>,
<a href="http://technorati.com/tag/Kent+Langley" rel="tag">Kent Langley</a>,
<a href="http://technorati.com/tag/ProductionScale" rel="tag">ProductionScale</a>,
<a href="http://technorati.com/tag/Werner+Vogels" rel="tag">Werner Vogels</a>,
<a href="http://technorati.com/tag/QCON" rel="tag">QCON</a>,
<a href="http://technorati.com/tag/relational+database" rel="tag">relational database</a>,
<a href="http://technorati.com/tag/Web+applications" rel="tag">Web applications</a>,
<a href="http://technorati.com/tag/Performance+Matters" rel="tag">Performance Matters</a>
</p>]]></content></entry><entry><title>Managing for Business Effectiveness</title><category term="Articles and White Papers"/><category term="Business Perspectives"/><category term="Management Wisdom"/><id>http://www.webperformancematters.com/journal/2007/8/29/managing-for-business-effectiveness.html</id><link rel="alternate" type="text/html" href="http://www.webperformancematters.com/journal/2007/8/29/managing-for-business-effectiveness.html"/><author><name>Chris Loosley</name></author><published>2007-08-29T07:01:00Z</published><updated>2007-08-29T07:01:00Z</updated><content type="html" xml:lang="en-US"><![CDATA[<div class="PageWisdomWrapper">

<div class="WisdomTitle" >
<h3>Drucker on Effectiveness vs. Efficiency</h3>
<p class="WisdomClass" ><a href=" /display/ShowJournal?moduleId=1113404&categoryId=109667">Management Wisdom</a>: 3</p>
</div>

<p class="WisdomQuote">There is surely nothing quite so useless as doing with great efficiency what should not be done at all</p>

<div class="WisdomText">
</div>

<p class="QuoteSource">-- Peter Drucker, 1963</p>
</div>

<p><a href="http://en.wikipedia.org/wiki/Peter_Drucker" class="offsite-link-inline">Peter Drucker</a> is often called "the father of modern management". Many books and Web sites are devoted to his insights, some of which I have <a href="http://www.webperformancematters.com/journal/2006/3/14/deep-thoughts-on-management.html" class="offsite-link-inline">written about</a> previously.</p>

<p>This post highlights his incisive observation about the difference between <em>effectiveness</em> and <em>efficiency</em>. I have always found it to be especially memorable, and quoted it (twice) when discussing priorities and choices in my book about software performance. Unfortunately I got the source wrong, but thanks to Google I can now correct my mistake. </p>

<p>It appeared in <em>Managing for Business Effectiveness</em>, an article in the May/June 1963 edition of Harvard Business Review ("HBR"). You can also find it in a February 2006 HBR article -- <a href="http://harvardbusinessonline.hbsp.harvard.edu/b02/en/common/item_detail.jhtml?id=R0602J" class="offsite-link-inline">What Executives Should Remember</a> -- a collection of excerpts drawn from HBR articles by Drucker published between 1963 and 2004.</p>

<p>Because Drucker's remarks are equally relevant to technical performance management and business leadership, I am cross-posting this here on <em>Web Performance Matters</em>, and on our new <a href="http://www.uprightmatters.com/" class="UMref"><em>UpRight Matters</em></a> blog. </p>

<h3>Three key questions</h3>

<p>In his 1963 essay, Drucker states that there is no magic formula, checklist, or procedure that will substitute for the hard, demanding, risk-taking work of management. But he claims that "we know how to organize the job of managing for economic effectiveness and how to do it with both direction and results. The answers to the [following] three key questions ... are known, and have been known for such a long time that they should not surprise anyone."</p>
 
<blockquote>
<p><strong>1. What is the manager's job?</strong> It is to direct the resources and efforts of the business toward opportunities for economically significant results. This sounds trite—and it is. But every analysis of actual allocation of resources and efforts in business that I have ever seen or made showed clearly that <em>the bulk of time, work, attention, and money first goes to "problems" rather than to opportunities, and, secondly, to areas where even extraordinarily successful performance will have minimum impact on results.</em></p>
 
<p><strong>2. What is the major problem?</strong> It is fundamentally the confusion between effectiveness and efficiency that stands between doing the right things and doing things right. <em>There is surely nothing quite so useless as doing with great efficiency what should not be done at all.</em> Yet our tools—especially our accounting concepts and data—all focus on efficiency. What we need is (1) a way to identify the areas of effectiveness (of possible significant results), and (2) a method for concentrating on them.</p>

<p><strong>3. What is the principle?</strong> That, too, is well-known—at least as a general proposition. Business enterprise is not a phenomenon of nature but one of society. In a social situation, however, events are not distributed according to the "normal distribution" of a natural universe (that is, they are not distributed according to the U-shaped Gaussian curve). <em>In a social situation a very small number of events—10 percent to 20 percent at most—account for 90 percent of all results, whereas the great majority of events account for 10 percent or less of the results.</em></p>

<p class="QuoteSource">-- Peter Drucker, <em>Managing for Business Effectiveness</em>, Harvard Business Review, May/June 1963</p>
</blockquote>

<h3>A principled foundation</h3>

<p>Although Drucker writes about management effectiveness in the context of business performance, specialists in software or systems performance must ask the same questions and apply the same principles. In my book on performance management [<a href="http://www.amazon.com/exec/obidos/tg/detail/-/0471162698/002-1562714-5063248?v=glance" class="offsite-link-inline">Amazon</a>], I described these principles as follows: </p>

<ul>
<li>The Centering Principle: Focus on the most performance-critical components.</li>
<li>The Efficiency Principle: Maximize the ratio of useful work to overhead.</li>
<li>The Pareto Principle: Prioritize the 20% of the problem that will return 80% of the benefits.</li>
</ul>

<p>Drucker concludes that the most crucial requirement for effective management is having ... </p>

<p> ... <em>the courage to go through with logical decisions -- despite all pleas to give this or that product another chance, and despite all such specious alibis as the accountant's "it absorbs overhead" or the sales manager's "we need a full product line."</em></p>

<p>This is one small example of the characteristic I find so appealing in Drucker's writing. His advice starts from an assumption that there <strong>are</strong> relevant principles, and that you can make decisions by reasoning logically from those foundations. As a mathematician, this way of looking at the world appeals to my sense of order and logic, rather than presenting me with a collection of unsupported assertions and beliefs. The HBR introduction to its review, <em>What Executives Should Remember</em>, sums up Drucker's appeal as follows:</p>

<blockquote>
<p>Executives had come to think they knew how to run companies, and Drucker took it upon himself to poke holes in their beliefs, lest organizations become stale. But he did so in a sympathetic way. He assumed that his readers were intelligent, rational, hardworking people of goodwill. If their organizations struggled, he believed it was usually because of outdated ideas, a narrow conception of a problem, or internal misunderstandings. His insights were ... practical idea-based essays for executives, and his clear-eyed humanistic writing enhanced the magazine time and again. He helped us all to think broadly and deeply.</p>

<p class="QuoteSource">-- What Executives Should Remember, Harvard Business Review, February 2006</p>
</blockquote>

<p>This is why so many people have enjoyed, and like <a href="http://www.marketingheadhunter.com/about.html" class="offsite-link-inline">Harry Joiner</a>, continue to <a href="http://www.marketingheadhunter.com/executive_search/2005/11/peter_drucker.html" class="offsite-link-inline">enjoy daily</a>, the wisdom of Peter Drucker.<p> 

<p class="Footnote"><strong>Tags:</strong>
<a href="http://technorati.com/tag/management" rel="tag">management</a>,
<a href="http://technorati.com/tag/management+principles" rel="tag">management principles</a>,
<a href="http://technorati.com/tag/management+wisdom" rel="tag">management wisdom</a>,
<a href="http://technorati.com/tag/Peter+Drucker" rel="tag">Peter Drucker</a>,
<a href="http://technorati.com/tag/effectiveness" rel="tag">effectiveness</a>,
<a href="http://technorati.com/tag/efficiency" rel="tag">efficiency</a>,
<a href="http://technorati.com/tag/Pareto+Principle" rel="tag">Pareto Principle</a>,
<a href="http://technorati.com/tag/80-20+rule" rel="tag">80-20 rule</a>,
<a href="http://technorati.com/tag/Harry+Joiner" rel="tag">Harry Joiner</a>,
<a href="http://technorati.com/tag/UpRight+Matters" rel="tag">UpRight Matters</a>
</p>]]></content></entry><entry><title>Asynchronous Architectures [4]</title><category term="Architecture"/><category term="Events"/><category term="Foundations of Performance"/><category term="Software Engineering "/><id>http://www.webperformancematters.com/journal/2007/8/21/asynchronous-architectures-4.html</id><link rel="alternate" type="text/html" href="http://www.webperformancematters.com/journal/2007/8/21/asynchronous-architectures-4.html"/><author><name>Chris Loosley</name></author><published>2007-08-21T07:01:00Z</published><updated>2007-08-21T07:01:00Z</updated><content type="html" xml:lang="en-US"><![CDATA[<span class="PageIllustration"><img src="http://www.webperformancematters.com/storage/post-graphics/Werner%20Vogels.jpg" alt="Illustration: Werner Vogels" title="Werner Vogels"/></span>

<p><em>This is the fourth in a series of posts presenting arguments for <strong>asynchronous architectures</strong> as the optimal way to build high-performance, scalable systems for a distributed environment.</em></p>

<p>In a <a href="http://qcon.infoq.com/qcon-london-2007/conference/" class="offsite-link-inline">QCon conference</a> presentation on <em><strong>Availability and Consistency</strong> or how the CAP theorem ruins it all</em>, <a href="http://www.infoq.com/presentations/availability-consistency" class="offsite-link-inline">Werner Vogels</a>, Amazon CTO, examines the tension between availability & consistency in large-scale distributed systems, and presents a model for reasoning about the trade-offs between different solutions.</p>

<p>I recommend you find time to watch the entire 52-minute video. The flash streaming technology that InfoQ uses is subject to buffering hiccups, and you may have to restart it a few times. So in case you want to jump to a specific section, I've assembled copies of Werner's slides, with short timestamped notes on the content of each section. Werner did not present his slides in their numbered order, so in my notes I identify slides using the numbers printed on them, not their presentation order.</p>

<h3>Introduction</h3>

<p><strong>0:50:</strong> CTO's must match business with technology. Most really big IT shops <em>must</em> push the edge of what commercial technology can do. Technology has a very long adoption cycle -- it takes about 10 to 15 years for new technology to mature and be effective. For leading companies like Amazon, that's too slow, the scalability challenges are so great that they demand advanced solutions. So shops are forced (in effect) to do their own research, take advanced steps, just to succeed in a competitive marketplace. </p>

<p><strong>2:15:</strong> Werner noted that his viewpoint disagreed strongly with that of <a href="http://qcon.infoq.com/qcon-london-2007/speakers/show_speaker.jsp?oid=137" class="offsite-link-inline">Cameron Purdy</a>, CEO of Tangosol, who was an advocate of database technology.</p>

<p><strong>3:00:</strong> He introduced Eric Brewer's CAP theorem -- more later. 
[See the end of my previous post in this series, <a href="http://www.webperformancematters.com/journal/2007/8/15/asynchronous-architectures-3.html" class="PMref">Asynchronous Architectures [3]</a>. The CAP theorem was first propounded in a 1998 presentation -- <a href="http://www.ccs.neu.edu/groups/IEEE/ind-acad/brewer/" class="offsite-link-inline">Lessons from Internet Services: ACID vs. BASE</a> -- by Dr. Eric Brewer of Inktomi, now a <a href="http://www.cs.berkeley.edu/~brewer/" class="offsite-link-inline">professor</a> at UC Berkeley].</p>

<h3>3:45: What is Scalability? [slide 2]</h3>

<span class="full-image-float-none"><img src="http://www.webperformancematters.com/storage/post-graphics/Vogels%20CAP%20Theorem%202.JPG" alt="Vogels%20CAP%20Theorem%202.JPG" title="Vogels%20CAP%20Theorem%202.JPG"/></span>

<p><strong>3:45:</strong> The meat of Werner's QCon presentation really begins here. <em> Proportional</em> is the key word in these definitions. Adding resources should deliver increased capacity <em>proportional</em> to the added resources. Or if the intent was to deliver better performance, the gains should be <em>proportional</em> to the added resources. Performance here is not just about response, it could mean transfering more data or larger datasets. </p>

<p><strong>4:40:</strong> Another reason for needing scalability is to achieve fault-tolerance. Adding resources to achieve redundancy should not hurt your performance. Traditional technologies (like databases) won't give you this kind of scalability, because overheads increase as you scale up. These are subjects I discussed at length when explaining <em>The Parallelism Principle</em> in <em>High-Performence Client/Server</em>: </p>

<blockquote>
<h4>13.1  The Parallelism Principle: Exploit parallel processing</h4>
	
<p>Processing related pieces of work in parallel typically introduces additional synchronization overheads, and often introduces contention among the parallel streams. Use parallelism to overcome bottlenecks, provided the processing speedup offsets the additional costs introduced.</p>

<h4>13.2  Scalability and speed up</h4> 

<p><em>Scalability</em> refers to the capacity of the system to perform more total work in the same elapsed time, when its processing power is increased. </p>
<p><em>Speed up</em> refers to the capacity of the system to perform a particular task in a shorter time, when its processing power is increased.</p>
<p>In a system with linear scalability and speed up, any increase in processing power generates a proportional improvement in throughput or response time. </p>

<p class="QuoteSource">--<a href="http://www.amazon.com/exec/obidos/tg/detail/-/0471162698/002-1562714-5063248?v=glance" >High-Performance Client/Server</a>, Chapter 13, pp383-385.</p>
</blockquote>

<h3><strong>8:15:</strong> Scalability for Real Systems [slide 3]</h3>

<span class="full-image-float-none"><img src="http://www.webperformancematters.com/storage/post-graphics/Vogels%20CAP%20Theorem%203.JPG" alt="Vogels%20CAP%20Theorem%203.JPG" title="Vogels%20CAP%20Theorem%203.JPG"/></span>

<p><strong>7:00:</strong> Slide 3 is the conclusion of a cost discussion that begins before the slide is shown. The biggest threat to availability is bugs, which are a cost factor introduced by humans. So operating costs must not grow as you scale up.</p>

<h3><strong>8:45:</strong> But ... [slide 4]</h3>

<span class="full-image-float-none"><img src="http://www.webperformancematters.com/storage/Vogels%20CAP%20Theorem%204.JPG" alt="Vogels%20CAP%20Theorem%204.JPG" title="Vogels%20CAP%20Theorem%204.JPG"/></span>

<p><strong>8:30:</strong> Traditional technologies, databases, two-phase commit may work for 2-4 nodes, but they will not scale to 100's (let alone 10.000) nodes. You may not have 10,000 nodes like Amazon, but you will run into these scalability challenges at 50-100 nodes. </p>

<h3>10:05: Principles for Scalable Service Design [slide 13]</h3>

<span class="full-image-float-none"><img src="http://www.webperformancematters.com/storage/Vogels%20CAP%20Theorem%2013.JPG" alt="Vogels%20CAP%20Theorem%2013.JPG" title="Vogels%20CAP%20Theorem%2013.JPG"/></span>

<p><strong>10:05:</strong> Guidelines for services design at Amazon -- a checklist of lessons learned through hard experience:</p>

<ul>
<li><strong>10:05:</strong> Decentralize. Any algorithm that requires agreement will eventually become a bottleneck. Two-phase commit is an in effect an <em>unavailability</em> algorithm, it is guaranteed to fail as you scale up the number of participating services.</li>
<li><strong>10:50:</strong> Asynchrony. Make progress under all cicumstances, even if the world is burning around you. Even if fulfillment services are burning down, you want people to be able to place orders. So work locally, don't worry about the rest of the system.</li>
<li><strong>11:40:</strong> Autonomy: Each node should be able to make decisions based only on local state. If you need to reach agreement based on global conditions at high load, you are lost. Nodes may be failing, coming up, going down all the time. Probabilistic techniques work well in these circumstances.</li>
<li><strong>12:35:</strong> Controlled concurrency. Reduce concurrency as much as possible, so that you do not need to use locking.</li>
<li><strong>13:15:</strong> Controlled parallelism. Control traffic going to each node using careful load balancing; nodes must have spare CPU and I/O capacity so that they can do other tasks (like load re-balancing) in the background.</p>
<li><strong>14:10:</strong> Symmetry. Things work really well if all nodes do exactly the same thing. It is easy to add more nodes if nodes do not have to be identified as a <em>directory node</em>, a <em>data-storage node</em>, etc. Ideally, you just install the software and run it, and it responds to any client request and does whatever task is needed, or maybe forwards the request if necessary. This is the logical way to address a requirement that I first documented in a 1993 paper, and later included in Chapter 16, Architecture for High Performance, of my book: </p>
</ul>

<blockquote>
<p>For a large organization, moving to an enterprise client/server system represents a major shift from monolithic systems with fixed distribution to dynamic, heterogeneous, pervasively networked environments. The next generation of systems will be an order of magnitude more dynamic--always running, always changing--with thousands of machines in huge networks.</p>
<p>In such an environment, content components (service providers like DBMSs) and service consumers (e.g. GUIs) must be continually added and removed.</p>
<p>The key to doing this is the middle tier, the hub of the three tier architecture. In the first place, this central layer acts in a connecting role to let individual clients access multiple content servers, and (of course) servers support multiple clients. A separate central tier can also:</p>
<ul>
<li>Provide a set of services that can be dynamically invoked by both the consumer and content layers</li>
<li>Allow new services to be added without major reconfiguration</li>
<li>Allow services to be removed dynamically without affecting any participant not using those services</li>
<li>Allow one service provider to be replaced by another</li>
</ul>	
<p>These are all vital characteristics in a distributed computing environment.</p>
<p class="QuoteSource">--<a href="http://www.amazon.com/exec/obidos/tg/detail/-/0471162698/002-1562714-5063248?v=glance" >High-Performance Client/Server</a>, Chapter 16, pp514-515.</p>
</blockquote>

<p><strong>15:10:</strong> Algorithms that force you to obtain agreement will become a bottleneck. So avoid using two-phase commit, maybe by denormalization to make sure your transaction always runs within a single node. Or split your task into multi-transaction workflows. You have to take an end-to-end look at the business transaction and decide. <span class="aside">[I have always advocated this approach -- see the conclusions of the second <a href="http://www.webperformancematters.com/journal/2007/8/14/asynchronous-architectures-2.html" class="PMref">post</a> in this series].</span></p>

<p><strong>17:40:</strong> You can reuse some of those principles in building teams. Small teams are best, so that each team is responsible for a well-understood piece. Team effectiveness is just as important as architectural consistency. </p> 

<p><strong>19:00:</strong> We call this the two pizza rule -- <em>If you can't feed a team with two pizzas, it's too big</em>. OK, hungry just-out-of-college students do eat more, but they work harder too! As soon as you need more than 8 people, it's hard to understand what everyone is doing. Bigger teams, of 12 or more, must have meetings, and must spend a much larger percentage of their time communicating. This discussion harks back to the famous observation by Fred Brooks: </p>

<blockquote>
<h4>The Mythical Man-Month</h4>
<p>Men and months are interchangeable commodities only when a task can be partitioned among many workers <em>with no communication among them</em>... </p>
<p>In tasks that can be partitioned but which require communication among the subtasks, the effort of communication must be added to the amount of work to be done... </p>
<p>The added burden of communication is made up of two parts, training and intercommunication... </p>
<p>If each part of the task must be separately coordinated with each other part, the effort increases as n(n-1)/2. Three workers require three times as much pairwise intercommunication as two, four require six times as much as two. If, moreover, there need to be conferences among three, four, etc., workers to resolve things jointly, matters get worse yet. The added effort of communicating may fully counteract the division of the original task.
<p class="QuoteSource">--The Mythical Man-Month, Frederick P. Brooks, 20th Anniversary Edition pp17-18, Addison Wesley, 1995.</p>   
</blockquote>

<p><strong>21:20:</strong> At Amazon, not all the services (1000 or more) support Web interactions at Amazon.com. Many are in the back-end systems such as supply-chain, fulfillment, enterprise services, handling feeds from 3rd-party suppliers, item management, recommendations, personalization.</p>

<p><strong>22:15:</strong> Example of <em>statistically improbable phrases</em> (SIPs), an interesting digression about text analysis being implemented as yet another service. (Too long. The details are a plug for Amazon, but take time away from the main thread of the presentation). </p>

<p><strong>24:30:</strong> Conclusion of the SIP discussion -- you need dependency management, and contracts. Servers can give an SLA based on workload conditions, that clients must honour. Automatic dependency discovery -- Amazon has home-grown tools that can show where dependencies exist, and the effects of failures in a network of nodes.</p>

<h3>26:00:</strong> Scalability Through Smart System Engineering [slide 12]</h3>

<span class="full-image-float-none"><img src="http://www.webperformancematters.com/storage/post-graphics/Vogels%20CAP%20Theorem%2012.JPG" alt="Vogels%20CAP%20Theorem%2012.JPG" title="Vogels%20CAP%20Theorem%2012.JPG"/></span>

<p><strong>26:00:</strong> Use scalable primitives. For example, RPC is <em>not</em> scalable. Don't conceal heterogeneity. We can pretend that systems don't fail, but in practice they do. That's the problem with RPC, it pretends to be a procedure call but it isn't, so transparency does not really work, failures <strong>do</strong> happen, performance differences <strong>do</strong> exist. So don't conceal these differences.</p>

<p><strong>28:00:</strong> Configuration management. If you have 1000 services, configuration becomes really important. If your applications involve strong consistency properties, they can create problems when people leave your team.</p>

<p><strong>29:00:</strong> Repair and recovery. Check out the work on <a href="http://roc.cs.berkeley.edu/roc_overview.html" class="offsite-link-inline">Recovery Oriented Computing</a> (at Stanford and Berkeley) by <a href="http://www.cs.berkeley.edu/~pattrsn/" class="offsite-link-inline">Dave Patterson</a> and others. Can you design services to restart fast, maybe by keeping log information? If that really works well, then you can design your entire system around the principles of recovery and restart. If you don't like the behavior or performance of a service, you can kill it and let it restart. If it can be functioning again in a minute, this systems design approach can be very effective.</p>

<h3>30:40: CAP Conjecture [slide 8]</h3>

<span class="full-image-float-none"><img src="http://www.webperformancematters.com/storage/post-graphics/Vogels%20CAP%20Theorem%208.JPG" alt="Vogels%20CAP%20Theorem%208.JPG" title="Vogels%20CAP%20Theorem%208.JPG"/></span>

<p><strong>30:40:</strong> At Amazon, all data applications are dominated by this theorem. Traditional data applications assumed that if you stored something in a database it would never go away <span class="aside">[<strong>D</strong>urability, the "D" in the <a href="http://en.wikipedia.org/wiki/ACID" class="offsite-link-inline">ACID properties</a>]</span>. In reality, because of redundancy, many nodes can be working in parallel and storing information, and then bad things can happen.</p>

<h3>32:00: A Clash of Cultures [slide 5]</h3>

<span class="full-image-float-none"><img src="http://www.webperformancematters.com/storage/post-graphics/Vogels%20CAP%20Theorem%205.JPG" alt="Vogels%20CAP%20Theorem%205.JPG" title="Vogels%20CAP%20Theorem%205.JPG"/></span>

<p><strong>32:00:</strong> There's nothing wrong with transactions, they create a nice clean programming paradigm, and are good for programmers. But you must design for failure cases, because <em>transactions can fail</em>. So the ACID properties are great if you can get them, but getting these guarantees is costly. It may be fine if only a single node accesses the data. but not if 10's or 100's of machines need access. <strong></p>

<p>[33:30]</strong> In that case another, more fuzzy, approach may be better -- BASE, in which data is <em>basically available, more or less</em>. Applications maintain a <em>soft state</em>, in which data is eventually consistent.</p>

<h3>34:05: ACID vs BASE [unnumbered]</h3>

<span class="full-image-float-none"><img src="http://www.webperformancematters.com/storage/post-graphics/Vogels%20CAP%20Theorem%205a.JPG" alt="Vogels%20CAP%20Theorem%205a.JPG" title="Vogels%20CAP%20Theorem%205a.JPG"/></span>

<p><strong>34:05:</strong> ACID has a pessimistic behavior, it will fail if it cannot reach the guarantees that you want. Availability is less important than <em>consistency</em>. For BASE systems, <em>availability </em>is the most important, and you are willing to sacrifice something to ensure it. So, for example, in a Web application you will design an application to accept and store shopping-cart input from a customer, and deal with minor problems in the data later. It's a weaker level of consistency, but you never want to tell the customer you can't accept their input.</p>

<h3>35:50: Why the Divide? [Slide 7]</h3>

<span class="full-image-float-none"><img src="http://www.webperformancematters.com/storage/post-graphics/Vogels%20CAP%20Theorem%207.JPG" alt="Vogels%20CAP%20Theorem%207.JPG" title="Vogels%20CAP%20Theorem%207.JPG"/></span>

<p><strong>35:50:</strong> CAP stands for <strong>C</strong>onsistency, <strong>A</strong>vailability, and <strong>P</strong>artitioning. Eric Brewer came up with the conjecture that <em>systems can only possess two of these three characteristics</em>, which was subsequently proved to be true. That means systems designers must make choices, they must decide how to handle data reads and writes. If you insist on always enforcing consistency, your system may have to reject data interactions, making the system (in effect) unavailable at certain times. If you value availability and want to always accept user interactions, your application must then deal with the fact that some of its responses may later turn out to have been inconsistent.</p>

<p><strong>38:45:</strong> Sometimes applications can deal with this. In the Web environment, the common technique of customer stickiness may help you to operate with lower levels of consistency. Once they have begun a session, customers are typically redirected to the same server cluster, or data center. So a local level of data consistency is sufficient; global consistency is unnecessary. </p>

<h3><strong>39:30:</strong> Consistency and Availability [slide 9]</h3>

<span class="full-image-float-none"><img src="http://www.webperformancematters.com/storage/post-graphics/Vogels%20CAP%20Theorem%209.JPG" alt="Vogels%20CAP%20Theorem%209.JPG" title="Vogels%20CAP%20Theorem%209.JPG"/></span>

<p><strong>39:30:</strong> Many applications have a workflow behavior. First the customer interacts with the shopping cart. At this time, availability is the most important. After that you do all kinds of things with that data, and during those activities, consistency is the most important. Now, because you are not interacting with the customer directly, if you can't obtain consistency for one data item, you can move on to process a different data item and come back later. Then you get to the shipment and delivery phase, and at this time the database is mostly read only. A data architecture that forces you to use the same powerful tool -- like a big relational database -- for all these different activities is not ideal. If you select data storage solutions that are appropriate for each phase, it's easier to scale your solution.</p>

<h3><strong>44:00:</strong> Partition-Tolerance and Availability [slide 10]</h3>

<span class="full-image-float-none"><img src="http://www.webperformancematters.com/storage/post-graphics/Vogels%20CAP%20Theorem%2010.JPG" alt="Vogels%20CAP%20Theorem%2010.JPG" title="Vogels%20CAP%20Theorem%2010.JPG"/></span>

<p><strong>44:00:</strong> It's hard to program for weaker levels of consistency. Amazon has developed some API's, but Werner had no time to discuss these solutions. Slide 10 lists some examples, which he discussed briefly. The core design approach involves guaranteeing the durability of data inputs while relaxing consistency enforcement, then returning later to deal with any inconsistencies. </p>

<h3><strong>45:40:</strong> Techniques [slide 11]</h3>

<span class="full-image-float-none"><img src="http://www.webperformancematters.com/storage/post-graphics/Vogels%20CAP%20Theorem%2011.JPG" alt="Vogels%20CAP%20Theorem%2011.JPG" title="Vogels%20CAP%20Theorem%2011.JPG"/></span>

<p><strong>45:40:</strong> Read the slide, because Werner does not talk about it!</p>

<p>We used to use a lot of DB technology at Amazon. It works really well, especially if most applications manipulate single data records using their primary keys. You can still create accessors that iterate over the entire database, but these should be relegated to a lower priority, background, status. The primary interfaces should offer only simple get/put accesses. In a production database that supports transactions, you don't need to also support queries, especially if the data is just XML text anyway. If engineers know what's inside those XML records, they may start coding against it! </h3>

<p><strong>48:00:</strong> Whatever DM software you are running, databases that require high performance need specialists to configure, operate, and manage them. Engineers can't do it effectively, you need DBAs, even for very simple access patterns. <span class="aside">[<strong>Guideline 19.5</strong> in High-Performance Client/Server: Although DBMSs may offer similar features, implementations usually differ. Never assume that a design rule of thumb learned for one DBMS can be applied unchanged to another.]</span> </p>

<h3><strong>50:30:</strong> What does this mean for the data architecture?</h3>

<span class="full-image-float-none"><img src="http://www.webperformancematters.com/storage/post-graphics/Vogels%20CAP%20Theorem%2014.JPG" alt="Vogels%20CAP%20Theorem%2014.JPG" title="Vogels%20CAP%20Theorem%2014.JPG"/></span>

<p><strong>50:30:</strong> Again, read the slide, because in the edited presentation stream, Werner appears to be speaking to a different slide altogether. And then he ran out of time, so ...</p>

<p>... that's it. A really insightful and informative talk by Werner Vogels. No doubt his presentation could have been improved, given more time, or even just better use of the time available. But all the same, it is very stimulating (I think) and well worth several listens, until you grasp the central points -- all of which I agree with. In fact, Werner's conclusions circle back to the conclusion of my book, and my opening statement in the <a href="http://www.webperformancematters.com/journal/2007/8/13/asynchronous-architectures-1.html" class="offsite-link-inline">first post</a> in this series: </p>

<div class="InlineTextBox">
<p><em>Decoupled processes and multi-transaction workflows are the optimal starting point for the design of high-performance (distributed) systems.</em></p>
</div>

<p>Documenting this talk has been both educational and satisfying. But -- since I can't type nearly as quickly as Werner can talk -- I may have misquoted him somewhere. If you spot a mistake please let me know, and I'll correct it.</p> 


<p class="Footnote"><strong>This series of posts</strong> contains some material first published in <a href="http://www.amazon.com/exec/obidos/tg/detail/-/0471162698/002-1562714-5063248?v=glance" >High-Performance Client/Server</a>. My 1998 book is out of print now, and contains some outdated examples and references. But most of the discussions of performance principles are timeless, and you can pick up a used copy for about $3.00 at Amazon.</p>

<p class="Footnote"><strong>Tags:</strong>
<a href="http://technorati.com/tag/Werner+Vogels" rel="tag">Werner Vogels</a>,
<a href="http://technorati.com/tag/Amazon" rel="tag">Amazon</a>,
<a href="http://technorati.com/tag/QCon" rel="tag">QCon</a>, 
<a href="http://technorati.com/tag/distributed+systems" rel="tag">distributed systems</a>, 
<a href="http://technorati.com/tag/asynchronous+architecture" rel="tag">asynchronous architecture</a>,
<a href="http://technorati.com/tag/Web+services" rel="tag">Web services</a>,
<a href="http://technorati.com/tag/SOA" rel="tag">SOA</a>,
<a href="http://technorati.com/tag/performance" rel="tag">performance</a>,
<a href="http://technorati.com/tag/scalability" rel="tag">scalability</a>,
<a href="http://technorati.com/tag/synchronization" rel="tag">synchronization</a>, 
<a href="http://technorati.com/tag/autonomy" rel="tag">autonomy</a>, 
<a href="http://technorati.com/tag/multi-transaction" rel="tag">multi-transaction</a>,
<a href="http://technorati.com/tag/workflow" rel="tag">workflow</a>, 
<a href="http://technorati.com/tag/David Patterson" rel="tag">David Patterson</a>,
<a href="http://technorati.com/tag/Recovery+Oriented+Computing" rel="tag">Recovery Oriented Computing</a>,
<a href="http://technorati.com/tag/Fred+Brooks" rel="tag">Fred Brooks</a>,
<a href="http://technorati.com/tag/Mythical+Man+Month" rel="tag">Mythical Man Month</a>,  
<a href="http://technorati.com/tag/Eric+Brewer" rel="tag">Eric Brewer</a>, 
<a href="http://technorati.com/tag/ACID+properties" rel="tag">ACID properties</a>,
<a href="http://technorati.com/tag/two-phase+commit" rel="tag">two-phase commit</a>, 
<a href="http://technorati.com/tag/BASE" rel="tag">BASE</a>, 
<a href="http://technorati.com/tag/CAP+theorem" rel="tag">CAP theorem</a>, 
<a href="http://technorati.com/tag/performance+matters" rel="tag">performance matters</a> 
</p>
]]></content></entry><entry><title>Asynchronous Architectures [3]</title><category term="Architecture"/><category term="Foundations of Performance"/><category term="Performance Wisdom"/><category term="Software Engineering "/><id>http://www.webperformancematters.com/journal/2007/8/15/asynchronous-architectures-3.html</id><link rel="alternate" type="text/html" href="http://www.webperformancematters.com/journal/2007/8/15/asynchronous-architectures-3.html"/><author><name>Chris Loosley</name></author><published>2007-08-15T07:01:00Z</published><updated>2007-08-15T07:01:00Z</updated><content type="html" xml:lang="en-US"><![CDATA[<div class="PageWisdomWrapper">

<div class="WisdomTitle" >
<h3>Dan Pritchett's Design Principle</h3>
<p class="WisdomClass" ><a href="http://www.webperformancematters.com/display/ShowJournal?moduleId=1113404&categoryId=98044">Performance Wisdom</a>: 13</p>
</div>

<p class="WisdomQuote">
Always assume high latency, not low latency
</p>

<div class="WisdomText">
<p>One of the underlying principles is assuming high latency, not low latency. An architecture that is tolerant of high latency will operate perfectly well with low latency, but the opposite is never true.</p>
<p class="QuoteSource">-- Dan Pritchett, <a href="http://www.infoq.com/articles/pritchett-latency" class="offsite-link-inline">The Challenges of Latency</a>, May 2, 2007</p>
</div>
</div>

<p><em>This is the third in a series of posts presenting arguments for <strong>asynchronous architectures</strong> as the optimal way to build high-performance, scalable systems for a distributed environment.</em></p>

<p>The first reviewed the case for asynchronous communication among interdependent components or services, and <a href="http://www.webperformancematters.com/journal/2007/8/13/asynchronous-architectures-1.html" class="PMref">Bell's Law of Waiting</a>. The second highlighted <a href="http://www.webperformancematters.com/journal/2007/8/14/asynchronous-architectures-2.html" class="PMref">The Fallacies of Distributed Computing</a>, and discussed the importance of reflecting the business process in distributed systems design.</p>

<p>This post reviews <a href="http://www.infoq.com/articles/pritchett-latency" class="offsite-link-inline">The Challenges of Latency</a>, an article about how asynchronous architectures can improve the quality of Web applications, published on the <a href="http://www.infoq.com/" class="offsite-link-inline">InfoQueue</a> site by eBay architect Dan Pritchett in May 2007. Dan's article is especially relevant today, given the high level of interest in adopting Web services and SOA approaches.</p>

<p>Dan explains why global, large-scale architectures need to address latency, and what architectural patterns can be applied to deal with it. He begins by invoking the second fallacy of distributed computing:</p>

<blockquote>
<p><strong>Latency.</strong></p>

<p>The time it takes packets to flow from one part of the world to another.  Everyone knows it exists. The second fallacy of distributed computing is &quot;Latency is zero&quot;.  Yet so many designs attempt to work around latency instead of embracing it.  This is unfortunate and in fact doesn't work for large-scale systems. Why?</p>

<p>In any large-scale system, there are a few inescapable facts:</p>
<ol>
    <li> A broad customer base will demand reasonably consistent performance across the globe.</li>
    <li> Business continuity will demand geographic diversity in your deployments.</li>
    <li> The speed of light isn't going to change.</li>
</ol>
<p>The last point can't be emphasized enough. The speed of light dictates that even if we can route packets at the speed of light, seems unlikely, it will take 30ms for a packet to traverse the Atlantic.</p>

<p class="QuoteSource">-- Dan Pritchett, <a href="http://www.infoq.com/articles/pritchett-latency" class="offsite-link-inline">The Challenges of Latency</a>, May 2, 2007 [emphasis added]</p>
</blockquote>

<h3>Latency hurts customer service</h3>

<p>He emphasises the connection between Internet latency and customer service:</p>

<blockquote>
<p><strong>The Internet is a part of foundation of the global economy.</strong></p>

<p>Companies need to reliably reach their customers regardless of where they may be located. Architectures that force close geographic proximity of the components limit the quality of service provided to geographically distributed customers. Response time will obviously degrade the further customers are from the servers, but so will reliability. Despite the tremendous increase in the reliability of traffic routing on the Internet, the further you are from a service, the more often that service will be effectively unavailable to you.</p>

<p class="QuoteSource">-- Dan Pritchett, <a href="http://www.infoq.com/articles/pritchett-latency" class="offsite-link-inline">The Challenges of Latency</a>, May 2, 2007 [emphasis added]</p>
</blockquote>

<h3>Latency tolerance</h3>

<p>After spelling out the principle that I have highlighed above as today's <em>Performance Wisdom</em>, he goes on to make the case for introducing asynchronous interactions as the way to achieve latency tolerance.</p>

<blockquote>
<p>The web has created an interaction style that is very problematic for building asynchronous systems. The web has trained the world to expect request/response interactions, with very low latency between the request and response. These expectations have driven architectures that are request/response oriented that lead to synchronous interactions from the browser to the data. This pattern does not lend itself to high latency connections.</p>

<p><strong>Latency tolerance can only be achieved by introducing asynchronous interactions to your architecture.</strong></p>

<p>The challenge becomes determining the components that can be decoupled and integrated via asynchronous interactions. An asynchronous architecture is far more than simply changing the request/response from a call to a series of messages though. The client is still expecting a response in a deterministic time. Asynchronous architectures shift from deterministic response time to probabilistic response time. Removing the determinism is uncomfortable for users and probably for your business units, but is critical to achieving true asynchronous interactions.<p>

<p class="QuoteSource">-- Dan Pritchett, <a href="http://www.infoq.com/articles/pritchett-latency" class="offsite-link-inline">The Challenges of Latency</a>, May 2, 2007 [emphasis added]</p>
</blockquote>

<p><a href="http://www.thbs.com/pdfs/sync_or_async.pdf" class="offsite-link-inline">Web Services in SOA - Synchronous or Asynchronous?</a>, a paper by Torry Harris Business Solutions, offers another introduction to the pro's and con's of synchronous and asynchronous architectures.</p>

<p>Dan accepts that not all Web application components can be designed to function asynchronously, but argues that designers can identify those use cases that do support synchronous interactions. These arguments confirm my <a href="http://www.webperformancematters.com/journal/2007/8/14/asynchronous-architectures-2.html" class="PMref">earlier</a> conclusion that synchronous solutions must be combined with <em>asynchronous designs in which the user must accept that unconfirmed changes will be reflected in the enterprise database(s) at a later time</em>.</p>

<h3>Data partitioning</h3>

<p>He makes a very good point about the importance of designing data distribution from the outset:</p>

<blockquote>
<p>You can decompose your applications into a collection of loosely coupled components; expose your services using asynchronous interfaces, and yet still leave yourself parked in one data center with little hope of escape. You have to tackle your persistence model early in your architecture and require that data can be split along both functional and scale vectors or you will not be able to distribute your architecture across geographies. </p>

<p><strong>I recently read an article where the recommendation was to delay horizontal data spreading until you reach vertical scaling limits. I can think of few pieces of worse advice for an architect. Splitting data is more complex than splitting applications.</strong></p>

<p>But if you don't do it at the beginning, applications will ultimately take short cuts that rely on a monolithic schema. These dependencies will be extremely difficult to break in the future.</p>

<p class="QuoteSource">-- Dan Pritchett, <a href="http://www.infoq.com/articles/pritchett-latency" class="offsite-link-inline">The Challenges of Latency</a>, May 2, 2007 [emphasis added]</p>
</blockquote>

<h3>ACID or BASE?</h3>

<p>Noting that the traditional way to maintain database consistency across partitioned data requires <a href="http://en.wikipedia.org/wiki/ACID" class="offsite-link-inline">ACID-compliant</a> distributed transactions and <a href="http://en.wikipedia.org/wiki/Two-phase_commit_protocol" class="offsite-link-inline">two-phase commit protocols</a>, Dan advocates a (cleverly-named) alternative to the <strong>ACID</strong> properties, the BASE approach to database consistency:</p>

<blockquote>
<p>The problem with distributed transactions is they create synchronous couplings across the databases. Synchronous couplings are the antithesis of latency tolerant designs. The alternative to <strong>ACID</strong> is <strong>BASE</strong>:

<p><strong>B</strong>asically <strong>A</strong>vailable
<br /><strong>S</strong>oft state
<br /><strong>E</strong>ventually consistent
</p>

<p>BASE frees the model from the need for synchronous couplings. Once you accept that state will not always be perfect and consistency occurs asynchronous to the initiating operation, you have a model that can tolerate latency.</p> 
<p class="QuoteSource">-- Dan Pritchett, <a href="http://www.infoq.com/articles/pritchett-latency" class="offsite-link-inline">The Challenges of Latency</a>, May 2, 2007</p>
</blockquote>

<p>Another article worth reading, <a href="http://xml.sys-con.com/read/43755.htm" class="offsite-link-inline">Web-Services Transactions</a> by Doug Kaye, advances similar arguments without using the <em>BASE</em> terminology.</p>

<h3>References: business-driven or event-driven architectures</h3>

<p>While these articles present, at a high-level, a convincing case for asynchronous architectures, many others have elaborated on the implementation details. Here are five examples of more detailed treatments, in approximately descending order of generality:</p>

<ul class="group">

<li>The wikipedia article on <a href="http://en.wikipedia.org/wiki/Event_Driven_Architecture" class="offsite-link-inline">Event-driven architecture</a>.</li>

<li><a href="http://elementallinks.typepad.com/bmichelson/2006/02/eventdriven_arc.html" class="offsite-link-inline">Event-Driven Architecture Overview</a>, a very detailed post by Brenda Michelson in her blog, <a href="http://elementallinks.typepad.com/bmichelson/" class="offsite-link-inline">Elemental Links</a>. 

<span class="aside">[A blog <a href="http://dougmcclure.net/blog/?p=41" class="offsite-link-inline">response</a> from <a href="http://dougmcclure.net/blog/about/" class="offsite-link-inline">Doug McClure</a> exemplifies the gulf between the concerns of business/application architects and those of IT/network management, despite all the talk of "alignment" these days. As I wrote in my book, "Middleware is the reason why network specialists and application programmers cannot communicate!" (Guideline 15.3, p469)</em>.]</span></li>

<li><a href="http://www.javaworld.com/javaworld/jw-01-2005/jw-0131-soa.html" class="offsite-link-inline">Event-driven services in SOA</a>by Jeff Hanson, JavaWorld.com, January 31, 2005.</li>

<li><a href="http://msdn2.microsoft.com/en-us/library/ms706253.aspx" class="offsite-link-inline">Message Queuing Applications</a>, Microsoft Developer Network (MSDN).</li>

<li><a href="http://developers.sun.com/jsenterprise/reference/techart/jse7/asynch.html" class="offsite-link-inline">Developing Asynchronous Web Services with Java Message Service</a> by Rico Cruz and Marina Sum, Sun Developer Network.</li>

</ul>

<h3>Next: the CAP theorem</h3>

<p>Dan points out that adopting the BASE approach to consistency forces you to understand a very important principle, known as <em>The CAP Theorem</em>. This theorem was first propounded in a 1998 presentation -- <a href="http://www.ccs.neu.edu/groups/IEEE/ind-acad/brewer/" class="offsite-link-inline">Lessons from Internet Services: ACID vs. BASE</a> -- by Dr. Eric Brewer of Inktomi, now a <a href="http://www.cs.berkeley.edu/~brewer/" class="offsite-link-inline">professor</a> at UC Berkeley.</p>

<blockquote>
<p>Of course there are situations where data needs to be consistent at the end of an operation. The CAP Theorem is a useful tool for determining what data to partition and what data must conform to ACID.</p>

<p><strong>The CAP Theorem states that when designing databases you consider three properties, Consistency, Availability, and Partitioning. You can have at most two of the three for any data model.</strong></p>

<p>Organizing your data model around CAP allows you to make the appropriate decisions with regards to consistency and latency.</p>

<p class="QuoteSource">-- Dan Pritchett, <a href="http://www.infoq.com/articles/pritchett-latency" class="offsite-link-inline">The Challenges of Latency</a>, May 2, 2007 [emphasis added]</p>
</blockquote>

<p>Because <em>The CAP Theorem</em> plays a crucial role in the design of large scalable systems using asynchronous architectures, I will be devoting my next post to it.</p>

<p class="Footnote"><strong>This series of posts</strong> contains some material first published in <a href="http://www.amazon.com/exec/obidos/tg/detail/-/0471162698/002-1562714-5063248?v=glance" >High-Performance Client/Server</a>. My 1998 book is out of print now, and contains some outdated examples and references. But most of the discussions of performance principles are timeless, and you can pick up a used copy for about $3.00 at Amazon.</p>

<p class="Footnote"><strong>Tags:</strong> 
<a href="http://technorati.com/tag/distributed+systems" rel="tag">distributed systems</a>, 
<a href="http://technorati.com/tag/asynchronous+architecture" rel="tag">asynchronous architecture</a>,
<a href="http://technorati.com/tag/Web+services" rel="tag">Web services</a>,
<a href="http://technorati.com/tag/SOA" rel="tag">SOA</a>,
<a href="http://technorati.com/tag/middleware" rel="tag">middleware</a>,
<a href="http://technorati.com/tag/serialization" rel="tag">serialization</a>,
<a href="http://technorati.com/tag/synchronization" rel="tag">synchronization</a>, 
<a href="http://technorati.com/tag/queues" rel="tag">queues</a>, 
<a href="http://technorati.com/tag/decoupled+processes" rel="tag">decoupled processes</a>, 
<a href="http://technorati.com/tag/multi-transaction" rel="tag">multi-transaction</a>,
<a href="http://technorati.com/tag/workflow" rel="tag">workflow</a>, 
<a href="http://technorati.com/tag/distributed+computing" rel="tag">distributed computing</a>,
<a href="http://technorati.com/tag/Dan+Pritchett" rel="tag">Dan Pritchett</a>,
<a href="http://technorati.com/tag/eBay" rel="tag">eBay</a>,
<a href="http://technorati.com/tag/Brenda+Michelson" rel="tag">Brenda Michelson</a>,
<a href="http://technorati.com/tag/Elemental+Links" rel="tag">Elemental Links</a>,
<a href="http://technorati.com/tag/Doug+McClure" rel="tag">Doug McClure</a>,
<a href="http://technorati.com/tag/Eric+Brewer" rel="tag">Eric Brewer</a>, 
<a href="http://technorati.com/tag/Inktomi" rel="tag">Inktomi</a>,  
<a href="http://technorati.com/tag/ACID+properties" rel="tag">ACID properties</a>,
<a href="http://technorati.com/tag/two-phase+commit" rel="tag">two-phase commit</a>, 
<a href="http://technorati.com/tag/BASE" rel="tag">BASE</a>, 
<a href="http://technorati.com/tag/CAP+theorem" rel="tag">CAP theorem</a>, 
<a href="http://technorati.com/tag/application+performance" rel="tag">application performance</a>,
<a href="http://technorati.com/tag/scalability" rel="tag">scalability</a>,
<a href="http://technorati.com/tag/performance+wisdom" rel="tag">performance wisdom</a>,  
<a href="http://technorati.com/tag/performance+matters" rel="tag">performance matters</a> 
</p>]]></content></entry></feed>