<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" gd:etag="W/&quot;DUQGQXo9fyp7ImA9WhRXE0o.&quot;"><id>tag:blogger.com,1999:blog-21992362</id><updated>2011-12-20T16:05:20.467+05:30</updated><category term="microformats" /><category term="meta" /><category term="CloudCamp" /><category term="SaaS" /><category term="knowledge management" /><category term="appengine" /><category term="IT-in-India" /><category term="software_excellence" /><category term="books" /><category term="semantic web" /><category term="design" /><category term="agile-antipatterns" /><category term="usability" /><title>XPloring around</title><subtitle type="html">Sriram Narayan's blog on IT</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://blog.sriramnarayan.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://blog.sriramnarayan.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/21992362/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;orderby=published&amp;v=2" /><author><name>Sriram</name><uri>http://www.blogger.com/profile/01237485664035584743</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://3.bp.blogspot.com/-JsADajCH9EA/TgsyKnD7laI/AAAAAAAAAMQ/JMyPrz3C4pM/s220/nov11visaphoto.JPG" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>52</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/XploringAround" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="xploringaround" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;D0UARX85fCp7ImA9WhdaGEo.&quot;"><id>tag:blogger.com,1999:blog-21992362.post-3240094249280308267</id><published>2011-10-29T13:25:00.002+05:30</published><updated>2011-10-29T13:30:44.124+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-29T13:30:44.124+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="meta" /><title>Measurements and targets: The use and abuse of metrics</title><content type="html">Software development is a social activity. As such, it does not lend itself very well to measurements. Sure, we can measure a whole lot of things about software development but we can never contend that a given set of metrics is exhaustive.&amp;nbsp; Plus, it is costly to regularly measure and track too many things. So, we restrict ourselves to a subset of feasible measurements.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-BuebXfA-FC0/Tquw5uK-zTI/AAAAAAAAAMs/YU6nvZOlaf4/s1600/metrics.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-BuebXfA-FC0/Tquw5uK-zTI/AAAAAAAAAMs/YU6nvZOlaf4/s320/metrics.jpg" width="300" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;table align="left" cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td height="9" width="30"&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;div class="MsoNormal"&gt;For instance, although return on investment is a useful metric, it is often not feasible to measure and track it for a piece of software. Thus, in practice, we settle for things that &lt;i style="mso-bidi-font-style: normal;"&gt;only paint part of the picture&lt;/i&gt;. It is important to acknowledge this. Often, enterprise IT loses sight of this truth. It deludes itself that the reported metrics constitute the big picture (From the school of “If you can’t measure it, it doesn’t exist.”).  &lt;/div&gt;&lt;div class="MsoNormal"&gt;What is worse, in the name of continuous improvement, these metrics are converted into targets. Teams now have an incentive to work towards local optima. No wonder large swathes of big enterprise IT are in a desperate mess. New causes of failure are discovered all the time. Heads roll and the new heads track a slightly different subset of metrics.&lt;/div&gt;&lt;div class="MsoNormal"&gt;Automatically converting metrics to targets also has adverse psychological effects. Here is an example from day trading. What is more important? Making more winning trades than losing trades or making money? Obviously it is the second. But the moment you start tracking win-loss ratio it may become a target it itself. Emotional conditioning will also come into play and we will try to have less losing trades.&lt;/div&gt;&lt;div class="MsoNormal"&gt;A software team can get severely constrained when a velocity target is imposed on it. At a certain threshold of constraints, team members lose a sense of empowerment. They play it completely safe and lose initiative. We experience this phenomenon sometimes when we deal with call centres. Government sponsored healthcare and education in western economies often exhibits similar characteristics. It is not just bureaucracy. In an effort to scale and centrally control efficient delivery of services, a raft of metrics is imposed on the practitioners. Performance of schools/hospitals is then tracked against these metrics (they now become targets). Teachers and doctors get frustrated, lose initiative and just play by the book much to the exasperation of parents and patients.&lt;/div&gt;&lt;div class="MsoNormal"&gt;Measurements should not automatically become targets. When measurements indicate something is wrong, it calls for a &lt;i&gt;conversation in context&lt;/i&gt;, not for a rating downgrade. Conversations in context may reveal that &lt;i&gt;things are still ok in the larger scheme of things, the measurements only point to a local sub-optima&lt;/i&gt;. Trouble is, it is easy to scale management by numbers. It is very difficult to scale management by context. Perhaps it is worth asking if scaling is more important than delivering a quality experience. Besides, too much scale creates “too big to fail” monsters that have to bailed out with the money of the innocent in times of crisis. This is not just true of macroeconomics. It is true of macro IT as well.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;p style="text-align: right" align="right"&gt;&lt;a href="http://blog.sriramnarayan.com"&gt;blog home page&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21992362-3240094249280308267?l=blog.sriramnarayan.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/XploringAround/~4/OLuTFCT34ak" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://blog.sriramnarayan.com/2011/10/measurements-and-targets-use-and-abuse.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/21992362/posts/default/3240094249280308267?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/21992362/posts/default/3240094249280308267?v=2" /><link rel="alternate" type="text/html" href="http://blog.sriramnarayan.com/2011/10/measurements-and-targets-use-and-abuse.html" title="Measurements and targets: The use and abuse of metrics" /><author><name>Sriram</name><uri>http://www.blogger.com/profile/01237485664035584743</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://3.bp.blogspot.com/-JsADajCH9EA/TgsyKnD7laI/AAAAAAAAAMQ/JMyPrz3C4pM/s220/nov11visaphoto.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-BuebXfA-FC0/Tquw5uK-zTI/AAAAAAAAAMs/YU6nvZOlaf4/s72-c/metrics.jpg" height="72" width="72" /><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;DUEFR3syeSp7ImA9WhZRFU4.&quot;"><id>tag:blogger.com,1999:blog-21992362.post-5615973194113963165</id><published>2011-04-11T21:30:00.000+05:30</published><updated>2011-04-11T21:30:16.591+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-11T21:30:16.591+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="software_excellence" /><title>Dashboards promote ignorance</title><content type="html">It is possible to collect a wide range of metrics on a project. Metrics about the codebase, unit tests, performance tests, build, delivery progress etc. It is also possible to define&amp;nbsp; red, amber, green thresholds for each metric. Some go for standardized organization wide thresholds while others are comfortable with project specific ones. The obvious next step is to create a dashboard that rolls up all these metrics into a single red, amber, green project status indicator. Middle managers spend a good part of their life managing inputs to these dashboards. Some "programme managers" assiduously refer to their dashboards as &lt;a href="http://www.information-management.com/news/10001076-1.html?zkPrintable=true"&gt;balanced scorecards&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Trouble is, most of the time, an overall green status indicator doesn't mean anything. All it says is that the things under measurment seem ok. But there always will be many more things not under measurement. To celebrate 'green' indicators is to ignore the unknowns. The value of a metric is not when it is green. Lets take unit test coverage for example. Is 100% test coverage a cause for celebration? What if most tests don't have any assertions? When measurements become targets, they encourage gaming. On the other hand, a coverage of 50% at least tells you unambiguously that half the code is not covered (or there is an error in measurement). &lt;br /&gt;
&lt;br /&gt;
One may argue that it is only a matter of measuring even more so that the overall green becomes truly indicative of overall project health. This is somewhat unrealistic in a fast paced knowledge work environment. Tools and technologies keep changing. Measurement tools don't keep pace. It takes significant effort to maintain the measurement infrasturture on a project.&lt;br /&gt;
&lt;br /&gt;
Avoiding subjectivity in assessments is also cited as a reason for resorting to metrics. But that's like saying that a person can be certified healthy without the judgement of a physician by a dashboard that rolls up a hundred diagnostic tests. &lt;br /&gt;
&lt;br /&gt;
In my experience, metrics are much more useful when they report bad news than when they are green. In the words of the &lt;a href="http://www.agitar.com/downloads/TheWayOfTestivus.pdf"&gt;Way of Testivus&lt;/a&gt;, "Good tests fail". Unfortunately, the tendency to roll up metrics into dashboards promotes ignorance. We forget that we are only see what is under measurement. We only act when something is not green. &lt;br /&gt;
&lt;br /&gt;
Then comes the final argument. Don't blame the tool for human laxity. Dashboards cannot promote ignorance or even wisdom. Unfortunately, &lt;a href="http://blog.sriramnarayan.com/2011/03/tools-arent-value-neutral.html"&gt;tools aren't value neutral&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;p style="text-align: right" align="right"&gt;&lt;a href="http://blog.sriramnarayan.com"&gt;blog home page&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21992362-5615973194113963165?l=blog.sriramnarayan.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/XploringAround/~4/sgEqlr7wj2M" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://blog.sriramnarayan.com/2011/04/dashboards-promote-ignorance.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/21992362/posts/default/5615973194113963165?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/21992362/posts/default/5615973194113963165?v=2" /><link rel="alternate" type="text/html" href="http://blog.sriramnarayan.com/2011/04/dashboards-promote-ignorance.html" title="Dashboards promote ignorance" /><author><name>Sriram</name><uri>http://www.blogger.com/profile/01237485664035584743</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://3.bp.blogspot.com/-JsADajCH9EA/TgsyKnD7laI/AAAAAAAAAMQ/JMyPrz3C4pM/s220/nov11visaphoto.JPG" /></author><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;DEUBQHszeyp7ImA9WhZTEko.&quot;"><id>tag:blogger.com,1999:blog-21992362.post-3870812460423884520</id><published>2011-03-16T17:16:00.002+05:30</published><updated>2011-03-16T17:20:51.583+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-16T17:20:51.583+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="meta" /><title>Tools aren't value neutral</title><content type="html">&lt;span id="internal-source-marker_0.7017041532658942" style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;If we accept that language influences the way we think&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 6.6pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: super;"&gt;1&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;, then we don't have to make a big leap to see that tools (and technologies) influence the way we think (and act) as well&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 6.6pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: super;"&gt;2&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;.&amp;nbsp; &lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;Therefore, it is erroneous to say things like the following:&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;“The internet isn’t a pro or anti-democratic technology. It is value neutral”&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;“Powerpoint isn’t good or bad. It is how you use it.”&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;Couple of telling quotes from McLuhan:&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;“We shape our tools, and thereafter our tools shape us”&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;“Our  conventional response to all media, name that it is how they are used  that counts, it the numb stance of the technological idiot.”&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;Why am I writing this in the middle of posts on software excellence? Because I need this for my forthcoming posts :)&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;1. Language influences the way we think&lt;/span&gt;&lt;br /&gt;
&lt;a href="http://www.edge.org/3rd_culture/boroditsky09/boroditsky09_index.html"&gt;&lt;span style="background-color: transparent; color: #000099; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline;"&gt;http://www.edge.org/3rd_culture/boroditsky09/boroditsky09_index.html&lt;/span&gt;&lt;/a&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;a href="http://www.amazon.com/Language-Thought-Action-S-I-Hayakawa/dp/0156482401"&gt;&lt;span style="background-color: transparent; color: #000099; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline;"&gt;http://www.amazon.com/Language-Thought-Action-S-I-Hayakawa/dp/0156482401&lt;/span&gt;&lt;/a&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;2. Tools (and technologies) influence the way we act&lt;/span&gt;&lt;br /&gt;
&lt;a href="http://www.amazon.com/Understanding-Media-Extensions-Marshall-McLuhan/dp/0262631598"&gt;&lt;span style="background-color: transparent; color: #000099; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline;"&gt;http://www.amazon.com/Understanding-Media-Extensions-Marshall-McLuhan/dp/0262631598&lt;/span&gt;&lt;/a&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;a href="http://www.amazon.com/Shallows-What-Internet-Doing-Brains/dp/0393072223"&gt;&lt;span style="background-color: transparent; color: #000099; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline;"&gt;http://www.amazon.com/Shallows-What-Internet-Doing-Brains/dp/0393072223&lt;/span&gt;&lt;/a&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;p style="text-align: right" align="right"&gt;&lt;a href="http://blog.sriramnarayan.com"&gt;blog home page&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21992362-3870812460423884520?l=blog.sriramnarayan.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/XploringAround/~4/ezWpC4nLsX0" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://blog.sriramnarayan.com/2011/03/tools-arent-value-neutral.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/21992362/posts/default/3870812460423884520?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/21992362/posts/default/3870812460423884520?v=2" /><link rel="alternate" type="text/html" href="http://blog.sriramnarayan.com/2011/03/tools-arent-value-neutral.html" title="Tools aren't value neutral" /><author><name>Sriram</name><uri>http://www.blogger.com/profile/01237485664035584743</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://3.bp.blogspot.com/-JsADajCH9EA/TgsyKnD7laI/AAAAAAAAAMQ/JMyPrz3C4pM/s220/nov11visaphoto.JPG" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DUUASHo9eip7ImA9WhZTEU0.&quot;"><id>tag:blogger.com,1999:blog-21992362.post-8549969508982399008</id><published>2011-03-14T18:22:00.002+05:30</published><updated>2011-03-14T18:24:09.462+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-14T18:24:09.462+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="software_excellence" /><title>Build time impacts team performance</title><content type="html">&lt;div style="background-color: transparent;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Velocity often grabs a lot of managerial attention on a project. But while velocity is the effect, build time is a common cause. A slow build has several insidious side effects. Say a build takes 20 minutes:&lt;/span&gt;&lt;/div&gt;&lt;div style="background-color: transparent;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;table style="border-bottom-style: none; border-collapse: collapse; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial;"&gt;&lt;colgroup&gt;&lt;col width="82"&gt;&lt;/col&gt;&lt;col width="542"&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;
&lt;tr style="height: 0px;"&gt;&lt;td style="border-bottom-color: rgb(170, 170, 170); border-bottom-style: dotted; border-bottom-width: 1px; border-left-color: rgb(170, 170, 170); border-left-style: dotted; border-left-width: 1px; border-right-color: rgb(170, 170, 170); border-right-style: dotted; border-right-width: 1px; border-top-color: rgb(170, 170, 170); border-top-style: dotted; border-top-width: 1px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; vertical-align: top;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;10:00am&lt;/span&gt;&lt;/td&gt;&lt;td style="border-bottom-color: rgb(170, 170, 170); border-bottom-style: dotted; border-bottom-width: 1px; border-left-color: rgb(170, 170, 170); border-left-style: dotted; border-left-width: 1px; border-right-color: rgb(170, 170, 170); border-right-style: dotted; border-right-width: 1px; border-top-color: rgb(170, 170, 170); border-top-style: dotted; border-top-width: 1px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; vertical-align: top;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;My pair and I work for the day by doing a fresh checkout and initiating a local build. 20 minutes to kill? Maybe check email etc, talk to analyst about my story, take a coffee break. OK, build passes.&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 0px;"&gt;&lt;td style="border-bottom-color: rgb(170, 170, 170); border-bottom-style: dotted; border-bottom-width: 1px; border-left-color: rgb(170, 170, 170); border-left-style: dotted; border-left-width: 1px; border-right-color: rgb(170, 170, 170); border-right-style: dotted; border-right-width: 1px; border-top-color: rgb(170, 170, 170); border-top-style: dotted; border-top-width: 1px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; vertical-align: top;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;10:20am&lt;/span&gt;&lt;/td&gt;&lt;td style="border-bottom-color: rgb(170, 170, 170); border-bottom-style: dotted; border-bottom-width: 1px; border-left-color: rgb(170, 170, 170); border-left-style: dotted; border-left-width: 1px; border-right-color: rgb(170, 170, 170); border-right-style: dotted; border-right-width: 1px; border-top-color: rgb(170, 170, 170); border-top-style: dotted; border-top-width: 1px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; vertical-align: top;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Work begins. &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 0px;"&gt;&lt;td style="border-bottom-color: rgb(170, 170, 170); border-bottom-style: dotted; border-bottom-width: 1px; border-left-color: rgb(170, 170, 170); border-left-style: dotted; border-left-width: 1px; border-right-color: rgb(170, 170, 170); border-right-style: dotted; border-right-width: 1px; border-top-color: rgb(170, 170, 170); border-top-style: dotted; border-top-width: 1px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; vertical-align: top;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;10:50am&lt;/span&gt;&lt;/td&gt;&lt;td style="border-bottom-color: rgb(170, 170, 170); border-bottom-style: dotted; border-bottom-width: 1px; border-left-color: rgb(170, 170, 170); border-left-style: dotted; border-left-width: 1px; border-right-color: rgb(170, 170, 170); border-right-style: dotted; border-right-width: 1px; border-top-color: rgb(170, 170, 170); border-top-style: dotted; border-top-width: 1px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; vertical-align: top;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;We are ready for checkin. Oh no, we can't wait for a 20 minute build every half hour can we? There goes the motivation for frequent checkins. &lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;We decide to develop locally for another hour at least before trying a checkin&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;. Signs of discontinuity in continuous integration!&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 0px;"&gt;&lt;td style="border-bottom-color: rgb(170, 170, 170); border-bottom-style: dotted; border-bottom-width: 1px; border-left-color: rgb(170, 170, 170); border-left-style: dotted; border-left-width: 1px; border-right-color: rgb(170, 170, 170); border-right-style: dotted; border-right-width: 1px; border-top-color: rgb(170, 170, 170); border-top-style: dotted; border-top-width: 1px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; vertical-align: top;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;12:00pm&lt;/span&gt;&lt;/td&gt;&lt;td style="border-bottom-color: rgb(170, 170, 170); border-bottom-style: dotted; border-bottom-width: 1px; border-left-color: rgb(170, 170, 170); border-left-style: dotted; border-left-width: 1px; border-right-color: rgb(170, 170, 170); border-right-style: dotted; border-right-width: 1px; border-top-color: rgb(170, 170, 170); border-top-style: dotted; border-top-width: 1px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; vertical-align: top;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Ready for checkin again. Run local build. &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 0px;"&gt;&lt;td style="border-bottom-color: rgb(170, 170, 170); border-bottom-style: dotted; border-bottom-width: 1px; border-left-color: rgb(170, 170, 170); border-left-style: dotted; border-left-width: 1px; border-right-color: rgb(170, 170, 170); border-right-style: dotted; border-right-width: 1px; border-top-color: rgb(170, 170, 170); border-top-style: dotted; border-top-width: 1px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; vertical-align: top;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;12:20pm&lt;/span&gt;&lt;/td&gt;&lt;td style="border-bottom-color: rgb(170, 170, 170); border-bottom-style: dotted; border-bottom-width: 1px; border-left-color: rgb(170, 170, 170); border-left-style: dotted; border-left-width: 1px; border-right-color: rgb(170, 170, 170); border-right-style: dotted; border-right-width: 1px; border-top-color: rgb(170, 170, 170); border-top-style: dotted; border-top-width: 1px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; vertical-align: top;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;oops. Build broke. Our code broke some old test. Good catch by the test suite!&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 0px;"&gt;&lt;td style="border-bottom-color: rgb(170, 170, 170); border-bottom-style: dotted; border-bottom-width: 1px; border-left-color: rgb(170, 170, 170); border-left-style: dotted; border-left-width: 1px; border-right-color: rgb(170, 170, 170); border-right-style: dotted; border-right-width: 1px; border-top-color: rgb(170, 170, 170); border-top-style: dotted; border-top-width: 1px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; vertical-align: top;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;12:30pm&lt;/span&gt;&lt;/td&gt;&lt;td style="border-bottom-color: rgb(170, 170, 170); border-bottom-style: dotted; border-bottom-width: 1px; border-left-color: rgb(170, 170, 170); border-left-style: dotted; border-left-width: 1px; border-right-color: rgb(170, 170, 170); border-right-style: dotted; border-right-width: 1px; border-top-color: rgb(170, 170, 170); border-top-style: dotted; border-top-width: 1px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; vertical-align: top;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Attempt another build after fixing the code.&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 0px;"&gt;&lt;td style="border-bottom-color: rgb(170, 170, 170); border-bottom-style: dotted; border-bottom-width: 1px; border-left-color: rgb(170, 170, 170); border-left-style: dotted; border-left-width: 1px; border-right-color: rgb(170, 170, 170); border-right-style: dotted; border-right-width: 1px; border-top-color: rgb(170, 170, 170); border-top-style: dotted; border-top-width: 1px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; vertical-align: top;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;12:50pm&lt;/span&gt;&lt;/td&gt;&lt;td style="border-bottom-color: rgb(170, 170, 170); border-bottom-style: dotted; border-bottom-width: 1px; border-left-color: rgb(170, 170, 170); border-left-style: dotted; border-left-width: 1px; border-right-color: rgb(170, 170, 170); border-right-style: dotted; border-right-width: 1px; border-top-color: rgb(170, 170, 170); border-top-style: dotted; border-top-width: 1px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; vertical-align: top;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Build passed! Now we just need to check once again after merging with latest code from the repository. Is the build green? Yes. Safe to checkout from repository. We checkout, couple of auto-merges, no conflicts. One more local build and we are good to go.&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 0px;"&gt;&lt;td style="border-bottom-color: rgb(170, 170, 170); border-bottom-style: dotted; border-bottom-width: 1px; border-left-color: rgb(170, 170, 170); border-left-style: dotted; border-left-width: 1px; border-right-color: rgb(170, 170, 170); border-right-style: dotted; border-right-width: 1px; border-top-color: rgb(170, 170, 170); border-top-style: dotted; border-top-width: 1px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; vertical-align: top;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;1:10pm&lt;/span&gt;&lt;/td&gt;&lt;td style="border-bottom-color: rgb(170, 170, 170); border-bottom-style: dotted; border-bottom-width: 1px; border-left-color: rgb(170, 170, 170); border-left-style: dotted; border-left-width: 1px; border-right-color: rgb(170, 170, 170); border-right-style: dotted; border-right-width: 1px; border-top-color: rgb(170, 170, 170); border-top-style: dotted; border-top-width: 1px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; vertical-align: top;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Local build passed. We are about to checkin when we notice that the build is yellow. &lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Darn, someone just checked in&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;. Now we have to wait for the build to go green, then checkout and build locally again before we checkin.&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Anything short of this rigour leaves a window open for build failure on the CI server. But hey, surely you can't expect us to play the waiting game indefinitely. What if someone checks in again while we are diligently verifying locally? Besides its time for lunch. So we gamble and checkout. No conflicts or even auto-merges. Good sign. &lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;It isn't worth building locally again. &amp;nbsp;We checkin and go for lunch&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;. Halfway through lunch, I get a call. &lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;"@#$!, why did you checkin while the build was still running?"&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;"Why what happened? Don't tell me your build didn't go through"&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;"Yes it didn't and now I am having trouble fixing it on top of your changes"&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;As build time increases, it tests my patience as a developer. I am tempted to take shortcuts that occasionally backfire. When this becomes standard team behaviour, the occasional turns into regular. Secondly, it increases the syncing window (12:50pm to 1:10pm above). This window is at least equal to build time. Greater this window, greater the chance that someone else might check in while I am still getting ready.&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Now what if the build time were five minutes instead? There is much less waiting time associated with frequent bite sized checkins. So it encourages frequent checkins. This in turn reduces the likelihood of merge conflicts when I sync with trunk. Finally, if someone else does check in during my syncing window, I only have to wait five more minutes to see if it goes green.&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;In summary, everything else constant, team performance correlates well with build time.&lt;/span&gt;&lt;br /&gt;
&lt;h3&gt;&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 14pt; font-style: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;So what to do?&lt;/span&gt;&lt;/h3&gt;&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Keeping a build fast is a topic by itself. Basically try to keep the unit tests fast. At an average of 20 millisecs per unit tests, we can run 5000 tests in 100 secs (just under 2 minutes). &amp;nbsp;Avoid all I/O in unit tests. If you must have some unit tests that do I/O, keep them in the next stage of your build pipeline. Don’t write unit tests that exercise a lot of code. They aren’t unit tests if they do. &amp;nbsp;As a manager, be very concerned if you see build time going up steadily.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;p style="text-align: right" align="right"&gt;&lt;a href="http://blog.sriramnarayan.com"&gt;blog home page&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21992362-8549969508982399008?l=blog.sriramnarayan.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/XploringAround/~4/9bDeuEumZF8" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://blog.sriramnarayan.com/2011/03/build-time-impacts-team-performance.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/21992362/posts/default/8549969508982399008?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/21992362/posts/default/8549969508982399008?v=2" /><link rel="alternate" type="text/html" href="http://blog.sriramnarayan.com/2011/03/build-time-impacts-team-performance.html" title="Build time impacts team performance" /><author><name>Sriram</name><uri>http://www.blogger.com/profile/01237485664035584743</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://3.bp.blogspot.com/-JsADajCH9EA/TgsyKnD7laI/AAAAAAAAAMQ/JMyPrz3C4pM/s220/nov11visaphoto.JPG" /></author><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;DUQCRHg-eyp7ImA9WhZTEU0.&quot;"><id>tag:blogger.com,1999:blog-21992362.post-247730258895873205</id><published>2010-08-17T16:59:00.003+05:30</published><updated>2011-03-14T18:26:05.653+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-14T18:26:05.653+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="software_excellence" /><title>The point of Object Orientation</title><content type="html">&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_P8pGGPoTKzo/TULU6zBJAbI/AAAAAAAAAMA/BMElKaJ6ibU/s1600/transaction_script_cost_escalation.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="301" src="http://3.bp.blogspot.com/_P8pGGPoTKzo/TULU6zBJAbI/AAAAAAAAAMA/BMElKaJ6ibU/s400/transaction_script_cost_escalation.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Transaction script cost escalation&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;A  common characteristic of large codebases is that it takes  disproportionate effort to add or extend functionality. Couple of common  reasons:&lt;/span&gt;&lt;br /&gt;
&lt;ol&gt;&lt;li style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; list-style-type: decimal; text-decoration: none; vertical-align: baseline;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;Hamstrung  team - The original developers may have moved on, development beyond  the first release may have been transferred to a less capable team or  handover may have been ineffective.&lt;/span&gt;&lt;/li&gt;
&lt;li style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; list-style-type: decimal; text-decoration: none; vertical-align: baseline;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;Poor codebase - Test quality and coverage may be lacking, encapsulation may be broken, &amp;nbsp;or the build may be inordinately long.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;Bad  encapsulation is a common culprit. All too often, OO-capable languages  like Java and C# are used to author transaction script&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 6.6pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: super;"&gt;1&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;  applications. The business logic is use case driven rather than domain  driven. Use case driven code is characterized by global code acting on  global data. Well encapsulated codebases, on the other hand, consist of collaborating objects, each object encapsulating its local data and behaviour.&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_P8pGGPoTKzo/TGpyIJNkmEI/AAAAAAAAALk/BHdBBAqs-zk/s1600/point_of_oo.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="353" src="http://1.bp.blogspot.com/_P8pGGPoTKzo/TGpyIJNkmEI/AAAAAAAAALk/BHdBBAqs-zk/s640/point_of_oo.PNG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;For  a typical business app, everything else remaining constant, good  encapsulation will lead to constant or decreasing delta effort for delta  functionality. The point of object orientation is that it is meant to  help manage complexity of the business domain. This can only happen when  we encapsulate along the grain&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 6.6pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: super;"&gt;2&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; of the domain. &lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;1:&lt;/span&gt;&lt;a href="http://martinfowler.com/eaaCatalog/transactionScript.html"&gt;&lt;span style="background-color: transparent; color: #000099; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline;"&gt;http://martinfowler.com/eaaCatalog/transactionScript.html&lt;/span&gt;&lt;/a&gt;&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;2:&lt;/span&gt;&lt;a href="http://www.threeriversinstitute.org/Cutting%20with%20the%20Grain.pdf"&gt;&lt;span style="background-color: transparent; color: #000099; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline;"&gt;Cutting with the grain: the rhythms of design - Kent Beck&lt;/span&gt;&lt;/a&gt;&lt;span style="background-color: transparent; color: black; font-family: Georgia; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;p style="text-align: right" align="right"&gt;&lt;a href="http://blog.sriramnarayan.com"&gt;blog home page&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21992362-247730258895873205?l=blog.sriramnarayan.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/XploringAround/~4/GzjQ8KvG7NY" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://blog.sriramnarayan.com/2010/08/point-of-object-orientation.html#comment-form" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/21992362/posts/default/247730258895873205?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/21992362/posts/default/247730258895873205?v=2" /><link rel="alternate" type="text/html" href="http://blog.sriramnarayan.com/2010/08/point-of-object-orientation.html" title="The point of Object Orientation" /><author><name>Sriram</name><uri>http://www.blogger.com/profile/01237485664035584743</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://3.bp.blogspot.com/-JsADajCH9EA/TgsyKnD7laI/AAAAAAAAAMQ/JMyPrz3C4pM/s220/nov11visaphoto.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_P8pGGPoTKzo/TULU6zBJAbI/AAAAAAAAAMA/BMElKaJ6ibU/s72-c/transaction_script_cost_escalation.png" height="72" width="72" /><thr:total>3</thr:total></entry><entry gd:etag="W/&quot;DU8HRXg5eCp7ImA9WxFRGE0.&quot;"><id>tag:blogger.com,1999:blog-21992362.post-8649552271385514599</id><published>2010-05-02T19:13:00.000+05:30</published><updated>2010-05-02T19:13:54.620+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-02T19:13:54.620+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="agile-antipatterns" /><title>Agile anti-pattern summary</title><content type="html">Here is a summary of anti-patterns I have written about so far:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;&lt;a href="http://blog.sriramnarayan.com/2010/02/pointless-agile-estimation.html"&gt;When Agile Estimation becomes pointless &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.sriramnarayan.com/2010/02/fail-fast.html"&gt;Not failing fast&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.sriramnarayan.com/2010/02/label-activities-not-people.html"&gt;Labeling people instead of activities&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.sriramnarayan.com/2010/03/pair-programming-payoff.html"&gt;Cost-ineffective pair programming&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.sriramnarayan.com/2010/03/agile-maintenance-support-evolution.html"&gt;Agile Maintenance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.sriramnarayan.com/2010/03/how-to-do-xyz-in-agile.html"&gt;How to do XYZ in Agile?&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;p style="text-align: right" align="right"&gt;&lt;a href="http://blog.sriramnarayan.com"&gt;blog home page&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21992362-8649552271385514599?l=blog.sriramnarayan.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/XploringAround/~4/4qJzCDVq_CU" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://blog.sriramnarayan.com/2010/05/agile-anti-pattern-summary.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/21992362/posts/default/8649552271385514599?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/21992362/posts/default/8649552271385514599?v=2" /><link rel="alternate" type="text/html" href="http://blog.sriramnarayan.com/2010/05/agile-anti-pattern-summary.html" title="Agile anti-pattern summary" /><author><name>Sriram</name><uri>http://www.blogger.com/profile/01237485664035584743</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://3.bp.blogspot.com/-JsADajCH9EA/TgsyKnD7laI/AAAAAAAAAMQ/JMyPrz3C4pM/s220/nov11visaphoto.JPG" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;D0MDQHY6fCp7ImA9WxBaFE8.&quot;"><id>tag:blogger.com,1999:blog-21992362.post-8946213597292462872</id><published>2010-03-24T14:18:00.003+05:30</published><updated>2010-03-24T15:41:11.814+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-24T15:41:11.814+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="agile-antipatterns" /><title>How to do XYZ in Agile?</title><content type="html">&lt;div&gt;&lt;br /&gt;
Clients sometimes ask, "How do you do estimation in Agile?" or, in general "How do you do XYZ in Agile?". Typically these are people making a transition from non-Agile methods. They often want to hold on to some existing ways of functioning. They would like to blend Agile into their existing processes. There is a problem here. To be agile is not about following a different set of prescribed processes or practices. The only things that matter are:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Continuous delivery of valuable functionality&lt;/li&gt;
&lt;li&gt;Happy team (team includes client)&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;The agile manifesto starts off by saying:&lt;br /&gt;
&lt;div style="margin-left: 40px;"&gt;We are uncovering better ways of developing&lt;br /&gt;
software &lt;i&gt;by doing it&lt;/i&gt; and helping others do it.&lt;/div&gt;The practices codified under XP (or Scrum) is just documentation of how a bunch of practitioners were able to achieve continuous delivery and happy team. The question, "How do you do XYZ in Agile?" misses the point. It is a relic of "process conformance" mentality. What's more, I was once asked, "Is it ok to ask for a number of tailorings or deviations from the master process template for agile?" I was speechless. Turned out that the organization still retained the services of a group called SEPG (software engineering process group, a relic of CMM) to define a master process template for agile. Every project was supposed to conform to the template and ask approval for tailorings (tweaking a process/practice) or deviations (omitting a process/practice)!&lt;br /&gt;
&lt;br /&gt;
I think this is a case where ends justify means. If you are achieving continuous delivery and happy team, you are obviously doing something right. It doesn't matter how Agile it is. If you aren't achieving continuous delivery and happy team then again it doesn't matter how Agile your processes are. One might argue that this is watered-down agile. Big deal. Granted, it is definitely wise to go by the book first. It is arrogant/foolish to assume that we are smarter than the book before we begin. After all, the book represents distilled wisdom of practitioners. But it is important to keep an eye on the outcomes. All advice is contextual. It is no use wailing that you have done everything by the book and not getting results. It is dogma to stick to the book in the face of contrary results.&lt;div class="blogger-post-footer"&gt;&lt;p style="text-align: right" align="right"&gt;&lt;a href="http://blog.sriramnarayan.com"&gt;blog home page&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21992362-8946213597292462872?l=blog.sriramnarayan.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/XploringAround/~4/KwkpGnFVIaw" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://blog.sriramnarayan.com/2010/03/how-to-do-xyz-in-agile.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/21992362/posts/default/8946213597292462872?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/21992362/posts/default/8946213597292462872?v=2" /><link rel="alternate" type="text/html" href="http://blog.sriramnarayan.com/2010/03/how-to-do-xyz-in-agile.html" title="How to do XYZ in Agile?" /><author><name>Sriram</name><uri>http://www.blogger.com/profile/01237485664035584743</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://3.bp.blogspot.com/-JsADajCH9EA/TgsyKnD7laI/AAAAAAAAAMQ/JMyPrz3C4pM/s220/nov11visaphoto.JPG" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;D0IESHc-eyp7ImA9WxBbF0w.&quot;"><id>tag:blogger.com,1999:blog-21992362.post-2573791314803665153</id><published>2010-03-15T13:13:00.003+05:30</published><updated>2010-03-16T10:28:29.953+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-16T10:28:29.953+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="agile-antipatterns" /><title>Agile maintenance in a devops world</title><content type="html">"What is an agile way of doing maintenance projects?", is a common question. An answer like the following is par for the course:&lt;br /&gt;
"It isn't very different from development projects. Write tests to reproduce bugs before you fix them. Treat enhancements as one or more stories. Keep the CI server running. Make sure that changes are occasionally merged from the maintenance branch into trunk. Pairing is probably not as important."&lt;br /&gt;
&lt;br /&gt;
In the context of this post, a 'maintenance' project is one where a client outsources ongoing bug-fixes and enhancements for a live application to an IT vendor (often offshore). Conventional wisdom has it that development is investment (capex) and maintenance is cost (opex). Hence, clients look for much lower billing rates when it comes to maintenance. This results in separate contracts/teams/vendors for development and maintenance. Some clients go a step further and outsource even IT operations to a different team/vendor under a separate contract. The rationale is to stick to core 'business competency' and outsource everything else (let them vendors compete with each other for our slice of IT).&lt;br /&gt;
&lt;br /&gt;
Depending on how critical the said application is for revenue generation, this strategy of 'divide-and-conquer-IT' can be frustrating at best and suicidal at worst. The best of the businesses that make most of their money off their websites outsource little to none of their IT. This is simply because you cannot go to market fast enough if you have to orchestrate between three teams/vendors for every new feature. Equally importantly, the feedback loop gets badly constricted at contractual boundaries. Designing formal, SLA driven protocols of communication between business, development, operations and maintenance is a recipe for bureaucracy and indifference.&lt;br /&gt;
&lt;br /&gt;
Not everyone can afford not to outsource. It is very difficult to put a good IT team in place. A lot of outsourcing has been a reaction to uncooperative in-house IT. But the solution has gone overboard in trying to compartmentalize development, operations and maintenance. You don't want to be overly reliant on a single vendor? Fair enough, consider outsourcing product A to vendor X, B to vendor Y and C to vendor Z. This is better than outsourcing the development of A, B, C to vendor X, operations to vendor Y and maintenance to vendor Z. The latter model requires well defined, stable interfaces between different constituencies. Not suitable where business is changing every week. It is a repeat of the &lt;a href="http://dahliabock.wordpress.com/2009/08/06/why-i-think-layer-teams-are-a-bad-idea/" id="uaek" title="layered-team"&gt;layered-team&lt;/a&gt; anti-pattern at a higher level.&lt;br /&gt;
&lt;br /&gt;
What if we want to deliver a grand SOA? Once the team of architects have specified every service, surely it should be possible to outsource a bunch of services to different vendors and the consuming applications to yet others. Splitting up integration work is extremely risky, in my opinion. Service contracts are rarely cast in stone. On the contrary, if you like the idea of evolutionary, guerrilla SOA, you no longer plan to have stable interfaces - the service evolves in tandem with the needs of its consumers. So, try to give all integration work and important applications to your primary vendor. Better yet, don't do big bang top down integration. Evolve bottom up.&lt;br /&gt;
&lt;br /&gt;
On the other hand, it may be that your business doesn't change that often or your application doesn't generate revenue. If so, it is useful to ask "Why build? Why not buy?" every once in a while. SaaS is growing fast. It is likely that someone is offering your bespoke application as a service. At the cost of some tweaks to your business process, you might end up with a better application at lower cost. The SaaS vendor in turn is likely running a full in-house IT.&lt;br /&gt;
&lt;br /&gt;
The world has changed yet again. &lt;a href="http://www.kartar.net/2010/02/what-devops-means-to-me/" id="eicj" title="Devops"&gt;Devops&lt;/a&gt; is &lt;a href="http://www.devopsdays.org/" id="j89y" title="gaining"&gt;gaining&lt;/a&gt; currency. These days, a common way of testing the uptake of new features is to divert, say 5% of your traffic to a new deployment and see how it goes. A separate maintenance team is a dinosaur in an age of frequent deployment (&lt;a href="http://martinfowler.com/bliki/BlueGreenDeployment.html" id="p98n" title="blue-green"&gt;blue-green&lt;/a&gt; or otherwise) and &lt;a href="http://continuousdelivery.com/2010/02/continuous-delivery/#more-61" id="avvu" title="continuous delivery"&gt;continuous delivery&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Q. What is an agile way of doing maintenance projects?&lt;br /&gt;
A. Don't do maintenance as a separate project.&lt;br /&gt;
&lt;br /&gt;
There is one situation where a maintenance project might make sense. End-of-life support. Basically, you pay for a team to keep an old app running while a new replacement gets built. Other than that, it is all about breaking down silos.&lt;br /&gt;
&lt;br /&gt;
Of course, you will never hear Indian IT majors singing this tune. Their recruitment and business model is based on economies of scale. 'Changing businesses' are anathema to their ossified processes. However, in response to changing realities of the marketplace, some of them have begun to sing an agile tune. Some of them even claim to have proprietary, hybrid, high-performance methodologies that "synergize best of breed practices from CMMi, ISO, Six Sigma and Scrum". I'll explore a certain aspect of this 'synergy' in my next post.&lt;div class="blogger-post-footer"&gt;&lt;p style="text-align: right" align="right"&gt;&lt;a href="http://blog.sriramnarayan.com"&gt;blog home page&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21992362-2573791314803665153?l=blog.sriramnarayan.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/XploringAround/~4/9SwlaqwETDw" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://blog.sriramnarayan.com/2010/03/agile-maintenance-support-evolution.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/21992362/posts/default/2573791314803665153?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/21992362/posts/default/2573791314803665153?v=2" /><link rel="alternate" type="text/html" href="http://blog.sriramnarayan.com/2010/03/agile-maintenance-support-evolution.html" title="Agile maintenance in a devops world" /><author><name>Sriram</name><uri>http://www.blogger.com/profile/01237485664035584743</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://3.bp.blogspot.com/-JsADajCH9EA/TgsyKnD7laI/AAAAAAAAAMQ/JMyPrz3C4pM/s220/nov11visaphoto.JPG" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;D0QCRHc6eip7ImA9WxBUGUs.&quot;"><id>tag:blogger.com,1999:blog-21992362.post-113743870613045579</id><published>2010-03-04T12:49:00.004+05:30</published><updated>2010-03-07T18:06:05.912+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-07T18:06:05.912+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="agile-antipatterns" /><title>Pair Programming Payoff</title><content type="html">&lt;div style="text-align: justify;"&gt;For a project that runs for, say six months or more, there should no extra development cost on account of pair programming. Period. If there is extra cost, it means pairing is not paying off for you. Pairing should pay off in the following difficult-to-measure ways:&lt;/div&gt;&lt;ol style="text-align: justify;"&gt;&lt;li&gt;Lesser rework during development on account of misunderstood/ill-defined requirements. These things surface quickly when pairs talk to each other.&lt;/li&gt;
&lt;li&gt;Slight reduction in maintenance cost on account of clearer code. Because every line is now considered readable by at least two people. (more in case of pair rotation)&lt;/li&gt;
&lt;li&gt;A better detail level design results when each pair acts as a sounding board for the other. Good design reduces cost of future change.&lt;/li&gt;
&lt;li&gt;Faster/better process of bringing new team members up to speed.&lt;/li&gt;
&lt;li&gt;Lesser impact of people taking vacations.&lt;/li&gt;
&lt;li&gt;Lesser bugs in QA, UAT&lt;/li&gt;
&lt;li&gt;More hours of focused work per day - however professional someone may be it is natural for concentration to wax and wane. Pairing almost always helps here.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Unlike the case of no-pairing, there is no separate code-review activity required&lt;br /&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;How do you figure if there is extra cost? Estimate both ways. The total 'release-lifecycle effort' for the case of pairing should not exceed that of no-pairing. Individual stories may indicate greater effort but that is okay. It is very difficult to do controlled experiments to nail this down. There are some &lt;a href="http://scholar.google.com/scholar?q=pair+programming+study&amp;amp;hl=en&amp;amp;safe=off&amp;amp;esrch=BetaShortcuts&amp;amp;um=1&amp;amp;ie=UTF-8&amp;amp;oi=scholart" id="npxf" title="studies"&gt;studies&lt;/a&gt; but your mileage may vary. &lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;A word of caution when estimating for such comparisons. Remember that on all real projects, actuals mostly exceed estimates. Some of the difference is borne by the client (change control etc) and the rest by the vendor (unpaid overtime etc). You need to have a realistic idea of effort overrun for the case of no-pairing to be able to compare it with the overrun for the case of pairing.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;If pairing is resulting in net higher development cost on a long running project, then it simply means (to paraphrase Kent Beck) that the client is getting XP'd on :)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;p style="text-align: right" align="right"&gt;&lt;a href="http://blog.sriramnarayan.com"&gt;blog home page&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21992362-113743870613045579?l=blog.sriramnarayan.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/XploringAround/~4/lduBmsaNZ8g" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://blog.sriramnarayan.com/2010/03/pair-programming-payoff.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/21992362/posts/default/113743870613045579?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/21992362/posts/default/113743870613045579?v=2" /><link rel="alternate" type="text/html" href="http://blog.sriramnarayan.com/2010/03/pair-programming-payoff.html" title="Pair Programming Payoff" /><author><name>Sriram</name><uri>http://www.blogger.com/profile/01237485664035584743</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://3.bp.blogspot.com/-JsADajCH9EA/TgsyKnD7laI/AAAAAAAAAMQ/JMyPrz3C4pM/s220/nov11visaphoto.JPG" /></author><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;DEMNR3s9fCp7ImA9WxBUFEw.&quot;"><id>tag:blogger.com,1999:blog-21992362.post-8042753315652832283</id><published>2010-02-25T12:19:00.003+05:30</published><updated>2010-03-01T09:38:16.564+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-01T09:38:16.564+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="agile-antipatterns" /><title>Label activities, not people</title><content type="html">Ideally, an XP team consists of all talented and experienced people. Every person is assumed to have good communication skills, technical skills, ability to analyze and synthesize, understanding of business drivers, ability to make trade-offs based on business constraints and the ability to work as part of a team. Indeed, there probably are thousands of people who qualify on all these counts scattered around the world. But IT is a pervasive beast. It touches almost every aspect of modern business. IT is also labor intensive. The demand for really good people outstrips supply by a factor of hundred if not more.&amp;nbsp; IT vendors who practice XP are therefore forced to move away from the ideal of more or less homogeneous poly-skilled teams.&lt;br /&gt;
&lt;br /&gt;
Instead, we hire people who have a subset of the above skills and assign them to specific roles in a team. So we have roles like developer, analyst, QA, manager, UX dude/dudette etc. It is essential to recognize that this arrangement is a departure from the ideal - a compromise driven by market reality. How we look at roles depends on our model of the ideal world. If you agree with the XP ideal, then roles are labels attached to the activities on a project. e.g. performance tuning activity needs developer role, activity of scope negotiation needs manager role.&lt;br /&gt;
&lt;br /&gt;
But all too often, we lose sight of the ideal and think of roles as labels attached to the people on a project. e.g. person A is a manager, anything she says outside her labeled area of competency should be taken with a pinch of salt, person B is a developer, anything she says outside her labeled area of competency should be taken with a pinch of salt, and so on. We forget that the labeled area of competency is merely a mutual agreement at the time of recruitment. We end up discounting the credibility of people outside their labeled domains.&lt;br /&gt;
&lt;br /&gt;
This kind of thinking also magnifies capacity constraints in a team. Say we have 4 people with label QA and 12 people with label developer on a team. What happens when stories start piling up in QA? We are less likely to see if some developers can add temporary capacity to QA. Oh no, that would never do. Developers can't test. They are not wired to test. Mass stereotyping sets in.&lt;br /&gt;
&lt;br /&gt;
Soon people start buying into their labels. Developers refuse to test. If you can communicate well, you are suspect as a developer. Managers shy away from writing code, or (shudder) gaining even basic user level technical competence. They go about saying "I can't handle technology", as if it were a feather in their cap. We become more and more entrenched in the silos created by our labels. Truly ploy-skilled people get disheartened in the process. A person with a label of analyst may have a great aptitude for domain modeling. But her inputs may be sidelined by developers. After a while she either starts believing in her artificial limitations or she starts looking for another job where her skills are more broadly appreciated.&lt;br /&gt;
&lt;br /&gt;
It is no good to call everyone consultant and then use a different labeling scheme when it comes to staffing projects. To the extent of their skills, people should get to play multiple roles within a single project. Oh, that complicates staffing. So? Should the tail wag the dog?&lt;br /&gt;
&lt;br /&gt;
Organized religion came about partly as a result of our need for identity and self-worth. It is probably reassuring to say "I belong to this group" and then move on to thinking "My group is better than the other group". We may have outgrown traditional organized religion but we seem to be falling for newer versions.&lt;div class="blogger-post-footer"&gt;&lt;p style="text-align: right" align="right"&gt;&lt;a href="http://blog.sriramnarayan.com"&gt;blog home page&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21992362-8042753315652832283?l=blog.sriramnarayan.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/XploringAround/~4/0BIUEfFlJXk" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://blog.sriramnarayan.com/2010/02/label-activities-not-people.html#comment-form" title="11 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/21992362/posts/default/8042753315652832283?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/21992362/posts/default/8042753315652832283?v=2" /><link rel="alternate" type="text/html" href="http://blog.sriramnarayan.com/2010/02/label-activities-not-people.html" title="Label activities, not people" /><author><name>Sriram</name><uri>http://www.blogger.com/profile/01237485664035584743</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://3.bp.blogspot.com/-JsADajCH9EA/TgsyKnD7laI/AAAAAAAAAMQ/JMyPrz3C4pM/s220/nov11visaphoto.JPG" /></author><thr:total>11</thr:total></entry><entry gd:etag="W/&quot;A0ICSHY_eCp7ImA9WxBWGUo.&quot;"><id>tag:blogger.com,1999:blog-21992362.post-5577962110218818424</id><published>2010-02-12T16:20:00.005+05:30</published><updated>2010-02-12T18:29:29.840+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-12T18:29:29.840+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="agile-antipatterns" /><title>Fail fast</title><content type="html">When failure is a possibility, design to fail fast rather than slowly. Doing so reduces the cost/impact of failure. What is equally important, failing fast makes further attempts feasible. Learning from previous failures makes future attempts more likely to succeed. This principle is widely applicable in software development:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Methodologies that have fail fast mechanisms baked in are more likely to generate greater ROI. More on this later.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.infoq.com/interviews/jim-webber-qcon-london" id="uc1f" title="Guerilla SOA"&gt;Guerilla SOA&lt;/a&gt; is arguably a fail fast take on big up-front SOA.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.martinfowler.com/ieeeSoftware/failFast.pdf" id="q93d" title="Fail fast in code"&gt;Code&lt;/a&gt; that is written to fail fast is likely to be more reliable in production.&lt;/li&gt;
&lt;li&gt;Small, frequent check-ins are likely to cause less overall rework than big, infrequent ones.&lt;br /&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;h4&gt;Verification: When and How?&lt;/h4&gt;But how do you decide at any given checkpoint if we have a success or failure at hand? The quality of verification is crucial. Verification by peer review, while valuable, is prone to oversight. The proof of the pudding is in the eating. The more times you get to eat the better. The analog of eating here is testing functionality. A truly iterative process of software development where functionality gets tested iteratively is likely to achieve better ROI (everything else remaining constant). &lt;br /&gt;
&lt;br /&gt;
&lt;div id="r59o" style="text-align: left;"&gt;&lt;img src="http://docs.google.com/File?id=dd7mw33f_155f29c2qcb_b" style="height: 128.948px; width: 1024px;" /&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Okay, so no one uses waterfall anymore. But we still have projects where big up-front analysis and design are the norm and continuous integration means weekly build. In such cases, we only have limited verification (peer reviews of requirements, design and code) till the very end. Failures (if any) are slow and horrible. &lt;br /&gt;
&lt;br /&gt;
Incremental agile is what almost all XP and Scrum teams follow. They run through the stories for a release doing just enough/just in time analysis, design, coding per story. The boundaries between design and code are often blurred but that is not material to this illustration. Truer verification now becomes possible at the end of every story (QA/customer testing/sign-off). However, each story still gets only attempt. Any changes (learnings?) after that go back into the backlog to be prioritized and taken up with everything else. &lt;br /&gt;
&lt;br /&gt;
But as &lt;a href="http://www.agileproductdesign.com/blog/dont_know_what_i_want.html" id="v0vn" title="Jeff Patton"&gt;Jeff Patton&lt;/a&gt; points out, it is possible to view each story as a series of progressive enhancements:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Necessity - core functionality (e.g. user registration)&lt;/li&gt;
&lt;li&gt;Safety - validations etc. (e.g. confirm via email, add a captcha)&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Flexibility (e.g. support openID)&lt;/li&gt;
&lt;li&gt;Luxury (e.g. add ajaxy feedback on available userids, password strength)&lt;br /&gt;
&lt;/li&gt;
&lt;/ol&gt;Yeah the example is a bit contrived (openID would mostly be another story even in incremental mode) but you get my drift. We can now design a release plan that allows the team to &lt;i&gt;iterate on a story&lt;/i&gt;, progressively enhancing it. The story sponsor reviews (tests) each story multiple times. Failures (if any) are faster and cheaper. The team learns better. I like this line from a Werner Vogels &lt;a href="http://queue.acm.org/detail.cfm?id=1142065" id="ju8-" title="interview"&gt;interview&lt;/a&gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="margin-left: 40px;"&gt;With a new radical service, you try to go into prototype mode pretty quickly, and then you start iterating on that&lt;i&gt; until you feel that you understand your business problem.&lt;/i&gt;&lt;/div&gt;&lt;br /&gt;
Stories in regular business applications may not qualify as radically new but very often the team is new to the application in question. "You only understand it when you &lt;i&gt;do it&lt;/i&gt;" is a much under-appreciated truth of all knowledge activity (if not all activity).&lt;br /&gt;
&lt;h4&gt;Expected cost/time&lt;/h4&gt;It may be argued that for a given chunk of functionality, iterating increases overall cost/time as compared to doing it in one go. This is only true when the risk of failure is zero. For situations of non-zero risk, the expected cost/time can often be lower with an iterative approach. The table below shows this for a hypothetical but realistic risk profile where risk decreases as learning increases. Your mileage will vary depending on the risk profile of your team and functionality.&lt;br /&gt;
&lt;br /&gt;
&lt;div id="rg:q" style="text-align: left;"&gt;&lt;img src="http://docs.google.com/File?id=dd7mw33f_154cj47txdh_b" style="height: 160px; width: 645px;" /&gt;&lt;/div&gt;&lt;h4&gt;Failure is not an option&lt;/h4&gt;Sometimes you get to hear sponsors saying they don't care about downside risk because failure is not an option. Some of these projects run into a death march followed by a blow out followed by movement of key people. Then a new team and a new IT partner get to do it all over again.&lt;div class="blogger-post-footer"&gt;&lt;p style="text-align: right" align="right"&gt;&lt;a href="http://blog.sriramnarayan.com"&gt;blog home page&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21992362-5577962110218818424?l=blog.sriramnarayan.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/XploringAround/~4/oWQud0_OrgM" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://blog.sriramnarayan.com/2010/02/fail-fast.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/21992362/posts/default/5577962110218818424?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/21992362/posts/default/5577962110218818424?v=2" /><link rel="alternate" type="text/html" href="http://blog.sriramnarayan.com/2010/02/fail-fast.html" title="Fail fast" /><author><name>Sriram</name><uri>http://www.blogger.com/profile/01237485664035584743</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://3.bp.blogspot.com/-JsADajCH9EA/TgsyKnD7laI/AAAAAAAAAMQ/JMyPrz3C4pM/s220/nov11visaphoto.JPG" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CkUBR34-cSp7ImA9WxBWE0k.&quot;"><id>tag:blogger.com,1999:blog-21992362.post-7254544669457470713</id><published>2010-02-05T08:52:00.002+05:30</published><updated>2010-02-05T08:54:16.059+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-05T08:54:16.059+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="agile-antipatterns" /><title>When Agile Estimation becomes pointless</title><content type="html">If a team &lt;i&gt;has to&lt;/i&gt;  deliver a certain amount of functionality by a certain date, then the  act of estimation becomes an act of commitment. The team has essentially  committed to cost, schedule, quality &lt;i&gt;and scope&lt;/i&gt;. There are no  levers left. In such a situation, velocity becomes a target rather than  just a measurement. Targeting velocity makes points based estimation a  charade. The team is better off estimating in real days in this case. It  helps the cause of commitment. Points based estimation is useful when  you agree to the following:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Plan the story list for a release  with only about 70% must-have functionality and the rest as negotiable.  This implies it is potentially okay to release (go into production)  with just that 70% functionality.&lt;/li&gt;
&lt;li&gt;By definition, estimates are  approximations. Software estimates are more so.&lt;/li&gt;
&lt;li&gt;It is  counterproductive to insist that your IT vendor/team deliver x points of  functionality by date y. Scope negotiation does not mean x remains x.  Yes, sometimes only the contents of x need change. At other times, x may  become x ± delta. This is not a rip-off. It doesn't make business  sense for your IT vendor to rip you off because you won't give repeat  business if you are ripped off. Without repeat business, your IT vendor  is likely to become uncompetitive because the cost of new business  development is very high.&lt;/li&gt;
&lt;/ol&gt;"Embrace change" is a two way  street. IT delivery team should embrace changes to requirements and  priorities. Clients should also embrace changes to scope when delivery  work proceeds at a different pace than originally expected.&lt;div class="blogger-post-footer"&gt;&lt;p style="text-align: right" align="right"&gt;&lt;a href="http://blog.sriramnarayan.com"&gt;blog home page&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21992362-7254544669457470713?l=blog.sriramnarayan.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/XploringAround/~4/M0JJAlcc6NU" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://blog.sriramnarayan.com/2010/02/pointless-agile-estimation.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/21992362/posts/default/7254544669457470713?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/21992362/posts/default/7254544669457470713?v=2" /><link rel="alternate" type="text/html" href="http://blog.sriramnarayan.com/2010/02/pointless-agile-estimation.html" title="When Agile Estimation becomes pointless" /><author><name>Sriram</name><uri>http://www.blogger.com/profile/01237485664035584743</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://3.bp.blogspot.com/-JsADajCH9EA/TgsyKnD7laI/AAAAAAAAAMQ/JMyPrz3C4pM/s220/nov11visaphoto.JPG" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;D0EHRXs-fyp7ImA9WxBXF04.&quot;"><id>tag:blogger.com,1999:blog-21992362.post-1930849276560912333</id><published>2010-01-29T08:55:00.003+05:30</published><updated>2010-01-29T08:57:14.557+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-29T08:57:14.557+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="meta" /><title>The Tragedy of Commons based Peer Production</title><content type="html">In my previous &lt;a href="http://blog.sriramnarayan.com/2010/01/open-source-authors-struggle-for.html" id="j1pw" title="Open source authors' struggle for compensation"&gt;post&lt;/a&gt;, I mentioned how authors of small but useful open source projects often struggle for compensation. Using a FOSS/commercial license is one option but it could go either way. They wouldn't really have to resort to compulsory payment if donations were forthcoming from users/organizations who commercially benefit from it. Therein lies the tragedy of 'Commons based Peer Production'. Only a tiny minority donate. This is detrimental to the growth of all forms of free digitial distribution (indy music, books, software etc). It also makes for an unhealthy society. Big leap? Bear with me.&lt;br /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;The bulk of financial transactions in G20 economies happen between:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Corporations (B2B)&lt;/li&gt;
&lt;li&gt;Corporation and citizen (retail - citizens pays corporation, wages - corporation pays citizen)&lt;/li&gt;
&lt;li&gt;Corporation and state (taxes - corporation pays state, state funded projects - state pays corporation)&lt;/li&gt;
&lt;li&gt;Citizen and state (taxes - citizen pays state, pension/welfare - state pays citizen)&lt;/li&gt;
&lt;/ol&gt;But what about transactions between citizens? When this goes towards zero, we get a unhealthy society. Centralized services, mostly helpless consumers (citizens). Donating money to the creators of 'digital stuff' that we enjoy is a great way of changing the status quo. The internet has provided a great platform for disintermediation but it will only work if we choose to participate in the process.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;We could also try to build momentum within our organizations towards this. Companies that commercially benefit (however indirectly) from free software could set aside some money annually for donations. The beneficiaries could be decided by a poll within the company. After all, this is also part of CSR. Plus it will make for good PR copy.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;p style="text-align: right" align="right"&gt;&lt;a href="http://blog.sriramnarayan.com"&gt;blog home page&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21992362-1930849276560912333?l=blog.sriramnarayan.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/XploringAround/~4/fuPnSwHPUK4" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://blog.sriramnarayan.com/2010/01/tragedy-of-commons-based-peer-pro.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/21992362/posts/default/1930849276560912333?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/21992362/posts/default/1930849276560912333?v=2" /><link rel="alternate" type="text/html" href="http://blog.sriramnarayan.com/2010/01/tragedy-of-commons-based-peer-pro.html" title="The Tragedy of Commons based Peer Production" /><author><name>Sriram</name><uri>http://www.blogger.com/profile/01237485664035584743</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://3.bp.blogspot.com/-JsADajCH9EA/TgsyKnD7laI/AAAAAAAAAMQ/JMyPrz3C4pM/s220/nov11visaphoto.JPG" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CU4ERHs4fyp7ImA9WxBXFEk.&quot;"><id>tag:blogger.com,1999:blog-21992362.post-4039452553093697105</id><published>2010-01-25T16:37:00.006+05:30</published><updated>2010-01-25T23:55:05.537+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-25T23:55:05.537+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="meta" /><title>Open Source authors' struggle for compensation</title><content type="html">&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;I guess we all know the difference between free as in speech (freedom) and free as in lunch (gratis). All open source software confer certain freedoms of use, modification and redistribution. None of them are required to be made available to users at zero cost. Yet, I don't know of a single significant project that is open source and fully paid, i.e. no version available at zero cost. Reasons typically offered are:&lt;/span&gt;&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;&lt;br /&gt;
&lt;/span&gt; &lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-top: 0px;"&gt;&lt;ol style="margin-bottom: 0px; margin-top: 0px;"&gt;&lt;li style="margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;It is the freemium business model - Give away the basic software and charge for enhanced functionality or support.&lt;/span&gt;&lt;/li&gt;
&lt;li style="margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;It is not enforceable - Users will simply build the software from the source code and there is no way you can get them to pay.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;&lt;br /&gt;
&lt;/span&gt; &lt;br /&gt;
&lt;ol style="margin-bottom: 0px; margin-top: 0px;"&gt;&lt;/ol&gt;&lt;/div&gt;&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;#1 is okay for projects run by companies. It is often not feasible for projects run by individuals. This a big category of small useful pieces of software (think libaries, plugins, utilities). These people try (in vain?) to make some money via advertisements or by appealing for donations. It is a sad reality that they get no compensation from commercial software/organizations using their work. These people should relook at #2.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;&lt;br /&gt;
&lt;/span&gt; &lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt; &lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;I suspect payment is very enforcable against commercial enterprises. Just add a line to your EULA saying "It is illegal to use this software for commercial purposes without paying for it". Most companies would pay a small fee (say $50 for a full version but without support) for a useful piece of software. Either that or their lawyers would blacklist the software. At least you wouldn't have legions of freeloaders just using the software without contributing anything (money, bug reports/fixes, documentation) back. The argument that even freeloaders help spread the word to someone who might eventually buy something is a trifle bleak. Of course, all power to you if are doing this altruistically or if you are happy with the other rewards (fun, learning, reputation).&lt;/span&gt;&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;&lt;br /&gt;
&lt;/span&gt; &lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;Giving software away at zero cost means you have to depend on services for income. You either offer your services as an employee (day job) or as support (adding value to what is given away). Either way, it is a model of pricing input instead of output. Scales only with people. Or you have to fall into a category where you can be adopted by a big foundation like Eclipse or Apache or Mozilla. &amp;nbsp;Good luck with that.&lt;/span&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;p style="text-align: right" align="right"&gt;&lt;a href="http://blog.sriramnarayan.com"&gt;blog home page&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21992362-4039452553093697105?l=blog.sriramnarayan.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/XploringAround/~4/Cp6H-C1lsH0" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://blog.sriramnarayan.com/2010/01/open-source-authors-struggle-for.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/21992362/posts/default/4039452553093697105?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/21992362/posts/default/4039452553093697105?v=2" /><link rel="alternate" type="text/html" href="http://blog.sriramnarayan.com/2010/01/open-source-authors-struggle-for.html" title="Open Source authors' struggle for compensation" /><author><name>Sriram</name><uri>http://www.blogger.com/profile/01237485664035584743</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://3.bp.blogspot.com/-JsADajCH9EA/TgsyKnD7laI/AAAAAAAAAMQ/JMyPrz3C4pM/s220/nov11visaphoto.JPG" /></author><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;DUAGRng5eyp7ImA9WxBXFEw.&quot;"><id>tag:blogger.com,1999:blog-21992362.post-7521173614160481974</id><published>2009-11-17T00:08:00.005+05:30</published><updated>2010-01-25T16:38:47.623+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-25T16:38:47.623+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="meta" /><title>No software patents versus patent reform</title><content type="html">&lt;div class="MsoNormal"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="MsoNormal"&gt;We often cry ourselves hoarse trying to justify non-waterfall methods of software development saying that software is fundamentally different from manufacturing or civil construction. There is substance to this. Code is design. Compilation (build) is zero cost for all practical purposes. If we agree that compilation is the equivalent of a manufacturing assembly line or brick-laying, then the economics of software development are very different indeed. The economics of software make it particularly vulnerable to the ill-effects ot the current patent regime.&lt;br /&gt;
&lt;/div&gt;&lt;div class="MsoNormal"&gt;I used to find it surprising when highly credible &lt;a href="http://www.paulgraham.com/softwarepatents.html"&gt;people&lt;/a&gt; said there was nothing fundamentally different about software patents - "If you're against software patents, you're against patents in general." Until I realized that software patents aren't inherently evil - the devil, as usual, lurks in the details.&lt;br /&gt;
&lt;/div&gt;&lt;div class="MsoNormal"&gt;Patents exist to balance competing objectives:&lt;br /&gt;
&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;ol&gt;&lt;li&gt;Encourage innovation&lt;/li&gt;
&lt;li&gt;Give innovators a chance to profit from their success&lt;/li&gt;
&lt;li&gt;Improve the body of knowledge in the public domain (eventually)&lt;/li&gt;
&lt;/ol&gt;&lt;div class="MsoNormal"&gt;In practice, the second objective is generally met by conferring a twenty year period of exclusive usage rights. Thus, patents are economic devices. Won't the efficacy of an economic device depend on the underlying economics of the industry it is meant for? Do all industries require twenty years to recoup investment and monetize an innovation? It certainly is ridiculous for software. Technology cycles keep getting shorter - twenty years is several generations in most industries today. A two year patent might be more reasonable for software. Of course, that still leaves jokes like the one-click-checkout patent untouched.&lt;br /&gt;
&lt;/div&gt;&lt;div class="MsoNormal"&gt;When patents were first conceived, they were meant for flesh and blood patent holders, not for mere legal persons (Corporations). Corporations gained personhood much later. However, the majority of patents today are held by corporations rather than individuals. This has lead to barely legal behaviors that end up stifling innovation in the industry as a whole.&lt;br /&gt;
&lt;/div&gt;&lt;div class="MsoNormal"&gt;What's really needed is a nimble international body that can tweak the terms of patenting for different industries. But then, international co-operation is hard to come by even for life threatening issues such as climate change. No wonder people push for elimination of software patents instead of push for a better patent regime.&lt;br /&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;p style="text-align: right" align="right"&gt;&lt;a href="http://blog.sriramnarayan.com"&gt;blog home page&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21992362-7521173614160481974?l=blog.sriramnarayan.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/XploringAround/~4/8TN3YqkyfEM" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://blog.sriramnarayan.com/2009/11/no-software-patents-versus-patent.html#comment-form" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/21992362/posts/default/7521173614160481974?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/21992362/posts/default/7521173614160481974?v=2" /><link rel="alternate" type="text/html" href="http://blog.sriramnarayan.com/2009/11/no-software-patents-versus-patent.html" title="No software patents versus patent reform" /><author><name>Sriram</name><uri>http://www.blogger.com/profile/01237485664035584743</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://3.bp.blogspot.com/-JsADajCH9EA/TgsyKnD7laI/AAAAAAAAAMQ/JMyPrz3C4pM/s220/nov11visaphoto.JPG" /></author><thr:total>5</thr:total></entry><entry gd:etag="W/&quot;AkEFRnk9eCp7ImA9WxNXEko.&quot;"><id>tag:blogger.com,1999:blog-21992362.post-3568041088271723810</id><published>2009-09-30T08:00:00.003+05:30</published><updated>2009-09-30T08:13:37.760+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-30T08:13:37.760+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="design" /><title>Being explict is better than being implicit - only when everything else is constant</title><content type="html">&lt;div style="text-align: justify;"&gt;The benefits of dependency injection are:&lt;br /&gt;&lt;/div&gt;&lt;ol style="text-align: justify;"&gt;&lt;li&gt;Separating configuration of dependencies from their use.&lt;/li&gt;&lt;li&gt;Improving unit testability.&lt;/li&gt;&lt;li&gt;Making dependencies explicit.&lt;/li&gt;&lt;/ol&gt;&lt;div style="text-align: justify;"&gt;As I finished explaining these points to some new hires, I followed it up with a generalisation, "And in general, being explicit is better than being implicit - it reduces ambiguity and improves communication, always welcome in software development." Immediately I was struck by a few incongruities. After all, we have come to appreciate:&lt;br /&gt;&lt;/div&gt;&lt;ol style="text-align: justify;"&gt;&lt;li&gt;The absence of Java-esque checked exceptions in C#.&lt;/li&gt;&lt;li&gt;The flexibility afforded by dynamically typed languages.&lt;/li&gt;&lt;li&gt;The evolution friendliness and interoperability of loosely typed SOAP web service contracts (documents, coarse-grained interfaces, restricting ourselves to the simplest of XSD types).&lt;/li&gt;&lt;/ol&gt;&lt;div style="text-align: justify;"&gt;In the above cases, being explicit comes with a stiff cost. We trade it off for flexibility. So the generalisation still holds. In general, being explicit is better than being implicit. But there is a caveat implicit in there - "In general, being explicit is better than being implicit &lt;span style="font-style: italic;"&gt;provided everything else remains constant.&lt;/span&gt;" If there  are additional benefits to be gained from going implicit, then being explicit is questionable.&lt;br /&gt;&lt;br /&gt;It helps to make this caveat explicit. A case of making the generalisation practise what it preached.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;p style="text-align: right" align="right"&gt;&lt;a href="http://blog.sriramnarayan.com"&gt;blog home page&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21992362-3568041088271723810?l=blog.sriramnarayan.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/XploringAround/~4/dNH9GR318sw" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://blog.sriramnarayan.com/2009/09/being-explict-is-better-than-being.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/21992362/posts/default/3568041088271723810?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/21992362/posts/default/3568041088271723810?v=2" /><link rel="alternate" type="text/html" href="http://blog.sriramnarayan.com/2009/09/being-explict-is-better-than-being.html" title="Being explict is better than being implicit - only when everything else is constant" /><author><name>Sriram</name><uri>http://www.blogger.com/profile/01237485664035584743</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://3.bp.blogspot.com/-JsADajCH9EA/TgsyKnD7laI/AAAAAAAAAMQ/JMyPrz3C4pM/s220/nov11visaphoto.JPG" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DkUERno-eSp7ImA9WxNTGEo.&quot;"><id>tag:blogger.com,1999:blog-21992362.post-4046878026821552473</id><published>2009-08-21T22:27:00.003+05:30</published><updated>2009-08-21T22:33:27.451+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-21T22:33:27.451+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="IT-in-India" /><title>SOA in India</title><content type="html">businesstechnology.in run by S&amp;amp;S Media (people behind JAX conference) &lt;a href="http://businesstechnology.in//2009/08/14/Introspecting-SOA.html"&gt;interviewed&lt;/a&gt; me on the state of SOA in general and in India in particular.&lt;div class="blogger-post-footer"&gt;&lt;p style="text-align: right" align="right"&gt;&lt;a href="http://blog.sriramnarayan.com"&gt;blog home page&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21992362-4046878026821552473?l=blog.sriramnarayan.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/XploringAround/~4/Kav4sJKeSGc" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://blog.sriramnarayan.com/2009/08/soa-in-india.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/21992362/posts/default/4046878026821552473?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/21992362/posts/default/4046878026821552473?v=2" /><link rel="alternate" type="text/html" href="http://blog.sriramnarayan.com/2009/08/soa-in-india.html" title="SOA in India" /><author><name>Sriram</name><uri>http://www.blogger.com/profile/01237485664035584743</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://3.bp.blogspot.com/-JsADajCH9EA/TgsyKnD7laI/AAAAAAAAAMQ/JMyPrz3C4pM/s220/nov11visaphoto.JPG" /></author><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;DEIBSXc4cCp7ImA9WxJWEks.&quot;"><id>tag:blogger.com,1999:blog-21992362.post-7429263060066744450</id><published>2009-06-18T00:47:00.002+05:30</published><updated>2009-06-18T00:52:38.938+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-18T00:52:38.938+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="books" /><title>How applications learn. What happens after they are built?</title><content type="html">I have been reading &lt;a title="Stewart Brand's" href="http://web.me.com/stewartbrand/SB_homepage/Home.html" id="drfu"&gt;Stewart Brand's&lt;/a&gt; much celebrated &lt;a title="book" href="http://www.amazon.com/gp/product/0140139966/sr=1-1/qid=1155084886/ref=pd_bbs_1/102-5135120-3196937?ie=UTF8&amp;amp;s=books" id="t:jl"&gt;book&lt;/a&gt; over some time now. Took some inspiration from it for a local KM-community &lt;a title="talk" href="http://sriramnarayan.com/understanding_innovation.pdf" id="yhrp"&gt;talk&lt;/a&gt; on innovation. In particular, I was tickled by his characterization of how ideas spread:&lt;br /&gt;&lt;blockquote&gt;Perhaps culture is driven by just such flea-market ideas in a vast network of uncredited influence.&lt;br /&gt;&lt;/blockquote&gt;Replace culture by 'innovation in software' and it still makes perfect sense. Our aggregated blog &lt;a title="page" href="http://blogs.thoughtworks.com/" id="haf1"&gt;page&lt;/a&gt; is a good example of a flea-market of ideas.&lt;br /&gt;&lt;br /&gt;Stewart argues for evolutionary design over visionary design - now where have I heard that before? It seems he once suggested to an architect that he go back to his building to see how the users were finding it. The architect said, "Oh no. You never go back. It's too discouraging."  Just reinforces that we need to be on our guard when we choose technologies to build applications. Will the eventual maintainers of the application be comfortable with them? Is the app designed for change? Does the roof (read abstractions) leak?&lt;br /&gt;&lt;br /&gt;It's true that construction industry (or any other industry for that matter) isn't a good analogy for software development. In particular, coding is not analogous to construction (compilation probably is). But the life of a building seems to have striking similarities with that of an application. Though buildings are expected to have much longer lives than applications, the total churn that they are subjected to is probably comparable. Buildings are subjected to form-over-function pressures of the marketplace - software apps are less so. Both suffer every now and then from architect hubris.&lt;br /&gt;&lt;br /&gt;Wired &lt;a title="book" href="http://www.wired.com/wired/archive/2.11/streetcred.html" id="e-r_"&gt;covered&lt;/a&gt; the book long ago. The BBC documentaries based on the book are still available.&lt;br /&gt;&lt;br /&gt;&lt;a title="Part 1: Flow" href="http://video.google.com/videoplay?docid=8639555925486210852" id="j6ms"&gt;Part 1: Flow&lt;/a&gt;&lt;br /&gt;&lt;a title="Part 2: The Low Road" href="http://video.google.com/videoplay?docid=5088653796598486022" id="t.j4"&gt;Part 2: The Low Road&lt;/a&gt;&lt;br /&gt;&lt;a title="Part 3: Built for change" href="http://video.google.com/videoplay?docid=6141960341438553915" id="xx_7"&gt;Part 3: Built for change&lt;/a&gt;&lt;br /&gt;&lt;a title="Part 4: Unreal estate" href="http://video.google.com/videoplay?docid=-8761299882173964035" id="k7s0"&gt;Part 4: Unreal estate&lt;/a&gt;&lt;br /&gt;&lt;a title="Part 5: The romance of maintenance" href="http://video.google.com/videoplay?docid=5407846553590755822" id="cz8-"&gt;Part 5: The romance of maintenance&lt;/a&gt;&lt;br /&gt;&lt;a title="Part 6: Shearing Layers" href="http://video.google.com/videoplay?docid=2283224496826631552" id="m3wj"&gt;Part 6: Shearing Layers&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;There is also a good summary up at: &lt;a title="http://www.gyford.com/phil/writing/2004/10/24/how_buildings_le.php" href="http://www.gyford.com/phil/writing/2004/10/24/how_buildings_le.php" id="r18s"&gt;http://www.gyford.com/phil/writing/2004/10/24/how_buildings_le.php&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;p style="text-align: right" align="right"&gt;&lt;a href="http://blog.sriramnarayan.com"&gt;blog home page&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21992362-7429263060066744450?l=blog.sriramnarayan.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/XploringAround/~4/fCgafYBgoVc" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://blog.sriramnarayan.com/2009/06/how-applications-learn-what-happens.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/21992362/posts/default/7429263060066744450?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/21992362/posts/default/7429263060066744450?v=2" /><link rel="alternate" type="text/html" href="http://blog.sriramnarayan.com/2009/06/how-applications-learn-what-happens.html" title="How applications learn. What happens after they are built?" /><author><name>Sriram</name><uri>http://www.blogger.com/profile/01237485664035584743</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://3.bp.blogspot.com/-JsADajCH9EA/TgsyKnD7laI/AAAAAAAAAMQ/JMyPrz3C4pM/s220/nov11visaphoto.JPG" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;C0ECQn44fyp7ImA9WxJXFkk.&quot;"><id>tag:blogger.com,1999:blog-21992362.post-5922218651581518758</id><published>2009-06-10T19:06:00.006+05:30</published><updated>2009-06-10T19:17:43.037+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-10T19:17:43.037+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="appengine" /><title>ThoughtWorks on App Engine for Java: Google I/O Enterprise track</title><content type="html">&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/-4fA_UciDaA&amp;hl=en&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/-4fA_UciDaA&amp;hl=en&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;ThoughtWorks' CTO, Rebecca Parsons and Martin Fowler &lt;a title="presented" href="http://dl.google.com/io/2009/pres/w_415_thoughtworks_on_appengine_for_java_enterprise.pdf" id="f97-"&gt;presented&lt;/a&gt; (with usual panache) this overview of ThoughtWorks' findings on Google App Engine (and the cloud in general) at &lt;a title="Google I/O" href="http://code.google.com/events/io/sessions/ThoughtWorksAppEngineJava.html" id="xdds"&gt;Google I/O&lt;/a&gt;. Being part of the enterprise track, their talk focussed on enterprise readiness/applicability.&lt;br /&gt;&lt;br /&gt;A summary for the busy technologist:&lt;br /&gt;&lt;br /&gt;&lt;i&gt; Google App Engine&lt;/i&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;A reasonable option for a number of applications.&lt;/li&gt;&lt;li&gt;Sets the bar in terms of low barrier to entry&lt;/li&gt;&lt;li&gt;Technical things to consider before taking the plunge:&lt;/li&gt;&lt;ol&gt;&lt;li&gt;Testing - development environment not (yet) quite the same as production.&lt;/li&gt;&lt;li&gt;Persistence - Different idioms needed than when persisting to relational databases.&lt;/li&gt;&lt;li&gt;Concurrency - The deployment sandbox is effectively single threaded. A whole bunch of Java libraries that spawn their own threads will need to be ported over before they can be used on the app engine. Moving away from shared memory concurrency is probably good anyway.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/ol&gt;&lt;i&gt; Advice for the enterprise&lt;/i&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;There is a spectrum from infrastructure (Amazon) to applications (Salesforce) with platform (app engine) being in the middle but closer to infrastructure. Domain specific play (statistical analysis cloud) is possible in the space between platform and applications. Of course, considering the venue, the speakers did not emit competing names like Amazon or Microsoft.&lt;/li&gt;&lt;li&gt;Standard potential advantages - dynamic scaling, low entry barrier (therefore low downside risk), pay as you go (op-ex over cap-ex)&lt;/li&gt;&lt;li&gt;Economies of scale (in terms of skilled people and infrastructure) mean that it is much harder to do-it-yourself (private clouds). &lt;/li&gt;&lt;li&gt;Security, privacy and IP - SLAs are ok but not nearly as good as the ability to fire your CIO when things go horribly wrong.&lt;/li&gt;&lt;li&gt;Is it really cheaper? - Unambiguous yes only if you move everything and close down your own data center.&lt;/li&gt;&lt;li&gt;Need new IT org? - probably yes - hopefully one that has better relations with the business.&lt;/li&gt;&lt;li&gt;Vendor lock-in? - probably not much worse than Oracle lock-in. &lt;/li&gt;&lt;li&gt;Other use cases - experiments, spiky one-time computational needs.&lt;/li&gt;&lt;li&gt;This is another of those things that lets you focus on core competencies.&lt;/li&gt;&lt;li&gt;Has the potential to solve the last-mile problem in agile software development - frequent and incremental deployment to production.&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;p style="text-align: right" align="right"&gt;&lt;a href="http://blog.sriramnarayan.com"&gt;blog home page&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21992362-5922218651581518758?l=blog.sriramnarayan.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/XploringAround/~4/yuJ4lv0hPVA" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://blog.sriramnarayan.com/2009/06/thoughtworks-on-app-engine-for-java.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/21992362/posts/default/5922218651581518758?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/21992362/posts/default/5922218651581518758?v=2" /><link rel="alternate" type="text/html" href="http://blog.sriramnarayan.com/2009/06/thoughtworks-on-app-engine-for-java.html" title="ThoughtWorks on App Engine for Java: Google I/O Enterprise track" /><author><name>Sriram</name><uri>http://www.blogger.com/profile/01237485664035584743</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://3.bp.blogspot.com/-JsADajCH9EA/TgsyKnD7laI/AAAAAAAAAMQ/JMyPrz3C4pM/s220/nov11visaphoto.JPG" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DEYFSHw9eyp7ImA9WxJSFks.&quot;"><id>tag:blogger.com,1999:blog-21992362.post-3568957351006561608</id><published>2009-05-07T08:21:00.005+05:30</published><updated>2009-05-07T08:45:19.263+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-07T08:45:19.263+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="knowledge management" /><title>Fallacies of Knowledge Management: Summary</title><content type="html">&lt;div style="text-align: left;"&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.flickr.com/photos/claudiobranch/3325101490/"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; cursor: pointer; width: 320px; height: 213px;" src="http://3.bp.blogspot.com/_P8pGGPoTKzo/SgJP6wgzoQI/AAAAAAAAAHA/WeoKjqopSsw/s320/bookshelf.jpg" alt="" id="BLOGGER_PHOTO_ID_5332912779633598722" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;This post summarizes my series on fallacies of knowledge management.&lt;br /&gt;&lt;/div&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://blog.sriramnarayan.com/2009/03/knowledge-management-fallacies-well.html"&gt;  Well begun is half done, so let's begin by collecting content&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.sriramnarayan.com/2009/03/knowledge-management-fallacies.html"&gt;  Repositories ensure that knowledge lasts longer than employees&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.sriramnarayan.com/2009/03/knowledege-management-fallacies-good.html"&gt;  Good organization is key&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.sriramnarayan.com/2009/03/knowledge-management-fallacies-access.html"&gt;Access Control is Key&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.sriramnarayan.com/2009/04/knowledge-management-fallacies-import.html"&gt;Make it easy to import and attach documents&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a title="Put usable tools in place, adoption will follow" href="http://blog.sriramnarayan.com/2009/05/km-fallacies-put-usable-tools-in-place.html" id="ntzm"&gt;Put usable tools in place, adoption will follow&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;      Plug: If you think your organization could use some help on KM, feel free to &lt;a title="reach out" href="http://sriramnarayan.com/TWI_advisory_collateral.pdf" id="s_7s"&gt;reach out&lt;/a&gt;  to us.&lt;div class="blogger-post-footer"&gt;&lt;p style="text-align: right" align="right"&gt;&lt;a href="http://blog.sriramnarayan.com"&gt;blog home page&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21992362-3568957351006561608?l=blog.sriramnarayan.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/XploringAround/~4/74bKdmPa4Io" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://blog.sriramnarayan.com/2009/05/fallacies-of-knowledge-management.html#comment-form" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/21992362/posts/default/3568957351006561608?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/21992362/posts/default/3568957351006561608?v=2" /><link rel="alternate" type="text/html" href="http://blog.sriramnarayan.com/2009/05/fallacies-of-knowledge-management.html" title="Fallacies of Knowledge Management: Summary" /><author><name>Sriram</name><uri>http://www.blogger.com/profile/01237485664035584743</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://3.bp.blogspot.com/-JsADajCH9EA/TgsyKnD7laI/AAAAAAAAAMQ/JMyPrz3C4pM/s220/nov11visaphoto.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_P8pGGPoTKzo/SgJP6wgzoQI/AAAAAAAAAHA/WeoKjqopSsw/s72-c/bookshelf.jpg" height="72" width="72" /><thr:total>4</thr:total></entry><entry gd:etag="W/&quot;D0QFQnozfyp7ImA9WxJSEUU.&quot;"><id>tag:blogger.com,1999:blog-21992362.post-4519573682492371310</id><published>2009-05-01T19:04:00.002+05:30</published><updated>2009-05-01T19:11:53.487+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-01T19:11:53.487+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="knowledge management" /><title>KM fallacies: Put usable tools in place, adoption will follow</title><content type="html">The effort of running a typical KM &lt;i&gt;initiative&lt;/i&gt; almost makes us want to believe that mass adoption will follow. Unfortunately, Ms.Adoption is not easily wooed. The launch of these initiatives are usually broadcast via company wide email. An increasing percentage of employees seem to be immune to such broadcasts (for good reason?). The early adopters, a smail percentage, use it for a few days and then their activity begins to dwindle. Adoption proceeds at an uneven pace and sometimes fails to reach critical mass needed for positive &lt;a title="network effects" href="http://en.wikipedia.org/wiki/Network_effect" id="qlno"&gt;network effects&lt;/a&gt;. A year later, it's time for yet another initiative.&lt;br /&gt;&lt;br /&gt;There are often genuine reasons why adoption doesn't take off. For example, the applications may not be easily accessible outside the company intranet. Or the applications may be slow to access from remote offices. Maybe people are just overworked. I am begining to wonder if there is another factor at play. I have observed it on the web and I suspect similar forces are at play within the enterprise: poor citizenship. Too many of us prefer to be passive consumers of public content on the internet. We don't produce or perhaps more importantly, &lt;i&gt;curate&lt;/i&gt; existing content. Granted, there are some prolific producers of mediocre content via blogs, comments, tweets, and posts to public mailing lists or discussion groups (and a few prolific producers of really good content via the same channels) but they are more the exception than the rule.&lt;br /&gt;&lt;br /&gt;Some examples of poor citizenship with respect to curating content:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Not clicking "I found this review helpful/unhelpful" on a website that carries reviews (e.g. Amazon) or "This documentation was/was not useful to me" on a website that actively solicits feedback on documentation (e.g. many of Google's help pages)&lt;/li&gt;&lt;li&gt;Not adding appropriate tags to images found on Flickr&lt;br /&gt;  &lt;/li&gt;&lt;li&gt;Not posting answers to unanswered questions that you ask in a public forum and later figure out the answer/workaround for.&lt;/li&gt;&lt;li&gt;There are times when programmers struggle with a cryptic stacktrace at work and a web search points them to the exact cause. All because someone took the effort to blog about that issue. You often see a number of grateful comments at the bottom of such posts. Yet, when I overcome such a problem by myself, I seldom try to write a post about it.&lt;br /&gt;  &lt;/li&gt;&lt;/ol&gt;  It's not like we don't do it because we are against &lt;a title="digital sharecropping" href="http://www.roughtype.com/archives/2006/12/sharecropping_t.php" id="u2yr"&gt;digital sharecropping&lt;/a&gt;. It might be that trying to be a good cyber citizen leads to &lt;a title="yak shaving" href="http://sethgodin.typepad.com/seths_blog/2005/03/dont_shave_that.html" id="y40e"&gt;yak shaving&lt;/a&gt;. I suspect that at least some it just boils down to a I-can't-be-bothered attitude. This attitude has tragic consequences for commons like public forums and wikis. Not many people seem to want to take the effort to contribute. But a system that fully relies on user generated content cannot succeed in the face of indifferent users. To some extent, cultural legacies determine our ability to effectively participate in a system that more resembles a gift economy. Incentive systems may help with adoption but they need to be &lt;a title="tailored" href="http://stackoverflow.com/faq#reputation" id="twmz"&gt;tailored&lt;/a&gt;  to the specific dynamics of the user community. All in all, adoption is a tough nut to crack.&lt;div class="blogger-post-footer"&gt;&lt;p style="text-align: right" align="right"&gt;&lt;a href="http://blog.sriramnarayan.com"&gt;blog home page&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21992362-4519573682492371310?l=blog.sriramnarayan.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/XploringAround/~4/sbTGDNNKX94" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://blog.sriramnarayan.com/2009/05/km-fallacies-put-usable-tools-in-place.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/21992362/posts/default/4519573682492371310?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/21992362/posts/default/4519573682492371310?v=2" /><link rel="alternate" type="text/html" href="http://blog.sriramnarayan.com/2009/05/km-fallacies-put-usable-tools-in-place.html" title="KM fallacies: Put usable tools in place, adoption will follow" /><author><name>Sriram</name><uri>http://www.blogger.com/profile/01237485664035584743</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://3.bp.blogspot.com/-JsADajCH9EA/TgsyKnD7laI/AAAAAAAAAMQ/JMyPrz3C4pM/s220/nov11visaphoto.JPG" /></author><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;CUMNSXg4eip7ImA9WxJTGUw.&quot;"><id>tag:blogger.com,1999:blog-21992362.post-6469099817841496160</id><published>2009-04-28T15:06:00.005+05:30</published><updated>2009-04-28T15:41:38.632+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-28T15:41:38.632+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="design" /><title>Encapsulation is not security</title><content type="html">I came across this &lt;a href="http://stackoverflow.com/questions/70528/why-are-pythons-private-methods-not-actually-private"&gt;discussion&lt;/a&gt; on the lack of really private methods in Python. Time and again, some of us feel violated that a method that is supposed to be private is somehow accessible to callers (via permissive reflection or otherwise). However, this reaction misses the point of encapsulation.&lt;br /&gt;&lt;br /&gt;Encapsulating an object is not about protecting (or securing) the said object. If you must think in terms of protection, then it is about protecting the consumers (callers) of the object. Encapsulation is about freeing your consumers from the knowledge of your implementation details. By doing so, you insulate your consumers from any ripple effect of changes to your implementation.&lt;br /&gt;&lt;br /&gt;The term 'access qualifier' for describing public, protected, private doesn't help. Something like 'visibility indicator' might help avoid the notion of access protection.&lt;div class="blogger-post-footer"&gt;&lt;p style="text-align: right" align="right"&gt;&lt;a href="http://blog.sriramnarayan.com"&gt;blog home page&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21992362-6469099817841496160?l=blog.sriramnarayan.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/XploringAround/~4/f6uRjVhhutc" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://blog.sriramnarayan.com/2009/04/encapsulation-is-not-security.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/21992362/posts/default/6469099817841496160?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/21992362/posts/default/6469099817841496160?v=2" /><link rel="alternate" type="text/html" href="http://blog.sriramnarayan.com/2009/04/encapsulation-is-not-security.html" title="Encapsulation is not security" /><author><name>Sriram</name><uri>http://www.blogger.com/profile/01237485664035584743</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://3.bp.blogspot.com/-JsADajCH9EA/TgsyKnD7laI/AAAAAAAAAMQ/JMyPrz3C4pM/s220/nov11visaphoto.JPG" /></author><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;DkIGRHcyfyp7ImA9WxVaF04.&quot;"><id>tag:blogger.com,1999:blog-21992362.post-5357025096359353057</id><published>2009-04-15T00:05:00.003+05:30</published><updated>2009-04-15T00:12:05.997+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-15T00:12:05.997+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="knowledge management" /><title>Knowledge Management Fallacies: make it easy to import and attach documents</title><content type="html">In order to migrate legacy content, one might resort to importing or attaching old documents into a newly fangled KM repository. This is a slippery slope. Importing/attaching becomes a crutch for users who are just too lazy to get used to authoring content in-line (using rich text editors). They continue to author all documents off-line. So what? Is there is a problem?&lt;br /&gt;&lt;br /&gt;As Google has so successfully demonstrated, it is often the hyperlinks between documents that are more valuable than the documents themselves. Imported/attached content almost always lacks relevant hyperlinks to other documents in the repository. They hang about like dead limbs of a tree. What is worse, the offline versions often aren't discarded after import. They continue to evolve offline, unbeknownst to other users. They get attached to emails and soon no one cares about the orphaned version in the repository. The Google docs video captures this sitution well.&lt;br /&gt;&lt;br /&gt;&lt;object height="364" width="445"&gt;&lt;param name="movie" value="http://www.youtube.com/v/eRqUE6IHTEA&amp;amp;hl=en&amp;amp;fs=1&amp;amp;rel=0&amp;amp;border=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/eRqUE6IHTEA&amp;amp;hl=en&amp;amp;fs=1&amp;amp;rel=0&amp;amp;border=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="364" width="445"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;But of course, we love the power of our offline office tools and will continue to have powerful spreadsheets and presentations created using them. Sure, just don't tack them on as appendages to the one big repository. There is another repository better suited for offline content. It is called a file server. Better yet, use a web-enabled version control &lt;a title="system" href="http://en.wikipedia.org/wiki/Subversion_%28software%29" id="pfkg"&gt;system&lt;/a&gt;  backed by a file server. This gives us permalinks to the latest version of every document. Get them indexed by an &lt;a title="enterprise search product" href="http://mediaproducts.gartner.com/reprints/microsoft/vol6/article4/article4.html" id="eek1"&gt;enterprise search product&lt;/a&gt;. Oh, but our users aren't version control savvy. Come on. It takes fifteen minutes of training to understand update, add/edit, commit. After all, we all claim to be organisations of savvy knowledge workers, don't we?&lt;div class="blogger-post-footer"&gt;&lt;p style="text-align: right" align="right"&gt;&lt;a href="http://blog.sriramnarayan.com"&gt;blog home page&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21992362-5357025096359353057?l=blog.sriramnarayan.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/XploringAround/~4/RKoAQ8Bc0XY" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://blog.sriramnarayan.com/2009/04/knowledge-management-fallacies-import.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/21992362/posts/default/5357025096359353057?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/21992362/posts/default/5357025096359353057?v=2" /><link rel="alternate" type="text/html" href="http://blog.sriramnarayan.com/2009/04/knowledge-management-fallacies-import.html" title="Knowledge Management Fallacies: make it easy to import and attach documents" /><author><name>Sriram</name><uri>http://www.blogger.com/profile/01237485664035584743</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://3.bp.blogspot.com/-JsADajCH9EA/TgsyKnD7laI/AAAAAAAAAMQ/JMyPrz3C4pM/s220/nov11visaphoto.JPG" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CUIESH46cCp7ImA9WxVaEUU.&quot;"><id>tag:blogger.com,1999:blog-21992362.post-2899493818724519279</id><published>2009-04-08T09:19:00.005+05:30</published><updated>2009-04-08T15:08:29.018+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-08T15:08:29.018+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="appengine" /><title>GWT and JDO on the Java App Engine</title><content type="html">I have been trying to build an application using GWT and JDO on the Java App Engine. This post captures some things I discovered along the way.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;GWT-JDO compatibility&lt;/i&gt;&lt;br /&gt;The JDO interface is provided by implementing extensions to &lt;a title="DataNucleus" href="http://www.datanucleus.org/" id="xwi7"&gt;DataNucleus&lt;/a&gt;. It provides a (not so seamless) wrapper around low level DataStore (BigTable) API. Before running the application, JDO annotated classes need to be bytecode-enhanced by the DataNucleus enhancer. (The appengine Eclipse plugin does this automatically). If you are writing a GWT app, then typically, these very JDO classes are also your GWT domain classes (myapp.client.DomainClass). So these classes need to be compatible with respect to gwt-compiler (e.g. Serializable) and data nucleus enhancer. An example of where this isn't obvious is in the choice of datatype for primary key. We can't simply use &lt;span class="pln"&gt;com&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;google&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;appengine&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;api&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;datastore&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="typ"&gt;Key&lt;/span&gt; because the gwt-compiler cannot serialize Key (seems this is now possible) and we don't have the source for Key. Instead, we use an encoded String form of Key.&lt;br /&gt;&lt;pre name="code" class="java:nogutter:nocontrols"&gt;&lt;br /&gt;@PersistenceCapable(identityType = IdentityType.APPLICATION)&lt;br /&gt;public class SomeDomainClass implements Serializable {&lt;br /&gt;@PrimaryKey&lt;br /&gt;@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)&lt;br /&gt;@Extension(vendorName = "datanucleus", key = "gae.encoded-pk", value = "true")&lt;br /&gt;String id;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;i&gt;User API integration with GWT&lt;/i&gt;&lt;br /&gt;The appengine user API lets us authenticate Google users. However com.google.appengine.api.users.User cannot be used as a GWT domain object. gwt-compiler would need its source code. I ended up creating another class myapp.client.User for this purpose. This is probably good anyway because it lets me add app specific behavior to my User.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Development environment&lt;/i&gt;&lt;br /&gt;GWT hosted mode gets going the quickest. Custom build file can be written to run local server mode. But neither of these are quite the same as deploying to the real appengine servers at appspot (or your domain). The local environment don't mimic all the characteristics of actual deployment. Post deployment testing is highly recommended for real apps. For purposes of unit testing, the datastore calls can be routed to an in-memory proxy. Also, Fred Sauer's &lt;a title="gwt-log" href="http://code.google.com/p/gwt-log/" id="l8qh"&gt;gwt-log&lt;/a&gt; is  quite handy.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;JDO Quirks&lt;/i&gt;&lt;br /&gt;Obviously there is no concept of joins. Mappings are also constrained. Pure one-to-one associations aren't supported. Instead, we have a form of composition that the appengine docs refer to as &lt;i&gt;owned&lt;/i&gt; one-to-one relationship (e.g. Employee's ContactInfo). I am begining to wonder if the JDO interface is actually a hinderance to thinking non-relationally. It might be better to use the low level datastore &lt;a href="http://code.google.com/appengine/docs/java/javadoc/com/google/appengine/api/datastore/package-summary.html"&gt;API&lt;/a&gt; directly.&lt;br /&gt;&lt;br /&gt;Overall, it has been fun. Java appengine seems quite promising. ThoughtWorks plug: Yes, we offer app dev and consulting &lt;a href="http://www.thoughtworks.com/what-we-do/cloud.html"&gt;services&lt;/a&gt; for all things cloudy.&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Coverage by fellow ThoughtWorkers:&lt;/p&gt; &lt;p&gt;&lt;a href="http://olabini.com/blog/2009/04/java-on-google-app-engine/"&gt;Ola Bini&lt;/a&gt;&lt;br /&gt;&lt;a href="http://paulhammant.com/blog/google-app-engine-for-java-with-rich-ruby-clients.html"&gt;Paul Hammant&lt;/a&gt;&lt;br /&gt;&lt;a href="http://elhumidor.blogspot.com/2009/04/clojure-on-google-appengine.html"&gt;John Hume&lt;/a&gt;&lt;br /&gt;&lt;a href="http://fragmental.tw/2009/04/08/clojure-on-google-app-engine/"&gt;Philip Calcado&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;p style="text-align: right" align="right"&gt;&lt;a href="http://blog.sriramnarayan.com"&gt;blog home page&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21992362-2899493818724519279?l=blog.sriramnarayan.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/XploringAround/~4/c2_Oyyj7ONQ" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://blog.sriramnarayan.com/2009/04/gwt-and-jdo-on-java-appengine.html#comment-form" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/21992362/posts/default/2899493818724519279?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/21992362/posts/default/2899493818724519279?v=2" /><link rel="alternate" type="text/html" href="http://blog.sriramnarayan.com/2009/04/gwt-and-jdo-on-java-appengine.html" title="GWT and JDO on the Java App Engine" /><author><name>Sriram</name><uri>http://www.blogger.com/profile/01237485664035584743</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://3.bp.blogspot.com/-JsADajCH9EA/TgsyKnD7laI/AAAAAAAAAMQ/JMyPrz3C4pM/s220/nov11visaphoto.JPG" /></author><thr:total>3</thr:total></entry><entry gd:etag="W/&quot;DkMFQ3g7fip7ImA9WxVbE0g.&quot;"><id>tag:blogger.com,1999:blog-21992362.post-1222966107978716716</id><published>2009-03-30T00:41:00.003+05:30</published><updated>2009-03-30T00:50:12.606+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-30T00:50:12.606+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SaaS" /><category scheme="http://www.blogger.com/atom/ns#" term="CloudCamp" /><title>SaaS is a distribution model, Cloud is a hosting model</title><content type="html">The series on fallacies of knowledge management will continue after this post.&lt;br /&gt;&lt;br /&gt;I attended the first CloudCamp in India at IIMB today. It was well organised and well attended. I had only planned to network and attend the talks but ended up onstage in true unconference style.  Dr. Srinivas P was kind enough to invite me to a panel discussion on certain aspects of cloud computing. While the panel discussions were mostly illuminating, I noticed some mixing of terminology around SaaS. This post is meant to highlight that SaaS is a &lt;span style="font-style: italic;"&gt;distribution model&lt;/span&gt; for software and is independent of the &lt;span style="font-style: italic;"&gt;hosting model &lt;/span&gt;(severs under a table, private data center, Google AppEngine, Amazon etc).&lt;br /&gt;&lt;br /&gt;Yeah, one could argue that the appengine is more than a pure hosting model but that is not material to this post. It was agreed during the course of the sessions that Amazon's offerings could be described as infrastructure-as-a-service (IaaS) and that of the Google App Engine as PaaS: platform-as-a-service (for lack of a better term).&lt;br /&gt;&lt;br /&gt;Now let's take the example of a business that sells tax-return filing software. If it chooses to sell the software by shipping CDs or offering installable downloads, then its distribution model may be termed as software-as-a-shrink-wrapped-product. On the other hand, if it chooses to host the software somewhere and let users connect to it for filling out their returns, then the distribution model is termed as software-as-a-service. Note that we haven't said anything so far about where the software is hosted in the second case. All we know is that the customer is not required to install it in her premises.  So, from the POV of a citizen filing returns, it is either shrink wrapped software or software-as-a-service. The end user doesn't care about whether the hosting is IaaS, PaaS or a private data center.&lt;br /&gt;&lt;br /&gt;If you really want to complete the circle, you could view IaaS and PaaS as an exteme form of SaaS, viz: system-software-as-a-service - since the cloud service providers basically offer the use of (dynamically scalable) virtual machines as a service to the application developer.&lt;div class="blogger-post-footer"&gt;&lt;p style="text-align: right" align="right"&gt;&lt;a href="http://blog.sriramnarayan.com"&gt;blog home page&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21992362-1222966107978716716?l=blog.sriramnarayan.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/XploringAround/~4/VSC8peT8UhA" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://blog.sriramnarayan.com/2009/03/saas-is-distribution-model-cloud-is.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/21992362/posts/default/1222966107978716716?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/21992362/posts/default/1222966107978716716?v=2" /><link rel="alternate" type="text/html" href="http://blog.sriramnarayan.com/2009/03/saas-is-distribution-model-cloud-is.html" title="SaaS is a distribution model, Cloud is a hosting model" /><author><name>Sriram</name><uri>http://www.blogger.com/profile/01237485664035584743</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://3.bp.blogspot.com/-JsADajCH9EA/TgsyKnD7laI/AAAAAAAAAMQ/JMyPrz3C4pM/s220/nov11visaphoto.JPG" /></author><thr:total>0</thr:total></entry></feed>

