<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Planet TW</title>
	<link>http://blogs.thoughtworks.com/</link>
	<language>en</language>
	<description>Planet TW - http://blogs.thoughtworks.com/</description>

<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/PlanetTw" type="application/rss+xml" /><feedburner:browserFriendly>This is an XML content feed. It is intended to be viewed in a newsreader or syndicated to another site.</feedburner:browserFriendly><item>
	<title>Sam Newman: Currently experiencing the guilty pleasure that is watching The Waterboy. No, it isn’t Punch...</title>
	<guid isPermaLink="false">http://blog.magpiebrain.com/post/136022704</guid>
	<link>http://feedproxy.google.com/~r/PlanetTw/~3/5YMe3u3he9g/136022704</link>
	<description>Currently experiencing the guilty pleasure that is watching The Waterboy. No, it isn’t Punch Drunk Love but Kathy Bates rocks&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Magpiebrain?a=Sd0QffQYb7M:AB7oMZaCMww:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Magpiebrain?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Magpiebrain?a=Sd0QffQYb7M:AB7oMZaCMww:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Magpiebrain?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Magpiebrain?a=Sd0QffQYb7M:AB7oMZaCMww:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Magpiebrain?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
	<pubDate>Sun, 05 Jul 2009 21:46:37 +0000</pubDate>
<feedburner:origLink>http://feedproxy.google.com/~r/Magpiebrain/~3/Sd0QffQYb7M/136022704</feedburner:origLink></item>
<item>
	<title>Sam Newman: Given the leading topic, one suspects we may be seeing the end of the trending topics. Crowd...</title>
	<guid isPermaLink="false">http://blog.magpiebrain.com/post/136022702</guid>
	<link>http://feedproxy.google.com/~r/PlanetTw/~3/TJfQXobT-5g/136022702</link>
	<description>Given the leading topic, one suspects we may be seeing the end of the trending topics. Crowd sourcing only works when crowds are smart.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Magpiebrain?a=7D5O638mkJs:CzsykjtOnBU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Magpiebrain?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Magpiebrain?a=7D5O638mkJs:CzsykjtOnBU:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Magpiebrain?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Magpiebrain?a=7D5O638mkJs:CzsykjtOnBU:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Magpiebrain?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
	<pubDate>Sun, 05 Jul 2009 21:46:37 +0000</pubDate>
<feedburner:origLink>http://feedproxy.google.com/~r/Magpiebrain/~3/7D5O638mkJs/136022702</feedburner:origLink></item>
<item>
	<title>Sam Newman: I’m officially in love with the shutter sound of the nikon fm3a. Now all I need are two more...</title>
	<guid isPermaLink="false">http://blog.magpiebrain.com/post/135990801</guid>
	<link>http://feedproxy.google.com/~r/PlanetTw/~3/hHBVA7EWPac/135990801</link>
	<description>I’m officially in love with the shutter sound of the nikon fm3a. Now all I need are two more fast primes…&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Magpiebrain?a=3jGoAlM6kJM:LGuHk4nz8Bo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Magpiebrain?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Magpiebrain?a=3jGoAlM6kJM:LGuHk4nz8Bo:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Magpiebrain?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Magpiebrain?a=3jGoAlM6kJM:LGuHk4nz8Bo:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Magpiebrain?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
	<pubDate>Sun, 05 Jul 2009 20:26:12 +0000</pubDate>
<feedburner:origLink>http://feedproxy.google.com/~r/Magpiebrain/~3/3jGoAlM6kJM/135990801</feedburner:origLink></item>
<item>
	<title>John Hume: AR⊗TA</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-23529072678094516.post-80789562878302939</guid>
	<link>http://feedproxy.google.com/~r/PlanetTw/~3/4D-cl71tZec/ar.html</link>
	<description>&lt;p&gt;If you haven't already, you should check out &lt;a href="http://exampler.com/"&gt;Brian Marick&lt;/a&gt;'s Agile reboot: &lt;a href="http://arxta.com/"&gt;Artisanal Retro-Futurism Crossed With Team Scale Anarcho-Syndicalism&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;There's a &lt;a href="http://arxta.com/video"&gt;video&lt;/a&gt; of his excellent presentation from Agile Roots if you don't feel like reading. There are also &lt;a href="http://arxta.com/gear"&gt;stickers you can ask for&lt;/a&gt; if you feel like spreading the word.&lt;/p&gt;

&lt;p&gt;It's totally tangential to the point, but my favorite quote from the video is near the end of the questions: "...in my observation agile teams care more about delivering business value, often, than the business they're delivering it to."&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img src="https://blogger.googleusercontent.com/tracker/23529072678094516-80789562878302939?l=elhumidor.blogspot.com" height="1" width="1"&gt;&lt;/img&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ElHumidor/~4/4D-cl71tZec" height="1" width="1"&gt;&lt;/img&gt;</description>
	<pubDate>Sun, 05 Jul 2009 17:33:33 +0000</pubDate>
	<author>noreply@blogger.com (John Hume)</author>
<feedburner:origLink>http://elhumidor.blogspot.com/2009/07/ar.html</feedburner:origLink></item>
<item>
	<title>Felix Leipold: Seaside Event at the London Office this Monday</title>
	<guid isPermaLink="false">http://wuetender-junger-mann.de/wordpress/?p=785</guid>
	<link>http://feedproxy.google.com/~r/PlanetTw/~3/V4Z55l961_8/</link>
	<description>&lt;p&gt;
If you are in London this Monday don’t miss out on our &lt;a href="http://seaside.st"&gt;Seaside&lt;/a&gt; themed &lt;a href="http://upcoming.yahoo.com/event/2803671/"&gt;GeekNight&lt;/a&gt; at 7pm. 
&lt;/p&gt;
&lt;p&gt;
Seaside is a truly revolutionary web framework implemented in smalltalk. We have Lukas Renggli representing the small but rapidly growing seaside and smalltalk open source community as well as Michel Bany of Cincom talking about his commercial experience with Seaside and Smalltalk.
&lt;/p&gt;
&lt;p&gt;
It’s at the &lt;a href="http://maps.google.co.uk/maps?f=q&amp;amp;hl=en&amp;amp;q=ThoughtWorks+Ltd.+9th+Floor+Berkshire+House,+168-173+High+Holborn,+London,+WC1V+7AA&amp;amp;layer=&amp;amp;ie=UTF8&amp;amp;z=17&amp;amp;om=1&amp;amp;iwloc=A"&gt;ThoughtWorks London office&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
For more information about seaside and smalltalk have a look at the links in my &lt;a href="http://wuetender-junger-mann.de/wordpress/?p=744"&gt;earlier post&lt;/a&gt;.&lt;/p&gt;</description>
	<pubDate>Sun, 05 Jul 2009 15:52:53 +0000</pubDate>
<feedburner:origLink>http://wuetender-junger-mann.de/wordpress/?p=785</feedburner:origLink></item>
<item>
	<title>Mark Needham: Brownfield Application Development in .NET: Book Review</title>
	<guid isPermaLink="false">http://www.markhneedham.com/blog/?p=1414</guid>
	<link>http://feedproxy.google.com/~r/PlanetTw/~3/j_hhn8UqSg0/</link>
	<description>&lt;h3&gt;The Book&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://manning.com/baley/"&gt;Brownfield Application Development in .NET&lt;/a&gt; by Kyle Baley and Donald Belcham&lt;/p&gt;
&lt;h3&gt;The Review&lt;/h3&gt;
&lt;p&gt;I asked to be sent this book to review by Manning as I was quite intrigued to see how well it would complement Michael Feather's &lt;a href="http://www.amazon.co.uk/Working-Effectively-Legacy-Robert-Martin/dp/0131177052/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1246755805&amp;amp;sr=8-1"&gt;Working Effectively with Legacy Code&lt;/a&gt;, the other book I'm aware of which covers approaches to dealing with non green field applications.&lt;/p&gt;
&lt;h4&gt;What did I learn?&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;The authors provide a brief description of the two different approaches to unit testing - state based and behaviour based - I'm currently in favour of the latter approach and &lt;a href="http://martinfowler.com/articles/mocksArentStubs.html"&gt;Martin Fowler has a well known article&lt;/a&gt; which covers pretty much anything you'd want to know about this topic area. &lt;/li&gt;
&lt;li&gt;I really like the section of the book which talks about 'Zero Defect Count', whereby the &lt;strong&gt;highest priority should be to fix any defects&lt;/strong&gt; that are found in work done previously rather than racing ahead onto the next new piece of functionality:&lt;br&gt;&lt;/br&gt;
&lt;blockquote&gt;&lt;p&gt;
Developers are geared towards driving to work on, and complete, new features and tasks. The result is that defect resolution subconsciously takes a back seat in a developer’s mind. &lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;I think this is quite difficult to achieve when the team is getting pressure to complete new features but then again it will take longer to fix defects if we leave them until later since we need to regain the context around them which is more fresh in our mind the earlier we fix them.
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;Another cool idea is that of &lt;strong&gt;time boxing efforts at fixing technical debt&lt;/strong&gt; in the code base - that way we spend a certain amount of time fixing one area and when the time's up we stop. I think this will work well as an approach as often when trying to fix code we can either get into the mindset of not fixing anything at all because it will take too long to do so or ending up &lt;a href="http://sethgodin.typepad.com/seths_blog/2005/03/dont_shave_that.html"&gt;shaving the yak&lt;/a&gt; in an attempt to fix a particularly problematic area of code.&lt;/li&gt;
&lt;li&gt;I like the definition of abstraction that the authors give:&lt;br&gt;&lt;/br&gt;
&lt;blockquote&gt;&lt;p&gt;
From the perspective of object- oriented programming, it is the method in which we simplify a complex “thing”, like an object, a set of objects, or a set of services.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;I often end up over complicating code in an attempt to create 'abstractions' but by this definition I'm not really abstracting since I'm not simplifying but complicating! This seems like a useful definition to keep in mind when looking to make changes to code.
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;Maintainability of code is something which is seriously undervalued - I think it's very important to write your code in &lt;a href="http://www.markhneedham.com/blog/2009/03/18/coding-make-it-obvious/"&gt;such a way that the next person who works with it can actually understand what's going on&lt;/a&gt;. The authors have a fantastic quote from Perl Best Practices:&lt;br&gt;&lt;/br&gt;
&lt;blockquote&gt;&lt;p&gt;
Always code as if the guy who ends up maintaining your code is a violent psychopath who knows where you live.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Writing code that is easy for the next person to understand is much harder than I would expect it to be although on teams which pair programmed frequently I've found the code easier to understand. I recently read a blog post by Jaibeer Malik where he claims that it is &lt;a href="http://jaibeermalik.wordpress.com/2009/04/12/code-quality-learn-measure-and-organize-awareness/"&gt;harder to read code than to write code&lt;/a&gt; which I think is certainly true in some cases.
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;There is a discussion of some of the design patterns and &lt;a href="http://www.markhneedham.com/blog/2008/08/16/naming-the-patterns-we-use-in-code/"&gt;whether or not we should explicitly call out their use in our code&lt;/a&gt;, the suggestion being that we should only do so if it makes our intent clearer. &lt;/li&gt;
&lt;li&gt;While describing out how to refactor some code to loosen its dependencies it's pointed out that &lt;strong&gt;when the responsibilities of a class are a bit fuzzy the name of the class will probably be quite fuzzy too&lt;/strong&gt; - it seems like this would server as quite a useful indicator for refactoring code to the &lt;a href="http://www.objectmentor.com/resources/articles/srp.pdf"&gt;single responsibility principle&lt;/a&gt;. The authors also suggest trying not to append the suffix 'Service' to classes since it tends to be a very overloaded term and a lot of the time doesn't add much value to our code.&lt;/li&gt;
&lt;li&gt;It is constantly pointed out how important it is to do refactoring in small steps so that we don't break the rest of our code and to allow us to get rapid feedback on whether the refactoring is actually working or not. This is something that we've &lt;a href="http://www.markhneedham.com/blog/2009/05/15/coding-dojo-14-rock-scissors-paper-tdd-as-if-you-meant-it/"&gt;practiced in coding dojos&lt;/a&gt; and Kent mentions it as being &lt;a href="http://www.infoq.com/presentations/responsive-design"&gt;one of his tools when dealing with code&lt;/a&gt; - I've certainly found that the overall time is much less when doing small step refactorings than trying to do everything in one go.
&lt;p&gt;I'm quite interested in trying out an idea called '&lt;a href="http://manicprogrammer.com/cs/blogs/heynemann/archive/2008/11/13/bowling-scorecards-great-agile-practice.aspx"&gt;Bowling Scorecards&lt;/a&gt;' which my former colleague Bernardo Heynemann wrote about - the idea to have a card which has a certain number of squares, each square reprsenting a task that needs to be done. These are then crossed off as members of the team do them.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;An interesting point which is made when talking about how to refactor data access code is to try and make sure that we are &lt;strong&gt;getting all the data from a single entry point&lt;/strong&gt; - this is something which I noticed on a recent project where we were cluttering the controller with two calls to different repositories to retrieve some data when it probably could have been encapsulated into a single call.&lt;/li&gt;
&lt;li&gt;Although they are talking specifically about &lt;strong&gt;poor encapsulation&lt;/strong&gt; in data access layers, I think the following section about this applies to anywhere in our code base where we expose the inner workings of classes by failing to encapsulate properly:&lt;br&gt;&lt;/br&gt;
&lt;blockquote&gt;&lt;p&gt;
Poor encapsulation will lead to the code changes requiring what is known as the Shotgun Effect. Instead of being able to make one change, the code will require you to make changes in a number of scattered places, similar to how the pellets of a shotgun hit a target. The cost of performing this type of change quickly becomes prohibitive and you will see developers pushing to not have to make changes where this will occur.
&lt;/p&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;The creation of an &lt;a href="http://ibuilthiscage.com/2008/09/21/anatomy-of-an-anti-corruption-layer-part-1/"&gt;anti corruption layer&lt;/a&gt; to shield us from 3rd party dependency changes is suggested and I think this is absolutely vital otherwise whenever there is a change in the 3rd party code our code breaks all over the place. The authors also adeptly point out:&lt;br&gt;&lt;/br&gt;
&lt;blockquote&gt;&lt;p&gt;
The reality is that when you rely on another company's web service, you are ultimately at their mercy. It's the nature of third-party dependencies. You don't have control over them.
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Even if we do recognise that we are &lt;a href="http://www.markhneedham.com/blog/2009/07/04/domain-driven-design-conformist/"&gt;completely reliant on a 3rd party service for our model&lt;/a&gt; I think there is still a need for an anti corruption layer even if it is very thin to protect us from changes.&lt;/p&gt;
&lt;p&gt;The authors also describe run time and compile time 3rd party dependencies - I think it's &lt;strong&gt;preferable if we can have compile time dependencies since this gives us much quicker feedback&lt;/strong&gt; and this is an approach we used on a recent project I worked on by making use of generated classes to interact with a SOAP service rather than using WCF message attributes which only provided us feedback at runtime.
&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;h3&gt;In Summary&lt;/h3&gt;
&lt;p&gt;This book starts off with the very basics of any software development project covering things such as version control, continuous integration servers, automated testing and so on but it gets into some quite interesting areas later on which I think are applicable to any project and not necessarily just 'brownfield' ones.&lt;/p&gt;
&lt;p&gt;There is a lot of useful advice about making use of abstractions to protect the code against change both from internal and external dependencies and I particularly like the fact that the are code examples showing the progression of the code through each of the refactoring ideas suggested by the authors.&lt;/p&gt;
&lt;p&gt;Definitely worth reading although if you've been working on any type of agile projects then you're probably better off skim reading the first half of the book but paying more attention to the second half.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/MarkNeedham/~4/sV2pyHqCdTU" height="1" width="1"&gt;&lt;/img&gt;</description>
	<pubDate>Sun, 05 Jul 2009 14:43:40 +0000</pubDate>
<feedburner:origLink>http://feedproxy.google.com/~r/MarkNeedham/~3/sV2pyHqCdTU/</feedburner:origLink></item>
<item>
	<title>Sumeet Moghe: The Agile Elearning Design Manual - Of Project Spaces &amp; Project Project Managers</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-8396317.post-6832279279532169235</guid>
	<link>http://feedproxy.google.com/~r/PlanetTw/~3/UlPT7oHBobs/agile-elearning-design-manual-of.html</link>
	<description>&lt;a href="http://files.getdropbox.com/u/478762/People.001.png"&gt;&lt;img src="http://files.getdropbox.com/u/478762/People.001.png" alt="" border="0" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 565px; height: 423px;"&gt;&lt;/img&gt;&lt;/a&gt;Whether you're part of a consultancy or an in-house training outfit, you're providing a service to a customer your people should matter a great deal to you. A few years back, I read &lt;a href="http://www.guykawasaki.com/"&gt;Guy Kawasaki&lt;/a&gt;'s &lt;a href="http://www.amazon.com/Art-Start-Time-Tested-Battle-Hardened-Starting/dp/1591840562"&gt;Art of the Start&lt;/a&gt; and Guy insists that product manufacturers and service providers should niche themselves. He explains the thought using a graph like the one you see above. We measure a product/ service by the &lt;strong&gt;value it provides to the customer&lt;/strong&gt; and its &lt;strong&gt;uniqueness&lt;/strong&gt;. A highly valuable but non-unique service competes only on price, because there are others providing it too. You're perhaps stupid if you provide a unique service and no one wants it. You're perhaps a dotcom if you're providing a non-unique service which no one wants. All this said, there's no arguing that your position is most enviable if you provide a service that's unique and highly valuable to the customer. As internal or market service providers, tools and methodologies don't make us unique, because others are only a step away from adopting them. What makes us unique are the people that deliver it.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;A few years back, &lt;a href="http://www.martinfowler.com/"&gt;Martin Fowler&lt;/a&gt; our chief scientist wrote that People Matter Most in software development and one of the reasons he joined &lt;a href="http://www.thoughtworks.com/"&gt;ThoughtWorks&lt;/a&gt; was because he saw ThoughtWorks as Roy - our founder's &lt;a href="http://martinfowler.com/bliki/RoysSocialExperiment.html"&gt;social experiment&lt;/a&gt;. In many ways, as a software delivery and technology consulting firm, what makes ThoughtWorks unique is the outstanding ability of ThoughtWorkers. Its a place I'm quite proud and privileged to be part of. As I've mentioned earlier, &lt;a href="http://cipher-quaker.blogspot.com/2009/06/agile-elearning-design-manual-agile-re.html"&gt;elearning development has got extremely commoditized and should really not be very different from software development&lt;/a&gt;. Its really important then, that we give &lt;a href="http://martinfowler.com/bliki/PeopleMatterMost.html"&gt;people&lt;/a&gt; as much importance in elearning development as we do in software development.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Whether you run an elearning consultancy or are a training manager or a team member on an elearning development team, its important to think of how to empower people on your team. How much is your organization maximizing their ability? A lot of what I'm about to suggest in this article isn't necessarily a trivial change. Having said that, if you find value in implementing any of the suggestions I'm making, you may need to plan this change and transformation for the benefit of your team.&lt;br&gt;&lt;/br&gt;&lt;h3&gt;Growing Versatilists on the team&lt;/h3&gt;&lt;a href="http://files.getdropbox.com/u/478762/People.002.png"&gt;&lt;img src="http://files.getdropbox.com/u/478762/People.002.png" alt="" border="0" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 565px; height: 227px;"&gt;&lt;/img&gt;&lt;/a&gt;We saw in an earlier post, how there's very little overlap between the skills of different people on a traditional elearning team. I've revisited the current state of the skill map on most elearning teams I've seen in the recent past and right alongside, is what I think should be the minimum overlap of skills in the team. A Instructional writer/ designer should be able to do some testing and some building work; a builder should be able to do some writing, some testing and some graphics work and a graphic artist should understand the basics of building. Of course, any &lt;a href="http://cipher-quaker.blogspot.com/2009/04/why-your-training-team-needs.html"&gt;versatility beyond this helps&lt;/a&gt;. I'm a big advocate of &lt;a href="http://cipher-quaker.blogspot.com/2009/04/from-training-specialist-to-learning.html"&gt;Learning Generalists as against Specialists&lt;/a&gt;, so the more skilled a professional, the higher they rate in my book.&lt;br&gt;&lt;/br&gt;&lt;h3&gt;How environment affects versatility&lt;/h3&gt;&lt;a href="http://files.getdropbox.com/u/478762/People.003.png"&gt;&lt;img src="http://files.getdropbox.com/u/478762/People.003.png" alt="" border="0" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 565px; height: 408px;"&gt;&lt;/img&gt;&lt;/a&gt;The above floor layout will create a sense of deja-vu for those who've been in my position. This is a floor layout I observed first hand, four months back at an elearning firm. The seats I've pointed out are those of people on the same project. The graphic artist being a freelancer, doesn't even work on the same floor. I find it funny to think that people communicate using documents to subvert this kind of a layout. I can understand the limitations of forced distribution, but really that isn't even the case with most elearning teams. Its not hard to imagine why a lot of people stay specialists in just one trade. Its not surprising either, to understand why there are so many silos in some elearning outfits!&lt;br&gt;&lt;/br&gt;&lt;h4&gt;The waste of documentation inventory&lt;/h4&gt;&lt;a href="http://files.getdropbox.com/u/478762/People.004.png"&gt;&lt;img src="http://files.getdropbox.com/u/478762/People.004.png" alt="" border="0" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 565px; height: 423px;"&gt;&lt;/img&gt;&lt;/a&gt;The above picture represents the typical flow of work across silos. Notice the amount of documentation that gets created in this process. The learning consultant has a "consultanty" conversation with the customer to determine the "Instruction Strategy". This goes into a document that gets passed a few desks across to the Instructional Designer. The designer spends the next few weeks writing out a script, filling out matrices and creating more documentation to pass on to the builder. The builder on the other hand passes on graphics descriptions in a document to the graphic artist. The graphic artist sends out images based on his understanding of the document and if we're lucky then the back and forth isn't very long. The builder then passes on the completed module to a tester and the tester sends back documents with bug descriptions to the builder. If we're lucky then this back and forth isn't very long. All this is usually governed by a set of technical specifications documented by the Technical Consultant who sits nowhere near anyone doing this work!&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Now I'm not trying to say that documentation is bad! What I'm trying to say is that documentation as a substitute for face to face communication is not ideal and is really a waste. The biggest waste in this process is the elearning script. Why do we need to write a script for 200 screens of elearning, when:&lt;ul&gt;&lt;li&gt; all that the builder can build in a day is say, 15 screens;&lt;/li&gt;&lt;li&gt; we should be showing the client training for the highest priority actions first; &lt;/li&gt;&lt;li&gt; we can simply explain most of these screens through face to face conversation;&lt;/li&gt;&lt;li&gt; an initial showcase of our work could render all of the scripting useless!&lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;Simplify your work environment&lt;/h4&gt;&lt;a href="http://files.getdropbox.com/u/478762/People.005.png"&gt;&lt;img src="http://files.getdropbox.com/u/478762/People.005.png" alt="" border="0" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 565px; height: 365px;"&gt;&lt;/img&gt;&lt;/a&gt;A small, yet highly political change of the workplace can hugely simplify this approach. What if everyone sat on one table with no cubicles? People can choose seating that was convenient for the day -- depending on who they need to collaborate with. We can shout out ideas across the table since we're all within earshot. All of a sudden writing documents doesn't even seem like an option. Its so much easier to talk to the other person. Yes I understand that "Learning Consultants" and "Technical Consultants" can't always sit at the table because they have their fingers in many different projects. Its important to think of whether you need these roles in the first place. Given that your overall design is simple and modular, most projects can do without these overheads. If you do need someone like them though, they should be obliged to spend some time on a regular basis with each team.&lt;br&gt;&lt;/br&gt;&lt;h3&gt;De-managing your project - think "Collective Ownership"&lt;/h3&gt; I strongly believe that every group initiative needs a leader. I'm not so sure about layered management though. Its interesting to see how you can put a bunch of smart people together and see how they take charge of a situation once you allow them to self organize. This is a huge paradigm shift from the command and control structure that I've seen in some elearning outfits, but then I'm fast seeing other outfits that believe more in collaboration than coordination. There are a few management questions I still need to answer, so let me try my hand. &lt;h4&gt;Managing Scheduling&lt;/h4&gt;Now if you noticed the project manager was doing a lot of scheduling work to get the right person to work on the project at the right time. This is no easy task -- almost equivalent to mastering the space and time continuum! Often, there's either a person waiting for work or work waiting for a person. This idle time is a waste in the process. A simple design up front, colocated-team-on-a-table approach takes away the scheduling overhead from the project manager, because every person downstream in the process pulls work from the person upstream. Which is to say:&lt;ul&gt;&lt;li&gt;We keep design simple, by using an action mapping approach;&lt;/li&gt;&lt;li&gt;We ask the customer to prioritize actions based on their perception of business value;&lt;/li&gt;&lt;li&gt; We (builders and designers) storyboard the most important action and activities first;&lt;/li&gt;&lt;li&gt; The builder and designer work to build the first activity together; &lt;/li&gt;&lt;li&gt; The graphic artist builds the visuals in collaboration with the builder; &lt;/li&gt;&lt;li&gt; The tester tests the first set of screens; &lt;/li&gt;&lt;li&gt; The customer looks through this set and signs off; &lt;/li&gt;&lt;li&gt; In the mean time, the process has already started another cycle with another activity&lt;/li&gt;&lt;/ul&gt; &lt;h4&gt;Try a Card Wall&lt;/h4&gt;&lt;a href="http://files.getdropbox.com/u/478762/CardWall.002.png"&gt;&lt;img src="http://files.getdropbox.com/u/478762/CardWall.002.png" alt="" border="0" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 565px; height: 331px;"&gt;&lt;/img&gt;&lt;/a&gt;The traditional project manager, who would be obsessed with a project plan can now create collective ownership in the team by using a &lt;a href="http://www.agileadvice.com/archives/2005/05/index_cards_as.html"&gt;Card Wall&lt;/a&gt;. A card wall is a simple visual representation of the work in progress for the current iteration. Depending on the different stages of work that each card goes through, you can construct the wall by making swim lanes for each stage. The progress of an individual card is indicated by its place on card. With a card wall, its quite easy to see where your bottlenecks are. For example, if you see a lot of cards in the "Waiting for Testing" lane, then it means that your testers perhaps need help in clearing out activities/screens waiting for testing.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;a href="http://files.getdropbox.com/u/478762/People.007.png"&gt;&lt;img src="http://files.getdropbox.com/u/478762/People.007.png" alt="" border="0" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 565px; height: 223px;"&gt;&lt;/img&gt;&lt;/a&gt;On Agile teams, each morning the team meets for 15 minutes for a &lt;a href="http://en.wikipedia.org/wiki/Stand-up_meeting"&gt;standup&lt;/a&gt;, describing what they did the previous day, what they're doing today and their blockers. This discussion happens in front of the card wall, so that issues can be pointed out in correlation to the work in progress. This empowers the team to find solutions to their own problems and generally creates a great problem solving culture in the team. With a colocated SME/ customer you can avoid creating reports as well (if they don't mind). The card wall is a snapshot of the work in progress for the team. If you need more convincing, read &lt;a href="http://jasonfurnell.wordpress.com/2009/01/07/our-tradingpost-card-wall-why-agile-rocks/"&gt;this post&lt;/a&gt; to see how such a lightweight tool makes a huge difference.Now I fully agree that this is difficult for a distributed team. I strongly recommend the use of a collaborative project management tool such as &lt;a href="http://studios.thoughtworks.com/mingle-agile-project-management"&gt;Mingle&lt;/a&gt;, to facilitate this kind of a process. I'll try to address that in a future post.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;So, if the team is empowered to pick up work on their own, manage their workflow and solve their problems, what need do we have for a project manager? Here's where I feel the project manager could play a project leader. I've written earlier about what I believe to be &lt;a href="http://cipher-quaker.blogspot.com/2009/03/my-tenets-of-leadership.html"&gt;the tenets of leadership&lt;/a&gt;. The project manager/ leader's time should get spent in coaching, mentoring, absorbing external pressures and providing help and guidance in removing team blockers. In time, the project manager builds these essential leadership skills and by helping to remove blockers for the team, can possibly emerge as the team's ultimate generalist.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;hr&gt;&lt;/hr&gt;How did you like this post? Please feel free to &lt;a href="mailto:sumeet.moghe@gmail.com"&gt;let me know&lt;/a&gt;. If you liked this post, you may just like some of these other, related posts:&lt;br&gt;&lt;/br&gt;&lt;a href="http://feedproxy.google.com/~r/blogspot/sawZ/~3/eJL8jBR_Wbs/blog-post.html"&gt;The Agile Elearning Design Manual - Problems with existing Approaches&lt;/a&gt;&lt;br&gt;&lt;/br&gt;&lt;a href="http://feedproxy.google.com/~r/blogspot/sawZ/~3/jOsBOUvDITs/agile-elearning-design-manual-agile-re.html"&gt;The Agile Elearning Design Manual - Agile Re-explained&lt;/a&gt;&lt;br&gt;&lt;/br&gt;&lt;a href="http://cipher-quaker.blogspot.com/2009/06/agile-elearning-design-manual-think.html"&gt;The Agile Elearning Design Manual - Think Small (Iterations, Action Maps, Storyboards, and Mini-Modules&lt;/a&gt;&lt;br&gt;&lt;/br&gt;&lt;a href="http://cipher-quaker.blogspot.com/2009/06/agile-elearning-design-manual.html"&gt;The Agile Elearning Design Manual - Iterations huh?&lt;/a&gt;&lt;br&gt;&lt;/br&gt;&lt;a href="http://cipher-quaker.blogspot.com/2009/03/my-tenets-of-leadership.html"&gt;My Tenets of Leadership&lt;/a&gt;&lt;br&gt;&lt;/br&gt;&lt;a href="http://cipher-quaker.blogspot.com/2009/04/from-training-specialist-to-learning.html"&gt;From Training Specialist to Learning Generalist&lt;/a&gt;&lt;br&gt;&lt;/br&gt;&lt;a href="http://cipher-quaker.blogspot.com/2009/04/why-your-training-team-needs.html"&gt;Why your Training Team needs Versatilists&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;© Sumeet Moghe, 2009&lt;img src="https://blogger.googleusercontent.com/tracker/8396317-6832279279532169235?l=cipher-quaker.blogspot.com" height="1" width="1"&gt;&lt;/img&gt;&lt;/div&gt;</description>
	<pubDate>Sun, 05 Jul 2009 14:32:34 +0000</pubDate>
	<author>noreply@blogger.com (Sumeet Moghe)</author>
<feedburner:origLink>http://feedproxy.google.com/~r/blogspot/sawZ/~3/hnInzylvAmQ/agile-elearning-design-manual-of.html</feedburner:origLink></item>
<item>
	<title>Luca Grulla: What has to be ready for the beginning of  a project ?</title>
	<guid isPermaLink="false">http://www.lucagrulla.it/blog/?p=231</guid>
	<link>http://feedproxy.google.com/~r/PlanetTw/~3/KUOw_dhsQZE/</link>
	<description>&lt;p&gt;The beginning of a project is always a hectic period where several things have to be put in place in order to be able to start the actual development from a solid position.&lt;/p&gt;
&lt;p&gt;Interestingly enough, I see that what is important to have ready for ThoughtWorkers most of the time is not what has to be ready for other people.&lt;/p&gt;
&lt;p&gt;Given that obviously every project is different and deserve specific attention, here is my list of things that has to be ready before the kick off of iteration 1.&lt;strong&gt; &lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Infrastructure&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A repository, a Continuos Integration Environment with &lt;a href="http://www.studios.thoughtworks.com/cruise-continuous-integration" target="_blank" title="Cruise"&gt;Cruise&lt;/a&gt; (or suitable alternatives) installed and working, a QA environment where we can deploy every successful build whenever we want, a basic build script (i.e. build/run tests/package). Pairing boxes, each one with exactly the same configuration.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Architecture&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Just identify  the core services/components, there’s no need to go into detail for each one at this time of the project. If we identify what is the main responsibility of a service is good enough for now, the details will be discovered later in the project. If we can easily identify the way services will communicate (web service ? message broker ?) good, if not through good OO principles we can abstract the low level mechanism and reduce the cost of change later, deferring the final decision to the point in the project where we have more understanding of the technological constraints.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Patterns&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Pairing and frequent pair rotation will help in spreading the knowledge of the approach to solve specific problems and in maintaining consistency throughout the code base, so most of the time there is no need of defining a sort of “project dictionary” of valid patterns at day 1.&lt;br&gt;&lt;/br&gt;
If we’re introducing new approaches to solve a specific problem, it’s important to highlight pros and cons of the approach so that people know what they are doing once pairing.&lt;/p&gt;
&lt;p&gt;Most of the time these are probably enough to start Iteration 1.&lt;/p&gt;
&lt;p&gt;All the other decisions can (and sometimes should…) be deferred to a later stage.&lt;/p&gt;</description>
	<pubDate>Sun, 05 Jul 2009 13:08:08 +0000</pubDate>
