<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>pushbomb &#187; agile practices</title>
	<atom:link href="http://team.pushbomb.com/category/software-as-strategic/agile-practices/feed/" rel="self" type="application/rss+xml" />
	<link>http://team.pushbomb.com</link>
	<description>tv programmed by the collective</description>
	<lastBuildDate>Tue, 05 Jan 2010 22:49:48 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='team.pushbomb.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/a08732ed34e6814d5a5513fe8cde5696?s=96&#038;d=http://s2.wp.com/i/buttonw-com.png</url>
		<title>pushbomb &#187; agile practices</title>
		<link>http://team.pushbomb.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://team.pushbomb.com/osd.xml" title="pushbomb" />
	<atom:link rel='hub' href='http://team.pushbomb.com/?pushpress=hub'/>
		<item>
		<title>SharePoint MOSS 2007 &#8216;DeepZoom 3D&#8217; is Here&#8230;.Click Below&#8230;</title>
		<link>http://team.pushbomb.com/2008/11/19/sharepoint-moss-3d-is-almost-ready-this-was-taken-this-morning/</link>
		<comments>http://team.pushbomb.com/2008/11/19/sharepoint-moss-3d-is-almost-ready-this-was-taken-this-morning/#comments</comments>
		<pubDate>Wed, 19 Nov 2008 15:25:56 +0000</pubDate>
		<dc:creator>Damon Wilder Carr</dc:creator>
				<category><![CDATA[C# 3.0 Enhancements]]></category>
		<category><![CDATA[Framework Design]]></category>
		<category><![CDATA[Industry News]]></category>
		<category><![CDATA[Siverlight]]></category>
		<category><![CDATA[Software Design]]></category>
		<category><![CDATA[Software Futures]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Windows Presentation Foundation]]></category>
		<category><![CDATA[agile practices]]></category>
		<category><![CDATA[concepts implemented]]></category>
		<category><![CDATA[sharepoint]]></category>
		<category><![CDATA[software as strategic]]></category>
		<category><![CDATA[.NET 3.5]]></category>
		<category><![CDATA[3D]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[domain.dot.net]]></category>
		<category><![CDATA[MOSS]]></category>
		<category><![CDATA[Opacity]]></category>
		<category><![CDATA[Perspective]]></category>
		<category><![CDATA[taxonomy]]></category>
		<category><![CDATA[Visualization]]></category>

		<guid isPermaLink="false">http://dcarr.wordpress.com/?p=1111</guid>
		<description><![CDATA[The breakthough for discovering your information in the Sharepoint world is almost here. This image is absolutely real and 100% cross-platform in the browser via Silverlight. None of us have ever seen anything like this. How about you?<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=1111&subd=dcarr&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p style="text-align:center;"> </p>
<p style="text-align:center;"> <span>can </span></p>
<p style="text-align:center;"><span>you</span></p>
<p style="text-align:center;"><span>find</span></p>
<p style="text-align:center;"><span>the</span></p>
<p style="text-align:center;"><span>ghosts?</span></p>
<div id="attachment_1112" class="wp-caption aligncenter" style="width: 250px"><a href="http://www.domaindotnet.com/ClientBin/DeepZoom3D.html"><img class="size-full wp-image-1112 " style="display:inline;border:black 2px solid;margin:0 55px 0 0;" title="sharepoint3d" src="http://dcarr.files.wordpress.com/2008/11/sharepoint3d.png?w=240&#038;h=188" alt="a PowerPoint document in our breakthrough navigation and discovery technology" width="240" height="188" align="left" /></a><p class="wp-caption-text">click me and be prepared</p></div>
<p> </p>
<p style="text-align:center;">Send a screen shot if you find them to : <a href="mailto:innovate@domaindotnet.com">innovate@domaindotnet.com</a> and the best image will recieve some swag! Non-trivial swag as well! </p>
<p style="text-align:center;"> </p>
<p style="text-align:center;"><a title="Full perspective in 3D" href="http://blog.domaindotnet.com/2008/11/07/sharepoint-moss-3d-is-almost-ready-this-was-taken-this-morning/sharepoint3d/"></a></p>
<div class="vcard"><span class="fn n"><span class="given-name">Damon</span> <span class="additional-name">Wilder</span> <span class="given-family">Carr</span> </span></div>
<div class="org">domain.dot.net</div>
<div class="org">team labs</div>
<div><a class="email" href="mailto:damon@domaindotnet.com">damon@domaindotnet.com</a></div>
<div class="adr">
<div class="tel"><a class="htc" href="646.853.3504"></a><a class="htc" href="646.853.3504"></a><a class="htc" href="646.853.3504"><a class="htc" href="646.853.3504">646.853.3504</a></a></div>
<div><a class="url" href="http://www.domaindotnet.com">http://www.domaindotnet.com</a></div>
</div>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<h3>Related Posts</h3>
<div class="wlw_related_posts">from tag <a href="http://del.icio.us/damoncarr/sharepoint">SharePoint</a></div>
<ul>
<li><a href="http://msdn2.microsoft.com/en-us/office/bb251754.aspx">Business Data Catalog</a></li>
<li><a href="http://sharepointrss.com/">SharePoint RSS Alpha</a></li>
<li><a href="http://www.microsoft.com/technet/windowsserver/sharepoint/wssapps/templates/default.mspx">Templates for SharePoint</a></li>
<li><a href="http://msdn2.microsoft.com/en-us/library/ms948927.aspx">Creating a Web Part with Custom Properties</a></li>
<li><a href="http://www.sharepoint-tips.com/2007/05/sharepoint-designer-article-2-creating.html">SharePoint Creating XSLT DataView</a></li>
<li><a href="http://www.codeplex.com/smartpart">SmartPart for SharePoint &#8211; Home</a></li>
<li><a href="http://msdn2.microsoft.com/en-us/library/bb264593.aspx">Windows SharePoint Services 3.0</a></li>
</ul>
<p>from tag <a href="http://del.icio.us/damoncarr/C#">C#</a></p>
<ul>
<li><a href="terms=video&amp;folder=103006&amp;folder=103007&amp;folder=103008&amp;folder=103009&amp;folder=103010&amp;folder=103011&amp;folder=103012&amp;sort=14&amp;queryType=1">Video Favorites</a></li>
<li><a href="http://www.codeplex.com/SharpArchitecture">S#arp Architecture: ASP.NET MVC with NHibernate &#8211; Home</a></li>
<li><a href="http://skillsmatter.com/go/open-source-dot-net">Skills Matter OPEN SOURCE .NET</a></li>
<li><a href="http://www.castleproject.org/">Home :: Castle Project</a></li>
<li><a href="http://blog.domaindotnet.com/2008/08/24/nhibernate-20-gold-released-must-wait-for-linq-to-nhibernate/">NHibernate 2.0 gold Released – Must Wait for ‘Linq to NHibernate’ « ubiquitous fluency</a></li>
</ul>
<p><a href="http://del.icio.us/damoncarr/C#">(more..)</a></p>
<br />Posted in agile practices, C# 3.0 Enhancements, concepts implemented, Framework Design, Industry News, sharepoint, Siverlight, software as strategic, Software Design, Software Futures, Technology, Windows Presentation Foundation Tagged: .NET 3.5, 3D, C#, domain.dot.net, MOSS, Opacity, Perspective, sharepoint, taxonomy, Visualization <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dcarr.wordpress.com/1111/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dcarr.wordpress.com/1111/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dcarr.wordpress.com/1111/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dcarr.wordpress.com/1111/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dcarr.wordpress.com/1111/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dcarr.wordpress.com/1111/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dcarr.wordpress.com/1111/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dcarr.wordpress.com/1111/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dcarr.wordpress.com/1111/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dcarr.wordpress.com/1111/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=1111&subd=dcarr&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://team.pushbomb.com/2008/11/19/sharepoint-moss-3d-is-almost-ready-this-was-taken-this-morning/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7b572cbcda5a17fe984e7dd1ddc9c3d6?s=96&#38;d=&#38;r=PG" medium="image">
			<media:title type="html">pushbomb</media:title>
		</media:content>

		<media:content url="http://dcarr.files.wordpress.com/2008/11/sharepoint3d.png" medium="image">
			<media:title type="html">sharepoint3d</media:title>
		</media:content>
	</item>
		<item>
		<title>The Real Agile from 1973 : Expanded Discussion of the factual basis for Software as &#8216;Wicked Problem&#8217;</title>
		<link>http://team.pushbomb.com/2008/08/12/the-real-agile-from-1973-expanded-discussion-of-the-factual-basis-for-software-as-wicked-problem/</link>
		<comments>http://team.pushbomb.com/2008/08/12/the-real-agile-from-1973-expanded-discussion-of-the-factual-basis-for-software-as-wicked-problem/#comments</comments>
		<pubDate>Tue, 12 Aug 2008 22:29:35 +0000</pubDate>
		<dc:creator>Damon Wilder Carr</dc:creator>
				<category><![CDATA[agile practices]]></category>
		<category><![CDATA[software as strategic]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[software improvement]]></category>
		<category><![CDATA[software ROI]]></category>
		<category><![CDATA[wicked problem]]></category>

		<guid isPermaLink="false">http://dcarr.wordpress.com/2008/08/12/the-real-agile-from-1973-expanded-discussion-of-the-factual-basis-for-software-as-wicked-problem/</guid>
		<description><![CDATA[Ask yourself personally your opinion on the genesis for a software process/method. What made waterfall become a shared mental belief system in millions of minds yet fail so consistently, and indeed provide the only level of 'predictability' in software at that time (an expectation of predictable disaster). I could continue on the facts above for a few pages but it merely is an example of our need to carefully choose a belief system that actually has the added value of being correct.
Ask yourself personally your opinion on the genesis for a software process/method.  What made waterfall become a shared mental belief system in millions of minds yet fail so consistently, and indeed provide the only level of 'predictability' in software at that time (an expectation of predictable disaster). I could continue on the facts above for a few pages but it merely is an example of our need to carefully choose a belief system that actually has the added value of being correct.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=658&subd=dcarr&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p align="left">
<h1><a href="http://knol.google.com/-/-/29dmrtp9mkh0f/ffovaa/firstagile1.gif"><img style="display:inline;float:right;margin:0 0 15px 15px;" src="http://knol.google.com/k/-/-/29dmrtp9mkh0f/ffovaa/firstagile1.gif" border="0" alt="" /></a></h1>
<p>What&#8217;s your opinion on the genesis for a new software process/method entering the mainstream?</p>
<p>They don&#8217;t emerge as collective practice from air.</p>
<p>What made waterfall become a shared mental belief system in millions of minds yet fail so consistently, and indeed provide the only level of &#8216;predictability&#8217; in software at that time (an expectation of predictable disaster).</p>
<p>I could continue on the facts above for a few pages but it merely is an example of our need to carefully choose a belief system that actually has the added value of being correct.</p>
<p>in terms likely unseen (and unknown by most)    What do you believe the memes for successful adoption are? Why did waterfall dominate for so long and at such pain?</p>
<p>For this discussion, your opinion of why Agile succeeded yet while it also brings impassioned opposition from others is a focus of thought.</p>
<p>Yet indeed while software is filled with so many amazing minds why do we fail on the most basic and fundamental topics more as a rule then exception (code reuse for example is still an utter failure for no reason other than human constraints. The technology has existed for well over a decade if not more).</p>
<p>Mental models/belief systems around software development drive &#8216;methods/methodologies&#8217; for implementation. Unfortunately, many fallacies define the standard for how others perceive &#8216;how the work should be performed&#8217;.</p>
<div style="margin-left:40px;background-color:#073763;">
<ul>
<li>The needs of our stakeholders are perfectly reasonable given their perspective and perhaps not always wrong (but clearly so historically).</li>
<li>Their amazement at our inability to perform to their expectations are not new and in most cases would be expected if the facts discussed here were made explicit.</li>
</ul>
</div>
<p>This has been the shame of software for decades, as we seem to have a terrible time growing into a mature field of science. There is far too much failure, lack of predictability, and utter frustration at the highest levels of corporations globally. What happened and why is Agile / Wicked Problem thinking so helpful?</p>
<p>What are some of the reasons this disconnect exists?</p>
<p><a class="knol-anchor-headings" name="H1-Enter-Agile"></a></p>
<h2>Enter Agile</h2>
<p>Agile was and mostly is the best approach to resolve the most painful aspects of fitting an artisan’s model into an assembly line mentality. Agile reconciles organizational needs in software around previously unrealistic demands around predictability, verifiable estimations, and planning.</p>
<p>Buzzwords and industry hyperbole aside, Agile has moved our industry forward in fundamental ways. We believe this is mostly around its focus on team-centric behaviors and simply not watering down the statement of facts around software most in the &#8216;methods&#8217; world could never do as it would sever their ability to be embraced! Agile simply told the truth and said &#8216;enough is enough&#8217; let us do this using some common sense.</p>
<p><a class="knol-anchor-headings" name="H2-Wicked-Problems"></a></p>
<h2>&#8216;Wicked Problems&#8217;</h2>
<p>Now consider a model already used in many domains that goes back to 1973. This model has already defined the very drivers of &#8216;what is software development&#8217; we assert. Consider the following:</p>
<p>NOTE: For a more complete listing and discussion please see <a href="http://knol.google.com/k/damon-wilder-carr/software-development-as-wicked-problem/#references">[3]</a></p>
<p>If you cannot admit 90% of these statements below about software, why would you believe Agile would work for you?</p>
<div style="margin-left:40px;">
<ul>
<li>You do not understand the problem until you have developed a solution.There is no definitive statement of “The Problem.” The problem is ill structured and composed of an evolving set of interlocking issues and constraints.</li>
<li>Wicked problems have no stopping ruleSince there is global/definitive “Problem” (for example a software system is often perceived as different depending on the context of the stakeholder/user being asked), there is also no definitive “Solution” as each perspective has a different &#8216;optimal&#8217; end-state. The problem solving process ends when you run out of resources. and/or a &#8216;good enough&#8217; compromise is met for all the drivers behind a project.</li>
<li>Every wicked problem is essentially unique and novel.There are so many factors and conditions, all embedded in a dynamic social context, that no two wicked problems are alike, and the solutions to them will always be custom designed and fitted.</li>
</ul>
</div>
<p>Every solution to a wicked problem is a “one-shot operation,” every attempt has consequences.</p>
<p>This is not around all code being written from scratch in the least. This means that the delivered software for a wicked problem is unique but almost always composed of other &#8216;non-wicked&#8217; solutions..</p>
<p>Who would even consider delivering a strategic application where nothing is leveraged from others?</p>
<p>Wicked problems have no given alternative solutions.</p>
<p>There may be no solutions, or there may be a host of potential solutions that are devised, and another host that are never even considered. This is the nature of solving complex and &#8216;moving target&#8217; type concerns</p>
<p><a class="knol-anchor-headings" name="H3-Mock-Frameworks-are-a-Mandate"></a></p>
<p>Mock Frameworks are a Mandate</p>
<p>Although a side discussion, we believe it merits your attention as we simply have no idea how anyone can succeed at Agile without a Mock-Centric world.</p>
<p>Consider an &#8216;API&#8217; you require but is now ill defined and not even built. Do succeed this API must &#8216;appear to exist and indeed appear to be working&#8217; to our system as we evolve items around it. For example, a complex API for financial calculations is assumed, but at iteration three we only required a few aspects of that API.</p>
<p>For more discussion on this critical yet later stage topic <a href="http://blog.domaindotnet.com/agile-best-practices/mock-frameworks-are-predicates-to-success-aka-no-argument-from-those-succeeding-but-much-from-those-failing/">go here for our deeper discussion</a></p>
<p><a class="knol-anchor-headings" name="H4-Facts-will-not-Save-Us"></a></p>
<p>Facts will not Save Us</p>
<p>1) It is irrelevant how correct the above is until external, internal or a combination of forces move the collective thought.</p>
<p>Typically, the competitive market and legislation protecting shareholders should resolve the glaring nature of this issue. However, it is ignorant for we technologists to believe the ‘objective truth’ of our knowledge will directly drive cultural shifts. It does not happen that way in most cases. If it did we would all have OS/2 running on our machines and beta-max machines.</p>
<p>2) Most cannot actually act on these facts or even acknowledge their reality.</p>
<p>This is of course due to their having to ‘change everything’ in how their fiefdoms execute, not to mention trying to explain this to the other stakeholders of IT. I see disastrous practices perpetuated rather than trying to actually be viewed strategically in the value they could offer their organization.</p>
<p><a class="knol-anchor-headings" name="H5-Conclusion-for-Now"></a></p>
<h2>Conclusion for Now</h2>
<p>Ask yourself these questions at the most fundamental:</p>
<ul>
<li>Does your culture understand and nurture ‘software as iterative learning and Wicked Problem’.</li>
<li>If so can you only acknowledge this fact with your team (that’s fine, as good luck explaining this to most C-Level execs. In fact we recommend not mentioning Agile unless they mention it to you first.</li>
<li>How do you treat short-term failures from iterative development (assuming a strong set of feedback loops allowing constant course correction and validation)?</li>
</ul>
<div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:6b81b8ac-fbb4-4ada-96f7-a9116bca52e8" class="wlWriterSmartContent" style="display:inline;float:none;margin:0;padding:0;">del.icio.us Tags: <a rel="tag" href="http://del.icio.us/popular/agile">agile</a>,<a rel="tag" href="http://del.icio.us/popular/wicked+problem">wicked problem</a>,<a rel="tag" href="http://del.icio.us/popular/software+engineering">software engineering</a>,<a rel="tag" href="http://del.icio.us/popular/software+improvement">software improvement</a>,<a rel="tag" href="http://del.icio.us/popular/software+ROI">software ROI</a></div>
<div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:ce5839be-8691-448c-8907-ede44808be9f" class="wlWriterSmartContent" style="display:inline;float:none;margin:0;padding:0;">Technorati Tags: <a rel="tag" href="http://technorati.com/tags/agile">agile</a>,<a rel="tag" href="http://technorati.com/tags/wicked+problem">wicked problem</a>,<a rel="tag" href="http://technorati.com/tags/software+engineering">software engineering</a>,<a rel="tag" href="http://technorati.com/tags/software+improvement">software improvement</a>,<a rel="tag" href="http://technorati.com/tags/software+ROI">software ROI</a></div>
<div class="wlWriterHeaderFooter" style="text-align:right;margin:0;padding:4px 0;"><a href="http://digg.com/submit?url=http%3a%2f%2fdcarr.wordpress.com%2f2008%2f08%2f12%2fthe-real-agile-from-1973-expanded-discussion-of-the-factual-basis-for-software-as-wicked-problem%2f&amp;title=The+Real+Agile+from+1973+%3a+Expanded+Discussion+of+the+factual+basis+for+Software+as+%e2%80%98Wicked+Problem%e2%80%99"><img style="border:0;" src="http://digg.com/img/badges/100x20-digg-button.png" border="0" alt="Digg This" width="100" height="20" /></a></div>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/dcarr.wordpress.com/658/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/dcarr.wordpress.com/658/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dcarr.wordpress.com/658/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dcarr.wordpress.com/658/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dcarr.wordpress.com/658/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dcarr.wordpress.com/658/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dcarr.wordpress.com/658/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dcarr.wordpress.com/658/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dcarr.wordpress.com/658/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dcarr.wordpress.com/658/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dcarr.wordpress.com/658/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dcarr.wordpress.com/658/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=658&subd=dcarr&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://team.pushbomb.com/2008/08/12/the-real-agile-from-1973-expanded-discussion-of-the-factual-basis-for-software-as-wicked-problem/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7b572cbcda5a17fe984e7dd1ddc9c3d6?s=96&#38;d=&#38;r=PG" medium="image">
			<media:title type="html">pushbomb</media:title>
		</media:content>

		<media:content url="http://knol.google.com/k/-/-/29dmrtp9mkh0f/ffovaa/firstagile1.gif" medium="image" />

		<media:content url="http://digg.com/img/badges/100x20-digg-button.png" medium="image">
			<media:title type="html">Digg This</media:title>
		</media:content>
	</item>
		<item>
		<title>Update! CruiseControl.net Advanced Metrics &#8211; RC1 1.4 Build</title>
		<link>http://team.pushbomb.com/2008/06/19/open-source-project-updated-cruise-controlnet-advanced-metrics/</link>
		<comments>http://team.pushbomb.com/2008/06/19/open-source-project-updated-cruise-controlnet-advanced-metrics/#comments</comments>
		<pubDate>Thu, 19 Jun 2008 16:25:11 +0000</pubDate>
		<dc:creator>Damon Wilder Carr</dc:creator>
				<category><![CDATA[C# 3.0 Enhancements]]></category>
		<category><![CDATA[C# 3.0 for Internal DSL]]></category>
		<category><![CDATA[Framework Design]]></category>
		<category><![CDATA[Proof Driven Development]]></category>
		<category><![CDATA[Software Futures]]></category>
		<category><![CDATA[agile practices]]></category>
		<category><![CDATA[CC.NET]]></category>
		<category><![CDATA[CCStatistics]]></category>
		<category><![CDATA[Continuous Integration]]></category>

		<guid isPermaLink="false">http://dcarr.wordpress.com/?p=267</guid>
		<description><![CDATA[I finally had time to perform some much needed upgrades to the code base for the qualitative and quantitative metrics for Cruise Control.net continuous integration (a must have in my opinion).

I'll be speaking more about it but here is the 'smoke mock/regression test' I just got running, and which all further regression-driven/verification-driven development will occur (not sure which I like better as a phrase but test-driven has got to go... It is so universally misunderstood, misapplied, and misconstrued. Can I get a witness?)...

Anyway here's the framework API for now. This will evolve into a full Linq provider (I hope)...<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=267&subd=dcarr&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>We finally had time to perform some much needed upgrades to the code base for the qualitative and quantitative metrics produced by our addin to CruiseControl.net continuous integration system</p>
<p>Anyway here&#8217;s an idea of how the framework API is shaping up. Expect this to move dramatically toward&#8217;s Fowler&#8217;s fantastic coverage of <a href="http://www.martinfowler.com/dslwip/ExpressionBuilder.html">&#8216;Expression Builder&#8217;</a>.</p>
<p><a href="http://www.ayende.com/projects/rhino-mocks/downloads.aspx"><img class="size-full wp-image-274 alignleft" style="margin:0 20px 0 0;" src="http://dcarr.files.wordpress.com/2008/06/rhinomocks-120x90.png?w=104&#038;h=78" alt="dont mock around" width="104" height="78" /></a></p>
<p>We hope that this will evolve into a full Linq provider, and due to the XML foundation this is not all that unrealistic a goal.<br />
 </p>
<p> </p>
<p> </p>
<pre><span style="background:black;color:#bbfdcc;">namespace </span><span style="background:black;color:#ffffff;">CCStatisticsTDD
{
    </span><span style="background:black;color:#bbfdcc;">using </span><span style="background:black;color:#ffffff;">System;
    </span><span style="background:black;color:#bbfdcc;">using </span><span style="background:black;color:#ffffff;">System.Collections.Generic;
    </span><span style="background:black;color:#bbfdcc;">using </span><span style="background:black;color:#ffffff;">System.Linq;
    </span><span style="background:black;color:#bbfdcc;">using </span><span style="background:black;color:#ffffff;">CCStatistics.Domain.Api;
    </span><span style="background:black;color:#bbfdcc;">using </span><span style="background:black;color:#ffffff;">CCStatistics.Domain.Api.Interfaces;
    </span><span style="background:black;color:#bbfdcc;">using </span><span style="background:black;color:#ffffff;">NUnit.Framework;
    </span><span style="background:black;color:#bbfdcc;">using </span><span style="background:black;color:#ffffff;">Rhino.Mocks;
    </span><span style="background:black;color:#bbfdcc;">using </span><span style="background:black;color:#ffffff;">TDDViewOutputStatus;
    </span><span style="background:black;color:#bbfdcc;">using </span><span style="background:black;color:#ffffff;">ThoughtWorks.CruiseControl.Core;

    </span><span style="background:black;color:#808080;">/// &lt;summary&gt;
    /// </span><span style="background:black;color:#008000;">This is a monolitic 'Smoke Test'. There are many fine grained tests to be writtem!
    </span><span style="background:black;color:#808080;">/// &lt;/summary&gt;
    </span><span style="background:black;color:#ffffff;">[</span><span style="background:black;color:#2b91af;">TestFixture</span><span style="background:black;color:#ffffff;">]
    </span><span style="background:black;color:#bbfdcc;">public class </span><span style="background:black;color:#2b91af;">MainTestFixtureBaselineSmokes </span><span style="background:black;color:#ffffff;">: </span><span style="background:black;color:#2b91af;">TestBase
    </span><span style="background:black;color:#ffffff;">{
        </span><span style="background:black;color:#808080;">/// &lt;summary&gt;
        /// </span><span style="background:black;color:#008000;">Gets the mock list.
        </span><span style="background:black;color:#808080;">/// &lt;/summary&gt;
        /// &lt;param name="mockBuildName"&gt;</span><span style="background:black;color:#008000;">Name of the mock build.</span><span style="background:black;color:#808080;">&lt;/param&gt;
        /// &lt;param name="repositoryBuildCount"&gt;</span><span style="background:black;color:#008000;">The repository build count.</span><span style="background:black;color:#808080;">&lt;/param&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        /// </span><span style="background:black;color:#008000;">Documentation Created 6/23/2008
        </span><span style="background:black;color:#bbfdcc;">private static </span><span style="background:black;color:#2b91af;">List</span><span style="background:black;color:#ffffff;">&lt;</span><span style="background:black;color:#bbfdcc;">string</span><span style="background:black;color:#ffffff;">&gt; GetMockList(</span><span style="background:black;color:#bbfdcc;">string </span><span style="background:black;color:#ffffff;">mockBuildName, </span><span style="background:black;color:#bbfdcc;">int </span><span style="background:black;color:#ffffff;">repositoryBuildCount)
        {
            </span><span style="background:black;color:#008000;">// Add the build name to the array tht is expected to be available for ALL builds
            // from the repositoy. Here we use 10

            </span><span style="background:black;color:#bbfdcc;">return
                </span><span style="background:black;color:#2b91af;">Enumerable</span><span style="background:black;color:#ffffff;">.Repeat(mockBuildName + </span><span style="background:black;color:#a31515;">" {0}"</span><span style="background:black;color:#ffffff;">, repositoryBuildCount).Select(
                    s =&gt; </span><span style="background:black;color:#2b91af;">String</span><span style="background:black;color:#ffffff;">.Format(s, </span><span style="background:black;color:#2b91af;">DateTime</span><span style="background:black;color:#ffffff;">.Now.TimeOfDay.TotalMilliseconds/1000)).ToList();
        }

        </span><span style="background:black;color:#bbfdcc;">protected override </span><span style="background:black;color:#2b91af;">ICCStatsProject </span><span style="background:black;color:#ffffff;">Prepare()
        {
            </span><span style="background:black;color:#008000;">// We need a name for this project
            </span><span style="background:black;color:#bbfdcc;">const </span><span style="background:black;color:#2b91af;">String </span><span style="background:black;color:#ffffff;">mockBuildName = </span><span style="background:black;color:#a31515;">"CCStatisticsBuildMock"</span><span style="background:black;color:#ffffff;">;

            </span><span style="background:black;color:#008000;">// Simulate 100 legacy build results
            </span><span style="background:black;color:#bbfdcc;">const int </span><span style="background:black;color:#ffffff;">repositoryBuildCount = 100;

            </span><span style="background:black;color:#bbfdcc;">var </span><span style="background:black;color:#ffffff;">repository = mocks.Stub&lt;</span><span style="background:black;color:#2b91af;">IIntegrationRepository</span><span style="background:black;color:#ffffff;">&gt;();
            </span><span style="background:black;color:#bbfdcc;">var </span><span style="background:black;color:#ffffff;">buildNames = GetMockList(mockBuildName, repositoryBuildCount);

            </span><span style="background:black;color:#008000;">// OK set this up to return our builds
            </span><span style="background:black;color:#ffffff;">repository.Stub(x =&gt; x.GetBuildNames()).Return(buildNames.ToArray());

            </span><span style="background:black;color:#bbfdcc;">var </span><span style="background:black;color:#ffffff;">currentProject = mocks.Stub&lt;</span><span style="background:black;color:#2b91af;">ICCStatsProject</span><span style="background:black;color:#ffffff;">&gt;();

            currentProject.Stub(x =&gt; x.IntegrationRepository).Return(repository);
            currentProject.Stub(x =&gt; x.StatisticsForPublisher).Return(MockStats);

            currentProject.StubEx(x =&gt; x.Name, mockBuildName).
                StubEx(x =&gt; x.BuildLogDirectory, DefaultDirectory).
                StubEx(x =&gt; x.ArtifactDirectory, DefaultDirectory).
                StubEx(x =&gt; x.WorkingDirectory, DefaultDirectory).
                Stub(x =&gt; x.StatsPostPublisher).Return(InitializePublisher(currentProject));

            </span><span style="background:black;color:#bbfdcc;">return </span><span style="background:black;color:#ffffff;">currentProject;
        }

        </span><span style="background:black;color:#bbfdcc;">private </span><span style="background:black;color:#2b91af;">IMetricPublisher </span><span style="background:black;color:#ffffff;">InitializePublisher(</span><span style="background:black;color:#2b91af;">ICCStatsProject </span><span style="background:black;color:#ffffff;">project)
        {
            </span><span style="background:black;color:#008000;">// OK now it's interesting.. We have our own IMetricPublisher which is a stand-in for the
            // StattisticsPublisher concrete class in CruiseControl. We need to add a new overload
            // and obviously make this behave in ways it was not intended to (as we are doing all the legacy builds)
            </span><span style="background:black;color:#bbfdcc;">var </span><span style="background:black;color:#ffffff;">_statisticsPublisher = mocks.Stub&lt;</span><span style="background:black;color:#2b91af;">IMetricPublisher</span><span style="background:black;color:#ffffff;">&gt;();

            </span><span style="background:black;color:#008000;">// Here we use the mock array of stats created above. This is a duplicate of StatisticsForPublisher
            // Need to look into consolodating that.
            </span><span style="background:black;color:#ffffff;">_statisticsPublisher.Stub(x =&gt; x.ConfiguredStatistics).Return(MockStats);

            </span><span style="background:black;color:#008000;">// Core Validation is Below
            </span><span style="background:black;color:#ffffff;">_statisticsPublisher.Expect(x =&gt; x.ProcesLogFile(project.Name)).
                IgnoreArguments().Repeat.Times(project.BuildCount);

            </span><span style="background:black;color:#bbfdcc;">return </span><span style="background:black;color:#ffffff;">_statisticsPublisher;
        }

        </span><span style="background:black;color:#808080;">/// &lt;summary&gt;
        /// </span><span style="background:black;color:#008000;">NOTE: This is a FULL CYCLE Mock Smoke test. We need many more finely grained
        </span><span style="background:black;color:#808080;">/// </span><span style="background:black;color:#008000;">tests. This is just to ensure all is well in the application. Each subcomponent
        </span><span style="background:black;color:#808080;">/// </span><span style="background:black;color:#008000;">will need to have tests added as this evolves. In the mean time this works
        </span><span style="background:black;color:#808080;">/// </span><span style="background:black;color:#008000;">well to ensure we fundamentally work and this is called from OUR BuildServer
        </span><span style="background:black;color:#808080;">/// </span><span style="background:black;color:#008000;">(how META is that?) to ensure this is working.
        </span><span style="background:black;color:#808080;">/// </span><span style="background:black;color:#008000;">This should be your first stop to undersand this code
        </span><span style="background:black;color:#808080;">/// &lt;/summary&gt;
        </span><span style="background:black;color:#ffffff;">[</span><span style="background:black;color:#2b91af;">Test</span><span style="background:black;color:#ffffff;">]
        </span><span style="background:black;color:#bbfdcc;">public void </span><span style="background:black;color:#ffffff;">ShouldSmokeTestProjectAPI()
        {
            </span><span style="background:black;color:#bbfdcc;">using </span><span style="background:black;color:#ffffff;">(mocks.Record())
                </span><span style="background:black;color:#2b91af;">Assert</span><span style="background:black;color:#ffffff;">.IsTrue(</span><span style="background:black;color:#2b91af;">ForStatistics</span><span style="background:black;color:#ffffff;">.RefreshValues(</span><span style="background:black;color:#2b91af;">MockTDDView</span><span style="background:black;color:#ffffff;">.New, Prepare()));
        }
    }

    </span><span style="background:black;color:#bbfdcc;">public static class </span><span style="background:black;color:#2b91af;">MockExtensions
    </span><span style="background:black;color:#ffffff;">{
        </span><span style="background:black;color:#808080;">/// &lt;summary&gt;
        /// </span><span style="background:black;color:#008000;">Stubs the type defined
        </span><span style="background:black;color:#808080;">/// &lt;/summary&gt;
        /// &lt;typeparam name="TType"&gt;</span><span style="background:black;color:#008000;">The type of the type.</span><span style="background:black;color:#808080;">&lt;/typeparam&gt;
        /// &lt;param name="currentProject"&gt;</span><span style="background:black;color:#008000;">The current project.</span><span style="background:black;color:#808080;">&lt;/param&gt;
        /// &lt;param name="funcMock"&gt;</span><span style="background:black;color:#008000;">The func mock.</span><span style="background:black;color:#808080;">&lt;/param&gt;
        /// &lt;param name="returnString"&gt;</span><span style="background:black;color:#008000;">The return string.</span><span style="background:black;color:#808080;">&lt;/param&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        /// </span><span style="background:black;color:#008000;">Documentation Created 6/20/2008
        </span><span style="background:black;color:#bbfdcc;">public static </span><span style="background:black;color:#ffffff;">TType StubEx&lt;TType&gt;(</span><span style="background:black;color:#bbfdcc;">this </span><span style="background:black;color:#ffffff;">TType currentProject, </span><span style="background:black;color:#2b91af;">Func</span><span style="background:black;color:#ffffff;">&lt;TType, </span><span style="background:black;color:#2b91af;">String</span><span style="background:black;color:#ffffff;">&gt; funcMock,
                                          </span><span style="background:black;color:#2b91af;">String </span><span style="background:black;color:#ffffff;">returnString)
            </span><span style="background:black;color:#bbfdcc;">where </span><span style="background:black;color:#ffffff;">TType : </span><span style="background:black;color:#bbfdcc;">class</span><span style="background:black;color:#ffffff;">, </span><span style="background:black;color:#2b91af;">ICCStatsProject
        </span><span style="background:black;color:#ffffff;">{
            currentProject.Expect(funcMock).Return(returnString).Repeat.Any();
            </span><span style="background:black;color:#bbfdcc;">return </span><span style="background:black;color:#ffffff;">currentProject;
        }
    }
}</span></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/dcarr.wordpress.com/267/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/dcarr.wordpress.com/267/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dcarr.wordpress.com/267/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dcarr.wordpress.com/267/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dcarr.wordpress.com/267/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dcarr.wordpress.com/267/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dcarr.wordpress.com/267/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dcarr.wordpress.com/267/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dcarr.wordpress.com/267/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dcarr.wordpress.com/267/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dcarr.wordpress.com/267/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dcarr.wordpress.com/267/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=267&subd=dcarr&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://team.pushbomb.com/2008/06/19/open-source-project-updated-cruise-controlnet-advanced-metrics/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7b572cbcda5a17fe984e7dd1ddc9c3d6?s=96&#38;d=&#38;r=PG" medium="image">
			<media:title type="html">pushbomb</media:title>
		</media:content>

		<media:content url="http://dcarr.files.wordpress.com/2008/06/rhinomocks-120x90.png" medium="image">
			<media:title type="html">dont mock around</media:title>
		</media:content>
	</item>
		<item>
		<title>Advanced C# 3.0: Part 3 &#8211; New Language Features as &#8216;Domain Specific&#8217; as well as General Purpose Extensions</title>
		<link>http://team.pushbomb.com/2008/05/27/advanced-c-30-part-3-new-language-features-as-domain-specific-as-well-as-general-purpose-extensions/</link>
		<comments>http://team.pushbomb.com/2008/05/27/advanced-c-30-part-3-new-language-features-as-domain-specific-as-well-as-general-purpose-extensions/#comments</comments>
		<pubDate>Tue, 27 May 2008 22:42:46 +0000</pubDate>
		<dc:creator>Damon Wilder Carr</dc:creator>
				<category><![CDATA[C# 3.0 Enhancements]]></category>
		<category><![CDATA[C# 3.0 for Internal DSL]]></category>
		<category><![CDATA[Framework Design]]></category>
		<category><![CDATA[Proof Driven Development]]></category>
		<category><![CDATA[Software Design]]></category>
		<category><![CDATA[Software Futures]]></category>
		<category><![CDATA[agile practices]]></category>
		<category><![CDATA[reflection]]></category>
		<category><![CDATA[resharper]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[dsl]]></category>
		<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[GAT]]></category>
		<category><![CDATA[Resharper]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://dcarr.wordpress.com/2008/05/27/advanced-c-30-part-3-new-language-features-as-domain-specific-as-well-as-general-purpose-extensions/</guid>
		<description><![CDATA[One of the compelling directions beyond 'the basics' of domain-driven development is the advent and increasing use of 'DSL' (Domain Specific Language) technology in .NET. We have had a rich set of features since the 2005 release of Visual Studio in the Guidance Automation Toolkit and the DSL Toolkit and these have become even more compelling. However for some needs, the language now may provide enough for many smaller cases.

Now that new .NET 3.5 C# 3.0 features are allowing us to make the Framework API of .NET work in ways not present 'out of the box' the scope of what is possible can be deep and broad.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=238&subd=dcarr&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>One of the compelling directions beyond &#8216;the basics&#8217; of domain-driven development is the advent and increasing use of &#8216;DSL&#8217; (Domain Specific Language) technology in .NET. We have had a rich set of features since the 2005 release of Visual Studio in the <a href="http://msdn.microsoft.com/en-us/vsx/default.aspx">Guidance Automation Toolkit</a> and the <a href="http://msdn.microsoft.com/en-us/library/bb126235.aspx">DSL Toolkit</a> and these have become even more compelling. I wrote about this back in January, 2006 <a href="http://www.developerland.com/DotNet/Design/444.aspx">as published here</a>. However for some needs, the language now may provide enough for many smaller cases.</p>
<blockquote><p align="center">Keep in mind, this post is not focused on DSL topics (one any developer cannot really afford to miss now), so one could debate the merits of the link I make. My argument is this:</p>
<p align="center">My definition of a DSL is very simply :</p>
</blockquote>
<p>A Domain Specific Language is a way, typically using a combination of visual and textual methods, or just textual, to solve a limited but typically non-trivial set of problems. It is typically a smaller stand-alone &#8216;language&#8217; or language-extension to a larger more horizontal language such as C# (the point I make here is C# has evolved to allow you to expand C# with DSLs you write in C#. This is very different the the DSL Toolkit and I have never had this opinion until I finally got to be immersed deeply in functional style programming enhancements to C# and the ease of extending just about any API with extensions..</p>
<p><a href="http://damon.agilefactor.com/domain-specific-languages-central-to-staying-relevant/">I continue the discussion of what a DSL is here.</a> I will be adding to this section of the site over time but if you just want the listed info, no need to go on a tangent now.</p>
<blockquote><p><strong>Now that new .NET 3.5 C# 3.0 features are allowing us to make the Framework API of .NET work in ways not present &#8216;out of the box&#8217; the scope of what is possible can be deep and broad.</strong></p>
</blockquote>
<h2>Part 1 : The DSL Perspective &#8211; A Real Example</h2>
<p>I&#8217;ll use a project we are working on now, which is quite specifically aimed to</p>
<ul>
<li>Minimize the configuration overhead of using an Inversion of Control container </li>
<li>Provide the benefit of &#8216;provider/container&#8217; independence </li>
<li>Allow the consumer to change &#8216;container provider&#8217; vendors with a simple change in &#8216;meta configuration&#8217; </li>
</ul>
<p>In other words, we are trying to create an abstraction on top of an abstraction, as we believe this particular area is now mature enough (and indeed this is how software engineering historically more then not progresses over time) to do so.</p>
<p>This project has no intention of BEING an inversion of control container nor a dependency injector, rather its aim is to allow people to make use of these critical concepts in much easier ways while eliminating hesitation related to provider lock-in.</p>
<p>It&#8217;s no secret we are massive fans of the work of the <a href="http://www.castleproject.org/">Castle Project</a> and they are indeed the first &#8216;plug-in&#8217; adapter we are on schedule to deliver. However the architecture (something this post is NOT trying to explain) of our solution models the DOMAIN of this area, and is not specific to any particular offering (although to be blunt I would say if any bias existed it would be from the conceptual framework that exists now in the <a href="http://www.castleproject.org/container/index.html">Windsor Container/MicroKernal trunk</a>).</p>
<h4>A domain specific example</h4>
<p>In the area of ASP.NET one technique for loading our solution into memory is via the IHttpModule implementation we provide. Here is what the custom global.asax.cs code looks like:</p>
<p><span style="background:black 0 50%;color:#9bdd22;">public abstract class </span><span style="background:black 0 50%;color:#8bcfe2;">IntegrationPoint </span><span style="background:black 0 50%;color:#feba1b;">: </span><span style="background:black 0 50%;color:#8bcfe2;">HttpApplication</span><span style="background:black 0 50%;color:#feba1b;">, </span><span style="background:black 0 50%;color:#2b91af;">IDomainApplication </span><span style="background:black 0 50%;color:#feba1b;">{ </span></p>
<p><span style="background:black 0 50%;color:#9bdd22;">private static </span><span style="background:black 0 50%;color:#2b91af;">IZeroConfigDI </span><span style="background:black 0 50%;color:#feba1b;">_container; </span></p>
<p><span style="background:black 0 50%;color:#808080;">/// &lt;summary&gt;      <br /></span><span style="background:black 0 50%;color:#808080;">/// </span><span style="background:black 0 50%;color:#008000;">Executes custom initialization code after      <br /></span><span style="background:black 0 50%;color:#808080;">/// </span><span style="background:black 0 50%;color:#008000;">all event handler      <br /></span><span style="background:black 0 50%;color:#808080;">/// </span><span style="background:black 0 50%;color:#008000;">modules have been added.      <br /></span><span style="background:black 0 50%;color:#808080;">/// </span><span style="background:black 0 50%;color:#008000;">Also acquire a reference to the HttpModule      <br /></span><span style="background:black 0 50%;color:#808080;">/// </span><span style="background:black 0 50%;color:#008000;">for IoC / DI if present as a module      <br /></span><span style="background:black 0 50%;color:#808080;">/// &lt;/summary&gt;      <br />&#160;</span><span style="background:black 0 50%;color:#9bdd22;">public override void </span><span style="background:black 0 50%;color:#feba1b;">Init() {<span style="background:black 0 50%;color:#feba1b;">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span></span></p>
<div><span style="background:black 0 50%;color:#feba1b;"><span style="background:black 0 50%;color:#feba1b;">&#160;&#160;&#160;&#160;&#160;&#160;&#160; _container = Modules.GetIoCModule(); </span></span></div>
<div><span style="background:black 0 50%;color:#feba1b;"><span style="background:black 0 50%;color:#feba1b;">&#160;&#160;&#160;&#160;&#160; </span></span><span style="background:black 0 50%;color:#9bdd22;">&#160;&#160;&#160; base</span><span style="background:black 0 50%;color:#feba1b;">.Init();</span></div>
<div><span style="background:black 0 50%;color:#feba1b;"></span></div>
<div><span style="background:black 0 50%;color:#feba1b;"><span style="background:black 0 50%;color:#feba1b;">} </span></span>
</p></div>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>The interesting areas which are not provided by Microsoft include:</p>
<ol>
<li>IDomainApplication interface </li>
<li>IZeriConfigDI Interface static reference </li>
<li>Modules.GetIoCModule() </li>
</ol>
<p>The first two have more to do with our solution then the topic of this post, so I&#8217;ll focus on #3.</p>
<p>As this code is inside the HttpApplication, we have access to the Modules property which is read-only. Here is the documentation:</p>
<p>&#160;</p>
<table cellspacing="10" cellpadding="10" width="648" border="1">
<tbody>
<tr>
<td valign="top" width="626">
<h2>System.Web.HttpModuleCollection Modules { get; }</h2>
<p> 
<p align="center"><font color="#ffffff"><span style="color:#6682ee;"><font color="#ffffff"><strong></strong>                  <br /></font></span></font></p>
<p align="left"><span style="color:#6682ee;"><font color="#ffffff"><font color="#ffffff"><span style="color:#6682ee;"><font color="#ffffff"><em>Member of System.Web.HttpApplication</em></font></span></font><span style="color:#6682ee;"><font color="#ffffff"> </font></span></font></span></p>
<p align="left"><span style="color:#6682ee;"><font color="#ffffff"><span style="color:#6682ee;"><font color="#ffffff">                   <br />Gets the collection of modules for the current application.</font></span><span style="color:#6682ee;"><font color="#ffffff">Returns:                    <br />An System.Web.HttpModuleCollection that contains the names of the modules for the application.                     <br /></font></span></font></span></p>
</td>
</tr>
</tbody>
</table>
<p><span style="color:#000000;"><a href="http://11011.net/software/vspaste"></a></span></p>
<p>Your first reaction if your familiar with this collection is that it does not have anything even close to the GetIoCModule() method we are calling above.</p>
<p>Indeed this is our &#8216;domain specific&#8217; extension to the .NET Framework API (one of many for this solution).</p>
<p>Here is the implementation of this &#8216;DSL&#8217; extension:</p>
<p><font color="#484848"><span style="background:black 0 50%;color:#808080;">/// &lt;summary&gt;        <br /></span><span style="background:black 0 50%;color:#808080;">/// </span></font><font color="#484848"><span style="background:black 0 50%;color:#008000;">Provides ‘DSL specific’ extensions to the ASP.NET environment for        <br /></span><span style="background:black 0 50%;color:#808080;">/// </span><span style="background:black 0 50%;color:#008000;">the IoC Zero Config environment which is not new (after all this becomes a static)</span></font><span style="background:black 0 50%;color:#008000;"><font color="#484848">        <br /></font></span><font color="#484848"><span style="background:black 0 50%;color:#808080;">/// &lt;/summary&gt;        <br /></span><span style="background:black 0 50%;color:#808080;">/// </span><span style="background:black 0 50%;color:#008000;">The entire point for extension methods is ‘Fluency in API’ as it allows ‘shorthand’ code</span></font></p>
<p><font color="#484848"><span style="background:black 0 50%;color:#9bdd22;">public static class </span><span style="background:black 0 50%;color:#8bcfe2;">ZeroConfigInstanceResolver </span><span style="background:black 0 50%;color:#feba1b;">{ </span></font></p>
<p><font color="#484848"><span style="background:black 0 50%;color:#9bdd22;">private const string </span><span style="background:black 0 50%;color:#feba1b;">ZeroConfigTypeString = </span><span style="background:black 0 50%;color:#a31515;">&quot;IoCConfigModule.IHttpModel&quot;</span><span style="background:black 0 50%;color:#feba1b;">;</span></font></p>
<p><span style="background:black 0 50%;color:#feba1b;"></span><span style="background:black 0 50%;color:#feba1b;"><font color="#484848">&#160;</font></span><font color="#484848"><span style="background:black 0 50%;color:#808080;">/// &lt;summary&gt;        <br /></span><span style="background:black 0 50%;color:#808080;">/// </span></font><font color="#484848"><span style="background:black 0 50%;color:#008000;">Gets the IZeroConfigDI reference        <br /></span><span style="background:black 0 50%;color:#808080;">/// </span></font><font color="#484848"><span style="background:black 0 50%;color:#008000;">(using domain specific logic and the&#160; <br /></span><span style="background:black 0 50%;color:#808080;">/// </span></font><span style="background:black 0 50%;color:#008000;"><font color="#484848">generic logic extending the container)        <br /></font></span><font color="#484848"><span style="background:black 0 50%;color:#808080;">/// &lt;/summary&gt;        <br /></span><span style="background:black 0 50%;color:#808080;">/// &lt;param name=&quot;container&quot;&gt;</span><span style="background:black 0 50%;color:#008000;">The container.</span></font><font color="#484848"><span style="background:black 0 50%;color:#808080;">&lt;/param&gt;        <br /></span><span style="background:black 0 50%;color:#808080;">/// &lt;returns&gt;&lt;/returns&gt; </span></font></p>
<p><font color="#484848"><span style="background:black 0 50%;color:#9bdd22;">public static </span><span style="background:black 0 50%;color:#2b91af;">IZeroConfigDI </span><span style="background:black 0 50%;color:#feba1b;">GetIoCModule(</span><span style="background:black 0 50%;color:#9bdd22;">this </span><span style="background:black 0 50%;color:#8bcfe2;">HttpModuleCollection </span><span style="background:black 0 50%;color:#feba1b;">container) {</span></font></p>
<p><span style="background:black 0 50%;color:#feba1b;"><font color="#484848">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><span style="background:black 0 50%;color:#9bdd22;"><font color="#484848">return        <br /></font></span><font color="#484848"><span style="background:black 0 50%;color:#feba1b;">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; container.FindInstance(        <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; () =&gt;         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; container.Get(ZeroConfigTypeString)         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span><span style="background:black 0 50%;color:#feba1b;">&#160;</span><span style="background:black 0 50%;color:#9bdd22;">as </span><span style="background:black 0 50%;color:#2b91af;">IZeroConfigDI</span><span style="background:black 0 50%;color:#feba1b;">); </span></font></p>
<p><span style="background:black 0 50%;color:#feba1b;"><font color="#484848">}</font></span></p>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>As you can see above we are very specific in our intent to add this to the HttpModuleCollection. There is nothing that interesting above except for the method call FindInstance(Func&lt;TResult&gt;) off the target &#8216;container&#8217;. This is a peek into the non-DSL related extension that represents. You might be aware that there is no such FindInstance available off the HttpModuleCollection.</p>
<p>One of our many goals in creating a fluent, easily used API is reducing complexity and providing very maintainable code. Here you can see the Lambada expression required to locate our service is hidden from the developer completely, yet this code is not a &#8216;one-off&#8217; as we have provided both a DSL level extension in concert with a far more generic extension.</p>
<h2>Part 2: Extending the Horizontal to Empower the Domain Specific</h2>
<p>In looking at the HttpModuleCollection, and in our desire to facilitate other sources of resolving our module, it inherits from the abstract parent NameObjectCollectionBase.</p>
<p>Here is the definition of what inherits from this abstract parent:</p>
<table cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td valign="top" width="400"> <br />
<h2>public abstract class NameObjectCollectionBase </h2>
<p>Member of System.Collections.SpecializedSummary:           </p>
<p><em>Provides the abstract base class for a collection of associated System.String keys and System.Object values that can be accessed either with the key or with the index.</em></td>
</tr>
</tbody>
</table>
<p><a href="http://dcarr.files.wordpress.com/2008/05/found.jpg"></a></p>
<p>The issue arises as this abstract base leaves it up to its concrete implementer to provide the indexer (or say Get() method) to access the object desired. Therefore a nice way to enhance this abstract type to work across all of the children is to literally pass in the method to resolve the object desired.</p>
<h2>Part 3 : The Generic Extension</h2>
<p>Here is the trivial extension method used to &#8216;open up&#8217; the NameObjectCollectionBase and which is used above:</p>
<p><span style="background:black 0 50%;color:#808080;">/// &lt;summary&gt;      <br />/// </span><span style="background:black 0 50%;color:#008000;">Finds the instance in the NameObjectCollectionBase      <br /></span><span style="background:black 0 50%;color:#808080;">/// </span><span style="background:black 0 50%;color:#008000;">using the Functor      <br /></span><span style="background:black 0 50%;color:#808080;">/// &lt;/summary&gt;      <br />/// &lt;typeparam name=&quot;TContainer&quot;&gt;</span><span style="background:black 0 50%;color:#008000;">The type of the container.</span><span style="background:black 0 50%;color:#808080;">&lt;/typeparam&gt;      <br />/// &lt;typeparam name=&quot;TResult&quot;&gt;</span><span style="background:black 0 50%;color:#008000;">The type of the result.</span><span style="background:black 0 50%;color:#808080;">&lt;/typeparam&gt;      <br />/// &lt;param name=&quot;container&quot;&gt;</span><span style="background:black 0 50%;color:#008000;">The container.</span><span style="background:black 0 50%;color:#808080;">&lt;/param&gt;      <br />/// &lt;param name=&quot;finder&quot;&gt;</span><span style="background:black 0 50%;color:#008000;">The finder.</span><span style="background:black 0 50%;color:#808080;">&lt;/param&gt;      <br />/// &lt;returns&gt;&lt;/returns&gt;       <br /></span><span style="background:black 0 50%;color:#9bdd22;">public static </span><span style="background:black 0 50%;color:#feba1b;">TResult FindInstance&lt;TContainer, TResult&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160; (</span><span style="background:black 0 50%;color:#9bdd22;">this </span><span style="background:black 0 50%;color:#feba1b;">TContainer container, </span><span style="background:black 0 50%;color:#2b91af;">Func</span><span style="background:black 0 50%;color:#feba1b;">&lt;TResult&gt; finder)      <br /></span><span style="background:black 0 50%;color:#9bdd22;">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; where </span><span style="background:black 0 50%;color:#feba1b;">TContainer : </span><span style="background:black 0 50%;color:#8bcfe2;">NameObjectCollectionBase </span><span style="background:black 0 50%;color:#9bdd22;">where </span><span style="background:black 0 50%;color:#feba1b;">TResult : </span><span style="background:black 0 50%;color:#9bdd22;">class </span><span style="background:black 0 50%;color:#feba1b;">{ </span></p>
<p><span style="background:black 0 50%;color:#feba1b;">     <br /></span><span style="background:black 0 50%;color:#9bdd22;">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return </span><span style="background:black 0 50%;color:#feba1b;">finder();      </p>
<p>} </span></p>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>Since we cannot abstract up the get method, we take a page from Functional Programming and literally pass in the code to execute (which we do above).</p>
<p>A common pattern is to expose methods like the above, but add additional versions that allow more parameters into the Func&lt;TResult&gt;. This is well covered well by many of the Linq references and books available.</p>
<h2>Part 4: How this allows us to embrace deep/wide change</h2>
<p>A simplistic example is supporting the acquisitions of our target reference (IZeroConfigDI) if it is set as ApplicationState or as an IHttpModule. We could make the design decision to allow our find method to reside literally as an extension method of our HttpApplication (and indeed this turns out to be a reasonable choice as the valid inheritors from NameObjectCollectionBase are sealed and therefore invalid as generic constraints). Here is one approach (not ideal and not our final code but this illustrates the point.) Why not offer your optimized solution?</p>
<p>CODE:</p>
<p><span style="background:black 0 50%;color:#9bdd22;">public abstract class </span><span style="background:black 0 50%;color:#8bcfe2;">IntegrationPoint </span><span style="background:black 0 50%;color:#feba1b;">: </span><span style="background:black 0 50%;color:#8bcfe2;">HttpApplication</span><span style="background:black 0 50%;color:#feba1b;">, </span><span style="background:black 0 50%;color:#2b91af;">IDomainApplication </span><span style="background:black 0 50%;color:#feba1b;">{</span> </p>
</p>
<p> <span style="background:black 0 50%;color:#9bdd22;">private static </span><span style="background:black 0 50%;color:#2b91af;">IZeroConfigDI </span><span style="background:black 0 50%;color:#feba1b;">_container;</span>
</p>
<p> <span style="background:black 0 50%;color:#808080;">/// &lt;summary&gt;    <br />/// </span><span style="background:black 0 50%;color:#008000;">Executes custom initialization code after    <br /></span><span style="background:black 0 50%;color:#808080;">/// </span><span style="background:black 0 50%;color:#008000;">all event handler    <br /></span><span style="background:black 0 50%;color:#808080;">/// </span><span style="background:black 0 50%;color:#008000;">modules have been added.    <br /></span><span style="background:black 0 50%;color:#808080;">/// </span><span style="background:black 0 50%;color:#008000;">Also acquire a reference to the HttpModule    <br /></span><span style="background:black 0 50%;color:#808080;">/// </span><span style="background:black 0 50%;color:#008000;">or Application State    <br /></span><span style="background:black 0 50%;color:#808080;">/// </span><span style="background:black 0 50%;color:#008000;">for IoC / DI if present    <br /></span><span style="background:black 0 50%;color:#808080;">/// &lt;/summary&gt;    <br /></span><span style="background:black 0 50%;color:#9bdd22;">public override void </span><span style="background:black 0 50%;color:#feba1b;">Init() { </span>
</p>
<p><span style="background:black 0 50%;color:#feba1b;">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; _container = </span><span style="background:black 0 50%;color:#9bdd22;">this</span><span style="background:black 0 50%;color:#feba1b;">.GetIoCModule(); </span><span style="background:black 0 50%;color:#9bdd22;">base</span><span style="background:black 0 50%;color:#feba1b;">.Init(); </span></p>
<p><span style="background:black 0 50%;color:#feba1b;">}</span></p>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>And the extension on HttpApplication:</p>
<p><span style="background:black 0 50%;color:#9bdd22;">public static class </span><span style="background:black 0 50%;color:#8bcfe2;">ZeroConfigInstanceResolver </span><span style="background:black 0 50%;color:#feba1b;">{</span> </p>
</p>
<p> <span style="background:black 0 50%;color:#9bdd22;">private const string </span><span style="background:black 0 50%;color:#feba1b;">ZeroConfigTypeString = </span><span style="background:black 0 50%;color:#a31515;">&quot;IoCConfigModule.IHttpModel&quot;</span><span style="background:black 0 50%;color:#feba1b;">;</span>
</p>
<p> <span style="background:black 0 50%;color:#808080;">/// &lt;summary&gt;    <br />/// </span><span style="background:black 0 50%;color:#008000;">Gets the IZeroConfigDI reference if possible (null if not found)    <br /></span><span style="background:black 0 50%;color:#808080;">/// </span><span style="background:black 0 50%;color:#008000;">using domain specific logic and the    <br /></span><span style="background:black 0 50%;color:#808080;">/// </span><span style="background:black 0 50%;color:#008000;">generic logic extending the container.    <br /></span><span style="background:black 0 50%;color:#808080;">/// &lt;/summary&gt;    <br />/// &lt;param name=&quot;container&quot;&gt;</span><span style="background:black 0 50%;color:#008000;">The container.</span><span style="background:black 0 50%;color:#808080;">&lt;/param&gt;    <br />/// &lt;returns&gt;&lt;/returns&gt;     <br /></span><span style="background:black 0 50%;color:#9bdd22;">public static </span><span style="background:black 0 50%;color:#2b91af;">IZeroConfigDI </span><span style="background:black 0 50%;color:#feba1b;">GetIoCModule(</span><span style="background:black 0 50%;color:#9bdd22;">this </span><span style="background:black 0 50%;color:#8bcfe2;">HttpApplication </span><span style="background:black 0 50%;color:#feba1b;">container) {</span>
</p>
<p><span style="background:black 0 50%;color:#9bdd22;">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var </span><span style="background:black 0 50%;color:#feba1b;">modules = container.Modules;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span><span style="background:black 0 50%;color:#9bdd22;">var </span><span style="background:black 0 50%;color:#feba1b;">applicationState = container.Application;&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span></p>
<p><span style="background:black 0 50%;color:#feba1b;">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span><span style="background:black 0 50%;color:#9bdd22;">var </span><span style="background:black 0 50%;color:#feba1b;">resultVar = modules.ToInstance(      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; () =&gt; modules.Get(ZeroConfigTypeString)       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; )       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span><span style="background:black 0 50%;color:#feba1b;">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ??&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; applicationState.ToInstance(       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; () =&gt; </span><span style="background:black 0 50%;color:#feba1b;">applicationState.Get(ZeroConfigTypeString)      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; );</span> </p>
</p>
<p> <span style="background:black 0 50%;color:#9bdd22;">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return </span><span style="background:black 0 50%;color:#feba1b;">resultVar </span><span style="background:black 0 50%;color:#9bdd22;">as </span><span style="background:black 0 50%;color:#2b91af;">IZeroConfigDI</span><span style="background:black 0 50%;color:#feba1b;">;    </p>
<p>}</span>
</p>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>No change is required on the extension to the FindInstance extension.</p>
<p>Can you see how the above can be improved?</p>
<p>We expand this to make the ‘rule for finding the <span style="background:black 0 50%;color:#2b91af;">IZeroConfigDI</span> external. To be specific, above we have a business rule implemented that we typically would not want ‘hard coded’. In fact more then not all things considered we want this. So we do the4 following:</p>
<ul>
<li>Determine the Delegate signature for the business rule.      </li>
<li>For the above, we need as input (at a minimum) an <span style="background:black 0 50%;color:#8bcfe2;">HttpApplication </span>instance as that is the container for the models and state, and those two items lack a shared interface or base (or we could use that).       </li>
<li>The signature returns (in all cases) an instance cast where it implement <span style="background:black 0 50%;color:#2b91af;">IZeroConfigDI </span>to resolve this business rule.       </li>
<li>Therefore the business rule signature is <strong>Func&lt;<span style="background:black 0 50%;color:#8bcfe2;">HttpApplication </span>,<span style="background:black 0 50%;color:#2b91af;">IZeroConfigDI</span>&gt;</strong>       </li>
</ul>
<p><strong></strong></p>
<table cellspacing="0" cellpadding="2" width="355" border="1">
<tbody>
<tr>
<td valign="top" width="353">
<p><strong></strong></p>
<p>         <strong>
<p>&#160;</p>
<p>         </strong>
<ul>
<li>
<h3>It’s an essential skill to not only master generics at the deepest level, but to master all the intrinsic delegate types (Predicate, Func, Action, etc.) to be proficient in the state of the technology of Linq today </h3>
<p></li>
<li>
<h3>We wish it was easier to ‘extend’ Delegates by inheritance or to not be tasked with coding to each variant of a delegates possible type parameters, but this is different the Object Oriented in it’s domain. </h3>
<p></li>
<li>
<h3>We also wish the generic constraint language would be fundamentally focused on, extended and evolved to allow the full richness in constraint semantics as we have with Linq Expressions. </h3>
<p></li>
</ul>
</td>
</tr>
</tbody>
</table>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/dcarr.wordpress.com/238/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/dcarr.wordpress.com/238/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dcarr.wordpress.com/238/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dcarr.wordpress.com/238/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dcarr.wordpress.com/238/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dcarr.wordpress.com/238/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dcarr.wordpress.com/238/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dcarr.wordpress.com/238/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dcarr.wordpress.com/238/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dcarr.wordpress.com/238/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dcarr.wordpress.com/238/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dcarr.wordpress.com/238/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=238&subd=dcarr&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://team.pushbomb.com/2008/05/27/advanced-c-30-part-3-new-language-features-as-domain-specific-as-well-as-general-purpose-extensions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7b572cbcda5a17fe984e7dd1ddc9c3d6?s=96&#38;d=&#38;r=PG" medium="image">
			<media:title type="html">pushbomb</media:title>
		</media:content>
	</item>
		<item>
		<title>Advanced C# 3.0 : Part 2 &#8211; Everyday Tasks with New Solutions</title>
		<link>http://team.pushbomb.com/2008/05/22/advanced-c-30-part-2-everyday-tasks-with-new-solutions/</link>
		<comments>http://team.pushbomb.com/2008/05/22/advanced-c-30-part-2-everyday-tasks-with-new-solutions/#comments</comments>
		<pubDate>Thu, 22 May 2008 19:31:10 +0000</pubDate>
		<dc:creator>Damon Wilder Carr</dc:creator>
				<category><![CDATA[C# 3.0 Enhancements]]></category>
		<category><![CDATA[C# 3.0 for Internal DSL]]></category>
		<category><![CDATA[Software Design]]></category>
		<category><![CDATA[Software Futures]]></category>
		<category><![CDATA[agile practices]]></category>
		<category><![CDATA[reflection]]></category>
		<category><![CDATA[Advanced C#]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Delegates]]></category>
		<category><![CDATA[Functional Programming]]></category>
		<category><![CDATA[Lambada]]></category>
		<category><![CDATA[Visual Studio 2008]]></category>

		<guid isPermaLink="false">http://dcarr.wordpress.com/2008/05/22/advanced-c-30-part-2-everyday-tasks-with-new-solutions/</guid>
		<description><![CDATA[In this post I'll be digging deeper into doing things I've always wanted to have in .NET yet didn't. For example, I know I am not alone in wanting an IList (be it an IList or a simple non-generic IList) to provide me a .foreach method as you get in a List). This is just one of many things we address here (and more).<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=232&subd=dcarr&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<h3>Part 2 : Digging Deeper into Lambadas, Extension Methods, and Linq</h3>
<p>The world’s most common extension method and an attempt at a definitive version.</p>
<p>In this post I&#8217;ll be digging deeper into doing things I&#8217;ve always wanted to have in .NET yet didn&#8217;t. For example, I know I am not alone in wanting an IList (be it an IList&lt;T&gt; or a simple non-generic IList) to provide me a .foreach method as you get in a List&lt;T&gt;). This is just one of many things we address here (and more).</p>
<h1>From the concrete to the abstract</h1>
<p>I was having problems with entries in my path environmental variable, and I wanted an easy way to flag bad entries and also allow me to move the entries in the list up or down easily. This was made apparent by my use of a tool called &#8216;Dependency Walker&#8217;. It&#8217;s hard to live without but that&#8217;s another post. See the screen shot below:</p>
<p><a href="http://dcarr.files.wordpress.com/2008/05/image-0001.png"><img style="border-width:0;" alt="Image-0001" src="http://dcarr.files.wordpress.com/2008/05/image-0001-thumb.png?w=458&#038;h=316" width="458" height="316" /></a></p>
<p><a href="http://www.dependencywalker.com/">Click here to go to &#8216;Dependency Walker&#8217;</a></p>
<h1>Test to Code</h1>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>&#160;</p>
<pre class="code"><span style="background:#100d0c;color:#e1b04a;"><font size="1">    </font></span><span style="background:#100d0c;color:#a0a0a0;"><font size="1">/// &lt;summary&gt;
    /// </font></span><span style="background:#100d0c;color:#80ff00;"><font size="1">Unit Test to Validate that the logic related to     /// 'show combined extensions using paths' is functioning
    </font></span><span style="background:#100d0c;color:#a0a0a0;"><font size="1">/// &lt;/summary&gt;
    /// </font></span><font size="1"><span style="background:#100d0c;color:#80ff00;">Documentation Created 5/22/2008
    </span><span style="background:#100d0c;color:#e1b04a;">[</span><span style="background:#100d0c;color:#64b1ff;">Test</span></font><font size="1"><span style="background:#100d0c;color:#e1b04a;">]
    </span><span style="background:#100d0c;color:#8ac5ff;">public void </span></font><font size="1"><span style="background:#100d0c;color:#e1b04a;">shouldShowCombinedExtensionsUsingPaths()
    {
        </span><span style="background:#100d0c;color:#8ac5ff;">var </span><span style="background:#100d0c;color:#e1b04a;">_directoriesInPath </span><span style="background:#100d0c;color:silver;">= </span><span style="background:#100d0c;color:#d6adad;">EnvironmentVariableTarget</span></font><font size="1"><span style="background:#100d0c;color:silver;">.             </span><span style="background:#100d0c;color:#e1b04a;">Process</span><span style="background:#100d0c;color:silver;">.</span><span style="background:#100d0c;color:#e1b04a;">GetParsedValues(</span><span style="background:#100d0c;color:#ff8040;">&quot;PATH&quot;</span></font><font size="1"><span style="background:#100d0c;color:#e1b04a;">);

        </span><span style="background:#100d0c;color:#64b1ff;">Assert</span><span style="background:#100d0c;color:silver;">.</span><span style="background:#100d0c;color:#e1b04a;">That(_directoriesInPath, </span><span style="background:#100d0c;color:#64b1ff;">Is</span></font><font size="1"><span style="background:#100d0c;color:silver;">.                </span><span style="background:#100d0c;color:#e1b04a;">TypeOf(</span><span style="background:#100d0c;color:#8ac5ff;">typeof</span><span style="background:#100d0c;color:#e1b04a;">(</span><span style="background:#100d0c;color:#64b1ff;">String</span></font><font size="1"><span style="background:#100d0c;color:#e1b04a;">[])));
        </span><span style="background:#100d0c;color:#64b1ff;">Assert</span><span style="background:#100d0c;color:silver;">.</span><span style="background:#100d0c;color:#e1b04a;">IsTrue(</span><span style="background:#100d0c;color:silver;">!</span><span style="background:#100d0c;color:#e1b04a;">_directoriesInPath</span><span style="background:#100d0c;color:silver;">.</span></font><font size="1"><span style="background:#100d0c;color:#e1b04a;">IsNullOrEmpty());

        _directoriesInPath</span><span style="background:#100d0c;color:silver;">.</span></font><span style="background:#100d0c;color:#e1b04a;"><font size="1">ForEach(
            x </font></span><span style="background:#100d0c;color:silver;"><font size="1">=&gt;
            </font></span><font size="1"><span style="background:#100d0c;color:#e1b04a;">{
                </span><span style="background:#100d0c;color:#8ac5ff;">if </span><span style="background:#100d0c;color:#e1b04a;">(</span><span style="background:#100d0c;color:silver;">!</span><span style="background:#100d0c;color:#64b1ff;">Directory</span><span style="background:#100d0c;color:silver;">.</span></font><font size="1"><span style="background:#100d0c;color:#e1b04a;">Exists(x))
                    </span><span style="background:#100d0c;color:#64b1ff;">Console</span><span style="background:#100d0c;color:silver;">.</span><span style="background:#100d0c;color:#e1b04a;">WriteLine(</span><span style="background:#100d0c;color:#ff8040;">&quot;MIssing Directory! &quot; </span><span style="background:#100d0c;color:silver;">+ </span></font><span style="background:#100d0c;color:#e1b04a;"><font size="1">x);
            });
    }</font></span></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>Above is the test (that also works). Before I launch into why this is interesting, what looks different?</p>
<p>1) EnvironmentVariableTarget : This is Microsoft&#8217;s type not mine. It&#8217;s the enum used to specify the target search on the environmentals.</p>
<p>2) _directoriesInPath : This is a string[] as you can see from the Assertion. But how does it support ForEach?</p>
<p>3) GetParsedValues() : What is that exactly?</p>
<blockquote>
<p>*** As this is so common I decided to try to craft a definitive version of ForEach that would work across non-generic collections, generic collection, and specific type specification on the targeted items in the collection for generics .&#160; ***</p>
</blockquote>
<p>In order to enable ForEach behavior I needed to this code which is by far the most common extension method in all the C# 3.0 code alive today.</p>
<p>&#160;</p>
<pre class="code">
<span style="background:#100d0c;color:#e1b04a;"><font size="1">    </font></span><span style="background:#100d0c;color:#a0a0a0;"><font size="1">/// &lt;summary&gt;
    /// </font></span><span style="background:#100d0c;color:#80ff00;"><font size="1">Requires generic IEnumerable and is most common now
    </font></span><font size="1"><span style="background:#100d0c;color:#a0a0a0;">/// &lt;/summary&gt;
    /// &lt;typeparam name=</span><span style="background:#100d0c;color:#919191;">&quot;TContainedType&quot;</span><span style="background:#100d0c;color:#a0a0a0;">&gt;</span><span style="background:#100d0c;color:#80ff00;">The type of the contained type.</span></font><font size="1"><span style="background:#100d0c;color:#a0a0a0;">&lt;/typeparam&gt;
    /// &lt;param name=</span><span style="background:#100d0c;color:#919191;">&quot;baseEnum&quot;</span><span style="background:#100d0c;color:#a0a0a0;">&gt;</span><span style="background:#100d0c;color:#80ff00;">The base enum.</span></font><font size="1"><span style="background:#100d0c;color:#a0a0a0;">&lt;/param&gt;
    /// &lt;param name=</span><span style="background:#100d0c;color:#919191;">&quot;actionPerform&quot;</span><span style="background:#100d0c;color:#a0a0a0;">&gt;</span><span style="background:#100d0c;color:#80ff00;">The action perform.</span></font><span style="background:#100d0c;color:#a0a0a0;"><font size="1">&lt;/param&gt;
    /// &lt;returns&gt;&lt;/returns&gt;
    /// </font></span><font size="1"><span style="background:#100d0c;color:#80ff00;">Documentation Created 7/20/2008
    </span><span style="background:#100d0c;color:#8ac5ff;">public static </span><span style="background:#100d0c;color:#ff6fb7;">IEnumerable</span><span style="background:#100d0c;color:silver;">&lt;</span><span style="background:#100d0c;color:#e1b04a;">TContainedType</span><span style="background:#100d0c;color:silver;">&gt; </span><span style="background:#100d0c;color:#e1b04a;">ForEach</span><span style="background:#100d0c;color:silver;">&lt;</span><span style="background:#100d0c;color:#e1b04a;">TContainedType</span><span style="background:#100d0c;color:silver;">&gt;</span></font><font size="1"><span style="background:#100d0c;color:#e1b04a;">(
           </span><span style="background:#100d0c;color:#8ac5ff;">this </span><span style="background:#100d0c;color:#ff6fb7;">IEnumerable</span><span style="background:#100d0c;color:silver;">&lt;</span><span style="background:#100d0c;color:#e1b04a;">TContainedType</span><span style="background:#100d0c;color:silver;">&gt; </span></font><font size="1"><span style="background:#100d0c;color:#e1b04a;">baseEnum,
               </span><span style="background:#100d0c;color:#ffaeff;">Action</span><span style="background:#100d0c;color:silver;">&lt;</span><span style="background:#100d0c;color:#e1b04a;">TContainedType</span><span style="background:#100d0c;color:silver;">&gt; </span></font><font size="1"><span style="background:#100d0c;color:#e1b04a;">actionPerform) {

        </span><span style="background:#100d0c;color:#8ac5ff;">return </span></font><span style="background:#100d0c;color:#e1b04a;"><font size="1">ForEachInner(baseEnum, actionPerform);
    }

    </font></span><span style="background:#100d0c;color:#a0a0a0;"><font size="1">/// &lt;summary&gt;
    /// </font></span><span style="background:#100d0c;color:#80ff00;"><font size="1">The most explicit case
    </font></span><font size="1"><span style="background:#100d0c;color:#a0a0a0;">/// &lt;/summary&gt;
    /// &lt;typeparam name=</span><span style="background:#100d0c;color:#919191;">&quot;TBase&quot;</span><span style="background:#100d0c;color:#a0a0a0;">&gt;</span><span style="background:#100d0c;color:#80ff00;">The type of the base.</span></font><font size="1"><span style="background:#100d0c;color:#a0a0a0;">&lt;/typeparam&gt;
    /// &lt;typeparam name=</span><span style="background:#100d0c;color:#919191;">&quot;TContainedType&quot;</span><span style="background:#100d0c;color:#a0a0a0;">&gt;</span><span style="background:#100d0c;color:#80ff00;">The type of the contained type.</span></font><font size="1"><span style="background:#100d0c;color:#a0a0a0;">&lt;/typeparam&gt;
    /// &lt;param name=</span><span style="background:#100d0c;color:#919191;">&quot;baselineEnumerable&quot;</span><span style="background:#100d0c;color:#a0a0a0;">&gt;</span><span style="background:#100d0c;color:#80ff00;">The baseline enumerable.</span></font><font size="1"><span style="background:#100d0c;color:#a0a0a0;">&lt;/param&gt;
    /// &lt;param name=</span><span style="background:#100d0c;color:#919191;">&quot;actionPerform&quot;</span><span style="background:#100d0c;color:#a0a0a0;">&gt;</span><span style="background:#100d0c;color:#80ff00;">The action perform.</span></font><span style="background:#100d0c;color:#a0a0a0;"><font size="1">&lt;/param&gt;
    /// &lt;returns&gt;&lt;/returns&gt;
    /// </font></span><font size="1"><span style="background:#100d0c;color:#80ff00;">Documentation Created 7/20/2008
    </span><span style="background:#100d0c;color:#8ac5ff;">public static </span><span style="background:#100d0c;color:#ff6fb7;">IEnumerable</span><span style="background:#100d0c;color:silver;">&lt;</span><span style="background:#100d0c;color:#e1b04a;">TContainedType</span><span style="background:#100d0c;color:silver;">&gt; </span><span style="background:#100d0c;color:#e1b04a;">ForEach</span><span style="background:#100d0c;color:silver;">&lt;</span><span style="background:#100d0c;color:#e1b04a;">TBase, TContainedType</span><span style="background:#100d0c;color:silver;">&gt;</span></font><font size="1"><span style="background:#100d0c;color:#e1b04a;">(
              </span><span style="background:#100d0c;color:#8ac5ff;">this </span><span style="background:#100d0c;color:#e1b04a;">TBase baselineEnumerable, </span><span style="background:#100d0c;color:#ffaeff;">Action</span><span style="background:#100d0c;color:silver;">&lt;</span><span style="background:#100d0c;color:#e1b04a;">TContainedType</span><span style="background:#100d0c;color:silver;">&gt; </span></font><font size="1"><span style="background:#100d0c;color:#e1b04a;">actionPerform)
                   </span><span style="background:#100d0c;color:#8ac5ff;">where </span><span style="background:#100d0c;color:#e1b04a;">TBase : </span><span style="background:#100d0c;color:#ff6fb7;">IEnumerable </span></font><font size="1"><span style="background:#100d0c;color:#e1b04a;">{

        </span><span style="background:#100d0c;color:#8ac5ff;">return </span><span style="background:#100d0c;color:#e1b04a;">ForEachInner(baselineEnumerable</span><span style="background:#100d0c;color:silver;">.</span><span style="background:#100d0c;color:#e1b04a;">OfType</span><span style="background:#100d0c;color:silver;">&lt;</span><span style="background:#100d0c;color:#e1b04a;">TContainedType</span><span style="background:#100d0c;color:silver;">&gt;</span></font><span style="background:#100d0c;color:#e1b04a;"><font size="1">(), actionPerform);
    }

    </font></span><span style="background:#100d0c;color:#a0a0a0;"><font size="1">/// &lt;summary&gt;
    /// </font></span><span style="background:#100d0c;color:#80ff00;"><font size="1">The least restrictive case
    </font></span><font size="1"><span style="background:#100d0c;color:#a0a0a0;">/// &lt;/summary&gt;
    /// &lt;param name=</span><span style="background:#100d0c;color:#919191;">&quot;baseEnum&quot;</span><span style="background:#100d0c;color:#a0a0a0;">&gt;</span><span style="background:#100d0c;color:#80ff00;">The base enum.</span></font><font size="1"><span style="background:#100d0c;color:#a0a0a0;">&lt;/param&gt;
    /// &lt;param name=</span><span style="background:#100d0c;color:#919191;">&quot;actionPerform&quot;</span><span style="background:#100d0c;color:#a0a0a0;">&gt;</span><span style="background:#100d0c;color:#80ff00;">The action perform.</span></font><span style="background:#100d0c;color:#a0a0a0;"><font size="1">&lt;/param&gt;
    /// &lt;returns&gt;&lt;/returns&gt;
    /// </font></span><font size="1"><span style="background:#100d0c;color:#80ff00;">Documentation Created 7/20/2008
    </span><span style="background:#100d0c;color:#8ac5ff;">public static </span><span style="background:#100d0c;color:#ff6fb7;">IEnumerable</span><span style="background:#100d0c;color:silver;">&lt;</span><span style="background:#100d0c;color:#64b1ff;">Object</span><span style="background:#100d0c;color:silver;">&gt; </span><span style="background:#100d0c;color:#e1b04a;">ForEach(</span><span style="background:#100d0c;color:#8ac5ff;">this </span><span style="background:#100d0c;color:#ff6fb7;">IEnumerable </span><span style="background:#100d0c;color:#e1b04a;">baseEnum,                </span><span style="background:#100d0c;color:#ffaeff;">Action</span><span style="background:#100d0c;color:silver;">&lt;</span><span style="background:#100d0c;color:#64b1ff;">Object</span></font><span style="background:#100d0c;color:silver;"><font size="1">&gt;  </font></span><font size="1"><span style="background:#100d0c;color:#e1b04a;">actionPerform) {

        </span><span style="background:#100d0c;color:#8ac5ff;">return </span><span style="background:#100d0c;color:#e1b04a;">ForEachInner(baseEnum</span><span style="background:#100d0c;color:silver;">.</span><span style="background:#100d0c;color:#e1b04a;">OfType</span><span style="background:#100d0c;color:silver;">&lt;</span><span style="background:#100d0c;color:#64b1ff;">Object</span><span style="background:#100d0c;color:silver;">&gt;</span></font><span style="background:#100d0c;color:#e1b04a;"><font size="1">(), actionPerform);
    }

    </font></span><span style="background:#100d0c;color:#a0a0a0;"><font size="1">/// &lt;summary&gt;
    /// </font></span><span style="background:#100d0c;color:#80ff00;"><font size="1">Do the actual work
    </font></span><font size="1"><span style="background:#100d0c;color:#a0a0a0;">/// &lt;/summary&gt;
    /// &lt;typeparam name=</span><span style="background:#100d0c;color:#919191;">&quot;TContainedType&quot;</span><span style="background:#100d0c;color:#a0a0a0;">&gt;</span><span style="background:#100d0c;color:#80ff00;">The type of the contained type.</span></font><font size="1"><span style="background:#100d0c;color:#a0a0a0;">&lt;/typeparam&gt;
    /// &lt;param name=</span><span style="background:#100d0c;color:#919191;">&quot;baseEnum&quot;</span><span style="background:#100d0c;color:#a0a0a0;">&gt;</span><span style="background:#100d0c;color:#80ff00;">The base enum.</span></font><font size="1"><span style="background:#100d0c;color:#a0a0a0;">&lt;/param&gt;
    /// &lt;param name=</span><span style="background:#100d0c;color:#919191;">&quot;actionPerform&quot;</span><span style="background:#100d0c;color:#a0a0a0;">&gt;</span><span style="background:#100d0c;color:#80ff00;">The action perform.</span></font><span style="background:#100d0c;color:#a0a0a0;"><font size="1">&lt;/param&gt;
    /// &lt;returns&gt;&lt;/returns&gt;
    /// </font></span><font size="1"><span style="background:#100d0c;color:#80ff00;">Documentation Created 7/20/2008
    </span><span style="background:#100d0c;color:#8ac5ff;">private static </span><span style="background:#100d0c;color:#ff6fb7;">IEnumerable</span><span style="background:#100d0c;color:silver;">&lt;</span><span style="background:#100d0c;color:#e1b04a;">TContainedType</span><span style="background:#100d0c;color:silver;">&gt; </span><span style="background:#100d0c;color:#e1b04a;">ForEachInner</span><span style="background:#100d0c;color:silver;">&lt;</span><span style="background:#100d0c;color:#e1b04a;">TContainedType</span><span style="background:#100d0c;color:silver;">&gt;</span></font><font size="1"><span style="background:#100d0c;color:#e1b04a;">(
        </span><span style="background:#100d0c;color:#ff6fb7;">IEnumerable</span><span style="background:#100d0c;color:silver;">&lt;</span><span style="background:#100d0c;color:#e1b04a;">TContainedType</span><span style="background:#100d0c;color:silver;">&gt; </span></font><font size="1"><span style="background:#100d0c;color:#e1b04a;">baseEnum,
                       </span><span style="background:#100d0c;color:#ffaeff;">Action</span><span style="background:#100d0c;color:silver;">&lt;</span><span style="background:#100d0c;color:#e1b04a;">TContainedType</span><span style="background:#100d0c;color:silver;">&gt; </span></font><font size="1"><span style="background:#100d0c;color:#e1b04a;">actionPerform) {

        </span><span style="background:#100d0c;color:#8ac5ff;">var </span><span style="background:#100d0c;color:#e1b04a;">getEnumerate </span><span style="background:#100d0c;color:silver;">= </span><span style="background:#100d0c;color:#e1b04a;">baseEnum</span><span style="background:#100d0c;color:silver;">.</span></font><font size="1"><span style="background:#100d0c;color:#e1b04a;">ToList();
        getEnumerate</span><span style="background:#100d0c;color:silver;">.</span></font><font size="1"><span style="background:#100d0c;color:#e1b04a;">ForEach(actionPerform);

        </span><span style="background:#100d0c;color:#8ac5ff;">return </span></font><span style="background:#100d0c;color:#e1b04a;"><font size="1">getEnumerate;
    }</font></span></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>&#160;</p>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>&#160;</p>
<p>Notice that anything which implements IEnumerable is caught above, regardless of what the collection.</p>
<p>&#160;</p>
<div style="float:none;display:inline;margin:0;padding:0;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:eb68bac9-98d9-4f88-a664-8c985a219755" class="wlWriterSmartContent">del.icio.us Tags: <a href="http://del.icio.us/popular/Advanced+C%23" rel="tag">Advanced C#</a>,<a href="http://del.icio.us/popular/C%23" rel="tag">C#</a>,<a href="http://del.icio.us/popular/C%23+3.0+for+Internal+DSL" rel="tag">C# 3.0 for Internal DSL</a>,<a href="http://del.icio.us/popular/Delegates" rel="tag">Delegates</a>,<a href="http://del.icio.us/popular/Functional+Programming" rel="tag">Functional Programming</a>,<a href="http://del.icio.us/popular/Lambada" rel="tag">Lambada</a>,<a href="http://del.icio.us/popular/linq" rel="tag">linq</a>,<a href="http://del.icio.us/popular/Visual+Studio+2008" rel="tag">Visual Studio 2008</a></div>
</p>
</p>
</p>
<p><div style="float:none;display:inline;margin:0;padding:0;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:1e50a19d-51fa-4053-b31f-4ed321648963" class="wlWriterSmartContent">Technorati Tags: <a href="http://technorati.com/tags/Advanced+C%23" rel="tag">Advanced C#</a>,<a href="http://technorati.com/tags/C%23" rel="tag">C#</a>,<a href="http://technorati.com/tags/C%23+3.0+for+Internal+DSL" rel="tag">C# 3.0 for Internal DSL</a>,<a href="http://technorati.com/tags/Delegates" rel="tag">Delegates</a>,<a href="http://technorati.com/tags/Functional+Programming" rel="tag">Functional Programming</a>,<a href="http://technorati.com/tags/Lambada" rel="tag">Lambada</a>,<a href="http://technorati.com/tags/linq" rel="tag">linq</a>,<a href="http://technorati.com/tags/Visual+Studio+2008" rel="tag">Visual Studio 2008</a></div>
</p>
<div class="wlWriterHeaderFooter" style="text-align:right;margin:0;padding:4px 0;"><a href="http://digg.com/submit?url=http%3a%2f%2fdcarr.wordpress.com%2f2008%2f05%2f22%2fadvanced-c-30-part-2-everyday-tasks-with-new-solutions%2f&amp;title=Advanced+C%23+3.0+%3a+Part+2+-+Everyday+Tasks+with+New+Solutions"><img src="http://digg.com/img/badges/100x20-digg-button.png" width="100" height="20" alt="Digg This" border="0" style="border:0;" /></a></div>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/dcarr.wordpress.com/232/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/dcarr.wordpress.com/232/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dcarr.wordpress.com/232/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dcarr.wordpress.com/232/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dcarr.wordpress.com/232/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dcarr.wordpress.com/232/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dcarr.wordpress.com/232/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dcarr.wordpress.com/232/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dcarr.wordpress.com/232/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dcarr.wordpress.com/232/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dcarr.wordpress.com/232/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dcarr.wordpress.com/232/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=232&subd=dcarr&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://team.pushbomb.com/2008/05/22/advanced-c-30-part-2-everyday-tasks-with-new-solutions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7b572cbcda5a17fe984e7dd1ddc9c3d6?s=96&#38;d=&#38;r=PG" medium="image">
			<media:title type="html">pushbomb</media:title>
		</media:content>

		<media:content url="http://dcarr.files.wordpress.com/2008/05/image-0001-thumb.png" medium="image">
			<media:title type="html">Image-0001</media:title>
		</media:content>

		<media:content url="http://digg.com/img/badges/100x20-digg-button.png" medium="image">
			<media:title type="html">Digg This</media:title>
		</media:content>
	</item>
		<item>
		<title>Framework API Development Best Practices using C# 3.0</title>
		<link>http://team.pushbomb.com/2008/05/15/domain-driven-framework-development-c-net-35-extension-methods-lambada-empowerment/</link>
		<comments>http://team.pushbomb.com/2008/05/15/domain-driven-framework-development-c-net-35-extension-methods-lambada-empowerment/#comments</comments>
		<pubDate>Thu, 15 May 2008 21:24:52 +0000</pubDate>
		<dc:creator>Damon Wilder Carr</dc:creator>
				<category><![CDATA[C# 3.0 Enhancements]]></category>
		<category><![CDATA[C# 3.0 for Internal DSL]]></category>
		<category><![CDATA[ORM]]></category>
		<category><![CDATA[Software Design]]></category>
		<category><![CDATA[Software Factories]]></category>
		<category><![CDATA[Software Futures]]></category>
		<category><![CDATA[agile practices]]></category>
		<category><![CDATA[resharper]]></category>
		<category><![CDATA[.NET 3.5]]></category>
		<category><![CDATA[API Design]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Extension Methods]]></category>
		<category><![CDATA[Framework Design]]></category>
		<category><![CDATA[Generics]]></category>
		<category><![CDATA[Lambada]]></category>

		<guid isPermaLink="false">http://dcarr.wordpress.com/2008/05/15/domain-driven-framework-development-c-net-35-extension-methods-lambada-empowerment/</guid>
		<description><![CDATA[This content assumes you understand the basics of the new C# 3.0 language features in .NET 3.5. I use a 'pretend pair programming' approach with continued refactoring as this is how I would discuss it if you were coding with me.

I'll start with a fairly trivial, yet important example (I use it every day). Many times when comparing Strings I want to ignore case and culture (the InvariantCulture). This is provided by an overload as such as you likely know:<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=188&subd=dcarr&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<h2 style="text-align:left;">PART 1</h2>
<p style="text-align:left;"><a href="http://dcarr.files.wordpress.com/2008/05/image31.png"><img class="alignright" style="border-width:0;margin:5px;" src="http://dcarr.files.wordpress.com/2008/05/image3-thumb.png?w=1024&#038;h=220" alt="image" height="220" /></a></p>
<p style="text-align:left;">This content assumes you have an introductory knowledge of C# 3.0 language features in .NET 3.5 and mastery of legacy C# 2.0 Generics, Generic Type Constraints, Anonymous Delegates and related material.</p>
<p>I use a &#8216;pair programming&#8217; approach with continued refactoring as this is how I would discuss it if you were coding with me, with an unfortunate one-way delivery.</p>
<h3 style="text-align:left;">The Brief Strategic View</h3>
<p style="text-align:left;">Microsoft has slowly been moving C# in a very productive direction (this is not new, as these features existed in 2.0 although not nearly as well integrated) to provide &#8216;Functional Language&#8217; features. If you don&#8217;t know or care about language semantics, just know that Linq and especially Lambada Expressions are about empowering you to use executable code like a variable, aka to leverage the power of functional programming. For more on this, read this <a href="http://msdn.microsoft.com/en-us/magazine/cc507636.aspx">MSDN article</a> by <a href="http://msdn.microsoft.com/en-us/magazine/cc301175.aspx">Joel Pobar (former CLR Team)</a> or read the next set of posts (part 2 onward) as I will go into the depths of this.</p>
<table style="text-align:left;height:153px;" border="1" cellspacing="0" cellpadding="2" width="399">
<tbody>
<tr>
<td width="543" valign="top">
<p align="center">I think of Lambadas as an incredibly focused and powerful domain specific language for delegates.</p>
<p>In this sense they are quite similar to Regular Expressions in that they are really good at their focus area.</p>
<p align="center">What do I mean by good?</p>
<ul>
<li>
<div>Terse yet Understandable / Maintainable</div>
</li>
<li>
<div>Syntax tailored to the need, not the other way around.</div>
</li>
<li>
<div>Highly effective for problems that are orders of magnitude more difficult without them (a simple 10% improvement would not cut it)</div>
</li>
</ul>
</td>
</tr>
</tbody>
</table>
<h2 style="text-align:left;">Painless Intro</h2>
<p style="text-align:left;">I&#8217;ll start with a fairly trivial, yet important example (I use it every day). Many times when comparing Strings I want to ignore case and culture (the InvariantCulture). This is provided by an overload as such as you likely know:</p>
<p>[Test,Category("BaselineCore")]<br />
public void shouldAsserStringCloneInvokeEqual() {</p>
<p>var baselineString = &#8220;This is a TEST CASE to IgnOrE Casing&#8221;;</p>
<p>var stringUpper = baselineString.ToUpperInvariant();</p>
<p>Assert.IsTrue(baselineString.Equals(stringUpper,<br />
StringComparison.InvariantCultureIgnoreCase));</p>
<p style="text-align:left;">The test results are shown above. Pass. Ok so I really like short, concise code that is understandable at a glance. Also it&#8217;s a pain to always (even with ReSharper) use this (and I have seen people use RegEx for this! RegEx is awesome but overkill for this issue).</p>
<p style="text-align:left;">Refactoring</p>
<ul style="text-align:left;">
<li>Create an extension method on String</li>
<li>Decide on a good name for the method (this is SO important and for most an afterthought!)</li>
</ul>
<p style="text-align:left;">I&#8217;ve settled on calling this new method on String &#8216;EqualsCore&#8217; as that is what we are doing, making the conditions for a match &#8217;simpler&#8217; and seeing &#8216;just the core values&#8217; are the same (anyway it makes sense to me)., I suppose this could be &#8216;EqualsRelaxed&#8217; or whatever..</p>
<p style="text-align:left;">Here is the test case (no code yet):</p>
<p>[Test, Category("BaselineCore")]<br />
public void shouldAsserStringsEqualUsingExtension() {<br />
var baselineString = &#8220;This is a TEST CASE to IgnOrE Casing&#8221;;<br />
Assert.IsTrue(baselineString. EqualsSimple(baselineString.ToUpperInvariant())); }</p>
<p style="text-align:left;">Now we write the code. Here is the container for the extension method:</p>
<p>public static class StringExtensions {</p>
<p>public static bool EqualsSimple(this string sTarget, string compare) {</p>
<p>return sTarget.Equals(compare, StringComparison.InvariantCultureIgnoreCase); }</p>
<p>}</p>
<p style="text-align:left;">Indeed they both pass:</p>
<p style="text-align:left;"><a href="http://dcarr.files.wordpress.com/2008/05/image25.png"><img class="alignright" style="float:right;border-width:0;" src="http://dcarr.files.wordpress.com/2008/05/image25-thumb.png?w=455&#038;h=255" alt="image25" width="455" height="255" align="left" /></a></p>
<p style="text-align:left;">
<p style="text-align:left;">
<p style="text-align:left;">
<p style="text-align:left;">
<p style="text-align:left;">
<p style="text-align:left;">Since every type inherits from Object, and Equals is defined on Object, all instances should support this approach, and I could be early bound by using Generics&#8230;. Hmm&#8230;</p>
<p style="text-align:left;">I tried this (note: I gave it a new new &#8216;EqualsThis&#8217; to separate them.</p>
<p>public static bool EqualsThis&lt;TTarget&gt;(this TTarget sTarget, TTarget compare){</p>
<p>return sTarget.Equals(compare);</p>
<p>}</p>
<p style="text-align:left;">Functionally not that interesting at all, but a test. So I typed in the following and wow&#8230; It works from Intellisense&#8217;s view&#8230; Ok it compiled! Wait&#8230;..FAIL! But why:?</p>
<p style="text-align:left;">OK here is the new test:</p>
<p>[Test, Category("BaselineCore")]</p>
<p>public void shouldAsserANYTHINGEqualUsingExtension() {</p>
<p>const String baselineString =&#8221;This is a TEST CASE to IgnOrE Casing&#8221;;</p>
<p>var sb = new StringBuilder(baselineString);</p>
<p>Assert.IsTrue(sb.EqualsThis(new StringBuilder(sb.ToString())));</p>
<p>}</p>
<p style="text-align:left;">
<p style="text-align:left;">Interesting&#8230;</p>
<p style="text-align:left;">Here is the documentation for what Equals means by default from Microsoft:</p>
<table style="text-align:left;" border="1" cellspacing="0" cellpadding="2" width="396">
<tbody>
<tr>
<td width="394" valign="top">
<p align="center">Returns: true if objA is the same instance as objB or if both are null references or if objA.Equals(objB) returns true; otherwise, false.</p>
</td>
</tr>
</tbody>
</table>
<p style="text-align:left;">So our code fails using the extension yet this returns true:</p>
<p>[Test] public void shouldAssertStringBuilderExplicit() {</p>
<p>const String baselineString = &#8220;This is a TEST CASE to IgnOrE Casing&#8221;;</p>
<p>var sb = new StringBuilder(baselineString);</p>
<p>var sb2 = new StringBuilder(baselineString); Assert.IsTrue(sb.Equals(sb2));</p>
<p>}</p>
<p style="text-align:left;">So Reflector to the rescue once again. I could see in Reflector what I believed the issue was. Indeed the StringBuilder class has an overloaded Equals, and even making the extension method cast to the generic type directly was a no go.</p>
<table style="text-align:left;" border="1" cellspacing="0" cellpadding="2" width="400">
<tbody>
<tr>
<td width="400" valign="top">
<p align="center">So what do you think? Why would this compile fine with absolutely no problems (and that is correct it turns out), but FAIL at runtime on the assertion when the same line above passes? Skip ahead and reply with the answer if you know it&#8230;.</p>
</td>
</tr>
</tbody>
</table>
<p style="text-align:left;">This exposes one of the dangers that we must be incredibly careful with. It has always been poor design in my opinion to encourage developers to override common methods such as ToString() and Equals(object X) with their own behaviors as you force consumers of the API to understand IMPLEMENTATION. You cannot ensure your OK simply from a contract. This is known to be evil&#8230;.</p>
<p style="text-align:left;">Of course this is a legacy style and will be slowly phased out.</p>
<p style="text-align:left;">Spin up reflector and look at the code for the OVERLOAD that StringBuilder has:</p>
<div style="text-align:left;">public bool Equals(StringBuilder sb){if (sb == null) return false;</p>
<p>return (((this.Capacity == sb.Capacity) &amp;&amp; (this.MaxCapacity == sb.MaxCapacity))<br />
&amp;&amp;<br />
this.m_StringValue.Equals((string) sb.m_StringValue));</p>
<p>}</p></div>
<div style="text-align:left;">
<p style="text-align:left;">Of course! How else could a StringBuilder claim to be &#8216;Equal&#8217; to another&#8230; In fact it is perfectly reasonable but again shows the danger of late binding, making assumptions about how any &#8216;object&#8217; type will perform.</p>
</div>
<div style="text-align:left;">
<p style="text-align:left;">So there was no real way for our extension to call the &#8216;correct&#8217; equals. It called the base definition given above which is obvious now why it failed.</p>
<p style="text-align:left;">
<p style="text-align:left;">So how do we fix this for the general case?</p>
<div style="text-align:left;">
<p style="text-align:left;">Here is the test case which I got working.. If your not familiar with this style of code,</p>
</div>
<div style="text-align:left;">This is the foundation we build layer after layer on and illustrates the core of this post.</div>
<p>[Test] public void shouldAsserANYTHINGEqualUsingExtension() {</p>
<p>const String baselineString = &#8220;This is a TEST CASE to IgnOrE Casing&#8221;;</p>
<p>var sb = new StringBuilder(baselineString);</p>
<p>var sb2 = new StringBuilder(baselineString);</p>
<p>Assert.IsTrue(sb.EqualsThis(x =&gt; x.Equals(sb2)));</p>
<p>}</p>
<table style="text-align:left;" border="1" cellspacing="0" cellpadding="2" width="438">
<tbody>
<tr>
<td width="436" valign="top">
<p align="center">Lambadas are like an incredibly focused and powerful domain specific language for delegates. In this sense they are quite similar to Regular Expressions in that they are really good (and to quantify good, I mean clear yet precise, not overly verbose yet highly effective for problems that are more difficult without them).</p>
</td>
</tr>
</tbody>
</table>
<div style="text-align:left;">So what about the implementation? Here it is:</div>
<p>public static bool EqualsThis&lt;TTarget&gt;(this TTarget sTarget,</p>
<p>Predicate&lt;TTarget&gt; EqualsDelegate) {</p>
<p>return EqualsDelegate.Invoke(sTarget);</p>
<p>}</p>
<div style="text-align:left;">It&#8217;s all about Expressions! Think of them as varied ways to receive executable code that you can &#8216;invoke&#8217; literally, that must meet the contract you define.</div>
<div style="text-align:left;">This is so basic after we cover what the really useful applications are. However remember this has nothing to do with the examples, only the concepts they represent.</div>
<h1 style="text-align:left;"></h1>
<table style="text-align:left;" border="1" cellspacing="0" cellpadding="2" width="632">
<tbody>
<tr>
<td width="400" valign="top">
<div></div>
<ol>
<li>Combine Generics and Generic Constraints to your Extension Methods but BE CAREFUL and ensure you are covered by unit tests</li>
<li>Try to always think a level of abstraction above where your immediate need is to see if your solution indeed has wider and perhaps far more valuable contribution.</li>
<li>Hide complexity behind your Framework API, and focus on crafting work that others will easily consume.</li>
</ol>
</td>
</tr>
</tbody>
</table>
</div>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/dcarr.wordpress.com/188/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/dcarr.wordpress.com/188/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dcarr.wordpress.com/188/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dcarr.wordpress.com/188/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dcarr.wordpress.com/188/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dcarr.wordpress.com/188/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dcarr.wordpress.com/188/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dcarr.wordpress.com/188/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dcarr.wordpress.com/188/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dcarr.wordpress.com/188/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dcarr.wordpress.com/188/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dcarr.wordpress.com/188/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=188&subd=dcarr&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://team.pushbomb.com/2008/05/15/domain-driven-framework-development-c-net-35-extension-methods-lambada-empowerment/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7b572cbcda5a17fe984e7dd1ddc9c3d6?s=96&#38;d=&#38;r=PG" medium="image">
			<media:title type="html">pushbomb</media:title>
		</media:content>

		<media:content url="http://dcarr.files.wordpress.com/2008/05/image3-thumb.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://dcarr.files.wordpress.com/2008/05/image25-thumb.png" medium="image">
			<media:title type="html">image25</media:title>
		</media:content>
	</item>
		<item>
		<title>The Collision of Software Project Management and Agile</title>
		<link>http://team.pushbomb.com/2008/05/08/the-collision-of-software-project-management-and-agile/</link>
		<comments>http://team.pushbomb.com/2008/05/08/the-collision-of-software-project-management-and-agile/#comments</comments>
		<pubDate>Thu, 08 May 2008 06:00:00 +0000</pubDate>
		<dc:creator>Damon Wilder Carr</dc:creator>
				<category><![CDATA[Software Design]]></category>
		<category><![CDATA[Software Factories]]></category>
		<category><![CDATA[Software Futures]]></category>
		<category><![CDATA[agile practices]]></category>
		<category><![CDATA[Best Practices]]></category>
		<category><![CDATA[Culture]]></category>
		<category><![CDATA[Methodology]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Statistics]]></category>

		<guid isPermaLink="false">http://dcarr.wordpress.com/2007/10/24/the-collision-of-software-project-management-and-agile/</guid>
		<description><![CDATA[“How do we get people to commit to something when everyone has a different perspective based on role or even political leanings for larger companies”“Nobody will commit to a final decision for fear they will not be able to modify it!"<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=91&subd=dcarr&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p align="left"><a href="http://dcarr.files.wordpress.com/2008/04/chart.png"><img class="alignright size-medium wp-image-165" style="width:149px;height:162px;" height="256" alt="" src="http://dcarr.files.wordpress.com/2008/04/chart.png?w=256&#038;h=256" width="256" /></a><a href="http://dcarr.files.wordpress.com/2008/04/chart.png"></a></p>
<p align="left">&nbsp;<strong>How do we get people to commit to something when everyone has a different perspective based on role or even political leanings for larger companies&rdquo;</strong> <strong>&ldquo;Our stakeholders are petrified to commit to a final stake in the ground for fear they will not be able to modify it based on I.T.&#8217;s inflexibility and inability to change&#8221;</STRONG> </P><br />
<P align="left">&nbsp;</P><br />
<P align="left">I though perhaps these were problems we had overcome in our industry, as the solutions are fairly well understood. I was wrong. What is the bottom line break-down between I.T. and the Business? That is a long and colorful debate. However I offer this: </P><br />
<UL><br />
<LI><br />
<DIV align="left">Most organizations punish those who are bad at PREDICTING THE FUTURE in software engineering. Of course these are smart people but they continue to demand clairvoyance with a lack of statistics.</DIV></LI><br />
<LI><br />
<DIV align="left">What happens? Padding of the schedule and bitter fights for every last month, when nobody has any idea what the effort is, not can they quantify the quality, and more importantly maintainability requirements around a software initiative.</DIV></LI><br />
<LI><br />
<DIV align="left">The fact is you cannot know at a micro level about a project until you are well into building it. This is something I have never met a receptive audience for, however it proves itself time and time again.</DIV></LI><br />
<LI><br />
<DIV align="left">&#8220;How do we give people the freedom to change their minds, yet deliver concrete estimates on time and cost to our managers?&#8221;</DIV></LI><br />
<LI><br />
<DIV align="left">&#8220;How much will this cost us and how can we estimate it knowing we will likely change our minds during the project based on previous projects, and how can we get early and consistent involvement in the development process?&#8221;</DIV></LI><br />
<LI><br />
<DIV align="left">&#8220;How can we ensure that necessary quality is met when we always enter risk mode at the end and quality goes out the window? Can&rsquo;t we manage with quality at every single stage, even every day?!&#8221;</DIV></LI></UL><br />
<P class="msonormal" style="text-align:center;" align="left"><STRONG>Whatever you do (in my opinion anyway) Don&rsquo;t say Agile&hellip;Nobody on the business side cares. In fact for whatever reason, software causes perfectly rational people to loose their mind (I cannot really blame them).</STRONG></P><br />
<P class="msonormal" align="left"><br />
<P class="msonormal" align="left"><br />
<P class="msonormal" align="left"><br />
<P class="msonormal" align="left">What I have to say on the matter is accompanied by deep battle-scars. What I have to say is definitely not what most want to hear, and even the technologists want to argue that they CAN come close to prediction. However what I say has the &lsquo;added moral quality of being true&rsquo;. This is hard to argue in light of the facts. That still often changes nothing, as companies firmly plant their head in the sand again and hope for the best with no real way of knowing what will happen and no practical way of really tracking in real time how their exposure to risk is changing.<br />
<P class="msonormal" align="left"><br />
<P class="msonormal" align="left"><br />
<P class="msonormal" align="left"><br />
<P class="msonormal" align="left">I know&hellip; I know&hellip; Agile is 100% about that but not in the way (typically) this group wants to hear, no that is why a knockout one-two punch is as follows (to be insanely overly simplistic):</P><br />
<P class="msonormal" align="left"><br />
<P class="msonormal" align="left"><br />
<P class="msolistparagraphcxsplast" style="margin-left:0.75in;text-indent:-0.25in;" align="left">1) Heavy Statistical Metrics for the &lsquo;Planning&rsquo; View Inclined</P><br />
<P class="msolistparagraphcxsplast" style="margin-left:0.75in;text-indent:-0.25in;" align="left">2) Of course, Agile Practices to Provide the Inputs to (1) and to Optimize your Chances on the Execution Side</P><br />
<P class="msonormal" style="margin-left:0.25in;" align="left"><br />
<P class="msonormal" align="left">This article is about some detail around (1) that far too many miss in my opinion and why it doesn&rsquo;t serve you to mix the terminology of these two groups (one of the only occurrences where I recommend that as I am typically the one pushing everyone into &lsquo;one common Domain Driven language&rsquo;)</P><br />
<P class="msonormal" style="margin-left:0.25in;" align="left"><br />
<H2 align="left"><STRONG>The Four Critical Dimensions</STRONG></H2><br />
<P align="left"><A href="http://dcarr.files.wordpress.com/2008/05/drivers.png"><IMG class="aligncenter size-medium wp-image-185" height="231" alt="" src="http://dcarr.files.wordpress.com/2008/05/drivers.png?w=300&#038;h=231" width="300"></A> </P><br />
<P class="MsoNormal" align="left">When addressing the concerns of a new custom software project these are the four key elements that must always be addressed (there are others such as security, scalability, etc. but those are included in &lsquo;Scope&#8217; as functional and non-functional requirements):</P><br />
<UL><br />
<LI class="MsoNormal"><br />
<DIV align="left">Time (cannot be made)</DIV></LI><br />
<LI class="MsoNormal"><br />
<DIV align="left">Scope/Features (you cannot know it until your done, so now what?</DIV></LI><br />
<LI class="MsoNormal"><br />
<DIV align="left">Quality (not typically discussed, as who wants &lsquo;bad or sort of low&rsquo; quality)</DIV></LI><br />
<LI class="MsoNormal"><br />
<DIV align="left">Cost (Since you have almost nothing to go on here, what to do? Your agile consultant says the system is &lsquo;done when it is done, not when some arbitrary date is set&rsquo; and he is 100% correct. However the business gets to decide when it is &lsquo;done enough&rsquo; not I.T. (with exceptions of course)</DIV></LI></UL><br />
<P class="MsoNormal" align="left">As Quality is not usually debated (I have never had a client say that the software could be poor quality), that leaves Time, Scope and Cost as the main moving parts to work with.</P><br />
<P class="MsoNormal" align="left"><br />
<P class="MsoNormal" style="margin-top:15pt;" align="left">The diagram above is where many stop. That is missing the entire point, as the DRIVERS that facilitate your ability to do well are missing. For example:</P><br />
<P class="MsoNormal" style="margin-top:15pt;" align="left"><STRONG>1) A lack of a continuous integration environment with regression tests will severely hurt your ability to achieve quality (all things being equal)</STRONG></P><br />
<P class="MsoNormal" style="margin-top:15pt;" align="left"><STRONG>2) A bad process / culture kills just about all of it</STRONG></P><br />
<P class="MsoNormal" style="margin-top:15pt;" align="left"><STRONG>3) Bad team morale is the same coin, different side.</STRONG></P><br />
<P class="MsoNormal" style="margin-top:15pt;" align="left"><STRONG>4) A process that cannot manage the inevitable change in scope as we &#8216;discover&#8217; what the project is all about, will kill just about all of it.</STRONG></P><br />
<P class="MsoNormal" style="margin-top:15pt;" align="left"><STRONG>5) A team lacking in solid design skills (design for change) such as a mastery of the important design patterns (Strategy Pattern Anyone?) as well as a lack of a Dependency Injection Container (there is just no good reason not to use one)</STRONG></P><br />
<P class="MsoNormal" style="margin-top:15pt;" align="left"><STRONG>6) Lack of an Object to Relational Mapping Abstraction Layer. Deal Breaker as of today (perhaps not a year ago).</STRONG></P><br />
<P class="MsoNormal" align="left"><br />
<P class="MsoNormal" align="left"><br />
<P class="MsoNormal" align="left"><br />
<P class="MsoNormal" align="left"><br />
<P class="MsoNormal" align="left"><br />
<P class="MsoNormal" align="left">There is no real doubt by anyone (except for a few people who also are not so sure on the whole evolution thing) that Agile practices provide the common sense way to address the same concerns most of us have around software.</P><br />
<P class="MsoNormal" style="margin-left:0.25in;" align="left"><br />
<P class="MsoNormal" style="margin-left:0.25in;" align="left"><br />
<P class="MsoNormal" style="margin-left:0.25in;" align="left">You know it, I know it, we all know it. However they don&rsquo;t care (and really have likely heard some bad things about it).</P><br />
<P class="MsoNormal" style="margin-left:0.25in;" align="left"><br />
<P class="MsoNormal" style="margin-left:0.25in;" align="left">My assumption is you are a person on the software side in a managerial capacity of some sort. I made this mistake for you many times. Resist the urge to &lsquo;set them straight&rsquo; or to explain the wonders of Agile when asked these questions (or even when not) and instead&hellip; I&rsquo;ll be getting to that&hellip;.</P><br />
<P class="MsoNormal" style="margin-left:0.25in;" align="left"><br />
<P class="MsoNormal" style="margin-left:0.25in;" align="left"><br />
<P class="MsoNormal" align="left">Anyway, they would probably just think &lsquo;how 2004&rsquo; and ask about SOA or something&hellip;.</P><br />
<P class="MsoNormal" align="left"><br />
<P class="MsoNormal" align="left">There are some real deal-breaker assumptions around project planning with or without Agile execution (and without agile is very well might be an execution.. OK enough biased injection for one article).</P><br />
<P class="MsoNormal" align="left"><br />
<P class="MsoNormal" align="left">There is often an unspoken (and unrecognized) characteristic that you should be able to &lsquo;tell the future&rsquo;. And many will think that the worse you are at it, the more likely it is you just might be lazy and/or stupid. I&rsquo;ve seen it over and over and over. Those who spin, those who pad, those who create fluff to buy time win. Those who really try and don&rsquo;t play games get nailed to the wall.</P><br />
<P class="MsoNormal" align="left"><br />
<P class="MsoNormal" align="left">Count me in the &lsquo;dumb and lazy&rsquo; group because I am terrible at predicting the future.</P><br />
<P class="MsoNormal" align="left"><br />
<P class="MsoNormal" align="left">In high school I was certain this really cute cheerleader would accept my invitation to the prom. I was also certain a few years ago that a system could be built for W dollars, in X months with Y people and Z quality. After all, that is all I could get from the customer as they were taking no input from vendors. Sure it was aggressive but we were so smart! We could do anything!</P><br />
<P class="MsoNormal" align="left"><br />
<P class="MsoNormal" align="left">Both had similar endings.</P><br />
<P class="MsoNormal" align="left"><br />
<P class="MsoNormal" align="left"><br />
<P class="MsoNormal" align="left"><br />
<P class="MsoNormal" style="border-right:windowtext;border-top:windowtext;border-left:windowtext;border-bottom:windowtext;padding:0;" align="left"><br />
<P class="MsoNormal" style="border-right:windowtext;border-top:windowtext;border-left:windowtext;border-bottom:windowtext;text-align:center;padding:0;" align="left">&ldquo;In order to succeed in complex software planning, just like in Agile, you have to give up. You have to completely accept the fact that you cannot possible know what you are really doing until you are already well into a solution, at least not at any detailed level&rdquo;</P><br />
<P class="MsoNormal" style="border-right:windowtext;border-top:windowtext;border-left:windowtext;border-bottom:windowtext;text-align:center;padding:0;" align="left">&nbsp;</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left"><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left"><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left"><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left"><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">Sound familiar? But you know you need these Agile ideas on the &lsquo;other side&rsquo; and you also know it would be self-defeating to wave that flag..</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left"><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">Nobody wants to admit they lack power, especially in areas they have devoted their life to mastering. But why does this not only empower you, but create the bedrock of extreme competence and success? Is this like the alcoholic finally admitting he is powerless over the bottle? Only then can things get better? I doubt it. This is only software.</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left"><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left"><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-left:0.25in;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left"><br />
<P class="MsoListParagraphCxSpMiddle" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;text-indent:-0.25in;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">&middot;</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left"><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;text-align:center;padding:1pt 4pt;" align="left"><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;text-align:center;padding:1pt 4pt;" align="left"><br />
<H1 style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">The Monetary Stakeholders</H1><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">And for they people either funding and/or profiting from this exercise the concerns can be quite different.</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-left:0.5in;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">&#8220;How can we ensure profitability on our work when we know change will occur? (For internal IT they may be managed and accountable for profitability if they are run like a profit center). If not profitability then &#8220;How can we possibly commit to a date and cost when we know this will be a moving target as we evolve the solution?&#8221;</p>
<p class="msonormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;margin-left:0.5in;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">&#8220;We have an abysmal record of missed deadlines, cost over-runs, quality problems and our users not being happy with our delivered systems. What can we do to improve this?&#8221;</p>
<p class="msonormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;margin-left:0.5in;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">&#8220;How do we manage the scope changes and &lsquo;feature creep&#8217; placed on us by the business people/stakeholders? This is what typically destroys our profits and/or time commitments and cost commitments, often resulting is a severe quality issues as well. How can we give people what they want but manage this change?&#8221;</p>
<p class="msonormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">
<p class="msonormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">This article is about bring these two groups together and keeping them just apart enough. This article is targeted to the people who must deliver software to their clients (be it internal IT or an outside Agile consulting firm doing the work). I assume these concepts would work in a non-Agile Process environment but I have cannot remember much luck (or for anyone I knew) in those days without resorting to what I call &lsquo;white tricks&rsquo; so I will not comment.</p>
<p class="msonormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">
<p class="msonormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">
<p class="msonormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">A Framework for Project Statistical Success Optimization</p>
<p class="msonormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">
<p class="msonormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">We know that these two very distinct groups will need to work closely together in an Agile environment if we want to optimize our chances. The days of separating the business experts from IT is long gone. In fact, for an Agile project to succeed it is typical to actually have a business domain expert on the development team as a fully fledged member.</p>
<p class="msonormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">
<p class="msonormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">&lsquo;High Ceremony&#8217; software processes may work (it is really dependent on who is doing the work as an amazing team will almost always succeed &ndash; see Peopleware by DeMarco and Lister) but at a large opportunity cost in almost all cases.</p>
<p class="msonormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">Any assigned domain expert should have the reach to get answers to questions quickly outside their domain knowledge when required. For a non-trivial project it will likely cover many domains and it may not be possible for that individual to have a mastery of all of them, however this person should be able to expeditiously get answers from others when required, This is a critical success factor to any Agile project.</p>
<p class="msonormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">I have evolved over many years this approach to software profitability and risk management in a very well tested and disciplined way. It has evolved since 1998 when I was CTO of a niche financial services software firm, which was sold in 2004. I then started the firm agilefactor and significantly evolved these ideas further as I still do literally almost every day! It&rsquo;s 2007 and there are many war wounds.</p>
<p class="msonormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">If any of this content seems like &#8216;academia&#8217; or &#8216;theory&#8217; I can assure you these are all proven real-world strategies, having been applied by myself and many others for years and years.</p>
<p class="msonormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">At the most basic, one could say everything eventually comes down these four critical dimensions&#8230;</p>
<p class="msonormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">
<p class="msonormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">
<p class="msonormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">It is CRITICAL you never let a client box you in on all of the three of these items if it can be avoided or you may have to &#8216;walk away&#8217; from a project (many in internal IT do not have that luxury but at least this article will show you how to push back in a way that is hard to be disputed by the forces trying to box you in to possible assured failure).</p>
<p class="msonormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">Your client gets to drive only two of the three items at most (such as Time and Cost), while you driven the third (Scope in this example) or the remaining items you control (you must always have at least one that the client explicitly gives you control over).</p>
<p class="msonormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">This is critical to profitable software sales both for commercial and custom one-off development but many fail in this area in their eagerness to close deals (this is especially a problem with salespeople who are not put in check on what they can promise the client, and will promise you right into a massive loss &#8211; a lesson I learned firsthand early in my career).</p>
<p class="msonormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">For example, if a client says:</p>
<p class="msonormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">
<p class="msolistparagraph" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;text-indent:-0.25in;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">&middot; We are allowing vendors to work until October 1st to achieve these 120 individual scope items in the attached 600 page scope document we have assembled (the first major sign of trouble).</p>
<p class="msonormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">
<p class="msolistparagraph" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;text-indent:-0.25in;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">&middot; Vendors have $1,900,000 to build this system. This is non-negotiable and the software must be extreme production quality, with severe contractual penalties for down-time, with scaling up to 10000 concurrent sessions per machine with an average response time of one second or less &#8220;</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-left:0.5in;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left"><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">Do we walk away? My initial reaction is absolutely..</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left"><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">This violates the principle described above as you are not in control of any of the four critical elements. The answer is sometime you must walk away!</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left"><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">I will describe here a way to help determine if you should and how you can effectively push back on this, as we know there will be significant deltas on that scope document (both academically from studies and practically from our experience).</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">We really have no idea if we should accept these terms. There are ways however where we can at least assess the risk and possible accept the terms when we learn these tools.</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">We all know it is an agile imperative deliver a working build to your stakeholders for each iteration that is &lsquo;real production&rsquo; although a subset most of the time</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">The client drives at most two dimensions, and you must drive the third (again ignoring the Quality variable) or you risk a disaster for everyone.</P><br />
<DIV style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">Any changes to a &#8216;fixed price&#8217; must be done with an incredibly rigorous &#8216;change order&#8217; process where all changes from the plan are scoped, priced and the impact is presented to the customer so they can decide if it is worth it. Even then these &lsquo;mini projects&rsquo; must be managed with the same techniques as if they were anything else. In fact they are no different, and we always assume there will be lots of them (unless we offer a lower risk/higher reward scenario). I often would meet with the client described above and say &lsquo;OK we can do this but it will cost $50,000 and delay us two weeks. How would you like to proceed? Reactions vary but if you didn&rsquo;t educate the customer on these matters, if it is negative you have nobody to blame but yourself. You knew this was coming. </DIV><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">And after all, THEY are deviating from &lsquo;the plan&rsquo; they committed to with confident assurances that there would be little to no need for &lsquo;change orders&rsquo; (this is a common occurrence in my experience with a correlation to the larger the company the most convinced they are the scope will not change.</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left"><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left"><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">Establish Risk Tolerance Before Defining the Time, Scope and Cost Constraints</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left"><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left"><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">Based on the extensive research and project database built by the industry luminaries and incredibly esteemed experts Tom DeMarco and Tim Lister, we now know what the probability distribution curve is for new custom software projects. It is lognormal with a high peak and a long curve to the right. This is absolutely critical for everyone to understand and I highly recommend you read the book &#8220;Waltzing with Bears&#8221; for a detailed discussion (see the end of this chapter for more information).</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left"><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">This is the probability distribution curve we must embrace:</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left"><A href="http://www.agilefactor.com/img/0465adf5e6bf_cfd/image001.jpg"><IMG style="border-width:0;" height="419" alt="image001" src="http://www.agilefactor.com/img/0465adf5e6bf_cfd/image001_thumb.jpg" width="546" border="0"></A></P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">You establish the client&#8217;s willingness to accept the unavoidable possibility of failure across any of the four dimensions (we cannot predict the future) and then find that point on the curve moving up from the X axis point you have for the client (the X axis is probability of success) and take the area to the left of that point.</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left"><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">The total area under the curve is 100% so the farthest right point would indicate 100% confidence (again basically impossible to achieve where most organizations assume 100% by default, something that must change if our industry will ever &lsquo;grow up&rsquo;. As we cannot control the future, we can only manage it and the risks, we must know how &#8216;risky&#8217; the client wants to be (again by asking them or inferring it ourselves &#8211; often manifested in a &#8216;public&#8217; date and an &#8216;internal&#8217; date which is past the public date if we know the client will not cancel the project or penalize us tangibly for missing the public date).</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left"><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">It is a typical &#8216;risk/reward&#8217; situation. If the customer takes on more risk we might save them money, or deliver early. If they want less risk, we must significantly increase our cumulative resources attached to a project with the knowledge that &#8216;adding people to a late project makes it later&#8217;. This we know as fact so adding people is really only an option in the early phases. This has a large impact on early project planning.</P><br />
<P class="MsoListParagraphCxSpFirst" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;text-indent:-0.25in;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">&middot; We need to understand if a customer is OK assuming a 15% risk of failure for example.</P><br />
<P class="MsoListParagraphCxSpMiddle" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;text-indent:-0.25in;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">&middot; After all, don&rsquo;t all future events have unknown outcomes?</P><br />
<P class="MsoListParagraphCxSpLast" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;text-indent:-0.25in;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">&middot; Is the client willing to as much as double their budget for a say 10% increase to 95% probability of future success across all dimensions?</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">A 95% success promise is not only near reckless to offer, it is an incredible shifting of risk anyone should demand a rich reward for taking on.</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">Studies are behind me on this as well with the well established fact that the best developers are as much as 28 x more productive then the worst). It quite literally is often a 100% increase in total resources allocated for a project to move from 85% to 95% even though it is a 10% gain in probability, hence the very long tail. The highest I have ever had a client go is 90% and we actually had two teams in two locations for redundancy (they didn&rsquo;t know about each other). One team almost failed but delivered a solution, however the other team&rsquo;s solution was superior so that is what we went with. This gave us our high probability due to the redundancy and the client paid dearly for this safety.</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">For example, the development team may say:</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-left:0.5in;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">&#8220;We had a terrible two weeks. Our lead Cryptography expert was sick so we moved those features into the next iteration and we severely underestimated the complexity of the mainframe integration and User Profile Customization.</p>
<p class="msonormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-left:0.5in;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">
<p class="msonormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-left:0.5in;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">Therefore we could only achieve 50% of what we had planned for this iteration. I would say from our agreed upon 85% confidence we are now closer to 75%. We can see if we make it up in the next iteration or we can take measures A, B and C to get back to 85%. What do you want to do?&#8221;</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-left:0.5in;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left"><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-left:0.5in;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;text-align:center;padding:1pt 4pt;" align="left">A better question I have for you is, would you rather not know this? Almost all organizations are nowhere near this level of integrated risk assessment, quantitative measurement and adjusting action execution.</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-left:0.5in;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left"><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-left:0.5in;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left"><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-left:0.5in;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left"><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">This is typically a decision for a high level individual (typically the project manager with the optional input of the customer) and hopefully with input from as many people as possible covering all dimensions.</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left"><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">Adding people will typically hurt you, not help you. You should already have done the obvious things like have moved the team into a &lsquo;war room&rsquo; setting (almost always a sure way to improve productivity) or many other solutions, so if you missed any do it now as these techniques are proven and it is much more painful to fail.</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">As for the client, they can also be blissfully unaware of how we manage the process of our internal development, but this well established process makes it incredibly hard to fail.</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">Here is an example with risk tolerance. Based on negotiations with the client they have agreed to a risk tolerance of 85% (a 15% risk of failure). Based on this, you can now estimate knowing your margin for error. The customer has scope requirements, and cost requirements but is fairly open to time.</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">You come back to the client and say:</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-left:0.5in;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">&#8220;Based on an 85% confidence we feel we can deliver your scope at the cost you describe at some point between April 1 2006 and July 1 2006&rsquo;&#8221;. The client may protest, saying (for the first time) they were hoping for a March 1 delivery. You confer with your colleagues and respond that this would be possible at a 70% Confidence (30% chance of failure). And so the negotiations follow&#8230;But at least now you have very concrete &#8216;dials to turn&#8217; and it is hard for the customer to argue with the fact base supporting you.</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-left:0.5in;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left"><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">I assert that custom software is a &#8216;wicked problem&#8217; (to see a great definition of &#8216;wicked problem&#8217; see http://www.cognexus.org/id42.htm or the text at the end of this article.</P><br />
<H1 style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">Conclusion</H1><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left"><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">To help ensure a positive outcome for your client and for your development effort it is critical to consider first the Risk Tolerance of your client, and then negotiate the one dimension you typically have control over after the client informs you of the two (two from Time, Scope and Cost). In some cases you must walk away and this article should help you determine when that is the case.</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">For a much more detailed discussion of these topics and what this author considers critical:</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-left:0.5in;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">&#8220;Waltzing with Bears&#8221;, Dorset House Publishing Company, Incorporated (March, 2003), ISBN: 0932633609</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left"><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">Supplemental Material: Wicked Problems</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left"><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">A wicked problem is one for which each attempt to create a solution changes the understanding of the problem. Wicked problems cannot be solved in a traditional linear fashion, because the problem definition evolves as new possible solutions are considered and/or implemented. The term was originally coined by Horst Rittel.</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">Wicked problems always occur in a social context &#8212; the wickedness of the problem reflects the diversity among the stakeholders in the problem.</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">Most projects in organizations &#8212; and virtually all technology-related projects these days &#8212; are about wicked problems. Indeed, it is the social complexity of these problems, not their technical complexity, that overwhelms most current problem solving and project management approaches. (See graphic of wicked problem solving process below.)</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">Some specific aspects of problem wickedness include:</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-left:0.5in;border-left:windowtext 1pt solid;text-indent:-0.25in;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">1. You don&#8217;t understand the problem until you have developed a solution. Indeed, there is no definitive statement of &#8220;The Problem.&#8221; The problem is ill-structured, an evolving set of interlocking issues and constraints.</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-left:0.5in;border-left:windowtext 1pt solid;text-indent:-0.25in;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">2. Wicked problems have no stopping rule. Since there is no definitive &#8220;The Problem&#8221;, there is also no definitive &#8220;The Solution.&#8221; The problem solving process ends when you run out of resources.</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-left:0.5in;border-left:windowtext 1pt solid;text-indent:-0.25in;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">3. Solutions to wicked problems are not right or wrong, simply &#8220;better,&#8221; &#8220;worse,&#8221; &#8220;good enough,&#8221; or &#8220;not good enough.&#8221;</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-left:0.5in;border-left:windowtext 1pt solid;text-indent:-0.25in;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">4. Every wicked problem is essentially unique and novel. There are so many factors and conditions, all embedded in a dynamic social context, that no two wicked problems are alike, and the solutions to them will always be custom designed and fitted.</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-left:0.5in;border-left:windowtext 1pt solid;text-indent:-0.25in;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">5. Every solution to a wicked problem is a &#8220;one-shot operation,&#8221; every attempt has consequences. As Rittel says, &#8220;One cannot build a freeway to see how it works.&#8221; This is the &#8220;Catch 22&#8243; about wicked problems: you can&#8217;t learn about the problem without trying solutions, but every solution you try is expensive and has lasting unintended consequences which are likely to spawn new wicked problems.</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-left:0.5in;border-left:windowtext 1pt solid;text-indent:-0.25in;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">6. Wicked problems have no given alternative solutions. There may be no solutions, or there may be a host of potential solutions that are devised, and another host that are never even thought of.</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">(from Rittel and Webber, 1973)</P></p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/dcarr.wordpress.com/91/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/dcarr.wordpress.com/91/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dcarr.wordpress.com/91/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dcarr.wordpress.com/91/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dcarr.wordpress.com/91/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dcarr.wordpress.com/91/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dcarr.wordpress.com/91/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dcarr.wordpress.com/91/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dcarr.wordpress.com/91/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dcarr.wordpress.com/91/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dcarr.wordpress.com/91/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dcarr.wordpress.com/91/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=91&subd=dcarr&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://team.pushbomb.com/2008/05/08/the-collision-of-software-project-management-and-agile/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7b572cbcda5a17fe984e7dd1ddc9c3d6?s=96&#38;d=&#38;r=PG" medium="image">
			<media:title type="html">pushbomb</media:title>
		</media:content>

		<media:content url="http://dcarr.files.wordpress.com/2008/04/chart.png?w=256" medium="image" />
	</item>
		<item>
		<title>Software as a Service and Service Oriented Architecture &#8211; Why they fail to meet the hype in execution</title>
		<link>http://team.pushbomb.com/2007/10/01/software-as-a-service-its-all-about-the-words/</link>
		<comments>http://team.pushbomb.com/2007/10/01/software-as-a-service-its-all-about-the-words/#comments</comments>
		<pubDate>Mon, 01 Oct 2007 02:30:00 +0000</pubDate>
		<dc:creator>Damon Wilder Carr</dc:creator>
				<category><![CDATA[C# 3.0 for Internal DSL]]></category>
		<category><![CDATA[Framework Design]]></category>
		<category><![CDATA[Proof Driven Development]]></category>
		<category><![CDATA[Software Design]]></category>
		<category><![CDATA[Software Factories]]></category>
		<category><![CDATA[Software Futures]]></category>
		<category><![CDATA[agile practices]]></category>
		<category><![CDATA[.NET Web Services]]></category>
		<category><![CDATA[Communication Foundation]]></category>
		<category><![CDATA[Domain Model]]></category>
		<category><![CDATA[Entity Model]]></category>
		<category><![CDATA[Evolution of Software]]></category>
		<category><![CDATA[Philosophy]]></category>
		<category><![CDATA[SaaS]]></category>
		<category><![CDATA[Semantics]]></category>
		<category><![CDATA[Service Oriented Architecture]]></category>
		<category><![CDATA[SOA]]></category>
		<category><![CDATA[Softwre as a Service]]></category>
		<category><![CDATA[WCF]]></category>

		<guid isPermaLink="false">http://dcarr.wordpress.com/2007/10/01/software-as-a-service-its-all-about-the-words/</guid>
		<description><![CDATA[The hype factor has done it again. We are all left starting at each other for just what in the world we all mean by SOA. ENOUGH! It's not that hard, and consultants, (myself being one so I will not be overly critical), vendors, the media, etc. have DESTROYED yet again any meaning in language. N-Tier, Message Bus, etc. etc. it goes back 20 years! The pattern never ends..<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=90&subd=dcarr&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>The hype factor has done it again. We are all left starting at each other for just what in the world we all mean by SOA. ENOUGH! It&#8217;s not that hard, and consultants, (myself being one so I will not be overly critical), vendors, the media, etc. have DESTROYED yet again any meaning in language. N-Tier, Message Bus, etc. etc. it goes back 20 years! The pattern never ends..</p>
<p>Not to be a terrible bore, but brush up on your <a href="http://en.wikipedia.org/wiki/Ludwig_Wittgenstein">Wittgenstein</a> lately?! Ok don&#8217;t go that far just yet&#8230;(grin).</p>
<p> First, a <a href="http://en.wikipedia.org/wiki/Pattern_language">Pattern Language</a> (P.L.) is not some academic concept, although many would like you to believe that.</p>
<p> </p>
<div>
<table border="0" cellspacing="0" cellpadding="2" width="262" align="right">
<tbody>
<tr>
<td width="77" align="right" valign="top"><a title="pdf-icon" href="http://www.flickr.com/photos/93223205@N00/1468114276/"><img src="http://static.flickr.com/1150/1468114276_f1d15541e6.jpg" border="0" alt="pdf-icon" width="31" height="31" /></a></td>
<td width="183" align="right" valign="top"><a href="http://www.agilefactor.com/SaasPatternLanguage.pdf">&#8216;Software as a Service &#8211; The Pattern Language Approach&#8217;</a></td>
</tr>
<tr>
<td width="77" align="right" valign="top"><a title="ie-icon" href="http://www.flickr.com/photos/93223205@N00/1468122752/"><img src="http://static.flickr.com/1196/1468122752_7267762646.jpg" border="0" alt="ie-icon" width="31" height="32" /></a></td>
<td width="183" align="right" valign="top"><a href="http://www.agilefactor.com/SaasPatternLanguage_files/fullscreen.htm#slide0001.htm">&#8216;Software as a Service &#8211; The Pattern Language Approach&#8217;</a></td>
</tr>
<tr>
<td width="77" align="right" valign="top"><a title="icon-set2-firefox" href="http://www.flickr.com/photos/93223205@N00/1468130216/"><img src="http://static.flickr.com/1259/1468130216_a701773dab.jpg" border="0" alt="icon-set2-firefox" width="31" height="31" /></a></td>
<td width="183" align="right" valign="top"><a href="http://www.agilefactor.com/SaasPatternLanguage.htm">&#8216;Software as a Service &#8211; The Pattern Language Approach&#8217;</a></td>
</tr>
</tbody>
</table>
</div>
<p><a title="SaaS" href="http://www.flickr.com/photos/93223205@N00/1465323619/"></a></p>
<p>NOTE: I take issue with the word design below&#8230; It should be far more broad in most cases, but it often gets boxed into the design aspect of a problem. I would say &#8216;best practices&#8217; which brings up its own semantic mess&#8230;</p>
<blockquote>
<p style="text-align:left;">A pattern language is a structured method of describing [best] good design practices within a field of expertise. It is characterized by</p>
<ol>
<li>Noticing and naming the common problems [and positively executed solutions proven over time] in a field of interest [domain in my words]</li>
<li>Describing the key characteristics of effective solutions for meeting [one or more] some stated goal[s], [Often patterns are combined and are multi-faceted]</li>
<li>Helping the designer [domain stakeholder] move from problem to problem [and challenge to challenge] in a logical way, [in an attempt to reduce and even eliminate ambiguity] and allowing for many different paths through the design process.</li>
</ol>
<p>- Wikipedia </p></blockquote>
<ol>
<li>This ties in perfectly with my claim that complex software engineering is a &#8216;wicked problem&#8217;. If you disagree then you can stop reading, as none of my assumptions will work. However, I would love to hear your arguments since only around 20-30% of all software projects &#8217;succeed&#8217;&#8230;. There is no doubt there is dreadful crisis which I know you know about so enough said.</li>
</ol>
<p>If the fundamental issue here is NOT that people cannot/will not see software engineering for what it is, then what?!</p>
<p><a href="http://en.wikipedia.org/wiki/Wicked_problems">Wicked Problem</a></p>
<p>FYI: This is also why your pretty much nuts to not be Agile at this point, with some critical exceptions.</p>
<p>OK just to get you started chew on these 10 basic characteristics and tell me how any of them and the failure of senior stakeholders to understand that indeed software fits these characteristics is likely a key systemic disaster which we see and live every day in this industry.<a href="http://damon.agilefactor.com/software-is-a-wicked-problem-2/"> Click here for more.</a></p>
<p> Before I was able to &#8216;take this deck on the road&#8217; which I have done now with success (and why I am revisiting this post to offer insights), I had to get the audience (I hate to call them that&#8230; The collaborators is better) knowing (for example) that SOA was not a damn bunch of web services! I had to get people understanding exactly how distributed objects and components ARE NOT THE SAME but are similar. etc. etc.</p>
<p>That ASMX pages in .NET are not even close to what you want to be doing, even with WSE 3.0 and &#8216;Contract First&#8217; techniques (most notably the WSCF add-in from the always amazing <a href="http://www.thinktecture.com/">thinktecture</a>).</p>
<blockquote><p>There is nothing more necessary than truth, and in comparison with it everything else has only secondary value.<br />
This absolute will to truth: what is it? Is it the will to not allow ourselves to be deceived? Is it the will not to deceive?<br />
One does not want to be deceived, under the supposition that it is injurious, dangerous, or fatal to be deceived.</p>
<p>Friedrich Nietzsche, 1890</p></blockquote>
<p>Thanks Herr Nietzsche&#8230; None of us want that. So &#8220;Listen for the speakers intended meaning, not your perceived definition&#8221;.</p>
<p>In this rather philosophical vein, I offer you here an attempt at the beginnings of a unified P.L. covering many best practices we have evolved in the SOA/SaaS space.</p>
<p>As stated, this presentation is born from necessity as it has become almost impossible to have a meaningful conversation on many topics in this domain due to &#8216;definition overloading&#8217;.</p>
<p>This presentation not only attacks that issue, it also brings together into a cohesive pattern language Object Orientation, Distributed Objects, Components and Services while being careful to not make overly broad generalizations that would harm any SaaS initiative.</p>
<p>For example, it is a best practice to evolve a Domain Driven API which is (at a minimum) the core APU which your services will use to fulfil their contracts.</p>
<p>The presentation is here and feedback is encouraged. This also assumes you have embraced either the SCA environment (for Java development) or WCF for .NET. These are (in our guidance to clients) the only relevant implementation frameworks for strategic large scale organizational transformations to SaaS.</p>
<p>Otherwise in real-world terms there are not resources (developers, or the dramatically increased effort with very little benefit) available to support other approaches. Many &#8216;purists to the extreme&#8217; might attempt a hand-crafted &#8216;build it all over again&#8217; approach with hand-crafted contracts (typically XSDs).</p>
<p>As these environments support full extensibility, indeed it is incredibly rare that one of these environments will not completely address your needs. Of course there are always exceptions, but this is addresses to 95% of the market.</p>
<p>Due to the immaturity of this space, it is alarming how many companies believe they are not part of that 95%!! Typically they are being driven by parties (internal or external) that have motivations not in line with the business drivers.</p>
<p> </p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/dcarr.wordpress.com/90/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/dcarr.wordpress.com/90/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dcarr.wordpress.com/90/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dcarr.wordpress.com/90/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dcarr.wordpress.com/90/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dcarr.wordpress.com/90/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dcarr.wordpress.com/90/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dcarr.wordpress.com/90/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dcarr.wordpress.com/90/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dcarr.wordpress.com/90/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dcarr.wordpress.com/90/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dcarr.wordpress.com/90/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=90&subd=dcarr&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://team.pushbomb.com/2007/10/01/software-as-a-service-its-all-about-the-words/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7b572cbcda5a17fe984e7dd1ddc9c3d6?s=96&#38;d=&#38;r=PG" medium="image">
			<media:title type="html">pushbomb</media:title>
		</media:content>

		<media:content url="http://static.flickr.com/1150/1468114276_f1d15541e6.jpg" medium="image">
			<media:title type="html">pdf-icon</media:title>
		</media:content>

		<media:content url="http://static.flickr.com/1196/1468122752_7267762646.jpg" medium="image">
			<media:title type="html">ie-icon</media:title>
		</media:content>

		<media:content url="http://static.flickr.com/1259/1468130216_a701773dab.jpg" medium="image">
			<media:title type="html">icon-set2-firefox</media:title>
		</media:content>
	</item>
		<item>
		<title>newsflash: SOA in .NET means WCF</title>
		<link>http://team.pushbomb.com/2004/08/25/sp1-for-wse-20/</link>
		<comments>http://team.pushbomb.com/2004/08/25/sp1-for-wse-20/#comments</comments>
		<pubDate>Wed, 25 Aug 2004 00:43:00 +0000</pubDate>
		<dc:creator>Damon Wilder Carr</dc:creator>
				<category><![CDATA[agile practices]]></category>
		<category><![CDATA[Domain.Driven.NET]]></category>
		<category><![CDATA[dsl]]></category>
		<category><![CDATA[nhibernate]]></category>

		<guid isPermaLink="false">http://dcarr.wordpress.com/2004/08/25/sp1-for-wse-20/</guid>
		<description><![CDATA[NOTE: This is now insanely outdated and all topics in this vein should of course move to &#8216;Windows Communication Foundation&#8217;.
Here is a great launch point to get your hands dirty from the master


Web Services Enhancements (WSE) 2.0 SP1 for Microsoft .NETWeb Services Enhancements 2.0 SP1 for Microsoft® .NET (WSE) is a supported add-on to Microsoft [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=16&subd=dcarr&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<h3>NOTE: This is now insanely outdated and all topics in this vein should of course move to &#8216;Windows Communication Foundation&#8217;.</h3>
<h3>Here is a great launch point to get <a href="http://www.idesign.net/idesign/DesktopDefault.aspx?tabindex=5&amp;tabid=11#WCFEssentials">your hands dirty from the master</a></h3>
<blockquote>
<p style="text-align:justify;"><a href="http://www.microsoft.com/downloads/details.aspx?familyid=fc5f06c5-821f-41d3-a4fe-6c7b56423841&amp;displaylang=en"></a></p>
<p style="text-align:justify;"><strong><span style="text-decoration:line-through;">Web Services Enhancements (WSE) 2.0 SP1 for Microsoft .NET</span></strong><strong></strong><span style="text-decoration:line-through;">Web Services Enhancements 2.0 SP1 for Microsoft® .NET (WSE) is a supported add-on to Microsoft Visual Studio® .NET and the Microsoft .NET Framework that enables developers to build secure Web services based on the latest Web services protocol specifications</span>.</p>
<p style="text-align:left;"> </p>
<p> </p></blockquote>
<p><strong></strong></p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/dcarr.wordpress.com/16/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/dcarr.wordpress.com/16/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dcarr.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dcarr.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dcarr.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dcarr.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dcarr.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dcarr.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dcarr.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dcarr.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dcarr.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dcarr.wordpress.com/16/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=16&subd=dcarr&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://team.pushbomb.com/2004/08/25/sp1-for-wse-20/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7b572cbcda5a17fe984e7dd1ddc9c3d6?s=96&#38;d=&#38;r=PG" medium="image">
			<media:title type="html">pushbomb</media:title>
		</media:content>
	</item>
	</channel>
</rss>