<?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>Michael Groner&#039;s Blog</title>
	<atom:link href="http://tech.michaelgroner.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://tech.michaelgroner.com</link>
	<description></description>
	<lastBuildDate>Thu, 31 Dec 2009 01:23:04 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='tech.michaelgroner.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Michael Groner&#039;s Blog</title>
		<link>http://tech.michaelgroner.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://tech.michaelgroner.com/osd.xml" title="Michael Groner&#039;s Blog" />
	<atom:link rel='hub' href='http://tech.michaelgroner.com/?pushpress=hub'/>
		<item>
		<title>Developer&#8217;s Guide to Cloud Computing</title>
		<link>http://tech.michaelgroner.com/2009/12/30/developers-guide-to-cloud-computing/</link>
		<comments>http://tech.michaelgroner.com/2009/12/30/developers-guide-to-cloud-computing/#comments</comments>
		<pubDate>Thu, 31 Dec 2009 00:21:35 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[Cloud Computing]]></category>
		<category><![CDATA[Software Architecture]]></category>

		<guid isPermaLink="false">http://tech.michaelgroner.com/?p=689</guid>
		<description><![CDATA[&#8220;So where do I as a developer go to learn more about cloud computing and the ecosystem of tools available to me?&#8221; This is the question that kicked off this series of blogs. I was on a panel at CloudCamp &#8230; <a href="http://tech.michaelgroner.com/2009/12/30/developers-guide-to-cloud-computing/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tech.michaelgroner.com&amp;blog=8479778&amp;post=689&amp;subd=msgroner&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>&#8220;So where do I as a developer go to learn more about cloud computing and the ecosystem of tools available to me?&#8221;</p>
<p>This is the question that kicked off this series of blogs. I was on a panel at <a href="http://cloudcamp.com/stlouis" target="_blank">CloudCamp St. Louis</a> fielding various questions about converting applications to cloud architectures. Having helped many <a href="http://appistry.com/" target="_blank">Appistry</a> customers build cloud oriented solutions, I was happy to help the group get acquainted at these concepts. Unfortunately, I didn’t have a good answer for this person. With as much writing and talking as there is about cloud computing, I don&#8217;t know of any single one-stop resource to learn about the concepts and tools from a developers perspective. I&#8217;m going to try to fill that gap.</p>
<p><span id="more-689"></span>My goal is simple. I want to advance the concepts of cloud computing so that we can all take advantage of this new technology. I firmly believe that building applications to cloud principles is necessary and will become inevitable for a large category of applications. I&#8217;m going to accomplish this goal in three parts:</p>
<p><strong>First,</strong><span style="font-weight:800;"> </span>I&#8217;m going to introduce the what&#8217;s and why&#8217;s of cloud computing for the developer coming to speed on the topic.</p>
<p><strong>Second, </strong>I&#8217;m going to review cloud architectures to illustrate the important application and infrastructure principles to achieve the goals listed in part one.</p>
<p><strong>Third,</strong> I&#8217;m going to provide a catalog of tools and services available in the cloud computing ecosystem. There are more and more success stories of using cloud computing. I hope to include of these stories in this list.</p>
<p>There&#8217;s the introduction. Please make yourself heard and let me know what you think of the series. I look forward to your feedback.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/msgroner.wordpress.com/689/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/msgroner.wordpress.com/689/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/msgroner.wordpress.com/689/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/msgroner.wordpress.com/689/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/msgroner.wordpress.com/689/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/msgroner.wordpress.com/689/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/msgroner.wordpress.com/689/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/msgroner.wordpress.com/689/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/msgroner.wordpress.com/689/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/msgroner.wordpress.com/689/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/msgroner.wordpress.com/689/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/msgroner.wordpress.com/689/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/msgroner.wordpress.com/689/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/msgroner.wordpress.com/689/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tech.michaelgroner.com&amp;blog=8479778&amp;post=689&amp;subd=msgroner&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://tech.michaelgroner.com/2009/12/30/developers-guide-to-cloud-computing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d71bc98372c45a4b38c8ce3027d9659c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Michael</media:title>
		</media:content>
	</item>
		<item>
		<title>MapReduce talk from Lambda Lounge Presentation</title>
		<link>http://tech.michaelgroner.com/2009/11/18/mapreduce-talk-from-september-lambda-lounge/</link>
		<comments>http://tech.michaelgroner.com/2009/11/18/mapreduce-talk-from-september-lambda-lounge/#comments</comments>
		<pubDate>Wed, 18 Nov 2009 21:25:46 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[Cloud Computing]]></category>
		<category><![CDATA[Software Architecture]]></category>

		<guid isPermaLink="false">http://tech.michaelgroner.com/?p=659</guid>
		<description><![CDATA[In September I presented on the foundations of MapReduce and MapReduce applications at the St. Louis Lambda Lounge. It always surprises me how simple the MapReduce algorithm is and how few people really understand it. After the talk I had &#8230; <a href="http://tech.michaelgroner.com/2009/11/18/mapreduce-talk-from-september-lambda-lounge/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tech.michaelgroner.com&amp;blog=8479778&amp;post=659&amp;subd=msgroner&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>In September I presented on the foundations of MapReduce and MapReduce applications at the <a href="http://lambdalounge.org/" target="_blank">St. Louis Lambda Lounge</a>.</p>
<p>It always surprises me how simple the MapReduce algorithm is and how few people really understand it. After the talk I had multiple people approach me and say &#8220;I have had elements of MapReduce on my applications for a long time and didn&#8217;t know it.&#8221;</p>
<p><span id="more-659"></span></p>
<p>Here are my slides from the talk.</p>
<object type='application/x-shockwave-flash' wmode='opaque' data='http://static.slideshare.net/swf/ssplayer2.swf?id=2434618&doc=20090811mapreduce-091105201652-phpapp01' width='500' height='410'><param name='movie' value='http://static.slideshare.net/swf/ssplayer2.swf?id=2434618&doc=20090811mapreduce-091105201652-phpapp01' /><param name='allowFullScreen' value='true' /></object>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/msgroner.wordpress.com/659/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/msgroner.wordpress.com/659/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/msgroner.wordpress.com/659/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/msgroner.wordpress.com/659/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/msgroner.wordpress.com/659/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/msgroner.wordpress.com/659/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/msgroner.wordpress.com/659/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/msgroner.wordpress.com/659/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/msgroner.wordpress.com/659/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/msgroner.wordpress.com/659/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/msgroner.wordpress.com/659/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/msgroner.wordpress.com/659/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/msgroner.wordpress.com/659/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/msgroner.wordpress.com/659/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tech.michaelgroner.com&amp;blog=8479778&amp;post=659&amp;subd=msgroner&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://tech.michaelgroner.com/2009/11/18/mapreduce-talk-from-september-lambda-lounge/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d71bc98372c45a4b38c8ce3027d9659c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Michael</media:title>
		</media:content>
	</item>
		<item>
		<title>VMWare + SpringSource: VMWare moves up the cloud stack</title>
		<link>http://tech.michaelgroner.com/2009/08/12/vmware-springsource-vmware-moves-up-the-cloud-stack/</link>
		<comments>http://tech.michaelgroner.com/2009/08/12/vmware-springsource-vmware-moves-up-the-cloud-stack/#comments</comments>
		<pubDate>Wed, 12 Aug 2009 18:59:17 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[Cloud Computing]]></category>

		<guid isPermaLink="false">http://msgroner.wordpress.com/?p=600</guid>
		<description><![CDATA[The VMWare/SpringSource acquisition announcement took me by surprise. My first question was what is VMWare getting themselves into? I have always thought of VMWare as the &#8220;Switzerland&#8221; of infrastructure tools. Whether you are Windows or Linux, C++ or Java, packaged &#8230; <a href="http://tech.michaelgroner.com/2009/08/12/vmware-springsource-vmware-moves-up-the-cloud-stack/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tech.michaelgroner.com&amp;blog=8479778&amp;post=600&amp;subd=msgroner&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>The VMWare/SpringSource acquisition announcement took me by surprise. My first question was what is VMWare getting themselves into? I have always thought of VMWare as the &#8220;Switzerland&#8221; of infrastructure tools. Whether you are Windows or Linux, C++ or Java, packaged software or open source VMWare can help you build, test, and deploy your environment. Why are they giving up their independent status by picking a Java framework like Spring?</p>
<p><span id="more-600"></span></p>
<p>Then I recalled the SpringSource&#8217;s acquisition of <a href="http://www.hyperic.com/" target="_blank">Hyperic</a> earlier this year. Hyperic is the open source monitoring tool that watches over many different application servers, databases, and other computing utilities. Clearly, the Hyperic products are of great benefit to VMWare. VMWare suffers as their tools do not have any vision into what individual virtual machines are doing at a given moment. Their systems can tell when a single VM is running hot and attempt to move it to a different computer, but this might not help if the problem is two processes suddenly running hot on the same VM.  Hyperic is full of application level performance data to help with this situation.</p>
<p>It isn&#8217;t necessarily the Spring framework itself that VMWare is interested in. It is the combination of the Hyperic platform layer with the VMWare infrastructure tools. The union of the two systems will allow VMWare to greatly improve system utilization by moving entire virtual machines or just individual processes around a cloud computing system with percision. This is VMWare moving into the Platform as a Service (PaaS) space of cloud computing.</p>
<p>But this still leaves the question of Java. Clearly attaching to Java will attack Microsoft with their .NET and virtualization efforts. However, why should VMWare pick only one language? One line from the <a href="http://blogs.vmware.com/console/2009/08/vmware-acquires-springsource.html" target="_blank">VMWare blog</a> clarifies this apparent limitation:</p>
<blockquote><p>We have early efforts underway around .Net, PhP, Ruby, and J2EE, and will continue to focus on expanding these as well as newcomers in the rapidly evolving development world.</p></blockquote>
<p>VMWare is trying to work will all technologies. They will maintain their &#8220;Switzerland&#8221; status. It will be interesting to see what acquisitions, partnerships, and announcements VMWare will come out with next. I expect there will be more to come shortly.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/msgroner.wordpress.com/600/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/msgroner.wordpress.com/600/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/msgroner.wordpress.com/600/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/msgroner.wordpress.com/600/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/msgroner.wordpress.com/600/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/msgroner.wordpress.com/600/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/msgroner.wordpress.com/600/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/msgroner.wordpress.com/600/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/msgroner.wordpress.com/600/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/msgroner.wordpress.com/600/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/msgroner.wordpress.com/600/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/msgroner.wordpress.com/600/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/msgroner.wordpress.com/600/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/msgroner.wordpress.com/600/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tech.michaelgroner.com&amp;blog=8479778&amp;post=600&amp;subd=msgroner&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://tech.michaelgroner.com/2009/08/12/vmware-springsource-vmware-moves-up-the-cloud-stack/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d71bc98372c45a4b38c8ce3027d9659c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Michael</media:title>
		</media:content>
	</item>
		<item>
		<title>Which principle was it? Open-closed or dependency inversion?</title>
		<link>http://tech.michaelgroner.com/2009/01/29/openclose-principle-and-dependency-inversion-principle-ndash-two-sides-same-coin/</link>
		<comments>http://tech.michaelgroner.com/2009/01/29/openclose-principle-and-dependency-inversion-principle-ndash-two-sides-same-coin/#comments</comments>
		<pubDate>Thu, 29 Jan 2009 16:43:18 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[Software Architecture]]></category>

		<guid isPermaLink="false">http://msgroner.wordpress.com/2009/01/29/openclose-principle-and-dependency-inversion-principle-ndash-two-sides-same-coin/</guid>
		<description><![CDATA[<p>In my <a href="http://www.appistry.com/blogs/michael/how-tdd-clarified-openclosed-principle-me-2">last blog entry</a> I discussed how Test Driven Development (TDD) lead me to a greater understanding of the Open-Closed Principle (OCP). The general feedback from the post was very positive. However, several readers asked a question that I would like to answer. They pointed out that although I was discussing OCP, my example really displayed the Dependency Inversion Principle (DIP). Was my blog post misleading?</p>  <p>Just to recap, here is the example I used in the previous post:</p> <a href="http://tech.michaelgroner.com/2009/01/29/openclose-principle-and-dependency-inversion-principle-ndash-two-sides-same-coin/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tech.michaelgroner.com&amp;blog=8479778&amp;post=495&amp;subd=msgroner&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>In my <a href="http://tech.michaelgroner.com/2009/01/22/how-tdd-clarified-openclosed-principle-me-2/" target="_blank">last blog entry</a> I discussed how Test Driven Development (TDD) lead me to a greater understanding of the Open-Closed Principle (OCP). The general feedback from the post was very positive. However, several readers asked a question that I would like to answer. They pointed out that although I was discussing OCP, my example really displayed the Dependency Inversion Principle (DIP). Was my blog post misleading?</p>
<p><span id="more-495"></span>Just to recap, here is the example I used in the previous post:</p>
<pre class="brush: python;">
testDefault(self):
  member = Member(&quot;test member&quot;)
  membership_list = MembershipList()
  membership_list.add_member(member)
  command = GetMembershipListCommand(membership_list)
  result = command.execute()
  self.assertEqual([&quot;test member&quot;], result)
</pre>
<p>This is a simple test for my “GetMembershipCommand” function. When I realized that I didn’t like the coupling created between my test function and the other production classes in my project, I altered the test to this:</p>
<pre class="brush: python;">
test Default(self):
  command = GetMembershipListCommand(DummyList())
  result = command.execute()
  self.assertEqual([&quot;test member&quot;], result)
</pre>
<p>The <a href="http://en.wikipedia.org/wiki/Dependency_inversion_principle">dependency inversion principle</a> states:</p>
<blockquote><p><span style="color:#333333;">High level modules should not depend upon low level modules. Both should depend upon abstractions.</span></p></blockquote>
<p>In my example, I clearly used the dependency inversion principle. My GetMembershipListCommand no longer depends on the lower level Member and MembershipList classes &#8211; it only depends on the interface. But does that mean I missed the point of OCP? I don’t think so.</p>
<p>OCP is about the flexibility of your classes, not a specific implementation pattern. Can you construct a class for which the implementation can stay constant, even though you can extend the behavior? What might these techniques be?</p>
<ul>
<li>Most examples I have seen focus on sub-classing the parent class and overriding methods</li>
<li>I claim that OCP is achieved in my example above by injecting classes with behaviors to the parent class</li>
<li>I have also built classes to which behaviors and extensions are passed directly as functions or command classes</li>
</ul>
<p>No matter which of these techniques I use, I know one thing to be true: although the base class’ implementation has not changed, its behavior has been extended through these techniques.</p>
<p>In a recent <a href="http://www.hanselminutes.com/default.aspx?showID=163">podcast</a> with Scott Hanselman, Robert Martin reviewed the SOLID principles. One point that Martin made is that the dependency inversion principle (DIP) is basically a restatement of OCP with &#8220;a 90 degree rotation&#8221;.  OCP states the goal of not having to modify a class to extend behavior. DIP provides an implementation guideline that we should depend on abstract classes as much as possible.</p>
<p>I clearly used dependency injection to modify the behavior of the classes being tested. TDD showed me where I wasn&#8217;t using techniques like dependency injection to easily and thoroughly test my objects. My effort resulted in classes that satisfy the open-closed principle.  It was very satisfying to see multiple principles converge on the single goal of clean code.</p>
<p>So what do you think? Is my definition of the open-closed principle on the mark or too liberal?</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/msgroner.wordpress.com/495/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/msgroner.wordpress.com/495/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/msgroner.wordpress.com/495/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/msgroner.wordpress.com/495/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/msgroner.wordpress.com/495/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/msgroner.wordpress.com/495/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/msgroner.wordpress.com/495/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/msgroner.wordpress.com/495/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/msgroner.wordpress.com/495/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/msgroner.wordpress.com/495/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/msgroner.wordpress.com/495/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/msgroner.wordpress.com/495/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/msgroner.wordpress.com/495/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/msgroner.wordpress.com/495/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tech.michaelgroner.com&amp;blog=8479778&amp;post=495&amp;subd=msgroner&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://tech.michaelgroner.com/2009/01/29/openclose-principle-and-dependency-inversion-principle-ndash-two-sides-same-coin/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d71bc98372c45a4b38c8ce3027d9659c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Michael</media:title>
		</media:content>
	</item>
		<item>
		<title>How TDD clarified the Open/Closed Principle for me</title>
		<link>http://tech.michaelgroner.com/2009/01/22/how-tdd-clarified-openclosed-principle-me-2/</link>
		<comments>http://tech.michaelgroner.com/2009/01/22/how-tdd-clarified-openclosed-principle-me-2/#comments</comments>
		<pubDate>Thu, 22 Jan 2009 22:19:18 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[Agile Methodology]]></category>
		<category><![CDATA[Software Architecture]]></category>

		<guid isPermaLink="false">http://msgroner.wordpress.com/2009/01/22/how-tdd-clarified-openclosed-principle-me-2/</guid>
		<description><![CDATA[<p><a href="/blog/wp-content/migrated_uploads/michael/2009/01/OpenClosed.jpg"><img title="OpenClosed" style="display:inline;margin-left:0;margin-right:0;border-width:0;" height="244" alt="OpenClosed" src="/blog/wp-content/migrated_uploads/michael/2009/01/OpenClosed_thumb.jpg" width="184" align="right" border="0" /></a>The open/closed principle (OCP) (a software concept whose definition I could recite, but whose meaning I hadn’t internalized until recently) simply states:</p>  <blockquote>   <p>Software entities should be open for extension, but closed for modification.</p> <a href="http://tech.michaelgroner.com/2009/01/22/how-tdd-clarified-openclosed-principle-me-2/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tech.michaelgroner.com&amp;blog=8479778&amp;post=489&amp;subd=msgroner&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-510" title="OpenClosed" src="http://msgroner.files.wordpress.com/2009/01/openclosed1.jpg?w=180&#038;h=240" alt="OpenClosed" width="180" height="240" />The open/closed principle (OCP) (a software concept whose definition I could recite, but whose meaning I hadn’t internalized until recently) simply states:</p>
<blockquote><p>Software entities should be open for extension, but closed for modification.</p></blockquote>
<p>Correct application of the open/closed principle results in classes with high reusability, as the classes are built with extension in mind. OCP also provides consistency because established classes do not change after completion. Any developer will agree that reusability is a noble goal, but how do we know when we have achieved it?</p>
<p><span id="more-489"></span>I think OCP eluded me because of the illustrations I have seen in the past. Examples focused on depending on interfaces within a given class or function instead of a concrete class. When new behavior is needed, a separate class implemented to the same interface can be substituted to extend behavior. Factually, I knew this, but I was never certain that I applied OCP well. When I reviewed my older code I often felt that my classes were too tightly bound to single classes and had little reusability. The examples provided no metric to show when I was off course.</p>
<p>Fortunately for me two separate events came together that helped me understand what I had been missing. First, I listened to <a href="http://www.hanselminutes.com/default.aspx?showID=163">Scott Hanselman’s podcast with Robert Martin on SOLID principles</a>. Martin did a great job illustrating each of the SOLID principles, so they were fresh in my mind. Second, as I was working on my latest project, I became frustrated with a unit test that I was constructing.</p>
<p>The test itself took more effort to construct than it should have. The setup phase of the test was long and complex. The test was fragile, as it depended on other classes in my project. To keep my tests clean I realized that my class should be able to correctly function with no dependence on other classes within my project.</p>
<p>And that was it. That was the moment I fully understood the open/closed principle. A well designed class can be tested in isolation by injecting necessary behavior. The ability to inject behavior fulfills the “open” attribute of the open/close principle. Good unit testing practices led me to good class construction.</p>
<p>Let me go through a simple example test case to illustrate:</p>
<pre class="brush: python;">
testDefault(self):
  member = Member(&quot;test member&quot;)
  membership_list = MembershipList()
  membership_list.add_member(member)
  command = GetMembershipListCommand(membership_list)
  result = command.execute()
  self.assertEqual([&quot;test member&quot;], result)
</pre>
<p>This code tests my GetMembershipListCommand. (This is a simple example for illustration.) This class simply returns the contents of the membership list. Notice that I had to import two data structures outside my GetMembershipListCommand class to establish the test. The setup of  the test requires as many lines as the execution and validation sections of the test.</p>
<p>Knowing that I want my test cases to run isolated from the other classes, I constructed dummy/mock objects to provide behavior implementations to the class being tested. Converting to dummy/mock objects immediately showed me that my class was more coupled to lower-level classes than I had believed. I had to restructure my classes to meet the injected interface/behavior. Once completed, my base classes were much more cohesive and the overall set of classes become decoupled.</p>
<p>In the end, the update was simple. My new test case looks like this:</p>
<pre class="brush: python;">
test Default(self):
  command = GetMembershipListCommand(DummyList())
  result = command.execute()
  self.assertEqual([&quot;test member&quot;], result)
</pre>
<p>Instead of being dependent on the Member and MembershipList classes, my new implementation is only dependent on the interfaces I use. I am now able to remove any imports of classes outside my GetMembershipListCommand class and verify that my code is fully decoupled from other objects.</p>
<p>It doesn’t look that different, but it is much more flexible:</p>
<ul>
<li>It is now easy to create a more straightforward test case &#8211; I can build specific dummy objects to meet my needs.</li>
<li>My classes are fully decoupled from other classes within the project and much more reusable.</li>
<li>My unit tests were much easier to read.</li>
<li>Test failures are isolated. A bug in a dependent class will no longer create failures in higher level classes.</li>
</ul>
<p>So I finally got it. Application of the open/closed principle was achieved when I started injecting behaviors into my test cases. My higher-level classes no longer need to know about lower-level implementation details. The only thing they need to share is a common interface. It seems so simple now, but I hadn’t seen it before. TDD showed me the way. I now recognize that if my unit tests become complicated and contrived then OCP is probably being violated.</p>
<p>My code is cleaner, more easily supported and more modular all because of good application of SOLID principles that were achieved through good application of TDD.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/msgroner.wordpress.com/489/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/msgroner.wordpress.com/489/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/msgroner.wordpress.com/489/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/msgroner.wordpress.com/489/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/msgroner.wordpress.com/489/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/msgroner.wordpress.com/489/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/msgroner.wordpress.com/489/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/msgroner.wordpress.com/489/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/msgroner.wordpress.com/489/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/msgroner.wordpress.com/489/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/msgroner.wordpress.com/489/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/msgroner.wordpress.com/489/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/msgroner.wordpress.com/489/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/msgroner.wordpress.com/489/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tech.michaelgroner.com&amp;blog=8479778&amp;post=489&amp;subd=msgroner&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://tech.michaelgroner.com/2009/01/22/how-tdd-clarified-openclosed-principle-me-2/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d71bc98372c45a4b38c8ce3027d9659c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Michael</media:title>
		</media:content>

		<media:content url="http://msgroner.files.wordpress.com/2009/01/openclosed1.jpg" medium="image">
			<media:title type="html">OpenClosed</media:title>
		</media:content>
	</item>
		<item>
		<title>End of iteration demonstrations &#8211; The agile practice you probably aren&#8217;t practicing</title>
		<link>http://tech.michaelgroner.com/2008/07/03/end-iteration-demonstrations-the-agile-practice-you-probably-arent-doing-should/</link>
		<comments>http://tech.michaelgroner.com/2008/07/03/end-iteration-demonstrations-the-agile-practice-you-probably-arent-doing-should/#comments</comments>
		<pubDate>Thu, 03 Jul 2008 16:30:50 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[Agile Methodology]]></category>

		<guid isPermaLink="false">http://msgroner.wordpress.com/2008/07/03/end-iteration-demonstrations-the-agile-practice-you-probably-arent-doing-should/</guid>
		<description><![CDATA[<p>How often do you demonstrate your development builds to your customers during development of a release?&#160; Unfortunately if you are like most agile teams that I encounter the answer is not very often, if ever.&#160; If you are practicing agile software development you know about the importance of working in short increments.&#160; But do you really extract all the value you can from your iteration?&#160; Let me elaborate with a real life example I encountered recently.</p> <a href="http://tech.michaelgroner.com/2008/07/03/end-iteration-demonstrations-the-agile-practice-you-probably-arent-doing-should/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tech.michaelgroner.com&amp;blog=8479778&amp;post=429&amp;subd=msgroner&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>How often do you demonstrate your development builds to your customers during development of a release?  Unfortunately if you are like most agile teams that I encounter the answer is not very often, if ever.  If you are practicing agile software development you know about the importance of working in short increments.  But do you really extract all the value you can from your iteration?  Let me elaborate with a real life example I encountered recently.</p>
<p><span id="more-429"></span>About a month ago I traveled to a customer site to discuss EAF&#8217;s future direction.  After the meetings, we headed back to the airport for the return flight.  I had been up since 4:00 A.M. and I couldn&#8217;t wait to get home.  As I approached my gate, I learned that my plane had been delayed for maintenance issues.  As I had just made the travel plans several days earlier, I knew that another airline had flight back to my hometown and that I could probably get a seat on that flight.</p>
<p>This is where my frustration began and the inspiration for today&#8217;s post. When I asked the gate attendant if the other flight had a seat available, here is what ensued:</p>
<blockquote><p><em>Me:</em> &#8220;I am pretty sure that American Flight 5455 is traveling to St. Louis in an hour.  Can I get on that flight?&#8221;</p>
<p><em>Gate Attendant:</em> &#8220;Sure let me check my computer&#8230;&#8221; click click click click click click click click click&#8230;.</p>
<p><strong>Five minutes later</strong></p>
<p>&#8230;. click click click click click click click click click &#8230;.</p>
<p>&#8220;&#8230; hmmm&#8230;  I forgot the sequence code.  Oh yeah &#8216;next next list list&#8217;&#8221; (Don&#8217;t ask me what that meant.)</p>
<p>&#8230;.click click click click click click click click click &#8230;</p>
<p>&#8220;&#8230; Why yes Mr. Groner, I can get you on that flight&#8221;</p></blockquote>
<p>Not only was I tired and frustrated, you should have seen the impatient people behind me as they waited for my question to be answered. I kept thinking to myself&#8230; &#8220;This must be the most unfriendly user interface ever built.  Couldn&#8217;t they have done something to make this smoother for the gate attendants?&#8221;</p>
<h3>Every iteration should end with a demonstration to the customer</h3>
<p>I&#8217;m sure that the attendant&#8217;s reservation system was built years ago with non-agile methods, but just think what could have been built if a real gate attendant would have gotten a chance to see the system every two weeks as new functionality was added.  I&#8217;m sure early along the way an attendant would have said &#8220;You have got to be kidding me. I can&#8217;t be typing for minutes just to get someone&#8217;s flight switched.  You have to re-architect this interface.&#8221;</p>
<p>Admittedly, my gate attendant example is a bit contrived, but the take away is the same, regular and often demonstrations from developers to the user base is an essential agile practice.</p>
<p>Consider the benefits:</p>
<ul>
<li>Obviously, the immediate user feedback it essential to agile practices.  How else are you going to course correct your development efforts from iteration to iteration if the customer doesn&#8217;t have a good sense of the work product as it grows?</li>
<li>During iteration planning, developers know they have to focus on complete features as they are going to have to demonstrate them in a short time.</li>
<li>Customers have the pressure of clearly articulating their user stories.  It&#8217;s a very easy for developers to say &#8220;so really, in two weeks what are you expecting to see this application do?&#8221;</li>
<li>In my opinion, demonstrations combat scope creep and pressure the team to get done on time.  Knowing that you will have to get up in front of your customers at an established time in the future will keep your focus on the task at hand.</li>
<li>Demonstrations promote the <a href="http://msgroner.wordpress.com/2008/04/23/done-equals-done/" target="_blank">DONE=DONE</a> mind set.  At almost every end of iteration demonstration I go to I hear at least one user say &#8220;Can I have this build now? It is useful to me already&#8221;.  It&#8217;s hard to accomplish that with half completed stories.</li>
<li>Finally, the demonstrations greatly improve communication paths and confidence between the business and engineering side of the house.  See my post on <a href="http://msgroner.wordpress.com/2008/03/11/smaller-releases-help-management-well-developers/" target="_blank">regular, small releases</a> as I go into detail on this.</li>
</ul>
<p>It&#8217;s sad to me how many teams I encounter that consider themselves &#8220;agile&#8221; that don&#8217;t follow through on this practice.  I find it essential and addictive.  If you don&#8217;t do this in your organization try it, just once.  At the end of your next iteration plan establish a time for the demonstration with the customer.  Watch how it influences all members of the agile team.  You will be glad you did.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/msgroner.wordpress.com/429/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/msgroner.wordpress.com/429/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/msgroner.wordpress.com/429/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/msgroner.wordpress.com/429/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/msgroner.wordpress.com/429/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/msgroner.wordpress.com/429/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/msgroner.wordpress.com/429/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/msgroner.wordpress.com/429/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/msgroner.wordpress.com/429/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/msgroner.wordpress.com/429/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/msgroner.wordpress.com/429/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/msgroner.wordpress.com/429/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/msgroner.wordpress.com/429/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/msgroner.wordpress.com/429/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/msgroner.wordpress.com/429/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/msgroner.wordpress.com/429/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tech.michaelgroner.com&amp;blog=8479778&amp;post=429&amp;subd=msgroner&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://tech.michaelgroner.com/2008/07/03/end-iteration-demonstrations-the-agile-practice-you-probably-arent-doing-should/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d71bc98372c45a4b38c8ce3027d9659c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Michael</media:title>
		</media:content>
	</item>
		<item>
		<title>Microsoft says you need to change how you are building your applications</title>
		<link>http://tech.michaelgroner.com/2008/06/27/microsoft-says-you-need-change-how-your-are-building-your-applications/</link>
		<comments>http://tech.michaelgroner.com/2008/06/27/microsoft-says-you-need-change-how-your-are-building-your-applications/#comments</comments>
		<pubDate>Fri, 27 Jun 2008 19:40:24 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[Cloud Computing]]></category>
		<category><![CDATA[Conferences & Events]]></category>
		<category><![CDATA[Software Architecture]]></category>

		<guid isPermaLink="false">http://msgroner.wordpress.com/2008/06/27/microsoft-says-you-need-change-how-your-are-building-your-applications/</guid>
		<description><![CDATA[<p>Microsoft TechEd 2008 was held in Orlando, Florida the week of June 2nd.&#160; I was fortunate to attend many of the technical sessions.&#160; I was surprised how many speakers were conveying the same message:&#160; </p>  <blockquote>   <p>CPU speeds are topping out.&#160; If you want your applications to run faster and better you are going to have to build your applications in a new way.&#160; The solution isn't just to learn how to multi-thread your applications.&#160; The solution lies in building your applications into smaller units of code called tasks that can be moved around to the different cores of a multi-core machine.</p> </blockquote>  <p>Even in Bill Gates' keynote speech he said</p> <a href="http://tech.michaelgroner.com/2008/06/27/microsoft-says-you-need-change-how-your-are-building-your-applications/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tech.michaelgroner.com&amp;blog=8479778&amp;post=427&amp;subd=msgroner&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Microsoft TechEd 2008 was held in Orlando, Florida the week of June 2nd.  I was fortunate to attend many of the technical sessions.  I was surprised how many speakers were conveying the same message:</p>
<p><span id="more-427"></span></p>
<blockquote><p>CPU speeds are topping out.  If you want your applications to run faster and better you are going to have to build your applications in a new way.  The solution isn&#8217;t just to learn how to multi-thread your applications.  The solution lies in building your applications into smaller units of code called tasks that can be moved around to the different cores of a multi-core machine.</p></blockquote>
<p>Even in Bill Gates&#8217; keynote speech he said</p>
<blockquote><p>The&#8230; &#8220;need to take programs and break them down into parallel execution units now becomes absolutely necessary.&#8221;</p></blockquote>
<p>This statement was music to my ears.  Why?  It is the same model that we have been using for fabric computing since our beginnings in 2001.  Now we are starting to see this message more and more as cloud computing is gaining acceptance.  It&#8217;s interesting that Appistry and Microsoft were driven to the same place for different reasons.   As I said, Microsoft&#8217;s motivation is speed.  Developers have relied on faster and faster machines to accomplish more and more ambitious software projects.  Relying on faster machines to accomplish your goals is a thing of the past.  Only by decomposing problems and executing them in parallel will one gain application speed ups in the future.</p>
<p>When we at Appistry starting building EAF our motivation wasn&#8217;t just application speed,  but also scale and reliability.  We were determined to build a framework that you could depend upon.  We advocate building your applications into smaller execution units (which coincidentally we also call tasks) and adding declarative information about how these tasks aggregate into your application.  With this information the a framework is able to make a decision on the best configuration and execution of your application across machines.  Whether it is a single dual core machine fabric or 500+ cores distributed around a data center, the framework is able to manage your system because it is written out of loosely coupled, well defined tasks.</p>
<p><strong>A Challenge</strong></p>
<p>So, here is my challenge to you as a developer.  Think about your most recently developed application.  Think about the code you wrote for your business logic and the code you wrote to handle the sequencing, threading, scaling, and reliability. Now, can you identify those business logic components and consider running them each, as logical standalone tasks, in a distributed framework?</p>
<p>Once you can accomplish that goal, you are on your way to building the &#8220;right&#8221; code for the future.  Applications that can be run on one core or many cores.  Applications that can scale to many machines with just simple configuration changes.  It&#8217;s what we at Appistry have been advocating for some time, and now Microsoft is too.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/msgroner.wordpress.com/427/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/msgroner.wordpress.com/427/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/msgroner.wordpress.com/427/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/msgroner.wordpress.com/427/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/msgroner.wordpress.com/427/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/msgroner.wordpress.com/427/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/msgroner.wordpress.com/427/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/msgroner.wordpress.com/427/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/msgroner.wordpress.com/427/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/msgroner.wordpress.com/427/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/msgroner.wordpress.com/427/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/msgroner.wordpress.com/427/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/msgroner.wordpress.com/427/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/msgroner.wordpress.com/427/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/msgroner.wordpress.com/427/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/msgroner.wordpress.com/427/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tech.michaelgroner.com&amp;blog=8479778&amp;post=427&amp;subd=msgroner&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://tech.michaelgroner.com/2008/06/27/microsoft-says-you-need-change-how-your-are-building-your-applications/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d71bc98372c45a4b38c8ce3027d9659c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Michael</media:title>
		</media:content>
	</item>
		<item>
		<title>DONE equals DONE</title>
		<link>http://tech.michaelgroner.com/2008/04/23/done-equals-done/</link>
		<comments>http://tech.michaelgroner.com/2008/04/23/done-equals-done/#comments</comments>
		<pubDate>Wed, 23 Apr 2008 20:16:23 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[Agile Methodology]]></category>

		<guid isPermaLink="false">http://msgroner.wordpress.com/2008/04/23/done-equals-done/</guid>
		<description><![CDATA[<p>As I said in a <a href="http://www.appistry.com/blogs/michael/smaller-releases-help-management-well-developers">previous post</a>, I had the pleasure of attending a presentation by <a href="http://www.xprogramming.com/">Ron Jeffries</a> at the <a href="http://tech.groups.yahoo.com/group/xpstl/">St. Louis XP User's</a> group meeting back in January.&#160; Another portion of his talk that really hit me was on the subject of &#34;done equals done.&#34; </p>  <p>&#34;Done equals done&#34; is another way to reference the XP practice that an iteration should result in <b>releasable</b> bits. Of all the items Ron talked about, this is the one topic that I have always felt challenged by.</p> <a href="http://tech.michaelgroner.com/2008/04/23/done-equals-done/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tech.michaelgroner.com&amp;blog=8479778&amp;post=397&amp;subd=msgroner&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>As I said in a <a href="http://tech.michaelgroner.com/2008/03/11/smaller-releases-help-management-well-developers/" target="_blank">previous post</a>, I had the pleasure of attending a presentation by <a href="http://www.xprogramming.com/">Ron Jeffries</a> at the <a href="http://tech.groups.yahoo.com/group/xpstl/">St. Louis XP User&#8217;s</a> group meeting back in January.  Another portion of his talk that really hit me was on the subject of &#8220;done equals done.&#8221;<span id="more-397"></span></p>
<p>&#8220;Done equals done&#8221; is another way to reference the XP practice that an iteration should result in <strong>releasable</strong> bits. Of all the items Ron talked about, this is the one topic that I have always felt challenged by.</p>
<p>Here at Appistry we tackle very difficult problems. We often experiment. We often make interface changes at the end of an iteration to provide the best solution to the user. Typically this has resulted in documentation and QA lagging an iteration or so behind main development efforts. Our end of iteration build will pass build, unit, and integration tests but will usually not be run through our full QA suite. Ron says we have been doing this wrong.</p>
<p>Consider the impact of mandating &#8220;done equals done&#8221; within your development team:</p>
<ul>
<li>QA and documentation will never come to development in the course of an iteration to ask how something from last iteration worked.  This keeps the focus of the whole team on the current stories.</li>
<li>Development/QA will no longer have to guess that a 4 to 6 week QA cycle at the end of implementation will be enough and cross our fingers that we aren&#8217;t going to go long.</li>
<li>Management gets to decide when we are going to publicly release the build because there is always build ready to go.  (See my previous post on <a href="http://tech.michaelgroner.com/2008/03/11/smaller-releases-help-management-well-developers/" target="_blank">smaller releases help management</a>.)</li>
</ul>
<p>Developers will have to change our level of commitment during iteration planning. We aren&#8217;t just building our stories, we are making sure we are really, truly done. Clearly we won&#8217;t complete as many stories within a single iteration, but we are just fooling ourselves that we are saving time. We incur a time penalty with the context switch of completing docs and QA tests during subsequent iterations.</p>
<p>If there was one action item I set for myself after the meeting it was to incorporate this practice to our normal methodologies.  I strongly suggest that you consider applying &#8220;done equals done&#8221; to your practices as well.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/msgroner.wordpress.com/397/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/msgroner.wordpress.com/397/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/msgroner.wordpress.com/397/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/msgroner.wordpress.com/397/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/msgroner.wordpress.com/397/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/msgroner.wordpress.com/397/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/msgroner.wordpress.com/397/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/msgroner.wordpress.com/397/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/msgroner.wordpress.com/397/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/msgroner.wordpress.com/397/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/msgroner.wordpress.com/397/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/msgroner.wordpress.com/397/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/msgroner.wordpress.com/397/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/msgroner.wordpress.com/397/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/msgroner.wordpress.com/397/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/msgroner.wordpress.com/397/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tech.michaelgroner.com&amp;blog=8479778&amp;post=397&amp;subd=msgroner&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://tech.michaelgroner.com/2008/04/23/done-equals-done/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d71bc98372c45a4b38c8ce3027d9659c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Michael</media:title>
		</media:content>
	</item>
		<item>
		<title>Grids, Clouds, and Fabrics. Oh My!</title>
		<link>http://tech.michaelgroner.com/2008/04/16/grids-clouds-and-fabrics-oh-my/</link>
		<comments>http://tech.michaelgroner.com/2008/04/16/grids-clouds-and-fabrics-oh-my/#comments</comments>
		<pubDate>Wed, 16 Apr 2008 17:29:00 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[Cloud Computing]]></category>

		<guid isPermaLink="false">http://msgroner.wordpress.com/2008/04/16/grids-clouds-and-fabrics-oh-my/</guid>
		<description><![CDATA[<p>Lately when I talk to architects and administrators about the <a href="http://www.appistry.com/products/eaf/index.html">Appistry fabric</a>, I often hear the same question: &#34;Is your fabric the same thing as a grid or cloud?&#34;</p>  <p>The confusion is understandable.&#160; We software types can't construct a good naming convention without someone else trying to overload them.&#160; In this post I am going to provide my best definitions of the phrases cloud, grid, and fabric.&#160; Each are valuable tools, but with different meanings and usage patterns.</p>  <h3><strong>Cloud computing</strong> </h3>  <p>Cloud computing is the newest term on the block.&#160; We often hear of clouds available at Google, Amazon, or IBM, but what is it?</p> <a href="http://tech.michaelgroner.com/2008/04/16/grids-clouds-and-fabrics-oh-my/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tech.michaelgroner.com&amp;blog=8479778&amp;post=390&amp;subd=msgroner&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Lately when I talk to architects and administrators about the <a href="http://www.appistry.com/products/eaf/index.html">Appistry fabric</a>, I often hear the same question: &#8220;Is your fabric the same thing as a grid or cloud?&#8221;</p>
<p>The confusion is understandable.  We software types can&#8217;t construct a good naming convention without someone else trying to overload them.  In this post I am going to provide my best definitions of the phrases cloud, grid, and fabric.  Each are valuable tools, but with different meanings and usage patterns.</p>
<h3><strong><span id="more-390"></span>Cloud computing</strong></h3>
<p>Cloud computing is the newest term on the block.  We often hear of clouds available at Google, Amazon, or IBM, but what is it?</p>
<blockquote><p>A cloud is simply <em>a collection of computational and storage resources which can be dynamically allocated and made available for use on demand.</em></p></blockquote>
<p>That&#8217;s it.  There&#8217;s not much more to it.</p>
<p>Given the interest in virtualization efforts, it shouldn&#8217;t be surprising that organizations are assembling large numbers of machines to be dynamically allocated.  The cloud isn&#8217;t the software that is your application, but it could be your system&#8217;s computational foundation.</p>
<p>The most visible cloud out there is <a href="http://www.amazon.com/gp/browse.html?node=201590011">Amazon&#8217;s EC2</a>.  With an EC2 account, you can rent machine time to your needs.  This makes EC2 very interesting to organizations looking to reduce hardware and operations cost.</p>
<p>However, clouds have their drawbacks.  As the cloud resources are dynamic, your system configuration will need to be able to handle changing situations.  For example, in some cloud implementations the IP address you have today may not be the same as the IP address you get tomorrow.  Additional effort is needed to tie your overall system together and make sure that it stays together.</p>
<h3><strong>Grid computing</strong></h3>
<p>Grids have been around since the late 90&#8242;s.  The first time I encountered the term was in reference to the Globus toolkit.</p>
<blockquote><p>A grid is <em>collection of confederated machines providing directory services, security, auditing, and remote execution.</em></p></blockquote>
<p>In its early stages the purpose of the grid was to share access to large computers.  Universities might have a large system that sat idle some of the time but overtaxed at other times.  By joining the grid, a university could trade access to their machine when it was idle for access to another institution&#8217;s machine when they needed more than one.</p>
<p>One well known grid system is the <a href="http://setiathome.berkeley.edu/">SETI@home</a> project.  Most of us have seen machines running the SETI@home screen saver as the desktop computer searched radio telescope data for extraterrestrial intelligence.  Each of the desktop machines became a participant in the SETI@home grid.</p>
<p>In time, the concept of grid evolved past cross-institution boundaries and into the data center.  An organization might put together many machines into their own grid.  The grid infrastructure creates a directory of machines and available resources.  These systems provide an application developer with a tool to partition out segments of processing.  These jobs can get allocated, scheduled, and submitted to the grid for processing.</p>
<p>A challenge of traditional grid computing originates from its roots of tying together independent machines.  Elaborate work must be done to create islands of responsibility within the grid.  Some grid machines are responsible for creating the central registry of machines and resources while others are machines doing processing work.  Grid administrators have the responsibility of making the appropriate connection and keeping the individual grid components running.  A traditional grid can be a difficult tool to install and maintain.</p>
<h3><strong>Fabrics</strong></h3>
<p>When we at Appistry started referencing our product as a fabric, one goal was to abstract away the complexity of building traditional grid systems.</p>
<blockquote><p><strong>Fabrics</strong> <em>are a grid-based software infrastructure enabling virtualization of application services with reliable execution and simplified operation across any number of computational resources.</em></p></blockquote>
<p>One characteristic of fabric systems is that they will appear as a single computational resource independent to the number of machines that actually participate in the fabric.  We wanted to refer to the application and its distributed infrastructure as a single entity you can depend upon.   All of the plumbing to tie together the fabric is &#8220;under the covers&#8221; and made simple for developers and administrators.</p>
<p>Fabrics are enhancements over traditional grids with their simplicity and reliability.   The fabric administrator doesn&#8217;t have to partition and manage separate traditional grid-level software services such as directory services and computational nodes.  The user doesn&#8217;t have to discover or schedule work to individual machines.  When hardware failures occur, the fabric handles the error mechanisms so that the user is unaware that a failure even occurred.  Fabrics are well suited for either SOA style request/response applications as well as large scale HPC applications, where as traditional grid systems are often best suited for HPC style applications.</p>
<p>Fabrics can have cost/performance advantages as well.  Fabrics are typically built from commodity hardware as failures are handled automatically by the fabric.  These attributes reduce hardware and operational costs.  We have customers using 100+ worker fabrics managed by less than one person.</p>
<h3>Putting It All together</h3>
<p>So the question becomes, can we put these systems together?  The answer is a resounding yes.  Once you understand the strengths and weakness of each approach, you can see how clouds, grids, and fabrics can work together.</p>
<p>For example, we at Appistry are seeing more and more organizations try to take advantage of cloud computing concepts.  These groups are &#8220;renting&#8221; clouds from groups like Amazon or building their own clouds to dynamically allocate within their organizations. Cloud administrators rapidly find that their cloud solutions are not sufficient.  They need a fabric infrastructure to facilitate the scale, reliability, and management needs of the overall system.</p>
<h3>In Conclusion</h3>
<p>I hesitated to put this post together.  Surely, as soon as I hit &#8220;post&#8221; another use of the terms cloud, grid, and fabric will be thrown into the community.  However, when trying to build distributed systems, it is good to understand what each of these solutions brings to the developers and administrators.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/msgroner.wordpress.com/390/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/msgroner.wordpress.com/390/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/msgroner.wordpress.com/390/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/msgroner.wordpress.com/390/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/msgroner.wordpress.com/390/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/msgroner.wordpress.com/390/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/msgroner.wordpress.com/390/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/msgroner.wordpress.com/390/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/msgroner.wordpress.com/390/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/msgroner.wordpress.com/390/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/msgroner.wordpress.com/390/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/msgroner.wordpress.com/390/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/msgroner.wordpress.com/390/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/msgroner.wordpress.com/390/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/msgroner.wordpress.com/390/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/msgroner.wordpress.com/390/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tech.michaelgroner.com&amp;blog=8479778&amp;post=390&amp;subd=msgroner&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://tech.michaelgroner.com/2008/04/16/grids-clouds-and-fabrics-oh-my/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d71bc98372c45a4b38c8ce3027d9659c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Michael</media:title>
		</media:content>
	</item>
		<item>
		<title>Smaller Releases Help Management as Well as Developers</title>
		<link>http://tech.michaelgroner.com/2008/03/11/smaller-releases-help-management-well-developers/</link>
		<comments>http://tech.michaelgroner.com/2008/03/11/smaller-releases-help-management-well-developers/#comments</comments>
		<pubDate>Tue, 11 Mar 2008 21:11:32 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[Agile Methodology]]></category>

		<guid isPermaLink="false">http://msgroner.wordpress.com/2008/03/11/smaller-releases-help-management-well-developers/</guid>
		<description><![CDATA[<p><a href="http://www.xprogramming.com/">Ron Jeffries</a> presented at the <a href="http://tech.groups.yahoo.com/group/xpstl/">St. Louis XP User's</a> group meeting back in January. As he put it, the topic of the presentation was anything that came to his mind at the moment. He simply stood at the front of a crowded room and talked while drawing on an overhead projector.  <p>I won't try to transcribe the entire meeting, but there was one statement that has stuck with me that I wanted to share.  <h3>"Smaller Releases Help Management"</h3> <p>Ron spent a lot of time on this subject. When he first said it I though "of course that is obvious". As he continued, he brought out finer points that I hadn't considered as much. <a href="http://tech.michaelgroner.com/2008/03/11/smaller-releases-help-management-well-developers/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tech.michaelgroner.com&amp;blog=8479778&amp;post=368&amp;subd=msgroner&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.xprogramming.com/">Ron Jeffries</a> presented at the <a href="http://tech.groups.yahoo.com/group/xpstl/">St. Louis XP User&#8217;s</a> group meeting back in January. As he put it, the topic of the presentation was anything that came to his mind at the moment. He simply stood at the front of a crowded room and talked while drawing on an overhead projector.</p>
<p>I won&#8217;t try to transcribe the entire meeting, but there was one statement that has stuck with me that I wanted to share.</p>
<h3><span id="more-368"></span>&#8220;Smaller Releases Help Management&#8221;</h3>
<p>Ron spent a lot of time on this subject. When he first said it I though &#8220;of course that is obvious&#8221;. As he continued, he brought out finer points that I hadn&#8217;t considered as much.</p>
<p>At the beginning of a project customers are going to ask for as much as they can get. It is a natural reaction to the belief that software is hard and releases always take longer than they should. It&#8217;s somewhat circular, but if you believe that you aren&#8217;t going to get your release for a long time, it better have everything and the kitchen sink in it.</p>
<p>Once a release becomes too big, everything is affected negatively. Product doesn&#8217;t get into customers hands, so no value is derived. Management gets upset because they don&#8217;t have anything to manage. Developers stress because there is so much to do and an unlikely deadline to meet. The implementation itself doesn&#8217;t get appropriate feedback and starts to wither on the vine.</p>
<p>Think of all the things that free up when a release is broken down:</p>
<ul>
<li>High value stories can be put into customer&#8217;s hands earlier. It&#8217;s not everything you want in your larger release, but you can get value to your company now.</li>
<li>It gives your customers/product managers something to manage.
<ul>
<li>Maybe we learn that the first or second release is sufficient and the remaining stories can be dropped for a new project.</li>
<li>Maybe we learn that the effort is taking longer than expected. We can use the release we have, but set expectations accordingly.</li>
<li>Maybe we learn that resources should be reallocated between releases to deal with changing priorities</li>
</ul>
</li>
<li>Developers get constant feedback that their code is working and a sense of completion much earlier</li>
</ul>
<p>As I said, at first blush the fact that smaller releases are better is no real surprise. The real take away is the effect of smaller releases on the management team. With more releases come more choices and more feedback. Developers always want to know their choices and feedback, don&#8217;t be surprised that your managers want them as well.</p>
<p>Your best technique to provide choices and feedback is a smaller release.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/msgroner.wordpress.com/368/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/msgroner.wordpress.com/368/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/msgroner.wordpress.com/368/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/msgroner.wordpress.com/368/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/msgroner.wordpress.com/368/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/msgroner.wordpress.com/368/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/msgroner.wordpress.com/368/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/msgroner.wordpress.com/368/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/msgroner.wordpress.com/368/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/msgroner.wordpress.com/368/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/msgroner.wordpress.com/368/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/msgroner.wordpress.com/368/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/msgroner.wordpress.com/368/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/msgroner.wordpress.com/368/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/msgroner.wordpress.com/368/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/msgroner.wordpress.com/368/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tech.michaelgroner.com&amp;blog=8479778&amp;post=368&amp;subd=msgroner&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://tech.michaelgroner.com/2008/03/11/smaller-releases-help-management-well-developers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d71bc98372c45a4b38c8ce3027d9659c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Michael</media:title>
		</media:content>
	</item>
	</channel>
</rss>