<feedburner:origLink>http://www.lucagrulla.it/blog/2009/07/05/what-has-to-be-ready-for-the-beginning-of-a-project/</feedburner:origLink></item>
<item>
	<title>Ye Zheng: 乐乐呵呵写程序</title>
	<guid isPermaLink="false">http://dreamhead.blogbus.com/logs/41931943.html</guid>
	<link>http://feedproxy.google.com/~r/PlanetTw/~3/XCcFE0OTazA/41931943.html</link>
	<description>&lt;p&gt;很多人把软件开发形容得太辛苦，为了解决一个问题，需要耗尽心力和体力，更有甚者，Ed Yourdon把软件开发说成了“死亡之旅”。&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;很多到我们公司参观的人，都会注意到，我们办公桌有着各种各样的小玩意，通常它们扮演的角色就是Standup中发言的Token。当然，我们互相打闹的时侯，它们就不幸成了“凶器”。我们办公室里面，另外比较显眼的东西就是墙上各种各样的照片，除了生日墙那些“入狱照”，剩下的基本都是大家偷拍或者搞怪的照片。&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;在ThoughtWorks，有一条不成文的规定，迟到的人要给项目组的其他人买冰淇淋。运气好的话，连续几天都有冰淇淋吃，在大夏天，这可是一件让人高兴的事。当然，另一方面，这也说明了，有人破坏了我们的纪律。冰淇淋纪律既让大家知道纪律的存在，也为我们的开发平添了几分乐趣。&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;我们的办公室里面，经常会有笑声，不用问，肯定是有人出了些搞笑的段子。有人无意间雷倒众生，也有人为大家制造着笑料。一些内部推手通过各种手段，很快把这些笑料爆出去，于是，这就成了全办公室尽人皆知的“秘密”。&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;有时侯，身为开发人员，我们偶尔会欺负一下“项目组中地位最低”的PM，他就要在工作时间跑出去为我们买一些零食，比如最近一段时间非常受欢迎的豆腐皮和花生米，以保证我们安安心心的写代码。赶上回顾会议，我们就更有理由一边吃着零食，一边“回顾”了。在我出去做咨询的时侯，甚至把这种风格带到了客户那边。&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Team Building在项目组里面永远是特别受欢迎的一项活动。吃饭、唱歌是最常见的活动，当然发掘新鲜的活动项目是一个永远没有止境的话题。最近一段时间经济不那么景气，不再像之前那样，公司能够为项目组提供的预算大幅度缩减了，但即便是大家AA，我们依然可以自得其乐。&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;软件开发本身已经有了一定困难，与其每天苦着脸，还不如“苦中作乐”，至少我们可以有一个良好的心情去面对那些困难的问题。&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;“高高兴兴上班，平平安安下班”，这是小时侯经常在一些工厂看到的宣传标语，人们的愿望其实很朴素。&lt;/p&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;div class="sysmsg"&gt;&lt;b&gt;&lt;a href="http://zhuanti.blogbus.com/kfc20/article/list" target="_blank"&gt;上海肯德基20年Say Yes-光阴的故事&lt;/a&gt;&lt;/b&gt;&lt;/div&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;</description>
	<pubDate>Sun, 05 Jul 2009 10:42:19 +0000</pubDate>
<feedburner:origLink>http://dreamhead.blogbus.com/logs/41931943.html</feedburner:origLink></item>
<item>
	<title>Manish Chakravarty: Confusion Confusion</title>
	<guid isPermaLink="false">http://manish-chaks.livejournal.com/101842.html</guid>
	<link>http://feedproxy.google.com/~r/PlanetTw/~3/5_sZxqtU3Bg/101842.html</link>
	<description>1. TW me paisa kam par nice profile and I love the job&lt;br&gt;&lt;/br&gt;2. Nokia me paisa zyaada, international exposure but QA profile.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Which one should I choose? &lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;I am confused about my career for the first time in life.. any inputs would be good.</description>
	<pubDate>Sun, 05 Jul 2009 05:40:40 +0000</pubDate>
<feedburner:origLink>http://manish-chaks.livejournal.com/101842.html</feedburner:origLink></item>
<item>
	<title>Jeff Xiong: AgileChina 2009: Pragmatic Agile</title>
	<guid isPermaLink="false">tag:gigix.thoughtworkers.org,2009-07-05:595</guid>
	<link>http://feedproxy.google.com/~r/PlanetTw/~3/tvus5BDrr-Y/agilechina-2009-pragmatic-agile</link>
	<description>&lt;p&gt;&lt;a href="http://www.agilechina.net/"&gt;AgileChina 2009大会官方网站&lt;/a&gt;&lt;/p&gt;


&lt;blockquote&gt;由在敏捷领域最具有影响力的技术社区InfoQ中文站、敏捷方法论的领导厂商 ThoughtWorks共同主办的敏捷中国技术大会（Agile China 2009），将于9月11日~12日（周五、周六）在北京举行。届时将有超过500人来自电信、金融、互联网、教育等行业在内的高级软件开发人员、项目管理人员等参加。本次大会将特别邀请敏捷宣言缔造者、敏捷编程（XP）方法学创始人Kent Beck，敏捷开发权威人士、敏捷宣言的创始人之一，Dave Thomas，敏捷宣言签署人之一Steve Freeman等国际敏捷领域专家，以及在团队中成功应用敏捷的阿尔卡特、赛门铁克、诺基亚-西门子、华为、腾讯等公司的项目负责人参与此次大会并分享他们的心得。

	&lt;p&gt;敏捷中国技术大会（Agile China 2009）是国内敏捷技术领域最高水平的大会，本次大会将由InfoQ中文站负责大会策划、营销和项目实施。InfoQ中文站在今年4月已成功举办了 QCon全球企业开发大会，邀请了国内外30多名讲师，超过550位架构师、技术总监、项目经理和高级工程师参加了本次大会，大会及其运营团队获得了空前的好评，并誉为国内“技术含量最高”的大会。而今年的敏捷中国技术大会，也将一改往年的风格，参会者以高端开发者和技术管理者为主，融合管理和工程实践，推广全面敏捷之路。&lt;/p&gt;&lt;/blockquote&gt;


	&lt;p&gt;会务咨询： 010 – 89880682 agilechina@cn.infoq.com&lt;/p&gt;


	&lt;p&gt;赞助咨询： 010 – 89880682 sponsor@cn.infoq.com&lt;/p&gt;</description>
	<pubDate>Sun, 05 Jul 2009 02:37:20 +0000</pubDate>
<feedburner:origLink>http://gigix.thoughtworkers.org/2009/7/5/agilechina-2009-pragmatic-agile</feedburner:origLink></item>
<item>
	<title>Danilo Sato: Velocity gone wrong #2: Making up points</title>
	<guid isPermaLink="false">http://www.dtsato.com/blog/?p=284</guid>
	<link>http://feedproxy.google.com/~r/PlanetTw/~3/KdZggr12yN8/</link>
	<description>&lt;p&gt;Continuing with the series on how to misuse velocity, the second anti-pattern I would like to highlight is when teams start making up points. Because the definition of velocity is so simple, it’s easy to game the metric to show what looks like apparent progress. If a team is being measured on velocity (more about this on later posts), it’s quite easy to just start increasing estimates: &lt;em&gt;“If we just double all estimates, the relative sizes stay the same, but our velocity doubles!&lt;/em&gt;“. This is an extreme behaviour that would be quickly noticed as a discrepancy, but the same thing could happen in a smaller scale and pass unnoticed.&lt;/p&gt;
&lt;p&gt;This problem can not only be originated from the team, but I’ve also seen Project Managers/Scrum Masters coming up with “clever” ways of making up points to count as velocity:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Counting percentage or half points (as mentioned in my &lt;a href="http://www.dtsato.com/blog/2009/07/03/velocity-gone-wrong-done-is-not-done/"&gt;previous post&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Deciding to split a story to count the partially finished work as complete, and track whatever is left in a separate story (&lt;strong&gt;splitting should be business-driven and not tracking-driven&lt;/strong&gt;: it should only happen when you come up with simpler/incremental ways of delivering value in smaller chunks)&lt;/li&gt;
&lt;li&gt;Counting points on technical tasks. I’ve seen a team that spent a lot of effort in an iteration to make up for accumulated technical debt, and did not have a lot of time to work on new stories. The Project Manager decided to come up with a “refactoring card” and gave it a 16 to try and demonstrate how much effort was spent on such refactoring&lt;/li&gt;
&lt;li&gt;Counting points for in-release bug fixing. In a team, stories were deemed completed on the first iteration, but bugs started to show up in later iterations, impacting he team’s ability to deliver new functionality. Instead of allowing the decrease in velocity to demonstrate how the lack of focus on quality was impacting the team (bugs should be prevented in the first place, right?), the Project Manager decided to estimate and count points on bugs, which kept velocity apparently constant, when in fact a lot less value was being delivered&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The next time you catch yourself asking &lt;em&gt;“Should X count as velocity?”&lt;/em&gt;, stop, reflect, and ask instead &lt;em&gt;“Should I worry about X happening at all?”&lt;/em&gt;. If you are worried about having to track or show progress on things that should be embedded parts of the process (such as activities to prevent bugs or refactoring), chances are that the problem lies somewhere else. Some of these questions might make as much sense as &lt;em&gt;“Should time spent on retrospectives count as velocity?” &lt;/em&gt;or &lt;em&gt;“Should going to the bathroom count as velocity?”&lt;/em&gt; :-)&lt;/p&gt;
&lt;p&gt;I’m sure that these examples drawn from my personal experience are just a few examples of how to make up points and misuse velocity. &lt;strong&gt;What other similar experiences did you have in your own projects?&lt;/strong&gt;&lt;/p&gt;</description>
	<pubDate>Sat, 04 Jul 2009 20:18:14 +0000</pubDate>
<feedburner:origLink>http://feedproxy.google.com/~r/dtsato/~3/w5X3QCARhSA/</feedburner:origLink></item>
<item>
	<title>Jason Yip: 3 imperfect strategies for system test data management</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-7807708.post-4099604097722577643</guid>
	<link>http://feedproxy.google.com/~r/PlanetTw/~3/3kHd3YQ9r9U/3-imperfect-strategies-for-system-test.html</link>
	<description>&lt;div&gt;&lt;ol&gt;&lt;li&gt;Automatic discovery of input data&lt;/li&gt;&lt;li&gt;Configurable input/output expectations and controlled data refreshes&lt;/li&gt;&lt;li&gt;Automated scripts to manipulate/insert data after each refresh&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img src="https://blogger.googleusercontent.com/tracker/7807708-4099604097722577643?l=jchyip.blogspot.com" height="1" width="1"&gt;&lt;/img&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/YoudThinkWithAllMy?a=4sZCTV-glFg:BFQKc5e9TH8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YoudThinkWithAllMy?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YoudThinkWithAllMy?a=4sZCTV-glFg:BFQKc5e9TH8:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YoudThinkWithAllMy?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YoudThinkWithAllMy?a=4sZCTV-glFg:BFQKc5e9TH8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YoudThinkWithAllMy?i=4sZCTV-glFg:BFQKc5e9TH8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/YoudThinkWithAllMy/~4/4sZCTV-glFg" height="1" width="1"&gt;&lt;/img&gt;</description>
	<pubDate>Sat, 04 Jul 2009 19:08:15 +0000</pubDate>
	<author>noreply@blogger.com (Jason Yip)</author>
<feedburner:origLink>http://feedproxy.google.com/~r/YoudThinkWithAllMy/~3/4sZCTV-glFg/3-imperfect-strategies-for-system-test.html</feedburner:origLink></item>
<item>
	<title>Jason Yip: Some thoughts on roles and hand-offs</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-7807708.post-3941029465517078323</guid>
	<link>http://feedproxy.google.com/~r/PlanetTw/~3/3ZJ4nVPxYi0/some-thoughts-on-roles-and-hand-offs.html</link>
	<description>Here's a typical role and hand-off sequence that I encounter in "waterfall" shops:&lt;br&gt;&lt;/br&gt;
&lt;br&gt;&lt;/br&gt;
&lt;b&gt;Customer -&amp;gt; Business Analyst -&amp;gt; Developer -&amp;gt; Tester&lt;/b&gt;&lt;br&gt;&lt;/br&gt;
&lt;br&gt;&lt;/br&gt;
And then they learn about Agile so the sequence changes to this:&lt;br&gt;&lt;/br&gt;
&lt;br&gt;&lt;/br&gt;
&lt;b&gt;Customer -&amp;gt; Business Analyst -&amp;gt; Tester -&amp;gt; Developer -&amp;gt; (Business Analyst + Tester)&lt;/b&gt;&lt;br&gt;&lt;/br&gt;
&lt;br&gt;&lt;/br&gt;
... which really misses the point.  We're not just re-ordering hand-offs, we actually want to remove them.&lt;br&gt;&lt;/br&gt;
&lt;br&gt;&lt;/br&gt;
What I'm looking for is a sequence that looks more like this:&lt;br&gt;&lt;/br&gt;
&lt;br&gt;&lt;/br&gt;
&lt;b&gt;(Customer + Business Analyst + Tester + Developer) -&amp;gt; (Tester  + Developer (referencing Business Analyst and Customer as useful)) -&amp;gt; (Customer + Business Analyst + Tester)&lt;/b&gt;&lt;br&gt;&lt;/br&gt;
&lt;br&gt;&lt;/br&gt;
If the Customer time is constrained,&lt;br&gt;&lt;/br&gt;
&lt;br&gt;&lt;/br&gt;
&lt;b&gt;Customer -&amp;gt; (Business Analyst + Tester + Developer) -&amp;gt; (Tester + Developer) -&amp;gt; (Business Analyst + Tester) -&amp;gt; Customer&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img src="https://blogger.googleusercontent.com/tracker/7807708-3941029465517078323?l=jchyip.blogspot.com" height="1" width="1"&gt;&lt;/img&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/YoudThinkWithAllMy?a=1DRLytbvuew:oml9CxToIQw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YoudThinkWithAllMy?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YoudThinkWithAllMy?a=1DRLytbvuew:oml9CxToIQw:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YoudThinkWithAllMy?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YoudThinkWithAllMy?a=1DRLytbvuew:oml9CxToIQw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YoudThinkWithAllMy?i=1DRLytbvuew:oml9CxToIQw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/YoudThinkWithAllMy/~4/1DRLytbvuew" height="1" width="1"&gt;&lt;/img&gt;</description>
	<pubDate>Sat, 04 Jul 2009 19:01:25 +0000</pubDate>
	<author>noreply@blogger.com (Jason Yip)</author>
<feedburner:origLink>http://feedproxy.google.com/~r/YoudThinkWithAllMy/~3/1DRLytbvuew/some-thoughts-on-roles-and-hand-offs.html</feedburner:origLink></item>
<item>
	<title>Sam Newman: Camera has arrived. eBay, thou art the wind beneath my wings.</title>
	<guid isPermaLink="false">http://blog.magpiebrain.com/post/135356536</guid>
	<link>http://feedproxy.google.com/~r/PlanetTw/~3/4w0JZtyD5R8/135356536</link>
	<description>Camera has arrived. eBay, thou art the wind beneath my wings.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Magpiebrain?a=bYl_K2o-v9k:iMQvhKPpyCI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Magpiebrain?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Magpiebrain?a=bYl_K2o-v9k:iMQvhKPpyCI:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Magpiebrain?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Magpiebrain?a=bYl_K2o-v9k:iMQvhKPpyCI:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Magpiebrain?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
	<pubDate>Sat, 04 Jul 2009 14:55:00 +0000</pubDate>
<feedburner:origLink>http://feedproxy.google.com/~r/Magpiebrain/~3/bYl_K2o-v9k/135356536</feedburner:origLink></item>
<item>
	<title>Simon Brunning: Links for 2009-07-03 [del.icio.us]</title>
	<guid isPermaLink="false">http://del.icio.us/brunns#2009-07-03</guid>
	<link>http://feedproxy.google.com/~r/PlanetTw/~3/7OWtDOHae9A/brunns</link>
	<description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.flickr.com/photos/meg/216773377/"&gt;Geisha&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
	<pubDate>Sat, 04 Jul 2009 07:00:00 +0000</pubDate>
<feedburner:origLink>http://feedproxy.google.com/~r/SmallValuesOfCool/~3/dYhV2gjGndk/brunns</feedburner:origLink></item>
<item>
	<title>Mark Needham: Domain Driven Design: Conformist</title>
	<guid isPermaLink="false">http://www.markhneedham.com/blog/?p=1404</guid>
	<link>http://feedproxy.google.com/~r/PlanetTw/~3/8fcCN7wY-VA/</link>
	<description>&lt;p&gt;Something which constantly surprises me about &lt;a href="http://domaindrivendesign.org/"&gt;Domain Driven Design&lt;/a&gt; is how there is a pattern described in the book for just about every possible situation you find yourself in when coding on projects.&lt;/p&gt;
&lt;p&gt;A lot of these patterns appear in the 'Strategic Design' section of the book and one which is very relevant for the project I'm currently working on is the 'Conformist' pattern which is described like so:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
When two development teams have an upstream/downstream relationship in which the upstream has no motivation to provide for the downstream team's needs, the downstream team is helpless. Altruism may motivate upstream developers to make promises, but they are unlikely to be fulfilled. Belief in those good intentions leads the downstream team to make plans based on features that will never be available. The downstream project will be delayed until the team ultimately learns to live with what it is given. An interface tailored to the needs of the downstream team is not in the cards.
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;We are working on the front end of an application which interacts with some services to get and save the data from the website.&lt;/p&gt;
&lt;p&gt;We realised that we had a situation similar to this originally but didn't know that it was the conformist pattern and our original approach was to rely completely on the model in the service layer to the extent that we were mapping directly from SOAP calls to WCF message objects and then passing these around the code - I originally described this as being an &lt;a href="http://www.markhneedham.com/blog/2008/12/28/internalexternal-domain-models/"&gt;externally defined domain model&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This led to quite a lot of pain as whenever there was a change in the service layer model our code base broke all over the place and we then ended up spending most of the day fire fighting - we were too tightly coupled to an external system.&lt;/p&gt;
&lt;p&gt;At this stage we were reading Domain Driven Design in our &lt;a href="http://www.markhneedham.com/blog/2009/01/25/learning-alone-or-learning-together/"&gt;Technical Book Club&lt;/a&gt; and I was fairly convinced that what we really needed to do was have our own model and create an anti corruption layer to translate between the service layer model and the new model that we would create.&lt;/p&gt;
&lt;p&gt;We changed our code to follow this approach and created &lt;a href="http://www.markhneedham.com/blog/2009/03/10/ddd-repository-not-only-for-databases/"&gt;repositories&lt;/a&gt; and mappers which were the main places in our code base where we cared about this external dependency and although the isolation of the end point has worked much better we never really ended up with a rich domain model that really represented the business domain.&lt;/p&gt;
&lt;p&gt;We had something in between the service layer model and the real business model which didn't really help anyone and meant we ended up spending a lot of time trying to translate between the different definitions that were floating around. &lt;/p&gt;
&lt;p&gt;Writing the code for the anti corruption layer also takes a lot of time, &lt;a href="http://www.markhneedham.com/blog/2009/04/02/tdd-testing-mapping-code/"&gt;is quite frustrating/tedious&lt;/a&gt; and it was hard to see the value we were getting from doing so.&lt;/p&gt;
&lt;p&gt;We've now reached the stage where we know this is the case and that it probably makes much more sense to just accept it and to not spend any more time trying to create our own model but instead just adapt what we have to more closely match the model we get from the services layer.&lt;/p&gt;
&lt;p&gt;We will still keep a thin mapping layer as this gives us some protection against changes that may happen in the service layer.&lt;/p&gt;
&lt;p&gt;I think a key thing for me here is that it's really easy &lt;a href="http://www.markhneedham.com/blog/2009/03/30/ddd-recognising-relationships-between-bounded-contexts/"&gt;to be in denial&lt;/a&gt; about what is actually happening since what you really want is to be in control of your own domain model and design it so that it closely matches the business so that they would be able to read and understand your code if they wanted to. Sometimes that isn't the case.&lt;/p&gt;
&lt;p&gt;Chatting with Dave about this he suggested that a lesson for us here is that it's important to &lt;strong&gt;know which pattern you are following&lt;/strong&gt; which &lt;a href="http://twitter.com/AndyPalmer/statuses/2434721277"&gt;Andy Palmer also pointed out on twitter&lt;/a&gt;.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/MarkNeedham/~4/uzyfou247Kk" height="1" width="1"&gt;&lt;/img&gt;</description>
	<pubDate>Sat, 04 Jul 2009 00:17:31 +0000</pubDate>
<feedburner:origLink>http://feedproxy.google.com/~r/MarkNeedham/~3/uzyfou247Kk/</feedburner:origLink></item>
<item>
	<title>Mark Needham: Coding Dojo #19: Groovy Traveling salesman variation</title>
	<guid isPermaLink="false">http://www.markhneedham.com/blog/?p=1401</guid>
	<link>http://feedproxy.google.com/~r/PlanetTw/~3/9hUmvqmoBOg/</link>
	<description>&lt;p&gt;Our latest coding dojo involved working on a variation of the &lt;a href="http://en.wikipedia.org/wiki/Travelling_salesman_problem"&gt;traveling salesman problem&lt;/a&gt; in Groovy again.&lt;/p&gt;
&lt;h3&gt;The Format&lt;/h3&gt;
&lt;p&gt;We had 8 people participating this week so we returned to the Randori format, rotating the pair at the keyboard every 7 minutes.&lt;/p&gt;
&lt;p&gt;Give the number of people it might have actually been better to have a couple of machines and use the &lt;a href="http://www.dtsato.com/blog/2008/10/29/uberdojo-sao-paulo-coding-dojo/"&gt;UberDojo format&lt;/a&gt;. &lt;/p&gt;
&lt;h3&gt;What We Learnt&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The importance of &lt;strong&gt;just getting started&lt;/strong&gt; stood out a lot for me in this dojo - there have been quite a few times when we've met intending to do some coding and spent so long talking about coding that we didn't end up writing anything. Luckily &lt;a href="http://twitter.com/davcamer"&gt;Dave&lt;/a&gt; took the lead in this dojo and got the ball rolling. The code we wrote originally wasn't perfect but it helped create the momentum to keep the session going so it was valuable in that way.&lt;/li&gt;
&lt;li&gt;Another interesting feature of dojos for me is that &lt;strong&gt;it really doesn't matter if you make mistakes&lt;/strong&gt; - if you write really terrible code in a dojo it's probably a good thing since you'll probably not go and repeat the same mistake on a real project. I learnt a lot about the perils of not refactoring early enough and having too much state in our code from our &lt;a href="http://www.markhneedham.com/blog/2009/02/12/coding-dojo-9-refactoring-isola/"&gt;Isola Dojo&lt;/a&gt; a few months ago.&lt;/li&gt;
&lt;li&gt;We &lt;strong&gt;refactored much earlier&lt;/strong&gt; than we normally do in this dojo and I think it worked really well for allowing us to progress later on. Often we fall into the trap of just chasing the green bar a bit too much and we forget to clean up the code after each cycle but we had that a bit better in this one.
&lt;p&gt;We also backed up a bit after around 3 cycles after realising that the code was becoming a bit horrific and spent 1 cycle working it into shape for the next one.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;We fell into the trap of going &lt;strong&gt;several cycles with broken tests&lt;/strong&gt; while trying to do some redesign on the code - the steps were clearly not small enough!
&lt;p&gt;Later on we corrected this when refactoring the code into a more functional style by taking very small steps and running the tests after each small change - this was a far more effective approach.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;Although we were working in a dynamic language &lt;strong&gt;it didn't feel that the conversations were that different when discussing the code&lt;/strong&gt; - we were still talking about types when working out what to do. I'm not sure whether this means we haven't quite got the idea of dynamic languages or whether there isn't such a big difference between the way you talk about your code in them.
&lt;/li&gt;&lt;/ul&gt;
&lt;h3&gt;For next time&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;We might continue with another problem in Groovy - it's been quite fun working in a language that runs on the JVM without the verbosity you sometimes get when writing Java code.&lt;/li&gt;
&lt;/ul&gt;
&lt;img src="http://feeds.feedburner.com/~r/MarkNeedham/~4/L0bhD9jh9Bs" height="1" width="1"&gt;&lt;/img&gt;</description>
	<pubDate>Fri, 03 Jul 2009 23:36:01 +0000</pubDate>
<feedburner:origLink>http://feedproxy.google.com/~r/MarkNeedham/~3/L0bhD9jh9Bs/</feedburner:origLink></item>
<item>
	<title>Jason Yip: Don't just make it visible, make it tangible</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-7807708.post-1740915056901118518</guid>
	<link>http://feedproxy.google.com/~r/PlanetTw/~3/I9GfndpzzKk/dont-just-make-it-visible-make-it.html</link>
	<description>I was talking to &lt;a href="http://erik.doernenburg.com/"&gt;Erik&lt;/a&gt; yesterday and he was wary that I used the phrase "make the internal quality issues tangible" and said he preferred visible or explicit.&lt;br&gt;&lt;/br&gt;
&lt;br&gt;&lt;/br&gt;
I suggested that explicit and visible aren't actually enough.  I truly mean "tangible" because the particular situation I'm targeting is the non-technical audience that doesn't understand what is happening with the long-term health of their systems due to short-term project trade-offs.&lt;br&gt;&lt;/br&gt;
&lt;br&gt;&lt;/br&gt;
Explicit is a number which is too abstract.  Visible is better because then they can see.  But I actually want people to feel, emotionally, the danger which they are putting themselves in.&lt;br&gt;&lt;/br&gt;
&lt;br&gt;&lt;/br&gt;
Our target is tangible with visible being along the way there.&lt;div class="blogger-post-footer"&gt;&lt;img src="https://blogger.googleusercontent.com/tracker/7807708-1740915056901118518?l=jchyip.blogspot.com" height="1" width="1"&gt;&lt;/img&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/YoudThinkWithAllMy?a=O0TSn5NDEEI:prb04CS6wA8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YoudThinkWithAllMy?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YoudThinkWithAllMy?a=O0TSn5NDEEI:prb04CS6wA8:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YoudThinkWithAllMy?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YoudThinkWithAllMy?a=O0TSn5NDEEI:prb04CS6wA8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YoudThinkWithAllMy?i=O0TSn5NDEEI:prb04CS6wA8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/YoudThinkWithAllMy/~4/O0TSn5NDEEI" height="1" width="1"&gt;&lt;/img&gt;</description>
	<pubDate>Fri, 03 Jul 2009 19:58:04 +0000</pubDate>
	<author>noreply@blogger.com (Jason Yip)</author>
<feedburner:origLink>http://feedproxy.google.com/~r/YoudThinkWithAllMy/~3/O0TSn5NDEEI/dont-just-make-it-visible-make-it.html</feedburner:origLink></item>
<item>
	<title>Patrick Kua: Be Careful What You Measure</title>
	<guid isPermaLink="false">http://www.thekua.com/atwork/?p=622</guid>
	<link>http://feedproxy.google.com/~r/PlanetTw/~3/D2rG4jdHOjo/</link>
	<description>&lt;p&gt;Danilo writes about, “&lt;a href="http://www.dtsato.com/blog/2009/07/03/velocity-gone-wrong-done-is-not-done/"&gt;Done is not done&lt;/a&gt;” and I’m reminded of being careful about using the right metric. I remember being on a project where people had individual velocity. This is a really bad thing unless you &lt;em&gt;want&lt;/em&gt; to prevent collaboration. I’d add it to Danilo’s list.&lt;/p&gt;</description>
	<pubDate>Fri, 03 Jul 2009 10:59:55 +0000</pubDate>
<feedburner:origLink>http://www.thekua.com/atwork/2009/07/be-careful-what-you-measure/</feedburner:origLink></item>
<item>
	<title>Anand Vishwanath: Challenges in applying Theory Of Constraints to Agile Software Development</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-768937308837168044.post-8119116285715917390</guid>
	<link>http://feedproxy.google.com/~r/PlanetTw/~3/QEgmvcX20aE/challenges-in-applying-theory-of.html</link>
	<description>&lt;div style="text-align: justify;"&gt;After finishing Goldratt's first book, the Goal, I immediately jumped to David Anderson's &lt;a href="http://www.amazon.com/Agile-Management-Software-Engineering-Constraints/dp/0131424602/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1246613267&amp;amp;sr=8-1"&gt;book&lt;/a&gt; on Applying TOC in Agile Management. &lt;a href="http://www.blogger.com/profile/18342754332237308559"&gt;Preetam &lt;/a&gt;also has left some interesting comments on my blog on the differences between s/w and manufacturing which should not be neglected.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;One important thing which is still puzzling me at this stage is, if you have to account for throughput, how do you measure value. Value here is the value of a story or a feature. If you are a services shop building an application for a customer, it is upto the customer to determine this business value of a story. Quite often this is not easy to determine, specifically for people like Subject Matter Experts you are dealing with to gather your requirements, who do not deal with sales at all.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;In  a manufacturing plant, if you have signed a contract to deliver 10 cars for say $100,000. The cost of an engine still waiting in the queue (work in progress) is almost equal to the value of 1 car, $10,000. However the similar analogy is not easily applicable to a software development team. If a story is in progress, it cannot be easily translated to how much $$ is part of inventory.The story might be part of a bigger feature. Also, determining the business value for that feature in $$ itself can be tricky&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;David's book touches upon in-house IT shops providing IT services (eg: SaaS) or implementing a software product. In these cases, revenue from Sales can be directly mapped to what is being developed. Which is what should happen, in order to increase the throughput of the system, and hence increase the revenue. This is not the case when you are providing IT services to other clients (not in-house).&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Some might say you can use story estimate (ideal days or points). Again this represents cost and not value. The iterative nature of Agile also makes it difficult to apply the same principles as a manufacturing plant.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;While I am still looking for some answers, the learning on how to deal with bottlenecks, optimizing the whole system,  and applying the same to software development, from both the books, are still quite useful.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img src="https://blogger.googleusercontent.com/tracker/768937308837168044-8119116285715917390?l=blog.anandvishwanath.in" height="1" width="1"&gt;&lt;/img&gt;&lt;/div&gt;</description>
	<pubDate>Fri, 03 Jul 2009 09:30:11 +0000</pubDate>
	<author>noreply@blogger.com (Anand Vishwanath)</author>
<feedburner:origLink>http://blog.anandvishwanath.in/2009/07/challenges-in-applying-theory-of.html</feedburner:origLink></item>
<item>
	<title>Danilo Sato: Velocity gone wrong #1: Done is not done</title>
	<guid isPermaLink="false">http://www.dtsato.com/blog/?p=277</guid>
	<link>http://feedproxy.google.com/~r/PlanetTw/~3/AhE8Ke5UcDI/</link>
	<description>&lt;p&gt;Dan North wrote an interesting post about the &lt;a href="http://dannorth.net/2009/07/the-perils-of-estimation"&gt;perils of estimation&lt;/a&gt;, questioning our approach to inceptions, release planning, and setting expectations about scope. This made me think about the implications of those factors once a project starts, and I came up with some anti-patterns on the usage of velocity to track progress. This is my first attempt at writing about them.&lt;/p&gt;
&lt;p&gt;Before we start, it’s important to understand what velocity means. My simple definition of &lt;strong&gt;velocity is the total number of &lt;em&gt;estimation units&lt;/em&gt; for the &lt;em&gt;items&lt;/em&gt; delivered in an &lt;em&gt;iteration&lt;/em&gt;&lt;/strong&gt;. &lt;em&gt;Estimation unit&lt;/em&gt; can be whatever the team chooses: ideal days, hours, &lt;a href="http://www.pomodorotechnique.com/"&gt;pomodoros&lt;/a&gt;, or story points. The nature of &lt;em&gt;items&lt;/em&gt; may vary as well: features, use cases, and user stories are common choices. &lt;em&gt;Iteration&lt;/em&gt; is a fixed amount of time where the team will work on delivering those items. Sounds simple? Well… there’s one concept that is commonly overlooked and that’s the source of the first anti-pattern: &lt;strong&gt;what does &lt;em&gt;delivered&lt;/em&gt; means?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;One of the most common anti-patterns I’ve seen is not having a clear definition of done. Lean thinking tells us that nothing is really done until it’s delivering value, which in software means: code running in production and being used by real users. Although I know very few teams who can deploy code to production at the end of every iteration (some even do more than once per iteration), once a story is considered done, it could be potentially shipped, if the business decides so. There shouldn’t be a lot of extra work after that.&lt;/p&gt;
&lt;p&gt;Another bad implication of this anti-pattern is that some teams decide to change the definition of done and count half-completed work to show progress. Some of the symptoms to help diagnose if your team is suffering from this anti-pattern are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The team starts tracking &lt;a href="http://blog.franktrindade.com/2009/05/12/dev-complete-no"&gt;dev-complete&lt;/a&gt; stories&lt;/li&gt;
&lt;li&gt;&lt;em&gt;“It’s done, but [we need to write the acceptance test/it's not integrated with the other system/...]“&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;“It’s done, but not done-done”&lt;br&gt;&lt;/br&gt;
&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;It takes a lot of extra work to get the story deployed to production&lt;/li&gt;
&lt;li&gt;After finished, the story goes into the next team’s backlog&lt;/li&gt;
&lt;li&gt;Hearing terms like “development team velocity” or “test team velocity”&lt;/li&gt;
&lt;li&gt;Counting half-points or percentages because &lt;em&gt;“if we don’t count it will look like we haven’t worked”&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The solution? Remember that velocity is just a number that provides information for the team to understand and improve it’s process. Forget that you’re tracking it and focus on the entire Value Stream and on what’s really value-added to get things into production. Anything else is just waste. &lt;strong&gt;If it’s not done, it’s not done&lt;/strong&gt;. Accept it, move on, and don’t overcomplicate, because it will only add noise and mask what could have been important information to the team.&lt;/p&gt;</description>
	<pubDate>Fri, 03 Jul 2009 00:12:15 +0000</pubDate>
<feedburner:origLink>http://feedproxy.google.com/~r/dtsato/~3/nSjnhoes-WI/</feedburner:origLink></item>
<item>
	<title>Nick Drew: nickdrew</title>
	<guid isPermaLink="false">http://pilchardfriendly.wordpress.com/?p=77</guid>
	<link>http://feedproxy.google.com/~r/PlanetTw/~3/Iau9RVUpPYI/</link>
	<description>&lt;div class="snap_preview"&gt;&lt;br&gt;&lt;/br&gt;&lt;p&gt;I’m going to tell you that, with a bit of effort, you can get a really good Test Driven Red/Green cycle with Silverlight…&lt;/p&gt;
&lt;p&gt;Assumptions – you have installed VS 2008, and the Silverlight 2 SDK&lt;/p&gt;
&lt;p&gt;Firstly – we created 4 projects in Visual Studio:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Silverlight.App – holds the production code&lt;/li&gt;
&lt;li&gt;Silverlight.App.UnitTests – runs tests that require no external dependencies&lt;/li&gt;
&lt;li&gt;Silverlight.App.IntegrationTests – contains tests that connection to the web, database, are asynchronous, etc &lt;/li&gt;
&lt;li&gt;Silverlight.App.IntegrationHost – a ASP.NET project that will run the IntegrationTests&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;UnitTests and IntegrationTests are created with the &lt;a href="http://www.codeplex.com/Silverlight/"&gt;Silveright UnitTesting&lt;/a&gt; project templates.  These templates cause a test page to be created.  The test page basically listens to events from the TestRunner (embedded in the Test silverlight applications), and presents it as (fiddly) HTML.&lt;/p&gt;
&lt;p&gt;Our UnitTest project hasn’t changed much since we started.  We have had issues with the IntegrationTests project:&lt;/p&gt;
&lt;h2&gt;Security&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Code transparency – All application logic is marked as “Transparent”, which means that may call but may not extend or override “SafeCritical” or “CriticalCode”.  The System.Net.WebClient is marked as SafeCritical.  This means that you won’t be able to Mock/Stub WebClient.  At all.&lt;/li&gt;
&lt;li&gt;Internal event constructors – The constructor for DownloadStringAsyncCompleteEventArgs is internal; You won’t be able to simulate a WebClient completing an http request.&lt;/li&gt;
&lt;li&gt;Silverlight applications loaded from the file system just plain cannot connect to web resources.  There is no security policy that will allow it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All of the above issues drove us to use the IntegrationHost to run the IntegrationTests, but in a web context.  This is quite good, especially for within-IDE testing, since you can host your test data as flat files or as ASP driven test data in the same host.&lt;/p&gt;
&lt;h2&gt;Unit Testing&lt;/h2&gt;
&lt;h3&gt;Good news&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://ayende.com/projects/rhino-mocks/downloads.aspx"&gt;Rhino mocks&lt;/a&gt; is available for Silverlight.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.jeff.wilcox.name/2009/01/nunit-and-silverlight/"&gt;Nunit&lt;/a&gt; is available as source for Silverlight (with some shims for older, pre-silverlight data structures).&lt;/li&gt;
&lt;li&gt;The Silverlight UT runner works with both MSTest Metadata and nunit style assertions at the same time&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Puzzling&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.nunitlite.com/"&gt;Nunit lite&lt;/a&gt; appears to be at version 0.5, and maybe worth looking at instead of a custom build of Nunit&lt;/li&gt;
&lt;li&gt;&lt;a href="http://specificity.codeplex.com/"&gt;Specificity&lt;/a&gt; Looks like it may work in the Silverlight environment.&lt;/li&gt;
&lt;li&gt;Asynchronous testing using the [Asynchronous] attribute is potentially very brittle&lt;/li&gt;
&lt;li&gt;Maintaining the test data for the integration tests in the IntegrationHost web project seems counter intuitive&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Continous Integration&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Silverlight UT test reports are shockingly bad HTML, making downstream consumption particularly difficult.  Would be nice to log semantic html somewhere.&lt;/li&gt;
&lt;li&gt;For the unit tests, we found &lt;a href="http://blog.lab49.com/archives/2292"&gt;a powershell script&lt;/a&gt; that will spawn IE and scrape the results into a file&lt;/li&gt;
&lt;li&gt;For the integration tests, we modified the powershell script to spawn a WebDev.WebServer.exe against the IntegrationHost&lt;/li&gt;
&lt;li&gt;The IntegrationTest xap file that is linked from the IntegrationHost will &lt;b&gt;not&lt;/b&gt; get automatically deployed by msbuild – we use a copy task to pull it before launching IE.&lt;/li&gt;
&lt;li&gt;Visual Studio wants to put the hosted xap file in ClientBin of the IntegrationHost.  This is fine, but it also wants to put it into source control, which is not.  Eventually, you’ll get the right combination of check-ins, deletes, et. al.  and it won’t be an issue.  Expect to lose a few hours on this. &lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Powershell&lt;/h2&gt;
&lt;p&gt;When you have to clear out some space for that web server socket:&lt;/p&gt;
&lt;pre&gt;gwmi win32_process | where { $_.CommandLine -like "*WebDev.WebServer.exe*/port:$port" } | Kill&lt;/pre&gt;
&lt;h2&gt;Asynchrony&lt;/h2&gt;
&lt;p&gt;Async silverlight tests look a bit like this:&lt;/p&gt;
&lt;pre&gt;[Asynchronous]
public void ShouldHangAroundABitWaiting {
   EnqueueCondition( () =&amp;gt; return TrueIfCanStart() );
   EnqueueCallback( () =&amp;gt; Specify.That( something, Is.Ready() );
   EnqueueTestComplete();
}
&lt;/pre&gt;
&lt;p&gt;It is at times like this that one definitely wants a monad.&lt;/p&gt;
&lt;p&gt;One day, async code will look like this:&lt;/p&gt;
&lt;pre&gt;[Asynchronous]
public void ShouldHangAroundABit {
	TrueIfCanStart.Wait();
	Specify.That( something, IsReady() )
}
&lt;/pre&gt;
  &lt;a href="http://feeds.wordpress.com/1.0/gocomments/pilchardfriendly.wordpress.com/77/" rel="nofollow"&gt;&lt;img src="http://feeds.wordpress.com/1.0/comments/pilchardfriendly.wordpress.com/77/" alt="" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.wordpress.com/1.0/godelicious/pilchardfriendly.wordpress.com/77/" rel="nofollow"&gt;&lt;img src="http://feeds.wordpress.com/1.0/delicious/pilchardfriendly.wordpress.com/77/" alt="" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.wordpress.com/1.0/gostumble/pilchardfriendly.wordpress.com/77/" rel="nofollow"&gt;&lt;img src="http://feeds.wordpress.com/1.0/stumble/pilchardfriendly.wordpress.com/77/" alt="" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.wordpress.com/1.0/godigg/pilchardfriendly.wordpress.com/77/" rel="nofollow"&gt;&lt;img src="http://feeds.wordpress.com/1.0/digg/pilchardfriendly.wordpress.com/77/" alt="" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.wordpress.com/1.0/goreddit/pilchardfriendly.wordpress.com/77/" rel="nofollow"&gt;&lt;img src="http://feeds.wordpress.com/1.0/reddit/pilchardfriendly.wordpress.com/77/" alt="" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;img src="http://stats.wordpress.com/b.gif?host=pilchardfriendly.wordpress.com&amp;amp;blog=4073989&amp;amp;post=77&amp;amp;subd=pilchardfriendly&amp;amp;ref=&amp;amp;feed=1" alt="" border="0"&gt;&lt;/img&gt;&lt;/div&gt;</description>
	<pubDate>Thu, 02 Jul 2009 23:26:41 +0000</pubDate>
<feedburner:origLink>http://pilchardfriendly.wordpress.com/2009/07/02/silverlight-unit-and-integration-testing/</feedburner:origLink></item>
<item>
	<title>Steven List: IAAM: Sympathizing, Empathizing, Identifying</title>
	<guid isPermaLink="false">http://www.stevenlist.com/blog/?p=471</guid>
	<link>http://feedproxy.google.com/~r/PlanetTw/~3/Q7t67rxBB10/</link>
	<description>&lt;p&gt;[This is fiction. Any resemblance to individuals living or otherwise is purely coincidental.  Really.]&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Joan’s phone starting ringing insistently. Joan thought for a moment, since she was watching her favorite reality TV show, and that was her time to just disconnect. In spite of her preferences, Joan decided to answer the phone.&lt;/p&gt;
&lt;p&gt;“Joan?” She heard her friend Nancy’s voice, and her heart skipped a beat. Nancy was sobbing. “Nancy? What’s wrong honey?”&lt;/p&gt;
&lt;p&gt;“They fired me, Joan! They fired me!”&lt;/p&gt;
&lt;p&gt;“Joanie…” sobbing “…they said that I just wasn’t living up to their expectations.”&lt;/p&gt;
&lt;p&gt;“Oh, Nancy…”&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Now let’s talk about Joan’s possible reactions…&lt;/p&gt;
&lt;p&gt;Each of us has a different reaction, and each of us offers a different &lt;a href="http://www.stevenlist.com/blog/tag/response/" class="st_tag internal_tag" rel="tag" title="Posts tagged with response"&gt;response&lt;/a&gt; based on that reaction&lt;a href="http://www.stevenlist.com/blog/feed/#reaction"&gt;*&lt;/a&gt;. For the moment, I want to talk about three types of reaction and &lt;a href="http://www.stevenlist.com/blog/tag/response/" class="st_tag internal_tag" rel="tag" title="Posts tagged with response"&gt;response&lt;/a&gt;: &lt;a href="http://www.stevenlist.com/blog/feed/#sympathy"&gt;sympathy&lt;/a&gt;, &lt;a href="http://www.stevenlist.com/blog/feed/#empathy"&gt;empathy&lt;/a&gt;, and &lt;a href="http://www.stevenlist.com/blog/feed/#identification"&gt;identification&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;Reaction: &lt;a href="http://www.stevenlist.com/blog/tag/sympathy/" class="st_tag internal_tag" rel="tag" title="Posts tagged with sympathy"&gt;Sympathy&lt;/a&gt;&lt;/h4&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;a href="http://www.stevenlist.com/blog/tag/response/" class="st_tag internal_tag" rel="tag" title="Posts tagged with response"&gt;Response&lt;/a&gt;: “Oh, Nancy… that’s terrible. You must feel miserable.  I can only imagine how that feels. Would you like to come over and talk?”&lt;/p&gt;&lt;/blockquote&gt;
&lt;h4&gt;Reaction: Empathy&lt;/h4&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;a href="http://www.stevenlist.com/blog/tag/response/" class="st_tag internal_tag" rel="tag" title="Posts tagged with response"&gt;Response&lt;/a&gt;: “Oh, Nancy… I feel terrible. I can’t believe it! I’ll come over and let’s talk about what we can do.” Joan cries.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h4&gt;Reaction: Identification&lt;/h4&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;a href="http://www.stevenlist.com/blog/tag/response/" class="st_tag internal_tag" rel="tag" title="Posts tagged with response"&gt;Response&lt;/a&gt;: “Oh, Nancy. Those bastards! After all you’ve done for them, and how hard you’ve worked. You gave your all to that company, and this is how they treat you? I’m devastated.”&lt;/p&gt;
&lt;p&gt;Nancy cries.&lt;/p&gt;
&lt;p&gt;Joan cries.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Up to this point, &lt;a href="http://www.stevenlist.com/blog/tag/sympathy/" class="st_tag internal_tag" rel="tag" title="Posts tagged with sympathy"&gt;sympathy&lt;/a&gt;, empathy, and identification sound a lot alike. In all three versions, Joan has an emotional reaction that leads to a behavior – her &lt;a href="http://www.stevenlist.com/blog/tag/response/" class="st_tag internal_tag" rel="tag" title="Posts tagged with response"&gt;response&lt;/a&gt;. In each case, her &lt;a href="http://www.stevenlist.com/blog/tag/response/" class="st_tag internal_tag" rel="tag" title="Posts tagged with response"&gt;response&lt;/a&gt; is subtly different. Note that in the following discussion, I am not making a judgment about better versus worse, or good versus bad… I’m working on achieving understanding and recognizing that each type of reaction and &lt;a href="http://www.stevenlist.com/blog/tag/response/" class="st_tag internal_tag" rel="tag" title="Posts tagged with response"&gt;response&lt;/a&gt; &lt;em&gt;deserves and requires a different &lt;a href="http://www.stevenlist.com/blog/tag/response/" class="st_tag internal_tag" rel="tag" title="Posts tagged with response"&gt;response&lt;/a&gt; from me&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;In being sympathetic, Joan’s &lt;a href="http://www.stevenlist.com/blog/tag/response/" class="st_tag internal_tag" rel="tag" title="Posts tagged with response"&gt;response&lt;/a&gt; is &lt;em&gt;separate&lt;/em&gt;. Joan is clear that what is happening to Nancy is about Nancy, not about Joan. While Joan may feel sad or angry, it is &lt;em&gt;on behalf of&lt;/em&gt; her friend. From Nancy’s perspective, there is a little bit of distance between them. Joan’s feelings are moderate.&lt;/p&gt;
&lt;p&gt;In being empathetic, Joan’s &lt;a href="http://www.stevenlist.com/blog/tag/response/" class="st_tag internal_tag" rel="tag" title="Posts tagged with response"&gt;response&lt;/a&gt; is &lt;em&gt;collective&lt;/em&gt;. Joan feels what she believes Joan feels, including the pain, indignation, and so forth. For Joan, what is happening is also happening to her, emotionally. From Nancy’s perspective, it’s like a resonation, which may increase the level of her feelings. To a certain extent, Joan’s reaction becomes an extension of Nancy’s reaction. Joan’s feelings are intense, although she recognizes that they are about Nancy.&lt;/p&gt;
&lt;p&gt;In identifying with Nancy, Joan takes on Nancy’s feelings and reactions. Joan’s &lt;a href="http://www.stevenlist.com/blog/tag/response/" class="st_tag internal_tag" rel="tag" title="Posts tagged with response"&gt;response&lt;/a&gt; is intense and personal, as though she were the one who had been fired. Nancy may be taken aback by the intensity of Joan’s reaction, as Joan takes on some of Nancy’s emotional &lt;a href="http://www.stevenlist.com/blog/tag/response/" class="st_tag internal_tag" rel="tag" title="Posts tagged with response"&gt;response&lt;/a&gt;. Joan behaves as if she were the one who had been fired, and will react to others as if she were the victim as much as Nancy.&lt;/p&gt;
&lt;p&gt;To see how this works, let’s add Joan’s husband Mark to the story…&lt;/p&gt;
&lt;p&gt;“Joan? What’s going on?”&lt;/p&gt;
&lt;h4&gt;&lt;a href="http://www.stevenlist.com/blog/tag/sympathy/" class="st_tag internal_tag" rel="tag" title="Posts tagged with sympathy"&gt;Sympathy&lt;/a&gt;&lt;/h4&gt;
&lt;blockquote&gt;&lt;p&gt;“It’s Nancy. She got fired today. I feel so bad for her. She’s so upset.”&lt;/p&gt;
&lt;p&gt;“That sucks. What’s she going to do?”&lt;/p&gt;
&lt;p&gt;“I don’t know yet. I may have to spend some time with her.  I hope that’s okay with you.”&lt;/p&gt;&lt;/blockquote&gt;
&lt;h4&gt;Empathy&lt;/h4&gt;
&lt;blockquote&gt;&lt;p&gt;“It’s Nancy. She got fired today. I’ve got to go over there to be with her right now!” Sobbing&lt;/p&gt;
&lt;p&gt;“That sucks. What’s she going to do?”&lt;/p&gt;
&lt;p&gt;“I don’t know yet, but I just know how horrible she feels and that I have to go be with her. It’s so painful! Doesn’t this upset you?”&lt;/p&gt;&lt;/blockquote&gt;
&lt;h4&gt;Identification&lt;/h4&gt;
&lt;blockquote&gt;&lt;p&gt;“It’s Nancy. She got fired today. I’ve got to go over there to be with her right now!” Sobbing&lt;/p&gt;
&lt;p&gt;“That sucks. What’s she going to do?”&lt;/p&gt;
&lt;p&gt;“They treated her like dirt! How can you be so calm?  Don’t you care? They were unfair and cruel. I don’t know what we’re going to do, but we’re going to do something to show them!”&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Note that Joan’s &lt;a href="http://www.stevenlist.com/blog/tag/response/" class="st_tag internal_tag" rel="tag" title="Posts tagged with response"&gt;response&lt;/a&gt; to Mark escalates from &lt;a href="http://www.stevenlist.com/blog/tag/sympathy/" class="st_tag internal_tag" rel="tag" title="Posts tagged with sympathy"&gt;Sympathy&lt;/a&gt; to Empathy to Identification. In the latter, Joan feels that &lt;em&gt;what has happened to Nancy has happened to her&lt;/em&gt;, and thus she expects the same kind of reaction from Mark that she’d expect if &lt;em&gt;she&lt;/em&gt; had been fired.&lt;/p&gt;
&lt;p&gt;This post is long enough.  Now I’m going to go off and think about the differences in responses to each of the three.&lt;/p&gt;
&lt;hr&gt;&lt;/hr&gt;
&lt;h3&gt;&lt;a name="sympathy"&gt;&lt;/a&gt;&lt;a href="http://www.stevenlist.com/blog/tag/sympathy/" class="st_tag internal_tag" rel="tag" title="Posts tagged with sympathy"&gt;Sympathy&lt;/a&gt;&lt;/h3&gt;
&lt;ul type="disc"&gt;
&lt;li&gt;an inclination to support or be loyal to or to agree with an opinion; “his sympathies were always with the underdog”; “I knew I could count on his …&lt;/li&gt;
&lt;li&gt;sharing the feelings of others (especially feelings of sorrow or anguish)&lt;/li&gt;
&lt;li&gt;a relation of affinity or harmony between people; whatever affects one correspondingly affects the other; “the two of them were in close &lt;a href="http://www.stevenlist.com/blog/tag/sympathy/" class="st_tag internal_tag" rel="tag" title="Posts tagged with sympathy"&gt;sympathy&lt;/a&gt;”&lt;br&gt;&lt;/br&gt;
&lt;a href="http://www.google.com/url?&amp;amp;q=http://wordnet.princeton.edu/perl/webwn%3Fs%3Dsympathy&amp;amp;ei=nY1MSvjTEJSQNteg6PAD&amp;amp;sa=X&amp;amp;oi=define&amp;amp;ct=&amp;amp;cd=1&amp;amp;usg=AFQjCNGfLAZCzLexVVxzDPt0jOMRXxXEkg"&gt;&lt;span style="color: #008000;"&gt;wordnet.princeton.edu/perl/webwn&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;http://dictionary.reference.com/browse/&lt;a href="http://www.stevenlist.com/blog/tag/sympathy/" class="st_tag internal_tag" rel="tag" title="Posts tagged with sympathy"&gt;sympathy&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;a name="empathy"&gt;&lt;/a&gt;Empathy&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;understanding and entering into another’s feelings&lt;br&gt;&lt;/br&gt;
&lt;a href="http://www.google.com/url?&amp;amp;q=http://wordnet.princeton.edu/perl/webwn%3Fs%3Dempathy&amp;amp;ei=QY5MSoyZBYm4M5_ooe4D&amp;amp;sa=X&amp;amp;oi=define&amp;amp;ct=&amp;amp;cd=1&amp;amp;usg=AFQjCNGjpIwxai_rWISMnUHSxpKYPHqs0w"&gt;&lt;span style="color: #008000;"&gt;wordnet.princeton.edu/perl/webwn&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;http://dictionary.reference.com/browse/empathy&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;a name="identification"&gt;&lt;/a&gt;Identification&lt;/h3&gt;
&lt;ul type="disc"&gt;
&lt;li&gt;the attribution to yourself (consciously or unconsciously) of the characteristics of another person (or group of persons)  &lt;a href="http://www.google.com/url?&amp;amp;q=http://wordnet.princeton.edu/perl/webwn%3Fs%3Didentification&amp;amp;ei=wo5MSo7vE4muMNrhxfYD&amp;amp;sa=X&amp;amp;oi=define&amp;amp;ct=&amp;amp;cd=1&amp;amp;usg=AFQjCNHDziEieMZHoEDAwmjLgeJSxJbU8Q"&gt;&lt;span style="color: #008000;"&gt;&lt;br&gt;&lt;/br&gt;
wordnet.princeton.edu/perl/webwn&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;a process by which one ascribes to oneself the qualities or characteristics of another person.&lt;/li&gt;
&lt;li&gt;A person’s association with or assumption of the qualities, characteristics, or views of another person or group.&lt;br&gt;&lt;/br&gt;
http://dictionary.reference.com/browse/identification&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;a name="reaction"&gt;&lt;/a&gt;*Reaction vs. &lt;a href="http://www.stevenlist.com/blog/tag/response/" class="st_tag internal_tag" rel="tag" title="Posts tagged with response"&gt;Response&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;For the purposes of this discussion, I’m defining “reaction” as the emotional or physical effect that occurs without thinking, and “&lt;a href="http://www.stevenlist.com/blog/tag/response/" class="st_tag internal_tag" rel="tag" title="Posts tagged with response"&gt;response&lt;/a&gt;” as the chosen action or thought that occurs after the reaction. That is, if I put my hand in a fire, pulling my hand out is a reaction – I don’t think about it – while swearing about it is a &lt;a href="http://www.stevenlist.com/blog/tag/response/" class="st_tag internal_tag" rel="tag" title="Posts tagged with response"&gt;response&lt;/a&gt;.&lt;/p&gt;
&lt;p align="left"&gt;&lt;a href="http://twitter.com/home/?status=IAAM%3A+Sympathizing%2C+Empathizing%2C+Identifying+http://kg3bz.th8.us" class="tt" title="Post to Twitter"&gt;&lt;img src="http://www.stevenlist.com/blog/wp-content/plugins/tweet-this/icons/tt-twitter.png" alt="[Post to Twitter]" border="0" class="nothumb"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://twitter.com/home/?status=IAAM%3A+Sympathizing%2C+Empathizing%2C+Identifying+http://kg3bz.th8.us" class="tt" title="Post to Twitter"&gt;Tweet This Post&lt;/a&gt;  &lt;/p&gt;&lt;a href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.stevenlist.com%2Fblog%2F2009%2F07%2F02%2Fiaam-sympathizing-empathizing-identifying%2F&amp;amp;linkname=IAAM%3A%20Sympathizing%2C%20Empathizing%2C%20Identifying" class="a2a_dd addtoany_share_save"&gt;&lt;img src="http://www.stevenlist.com/blog/wp-content/plugins/add-to-any/share_save_120_16.png" alt="Share/Save/Bookmark" height="16" width="120"&gt;&lt;/img&gt;&lt;/a&gt;
	&lt;h4&gt;Related posts&lt;/h4&gt;
	&lt;ul class="st-related-posts"&gt;
	&lt;li&gt;&lt;a href="http://www.stevenlist.com/blog/2009/02/14/you-dont-know-me/" title="You don’t know me… (February 14, 2009)"&gt;You don’t know me…&lt;/a&gt; (0)&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://www.stevenlist.com/blog/2009/04/13/you-cant-change-me/" title="You can’t change me (April 13, 2009)"&gt;You can’t change me&lt;/a&gt; (4)&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://www.stevenlist.com/blog/2009/03/24/who-is-you/" title="Who is You? (March 24, 2009)"&gt;Who is You?&lt;/a&gt; (4)&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://www.stevenlist.com/blog/2009/02/12/whats-in-it-for-me/" title="What’s in it for me? (February 12, 2009)"&gt;What’s in it for me?&lt;/a&gt; (0)&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://www.stevenlist.com/blog/2009/01/25/what-is-he-thinking/" title="What is he thinking? (January 25, 2009)"&gt;What is he thinking?&lt;/a&gt; (3)&lt;/li&gt;
&lt;/ul&gt;</description>
	<pubDate>Thu, 02 Jul 2009 19:01:38 +0000</pubDate>
<feedburner:origLink>http://www.stevenlist.com/blog/2009/07/02/iaam-sympathizing-empathizing-identifying/</feedburner:origLink></item>
<item>
	<title>Sam Newman: I like scala, but binary incompatibility between minor versions? Come on! http://bit.ly/ScalaXBuild</title>
	<guid isPermaLink="false">http://blog.magpiebrain.com/post/134293189</guid>
	<link>http://feedproxy.google.com/~r/PlanetTw/~3/DYIXUhxvu3w/134293189</link>
	<description>I like scala, but binary incompatibility between minor versions? Come on! &lt;a href="http://bit.ly/ScalaXBuild"&gt;http://bit.ly/ScalaXBuild&lt;/a&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Magpiebrain?a=kJ-wrPfld_M:a_ASC-KODTI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Magpiebrain?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Magpiebrain?a=kJ-wrPfld_M:a_ASC-KODTI:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Magpiebrain?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Magpiebrain?a=kJ-wrPfld_M:a_ASC-KODTI:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Magpiebrain?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
	<pubDate>Thu, 02 Jul 2009 18:41:27 +0000</pubDate>
<feedburner:origLink>http://feedproxy.google.com/~r/Magpiebrain/~3/kJ-wrPfld_M/134293189</feedburner:origLink></item>
<item>
	<title>Andy Palmer: Pomodoro, AppleScript and Adium</title>
	<guid isPermaLink="false">http://andypalmer.com/?p=189</guid>
	<link>http://feedproxy.google.com/~r/PlanetTw/~3/O36FuH0X62g/</link>
	<description>&lt;p&gt;I downloaded &lt;a href="http://www.apple.com/downloads/macosx/development_tools/pomodoro.html"&gt;this Pomodoro Timer&lt;/a&gt; from the Apple website.&lt;br&gt;&lt;/br&gt;
It has support for AppleScript events, so I created a script that automatically sets my Adium status to away (with an auto-reply) while I am working on a Pomodoro and automatically sets it to Available when I have finished.&lt;/p&gt;
&lt;p&gt;After much messing around, trying to work out just how the AppleScript pseudo-natural-language works, I ended up with this to set the away status:&lt;/p&gt;
&lt;pre class="prettyprint"&gt;-- This goes on one line in Pomodoro Setup -&amp;gt; AppleScript -&amp;gt; Start
tell application "Adium"
  to set the status of every account whose status type is available
  to the first status whose title is "Pomodoro In Progress"
&lt;/pre&gt;
&lt;p&gt;and this to set it back to available:&lt;/p&gt;
&lt;pre class="prettyprint"&gt;-- This goes on one line in Pomodoro Setup -&amp;gt; AppleScript -&amp;gt; Reset and End
tell application "Adium"
  to set the status of every account whose status type is away
  to the first status whose title is "Available"
&lt;/pre&gt;
&lt;img src="http://feeds.feedburner.com/~r/andypalmer/blog/~4/7vZFwWFd8eg" height="1" width="1"&gt;&lt;/img&gt;</description>
	<pubDate>Thu, 02 Jul 2009 15:21:56 +0000</pubDate>
<feedburner:origLink>http://feedproxy.google.com/~r/andypalmer/blog/~3/7vZFwWFd8eg/</feedburner:origLink></item>
<item>
	<title>Mark Needham: F#: Pattern matching with the ':?' operator</title>
	<guid isPermaLink="false">http://www.markhneedham.com/blog/?p=1397</guid>
	<link>http://feedproxy.google.com/~r/PlanetTw/~3/UYBQ3tZiZjM/</link>
	<description>&lt;p&gt;I've been doing a bit more reading of the &lt;a href="http://code.google.com/p/fake/"&gt;Fake&lt;/a&gt; source code and one interesting thing which I came across which I hadn't seen was an active pattern which was making use of the ':?' operator to match the input type against .NET types.&lt;/p&gt;

&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="ocaml"&gt;  &lt;span style="color: #06c; font-weight: bold;"&gt;let&lt;/span&gt; &lt;span style="color: #6c6;"&gt;(&lt;/span&gt;&lt;span style="color: #a52a2a;"&gt;|&lt;/span&gt;File&lt;span style="color: #a52a2a;"&gt;|&lt;/span&gt;Directory&lt;span style="color: #a52a2a;"&gt;|&lt;/span&gt;&lt;span style="color: #6c6;"&gt;)&lt;/span&gt; &lt;span style="color: #6c6;"&gt;(&lt;/span&gt;fileSysInfo &lt;span style="color: #a52a2a;"&gt;:&lt;/span&gt; FileSystemInfo&lt;span style="color: #6c6;"&gt;)&lt;/span&gt; &lt;span style="color: #a52a2a;"&gt;=&lt;/span&gt;
    &lt;span style="color: #06c; font-weight: bold;"&gt;match&lt;/span&gt; fileSysInfo &lt;span style="color: #06c; font-weight: bold;"&gt;with&lt;/span&gt;
      &lt;span style="color: #a52a2a;"&gt;|&lt;/span&gt; &lt;span style="color: #a52a2a;"&gt;:&lt;/span&gt;? FileInfo &lt;span style="color: #06c; font-weight: bold;"&gt;as&lt;/span&gt; file &lt;span style="color: #a52a2a;"&gt;-&amp;gt;&lt;/span&gt; File &lt;span style="color: #6c6;"&gt;(&lt;/span&gt;file&lt;span style="color: #a52a2a;"&gt;.&lt;/span&gt;&lt;span style="color: #060;"&gt;Name&lt;/span&gt;&lt;span style="color: #6c6;"&gt;)&lt;/span&gt;
      &lt;span style="color: #a52a2a;"&gt;|&lt;/span&gt; &lt;span style="color: #a52a2a;"&gt;:&lt;/span&gt;? DirectoryInfo &lt;span style="color: #06c; font-weight: bold;"&gt;as&lt;/span&gt; dir &lt;span style="color: #a52a2a;"&gt;-&amp;gt;&lt;/span&gt; Directory &lt;span style="color: #6c6;"&gt;(&lt;/span&gt;dir&lt;span style="color: #a52a2a;"&gt;.&lt;/span&gt;&lt;span style="color: #060;"&gt;Name&lt;/span&gt;, seq &lt;span style="color: #6c6;"&gt;{&lt;/span&gt; &lt;span style="color: #06c; font-weight: bold;"&gt;for&lt;/span&gt; x &lt;span style="color: #06c; font-weight: bold;"&gt;in&lt;/span&gt; dir&lt;span style="color: #a52a2a;"&gt;.&lt;/span&gt;&lt;span style="color: #060;"&gt;GetFileSystemInfos&lt;/span&gt;&lt;span style="color: #6c6;"&gt;(&lt;/span&gt;&lt;span style="color: #6c6;"&gt;)&lt;/span&gt; &lt;span style="color: #a52a2a;"&gt;-&amp;gt;&lt;/span&gt; x &lt;span style="color: #6c6;"&gt;}&lt;/span&gt;&lt;span style="color: #6c6;"&gt;)&lt;/span&gt;
      &lt;span style="color: #a52a2a;"&gt;|&lt;/span&gt; _ &lt;span style="color: #a52a2a;"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: #06c; font-weight: bold;"&gt;failwith&lt;/span&gt; &lt;span style="color: #3cb371;"&gt;"No file or directory given."&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;I thought maybe this was just a wild card operator to say that we don't care what the value is as long as it matches 'FileInfo' or 'DirectoryInfo' respectively but I couldn't see it defined on the &lt;a href="http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/manual/FSharp.Core/Microsoft.FSharp.Core.Operators.html"&gt;list of operators on the Microsoft Research website&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A bit of googling led me to &lt;a href="http://weblogs.asp.net/podwysocki/archive/2008/03/17/adventures-in-f-f-101-part-5-pattern-matching.aspx"&gt;Matthew Podwysocki's post about pattern matching&lt;/a&gt; which explained the purpose of the operator (about 1/3 of the way down):&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
What the above example does is check for the corresponding .NET types by using the ':?' operator especially reserved for this behavior.
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;I've been playing around with a simple 'add' function to try and understand F#'s type inference and one thing I noticed is that if you just define it with minimal code you end up with a function which takes in 2 integers and returns an integer as the result:&lt;/p&gt;

&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="ocaml"&gt;&lt;span style="color: #06c; font-weight: bold;"&gt;let&lt;/span&gt; add a b &lt;span style="color: #a52a2a;"&gt;=&lt;/span&gt; a &lt;span style="color: #a52a2a;"&gt;+&lt;/span&gt; b
 
&lt;span style="color: #06c; font-weight: bold;"&gt;val&lt;/span&gt; add&lt;span style="color: #a52a2a;"&gt;:&lt;/span&gt; int &lt;span style="color: #a52a2a;"&gt;-&amp;gt;&lt;/span&gt; int &lt;span style="color: #a52a2a;"&gt;-&amp;gt;&lt;/span&gt; int&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;I had thought that the signature and result of that function might remain generic due to the fact that there are more types than just 'int' with which you can make use of the addition operator.&lt;/p&gt;
&lt;p&gt;For example, it is possible to add two string together but in fact you need to be more explicit about that:&lt;/p&gt;

&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="ocaml"&gt;&lt;span style="color: #06c; font-weight: bold;"&gt;let&lt;/span&gt; add &lt;span style="color: #6c6;"&gt;(&lt;/span&gt;a&lt;span style="color: #a52a2a;"&gt;:&lt;/span&gt;string&lt;span style="color: #6c6;"&gt;)&lt;/span&gt; &lt;span style="color: #6c6;"&gt;(&lt;/span&gt;b&lt;span style="color: #a52a2a;"&gt;:&lt;/span&gt;string&lt;span style="color: #6c6;"&gt;)&lt;/span&gt; &lt;span style="color: #a52a2a;"&gt;=&lt;/span&gt; a &lt;span style="color: #a52a2a;"&gt;+&lt;/span&gt; b
 
&lt;span style="color: #06c; font-weight: bold;"&gt;val&lt;/span&gt; add&lt;span style="color: #a52a2a;"&gt;:&lt;/span&gt; string &lt;span style="color: #a52a2a;"&gt;-&amp;gt;&lt;/span&gt; string &lt;span style="color: #a52a2a;"&gt;-&amp;gt;&lt;/span&gt; string&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;From what I can tell if we wanted to write a generic add function we would need to do something like this - I originally tried just returning 'new A + new B' from each of the pattern matches but the return type of add3 then becomes 'string' since the first path in the pattern matching returns a 'string'.&lt;/p&gt;

&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="ocaml"&gt;    &lt;span style="color: #06c; font-weight: bold;"&gt;let&lt;/span&gt; add3 a b &lt;span style="color: #a52a2a;"&gt;=&lt;/span&gt;
        &lt;span style="color: #06c; font-weight: bold;"&gt;match&lt;/span&gt; &lt;span style="color: #6c6;"&gt;(&lt;/span&gt;box a,box b&lt;span style="color: #6c6;"&gt;)&lt;/span&gt; &lt;span style="color: #06c; font-weight: bold;"&gt;with&lt;/span&gt;
            &lt;span style="color: #a52a2a;"&gt;|&lt;/span&gt; &lt;span style="color: #6c6;"&gt;(&lt;/span&gt;&lt;span style="color: #a52a2a;"&gt;:&lt;/span&gt;? string &lt;span style="color: #06c; font-weight: bold;"&gt;as&lt;/span&gt; newA&lt;span style="color: #6c6;"&gt;)&lt;/span&gt;,&lt;span style="color: #6c6;"&gt;(&lt;/span&gt;&lt;span style="color: #a52a2a;"&gt;:&lt;/span&gt;? string &lt;span style="color: #06c; font-weight: bold;"&gt;as&lt;/span&gt; newB&lt;span style="color: #6c6;"&gt;)&lt;/span&gt; &lt;span style="color: #a52a2a;"&gt;-&amp;gt;&lt;/span&gt; newA &lt;span style="color: #a52a2a;"&gt;+&lt;/span&gt;  newB &lt;span style="color: #a52a2a;"&gt;|&amp;gt;&lt;/span&gt; box
            &lt;span style="color: #a52a2a;"&gt;|&lt;/span&gt; &lt;span style="color: #6c6;"&gt;(&lt;/span&gt;&lt;span style="color: #a52a2a;"&gt;:&lt;/span&gt;? int &lt;span style="color: #06c; font-weight: bold;"&gt;as&lt;/span&gt; newA&lt;span style="color: #6c6;"&gt;)&lt;/span&gt;,&lt;span style="color: #6c6;"&gt;(&lt;/span&gt;&lt;span style="color: #a52a2a;"&gt;:&lt;/span&gt;? int &lt;span style="color: #06c; font-weight: bold;"&gt;as&lt;/span&gt; newB&lt;span style="color: #6c6;"&gt;)&lt;/span&gt; &lt;span style="color: #a52a2a;"&gt;-&amp;gt;&lt;/span&gt; newA &lt;span style="color: #a52a2a;"&gt;+&lt;/span&gt; newB &lt;span style="color: #a52a2a;"&gt;|&amp;gt;&lt;/span&gt; box
            &lt;span style="color: #a52a2a;"&gt;|&lt;/span&gt; &lt;span style="color: #6c6;"&gt;(&lt;/span&gt;&lt;span style="color: #a52a2a;"&gt;:&lt;/span&gt;? decimal &lt;span style="color: #06c; font-weight: bold;"&gt;as&lt;/span&gt; newA&lt;span style="color: #6c6;"&gt;)&lt;/span&gt;,&lt;span style="color: #6c6;"&gt;(&lt;/span&gt;&lt;span style="color: #a52a2a;"&gt;:&lt;/span&gt;? decimal &lt;span style="color: #06c; font-weight: bold;"&gt;as&lt;/span&gt; newB&lt;span style="color: #6c6;"&gt;)&lt;/span&gt; &lt;span style="color: #a52a2a;"&gt;-&amp;gt;&lt;/span&gt; newA &lt;span style="color: #a52a2a;"&gt;+&lt;/span&gt; newB &lt;span style="color: #a52a2a;"&gt;|&amp;gt;&lt;/span&gt; box
            &lt;span style="color: #a52a2a;"&gt;|&lt;/span&gt; _ &lt;span style="color: #a52a2a;"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: #06c; font-weight: bold;"&gt;failwith&lt;/span&gt; &lt;span style="color: #3cb371;"&gt;"you can't add these together"&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Which is slightly verbose and has a type of "'a -&amp;gt; 'b -" obj' - I haven't been able to work out whether it's possible to create a generic function like this without needing to cast the result down to 'obj'.&lt;/p&gt;
&lt;p&gt;I thought it might be possible to get rid of the boxing by making use of the  &lt;a href="http://msdn.microsoft.com/en-us/library/dd233220(VS.100).aspx"&gt;downcast operator&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
You can also use the downcast operator to perform a dynamic type conversion. The following expression specifies a conversion down the hierarchy to a type that is inferred from program context.
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;I tried surrounding the 'newA + new B |&amp;gt; box' code with a call to 'downcast' but that just resulted in the following error message when trying to make use of the function:&lt;/p&gt;

&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="text"&gt;Value restriction. The value 'it' has been inferred to have generic type
	val it : '_a
Either define 'it' as a simple data term, make it a function with explicit arguments or, if you do not intend for it to be generic, add a type annotation.&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;I'd be intrigued to see if anyone has worked out how to do this as I'm out of ideas.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/MarkNeedham/~4/klsACB3dZWA" height="1" width="1"&gt;&lt;/img&gt;</description>
	<pubDate>Thu, 02 Jul 2009 13:10:19 +0000</pubDate>
<feedburner:origLink>http://feedproxy.google.com/~r/MarkNeedham/~3/klsACB3dZWA/</feedburner:origLink></item>
<item>
	<title>Andy Palmer: Tiny Types</title>
	<guid isPermaLink="false">http://andypalmer.com/?p=171</guid>
	<link>http://feedproxy.google.com/~r/PlanetTw/~3/pmnvEnrJEWg/</link>
	<description>&lt;p&gt;Mark Needham’s post on &lt;a href="http://www.markhneedham.com/blog/2009/03/10/oo-micro-types/"&gt;micro types&lt;/a&gt; sparked an idea in my head that recently came to fruition.&lt;br&gt;&lt;/br&gt;
I was pondering on the &lt;a href="http://bitbucket.org/testingreflections/narrativefixture/"&gt;Narrative Fixture&lt;/a&gt; code, and the fact that, although most of the internals are sensibly typed objects, at the &lt;a href="http://fitnesse.org"&gt;FitNesse&lt;/a&gt; layer, we do a lot of passing of strings.&lt;br&gt;&lt;/br&gt;
The idea (at least, my interpretation) with Tiny Types is that the string obviously means something, and that we can probably classify what that meaning is (we have a sensibly named variable for it, after all) , and so why not convert it to that meaningful thing as soon as possible.&lt;br&gt;&lt;/br&gt;
This has the nice effect of making some vague things (such as typing on collections) much more explicit.&lt;/p&gt;
&lt;p&gt;As an example, in the &lt;a href="http://bitbucket.org/testingreflections/narrativefixture/src/tip/src/org/jnarrate/fit/fixture/expertise/CastingDirector.java"&gt;Casting Director&lt;/a&gt; we have:&lt;/p&gt;
&lt;pre class="prettyprint"&gt;Map&amp;lt;String, ActorPlayingThe&amp;lt;?&amp;gt;&amp;gt; dressingRoom = new HashMap&amp;lt;String, ActorPlayingThe&amp;lt;?&amp;gt;&amp;gt;();
&lt;/pre&gt;
&lt;p&gt;and, after a little bit of refactoring, we end up with:&lt;/p&gt;
&lt;pre class="prettyprint"&gt;Map&amp;lt;CharacterName, ActorPlayingThe&amp;lt;?&amp;gt;&amp;gt; dressingRoom = new HashMap&amp;lt;CharacterName, ActorPlayingThe&amp;lt;?&amp;gt;&amp;gt;();
&lt;/pre&gt;
&lt;p&gt;Personally, I’m a fan of &lt;a href="http://blog.thinkrelevance.com/2008/4/23/refactoring-from-ceremony-to-essence"&gt;low ceremony, high essence languages&lt;/a&gt;, but while working in a high ceremony environment, we can leverage that ceremony to provide us with a nice summary of our thinking, ready for the next time we return to the code.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/andypalmer/blog/~4/RsWD3JAkcLY" height="1" width="1"&gt;&lt;/img&gt;</description>
	<pubDate>Thu, 02 Jul 2009 12:29:32 +0000</pubDate>
<feedburner:origLink>http://feedproxy.google.com/~r/andypalmer/blog/~3/RsWD3JAkcLY/</feedburner:origLink></item>
<item>
	<title>Sam Newman: Is #mongodb too good to be true? Where’s the catch? Ah - their website is powered by...</title>
	<guid isPermaLink="false">http://blog.magpiebrain.com/post/134040375</guid>
	<link>http://feedproxy.google.com/~r/PlanetTw/~3/KSrDPp13uHI/134040375</link>
	<description>Is #mongodb too good to be true? Where’s the catch? Ah - their website is powered by Confluence…&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Magpiebrain?a=k57KRYOB1C0:d3sFMBb-BqM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Magpiebrain?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Magpiebrain?a=k57KRYOB1C0:d3sFMBb-BqM:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Magpiebrain?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Magpiebrain?a=k57KRYOB1C0:d3sFMBb-BqM:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Magpiebrain?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
	<pubDate>Thu, 02 Jul 2009 08:27:01 +0000</pubDate>
<feedburner:origLink>http://feedproxy.google.com/~r/Magpiebrain/~3/k57KRYOB1C0/134040375</feedburner:origLink></item>
<item>
	<title>Mark Needham: Book Club: Logging - Release It (Michael Nygaard)</title>
	<guid isPermaLink="false">http://www.markhneedham.com/blog/?p=1394</guid>
	<link>http://feedproxy.google.com/~r/PlanetTw/~3/PgrrbDesOaM/</link>
	<description>&lt;p&gt;Our latest technical book club session was a discussion of the logging section in Michael Nygard's &lt;a href="http://www.pragprog.com/titles/mnee/release-it"&gt;Release It&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I recently listened to &lt;a href="http://se-radio.net/podcast/2009-05/episode-134-release-it-michael-nygard"&gt;an interview with Michael Nygard on Software Engineering Radio&lt;/a&gt; so I was interested in reading more of his stuff and &lt;a href="http://camswords.wordpress.com/"&gt;Cam&lt;/a&gt; suggested that the logging chapter would be an interesting one to look at as it's often something which we don't spend a lot of time thinking about on software development teams.&lt;/p&gt;
&lt;p&gt;These are some of my thoughts and our discussion of the chapter:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An idea which &lt;a href="http://pilchardfriendly.wordpress.com/"&gt;Nick&lt;/a&gt; introduced on a project I worked on last year was the idea of having a '&lt;strong&gt;SupportTeam&lt;/strong&gt;' class that could be used to do any logging of information that would be useful to the operations/support team that looked after our application once it was in production.
&lt;p&gt;This is an approach also suggested by Steve Freeman/Nat Pryce in &lt;a href="http://www.mockobjects.com/book/listening-to-the-tests.html"&gt;Growing Object Oriented software&lt;/a&gt; (in the 'Logging is a feature' section) and the idea is that we will then focus more on logging the type of information that is actually useful to them rather than just logging what we think is needed.&lt;/p&gt;
&lt;p&gt;One thing which &lt;a href="http://twitter.com/davcamer"&gt;Dave&lt;/a&gt; pointed out is that it's often difficult to get access to the operations team to try and get their requirements for the type of logging and monitoring they need and so often ends up being something that's done very late on. On projects I've worked on there has often been a story card for logging and I think this is a good way to go as they are a stakeholder of the system so logging shouldn't just be dealt with as a nice extra.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;Something which I hadn't considered until reading this book is the idea of &lt;strong&gt;making logs human readable and machine parseable&lt;/strong&gt; as well. The default format of most of the logging tools is not actually that useful when you're trying to scan through hundreds of lines of data and it was intriguing how a little indentation could improve this so dramatically with the added benefit of making it much easier to create a regular expression to find what you want. &lt;/li&gt;
&lt;li&gt;One thing I'm interested in understanding is &lt;strong&gt;how we work out what's too much logging and what's too little&lt;/strong&gt; since it seems that it seems that the answer to this question is fairly context sensitive. For example on a recent project we logged all unhandled exceptions that came from the system as well as any exceptions that happened when retrieving data from the service layer. In general the data we've had available has been enough to solve problems but we could probably have done more, just working out what would be useful doesn't seem obvious.&lt;/li&gt;
&lt;li&gt;I think it was &lt;a href="http://blog.m.artins.net/"&gt;Alex&lt;/a&gt; who pointed out that it's often useful to have an explicit &lt;strong&gt;step in the build to remove any debug logging&lt;/strong&gt; from the code so that it doesn't end up in production by mistake. This seems like a pretty neat idea although I haven't seen it done yet - it also leads towards the idea that logging is for the operations team which I think is correct although it is often suggested	 that logging is actually for developers since it is assumed that they would be the ones to eventually solve any problems that arise.&lt;/li&gt;
&lt;li&gt;The idea of having &lt;strong&gt;message codes for specific errors messages&lt;/strong&gt; seems like a really cool idea for allowing easy searching of log files - we've done this on some projects I've worked on and not on others. I guess the key here is to ensure we don't end up with too many different error codes otherwise it's just as confusing as not having them at all.&lt;/li&gt;
&lt;/ul&gt;
&lt;img src="http://feeds.feedburner.com/~r/MarkNeedham/~4/l4q76rPhLf4" height="1" width="1"&gt;&lt;/img&gt;</description>
	<pubDate>Thu, 02 Jul 2009 02:04:34 +0000</pubDate>
<feedburner:origLink>http://feedproxy.google.com/~r/MarkNeedham/~3/l4q76rPhLf4/</feedburner:origLink></item>
<item>
	<title>Dan North: The perils of estimation</title>
	<guid isPermaLink="false">http://dannorth.net/?p=117</guid>
	<link>http://feedproxy.google.com/~r/PlanetTw/~3/JMCwe9LQV6w/the-perils-of-estimation</link>
	<description>&lt;p&gt;&lt;/p&gt;&lt;p id="top"&gt;Business people want estimates. They want to know how much it’s going to cost them to get a solution, and they want to know how likely it is to come in on time and on budget. And of course quality is not negotiable.&lt;/p&gt;
	&lt;p&gt;Agile teams I encounter are at best nervous about estimates and at worst simply evasive. &lt;em&gt;“You don’t need estimates if you’re doing Agile,”&lt;/em&gt; they say. &lt;em&gt;“It will be ready when it’s done. We’re constantly adding value so we don’t need to commit to a date.”&lt;/em&gt;&lt;/p&gt;
	&lt;h3&gt;We’re missing the point of release planning&lt;/h3&gt;
	&lt;p&gt;My favourite exchange goes something like:&lt;/p&gt;
	&lt;p&gt;&lt;em&gt;“We’ve done an inception and broken down the entire project into stories and measured it, and it’s come in at 400 stories, estimated at 865 story points.”&lt;/em&gt;&lt;/p&gt;
	&lt;p&gt;&lt;em&gt;“865 &lt;strong&gt;what&lt;/strong&gt;?”&lt;/em&gt;&lt;/p&gt;
	&lt;p&gt;&lt;em&gt;“865 story points.”&lt;/em&gt;&lt;/p&gt;
	&lt;p&gt;&lt;em&gt;“So how big is a story point?”&lt;/em&gt;&lt;/p&gt;
	&lt;p&gt;&lt;em&gt;“We don’t know yet, we’ll let you know in a few weeks.”&lt;/em&gt;&lt;/p&gt;
	&lt;p&gt;At a governance and funding level the business could care less about story points. They don’t actually care about stories except that we shove them in their faces with our release plans. They care about solving a problem. They came to us and asked us a) how much will it cost to solve the problem, and b) how confident are we about that number?&lt;/p&gt;
	&lt;p&gt;So how do we approach that? We go through some sort of inception process that looks something like this:&lt;/p&gt;
	&lt;p&gt;1. Identify some &lt;a href="http://www.cooper.com/journal/2003/08/the_origin_of_personas.html"&gt;personas&lt;/a&gt;&lt;br&gt;&lt;/br&gt;
2. Identify some process flows&lt;br&gt;&lt;/br&gt;
3. Start breaking the flows down into stories&lt;br&gt;&lt;/br&gt;
4. &lt;em&gt;Lots and lots&lt;/em&gt; of stories&lt;br&gt;&lt;/br&gt;
5. &lt;em&gt;Lots and lots and lots and lots&lt;/em&gt; of stories&lt;br&gt;&lt;/br&gt;
6. Spike some technical ideas that came out of the stories&lt;br&gt;&lt;/br&gt;
7. Estimate the stories&lt;br&gt;&lt;/br&gt;
8. Roll up all the estimates and call that our project estimate&lt;/p&gt;
	&lt;p&gt;The part where we estimate the stories is a real chore (c’mon – we’re estimating &lt;em&gt;400 stories&lt;/em&gt; here), so we cut corners. We do a first pass as t-shirt sizes (small, medium, large) and then take a representative sample (sounds suitably scientific) and do a “detailed” estimate of those. This involves a bunch of people estimating lots of important-sounding metrics: minimum, likely and maximum size, clarity, volatility (eh?) and whatever else, and then multiply it up to provide a &lt;em&gt;WOOOOAAAAAHHHH!&lt;/em&gt; hang on a minute! What were we trying to do again?&lt;/p&gt;
	&lt;p&gt;All they wanted to know is: How long will it take, and how confident are you about that number?&lt;/p&gt;
	&lt;h3&gt;Redefining success – in a bad way&lt;/h3&gt;
	&lt;p&gt;By introducing a comprehensive story list – with or without the notion of story points – we have unwittingly reframed the project. The business started out by defining success as solving the problem, but now we have redefined success as &lt;em&gt;delivering this list of stories&lt;/em&gt;. However we frame it, that’s what the business will believe. The project will start and and the business stakeholders will start counting down the list of stories until you get to zero.&lt;/p&gt;
	&lt;p&gt;So now we have the worst of both the Agile and plan-driven worlds: the business expects delivery of a fine-grained list of requirements (whether we call it a Product Backlog or a Master Story List), and we have only taken a half-hearted attempt at it compared to the big up-front analysis we used to do. From here on we are on the back foot, constantly negotiating with the business to manage scope, when it’s our own fault they even care about the story-level detail. They see the story backlog and mentally turn it 90 degrees and think of it as a Gantt chart. Happy days!&lt;/p&gt;
	&lt;h3&gt;Back to project basics&lt;/h3&gt;
	&lt;p&gt;There are two observations to make here. Firstly the business wants &lt;em&gt;accuracy&lt;/em&gt; and we’re giving them &lt;em&gt;precision&lt;/em&gt;. If you tell me it will take 4.632 months and it takes 8 months, that’s worse than useless. If you tell me it takes “about six months” and it takes seven months, I should still be onto a winner. (If the return on investment is small enough that the extra month stops the proposition being viable, I’d have been better off investing in something else in the first place. Spending $60,000 to realise a return of $70,000 is risky to say the least.) I’m simplifying here of course because the real RoI varies over time, and its value may be particularly time-sensitive.&lt;/p&gt;
	&lt;p&gt;Secondly we know that requirements vary on an agile project over time, for good reason. Hopefully we are learning as we go, which means we will discover new requirements and decide others are no longer worth pursuing. If we assume about a third of the requirements will be delivered as described (this is generous in light of the Standish Chaos reports), another third will be delivered but with changes, and the last third won’t be delivered at all – but replaced by other features – then we have just wasted all that time and effort in the inception coming up with detailed, high-_precision_ data for a pile of stories we will never deliver.&lt;/p&gt;
	&lt;p&gt;To compound this, it turns out that &lt;em&gt;estimation is fractal&lt;/em&gt;. The more fine-grained you break down the requirements, the more “edges” you will discover. This means that the more detailed you estimate, the more the total will tend towards infinity, simply due to rounding errors and the fear factors that we multiply into fine grained estimates.&lt;/p&gt;
	&lt;h3&gt;Use the inception for &lt;em&gt;deliberate discovery&lt;/em&gt;&lt;/h3&gt;
	&lt;p&gt;So what should we be doing during an inception instead of doing the fine-grained story breakdown? Taking it back to first principles we simply want a rough idea of size and an understanding of certainty. There is uncertainty in everything, so the purpose of the inception is to understand the potential landscape we are delivering in.&lt;/p&gt;
	&lt;p&gt;When we start the inception we know nothing. We want to come out of the inception knowing as much as we could reasonably expect to learn in the time we have allocated. This discovery is along several axes: technical areas such as the technology stack, potential architectures, integration points and external services; domain questions such as how well we understand the problem and whether it is more about research than solving a clearly-articulated problem; people and process challenges like the path to production, identification of stakeholders, how co-located or distributed the team is and how much of this kind of delivery they have done before. For some of these areas, breaking broad requirements into finer-grained detail is a great way to discover more. But not for all of them, and certainly not at the expense of other discovery activities.&lt;/p&gt;
	&lt;p&gt;There are good arguments from both the Kanban and Real Options folks about deferring the decomposition of feature sets into features and stories until the “last responsible moment”. This means the information is freshest and you aren’t holding an inventory of atrophying information. You might want a couple of weeks of story-level detail – to promote a consistent flow and avoid starving your process – and beyond that a few features identified that will be broken down into the next candidate stories, but beyond that you shouldn’t be worrying about that level of granularity. The experienced members of the team should be estimating feature sets of the order of person-weeks (or better yet, pair-weeks), not going down to the level of individual pair-days. The less experienced team members should be using the exercise as a learning opportunity.&lt;/p&gt;
	&lt;p&gt;So please, let’s move beyond this cargo cult approach to inception where we slavishly trot out hundreds of stories with their associated estimates, and remember that we are engaging in a process of &lt;em&gt;deliberate discovery&lt;/em&gt;.&lt;/p&gt;
	&lt;p&gt;Its purpose is firstly to convey to our stakeholders and ourselves an order-of-magnitude sense of size – to quote the Pragmatic Programmers, is it larger than a breadbox and smaller than a house? – and secondly to present the risk landscape in which to understand that estimate.&lt;/p&gt;</description>
	<pubDate>Wed, 01 Jul 2009 22:50:38 +0000</pubDate>
<feedburner:origLink>http://dannorth.net/2009/07/the-perils-of-estimation</feedburner:origLink></item>
<item>
	<title>Pankaj Nakhat: My Childhood</title>
	<guid isPermaLink="false">http://www.pankajnakhat.com/uncategorized/07/agile-testing-functional-testing/</guid>
	<link>http://feedproxy.google.com/~r/PlanetTw/~3/HPKx_KSGVhc/</link>
	<description>&lt;p&gt;&lt;img src="http://www.pankajnakhat.com/wp-content/uploads/2009/07/Picture-003-300x237.jpg" title="Picture 003" height="237" width="300" alt="Picture 003" class="alignnone size-medium wp-image-102"&gt;&lt;/img&gt;&lt;/p&gt;</description>
	<pubDate>Wed, 01 Jul 2009 21:25:15 +0000</pubDate>
<feedburner:origLink>http://www.pankajnakhat.com/uncategorized/07/childhood/</feedburner:origLink></item>
<item>
	<title>Sam Newman: Just watched: #Yellowstone on BBC4. Simply stunning - rivals Planet Earth for beauty. No idea why...</title>
	<guid isPermaLink="false">http://blog.magpiebrain.com/post/133719791</guid>
	<link>http://feedproxy.google.com/~r/PlanetTw/~3/dYMBazXIZyE/133719791</link>
	<description>Just watched: #Yellowstone on BBC4. Simply stunning - rivals Planet Earth for beauty. No idea why it’s hidden on BBC4…&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Magpiebrain?a=tgQzet8dodM:uysyhglvZCA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Magpiebrain?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Magpiebrain?a=tgQzet8dodM:uysyhglvZCA:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Magpiebrain?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Magpiebrain?a=tgQzet8dodM:uysyhglvZCA:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Magpiebrain?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
	<pubDate>Wed, 01 Jul 2009 21:12:53 +0000</pubDate>
<feedburner:origLink>http://feedproxy.google.com/~r/Magpiebrain/~3/tgQzet8dodM/133719791</feedburner:origLink></item>
<item>
	<title>Martin Fowler: RequestStreamMap</title>
	<guid isPermaLink="false">http://martinfowler.com/bliki/RequestStreamMap.html</guid>
	<link>http://feedproxy.google.com/~r/PlanetTw/~3/ZZUbVIWD2NA/RequestStreamMap.html</link>
	<description>&lt;p&gt;Hang around my colleagues at ThoughtWorks and you soon get the
  impression that the only good Enterprise Service Bus (ESB) is a dead
  ESB. Jim Webber refers to them as Egregious Spaghetti Boxes. So it's
  not uncommon to hear tales of attempts to get them out of systems
  that don't need them.&lt;/p&gt;&lt;p&gt;Battle was joined at one client and it brought to mind my younger
  days playing D&amp;amp;D. Webber swings but misses as the ESB is AC 2,
  Evan gets a hit and rolls 2d8 for 6 damage. Erik finally kills it
  by casting "&lt;a href="http://erik.doernenburg.com/2009/07/making-esb-pain-visible/"&gt;Summon Request Stream Map&lt;/a&gt;".&lt;/p&gt;&lt;p&gt;So what was Erik's
  decisive spell? Essentially the idea was to take a simple request
  and show how the data for the request and response made their way
  through the layers of the application. Erik printed out all the code
  that you needed to read to understand how this would work - which
  ran to several pages. He also produced this diagram.&lt;/p&gt;&lt;img src="http://erik.doernenburg.com/wp-content/uploads/2009/06/low-level-esb-600x533.png"&gt;&lt;/img&gt;&lt;p&gt;It's currently fashionable in agile circles to do Value Stream
  Mapping as a way to uncover waste in a software development
  process. I think of this as a request stream map because it similarly
  takes a request and shows how it moves through the layers allowing
  us to visualize what's going on and think about the cost and value of
  the layers.&lt;/p&gt;&lt;p&gt;Layering is an essential tool for building software
  applications. But like most essential things in life, excess can
  be almost as much of a problem as too little. A visualization like
  this (or the multiple pages of code) can help you find where "just
  enough" is.&lt;/p&gt;&lt;p&gt;One hazard, however. If you do need to transform data from one
  form to another, it's usually better to a few little
  transformations than one big transformation. You want to avoid
  unnecessary transformations not compress the ones you need.&lt;/p&gt;</description>
	<pubDate>Wed, 01 Jul 2009 18:58:00 +0000</pubDate>
<feedburner:origLink>http://martinfowler.com/bliki/RequestStreamMap.html</feedburner:origLink></item>
<item>
	<title>Sam Newman: Just won on ebay: Nikon FM3a. Might have to freeze myself and get a friend to thaw me out for its...</title>
	<guid isPermaLink="false">http://blog.magpiebrain.com/post/133672402</guid>
	<link>http://feedproxy.google.com/~r/PlanetTw/~3/zg2TwxVaDMI/133672402</link>
	<description>Just won on ebay: Nikon FM3a. Might have to freeze myself and get a friend to thaw me out for its arrival date. Flawless plan.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Magpiebrain?a=vQZKMsGEPQ4:2Z5BD0cmQdU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Magpiebrain?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Magpiebrain?a=vQZKMsGEPQ4:2Z5BD0cmQdU:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Magpiebrain?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Magpiebrain?a=vQZKMsGEPQ4:2Z5BD0cmQdU:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Magpiebrain?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
	<pubDate>Wed, 01 Jul 2009 18:48:18 +0000</pubDate>
<feedburner:origLink>http://feedproxy.google.com/~r/Magpiebrain/~3/vQZKMsGEPQ4/133672402</feedburner:origLink></item>
<item>
	<title>Sam Newman: Just read: #D-Day by Antony Beevor. By turns harrowing, entertaining and insightful. Recommended.</title>
	<guid isPermaLink="false">http://blog.magpiebrain.com/post/133672400</guid>
	<link>http://feedproxy.google.com/~r/PlanetTw/~3/FRtYPjslkFQ/133672400</link>
	<description>Just read: #D-Day by Antony Beevor. By turns harrowing, entertaining and insightful. Recommended.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Magpiebrain?a=GYlUxw9pwn4:jR4u-7rzOWI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Magpiebrain?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Magpiebrain?a=GYlUxw9pwn4:jR4u-7rzOWI:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Magpiebrain?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Magpiebrain?a=GYlUxw9pwn4:jR4u-7rzOWI:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Magpiebrain?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
	<pubDate>Wed, 01 Jul 2009 18:48:18 +0000</pubDate>
<feedburner:origLink>http://feedproxy.google.com/~r/Magpiebrain/~3/GYlUxw9pwn4/133672400</feedburner:origLink></item>
<item>
	<title>Sam Newman: Now reading: Agile Estimation and Planning by Mike Cohn. Off to a dry start - I hope it picks...</title>
	<guid isPermaLink="false">http://blog.magpiebrain.com/post/133672399</guid>
	<link>http://feedproxy.google.com/~r/PlanetTw/~3/aVYZ0qGjEE4/133672399</link>
	<description>Now reading: Agile Estimation and Planning by Mike Cohn. Off to a dry start - I hope it picks up…&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Magpiebrain?a=0Wm20IODSyo:2F6MATU--_E:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Magpiebrain?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Magpiebrain?a=0Wm20IODSyo:2F6MATU--_E:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Magpiebrain?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Magpiebrain?a=0Wm20IODSyo:2F6MATU--_E:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Magpiebrain?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
	<pubDate>Wed, 01 Jul 2009 18:48:18 +0000</pubDate>
<feedburner:origLink>http://feedproxy.google.com/~r/Magpiebrain/~3/0Wm20IODSyo/133672399</feedburner:origLink></item>
<item>
	<title>John Hume: A Quick Look at Azure, Microsoft's Cloud</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-23529072678094516.post-687741166758297982</guid>
	<link>http://feedproxy.google.com/~r/PlanetTw/~3/NCLCuIIOcXA/quick-look-at-azure-microsofts-cloud.html</link>
	<description>&lt;p&gt;Last week at a &lt;a href="http://www.thoughtworks.com/"&gt;ThoughtWorks&lt;/a&gt; home-office gathering in New York we had a presentation by one of Microsoft's Architecture Evangelists about their in-the-works cloud offering, &lt;a href="http://www.microsoft.com/azure/default.mspx"&gt;Azure&lt;/a&gt;. I have to say I was pretty impressed. (If not for the whole Windows thing, I'd probably be trying it out instead of writing about it right now. If you aren't as bothered by Windows as I am, &lt;a href="http://www.microsoft.com/azure/register.mspx"&gt;you can register and try it yourself&lt;/a&gt;.) Here are some fairly random impressions, mostly based on comparison to the two other best-known cloud contenders.&lt;/p&gt;

&lt;p&gt;Azure conceptually leans more towards &lt;a href="http://code.google.com/appengine/"&gt;Google AppEngine&lt;/a&gt;'s "scale me up; scale me down; hide the details" approach than &lt;a href="http://aws.amazon.com/ec2/"&gt;Amazon EC2&lt;/a&gt;'s easy-to-manage-infrastructure-as-a-service model, though it currently sits somewhere between them. There's not (yet, at least) any automatic scaling up and down, which surprised me. However what you manually configure is just the number of instances of each application, which is far simpler than manually spinning up new instances of EC2 images and getting them into your cluster (or what-have-you). (Although if you've set up your infrastructure right, your EC2 scaling activities could be just as simple. EC2 just gives you the freedom to do it badly.)&lt;/p&gt;

&lt;p&gt;There are two-and-a-half types of application: web apps, worker apps, and web+worker apps. The worker concept is very cool and not something you can do with AppEngine. (The closest thing is their &lt;a href="http://code.google.com/appengine/docs/java/config/cron.html"&gt;support for scheduled tasks&lt;/a&gt;, but these are limited to scheduled URL hits no more often than once a minute with the same restrictions as a normal web request.) Apps all run on something pretty close to the normal .NET framework (minus normal file system access and presumably some other areas--I forgot to ask about threading.)&lt;/p&gt;

&lt;p&gt;There are three kinds of storage.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;A &lt;strong&gt;file-system-like BLOB storage&lt;/strong&gt; API, which involves saving individual blocks and then telling the system in what order to stitch them together. It seemed clunky, but I could see writing a simple abstraction over it for small stuff (where you'd usually only need one block) and for large stuff maybe being able to take advantage of already having some blocks uploaded when something gets interrupted and can resume later.&lt;/li&gt;
  &lt;li&gt;A &lt;strong&gt;BigTable-like "table" storage&lt;/strong&gt; API. It isn't as rich as AppEngine's BigTable-backed Datastore in that entity properties are restricted to very simple types (no lists, for example) and there's no built-in support for relationships of any kind (even the simple hierarchy of Datastore). (Note there's nothing to stop you from storing keys of other entities as property values and rolling your own awkward relationships.) Similar to Datastore on AppEngine, you have to think about how you want your data partitioned and make some under-informed guesses about slow queries across multiple partitions vs parallel queries each in their own partition. (On Azure, the key for each entity includes an app-generated token naming the partition in which it should reside, which is a bit simpler than Datastore's &lt;a href="http://code.google.com/appengine/docs/java/datastore/transactions.html#Using_Transactions"&gt;parentage-based entity groups&lt;/a&gt;.) The &lt;a href="http://msdn.microsoft.com/en-us/library/dd894038.aspx"&gt;story on transactions&lt;/a&gt; (being limited to a single entity group) seems to be similar as well. There's also currently no indexing by anything other than key, though it sounded like they'll allow you to add at least one additional index per table before they go proper-live.&lt;/li&gt;
  &lt;li&gt;Most interestingly, &lt;strong&gt;damn-near plain old &lt;a href="http://www.microsoft.com/azure/sql.mspx"&gt;SQL Server&lt;/a&gt; storage&lt;/strong&gt; in the form of SQL Data Services, with just about every feature of MS SQL Server any normal application would use (except distributed transactions). I believe this is a separate service that you'll need to sign up for and eventually pay for separately. Regardless, it's a key element of the offering, because it provides a huge boost to the suggestion that you can migrate existing .NET applications into the cloud.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are also &lt;strong&gt;persistent queues&lt;/strong&gt;, which web apps can use to communicate to worker apps asynchronously. (I guess this qualifies as a fourth kind of storage.) They feature guaranteed delivery (with possible repeated delivery) of messages. This is very cool and not something AppEngine offers. (Even if you rolled your own queue-ish thing in datastore, there's no facility to consume messages intelligently.)&lt;/p&gt;

&lt;p&gt;There are REST APIs (and SOAP as well, I think) for just about everything, so you have a lot of options for architectures (using heterogeneous technologies) that run partly on-premisis and partly in the Azure cloud.&lt;/p&gt;

&lt;p&gt;There are a bunch of other services you can hook into, including &lt;a href="http://www.microsoft.com/azure/netservices.mspx"&gt;".NET Services"&lt;/a&gt; (low-level technical stuff including a Service Bus, Access Control, and a Workflow Service) and &lt;a href="http://dev.live.com/"&gt;"Live Services"&lt;/a&gt; (higher-level end-user-meaningful services such as Contacts, Windows Live ID, and assorted Bing stuff).&lt;/p&gt;

&lt;p&gt;There's also, surprisingly, the ability to run &lt;strong&gt;unmanaged code&lt;/strong&gt; in your .NET application, AND some form of &lt;strong&gt;support for non-.NET stuff&lt;/strong&gt; via IIS's FastCGI support.&lt;/p&gt;

&lt;p&gt;Anyway, it looks like it'll be a compelling offering, competitive with EC2-hosted Windows, and thanks to SQL Data Services much closer to allowing you to put a normal .NET web app into the cloud than AppEngine can do for Java web apps. For any organization willing to trust Microsoft with its infrastructure, Azure is a good reason to be excited. For the rest of the world, carefully executed EC2 still looks like the best bet for the Enterprise in the cloud.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img src="https://blogger.googleusercontent.com/tracker/23529072678094516-687741166758297982?l=elhumidor.blogspot.com" height="1" width="1"&gt;&lt;/img&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ElHumidor/~4/NCLCuIIOcXA" height="1" width="1"&gt;&lt;/img&gt;</description>
	<pubDate>Wed, 01 Jul 2009 15:17:02 +0000</pubDate>
	<author>noreply@blogger.com (John Hume)</author>
<feedburner:origLink>http://elhumidor.blogspot.com/2009/07/quick-look-at-azure-microsofts-cloud.html</feedburner:origLink></item>
<item>
	<title>John Hume: Clojure on Google AppEngine</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-23529072678094516.post-8683656436271262917</guid>
	<link>http://feedproxy.google.com/~r/PlanetTw/~3/CUOnO4ZrvOs/clojure-on-google-appengine.html</link>
	<description>&lt;p&gt;The release of Java support for Google AppEngine means more than just Java: it means lots of cool JVM languages! My personal favorite is &lt;a href="http://clojure.org/"&gt;Clojure&lt;/a&gt;, so when I and several colleagues got an opportunity to try out a pre-release version (thanks to a partnership between Google and ThoughtWorks) I immediately started trying it out. It turns out to be pretty easy and pretty great.&lt;/p&gt;

&lt;p&gt;I'm going to walk you through using Clojure on Google AppEngine by stepping you through the creation of a Clojure/&lt;a href="http://github.com/weavejester/compojure/tree"&gt;Compojure&lt;/a&gt; version of the Guestbook application from the Getting Started section of the AppEngine docs. As we go I'll introduce some bits of &lt;a href="http://github.com/duelinmarkers/appengine-clj/tree/master"&gt;appengine-clj&lt;/a&gt;, a library I extracted along the way to keep anything that felt like boiler-plate code out of my app.&lt;/p&gt;

&lt;p&gt;First you'll need to &lt;a href="http://appengine.google.com/"&gt;sign up&lt;/a&gt; (if you haven't already) and download the SDK.&lt;/p&gt;

&lt;h2&gt;Creating Your Application&lt;/h2&gt;

&lt;p&gt;To start, create a project directory and the basic project directory structure documented in the getting started section of Google's documentation. Here's an overview of what to create and what will go where.&lt;/p&gt;

&lt;pre class="textmate-source"&gt;project-root/
  src/
    [Clojure source code]
  war/
    [static files]
    WEB-INF/
      [config files]
      classes/
        [compiled classes from ../../src]
      lib/
        [jar dependencies]&lt;/pre&gt;

&lt;p&gt;Copy clojure.jar, clojure-contrib.jar, and compojure.jar into WEB-INF/lib. You'll also need to add appengine-api-XXX.jar from the SDK. I'm using fairly recent trunk versions of Clojure, clojure-contrib, and Compojure. (The easiest way to make sure you have compatible versions of these is to pull the latest Compojure source from github and then download their deps.zip and build Compojure against that.) If you want to use appengine-clj you can build it yourself from &lt;a href="http://github.com/duelinmarkers/appengine-clj/tree/master"&gt;source&lt;/a&gt; or &lt;a href="http://cloud.github.com/downloads/duelinmarkers/appengine-clj/appengine-clj.jar"&gt;grab a prebuilt jar from the downloads section on Github&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Hello, World!&lt;/h3&gt;

&lt;p&gt;The entry point to your application will be a servlet class. Create a Clojure source file in your src directory and include a :gen-class directive to extend HttpServlet. Use Compojure's &lt;code&gt;defroutes&lt;/code&gt; and &lt;code&gt;defservice&lt;/code&gt; to create a HelloWorld.&lt;/p&gt;

src/guestbook/servlet.clj
&lt;pre class="textmate-source"&gt;(ns guestbook.servlet
  (:gen-class :extends javax.servlet.http.HttpServlet)
  (:use compojure.http compojure.html))

(defroutes guestbook-app
  (GET "/"
    (html [:h1 "Hello, World!"])))

(defservice guestbook-app)&lt;/pre&gt;

&lt;p&gt;&lt;code&gt;defroutes&lt;/code&gt; above creates a routing function that will respond to an HTML GET for the path "/", and the html function converts vectors to a string of HTML. If you're not familiar with Compojure, start &lt;a href="http://en.wikibooks.org/wiki/Compojure/Getting_Started"&gt;here on the Compojure wiki&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Next create a web.xml with a servlet-mapping sending /* to your servlet class. Since Compojure handles URL routing, your application will have just this one mapping.&lt;/p&gt;

war/WEB-INF/web.xml
&lt;pre class="textmate-source"&gt;&amp;lt;?xml version="1.0" encoding="ISO-8859-1"?&amp;gt;
&amp;lt;web-app 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    version="2.5"&amp;gt;
  &amp;lt;display-name&amp;gt;Clojure Guestbook&amp;lt;/display-name&amp;gt;
  &amp;lt;servlet&amp;gt;
    &amp;lt;servlet-name&amp;gt;gb&amp;lt;/servlet-name&amp;gt;
    &amp;lt;servlet-class&amp;gt;guestbook.servlet&amp;lt;/servlet-class&amp;gt;
  &amp;lt;/servlet&amp;gt;
  &amp;lt;servlet-mapping&amp;gt;
    &amp;lt;servlet-name&amp;gt;gb&amp;lt;/servlet-name&amp;gt;
    &amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt;
  &amp;lt;/servlet-mapping&amp;gt;
&amp;lt;/web-app&amp;gt;&lt;/pre&gt;

&lt;p&gt;Create an appengine-web.xml, putting your application ID into the &lt;code&gt;application&lt;/code&gt; element.&lt;/p&gt;

war/WEB-INF/appengine-web.xml
&lt;pre class="textmate-source"&gt;&amp;lt;appengine-web-app xmlns="http://appengine.google.com/ns/1.0"&amp;gt;
  &amp;lt;application&amp;gt;[your application ID]&amp;lt;/application&amp;gt;
  &amp;lt;version&amp;gt;1&amp;lt;/version&amp;gt;
  &amp;lt;static-files /&amp;gt;
  &amp;lt;resource-files /&amp;gt;
&amp;lt;/appengine-web-app&amp;gt;&lt;/pre&gt;

&lt;p&gt;Create an ant build.xml file that compiles your application to the classes directory.&lt;/p&gt;

build.xml
&lt;pre class="textmate-source"&gt;&amp;lt;project name="guestbook-clj" basedir="." default="compile"&amp;gt;
  ... here you'll need to define project.classpath ...
  ... see GitHub for the full working example file ...
  &amp;lt;target name="compile" depends="..."&amp;gt;
    &amp;lt;java classname="clojure.lang.Compile" classpathref="project.classpath" failonerror="true"&amp;gt;
      &amp;lt;classpath path="${src.dir}" /&amp;gt;
      &amp;lt;sysproperty key="clojure.compile.path" value="${classes.dir}" /&amp;gt;
      &amp;lt;arg value="guestbook.servlet" /&amp;gt;
    &amp;lt;/java&amp;gt;
  &amp;lt;/target&amp;gt;
&amp;lt;/project&amp;gt;&lt;/pre&gt;

&lt;p&gt;I've left out some of the details, but you can &lt;a href="http://github.com/duelinmarkers/guestbook-clj/tree/master/build.xml"&gt;find a full working version on Github&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;At this point you should be able to run your "Hello, World" iteration of the application locally using the development appserver and deploy to appspot using the appcfg executable (or an Ant task if you prefer). Now it's just a matter of building your application using the tools Google AppEngine, Clojure, and Compojure make available to you.&lt;/p&gt;

&lt;h3&gt;The User Service&lt;/h3&gt;

&lt;p&gt;AppEngine has a simple API for dealing with user accounts. Let's greet logged in users by name. You'll need to import &lt;code&gt;com.google.appengine.api.users.UserServiceFactory&lt;/code&gt;.&lt;/p&gt;

&lt;pre class="textmate-source"&gt;(ns ...
  (:import
    (com.google.appengine.api.users UserServiceFactory)))

...
  (GET "/"
    (let [user-service (UserServiceFactory/getUserService)
          user (.getCurrentUser user-service)]
      (html [:h1 "Hello, " (if user (.getNickname user) "World") "!"]))))&lt;/pre&gt;

&lt;p&gt;But we have to let users log in to see this work. The UserService also exposes methods for creating login and logout URLs.&lt;/p&gt;

&lt;pre class="textmate-source"&gt;...
  (GET "/"
    (let [user-service (UserServiceFactory/getUserService)
          user (.getCurrentUser user-service)]
      (html
        [:h1 "Hello, " (if user (.getNickname user) "World") "!"]
        [:p (link-to (.createLoginURL user-service "/") "sign in")]
        [:p (link-to (.createLogoutURL user-service "/") "sign out")]))))&lt;/pre&gt;

&lt;p&gt;Now you should be able to log into your application and be greeted by name. On the dev appserver, the login page will let you provide any username and check a box to indicate whether you should be logged in as an administrator for your application. On the appspot servers, you'll get a proper-looking Google Accounts login page. The argument to &lt;code&gt;createLoginURL&lt;/code&gt; and &lt;code&gt;createLogoutURL&lt;/code&gt; is the path or URL the user should be redirected to after logging in or out.&lt;/p&gt;

I've extracted the basic user-lookup calls into a Ring middleware function and put it into the &lt;a href="http://github.com/duelinmarkers/appengine-clj/tree/master/src/appengine_clj/users.clj"&gt;appengine-clj.users&lt;/a&gt; namespace in appengine-clj. Here's what our servlet looks like using that.

&lt;pre class="textmate-source"&gt;(ns guestbook.servlet
  ... you no longer need to import UserServiceFactory ...
  (:require
    [appengine-clj.users :as users]))

(defroutes guestbook-app
  (GET "/"
    (let [user-info (request :appengine-clj/user-info)
          user (user-info :user)]
      (html
        [:h1 "Hello, " (if user (.getNickname user) "World") "!"]
        [:p (link-to (.createLoginURL (user-info :user-service) "/") "sign in")]
        [:p (link-to (.createLogoutURL (user-info :user-service) "/") "sign out")]))))

(defservice (users/wrap-with-user-info guestbook-app))&lt;/pre&gt;

&lt;p&gt;It's about the same amount of code, it just looks a little more clojurey now. (I'm sorry: that's not a word.)&lt;/p&gt;

&lt;h3&gt;Datastore&lt;/h3&gt;

&lt;p&gt;Next let's collect guestbook entries and put them in the Datastore. AppEngine for Java has support for a couple of standard Java persistence APIs, JDO and JPA. But we'll use the lower-level datastore API, which seems a better fit for a dynamic language like Clojure (not to mention it doesn't require us to implement Java classes to persist).&lt;/p&gt;

&lt;p&gt;The Java API for datastore is pretty simple, but conceptually it's different enough from a SQL database that it definitely takes some getting used to. (I for one am still figuring it out.)&lt;/p&gt;

&lt;p&gt;Here's the sixty-second rundown of the bare essentials. The basic unit of persistence is the &lt;dfn&gt;Entity&lt;/dfn&gt;, which has a Map of String-keyed &lt;dfn&gt;properties&lt;/dfn&gt;. An Entity has a &lt;dfn&gt;kind&lt;/dfn&gt;, which is a string denoting the type. (But keep in mind there's no schema here, so you can give any entity any properties.) An Entity is identified by a &lt;dfn&gt;Key&lt;/dfn&gt; which is something more than a normal DBMS identifier because it can hold an Entity's association with a parent Entity. Besides using the Key, you can retrieve Entities with a &lt;dfn&gt;Query&lt;/dfn&gt;, which searches either a single kind of entity or descendent entities of a single ancestor (or both, depending on which constructor you use) and can apply simple filtering and sorting.&lt;/p&gt;

&lt;p&gt;The natural Clojurized form of an Entity seemed to be a map, so what I've started pulling out into &lt;a href="http://github.com/duelinmarkers/appengine-clj/tree/master/src/appengine_clj/datastore.clj"&gt;appengine-clj.datastore&lt;/a&gt; is functions that allow Clojure code to work with an immutable map of keyword-keyed properties (plus &lt;code&gt;:key&lt;/code&gt; and &lt;code&gt;:kind&lt;/code&gt;) and have the library take care of translating into Entity objects. Currently there are just create and find methods, since that was all the basic guestbook needed. (But you know that Internet. I'll need a delete function before the week is out.)&lt;/p&gt;

&lt;p&gt;Using appengine-clj.datastore, functions for creating and retrieving guestbook greetings are extremely simple.&lt;/p&gt;

&lt;pre class="textmate-source"&gt;(ns guestbook.greetings
  (:require [appengine-clj.datastore :as ds])
  (:import (com.google.appengine.api.datastore Query)))

(defn create [content author]
  (ds/create {:kind "Greeting" :author author :content content :date (java.util.Date.)}))

(defn find-all []
  (ds/find-all (doto (Query. "Greeting") (.addSort "date"))))&lt;/pre&gt;

&lt;p&gt;Note the creation of a &lt;code&gt;com.google.appengine.api.datastore.Query&lt;/code&gt; (in &lt;code&gt;find-all&lt;/code&gt;) that pulls back all Greetings and orders them by date. I've considered a couple of approaches for cleaning up creation of a query from Clojure, but I haven't decided between something that looks fairly idiomatic vs something that reads just like GQL. For the time being I'm sticking with the Java-interop style since even that is nicely terse and readable. Take a look at &lt;a href="http://github.com/duelinmarkers/appengine-clj/tree/master/test/appengine_clj/datastore_test.clj"&gt;the tests for appengine-clj.datastore&lt;/a&gt; for more examples.&lt;/p&gt;

&lt;p&gt;Speaking of which, this is a good time to mention that writing tests for datastore code is easy with &lt;a href="http://github.com/duelinmarkers/appengine-clj/tree/master/src/appengine_clj/test_utils.clj"&gt;appengine-clj.test-utils&lt;/a&gt;, which provides functions to set up an in-memory datastore. The &lt;code&gt;dstest&lt;/code&gt; macro used there creates a fresh datastore for each test. If you're using a different testing framework or prefer different scoping, you can call &lt;code&gt;ds-setup&lt;/code&gt; and &lt;code&gt;ds-teardown&lt;/code&gt; yourself. (Do keep in mind that this is the development version of datastore, so we'll all need to keep an eye out for differences between that and the real Datastore service.)&lt;/p&gt;

&lt;h3&gt;HTML and Form Handling&lt;/h3&gt;

&lt;p&gt;Now that we've got our persistence straight (&lt;a href="http://github.com/duelinmarkers/guestbook-clj/tree/master/test/guestbook/greetings_test.clj"&gt;and tested&lt;/a&gt;), let's create a UI so users can sign the guestbook. At this point it's just plain Compojure code. We'll create one route to show the guestbook and a form to enter a greeting at "/" and another route for saving the greeting with a POST to "/sign".&lt;/p&gt;

&lt;p&gt;Here's our function for signing the guestbook.&lt;/p&gt;

&lt;pre class="textmate-source"&gt;(defn sign-guestbook [params user]
  (greetings/create (params :content) (if user (.getNickname user)))
  (redirect-to "/"))&lt;/pre&gt;

&lt;p&gt;You can see there's very little to it. It takes the request parameters and a user, calls our &lt;code&gt;greetings/create&lt;/code&gt; function, and redirects back to the guestbook.&lt;/p&gt;

&lt;p&gt;The function for showing the guestbook is quite a bit more to swallow, since it includes our entire user interface.&lt;/p&gt;

&lt;pre class="textmate-source"&gt;(defn show-guestbook [{:keys [user user-service]}]
  (let [all-greetings (greetings/find-all)]
    (html [:html [:head [:title "Guestbook"]]
      [:body
        (if user
          [:p "Hello, " (.getNickname user) "! (You can "
            (link-to (.createLogoutURL user-service "/") "sign out")
            ".)"]
          [:p "Hello! (You can "
            (link-to (.createLoginURL user-service "/") "sign in")
            " to include your name with your greeting when you post.)"])
        (if (empty? all-greetings)
          [:p "The guestbook has no messages."]
          (map (fn [greeting]
            [:div
              [:p (if (greeting :author) [:strong (greeting :author)] "An anonymous guest") " wrote:"]
              [:blockquote (h (greeting :content))]])
            all-greetings))
        (form-to [POST "/sign"]
          [:div (text-area "content" "")]
          [:div (submit-button "Post Greeting")])]])))&lt;/pre&gt;

&lt;p&gt;It takes the user-info map, which it destructures to grab the user and UserService. It calls our &lt;code&gt;greetings/find-all&lt;/code&gt; function to get the items to show and then uses Compojure's html helpers to create the document. For any real application you'd want to break the view down into smaller pieces to avoid such a huge nested chunk of vectors (or consider using another templating library like &lt;a href="http://github.com/cgrand/enlive/tree/master"&gt;Enlive&lt;/a&gt;), but for this example I think it's easier to understand what's going on with the whole page in one function.&lt;/p&gt;

&lt;p&gt;Finally here are the routes that wire it all together.&lt;/p&gt;

&lt;pre class="textmate-source"&gt;(defroutes guestbook-app
  (POST "/sign"
    (sign-guestbook params ((request :appengine-clj/user-info) :user)))
  (GET "/"
    (show-guestbook (request :appengine-clj/user-info))))&lt;/pre&gt;

&lt;p&gt;Here I'm using the &lt;code&gt;:appengine-clj/user-info&lt;/code&gt; map that's been assoc'd to the request by the Ring middleware.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://github.com/duelinmarkers/guestbook-clj/tree/master/src/guestbook/servlet.clj"&gt;See the entire servlet file on GitHub&lt;/a&gt;, including some enhancements for styling and to see some other code to exercise Clojure features on AppEngine.&lt;/p&gt;

&lt;h2&gt;The Big Caveat&lt;/h2&gt;

&lt;p&gt;Two unusual aspects of the Google AppEngine environment create pretty major constraints on your ability to write idiomatic Clojure.&lt;/p&gt;

&lt;p&gt;First, an AppEngine application runs in a security context that doesn't permit spawning threads, so you won't be able to use Agents, the clojure.parallel library, or Futures.&lt;/p&gt;

&lt;p&gt;Second, one of the most exciting features of AppEngine is that your application will be deployed on Google's huge infrastructure, dynamically changing its footprint depending on demand. That means you'll potentially be running on many JVMs at once. Unfortunately this is a strange fit for Clojure's concurrency features, which are most useful when you have precise control over what lives on what JVM (and simplest when everything runs on one JVM). Since shared references (Vars, Refs, and Atoms) are shared only within a single JVM, they are not suitable for many of their typical uses when running on AppEngine. You should still use Clojure's atomic references (and their associated means of modification) for any state that it makes sense to keep global per-JVM, since there may be multiple threads serving requests in one JVM. But remember JVMs will come and go during the lifetime of your application, so anything truly global should go in the Datastore or Memcache.&lt;/p&gt;

&lt;h2&gt;More to Come&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;I'll try and expand on this in the future with more write-ups, including a discussion of special handling for static files (which as of the version of the SDK I'm using works great on the appspot servers even with a /* servlet mapping but not on the local dev appserver, where servlet mappings win out over static files).&lt;/li&gt;
  &lt;li&gt;If you'll &lt;a href="http://guestbook-clj.appspot.com/"&gt;sign my silly little guestbook on the appspot servers&lt;/a&gt;, I'd like to publish information on how many requests I got and how they performed.&lt;/li&gt;
  &lt;li&gt;Google also provides Java APIs for caching, image manipulation, making HTTP requests, and email. I haven't even scratched the surface of those yet.&lt;/li&gt;
  &lt;li&gt;With fresh support in AppEngine for scheduled tasks and upcoming support for task queues, there's more Clojure fun to be had.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Enjoy!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img src="https://blogger.googleusercontent.com/tracker/23529072678094516-8683656436271262917?l=elhumidor.blogspot.com" height="1" width="1"&gt;&lt;/img&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ElHumidor/~4/CUOnO4ZrvOs" height="1" width="1"&gt;&lt;/img&gt;</description>
	<pubDate>Wed, 01 Jul 2009 15:15:33 +0000</pubDate>
	<author>noreply@blogger.com (John Hume)</author>
<feedburner:origLink>http://elhumidor.blogspot.com/2009/04/clojure-on-google-appengine.html</feedburner:origLink></item>
<item>
	<title>Marc McNeill: Customer value proposition model</title>
	<guid isPermaLink="false">http://www.dancingmango.com/blog/?p=676</guid>
	<link>http://feedproxy.google.com/~r/PlanetTw/~3/IeyduDoP8no/</link>
	<description>&lt;p&gt;&lt;em&gt;There may be a niche in the market, but is there a market for the niche?&lt;br&gt;&lt;/br&gt;
&lt;/em&gt;&lt;br&gt;&lt;/br&gt;
How do you create a successful proposition?  If the answer was obvious there wouldn’t be so many failures out there in the market place.&lt;/p&gt;
&lt;p&gt;It is easy to commence on a journey of product development with a hunch and clearly there is no substitute for validating ideas in the flesh.  That something at &lt;a href="http://www.thoughtworks.com/" target="_blank"&gt;ThoughtWorks&lt;/a&gt; we do; helping clients test and learn, rapidly building ideas into tangibles that can be piloted at low cost and low risk before investing in significant build and spend.  However, sometimes a little more rigour is required before you commit to commencing a project in earnest.&lt;/p&gt;
&lt;p&gt;That rigour needs to be focused.  What often happens is this rigour turns into a research phase that turns into a project itself.  It need not be this way.  There are certain things you can do, certain questions to ask as you set out on the journey of creating a new, compelling customer proposition.  What follows then is a strawman model to help test potential propositions before moving forward with them.  There are three components to the model, the customer, the environmental context and the organisation or company.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.dancingmango.com/blog/wp-content/uploads/2009/06/cxm.jpg"&gt;&lt;img src="http://www.dancingmango.com/blog/wp-content/uploads/2009/06/cxm.jpg" title="Customer Value Proposition Model (c)marc mcneill" height="199" width="500" alt="" class="aligncenter size-full wp-image-717"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;All too often propositions are rooted in the organisation.  They make assumptions about the demand or usage. This model attempts to broaden the analysis and focus upon the customer and the why the proposition will be attractive to them.  The model supports questions that may be asked to help shape thinking, test hypotheses and validate thinking.&lt;/p&gt;
&lt;p&gt;I do not propose that this should become a major research exercise  (for example market sizing is a huge effort in itself), rather a tool for asking the right questions, and if the answers are hard to come by, maybe that suggests more thought is required in refining the proposition.&lt;/p&gt;
&lt;p&gt;So here goes, a model that provides a framework for considering new customer value propositions.  It’s just an initial idea and I’d welcome feedback and suggestions.&lt;/p&gt;
&lt;h2&gt;Customer&lt;/h2&gt;
&lt;p&gt;Before you get too carried away with the proposition, a good starting point would be the customer.  Who are they and what do they do.  Let’s remember that your customer is not everybody.  Your proposition in unlikely to be appealing 24/7.  The challenge is to segment your target market and identify the triggers for action.&lt;/p&gt;
&lt;h3&gt;The persona: Who do?&lt;/h3&gt;
&lt;p&gt;Personas are a useful tool for bringing the customer to life.  Much has been written about them, but they are a useful tool for extracting broad data into specific stories that describe individuals. Realise that it is unlikely you will design for everybody. Start with the market that you are targeting, how large is it and what is its propensity to spend? Then within that target market segment the target customer base into different profile customers (personas). You need to understand which persona, which customer profile is most important – prioritise them and focus on the highest value.  This may mean deciding between high volume, low margin mass market and low volume, high margin niche appeal.  This decision needs to be made as early as possible to ensure the proposition remains focused and doesn’t try to be all things to all people, satisfying none.&lt;/p&gt;
&lt;h3&gt;Values, needs, wants and desires&lt;/h3&gt;
&lt;p&gt;People are not empty vessels waiting to consume and be filled with your proposition.  Their behaviour is driven by their values, needs, wants and desire.  These may be fundamentally rational (to satisfy a basic human goal) or emotional (to demonstrate status). They are cultural and time based.  Thinking in these terms helps you understand how the proposition will appeal to the customer at different levels.  Let’s take an example of this; a new mobile phone.&lt;/p&gt;
&lt;p&gt;Before we think about what the product must do, what are the &lt;strong&gt;values&lt;/strong&gt; that the persona associates with the phone. Is our target market a technophile or a technophobe? &lt;a href="http://www.janchipchase.com/blog/mt-search.cgi?IncludeBlogs=1&amp;amp;search=values" target="_blank"&gt;Jan Chipchase&lt;/a&gt; who works for Nokia includes ethnography in his research to understand how people use their phones; women carry them in their handbags, men in their pockets or their belts.&lt;/p&gt;
&lt;p&gt;The basic &lt;strong&gt;need&lt;/strong&gt; that the phone must meet to satisfy the customer, she must be able to make and receive calls.  If the product is unable to meet these needs it is not fit for purpose and the phone proposition will inevitably fail.&lt;/p&gt;
&lt;p&gt;Just making phone calls meets the need but there are additional wants that should be satisfied for the product to be more compelling.  It’s a hassle to remember the number of every person she rings, the customer &lt;strong&gt;wants&lt;/strong&gt; to be able to store numbers and see the number of the person who is calling.&lt;/p&gt;
&lt;p&gt;Having the ability to see a photograph of her daughter as a screen saver on her phone is neither a need not a want.  The phone is useful and usable without that.  But the customer &lt;strong&gt;desires&lt;/strong&gt; to personalise her phone by having a picture of her daughter on it.  Desirability is the key differentiator of the iPhone.  It doesn’t need to compete on features, it is a cool device that people talk about.  And here is a key decision you need to make on your proposition journey.  Are you looking to compete on parity or whether you want to make a difference.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Questions&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What is the basic need that the proposition is trying to fulfil?&lt;/li&gt;
&lt;li&gt;What counts as hygiene?&lt;/li&gt;
&lt;li&gt;What does the customer need to be satisfied?&lt;/li&gt;
&lt;li&gt;What does the customer want in addition to being just satisfied&lt;/li&gt;
&lt;li&gt;What do other competive products do to maintain feature parity (if you feel you really need to compete on features alone – bad move!)&lt;/li&gt;
&lt;li&gt;Few people would argue they don’t want simplicity and clarity in their interactions with products.  How could your product to make life easier for the customer?&lt;/li&gt;
&lt;li&gt;What will make the customer feel good in themselves about owning the product?&lt;/li&gt;
&lt;li&gt;What other products are “cool” or desirable to your target market.  How can you leverage the essence of those products?&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Context&lt;/h2&gt;
&lt;p&gt;So now we are beginning to understand who the customer is, it is time to nest the proposition in terms of their context.  The old maxim that a half drunk bottle of water in a desert is worth its weight in gold, but on the streets of a city is worthless trash, should be remembered.  Even the best of propositions will deliver little value if they not only consider the customer, but also the context in which they apply: time, demand and usage.&lt;/p&gt;
&lt;h3&gt;Trigger&lt;/h3&gt;
&lt;p&gt;So the next step in the model is to ask why, when and how will the customer be attracted to the proposition. What is the trigger that drives the customer to move from awareness (assuming you have that) to action?  There is no point in a financial services company trying to sell me a car loan if I am wealthy enough to own my own car, or I do not drive.  Understand what triggers the customer to be interested in the proposition, when and why this happens.  How can your proposition be at front of mind when the trigger is set.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Questions&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What lifestyle / lifestage events will trigger?&lt;/li&gt;
&lt;li&gt;Internal events personal to the customer; leaving school, getting a first job, getting married, moving house, retiring etc&lt;/li&gt;
&lt;li&gt;External events that they have no control over (think about sports sponsorship and tying a proposition to that sport, or tying a proposition to a celebrity e.g. Michael Jackson..)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Environment&lt;/h3&gt;
&lt;p&gt;It is very unlikely that the proposition will be wholly unique.  What is the competitive landscape, what noise will it need to be heard above to capture the consumers attention.  Whilst you may review the immediate competitors to see where threats and opportunities lie, what can you learn from other, unrelated products or domains?  How can you fuse together concepts from outside your immediate focus to bring new innovation to your product?  Scenario planning may come in useful, playing out different outcomes for different timelines other than that which you plan for.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Questions&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What is the competitive landscape?&lt;/li&gt;
&lt;li&gt;What can you learn about similar but unrelated propositions?&lt;/li&gt;
&lt;li&gt;Have you considered the political, environmental social and technical influences using the old &lt;a href="http://www.businessballs.com/pestanalysisfreetemplate.htm" target="_blank"&gt;PEST analysis&lt;/a&gt;?&lt;/li&gt;
&lt;li&gt;Have you considered different &lt;a href="http://www.scenariothinking.org/wiki/index.php/Main_Page" target="_blank"&gt;scenarios&lt;/a&gt; and how your proposition would play out under them; what unplanned disruptors could get in the way, or how could your proposition done differently disrupt the market?&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;The experience engine&lt;/h2&gt;
&lt;p&gt;Enough of the customer and externalities, what will the proposition look like and why will the target customer go with it? There are three engines within the organisation that drive the proposition, the experience, delivery and value engines.  So…&lt;/p&gt;
&lt;h3&gt;Utility&lt;/h3&gt;
&lt;p&gt;To be any good, the product has got to offer basic utility.  It has to do what it says it is going to do.  Sadly, too many products and customer propositions end there.  A utility product will match the consumers needs.  This is where most enterprise software sits…&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What are the key customer needs that the proposition must fulfil?&lt;/li&gt;
&lt;li&gt;What is the basic core functionality that must be met, what are the features that must be offered to gain traction in the market place?&lt;/li&gt;
&lt;li&gt;What features that are typical on competitor products that we could do without?&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Quality&lt;/h3&gt;
&lt;p&gt;I could call this next box usability (as this follows the UXD model) but I think it goes beyond just usability.  What is the quality of not only the immediate interface, but also with the supporting functions?  For example, if you have a call centre to back up the proposition, how many layers of IVR are you forced through?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Have you considered usability?&lt;/li&gt;
&lt;li&gt;Is the packaging aesthetically pleasing?&lt;/li&gt;
&lt;li&gt;The “happy path” customer journey may be well framed, but what about the “sad path”?  What about when things go wrong, what about when customers don’t act in the way you expect of predict them to act?&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Brand&lt;/h3&gt;
&lt;p&gt;It is easy to get carried away with a new idea before thinking about what it means to the brand.  Typically there will be a strategic roadmap and whilst the proposition may be attractive it may not fit into where the brand is going.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Is the proposition complementary to the overall brand direction or does it require a new brand and identity?&lt;/li&gt;
&lt;li&gt;Does the proposition support / leverage the brand?&lt;/li&gt;
&lt;li&gt;Does the brand already ‘do it’ under another guise (are you reinventing a wheel that has already been tried somewhere, sometime in the organisation’s history?)&lt;/li&gt;
&lt;li&gt;How will it be marketed?&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Community&lt;/h3&gt;
&lt;p&gt;Finally, what is the ‘buzz’ that the proposition will create, what will get people talking and sharing it and how will you create this buzz.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt; Is there a social network component built in that gets people talking and connected?  How will it get people talking in external networks?&lt;/li&gt;
&lt;li&gt; What will cause people to recommend it to others?&lt;/li&gt;
&lt;li&gt;How can customers become part of its evolution?&lt;/li&gt;
&lt;li&gt;What of the proposition will get people passionate, what will drive them away?&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Delivery engine&lt;/h2&gt;
&lt;h3&gt;People&lt;/h3&gt;
&lt;p&gt;A successful proposition needs not only a talented, passionate and committed team to deliver it to market, it also needs a similar team to run it and support it when it is live.  It is a common failing for a rogue “skunkworks” team to emerge in an organisation and develop what appears a compelling proposition, only to have it knocked back and closed down by the “Business as Usual” processes inherent in the organisation&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Who do you need to make the proposition successful?  What is the team?&lt;/li&gt;
&lt;li&gt;Who will create the proposition and who will lead it?  Is it IT led or business led?&lt;/li&gt;
&lt;li&gt;What are the cross-organisational boundaries that the proposition crosses and how will these be eliminated?&lt;/li&gt;
&lt;li&gt;Who will take ownership of the proposition once it crosses over into the market?&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Process&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt; What are the processes that will be required to sustain the proposition?&lt;/li&gt;
&lt;li&gt;If the proposition will require changes to the organisation, how will they be managed, communicated and rolled out?&lt;/li&gt;
&lt;li&gt;How will the proposition be supported once it is let loose in the market?&lt;/li&gt;
&lt;li&gt;How will it be communicated to customers?&lt;/li&gt;
&lt;li&gt;How will you create new sales – sales force.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Technology&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt; What is the technology that will underpin the proposition?&lt;/li&gt;
&lt;li&gt;Is it possible to test the ideas using rapid languages such as Ruby on Rails before committing it to the enterprise Java stack?&lt;/li&gt;
&lt;li&gt;What integration is really necessary and what can be worked around?&lt;/li&gt;
&lt;li&gt;How can you deliver a beta version in the shortest period of time?&lt;/li&gt;
&lt;li&gt;How will you avoid heavyweight frameworks and develop incrementally to deliver value early and often?&lt;/li&gt;
&lt;li&gt;How performant and scalable must the innovation be?&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Value Engine&lt;/h2&gt;
&lt;p&gt;At its most simplistic, how much will the proposition cost and how much revenue will it generate?  Does it offer cost saving opportunities?  Are there intangible benefits that will be accrued?  Ultimately is it a viable proposition that is worth pursuing, or will the cost to develop and run outweigh the value it will add?  Building out a financial model can take time, in the first instance this should be a napkin analysis, a wake-up call to make sure there is value in the proposition before too much time is invested in it.&lt;/p&gt;
&lt;h3&gt;Cost&lt;/h3&gt;
&lt;p&gt;Every day someone is working on the proposition it is costing you money.  The quicker you can get something to market the faster you will start seeing a return on your investment, similarly the sooner you can “get something out there”, “test and learn” the sooner you can kill a proposition that does not fulfill its promise.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;How quickly can you get a beta to market?&lt;/li&gt;
&lt;li&gt;How many people, how many days?&lt;/li&gt;
&lt;li&gt;What will the cost be to develop the infrastructure?&lt;/li&gt;
&lt;li&gt;Do you have the skills in house or will you need to go external?&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Benefit / Revenue&lt;/h2&gt;
&lt;p&gt;At its most crude, how will the proposition make money, but there may be more to what we wish to achieve.  Is the proposition actually going to cut costs, a result of regulatory pressures or a CSR initiative?&lt;br&gt;&lt;/br&gt;
What are the benefits that will be accrued – both tangible (e.g. financial) and intangible (e.g. social, environmental etc)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If you are selling units are you going for high volume low margin or low volume high margin?&lt;/li&gt;
&lt;li&gt;If it an on-line proposition “advertising” is often seen as the source of revenue.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There are two additional components to the model…&lt;/p&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;p&gt;Having a compelling proposition is one thing, it is another to successfully communicate it and roll it out to target customers.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In a crowded market place, how will the proposition stand out?&lt;/li&gt;
&lt;li&gt;What are the brand values it will communicate?&lt;/li&gt;
&lt;li&gt;What is the story that customers will hear and how will they hear that story?&lt;/li&gt;
&lt;li&gt;How will customers interact with the proposition, what channels will you use to take it to market?&lt;/li&gt;
&lt;li&gt;What is the roll out strategy?&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Retain and grow&lt;/h3&gt;
&lt;p&gt;Winning customers is only the first step.  A successful proposition will maintain a long-term relationship with its profitable customers, maintaining the warmth they have to the original proposition and cross-selling and up-selling new ones.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;How will you retain them and turn them into repeat customers and passionate advocates of the proposition?&lt;/li&gt;
&lt;li&gt;How will the proposition grow lifetime customer value?&lt;/li&gt;
&lt;li&gt;What can be cross-sold or up-sold?&lt;/li&gt;
&lt;li&gt;What can you bundle?&lt;/li&gt;
&lt;li&gt;How will the proposition deal with churn?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;OK, so it’s not a perfect model and by no means complete.  There’s some duplication in the thinking and many questions missing, but as any model it can be used to guide and prompt thinking and ensure there are no elephants left in the room when the first line of code gets cut.  I’d welcome any comments on its usefulness, utility and direction.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Dancingmango?a=BMr6WgUezDg:Kjigp-glSgI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Dancingmango?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Dancingmango?a=BMr6WgUezDg:Kjigp-glSgI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Dancingmango?i=BMr6WgUezDg:Kjigp-glSgI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Dancingmango?a=BMr6WgUezDg:Kjigp-glSgI:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Dancingmango?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Dancingmango?a=BMr6WgUezDg:Kjigp-glSgI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Dancingmango?i=BMr6WgUezDg:Kjigp-glSgI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Dancingmango?a=BMr6WgUezDg:Kjigp-glSgI:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Dancingmango?i=BMr6WgUezDg:Kjigp-glSgI:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Dancingmango/~4/BMr6WgUezDg" height="1" width="1"&gt;&lt;/img&gt;</description>
	<pubDate>Wed, 01 Jul 2009 09:07:43 +0000</pubDate>
<feedburner:origLink>http://feedproxy.google.com/~r/Dancingmango/~3/BMr6WgUezDg/</feedburner:origLink></item>
<item>
	<title>Ted Neward: Review: "Iron Python in Action" by Michael Foord and Christian Muirhead</title>
	<guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,eb632e02-f7de-43ce-a9fe-8c857b0b2554.aspx</guid>
	<link>http://feedproxy.google.com/~r/PlanetTw/~3/QJAEwdIVcM8/Review+QuotIron+Python+In+Actionquot+By+Michael+Foord+And+Christian+Muirhead.aspx</link>
	<description>&lt;p&gt;
OK, OK, I admit it. Maybe significant whitespace isn't all bad. (But don't let me
ever catch you quoting me say that.)
&lt;/p&gt;
        &lt;p&gt;
The reason for my (maybe) shift in thinking? Manning Publications sent me a copy of &lt;em&gt;Iron
Python in Action&lt;/em&gt;, and I have to say, I like the book and its approach. Getting
me to like Python as a primary language for development will probably take more than
just one book can give, but... *shrug* Who knows?
&lt;/p&gt;
        &lt;p&gt;
Bear in mind, I have plenty of reasons to like IronPython (Microsoft's Python implementation
for the .NET environment):
&lt;/p&gt;
        &lt;ul&gt;
          &lt;li&gt;
A good friend of mine, Harry Pierson (aka @DevHawk), is the PM on the IPy project,
and I'm generally prejudiced in favor of those things that people I know and respect.&lt;/li&gt;
          &lt;li&gt;
I'm generally a fan of dynamic languages, particularly those that let you do strange
and twisted things to the type system and its instances at runtime. (Yes, I'm looking
at you, ECMAScript...)&lt;/li&gt;
          &lt;li&gt;
I spent some quality time with IronPython Studio last year while researching a Visual
Studio Extensibility "Deep Dive" paper.&lt;/li&gt;
          &lt;li&gt;
I've known Jim Hugunin (the creator of IronPython, and Jython before that) for some
years, ever since his days working on AspectJ, and he's one of those scary-smart guys
that, despite knowing they're scary-smart, still render me stunned when I listen to
them.&lt;/li&gt;
          &lt;li&gt;
I'm a huge fan of the DLR. It's like having Parrot, but without having to wait a decade
(give or take).&lt;/li&gt;
        &lt;/ul&gt;
        &lt;p&gt;
But, just to counterbalance the scales, I have plenty of good reasons to dislike IronPython,
too:
&lt;/p&gt;
        &lt;ul&gt;
          &lt;li&gt;
Significant whitespace.&lt;/li&gt;
          &lt;li&gt;
The "There's only one way to do it" oath that Pythonistas seem to hold as
religion. (Somebody told me that building C-Python—the original implementation—only
works for you if you swear a holy oath to The One True Way on the One True Way Bible.
Needless to say, I believe them, and have never tried to build C-Python from sources
as a result.)&lt;/li&gt;
          &lt;li&gt;
Significant whitespace.&lt;/li&gt;
          &lt;li&gt;
Uh.... did I mention significant whitespace yet?&lt;/li&gt;
        &lt;/ul&gt;
        &lt;p&gt;
I admit, it was with some hesitation that I cracked open the book. Actually, to be
honest, I was really ready to just take out all my dislike of significant whitespace
and pour it into a heated, vitriolic diatribe on everything that was just &lt;em&gt;wrong&lt;/em&gt; with
Python.
&lt;/p&gt;
        &lt;p&gt;
And...?
&lt;/p&gt;
        &lt;p&gt;
Well, OK, I admit it. Maybe significant whitespace isn't all bad.
&lt;/p&gt;
        &lt;p&gt;
But this is a review of the book, not the technology. So, on we go.
&lt;/p&gt;
        &lt;h3&gt;What I liked about the book
&lt;/h3&gt;
        &lt;ul&gt;
          &lt;li&gt;
The focus is on both .NET and Python, and doesn't try to short-change either the "Python"-ness
or the ".NET'-ness by trying to be a "Python book (that happens to run on
.NET)" or a ".NET book (that happens to use Python for code samples)".
The authors, I think, did a very good job of balancing the two, making this &lt;em&gt;the&lt;/em&gt; book
to get if you're in that area on the Venn diagram where "Python" overlaps
with ".NET".&lt;/li&gt;
          &lt;li&gt;
Part 2, &lt;em&gt;"Core development techniques"&lt;/em&gt;, starts down the "feed
you the Python Kool-Ade" pretty quickly, heading straight into Chapter 4 ("&lt;em&gt;Writing
an application and design patterns with IronPython"&lt;/em&gt;) without much of a pause
for breath. The authors get into duck typing, protocols, and Model-View-Controller
within the first four pages, and begin working on a running example to highlight some
of the ideas. (Interestingly enough, they also take a few moments to point out that
IronPython on Mono works, and include a couple of screen shots to that effect as we
go, though I personally wonder just how many people are really going down this path.)
I like the no-holds-barred, show-you-the-code style, but only because they also take
time throughout the prose to talk about some of the concepts at work underneath and
laced throughout the code. "Show me then tell me" is a time-honored tradition,
but too many authors forget the "tell me" part and stop with code. These
guys do a good job of following through.&lt;/li&gt;
          &lt;li&gt;
The chapters in Part 3, "&lt;em&gt;IronPython and advanced .NET&lt;/em&gt;", form an
interesting collection of how IronPython can fit into the rest of the .NET stack,
demonstrating how to use IronPython with WPF, ASP.NET, and IronPython's crowning glory,
Silverlight. If you're into front-end stuff, this is the section where I think you're
going to have the most fun.&lt;/li&gt;
          &lt;li&gt;
The chapters in Part 4, "&lt;em&gt;Reaching out with IronPython&lt;/em&gt;", is I think
the most important part of the book, showing how to extend IronPython (chapter 14)
with C#/VB extensions (similar to how a C-Python developer would extend Python by
writing C code, but much much simpler) and the opposite—how to embed IronPython inside
of existing C#/VB applications (chapter 15), which is really an exercise in using
the DLR Hosting APIs. While the discussion in chapter 15 is good, I wish it'd had
a bit more thorough discussion of how the DLR could be hosted regardless of the scripting
language, though I admit that's pretty beyond the scope of this book (which is focused,
after all, entirely on IronPython, and as a result &lt;em&gt;should&lt;/em&gt; stay focused on
how to host IPy).&lt;/li&gt;
        &lt;/ul&gt;
        &lt;h3&gt;
          &lt;strong&gt;What I found "Meh" about the book&lt;/strong&gt;
        &lt;/h3&gt;
        &lt;ul&gt;
          &lt;li&gt;
Part 1 (&lt;em&gt;"A new language for .NET"&lt;/em&gt;, &lt;em&gt;"Introduction to Python"&lt;/em&gt;,
and &lt;em&gt;".NET objects and IronPythong"&lt;/em&gt;) does a good job of bringing
the rank beginner up to speed, getting some basic Python ideas across in the same
breath that they bring .NET home. The only problem is, it only works well if you're
neither a Python programmer nor a .NET programmer. Chapter 1, for example, does a
sort of Cannonball-into-the-pool kind of dive into Python, but dives equally into
the "Iron" parts as it does the "Python" parts. If you're either
a Pythonista or a .NETter, I suspect you're going to be tempted to flip pages pretty
quickly, and (I suspect) miss a few things. Chapter 2 is all about Python (meaning
.NETters will probably spend some time here), but it certainly doesn't feel like an
exhaustive reference, nor does Chapter 3 stand as an exhaustive discussion about all
things .NET, either. I almost wish all three chapters had been collapsed into one—suffice
it to say, I don't feel like I know the Python language, and don't feel like this
book could be my Python reference next to me as I learn it, and I know that it's not
a great .NET reference, either. Fortunately, the goal of these three chapters feels
pretty clearly to be "Teach you just enough to make you dangerous (and able to
understand the rest of the book)", and once we hit Part 2, rubber meets road
pretty quickly.&lt;/li&gt;
          &lt;li&gt;
By the time you hit Chapter 7, less than halfway through the book, the authors have
created a fairly nice, if simplistic, application for later dissection, but it's not
until you hit Chapter 7 that they begin to start unit-testing, even though they insist
(on page 17) that "Dynamic language programmers are often proponents of &lt;em&gt;strong
testing rather than strong typing&lt;/em&gt;" (a quote they attribute to Bruce Eckel,
though I'm relatively certain I heard Dave Thomas and Neal Ford say it with respect
to Ruby, long before Eckel started "Thinking in Python... or Flex... or whatever").
If unit-testing is that important, why wait three chapters into the application's
development before writing a single unit-test? This doesn't jibe with me, somehow.&lt;/li&gt;
          &lt;li&gt;
If you're into back-end stuff, chapter 12 on &lt;em&gt;"Databases and web services"&lt;/em&gt; is
pretty bland. The fact that the two are combined into a single chapter is indicative,
all by itself, of how deep or intensive the coverage goes, and there's zero mention
of anything beyond basic ADO.NET. The coverage on web services covers REST relatively
well, but there's zero coverage of WCF, and the whole of SOAP-based services is all
of four or five pages. And Workflow? Doesn't exist, isn't even mentioned (except for
an appearance in a table, "The major new APIs of .NET 3.0"). Yikes.&lt;/li&gt;
        &lt;/ul&gt;
        &lt;h3&gt;
          &lt;strong&gt;What I actively disliked about the book&lt;/strong&gt;
        &lt;/h3&gt;
        &lt;p&gt;
Actually, not much. Manning did their usual superb job of arrowed callouts to point
out particular concepts in the code listings, the copyediting is professional (meaning
there's no obvious typos or misspellings that just break up the flow of prose, something
that not all publishers seem to take seriously), and the graphics flow nicely alongside
the prose, not dominating the page but accentuating it.
&lt;/p&gt;
        &lt;p&gt;
In fact, about the only thing I'd care to criticize is the &lt;em&gt;huge&lt;/em&gt; number of
footnotes, particularly in the first chapter. (By page 20 in the book, there have
already been 30 footnotes.) When you have three footnotes &lt;em&gt;per page&lt;/em&gt;, on average
(and sometimes more), it does tend to distract, at least to me it does. It feels like
there were ways, for most of them, to inject the idea or concept into the main prose,
or leave it out entirely, but that could just be a difference of writing style, too.
&lt;/p&gt;
        &lt;h3&gt;
          &lt;strong&gt;Summation&lt;/strong&gt;
        &lt;/h3&gt;
        &lt;p&gt;
If you're a .NET developer interested in learning/using IronPython on your next project,
this is a definite winner. If you're a Python developer looking to see how to break
into .NET, I'm not so sure this is your book, but I say that mostly because I'm &lt;em&gt;not&lt;/em&gt; a
Pythonista and can't really speak to how that mindset will find this as an introduction
to the .NET space. My intuition tells me that this would be a good springboard into
another book on .NET for the Python programmer, but I'll have to leave that to Pythonistas
who've read this book to comment one way or another.
&lt;/p&gt;
        &lt;img src="http://blogs.tedneward.com/aggbug.ashx?id=eb632e02-f7de-43ce-a9fe-8c857b0b2554" height="0" width="0"&gt;&lt;/img&gt;
        &lt;br&gt;&lt;/br&gt;
        &lt;hr&gt;&lt;/hr&gt;
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. &lt;a href="mailto:ted@tedneward.com"&gt;Contact
me for details&lt;/a&gt;.</description>
	<pubDate>Wed, 01 Jul 2009 09:00:14 +0000</pubDate>
<feedburner:origLink>http://blogs.tedneward.com/2009/07/01/Review+QuotIron+Python+In+Actionquot+By+Michael+Foord+And+Christian+Muirhead.aspx</feedburner:origLink></item>
<item>
	<title>Erik Doernenburg: Making ESB pain visible</title>
	<guid isPermaLink="false">http://erik.doernenburg.com/?p=236</guid>
	<link>http://feedproxy.google.com/~r/PlanetTw/~3/b2dv1qCQFF0/</link>
	<description>&lt;p&gt;At some point last year I was asked to review the architecture of the software behind a large and popular website. The resident architect explained how he had followed a modern approach, decoupling the web front-end from back-end services that provide  content. To gain further flexibility he had put the front-end and the services on an ESB, mostly to cater for the possibility to make the content available to other consumers. In short, the architecture diagram looked a lot like many others: nothing to see here, move on.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://erik.doernenburg.com/wp-content/uploads/2009/06/high-level-esb.png" title="Website Architecture" height="212" width="320" alt="Website Architecture" class="alignnone size-full wp-image-237"&gt;&lt;/img&gt;&lt;/p&gt;
&lt;p&gt;The diagram above only shows one of the content services, which for the sake of this article is a service that provides contact details for a person.&lt;/p&gt;
&lt;p&gt;Based on conversations with the project sponsors I began to suspect that at least the introduction of the ESB was a case of RDD, ie. Resume-Driven Development, development in which key choices are made with only one question in mind: how good does it look on my CV? Talking to the developers I learned that the ESB had introduced “nothing but pain.” But how could something as simple as the architecture in the above diagram cause such pain to the developers? Was this really another case of architect’s dream, developer’s nightmare?  &lt;/p&gt;
&lt;p&gt;&lt;span id="more-236"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Often a picture says more than a thousand words, but at the same time traditional architecture diagrams simply do not provide enough information. (I’ve argued this before, &lt;a href="http://97-things.near-time.net/wiki/show/Get%20the%201000ft%20view"&gt;here&lt;/a&gt; and &lt;a href="http://www.infoq.com/interviews/erik-doernenburg-software-visualization"&gt;here&lt;/a&gt; for example.) The answer to my questions, and the anxious project sponsors’ question whether the project would deliver on time, lay in a different picture.&lt;/p&gt;
&lt;p&gt;The picture should not only show the layering of the system in more detail than the architecture diagram but it should also visualise the complexity introduced by the ESB. It’s often possible to produce more detailed diagrams automatically from source code, configuration, or runtime inspection but in this case I couldn’t find a way to do that, which is which I drew the following:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://erik.doernenburg.com/wp-content/uploads/2009/06/low-level-esb.png"&gt;&lt;img src="http://erik.doernenburg.com/wp-content/uploads/2009/06/low-level-esb-600x533.png" title="Detailed ESB diagram" height="533" width="600" alt="" class="alignnone size-medium wp-image-237"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In the centre column this diagram shows the layers involved, from the Struts action that needs to look up details by an ID down to the back-end that provides a “RESTful” service to retrieve the details. The top box contains the front-end layers while the box in the middle represents the ESB. The layers labelled in italics are frameworks or infrastructure software, the rest is project-specific code.&lt;/p&gt;
&lt;p&gt;Key to this diagram are obviously the coloured representations of data travelling up and down the stack. Primitive types are grey, Java objects are purple circles, XML documents are shown as turquoise hexagons, and HTTP messages as green blobs. Mule messages, which are Java objects, are shown in dark purple. If one representation is wrapped in another it’s displayed inside the wrapper. &lt;/p&gt;
&lt;p&gt;The diagram highlights that it’s a simple piece of data that travels all the way down the stack (actually further until it hits a relational database at some point) and, equally, that the data needed by the action is available in the right form from the service. All that the intermediate layers are doing is wrapping and unwrapping the data in various ways. In fact, out of the four layers of project-specific code three layers do nothing but wrapping. No wonder the developers felt some pain.&lt;/p&gt;
&lt;p&gt;As a side note: the diagram also makes it obvious that the wrapping is asymmetric between the WsToRestHandler and the RestServiceWrapperImpl, which makes the point of this layer boundary even more questionable.&lt;/p&gt;
&lt;p&gt;This diagram made people more interested in the cost of what had just been a simple, innocuous line in the architecture diagram; which was the point of the exercise. So, what would &lt;em&gt;this&lt;/em&gt; diagram look like without the ESB? Easy:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://erik.doernenburg.com/wp-content/uploads/2009/06/Low-Level-ESB2.png"&gt;&lt;img src="http://erik.doernenburg.com/wp-content/uploads/2009/06/Low-Level-ESB2-600x305.png" title="Without ESB" height="305" width="600" alt="" class="alignnone size-medium wp-image-237"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Apart for the obvious simplicity the diagram highlights that every layer has a purpose and there is only one wrapping, which is not undone either. Would it surprise you if I told you that the project went live without the ESB?&lt;/p&gt;
&lt;h3&gt;Footnotes&lt;/h3&gt;
&lt;p&gt;1) This article is by no means implying that any of the mentioned technologies are useless or harmful. Their use was harmful in this case.&lt;/p&gt;
&lt;p&gt;2) The pattern of wrapping and unwrapping the same data through multiple layers is not new, it was also quite common in early 3-tier architectures. (In fact, some people called their architectures n-tier; I guess to show that the number of tiers was somewhat arbitrary but large.) We had a term to describe this pattern: the wormhole pattern.&lt;/p&gt;
&lt;p&gt;3) This project is not an isolated incident of a Wormhole ESB. I have personally seen several in the past years.&lt;/p&gt;</description>
	<pubDate>Wed, 01 Jul 2009 05:40:39 +0000</pubDate>
<feedburner:origLink>http://erik.doernenburg.com/2009/07/making-esb-pain-visible/</feedburner:origLink></item>
<item>
	<title>Sidu Ponnappa Kariappa Chonira: CruiseControl.rb 1.4.0 released!</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-3718956085911858962.post-3903574927410490750</guid>
	<link>http://feedproxy.google.com/~r/PlanetTw/~3/okteJPXJC48/cruisecontrolrb-140-released.html</link>
	<description>We are happy to announce the release of &lt;a href="http://cruisecontrolrb.thoughtworks.com"&gt;CruiseControl.rb&lt;/a&gt; 1.4.0. This release adds support for three distributed version control systems - Git, Mercurial and Bazaar - in addition to Subversion.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;CC.rb remains easy to install, pleasant to use and simple to hack. Since the source has now moved to a &lt;a href="http://github.com/thoughtworks/cruisecontrol.rb"&gt;git repository&lt;/a&gt;, it is easier than ever to fork and contribute. We're looking forward to your pull requests!&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Downloads are available from both &lt;a href="http://rubyforge.org/frs/?group_id=2918"&gt;Rubyforge&lt;/a&gt; and &lt;a href="http://github.com/thoughtworks/cruisecontrol.rb/tree/v1.4.0"&gt;Github&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img src="https://blogger.googleusercontent.com/tracker/3718956085911858962-3903574927410490750?l=blog.sidu.in" height="1" width="1"&gt;&lt;/img&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=okteJPXJC48:F77oEyYsHJ4:mtsM-81NTLw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=mtsM-81NTLw" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=okteJPXJC48:F77oEyYsHJ4:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=okteJPXJC48:F77oEyYsHJ4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=okteJPXJC48:F77oEyYsHJ4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=okteJPXJC48:F77oEyYsHJ4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=okteJPXJC48:F77oEyYsHJ4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=okteJPXJC48:F77oEyYsHJ4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=okteJPXJC48:F77oEyYsHJ4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=okteJPXJC48:F77oEyYsHJ4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=okteJPXJC48:F77oEyYsHJ4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/diningtablecoder/~4/okteJPXJC48" height="1" width="1"&gt;&lt;/img&gt;</description>
	<pubDate>Tue, 30 Jun 2009 20:28:54 +0000</pubDate>
	<author>noreply@blogger.com (Sidu)</author>
<feedburner:origLink>http://blog.sidu.in/2009/07/cruisecontrolrb-140-released.html</feedburner:origLink></item>
<item>
	<title>ThoughtWorkers on Open Source: CruiseControl.rb 1.4.0 released!</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-5116471530866808083.post-1242555952576072607</guid>
	<link>http://feedproxy.google.com/~r/PlanetTw/~3/W74VyCkDY-Y/cruisecontrolrb-140-released.html</link>
	<description>We are happy to announce the release of &lt;a href="http://cruisecontrolrb.thoughtworks.com"&gt;CruiseControl.rb&lt;/a&gt; 1.4.0. This release adds support for three distributed version control systems - Git, Mercurial and Bazaar - in addition to Subversion.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;CC.rb remains easy to install, pleasant to use and simple to hack. Since the source has now moved to a &lt;a href="http://github.com/thoughtworks/cruisecontrol.rb"&gt;git repository&lt;/a&gt;, it is easier than ever to fork and contribute. We're looking forward to your pull requests!&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Downloads are available from both &lt;a href="http://rubyforge.org/frs/?group_id=2918"&gt;Rubyforge&lt;/a&gt; and &lt;a href="http://github.com/thoughtworks/cruisecontrol.rb/tree/v1.4.0"&gt;Github&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img src="https://blogger.googleusercontent.com/tracker/5116471530866808083-1242555952576072607?l=tw-oss.blogspot.com" height="1" width="1"&gt;&lt;/img&gt;&lt;/div&gt;</description>
	<pubDate>Tue, 30 Jun 2009 20:25:43 +0000</pubDate>
	<author>noreply@blogger.com (Sidu)</author>
<feedburner:origLink>http://tw-oss.blogspot.com/2009/06/cruisecontrolrb-140-released.html</feedburner:origLink></item>
<item>
	<title>Martin Fowler: IllustrativeProgramming</title>
	<guid isPermaLink="false">http://martinfowler.com/bliki/IllustrativeProgramming.html</guid>
	<link>http://feedproxy.google.com/~r/PlanetTw/~3/6vNh_tQnhTA/IllustrativeProgramming.html</link>
	<description>&lt;p&gt;What's the most common programming language in the world?&lt;/p&gt;&lt;p&gt;I'm not sure how you could go about measuring this, but one thing
  you'd need to do is consider what we mean by programming. My
  candidate answer considers that the most popular programming
  language is one used widely by people who do not consider themselves
  as programmers. This language is Excel, or more generally spreadsheets.&lt;/p&gt;&lt;p&gt;Spreadsheets are easily used for small tasks, but are also used
  for surprisingly complex and important things. Often I've seen
  professional programmers gulp when they realize that some vital
  business function is being run off some spreadsheet that they'd find
  too complicated to muck with.&lt;/p&gt;&lt;p&gt;In general, we've not had much success with programming languages
  for these kind of &lt;a href="http://martinfowler.com/bliki/LayProgrammer.html"&gt;LayProgrammers&lt;/a&gt;. Whenever someone talks about some
  new environment that's going to allow people to specify complex
  behavior "without programming" I mention COBOL, which was originally
  designed to get rid of programmers. So it's important to consider
  what Excel can teach us about programming environments.&lt;/p&gt;&lt;p&gt;One property of spreadsheets, that I think is important, is its
  ability to fuse the execution of the program together with its
  definition. When you look at a spreadsheet, the formulae of the
  spreadsheet are not immediately apparent, instead what you see is
  the calculated numbers - an illustration of what the program
  does.&lt;/p&gt;&lt;img src="http://martinfowler.com/bliki/images/illustrative programming/excel.png"&gt;&lt;/img&gt;&lt;p&gt;Using examples as a first class element of a programming
  environment crops up in other places - UI designers also have
  this. Providing a concrete illustration of the program output helps
  people understand what the program definition does, so they can more
  easily reason about behavior.&lt;/p&gt;&lt;p&gt;So why do I feel we need this particular &lt;a href="http://martinfowler.com/bliki/Neologism.html"&gt;Neologism&lt;/a&gt;?
  Essentially because I think it deserves more thought. We pass by
  illustrative programming examples without really thinking about them
  or what makes them special - or even that they are special in some
  way.  We've used illustrative programming for years, but we've not
  paid enough attention to it. We've not thought enough about what are
  its essential qualities and what its strengths and weaknesses
  are.&lt;/p&gt;&lt;p&gt;I've chosen the term "Illustrative Programming" to describe this,
  partly because "example" is so heavily used (and illustration isn't)
  but also because the term "illustration" reinforces the explanatory
  nature of the example execution. Illustrations are meant to help
  explain a concept by giving you a different way of looking at it -
  similarly an illustrative execution is there to help you see what
  your program does as you change it.&lt;/p&gt;&lt;p&gt;When trying to make a concept explicit like this, it's useful to
  think about the boundary cases. One boundary is the notion of using
  projections of program information during editing, such as an IDE that
  shows you the class hierarchy while you are working on the code. In
  some ways this is similar, as the hierarchy display is continuously
  updated as you modify the program, but the crucial difference is
  that the hierarchy can be derived from static information about the
  program. Illustrative programming requires information from the
  actual running of the program.&lt;/p&gt;&lt;p&gt;I also see illustrative programming as a concept beyond the
  classic REPL loop of dynamic languages. REPL loops allow you to
  explore execution, but they don't make the examples front and center
  in the way that a spreadsheet does its values. Illustrative
  programming techniques put the illustration in the foreground of
  your editing experience. The program retreats to the background,
  peeping out only when we want to explore a part of the illustration.&lt;/p&gt;&lt;p&gt;I don't think that illustrative programming is all
  goodness. One problem I've seen with spreadsheets and with GUI
  designers is that they do a good job of revealing what a program
  does, but de-emphasizes program structure. As a result complicated
  spreadsheets and UI panels are often difficult to understand and
  modify. They are often riven with uncontrolled copy-and-paste
  programming.&lt;/p&gt;&lt;p&gt;This strikes me as a consequence of the fact that the program is
  de-emphasized in favor of the illustrations. As a result the
  programmers don't think to take care of it. We suffer enough from a
  lack of care of programs even in regular programming, so it's hardly
  shocking that this occurs with illustrative programs written by lay
  programmers. But this problem leads us to create programs that
  quickly become unmaintainable as they grow. The challenge for future
  illustrative programming environments is to help develop a well
  structured program behind the illustrations - although the
  illustrations may also make us rethink what a well structured
  program is.&lt;/p&gt;&lt;p&gt;The hard part of this may well be the ability to easily create
  new abstractions. One of my observations of rich client UI software
  is that they get tangled because the UI builders think only in terms
  of screens and controls. My experiments here suggest to me that you
  need to find the right abstractions for you program, which will take
  a different form. But these abstractions won't be supported by the
  screen builder as it can only illustrate the abstractions it knows
  about.&lt;/p&gt;&lt;p&gt;My colleagues Rebecca Parsons and Neal Ford have been spending a
  lot of time involved in thinking along these lines too. So here's
  some thoughts that Neal had in an email exchange&lt;/p&gt;
&lt;div class="quote"&gt;&lt;ul&gt;&lt;li&gt;I think these tools work best for lay people (thus, your link
    to &lt;a href="http://martinfowler.com/bliki/LayProgrammer.html"&gt;LayProgrammers&lt;/a&gt;). However, in general, tools like
    this slow down experienced/power users. When you mention UI
    panels, the Mac is rife with these types of controls. I spend a
    great deal of time in Keynote, fiddling with the inspector. At
    least all those controls are in one place (not like the new ribbon
    stuff). I would much prefer a markup language I could use to
    directly define stuff, with macros, snippets, and all the other
    things I'm accustomed to as a developer.&lt;/li&gt;&lt;li&gt;as these tools grow, they get unwieldy (perhaps because they
    are ceasing to be domain specific enough?) Look at Word, Excel,
    and PowerPoint. They had to invent new UI metaphors to expose all
    the functionality of those tools. APIs in programming languages
    scale much better, with several orders of magnitude more density
    before they become hard to navigate.&lt;/li&gt;&lt;li&gt; All the best-practices and tools don't exist there:
    refactoring, levels of testing, etc. Also, you loose the
    connection to text, meaning that macro facilities either don't
    exist or complex one-offs. I think a good comparison that
    highlights the limitations of Illustrative Programming is the
    comparison between bash (large, arcane, powerful, quirky) to
    Automator. I almost never use Automator because it suffers from &lt;a href="http://memeagora.blogspot.com/2007/11/ruby-matters-frameworks-dsls-and.html"&gt;Dietzler's
    Law&lt;/a&gt;: it's always lacking 10% of what I need. I gladly deal
    with the crufty surface area of bash because of the more power
    afforded.&lt;/li&gt;&lt;li&gt;I share your bullishness around these types of tools, but they
    are a long time from being useful for full-bore Agile
    development. I hope they mature fast.&lt;/li&gt;&lt;/ul&gt;
&lt;p align="center"&gt;&lt;i&gt;--Neal Ford&lt;/i&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;One of the few people to take illustrative programming seriously
  is &lt;a href="http://alarmingdevelopment.org/"&gt;Jonathan Edwards&lt;/a&gt;. He's come up with many very imaginative ideas
  as to what such an environment should look like. His vision of
  illustrative programming is also closely bound to the notions of
  projectional editing and controlled copy-and-paste.&lt;/p&gt;&lt;p&gt;The trigger for me in wanting to coin a term here, is the use of
  illustrative programming by Language Workbenches by people like
  &lt;a href="http://martinfowler.com/bliki/IntentionalSoftware.html"&gt;IntentionalSoftware&lt;/a&gt;. These Language Workbenches encourage
  you to build illustrative DSLs. Using illustration is important in
  this case since this should help engage lay-programmers, which is
  one of the aims of using DSLs. The challenge is to do this without
  falling into the trap of poor program structure. &lt;/p&gt;</description>
	<pubDate>Tue, 30 Jun 2009 19:23:00 +0000</pubDate>
<feedburner:origLink>http://martinfowler.com/bliki/IllustrativeProgramming.html</feedburner:origLink></item>
<item>
	<title>Ye Zheng: 和新手一起工作</title>
	<guid isPermaLink="false">http://dreamhead.blogbus.com/logs/41733215.html</guid>
	<link>http://feedproxy.google.com/~r/PlanetTw/~3/UsThvUxq_Z4/41733215.html</link>
	<description>&lt;p&gt;不知道从什么时侯开始，周边的人把我当作一个老手，尽管有些自己不那么情愿，但现实是和我在一起工作的人大多比我工作经验少。&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;新手之所以为新手，是因为他们的经验较少，所以，不可避免的会犯一些错误。记得别人还在用新手标准要求我时，有一次出差，到了现场，项目负责人要我去安装我们的程序，可我根本就没把我们的程序带来，结果可想而知，项目负责人劈头盖脸的把我骂了一顿。&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;换我扮演老手的角色，我会尽我所能把项目中的一些不确定问题解决掉，然后，让新手们去解决那些确定性问题，通常，他们的能力应对这样问题会游刃有余。最近一年多的项目里面，涉及到了很多探索新技术的工作，我会从项目中挑出一个最简单的情形用新技术实现出来，这个例子可以帮助我弄清楚技术背后的来龙去脉。之后，我就可以把他解释给其他人。我的同事们都很聪明，理解了基础结构，加上一个现成的例子，他们就完全可以继续进行下面的工作了。&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;或许单独看起来，我的做法并没有什么特别的地方。刚好最近项目里面有两件点要去探索，我自己做了一个，把另外一个分给另外一个同事。他很快就做完了，而就是这个最简单的例子，我也做了好几天。探索的工作结束，进入到正式的开发工作，其他同事很快就可以接着我的工作继续开展。就是这个最简单的例子，除了了解技术的目的之外，我还写所有相关的脚本，万事俱备，只欠东风。而当我了解另外一个同事的工作时，我发现，他真的只做了一个最简单的例子，了解了一些基本概念。真正把这些内容运用到项目里时，左一个困难，右一个麻烦相继出现，我陪着他一个个克服了这些点，又把脚本预备好，几天之后，才真正进入到可以开发的状态。&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;有人曾经问过我，你把有趣的工作都做了，把无聊的工作留给别人是不是合适呢？毕竟每个人都希望在项目中成长。前面说过，我的工作是削除项目中的不确定因素。是的，很多人喜欢的就是解决不确定问题带来的快感。但不确定对每个人来说是不一样的。只要最基础的例子跑通了，这项技术的不确定性对我而言就解决了，但实际上，在具体使用这项技术中还会有一些不确定的问题等待解决，解决这样的问题，同样可以提高。&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;谈到成长，每个人都希望自己能够不断的成长，但是，即便是做同样的项目，每个人得到的机会也是不一样的，这样的差异实际上对应着各人不同的表现。和其他人一起工作的过程中，通过观察，我会把不同的工作交给不同的人来做。像前面说的那个同事，我之所以肯把一个探索的机会交给他，是因为他在之前的工作中表现出的态度和能力，虽然他的探索并不完全令人满意，但是，有了之前的信任，我会告诉他，怎么做才会做得更好。&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;之所以会想起这个话题，是因为一个同事与我聊起他项目焦头烂额的状态。他在那个项目组中，扮演着和我类似的角色，他感觉自己做得非常累，项目进展也有些问题，于是，我们俩聊起了如何发挥其他人的作用，既让新人感觉自己得到了锻炼，也让自己轻松一些。&lt;/p&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;div class="sysmsg"&gt;&lt;b&gt;&lt;a href="http://icity.cn" target="_blank"&gt;《城客》：第一本中文互动杂志！&lt;/a&gt;&lt;/b&gt;&lt;/div&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;</description>
	<pubDate>Tue, 30 Jun 2009 15:43:53 +0000</pubDate>
<feedburner:origLink>http://dreamhead.blogbus.com/logs/41733215.html</feedburner:origLink></item>
<item>
	<title>Akshay Dhavle: The Revolution</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-24663619.post-5672298956203028766</guid>
	<link>http://feedproxy.google.com/~r/PlanetTw/~3/dVbijXgWCbU/software-development-art-or-science.html</link>
	<description>&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-style: italic;"&gt;Software Development - Art OR Science?&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;A seemingly &lt;em&gt;clichéd&lt;/em&gt; question. Never passed my mind all these years. But let me tell you how I got thinking about this and maybe it'll interest you a bit.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Like I said earlier, I have been following a lot of Lean-Kanban discussions, articles, etc lately. Some such material is Little's Law &amp;amp; WIP limits. Now the moment I saw an equation, I couldn't resist the temptation of trying out some math to see if the size and composition of my current team is optimal. Furthermore, I thought, given a few specifications of the project like domain complexity and technology, could I find the optimum team size and composition?&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;I hit two forums with this idea and most of the feedback was that there are too many things to consider and difficult things as well like the skills and experience of the people on the team. And I agree that people make most if not all the difference. But that's the problem isn't it?&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;What's so special about our people? Skills. Experience. Talent even. It's a sign. It's a sign of our industry being immature. I think its in around the occupation stage on this scale.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;a href="http://lh6.ggpht.com/_dzAfXXbQjXY/Sklz4glua-I/AAAAAAAAAdo/bLxGIrVBUDY/s800/Art-Science.png"&gt;&lt;img src="http://lh6.ggpht.com/_dzAfXXbQjXY/Sklz4glua-I/AAAAAAAAAdo/bLxGIrVBUDY/s800/Art-Science.png" alt="" border="0" style="cursor: pointer; width: 767px; height: 325px;"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Enough demand can trigger the Art - Occupation - Industry - Science transitions for any activity. Note that the transition is never 100%. There's Art and Science in everything. The question is whether something is "more of" art OR science.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;People keep arguing that Software Development is different. We are not like construction, we are not like assembly line manufacturing, we are not like Product Development either. I used to believe it till a few days back. But the more I think about it the more I feel that these are arguments of a losing population of craftsmen who are finding it increasingly difficult to meet the demand for their craft (which has BTW risen at unusual rates).&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Think about the guy somewhere around current Pakistan who created the first piece of leather clothing many hundred years ago. Think about the leather industry right now. Think about the transition. At some point he must be saying "This is different. This needs skills. This needs experience". It took centuries for the transition but it happened. I am sure it can be co-related to the rise in demand for leather products.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;The funny thing is, if you look at the list of general characteristics of the Art and Science sides, the first three points on each side don't really fit in with the IT occupation do they? We have loads of unskilled people sitting around producing amazing amounts of useless code all over the world.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;So I think the revolution is inevitable. At some point the people who pays us boatloads of money for bad software are going to revolt. We either have to change OR die.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;a href="http://www.virtualschool.edu/cox/pub/PSIR/"&gt;Here's another article&lt;/a&gt; roughly talking about similar things. The author anticipated a code market to emerge where reusable components would be bought and sold (which didn't happen OR hasn't happened yet). But the rest of the content is around the same theme as this post.&lt;br&gt;&lt;/br&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img src="https://blogger.googleusercontent.com/tracker/24663619-5672298956203028766?l=agileanalysis.blogspot.com" height="1" width="1"&gt;&lt;/img&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/agilebusinessanalysis/~4/l4dCHzMvZqU" height="1" width="1"&gt;&lt;/img&gt;</description>
	<pubDate>Tue, 30 Jun 2009 13:37:48 +0000</pubDate>
	<author>noreply@blogger.com (Akshay Dhavle)</author>
<feedburner:origLink>http://feedproxy.google.com/~r/agilebusinessanalysis/~3/l4dCHzMvZqU/software-development-art-or-science.html</feedburner:origLink></item>
<item>
	<title>Mark Needham: F#: What I've learnt so far</title>
	<guid isPermaLink="false">http://www.markhneedham.com/blog/?p=1391</guid>
	<link>http://feedproxy.google.com/~r/PlanetTw/~3/gA2zVR2o3pw/</link>
	<description>&lt;p&gt;I did a presentation of some of the stuff that I've learnt from playing around with F# over the last six months or so at the most recent &lt;a href="http://sydney.ozalt.net/2009/05/june-meeting-f.html"&gt;Alt.NET Sydney meeting&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I've included the slides below but there was also some interesting discussion as well.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;One of the questions asked was around how you would deal with code on a real project with regards to structuring it and ensuring that it was maintainable. I'm not actually sure what the answer is to this question as I haven't written any code in F# that's in production but there are certainly applications written n F# that are in production - the main one that I know a bit about is one which &lt;a href="http://pandamonial.com/"&gt;Amanda Laucher&lt;/a&gt; worked on &lt;a href="http://vimeo.com/3555080"&gt;which she spoke about at the Alt.NET conference in Seattle&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;There was some discussion about dynamic v static languages - &lt;a href="http://fragmental.tw/"&gt;Phil&lt;/a&gt; spoke of not caring about what type something is rather caring about what it does. I pretty much agree with this and I think when using languages which have quite strong type inference such as F# (and more-so Haskell from what I hear) then I think we do move more towards that situation. &lt;/li&gt;
&lt;li&gt;&lt;a href="http://erik.doernenburg.com"&gt;Erik&lt;/a&gt; raised the point that functional languages aren't the solution for everything and I certainly feel it's niche is probably around operations with heavy data parsing/mining involved. I'm not sure I'd fancy doing an ASP.NET MVC application only in F# although I've seen some WPF code written using F# (unfortunately can't remember where) which looked reasonable so I'm not sure we should write it off just yet.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I've put the code that I walked through in the presentation on &lt;a href="http://bitbucket.org/markhneedham/altnet-sydney-fsharp/changeset/dfcbc2acf486/"&gt;bitbucket&lt;/a&gt;.&lt;/p&gt;
&lt;div style="width: 425px; text-align: left;" id="__ss_1661108"&gt;&lt;a style="font: 14px Helvetica,Arial,Sans-serif; display: block; margin: 12px 0 3px 0; text-decoration: underline;" href="http://www.slideshare.net/markhneedham/f-what-ive-learnt-so-far?type=presentation" title="F#: What I've learnt so far"&gt;F#: What I've learnt so far&lt;/a&gt;
&lt;div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;"&gt;View more &lt;a style="text-decoration: underline;" href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a style="text-decoration: underline;" href="http://www.slideshare.net/markhneedham"&gt;markhneedham&lt;/a&gt;.&lt;/div&gt;
&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/MarkNeedham/~4/oMi5qerZzXw" height="1" width="1"&gt;&lt;/img&gt;</description>
	<pubDate>Tue, 30 Jun 2009 13:09:35 +0000</pubDate>
<feedburner:origLink>http://feedproxy.google.com/~r/MarkNeedham/~3/oMi5qerZzXw/</feedburner:origLink></item>
<item>
	<title>Richard Durnall: Top 200 Blogs for Developers</title>
	<guid isPermaLink="false">http://www.richarddurnall.com/?p=72</guid>
	<link>http://feedproxy.google.com/~r/PlanetTw/~3/8SlYkBQrx7k/</link>
	<description>&lt;p&gt;I just made Jurgen Appelo’s list of &lt;a href="http://www.noop.nl/2009/06/top-200-blogs-for-developers-q2-2009.html" target="_blank" rel="nofollow" title="Top 200 Blogs for Developers"&gt;‘Top 200 Blogs for Developers’&lt;/a&gt;. I’m sneaking in there at number 198, apparently down from 150 when Jurgen last published the list. It’s my own fault for not blogging for almost three months!&lt;/p&gt;
&lt;p&gt;There are some great blogs in the list that I’m already aware of and a heap more that I’m going to trawl my way through. Let me know if you come across any that are worth a look…&lt;/p&gt;
&lt;p&gt;Oh, and the irony of being a non-developer appearing in the list isn’t lost on me either!&lt;/p&gt;</description>
	<pubDate>Tue, 30 Jun 2009 08:57:17 +0000</pubDate>
<feedburner:origLink>http://www.richarddurnall.com/?p=72</feedburner:origLink></item>
<item>
	<title>Marc McNeill: If you say Log out, log me out</title>
	<guid isPermaLink="false">http://www.dancingmango.com/blog/?p=708</guid>
	<link>http://feedproxy.google.com/~r/PlanetTw/~3/56HEm-vxC0A/</link>
	<description>&lt;p&gt;You’ve logged into your on-line banking checked your balance, paid your bills.  What do you do now?  Click on the logout button?&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.dancingmango.com/blog/wp-content/uploads/2009/06/logout.jpg"&gt;&lt;img src="http://www.dancingmango.com/blog/wp-content/uploads/2009/06/logout.jpg" title="Alliance and Leicester logout call to action" height="57" width="245" alt="" class="aligncenter size-full wp-image-709"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;What do you expect will happen now?  Well given that you have actively chosen to log-out (it’s not something you are likely to click on my mistake), you’d expect to do exactly that.  Logout.  The next screen you get will probably be something that thanks you for on-line banking, with a cross sell for a product or two.&lt;/p&gt;
&lt;p&gt;That’s what I assume most customers would expect.  So what are Alliance and Leicester thinking about with this screen?&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.dancingmango.com/blog/wp-content/uploads/2009/06/alliance.jpg"&gt;&lt;img src="http://www.dancingmango.com/blog/wp-content/uploads/2009/06/alliance.jpg" title="Alliance and Leicester logout" height="267" width="500" alt="" class="aligncenter size-full wp-image-707"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The customer has clicked log-out but they are still logged in?&lt;/p&gt;
&lt;p&gt;Why?&lt;/p&gt;
&lt;p&gt;“You are still logged in to Internet Banking - before you go have a look at &lt;em&gt;Your offers&lt;/em&gt;.”&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Excuse me, I logged out, I don’t need to be logged in for you to show me offers.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Worse: “Are you sure you want to log out?”&lt;/p&gt;
&lt;p&gt;&lt;em&gt;OF COURSE I WANT TO LOG OUT!!! Why else would I have clicked the link.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Alliance and Leicester fail here in a fundamental usability rule, that of managing the customer’s expectation. In an application where security isn’t paramount this would be an error, in an application where customers expect their action of leaving their secure accounts will do exactly that… but doesn’t, is inexcusable.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Dancingmango?a=kR_WDARmRYc:N_kOfT_bZss:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Dancingmango?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Dancingmango?a=kR_WDARmRYc:N_kOfT_bZss:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Dancingmango?i=kR_WDARmRYc:N_kOfT_bZss:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Dancingmango?a=kR_WDARmRYc:N_kOfT_bZss:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Dancingmango?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Dancingmango?a=kR_WDARmRYc:N_kOfT_bZss:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Dancingmango?i=kR_WDARmRYc:N_kOfT_bZss:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Dancingmango?a=kR_WDARmRYc:N_kOfT_bZss:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Dancingmango?i=kR_WDARmRYc:N_kOfT_bZss:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Dancingmango/~4/kR_WDARmRYc" height="1" width="1"&gt;&lt;/img&gt;</description>
	<pubDate>Tue, 30 Jun 2009 08:26:13 +0000</pubDate>
<feedburner:origLink>http://feedproxy.google.com/~r/Dancingmango/~3/kR_WDARmRYc/</feedburner:origLink></item>
<item>
	<title>Jeff Xiong: Cruise全绿了</title>
	<guid isPermaLink="false">tag:gigix.thoughtworkers.org,2009-06-30:524</guid>
	<link>http://feedproxy.google.com/~r/PlanetTw/~3/NqqnaZiLKmg/cruise-stages-are-all-green</link>
	<description>&lt;p&gt;好久没有过了也～～Cruise全绿，连IE6的测试也通过了也～～&lt;/p&gt;


&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/h2uhOoGA5j7qOubonKpDug?authkey=Gv1sRgCJnDko2spN-Z2wE&amp;amp;feat=embedwebsite"&gt;&lt;img src="http://lh3.ggpht.com/_W2jNeu8ilLQ/Skl7BCIREgI/AAAAAAAAGMg/UAXMOA8DBZY/s400/IMG_2423%5B1%5D.jpg"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;

	&lt;p&gt;Cruise是个让人快乐的软件，Mingle是个让人不快的软件，因为Cruise不要你去管它，Mingle总要你拖来拖去 &lt;sup&gt;_&lt;/sup&gt;&lt;/p&gt;</description>
	<pubDate>Tue, 30 Jun 2009 02:43:53 +0000</pubDate>
<feedburner:origLink>http://gigix.thoughtworkers.org/2009/6/30/cruise-stages-are-all-green</feedburner:origLink></item>
<item>
	<title>Ross Pettit: The Case for Restructuring IT</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-30621875.post-5998619253659141106</guid>
	<link>http://feedproxy.google.com/~r/PlanetTw/~3/ruTPdswUTwQ/case-for-restructuring-it.html</link>
	<description>&lt;p&gt;Business is tough right now, and it’s going to be so for a while. In tough times, you want to be very good at what you do. The more “fighting fit” you are, the more likely you are to survive a challenge.&lt;/p&gt;&lt;p&gt;Unfortunately, IT isn’t all that good at what it does. In fact, on the whole, it’s pretty bad. That means that IT isn’t very well prepared for this downturn.&lt;/p&gt;&lt;p&gt;How bad is it? The research organizations have historically reported a pretty high failure rate of IT projects: about 30% of all IT projects fail outright, while another 30% disappoint their business sponsor (e.g., excessive cost, wrong functionality).&lt;sup&gt;&lt;span style="font-size: 78%;"&gt;1&lt;/span&gt;&lt;/sup&gt; On the whole, an IT investment has, at best, a 4 in 10 chance of success.&lt;/p&gt;&lt;p&gt;Companies are already reticent to invest in this climate. IT doesn't offer scared capital a safe haven.&lt;/p&gt;&lt;p&gt;It also suggests that IT is on a trajectory of self-destruction. If we want to look ahead to where IT is headed, we need look no further than present day Detroit. &lt;/p&gt;&lt;p&gt;&lt;img src="http://cache.jalopnik.com/assets/images/12/2008/12/Motor-City-Industrial-Park.jpg" alt="" border="0" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 609px; CURSOR: hand; HEIGHT: 459px; TEXT-ALIGN: center;"&gt;&lt;/img&gt;&lt;/p&gt;&lt;p align="center"&gt;&lt;span style="font-size: 85%;"&gt;Photo credit: Ben Wojdyla, &lt;/span&gt;&lt;a href="http://jalopnik.com/5110995/the-ruins-of-detroit-industry-five-former-factories"&gt;&lt;span style="font-size: 85%;"&gt;The Ruins of Detroit Industry &lt;/span&gt;&lt;/a&gt;&lt;br&gt;&lt;/br&gt;&lt;/p&gt;&lt;br&gt;&lt;/br&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;How did this happen? Consider some of the forces that have shaped the current IT landscape in the past 20 years. The steady growth of IT that was accelerating slightly with the advent of client/server gave rise to explosive growth driven by the combination of internet and Y2K. By the mid-1990's, demand for IT was dramatically outstripping supply. To satiate this demand, IT went in pursuit of scale. To get scale, IT took professional jobs and codified them into industrial tasks, because it’s easier to staff vast numbers of people in highly specialized roles than it is to develop professional capability to solve business problems using technology.&lt;/p&gt;&lt;p&gt;Today, businesses buy, recruit, staff, govern, gatekeep, develop, analyze and test following a model that puts a priority on “big.” &lt;/p&gt;&lt;p&gt;Unfortunately, all the time we’ve been in pursuit of scale, we’ve not been in pursuit of results. Results are assumed.   We assume armies of specialists will follow an explicitly defined project plan to produce a solution that is technically sound, functionally complete, and financially satisfactory, all with minimal risk of impairment.&lt;/p&gt;&lt;p&gt;With a 4 in 10 batting average, results cannot be assumed.&lt;/p&gt;&lt;p&gt;By placing a priority to scale, IT mistakes effort for results. We often see success expressed as a function of hours to be invested. It isn’t that simple. Successfully delivering an IT solution is a function of a lot of factors, such as clear communication, effective collaboration and &lt;a href="http://agilemanager.blogspot.com/2007/07/alpha-returns-require-alpha-it.html"&gt;capability&lt;/a&gt;; well-informed decision making about technology, functionality and commercial viability throughout the life of a project; flexibility and responsiveness; and ultimately, producing meaningful things for our business partners. These can’t be captured in task orders and forecasts of work effort. They’re &lt;a href="http://agilemanager.blogspot.com/2007/10/it-governance-maximises-it-returns.html"&gt;lifestyle decisions&lt;/a&gt; of how IT goes about its business.&lt;/p&gt;&lt;p&gt;It is time to restructure IT, to move away from an effort-centric industrial model, towards result-centric professional one.&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 78%;"&gt;&lt;sup&gt;1&lt;/sup&gt; As an example, the 2009 &lt;/span&gt;&lt;a href="http://www.standishgroup.com/newsroom/chaos_2009.php"&gt;&lt;span style="font-size: 78%;"&gt;CHAOS report from The Standish Group&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 78%;"&gt; shows that things haven't changed all that much, reporting 44% of IT projects were challenged (late, over budget, and / or with less than required features and functions) while another 24% failed. &lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img src="https://blogger.googleusercontent.com/tracker/30621875-5998619253659141106?l=agilemanager.blogspot.com" height="1" width="1"&gt;&lt;/img&gt;&lt;/div&gt;</description>
	<pubDate>Tue, 30 Jun 2009 02:26:00 +0000</pubDate>
	<author>noreply@blogger.com (Ross Pettit)</author>
<feedburner:origLink>http://agilemanager.blogspot.com/2009/06/case-for-restructuring-it.html</feedburner:origLink></item>
<item>
	<title>Martin Fowler: Revitalizing Enterprise Software</title>
	<guid isPermaLink="false">tag:martinfowler.com,2009-06-29:Revitalizing-Enterprise-Software-</guid>
	<link>http://feedproxy.google.com/~r/PlanetTw/~3/ZszkBJftVFI/videos</link>
	<description>web site news: AMP, an Australian financial services company, ran an
    internal conference called Amplify. They asked me to talk about
    agile software development. I thought about how to make this best
    fit into the overall flow of the conference, particularly since I
    expected a significant part of the audience to not be part of
    IT. I settled on talking about how IT projects can be
    infrastructural or strategic. This classification alters how you
    approach the projects, in particular on the way IT and business
    people should collaborate.</description>
	<pubDate>Mon, 29 Jun 2009 23:14:00 +0000</pubDate>
<feedburner:origLink>http://www.amplify.amp.com.au/videos?video=Martin%20Fowler%20-%20What%20if%20enterprise%20software%20was%20cheaper,%20faster,%20better%20AND%20COOL?</feedburner:origLink></item>
<item>
	<title>Felix Leipold: CATting multiple files</title>
	<guid isPermaLink="false">http://wuetender-junger-mann.de/wordpress/?p=779</guid>
	<link>http://feedproxy.google.com/~r/PlanetTw/~3/78Ovmngma7I/</link>
	<description>Quite often I want to pipe the content of multiple files into a command line utility. An example would be to count the lines of sql in my project. This is another case, where &lt;code&gt;xargs&lt;/code&gt; comes in handy:
&lt;pre&gt;find . -name "*.sql" | xargs cat | wc -l
&lt;/pre&gt;</description>
	<pubDate>Mon, 29 Jun 2009 17:28:16 +0000</pubDate>
<feedburner:origLink>http://wuetender-junger-mann.de/wordpress/?p=779</feedburner:origLink></item>
<item>
	<title>Felix Leipold: Visualising log files with gnuplot</title>
	<guid isPermaLink="false">http://wuetender-junger-mann.de/wordpress/?p=768</guid>
	<link>http://feedproxy.google.com/~r/PlanetTw/~3/L9VNvTkXe8U/</link>
	<description>&lt;p&gt;
I recently had the pleasure of supporting a new system throughout its first month of production. This was a good opportunity to refresh my command line skills. As it happened I spent a lot of time looking at log files trying to figure out what happened to the productions system. I figured, that a graphical representation of the events would be nice and started using &lt;a href="http://www.gnuplot.info/"&gt;gnuplot&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;
First I started out with a bunch of bash scripts, using what your usual unix installation provides, but then I actually came up with &lt;a href="http://github.com/fleipold/logvisualizer/tree/master"&gt;some groovy scripts&lt;/a&gt; to provide better abstractions. A log file generally looks somewhat like this:
&lt;/p&gt;
&lt;pre&gt;04/01/1970 07:55:13 garbage
04/01/1970 09:27:48 Event 2
04/01/1970 10:01:28 garbage
04/01/1970 10:38:30 garbage
04/01/1970 10:48:36 garbage
04/01/1970 10:51:58 Event 2
04/01/1970 11:03:45 garbage
04/01/1970 11:34:03 Event 1
04/01/1970 12:24:33 garbage
05/01/1970 04:35:50 ERROR
&lt;/pre&gt;
&lt;p&gt;
There is a lot of garbage plus some events we might be interested in. It allows to specify events, e.g. by providing a regexp:
&lt;/p&gt;
&lt;code&gt;&lt;pre&gt; 
&lt;a href="http://www.google.com/search?q=allinurl%3AEvent+java.sun.com&amp;amp;bntl=1"&gt;&lt;span style="color: #aaaadd; font-weight: bold;"&gt;Event&lt;/span&gt;&lt;/a&gt; EVENT1 = &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; RegExEvent&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;"Event 1"&lt;/span&gt;, ~/&lt;a href="http://www.google.com/search?q=allinurl%3AEvent+java.sun.com&amp;amp;bntl=1"&gt;&lt;span style="color: #aaaadd; font-weight: bold;"&gt;Event&lt;/span&gt;&lt;/a&gt; &lt;span style="color: #cc66cc;"&gt;1&lt;/span&gt;/&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;
&lt;a href="http://www.google.com/search?q=allinurl%3AEvent+java.sun.com&amp;amp;bntl=1"&gt;&lt;span style="color: #aaaadd; font-weight: bold;"&gt;Event&lt;/span&gt;&lt;/a&gt; EVENT2 = &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; RegExEvent&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;"Event 2"&lt;/span&gt;, ~/&lt;a href="http://www.google.com/search?q=allinurl%3AEvent+java.sun.com&amp;amp;bntl=1"&gt;&lt;span style="color: #aaaadd; font-weight: bold;"&gt;Event&lt;/span&gt;&lt;/a&gt; &lt;span style="color: #cc66cc;"&gt;2&lt;/span&gt;/&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;
&lt;a href="http://www.google.com/search?q=allinurl%3AEvent+java.sun.com&amp;amp;bntl=1"&gt;&lt;span style="color: #aaaadd; font-weight: bold;"&gt;Event&lt;/span&gt;&lt;/a&gt; ERROR = &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; RegExEvent&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;"Error"&lt;/span&gt;, ~/ERROR/&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;
The next step is newing up a &lt;code&gt;TimeLineVisualizer&lt;/code&gt; on these events and passing in a stream with the actual log:
&lt;/p&gt;
&lt;code&gt;&lt;pre&gt; 
def logFile = &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; &lt;a href="http://www.google.com/search?q=allinurl%3AFile+java.sun.com&amp;amp;bntl=1"&gt;&lt;span style="color: #aaaadd; font-weight: bold;"&gt;File&lt;/span&gt;&lt;/a&gt;&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;"test.log"&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;;
 
logFile.&lt;span style="color: #006600;"&gt;withInputStream&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;{&lt;/span&gt;&lt;a href="http://www.google.com/search?q=allinurl%3AInputStream+java.sun.com&amp;amp;bntl=1"&gt;&lt;span style="color: #aaaadd; font-weight: bold;"&gt;InputStream&lt;/span&gt;&lt;/a&gt; stream -&amp;gt;
  def visualizer = &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; TimeLineVisualizer&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;[&lt;/span&gt;
          EVENT1,
          EVENT2,
          ERROR
  &lt;span style="color: #66cc66;"&gt;]&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;;
  visualizer.&lt;span style="color: #006600;"&gt;visualize&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;stream&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;
&lt;span style="color: #66cc66;"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;
If you have the &lt;code&gt;gnuplot&lt;/code&gt; binary on your path this will yield something like this:
&lt;/p&gt;

&lt;img src="http://wuetender-junger-mann.de/wordpress/wp-content/uploads/2009/06/timeline.png" alt="timeline" title="timeline" class="alignnone size-full wp-image-771" width="846"&gt;&lt;/img&gt;

&lt;p&gt;
Also in some cases you would like to know which time of day events are most likely to happen. For producing histograms I created another visualizer (which currently takes only one event).
&lt;/p&gt;
&lt;code&gt;&lt;pre&gt; 
logFile.&lt;span style="color: #006600;"&gt;withInputStream&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;{&lt;/span&gt;&lt;a href="http://www.google.com/search?q=allinurl%3AInputStream+java.sun.com&amp;amp;bntl=1"&gt;&lt;span style="color: #aaaadd; font-weight: bold;"&gt;InputStream&lt;/span&gt;&lt;/a&gt; stream -&amp;gt;
  def visualizer = &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; HistogramVisualizer&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;EVENT2, HistogramVisualizer.&lt;span style="color: #006600;"&gt;HOUR_OF_DAY_BINS&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;
  visualizer.&lt;span style="color: #006600;"&gt;visualize&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;stream&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;
&lt;span style="color: #66cc66;"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;
For the example log file, which unfortunately has an even distribution of events, we get this:
&lt;/p&gt;
&lt;img src="http://wuetender-junger-mann.de/wordpress/wp-content/uploads/2009/06/histogram.png" alt="histogram" title="histogram" class="alignnone size-full wp-image-772" width="846"&gt;&lt;/img&gt;
&lt;p&gt;
The cool thing about gnuplot is, that you can actually run these things in a cron job to produce daily reports (and mail them to the appropriate people) or on a continuous integration server to visualise how the system is being exercised by the test suite.
&lt;/p&gt;</description>
	<pubDate>Mon, 29 Jun 2009 17:17:28 +0000</pubDate>
<feedburner:origLink>http://wuetender-junger-mann.de/wordpress/?p=768</feedburner:origLink></item>
<item>
	<title>Marc McNeill: SOA, architecture without foundation</title>
	<guid isPermaLink="false">http://www.dancingmango.com/blog/?p=699</guid>
	<link>http://feedproxy.google.com/~r/PlanetTw/~3/UIGcloU2uAo/</link>
	<description>&lt;p&gt;Service Orientated Architecture (SOA) is something that is easy for the lay person to understand.  (Try getting a techie to explain REST and you will see the attraction of SOA to the business person - it’s understandable!)  Understandable, in my non-techie hands, is dangerous.  I am entirely unqualified to pass judgment on it, but there are a couple of  things I’ve observed and have been on my mind when I’ve seen SOA nastiness going on.  So excuse me whilst I wax lyrical.&lt;br&gt;&lt;/br&gt;
&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Problem 1. IT haven’t got a clue.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;My (lay) understanding of SOA: IT build ’services’ that can be consumed by different applications.  SOA enables us to remove duplication and build the foundations for a scalable architecture that will accommodate changing requirements as the business evolves and grows.  Herein lies the problem; IT build ’services’, second guessing what the business actually needs from said service.&lt;/p&gt;
&lt;p&gt;Exhibit One:  Customer Details Service. It exposes details of customers to any application that will use information about customers.   It was designed by the architect in isolation based upon what IT believe a Customer Details Service will be required to do (e.g. the nature of the fields, the domain etc).  This is even though no application has been built, yet alone specified for (”we just know we are going to need customer details”).  It’s putting the cart before the horse.  But IT go ahead and build the service anyway, &lt;em&gt;because they own SOA&lt;/em&gt;.   At a later date the business articulate requirements for a new downstream application that requires Customer Details.  It’s the Corporate Business whose domain is Corporate Customers.  But what happens?  The service doesn’t quite meet their requirements.  &lt;em&gt;The fields are wrong&lt;/em&gt;.  The Customer Details Service fits the domestic consumer model but not the corporate customers model.  What gives? More likely than not the downstream application.  &lt;em&gt;The corporate customer has to be shoe-horned into the domestic customer service. &lt;/em&gt;I’ve seen this done.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lesson 1. &lt;/strong&gt;Don’t build SOA in a void.  Get out of that architectural ivory tower and engage with the business (if you can get them to listen - see next point). Better still engage in &lt;a href="http://jim.webber.name/presentations.html" target="_blank"&gt;Guerrilla SOA&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Problem 2. The business haven’t got a clue.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;One of the sad realities of the corporate world is that walls that have sprung up and created internal silos that are difficult to bridge.  As the business, the consumer of technology, I want IT to deliver to my requirements, no more, no less.  If I am in the domestic consumer part of the business, frankly I don’t care about Corporate customers.  I’m fighting for my budget, and hell, if this SOA thing is going to cost more than doing a closed application that fits only domestic customers, that only I can use I don’t care.  I’m not going to pay for a “Customer Details” service that does anything except give me what I need to know about my customer.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lesson 2.&lt;/strong&gt; The architects should facilitate the discussion.  SOA is as much about your business vision as it is technical architecture.  Unless the business grasps what you are trying to do, drives the solution and requirements are both local and global, before long you’ll see some grand services that few use in the core and chaos is the periphery where the real business is done.&lt;/p&gt;
&lt;p&gt;Bottom line?  All too often architects fail because they tend to focus upon the architecture part of SOA rather than the services.    Unfortunately, because of the siloed nature of so may organisaitons, unless it is driven by the architects it is unlikely to gain traction.  If there is a maxim that should be followed when considering SOA in an organisation, it is probably instilling the notion of ‘think local, act global’.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Dancingmango?a=90iYZUZ5_PU:vM4PjrhVcNc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Dancingmango?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Dancingmango?a=90iYZUZ5_PU:vM4PjrhVcNc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Dancingmango?i=90iYZUZ5_PU:vM4PjrhVcNc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Dancingmango?a=90iYZUZ5_PU:vM4PjrhVcNc:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Dancingmango?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Dancingmango?a=90iYZUZ5_PU:vM4PjrhVcNc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Dancingmango?i=90iYZUZ5_PU:vM4PjrhVcNc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Dancingmango?a=90iYZUZ5_PU:vM4PjrhVcNc:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Dancingmango?i=90iYZUZ5_PU:vM4PjrhVcNc:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Dancingmango/~4/90iYZUZ5_PU" height="1" width="1"&gt;&lt;/img&gt;</description>
	<pubDate>Mon, 29 Jun 2009 14:40:53 +0000</pubDate>
<feedburner:origLink>http://feedproxy.google.com/~r/Dancingmango/~3/90iYZUZ5_PU/</feedburner:origLink></item>
<item>
	<title>Steven List: Facilitation Antipattern: Repetitor</title>
	<guid isPermaLink="false">http://www.stevenlist.com/blog/?p=464</guid>
	<link>http://feedproxy.google.com/~r/PlanetTw/~3/kcESZbFIRqI/</link>
	<description>&lt;hr&gt;&lt;/hr&gt;&lt;strong&gt;Motto&lt;/strong&gt;: It’s worth repeating. It’s worth repeating. It’s worth repeating.&lt;br&gt;&lt;/br&gt;
&lt;strong&gt;Belief&lt;/strong&gt;: You’ll only understand if I say it at least three times.&lt;br&gt;&lt;/br&gt;
&lt;strong&gt;Behavior&lt;/strong&gt;: Says the same thing repeatedly, frequently in somewhat different words, frequently two, three, or more times.&lt;br&gt;&lt;/br&gt;
&lt;strong&gt;Characteristics&lt;/strong&gt;: Articulate, filled with conviction, perhaps lacking &lt;a href="http://www.stevenlist.com/blog/tag/confidence/" class="st_tag internal_tag" rel="tag" title="Posts tagged with confidence"&gt;confidence&lt;/a&gt;
&lt;hr&gt;&lt;/hr&gt;In &lt;a href="http://www.stevenlist.com/blog/2009/06/28/its-the-subleties/"&gt;my last post&lt;/a&gt;, this would have sounded like this:
&lt;blockquote&gt;&lt;p&gt;It’s about the &lt;a href="http://www.stevenlist.com/blog/tag/subtleties/" class="st_tag internal_tag" rel="tag" title="Posts tagged with subtleties"&gt;subtleties&lt;/a&gt;. You know – it’s about the little things. It’s about the stuff that’s not so obvious – the &lt;a href="http://www.stevenlist.com/blog/tag/subtleties/" class="st_tag internal_tag" rel="tag" title="Posts tagged with subtleties"&gt;subtleties&lt;/a&gt;… the things that others hear in what you say whether you were aware of it or not…&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Repetitors are usually articulate. They are able to express themselves. In the positive way, without the unneeded repetitions, a Repetitor would be an &lt;a href="http://www.stevenlist.com/blog/2009/03/13/facilitation-pattern-articulate/"&gt;Articulate&lt;/a&gt;. By repeating themselves, without checking to see whether the listener is understanding, the Repetitor turns a Pattern into an Antipattern.&lt;/p&gt;
&lt;p&gt;Dealing with a Repetitor is as simple as a variant on the &lt;a href="http://www.stevenlist.com/blog/2009/02/04/the-facilitation-four-step-tm/"&gt;Facilitation Four-Step&lt;/a&gt;: Interrupt, Ask, Redirect, Commit.&lt;/p&gt;
&lt;h3&gt;Interrupt&lt;/h3&gt;
&lt;p&gt;“Excuse me, Frank.”&lt;/p&gt;
&lt;h3&gt;Ask&lt;/h3&gt;
&lt;p&gt;“Do you mind…”&lt;/p&gt;
&lt;h3&gt;Redirect&lt;/h3&gt;
&lt;p&gt;“…if I check in with the others for a moment?”&lt;/p&gt;
&lt;h3&gt;Commit&lt;/h3&gt;
&lt;p&gt;“We’ll get right back to what you were saying.”&lt;/p&gt;
&lt;h3&gt;Action (yes, a 5th step &lt;img src="http://www.stevenlist.com/blog/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley"&gt;&lt;/img&gt;  )&lt;/h3&gt;
&lt;p&gt;“Sue, just so we’re clear, can you tell us what Frank’s point was?”&lt;/p&gt;
&lt;p&gt;In this way, I validate that others have heard Frank, check to make sure that they’ve understood Frank, and break the pattern of repetition.&lt;/p&gt;
&lt;hr&gt;&lt;/hr&gt;Related Pattern: &lt;a href="http://www.stevenlist.com/blog/2009/03/13/facilitation-pattern-articulate/"&gt;Articulate&lt;/a&gt;
&lt;p&gt;&lt;img src="http://postrank.com/graphics/b.gif?s=vjp7ul4" alt=""&gt;&lt;/img&gt;&lt;/p&gt;
&lt;p align="left"&gt;&lt;a href="http://twitter.com/home/?status=Facilitation+Antipattern%3A+Repetitor+http://www.stevenlist.com/blog/?p=464" class="tt" title="Post to Twitter"&gt;&lt;img src="http://www.stevenlist.com/blog/wp-content/plugins/tweet-this/icons/tt-twitter.png" alt="[Post to Twitter]" border="0" class="nothumb"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://twitter.com/home/?status=Facilitation+Antipattern%3A+Repetitor+http://www.stevenlist.com/blog/?p=464" class="tt" title="Post to Twitter"&gt;Tweet This Post&lt;/a&gt;  &lt;/p&gt;&lt;a href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.stevenlist.com%2Fblog%2F2009%2F06%2F29%2Ffacilitation-antipattern-repetitor%2F&amp;amp;linkname=Facilitation%20Antipattern%3A%20Repetitor" class="a2a_dd addtoany_share_save"&gt;&lt;img src="http://www.stevenlist.com/blog/wp-content/plugins/add-to-any/share_save_120_16.png" alt="Share/Save/Bookmark" height="16" width="120"&gt;&lt;/img&gt;&lt;/a&gt;
	&lt;h4&gt;Related posts&lt;/h4&gt;
	&lt;ul class="st-related-posts"&gt;
	&lt;li&gt;&lt;a href="http://www.stevenlist.com/blog/2009/02/15/facilitation-antipattern-dominator/" title="Facilitation Antipattern: Dominator (February 15, 2009)"&gt;Facilitation Antipattern: Dominator&lt;/a&gt; (0)&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://www.stevenlist.com/blog/2009/02/04/the-facilitation-four-step-tm/" title="The Facilitation Four-Step(tm) (February 4, 2009)"&gt;The Facilitation Four-Step(tm)&lt;/a&gt; (3)&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://www.stevenlist.com/blog/2009/02/10/facilitation-pattern-co-worker/" title="Facilitation Pattern: Co-Worker (February 10, 2009)"&gt;Facilitation Pattern: Co-Worker&lt;/a&gt; (0)&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://www.stevenlist.com/blog/2009/02/04/facilitation-antipattern-the-qualifier/" title="Facilitation Antipattern: The Qualifier (February 4, 2009)"&gt;Facilitation Antipattern: The Qualifier&lt;/a&gt; (1)&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://www.stevenlist.com/blog/2009/01/30/facilitation-antipattern-superhero/" title="Facilitation Antipattern: Superhero (January 30, 2009)"&gt;Facilitation Antipattern: Superhero&lt;/a&gt; (0)&lt;/li&gt;
&lt;/ul&gt;</description>
	<pubDate>Mon, 29 Jun 2009 11:11:03 +0000</pubDate>
<feedburner:origLink>http://www.stevenlist.com/blog/2009/06/29/facilitation-antipattern-repetitor/</feedburner:origLink></item>
<item>
	<title>Michael Patricios: Rise of the crapplication</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-2452497389474481952.post-6302929843723759145</guid>
	<link>http://feedproxy.google.com/~r/PlanetTw/~3/J4vEjgNMYGA/rise-of-crapplication.html</link>
	<description>There has been chatter of late in the iPhone developer forums that I frequent regarding the prolifation of crap applications (&lt;span style="font-style: italic;"&gt;crapplications&lt;/span&gt;, or simply &lt;span style="font-style: italic;"&gt;crapps&lt;/span&gt;) in the App Store and that the App Store model encourages this. Could this really be true?&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Like many others, I have a full-time job and just develop iPhone applications in my spare time. But that does not mean it costs nothing to develop my applications. On the contrary - my spare time is very valuable to me - but how do I quantify it? If you assume that I did some other work, say contract work, over that time then the opportunity cost of this lost income can be determined.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;With this in mind, I decided to examine one of my applications, &lt;a href="http://kissthemachine.com/magnetic/"&gt;Magnetic Block Puzzle&lt;/a&gt; to see what the cost of developing it was and what sort of sales I would need to achieve to break even in a reasonable period of time.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;span style="font-size: 130%;"&gt;Magnetic Block Puzzle deconstructed&lt;/span&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;I estimate that it took around 200 - 300 hours to develop, from start to release-ready code. In order to calculate an opportunity cost for this time, I need to determine an hourly rate. Conservatively I am using a rate of £30 per hour. That equates to an opportunity cost of £6,000 to £9,000. For the rest of this exercise, I will use the average of £7,500 (about $11,500). Expenses incurred in developing the application have been ignored.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;So, how many sales are required to break even?&lt;br&gt;&lt;/br&gt;&lt;div style="text-align: center;"&gt;.nobrtable br { display: none; font-size: 0.6em; }&lt;br&gt;&lt;/br&gt;&lt;div class="nobrtable"&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;table style="border: 1px solid rgb(111, 111, 111); padding: 1em;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Tier&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;Price ($)&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;Price (£)&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;Pre-tax profit (£)&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;Req sales&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Tier 1&lt;/td&gt;&lt;td&gt;0.99&lt;/td&gt;&lt;td&gt;0.59&lt;/td&gt;&lt;td&gt;0.36&lt;/td&gt;&lt;td&gt;20,833&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Tier 2&lt;/td&gt;&lt;td&gt;1.99&lt;/td&gt;&lt;td&gt;1.19&lt;/td&gt;&lt;td&gt;0.72&lt;/td&gt;&lt;td&gt;10,417&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Tier 3&lt;/td&gt;&lt;td&gt;2.99&lt;/td&gt;&lt;td&gt;1.79&lt;/td&gt;&lt;td&gt;1.09&lt;/td&gt;&lt;td&gt;6,881&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Tier 4&lt;/td&gt;&lt;td&gt;3.99&lt;/td&gt;&lt;td&gt;2.39&lt;/td&gt;&lt;td&gt;1.45&lt;/td&gt;&lt;td&gt;5,172&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Tier 5&lt;/td&gt;&lt;td&gt;4.99&lt;/td&gt;&lt;td&gt;2.99&lt;/td&gt;&lt;td&gt;1.82&lt;/td&gt;&lt;td&gt;4,121&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Tier 6&lt;/td&gt;&lt;td&gt;5.99&lt;/td&gt;&lt;td&gt;3.49&lt;/td&gt;&lt;td&gt;2.12&lt;/td&gt;&lt;td&gt;3,538&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Tier 7&lt;/td&gt;&lt;td&gt;6.99&lt;/td&gt;&lt;td&gt;3.99&lt;/td&gt;&lt;td&gt;2.43&lt;/td&gt;&lt;td&gt;3,086&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Tier 8&lt;/td&gt;&lt;td&gt;7.99&lt;/td&gt;&lt;td&gt;4.99&lt;/td&gt;&lt;td&gt;3.04&lt;/td&gt;&lt;td&gt;2,467&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Tier 9&lt;/td&gt;&lt;td&gt;8.99&lt;/td&gt;&lt;td&gt;5.49&lt;/td&gt;&lt;td&gt;3.34&lt;/td&gt;&lt;td&gt;2,246&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Tier 10&lt;/td&gt;&lt;td&gt;9.99&lt;/td&gt;&lt;td&gt;5.99&lt;/td&gt;&lt;td&gt;3.65&lt;/td&gt;&lt;td&gt;2,055&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br&gt;&lt;/br&gt;&lt;/div&gt;&lt;br&gt;&lt;/br&gt;&lt;/div&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;div style="text-align: left;"&gt;&lt;a href="http://4.bp.blogspot.com/_xWpZXVYmOxY/SglMXD_4puI/AAAAAAAAACY/KPyqPJBgLIk/s1600-h/sales1.png"&gt;&lt;img src="http://4.bp.blogspot.com/_xWpZXVYmOxY/SglMXD_4puI/AAAAAAAAACY/KPyqPJBgLIk/s320/sales1.png" alt="" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 224px;" border="0" id="BLOGGER_PHOTO_ID_5334879192691025634"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br&gt;&lt;/br&gt;&lt;/div&gt;I need to sell 10,417 copies at its current price of £1.19 ($1.99) just to break even! How many sales are required then, per day to break even in six months?&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;div style="text-align: center;"&gt;&lt;div class="nobrtable"&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;table style="border: 1px solid rgb(111, 111, 111); padding: 1em;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Tier&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;Price ($)&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;Price (£)&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;Pre-tax profit (£)&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;Req sales per day&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Tier 1&lt;/td&gt;&lt;td&gt;0.99&lt;/td&gt;&lt;td&gt;0.59&lt;/td&gt;&lt;td&gt;0.36&lt;/td&gt;&lt;td&gt;114&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Tier 2&lt;/td&gt;&lt;td&gt;1.99&lt;/td&gt;&lt;td&gt;1.19&lt;/td&gt;&lt;td&gt;0.72&lt;/td&gt;&lt;td&gt;57&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Tier 3&lt;/td&gt;&lt;td&gt;2.99&lt;/td&gt;&lt;td&gt;1.79&lt;/td&gt;&lt;td&gt;1.09&lt;/td&gt;&lt;td&gt;38&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Tier 4&lt;/td&gt;&lt;td&gt;3.99&lt;/td&gt;&lt;td&gt;2.39&lt;/td&gt;&lt;td&gt;1.45&lt;/td&gt;&lt;td&gt;28&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Tier 5&lt;/td&gt;&lt;td&gt;4.99&lt;/td&gt;&lt;td&gt;2.99&lt;/td&gt;&lt;td&gt;1.82&lt;/td&gt;&lt;td&gt;23&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Tier 6&lt;/td&gt;&lt;td&gt;5.99&lt;/td&gt;&lt;td&gt;3.49&lt;/td&gt;&lt;td&gt;2.12&lt;/td&gt;&lt;td&gt;19&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Tier 7&lt;/td&gt;&lt;td&gt;6.99&lt;/td&gt;&lt;td&gt;3.99&lt;/td&gt;&lt;td&gt;2.43&lt;/td&gt;&lt;td&gt;17&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Tier 8&lt;/td&gt;&lt;td&gt;7.99&lt;/td&gt;&lt;td&gt;4.99&lt;/td&gt;&lt;td&gt;3.04&lt;/td&gt;&lt;td&gt;13&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Tier 9&lt;/td&gt;&lt;td&gt;8.99&lt;/td&gt;&lt;td&gt;5.49&lt;/td&gt;&lt;td&gt;3.34&lt;/td&gt;&lt;td&gt;12&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Tier 10&lt;/td&gt;&lt;td&gt;9.99&lt;/td&gt;&lt;td&gt;5.99&lt;/td&gt;&lt;td&gt;3.65&lt;/td&gt;&lt;td&gt;11&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br&gt;&lt;/br&gt;&lt;/div&gt;&lt;br&gt;&lt;/br&gt;&lt;/div&gt;&lt;br&gt;&lt;/br&gt;57 copies a day at the current price doesn't sound too bad until you consider that it needs to maintain this level for six months and that on its best sales day it hasn't come close to this amount. It's looking unlikely that I will break even on this any time soon, if ever.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;What are the options then? Raising the price requires fewer sales to break even, but raising the price will result in a decrease in sales too, so this is unlikely to help.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Perhaps lowering the price to 59p ($0.99) will help boost sales? It probably will, but at that price the required number of sales to break even shoots up to 20,833 or 114 a day for six months.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;The only other option is to lower the development cost. In other words, spend less time developing it in the first place. Too late for this application, but valuable information to take to the next one. Knocking off 10% or 20% is not going to change the situation much. The decrease needs to be significant (say, an order of magnitude). Putting 20 - 30 hours of effort into building an application means an opportunity cost of around £750, which can more realistically be recouped through App Store sales in an acceptable period of time. But what can be built in 20 - 30 hours? Ah, a crapplication.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;span style="font-size: 130%;"&gt;Pricing&lt;/span&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;The above logic of course assumes that a crapplication will sell as well as something that took ten times longer to develop. Unfortunately, the history of the App Store leads me to believe that you are no more certain to sell something good than you are to sell something crap. If it appeals to the masses, it will probably sell, irrespective of how bad or how good it might be (&lt;a href="http://ifartmobile.com/"&gt;this&lt;/a&gt; is the best example of the former).&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;A &lt;a href="http://www.highglosssoftware.com/Blog/Entries/2009/1/22_i_Wrote_a_top_10_app....and_its_shit.html"&gt;popular story&lt;/a&gt; that is quoted is the developer that decided to see what could be built in an hour; came up with Sound Grenade in 20 minutes and landed up cracking the App Store top 10 with it.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;span style="font-size: 130%;"&gt;The blessed / dreaded charts&lt;/span&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;To break even many sales are required at a low price, or fewer sales at a higher price. In pre-App Store days people would happily pay £5 to £10 ($7 to $15), or even more for a mobile application. Ringtones and images were confined to the price brackets below this. The App Store has changed everything. Customers now expect to be able to buy just about anything for 59p ($0.99). It wasn't always like this - I remember the first few apps on the App Store being more costly. Didn't I purchase Super Monkey Ball and Enigmo for £5.99 ($9.99) each? Yes, I did. What happened?&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;This slide can arguably be attributed to the App Store charts. The charts are just based on downloads, irrespective of cost. So, a £5.99 ($10.00) application would need 10 times the turnover in order to compete with a 59p ($0.99) application in the charts. Of course, this is a losing battle. Surely charts should take the price into consideration? As it stands, it has clearly become a volume game.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Getting a spot in the App Store charts is essential for every developer. The charts tend to be self-perpetuating. Once an application is in there, it is noticed by more people and therefore downloaded more, boosting its position in the charts, leading to even more people noticing it and so on.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;It seems then that developers have little choice but to charge 59p ($0.99) or £1.19 ($1.99), or at a push £1.79 ($2.99) and hope they crack the charts. If they don't, the application is quickly confined to the &lt;span style="font-style: italic;"&gt;abyss of unnoticed applications&lt;/span&gt; (AUA), picking up the odd few sales here and there, but ultimately not very many.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;span style="font-size: 130%;"&gt;Summary&lt;/span&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;It would seem that the best return on investment is to spend as little time as possible building an app, try to give it mass appeal and price it at tier 1 (59p or $0.99). Perhaps then building iPhone software with the aim of making money is viable.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;If like me you have spent a significant amount of time building applications, for very little reward, console yourself with the fact that many of us are in the same boat. Let the enjoyment of building the application be your reward and the sales (if there are any) be a nice bonus.&lt;div class="blogger-post-footer"&gt;&lt;img src="https://blogger.googleusercontent.com/tracker/2452497389474481952-6302929843723759145?l=mpatric.blogspot.com" height="1" width="1"&gt;&lt;/img&gt;&lt;/div&gt;</description>
	<pubDate>Mon, 29 Jun 2009 10:40:21 +0000</pubDate>
	<author>noreply@blogger.com (mpatric)</author>
<feedburner:origLink>http://mpatric.blogspot.com/2009/05/rise-of-crapplication.html</feedburner:origLink></item>
<item>
	<title>Fabio Pereira: Principle of Relative Priority</title>
	<guid isPermaLink="false">http://fabiopereira.me/blog/?p=170</guid>
	<link>http://feedproxy.google.com/~r/PlanetTw/~3/Hug9oROFuic/</link>
	<description>&lt;p&gt;Prioritization is crucial for a project to succeed. We need to make sure that we deliver what’s most important, what adds more value. The interesting and most challenging part of this is when we have to ask the business (client, product owner) to prioritize &lt;em&gt;items&lt;/em&gt;. By calling them &lt;em&gt;items&lt;/em&gt; I mean they are not necessarily &lt;a href="http://en.wikipedia.org/wiki/User_story" target="blank"&gt;stories&lt;/a&gt;, features or a &lt;a href="http://www.mountaingoatsoftware.com/product-backlog" target="blank"&gt;product backlog&lt;/a&gt;. Sometimes we want to &lt;a href="http://feeds.feedburner.com/" target="blank"&gt;prioritize needs, purpose, goals and outcomes&lt;/a&gt; as well. The way we ask them is the trick…&lt;/p&gt;
&lt;p&gt;I’ve seen many different ways of defining the priorities and usually there are ranges involved, sometimes with labels or numbers, like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Very High / High / Medium / Low&lt;/li&gt;
&lt;li&gt;Must Have / Should Have / Could Have&lt;/li&gt;
&lt;li&gt;Essential / Important / Not very important&lt;/li&gt;
&lt;li&gt;1 - 5&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There is nothing wrong with creating the labels, but when we ask the priority of &lt;strong&gt;one item only&lt;/strong&gt;, that’s what happens sometimes:&lt;/p&gt;
&lt;div style="text-align: center;"&gt;&lt;img src="http://fabiopereira.me/blog/wp-content/uploads/2009/06/photoisimportant.png" alt="IsImportant.png" height="247" border="0" width="631"&gt;&lt;/img&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How do we understand business priorities&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The most effective prioritization exercise I’ve seen was to give the business a randomized list of &lt;em&gt;items&lt;/em&gt; we want to be prioritized, then we ask them to give us the X most important items. And these will be the ones considered during the next timeframe. We should always let the list visible to the stakeholder who is prioritizing… It has to be clear for him that he is &lt;strong&gt;giving up on items&lt;/strong&gt; in favor or others… at least for the next timeframe, which could be the next iteration of release.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;It’s like a son’s birthday gift…&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Good parents apply this rule with their children. Let’s say it’s close to my son’s birthday, I don’t have a son, this is totally hypothetical :), but my mother used this rule with me… So, I want to buy him &lt;strong&gt;a gift, ONLY ONE&lt;/strong&gt;, of course, because I’m not the kind of dad that gives everything that my son wants. So I have a &lt;a href="http://www.mountaingoatsoftware.com/product-backlog" target="blank"&gt;list of gifts&lt;/a&gt; that I know my son wants. Bike and video game are top of the list, but I can give him only one now, because it’s his birthday. We all know It’s close to Christmas (next iteration/release) and I will give him the other one on Christmas, but now it’s his birthday time, only one gift… I, then, make sure that my son understands the &lt;strong&gt;one gift per event&lt;/strong&gt; rule and ask him which one does he want as his birthday gift… As a clever boy, he will think carefully which one really matters more to him because it’s clear that he has to &lt;strong&gt;give up&lt;/strong&gt; on one in favor of the other. He will not give up on it forever though, it’s just until Christmas (next iteration/release), however, he knows that one of them will be bought and received first, and the other will come later…&lt;br&gt;&lt;/br&gt;
&lt;/p&gt;
&lt;div style="text-align: center;"&gt;&lt;img src="http://fabiopereira.me/blog/wp-content/uploads/2009/06/photowhichonestoriesbikeatari.png" alt="WhichOneStoriesBikeAtari.png" height="315" border="0" width="557"&gt;&lt;/img&gt;&lt;/div&gt;
&lt;p&gt;As I said, there is no problem in defining labels and priority buckets, the only thing we have to bear in mind is that whenever we ask the business to prioritize items, we do not ask them in which &lt;strong&gt;bucket he wants to put one single item&lt;/strong&gt;. And that’s when the principle comes. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Principle of Relative Priority:&lt;/strong&gt;&lt;/p&gt;
&lt;div style="text-align: center;"&gt;
&lt;strong&gt;&lt;em&gt; All the decisions about item priority have to involve other items which are being traded in favor or the most important one(s). There is no absolute priority, only relative to other items. &lt;/em&gt;&lt;/strong&gt;
&lt;/div&gt;
&lt;p&gt;One item by itself is usually important, otherwise it would not even be in the wish list… If I ask my son:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Dad: “Do you want a bike?”&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Son: YES!&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Dad: “Do you want a video game?”&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Son: YES!&lt;/em&gt;&lt;/li&gt;
&lt;p&gt;
&lt;/p&gt;&lt;/ul&gt;
&lt;p&gt;But when they have to &lt;strong&gt;CHOOSE&lt;/strong&gt;… That’s when the most important items are picked… And during times of crisis, like now, with budgets constraints, we don’t even know if we will be able to afford a Christmas gift, so let’s make our &lt;em&gt;kids happy&lt;/em&gt; during their birthday…&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/FabioPereiraTechnical/~4/uOCTo34c-UU" height="1" width="1"&gt;&lt;/img&gt;</description>
	<pubDate>Mon, 29 Jun 2009 09:04:03 +0000</pubDate>
<feedburner:origLink>http://feedproxy.google.com/~r/FabioPereiraTechnical/~3/uOCTo34c-UU/</feedburner:origLink></item>
<item>
	<title>Simon Brunning: Links for 2009-06-28 [del.icio.us]</title>
	<guid isPermaLink="false">http://del.icio.us/brunns#2009-06-28</guid>
	<link>http://feedproxy.google.com/~r/PlanetTw/~3/dQE9G-r21HA/brunns</link>
	<description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.debianhelp.co.uk/postgresql.htm"&gt;PostgreSQL Database Server Configuration in Debian&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://code.djangoproject.com/ticket/11393"&gt;Query on decimal fields with long string representation of float causes exception&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
	<pubDate>Mon, 29 Jun 2009 07:00:00 +0000</pubDate>
<feedburner:origLink>http://feedproxy.google.com/~r/SmallValuesOfCool/~3/v_o3LrA396k/brunns</feedburner:origLink></item>

</channel>
</rss>
