<?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>Ministry of Coding Blog</title>
	<atom:link href="http://blog.ministryofcoding.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.ministryofcoding.com</link>
	<description>Martin Cron&#039;s Software Development Blog</description>
	<lastBuildDate>Fri, 27 Jan 2012 17:57:35 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='blog.ministryofcoding.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Ministry of Coding Blog</title>
		<link>http://blog.ministryofcoding.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://blog.ministryofcoding.com/osd.xml" title="Ministry of Coding Blog" />
	<atom:link rel='hub' href='http://blog.ministryofcoding.com/?pushpress=hub'/>
		<item>
		<title>Update on Continuous Deployment a few months in</title>
		<link>http://blog.ministryofcoding.com/2011/09/21/update-on-continuous-deployment-a-few-months-in/</link>
		<comments>http://blog.ministryofcoding.com/2011/09/21/update-on-continuous-deployment-a-few-months-in/#comments</comments>
		<pubDate>Wed, 21 Sep 2011 23:36:24 +0000</pubDate>
		<dc:creator>Martin Cron</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Continuous Deployment]]></category>
		<category><![CDATA[Refactoring]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://blog.ministryofcoding.com/?p=303</guid>
		<description><![CDATA[On average, I&#8217;m doing just under four totally automated zero-downtime production deployments per day since I started doing continuous deployment on this project in early August 2011. Obviously, that&#8217;s an average, so some days there are more, and some days there are fewer. How many times during that span has improperly tested code broken things [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.ministryofcoding.com&#038;blog=1766325&#038;post=303&#038;subd=ministryofcoding&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>On average, I&#8217;m doing just under <strong>four</strong> totally automated zero-downtime production deployments <strong>per day</strong> since I started doing continuous deployment on this project in early August 2011.</p>
<p>Obviously, that&#8217;s an average, so some days there are more, and some days there are fewer.</p>
<p>How many times during that span has improperly tested code broken things in a way that impacted users? Just once, and it was fixed in just a few minutes by adding back the code that I over-zealously removed.</p>
<p>Also in that time, we went from 0% automated test coverage to 18% automated test coverage, refactored a lot of duplicate code, and added new features.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ministryofcoding.wordpress.com/303/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ministryofcoding.wordpress.com/303/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ministryofcoding.wordpress.com/303/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ministryofcoding.wordpress.com/303/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/ministryofcoding.wordpress.com/303/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/ministryofcoding.wordpress.com/303/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/ministryofcoding.wordpress.com/303/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/ministryofcoding.wordpress.com/303/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ministryofcoding.wordpress.com/303/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ministryofcoding.wordpress.com/303/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ministryofcoding.wordpress.com/303/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ministryofcoding.wordpress.com/303/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ministryofcoding.wordpress.com/303/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ministryofcoding.wordpress.com/303/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.ministryofcoding.com&#038;blog=1766325&#038;post=303&#038;subd=ministryofcoding&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.ministryofcoding.com/2011/09/21/update-on-continuous-deployment-a-few-months-in/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/06484d254983013dc825e6b72606201c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Martin Cron</media:title>
		</media:content>
	</item>
		<item>
		<title>Continuous Deployment for Existing Software &#8211; Do it Now</title>
		<link>http://blog.ministryofcoding.com/2011/08/17/continuous-deployment-for-existing-software-do-it-now/</link>
		<comments>http://blog.ministryofcoding.com/2011/08/17/continuous-deployment-for-existing-software-do-it-now/#comments</comments>
		<pubDate>Wed, 17 Aug 2011 23:27:33 +0000</pubDate>
		<dc:creator>Martin Cron</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Lean Software]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://blog.ministryofcoding.com/?p=289</guid>
		<description><![CDATA[I recently wrote about doing continuous deployment from day one with a software project that had pretty good test automation and (if I do say so myself) a somewhat modern and decent architecture. I&#8217;ve recently transitioned to working on a fairly ambitious overhaul of an existing project that has been around for a few years. [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.ministryofcoding.com&#038;blog=1766325&#038;post=289&#038;subd=ministryofcoding&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I recently wrote about <a title="Always Be Shipping – Real-World Continuous Deployment" href="http://blog.ministryofcoding.com/2011/06/29/always-be-shipping-real-world-continuous-deployment/">doing continuous deployment from day one</a> with a software project that had pretty good test automation and (if I do say so myself) a somewhat modern and decent architecture.</p>
<p>I&#8217;ve recently transitioned to working on a fairly ambitious overhaul of an existing project that has been around for a few years. The software has already reached a (mostly) working steady state and is used every day by real customers.</p>
<p>The very first thing I did, ahead of making any functional changes, was automate the deployment system using essentially the same kind of test gauntlet and approach for zero-downtime deployments I was using at Victors United. I added some very basic test automation, starting from the top of the <a title="Automated Test Distinctions: The Food Pyramid" href="http://blog.ministryofcoding.com/2008/07/22/automated-test-distinctions-the-food-pyramid/">test automation food pyramid</a> with a simple &#8220;is the web server able to execute code, connect to the database server, and return an &#8216;OK&#8217; rsponse?&#8221; test. From there, I&#8217;ve working my way down, just getting around to writing my first &#8220;pure&#8221; unit test just today.</p>
<p>Only after I was confident that I could do zero-effort and zero-downtime deployments that</p>
<ol>
<li>Wouldn&#8217;t completely destroy the system (I had a test for that) and</li>
<li>Could be rolled back very easily if something went screwy</li>
</ol>
<p>did I make my first functional change to the software.</p>
<p>And then, I made the smallest functional changes that could work. I tested them locally, added some test automation around them, and then let the automatic deployment system do its magic.</p>
<p>A few years ago, I was interested in doing continuous deployment, but I felt that the level of test automation wasn&#8217;t good enough, I wanted to be at least at around 90%.  Now I think that the <em>less test automation you have, the more important it is to start doing continuous deployment of tiny incremental changes right away</em>.</p>
<p>If you are working on software that&#8217;s actually in use and are interested in doing continuous deployment <em>someday</em>, there&#8217;s no better someday than today. Seriously. Do it now. It will start making your life better almost immediately.</p>
<p>&nbsp;</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ministryofcoding.wordpress.com/289/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ministryofcoding.wordpress.com/289/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ministryofcoding.wordpress.com/289/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ministryofcoding.wordpress.com/289/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/ministryofcoding.wordpress.com/289/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/ministryofcoding.wordpress.com/289/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/ministryofcoding.wordpress.com/289/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/ministryofcoding.wordpress.com/289/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ministryofcoding.wordpress.com/289/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ministryofcoding.wordpress.com/289/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ministryofcoding.wordpress.com/289/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ministryofcoding.wordpress.com/289/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ministryofcoding.wordpress.com/289/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ministryofcoding.wordpress.com/289/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.ministryofcoding.com&#038;blog=1766325&#038;post=289&#038;subd=ministryofcoding&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.ministryofcoding.com/2011/08/17/continuous-deployment-for-existing-software-do-it-now/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/06484d254983013dc825e6b72606201c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Martin Cron</media:title>
		</media:content>
	</item>
		<item>
		<title>Always Be Shipping &#8211; Real-World Continuous Deployment</title>
		<link>http://blog.ministryofcoding.com/2011/06/29/always-be-shipping-real-world-continuous-deployment/</link>
		<comments>http://blog.ministryofcoding.com/2011/06/29/always-be-shipping-real-world-continuous-deployment/#comments</comments>
		<pubDate>Wed, 29 Jun 2011 02:10:39 +0000</pubDate>
		<dc:creator>Martin Cron</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Lean Software]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://blog.ministryofcoding.com/?p=279</guid>
		<description><![CDATA[Have you ever edited code directly on a production server? I&#8217;ll admit that I have, years ago, before I knew better. It&#8217;s easy and fast and gets emergency fixes out there as quickly as possible. You get to know what works and what doesn&#8217;t because you make tiny changes. If you&#8217;re working with a system that anyone cares [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.ministryofcoding.com&#038;blog=1766325&#038;post=279&#038;subd=ministryofcoding&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Have you ever edited code directly on a production server? I&#8217;ll admit that I have, years ago, before I knew better. It&#8217;s easy and fast and gets emergency fixes out there as quickly as possible. You get to know what works and what doesn&#8217;t because you make tiny changes. If you&#8217;re working with a system that anyone cares about, it&#8217;s also dangerous and stupid.</p>
<p>I&#8217;ve also worked with development organizations that take the opposite extreme. Even the most trivial server updates needed to be scheduled weeks in advance. In order to push the updated code, you had to notify everyone, take all servers down in the middle of the night, run through a long series of manual steps, and then do a lot of manual testing. When things in production aren&#8217;t quite how they are in the test environment, this is followed by a hasty rollback or panic-induced middle-of-the-night attempts at bug fixing.</p>
<p>Both of these extreme approaches are (maybe) appropriate in some environments. But neither are appropriate for a new web startup that&#8217;s trying to move quickly and still provide a reliable trustworthy experience to their customers.</p>
<p>At the previous company I worked for, we often talked about IMVU-Style Continuous Deployment as our ideal process, but it was always something &#8220;in the future&#8221;. We were hesitant (some of us more than others) to do automatic deployment without at least a little manual intervention. We always wanted to have more test automation, or a smoother deployment system, or whatever.</p>
<p>Since it seemed to be hard (for me anyway) to move to an existing development organization to a continuous deployment system, I started to wonder what would happen if you do it that way from day one? I got a chance to answer that question when I co-founded a startup last year. One of the very first things I did, before we had anyone using the site, was to create an solid automated test &amp; deployment system that was as fast and easy as possible without being dangerous and stupid.</p>
<p>Here&#8217;s the basic workflow that happens in our office multiple times every day.</p>
<p><strong>Step 0.</strong> We make changes on our local dev envirnments, with a bias toward making the smallest possible change that adds value. That could be a bug fix, correcting a typo, a stylistic tweak, a stubbed-out new feature, whatever. Once I&#8217;m confident in my local (manual and automated) testing that the change is good (not perfect, not feature-complete, but just better), I push that to my github repository.</p>
<p>From there, the continuous integration server pulls down the new code and does the following:</p>
<p><strong>Step 1.</strong> Does the code still compile. If not, the build fails and everything stops.</p>
<p><strong>Step 2.</strong> The build agent runs the unit tests (where &#8220;unit tests&#8221; are defined as tests that run with no external dependencies, these take just a few seconds). For anything that does require external (generally slow) dependencies (network API, databases, filesystem, whatever) we use test doubles (fakes, mocks, stubs, whatever).</p>
<p><em>This first feedback loop is about catching and preventing errors in core business logic and is generally measured in seconds, not minutes.</em></p>
<p><strong>Step 3.</strong> The build agent runs a set of tests that rebuild the database from a reference schema and exercises all of the repository layer code.</p>
<p><strong>Step 4.</strong> The build agent runs another set of tests that test our dependencies on external APIs (twitter, geolocation services, etc.)</p>
<p><em>These two sets of tests run in a few minutes, so the feedback loop isn&#8217;t quite as tight, but it&#8217;s still pretty darn fast. Basically, they make sure that the assumptions that we make with our test doubles in our unit tests aren&#8217;t totally wrong. </em></p>
<p><em>I&#8217;ve written about these sorts of automated test distinction a couple of years ago, in a post about the <a href="http://blog.ministryofcoding.com/2008/07/22/automated-test-distinctions-the-food-pyramid/">Automated Testing Food Pyramid</a>.</em></p>
<p><strong>Step 5.</strong> Provided that the entire gauntlet of tests has passed so far, the code gets automatically deployed to a staging server.</p>
<p><strong>Step 6.</strong> There&#8217;s an additional set of tests that run against the staging web server. These tests can find configuration problems and code that just does the wrong thing in a web context. These tests are pretty shallow. They hit all of the user-facing pages/JSON endpoints and fail if anything is totally broken.</p>
<p><strong>Step 7.</strong> The build artifacts are copied from TeamCity to a new folder on our productionvserver, and then the web server is reconfigured to serve from that folder instead of the folder it had been serving from.</p>
<p>At this point, we&#8217;ve verified that the core business (game, in this case) is OK, verified that the persistence stack works as expected, that our integration with external APIs works as expected, and that the code doesn&#8217;t completely break in a web context. We&#8217;ve done a zero-downtime deploy to the production web server.</p>
<p>That&#8217;s cool, but we&#8217;re not quite done yet. There&#8217;s two more steps.</p>
<p><strong>Step 8.</strong> Run a set of tests against the production web site to make sure that all of the pages that worked a few moments ago still work.</p>
<p><strong>Step 9.</strong>  Have external monitoring systems in place, so if your changes make things slow or unresponsive. You&#8217;ll know.  We use <a href="http://www.pingdom.com">pingdom</a>.</p>
<p>Yikes! There&#8217;s a bunch of distinct steps here, and it seems really complicated (because it is). But it&#8217;s all totally automated. All I need to do ?</p>
<blockquote>
<pre><strong>git push origin master</strong></pre>
</blockquote>
<p>Because there&#8217;s zero deployment effort on my part, I do this all the time.  I find it very energizing to know that I can <strong>just do stuff</strong> in minutes instead of hours or days or (heaven forbid) months.</p>
<p>If (when) something goes wrong, I&#8217;ll know immediately. If a bad bit of code manages to roll through the test gauntlet, I can roll back easily (just reconfiguring the web server to use the last known good set of code). I&#8217;ve only had to roll back a couple of times over the course of several months and 326 deployments.</p>
<p>Just like when the folks at <a href="http://news.ycombinator.com/item?id=475017">IMVU wrote about this process</a>, I&#8217;m sure that some people in the audience convinced that I&#8217;m a crazy person advocating a crazy way of working. Here are the objections I&#8217;ve heard before.</p>
<p><strong>Yeah, but this doesn&#8217;t give your QA team any time to test the code before it goes out!</strong><br />
We&#8217;re a small startup. We don&#8217;t have a QA team. Problem solved.</p>
<p><strong>Yeah, but isn&#8217;t that incredibly dangerous?</strong><br />
No. <em>The safest change you can make to a stable production system is the smallest change possible</em>. Also, we design the individual parts of the system to be as encapsulated as possible, so we don&#8217;t tend to have crazy side-effects that ripple through and create unintended bugs.</p>
<p>When we make a change or add a new feature, we can manually test the hell out of that one thing in isolation (before checking in) instead of feeling like we need to spend a lot of time and effort manually testing <em>everything</em> in order to ship <em>anything</em>.</p>
<p><strong>Yeah, but what about schema changes?</strong><br />
For schema changes that are backwards compatible with the code that&#8217;s out there (e.g. new tables, whatever). We have a simple system that executes the appropriate DML on application startup.</p>
<p>For non-compatible schema changes and things like server migrations, we have to take down the site and do everything manually. Fortunately, we&#8217;ve only had to do that twice now.</p>
<p><strong>Yeah, but you have to spend all of that time writing tests. What a waste!</strong><br />
The time we spend writing tests is like the time a surgeon spends washing their hands before they cut you open. It&#8217;s a proven way to prevent bugs that can kill you.</p>
<p>Also, we get that time back, and then some, by not having to spend nearly as much time with manual testing and manual deployments.</p>
<p><strong>Yeah, but what about big new features you can&#8217;t implement in just one sitting?</strong><br />
Traditional software development models (both waterfall and agile methods like Scrum) are organized around the idea of <em>&#8220;multiple features per release (or iteration)</em>&#8220;. Continuous deployment is organized around the idea of &#8220;<em>multiple releases (or iterations) per feature</em>&#8220;. As a result, we end up pushing a lot of code for features that aren&#8217;t done yet. For the most part, these simply unavailable through the UI or only exposed to users who have particular half-built features associated with their accounts. I credit <a href="http://code.flickr.com/blog/2009/12/02/flipping-out/">Flickr with this general approach</a>.</p>
<p><strong>Yeah, but that might work for a solo developer, but it can&#8217;t work for a team.</strong><br />
There are actually three developers on the team.</p>
<p><strong>Yeah, but I&#8217;m sure this only works with very experienced developers</strong><br />
One of the guys on the team has only been programming for the last year or so and hasn&#8217;t ever worked on a web project before. Tight feedback loops help everyone.</p>
<p><strong>Yeah, but what about code you want to share with other that you don&#8217;t want released?</strong><br />
We use github, so creating additional branches and sharing with them is trivial. We also have a dedicated &#8220;preview&#8221; branch that triggers a parallel test/deploy gauntlet that sends code to a staging server instead of the production servers.</p>
<p><strong>Yeah, but this will never work at my organization because&#8230;</strong><br />
OK. That&#8217;s cool. Don&#8217;t try it if you feel that it won&#8217;t work for you. You&#8217;re probably right. You&#8217;re not going to hurt my feelings either way. I found something that&#8217;s working really well for me, and I want share my experience to show other people that it&#8217;s possible.</p>
<p><strong>What this really means</strong></p>
<p>Half of what makes this process work is that we&#8217;re honest with ourselves that we&#8217;re human and will make mistakes. If we have multiple tight feedback loops between when we&#8217;ve broken something and when we know we&#8217;ve broken it, it&#8217;s faster and easier and cheaper to fix those mistakes and prevent similar mistakes from happening again.</p>
<p>The other half is the idea that if you design, implement, test, and release exactly one thing at a time, you know with certainty which change introduced a problem instead of having to ask the question &#8220;which of the dozen or so changes that we rolled out this month/sprint/whatever are causing this problem&#8221;.</p>
<p><strong>About the site</strong></p>
<p><a href="http://victorsunited.com">Victors United</a> is an online turn-based strategic conquest game. You can play asynchronously or in real time. You can play against robots or humans. If you&#8217;re playing against humans, you can play against your friends or against strangers. Unlike some other popular web based social games that I don&#8217;t like to mention, this is a real competitive game where strategy and gameplay matter.</p>
<p><strong>About the tech </strong></p>
<p><strong></strong><em>The tech here is kind of beside the point. This general approach would work just as well with different technology stacks.</em></p>
<p>The front end is HTML5 + JavaScript + jQuery. The backend is IIS/ASP.NET MVC2/SQL Server/Entity Framework 4. Our servers are hosted in the SoftLayer cloud. External monitoring is provided by pingdom.</p>
<p>The test gauntlet is a series of distinct nUnit assemblies, executed by TeamCity when we push new code to GitHub. There&#8217;s a single custom PowerShell script that pulls down the build artifacts and tells IIS to change what directory it serves code from.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ministryofcoding.wordpress.com/279/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ministryofcoding.wordpress.com/279/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ministryofcoding.wordpress.com/279/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ministryofcoding.wordpress.com/279/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/ministryofcoding.wordpress.com/279/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/ministryofcoding.wordpress.com/279/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/ministryofcoding.wordpress.com/279/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/ministryofcoding.wordpress.com/279/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ministryofcoding.wordpress.com/279/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ministryofcoding.wordpress.com/279/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ministryofcoding.wordpress.com/279/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ministryofcoding.wordpress.com/279/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ministryofcoding.wordpress.com/279/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ministryofcoding.wordpress.com/279/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.ministryofcoding.com&#038;blog=1766325&#038;post=279&#038;subd=ministryofcoding&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.ministryofcoding.com/2011/06/29/always-be-shipping-real-world-continuous-deployment/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/06484d254983013dc825e6b72606201c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Martin Cron</media:title>
		</media:content>
	</item>
		<item>
		<title>Oh no, not more of the same TDD discussion Tedium.</title>
		<link>http://blog.ministryofcoding.com/2009/10/21/oh-no-not-more-of-the-same-tdd-discussion-tedium/</link>
		<comments>http://blog.ministryofcoding.com/2009/10/21/oh-no-not-more-of-the-same-tdd-discussion-tedium/#comments</comments>
		<pubDate>Wed, 21 Oct 2009 19:06:50 +0000</pubDate>
		<dc:creator>Martin Cron</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Refactoring]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://martincron.wordpress.com/?p=229</guid>
		<description><![CDATA[Every once in a while, otherwise reasonable people get together to argue about TDD with religious zeal. In the most recent flare-up, I&#8217;ve been disappointed that on all sides, as nobody is saying anything new. Yawn At the risk of adding yet more noise, I did have a two nuanced thoughts that are at least [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.ministryofcoding.com&#038;blog=1766325&#038;post=229&#038;subd=ministryofcoding&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Every once in a while, otherwise reasonable people get together to argue about TDD with religious zeal. In the most recent flare-up, I&#8217;ve been disappointed that on all sides, as nobody is saying anything new.</p>
<p><em>Yawn</em></p>
<p>At the risk of adding yet more noise, I did have a two nuanced thoughts that are at least <em>new to me</em> and I thought I would share them, along with a recent personal anecdote.  If this is obvious or old-hat to you, then I&#8217;m sorry.  If you think I&#8217;m  too stupid for words and that I&#8217;m drinking and/or selling snake-oil enriched kool-aid, I look forward to what will undoubtedly be informed and insightful feedback.</p>
<p><strong>1. s/driven/aware/</strong></p>
<p>The hardcore position of &#8220;never write a line of production code without a failing test for it&#8221; probably does more harm than good. Different kinds of code require varying degrees of effort (cost) to write and maintaintests for. Different kinds of code give varying degrees of benefit from test automation. Without always realizing it, developers make cost-benefit decisions all the time, and good development organizations empower their developers to act on those decisions.</p>
<p>That said, the cost-benefit decisions developers make must at least be informed decisions. A professional developer who hasn&#8217;t taken the time to learn how to use the appropriate test frameworks for their language/environment (jUnit, nUnit, whatever) is <em>just plain negligent in 2009</em>.  Test automation is just one tool in a competent developer&#8217;s toolbox, but a critical one.  I wouldn&#8217;t trust a carpenter who didn&#8217;t know what a hammer was, or a cardiologist who hadn&#8217;t bothered to learn about this newfangled angioplasty business.</p>
<p>Test-driven may not be appropriate for every context, but everyone needs to be at least <strong>test-aware</strong>.</p>
<p><strong>2. s/first/concurrently/</strong></p>
<p>Test-first is a really helpful approach, but it doesn&#8217;t work with the way everyone thinks, and mandating that everyone must always think in exactly the same way is the worst sort of micro-management.  The other extreme, writing test automation for a large system after it&#8217;s complete, is often prohibitively difficult and (frankly) boring as hell.</p>
<p>My advice is to always at least think about how you would write tests for your code before writing it. That will help keep you from painting yourself into untestable corners. Also, interlacing test writing immediately after you get a small subset of your system done is going to be much easier than testing the whole thing after the fact.  Personally, I move back and forth between writing the tests first and writing the code first. The key for me is that I&#8217;m working in short code-test-code-test cycles, using persistent (that is, I don&#8217;t throw it away when I&#8217;m done) test code as the primary mechanism for executing the code I&#8217;m writing as I&#8217;m writing it.  I don&#8217;t think of the process as being test-first, I think about <strong>testing concurrently</strong> with coding.</p>
<p><strong>Recent Anecdote</strong></p>
<p><em>Sure, anecdotes aren&#8217;t data, and they can&#8217;t prove anything, so take from it what you will<br />
</em></p>
<p>I just finished a pretty big refactoring project (that is a &#8220;pure&#8221; refactoring, the external interfaces and behavior of the existing stay the same but the underlying implementation was improved) of a system that had some decent test automation. Every time I got an edge case behavior wrong, introduced a side-effect, or removed a necessary side-effect (yuck), a test would go from green to red. This saved me at least a few days of development and testing time, and reduced the chances that I would release bugs to our QA guy (bad) or our production system (even worse).</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ministryofcoding.wordpress.com/229/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ministryofcoding.wordpress.com/229/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ministryofcoding.wordpress.com/229/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ministryofcoding.wordpress.com/229/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/ministryofcoding.wordpress.com/229/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/ministryofcoding.wordpress.com/229/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/ministryofcoding.wordpress.com/229/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/ministryofcoding.wordpress.com/229/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ministryofcoding.wordpress.com/229/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ministryofcoding.wordpress.com/229/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ministryofcoding.wordpress.com/229/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ministryofcoding.wordpress.com/229/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ministryofcoding.wordpress.com/229/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ministryofcoding.wordpress.com/229/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.ministryofcoding.com&#038;blog=1766325&#038;post=229&#038;subd=ministryofcoding&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.ministryofcoding.com/2009/10/21/oh-no-not-more-of-the-same-tdd-discussion-tedium/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/06484d254983013dc825e6b72606201c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Martin Cron</media:title>
		</media:content>
	</item>
		<item>
		<title>Writers who don&#039;t read, software creators who don&#039;t use software, and The Zune Express</title>
		<link>http://blog.ministryofcoding.com/2008/08/28/writers-who-dont-read-software-creators-who-dont-use-software-and-the-zune-express/</link>
		<comments>http://blog.ministryofcoding.com/2008/08/28/writers-who-dont-read-software-creators-who-dont-use-software-and-the-zune-express/#comments</comments>
		<pubDate>Thu, 28 Aug 2008 21:13:25 +0000</pubDate>
		<dc:creator>Martin Cron</dc:creator>
				<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://martincron.wordpress.com/?p=176</guid>
		<description><![CDATA[I write sometimes. I&#8217;m not a very serious writer, and I&#8217;m not trying to get my work published. It&#8217;s just nice to have a challenge and to use a different part of my brain. I&#8217;ve written three short novels, one is unreadable, one is borderline-readable, and the other is actually kind of OK.  I&#8217;m genuinely [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.ministryofcoding.com&#038;blog=1766325&#038;post=176&#038;subd=ministryofcoding&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I write sometimes. I&#8217;m not a very serious writer, and I&#8217;m not trying to get my work published. It&#8217;s just nice to have a challenge and to use a different part of my brain. I&#8217;ve written three short novels, one is unreadable, one is borderline-readable, and the other is actually kind of OK.  I&#8217;m genuinely proud of my one Screenplay, <em>Marc X and the Legion of Benign Disdain</em>.  It&#8217;s a comic-book-style superhero story, told from the point of view of an insecure hero whose partner is framed for taking performance enhancing drugs.</p>
<p>To liven up the bus commute on non-bicycling days, I&#8217;ve put the audiobook edition of Stephen King&#8217;s <em>On Writing</em> on my iPod. I&#8217;m aware that Stephen King is somewhat out of fashion in some circles right now (I mentioned that I was making a novelist the main character of a story I was writing, and a good friend said &#8220;That sounds like something <em>Stephen King</em> would do&#8221; while wrinkling his nose) but until the best of my stuff surpasses the worst of his stuff, I&#8217;ll reserve snobbery. </p>
<p>One thing that has come up in his advice to writers more than once is that you need to be a serious <strong>reader</strong> if you want to have any success as a <strong>writer</strong>. He&#8217;s clear that he doesn&#8217;t read fiction to directly improve his plotting, dialogue, or prose. He reads fiction because he enjoys reading fiction. His prose and dialogue just get better naturally with more exposure.</p>
<p>I&#8217;ve noticed a parallel in the software realm, where people who wouldn&#8217;t ever <strong>use</strong> a particular kind of software tool, are in charge of <strong>designing and building</strong> one. The results are predictably lackluster. The end product is stilted, like the work of a non-reading writer with a clumsy vocabulary or a flat ear for dialogue. You won&#8217;t get to greatness this way, you consider yourself lucky if it works at all.</p>
<p>I&#8217;ve made a conscious effort to make sure that I actually use software products similar to the ones that I&#8217;m building. I&#8217;ve been doing some media related work, and whenever I get stuck on an interaction, I ask myself, &#8220;What would iTunes do?&#8221; Not that I slavishly copy everything Apple does, but I know that they at least put a lot of time and energy into their interaction design. If humans didn&#8217;t solve problems in the context of how other people have solved similar problems, we never would have progressed beyond cave painting.</p>
<p>Now consider the <a href="http://blog.wired.com/music/2007/05/microsofts_zune_1.html">iPod Amnesty Bin at the Microsoft Zune HQ</a>.  I know it&#8217;s mostly a joke, but there&#8217;s still a message behind it: <em>You had better not be seen using our competitor&#8217;s product, even though it&#8217;s a huge commercial success and generally considered one of the most well-designed machines in modern history.</em></p>
<p>And while the Zune is only in its second generation and has been steadily improving, it hasn&#8217;t exactly set the world on fire. I&#8217;ve only seen a small handful of them in the wild, while I see iPods everywhere. I sometimes joke that the <a href="http://seattlepi.nwsource.com/business/332970_msftbus25.html">Microsoft Connector commuter shuttles</a> in the Seattle area should instead be called <em>The Zune Express</em>. It&#8217;s a magical, insular place where Microsoft employees don&#8217;t have to deal with the disturbing reality that nearly everyone on regular public transportation is using an iPod.</p>
<p>Can you imagine the scandal that would break out if you saw Stephen King reading a book by Dean Koontz? Or if you saw Michael Crichton reading a book by John Grisham? What? There&#8217;s no scandal at all. Just a recognition of the community of experts learning from each other&#8217;s successes and failures.</p>
<p>What&#8217;s next? I&#8217;m going to use as many software programs as I can get my hands on, and I&#8217;ve deviced to re-read <em>The Shining</em> with a critical eye,<em> </em>even if it is yet another story with a writer as the main character.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/ministryofcoding.wordpress.com/176/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/ministryofcoding.wordpress.com/176/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ministryofcoding.wordpress.com/176/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ministryofcoding.wordpress.com/176/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ministryofcoding.wordpress.com/176/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ministryofcoding.wordpress.com/176/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/ministryofcoding.wordpress.com/176/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/ministryofcoding.wordpress.com/176/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/ministryofcoding.wordpress.com/176/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/ministryofcoding.wordpress.com/176/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ministryofcoding.wordpress.com/176/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ministryofcoding.wordpress.com/176/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ministryofcoding.wordpress.com/176/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ministryofcoding.wordpress.com/176/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ministryofcoding.wordpress.com/176/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ministryofcoding.wordpress.com/176/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.ministryofcoding.com&#038;blog=1766325&#038;post=176&#038;subd=ministryofcoding&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.ministryofcoding.com/2008/08/28/writers-who-dont-read-software-creators-who-dont-use-software-and-the-zune-express/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/06484d254983013dc825e6b72606201c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Martin Cron</media:title>
		</media:content>
	</item>
		<item>
		<title>Alternative to AlternatingItemTemplate Redundancy in ASP.NET</title>
		<link>http://blog.ministryofcoding.com/2008/08/23/alternative-to-alternatingitemtemplate-redundancy-in-aspnet/</link>
		<comments>http://blog.ministryofcoding.com/2008/08/23/alternative-to-alternatingitemtemplate-redundancy-in-aspnet/#comments</comments>
		<pubDate>Sat, 23 Aug 2008 04:59:10 +0000</pubDate>
		<dc:creator>Martin Cron</dc:creator>
				<category><![CDATA[Code Qualities]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://martincron.wordpress.com/?p=179</guid>
		<description><![CDATA[One of the facets of good coding practices that almost everyone seems to agree on is that redundancy in code, usually via copy and paste, is a dangerous thing. I saw a great example of this in some ASP.NET code I was working with recently. A tester had reported that some of the items in [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.ministryofcoding.com&#038;blog=1766325&#038;post=179&#038;subd=ministryofcoding&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>One of the facets of good coding practices that almost everyone seems to agree on is that redundancy in code, usually via copy and paste, is a dangerous thing.</p>
<p>I saw a great example of this in some ASP.NET code I was working with recently. A tester had reported that some of the items in a display were being truncated inappropriately, while others weren&#8217;t being truncated at all. I looked at the screen and could immediately tell what was wrong. Every other row in the table was truncated. It corresponded perfectly with the ledger-paper-style alternating background colors.</p>
<p>Looking at the code, I saw the following things (simplified):</p>
<p><code><br />
&lt;asp:Repeater id="repeater" runat="server"&gt;<br />
&lt;ItemTemplate&gt;<br />
&lt;tr bgcolor="#FFFFFF"&gt;&lt;td&gt;&lt;%# DataBinder.Eval(Container.DataItem, "Title")%&gt;&lt;/td&gt;&lt;/tr&gt; &lt;/ItemTemplate&gt;<br />
&lt;AlternatingItemTemplate&gt;<br />
&lt;tr bgcolor="#CCCCCC"&gt;&lt;td&gt;&lt;%# DataBinder.Eval(Container.DataItem, "TruncatedTitle")%&gt;&lt;/td&gt;&lt;/tr&gt;<br />
&lt;/AlternatingItemTemplate&gt;<br />
&lt;/asp:Repeater&gt;<br />
</code></p>
<p> <br />
The vast majority of the code in AlternatingItemTemplate has the same intention as the code in ItemTemplate. Whenever you have duplicated code (or near-duplicated code) you will eventually forget to update one of the two things that need to be updated in parallel. Hence the bug.</p>
<p>An alternative, would be to not have the duplicated/duplication-heavy AlternatingItemTemplate, but instead, call a method to get the row color, like this:</p>
<p><code><br />
&lt;ItemTemplate&gt;<br />
&lt;tr bgcolor="&lt;% = GetCurrentRowColor()%&gt;"&gt;<br />
&lt;td&gt;&lt;%# DataBinder.Eval(Container.DataItem, "TruncatedTitle")%&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/ItemTemplate&gt;<br />
</code></p>
<p>In the code behind (or even someplace more generalized, if you are going to use this layout more than once, of course), you could have this simple logic:</p>
<p><code><br />
private const string initialRowColor = "#FFFFFF";<br />
private const string alternatingRowColor = "#CCCCCC";<br />
private string lastRowColor = initialRowColor;<br />
public string GetCurrentRowColor()<br />
{<br />
 if(lastRowColor == initialRowColor)<br />
{<br />
lastRowColor = alternatingRowColor;<br />
return alternatingRowColor;<br />
}<br />
else<br />
{<br />
lastRowColor = initialRowColor;<br />
return initialRowColor;<br />
}<br />
}<br />
</code><br />
 <br />
One Courtesy Note: in the off-chance that my comrade who introduced this problem is reading this, I don&#8217;t mean to single you out or pick on you. It&#8217;s the sort of mistake that I&#8217;ve made a billion times myself, and wanted to capture what I felt was a reasonable solution to the AlternatingItemTemplate redundancy problem.</p>
<p>Also, in case any ASP.NET gurus are out there, I generally don&#8217;t like to use the DataBinder.Eval syntax, this is a simplified example, remember?</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/ministryofcoding.wordpress.com/179/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/ministryofcoding.wordpress.com/179/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ministryofcoding.wordpress.com/179/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ministryofcoding.wordpress.com/179/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ministryofcoding.wordpress.com/179/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ministryofcoding.wordpress.com/179/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/ministryofcoding.wordpress.com/179/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/ministryofcoding.wordpress.com/179/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/ministryofcoding.wordpress.com/179/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/ministryofcoding.wordpress.com/179/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ministryofcoding.wordpress.com/179/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ministryofcoding.wordpress.com/179/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ministryofcoding.wordpress.com/179/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ministryofcoding.wordpress.com/179/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ministryofcoding.wordpress.com/179/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ministryofcoding.wordpress.com/179/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.ministryofcoding.com&#038;blog=1766325&#038;post=179&#038;subd=ministryofcoding&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.ministryofcoding.com/2008/08/23/alternative-to-alternatingitemtemplate-redundancy-in-aspnet/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/06484d254983013dc825e6b72606201c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Martin Cron</media:title>
		</media:content>
	</item>
		<item>
		<title>Another 25 employees? No thank you.</title>
		<link>http://blog.ministryofcoding.com/2008/08/04/another-25-employees-no-thank-you/</link>
		<comments>http://blog.ministryofcoding.com/2008/08/04/another-25-employees-no-thank-you/#comments</comments>
		<pubDate>Mon, 04 Aug 2008 21:07:26 +0000</pubDate>
		<dc:creator>Martin Cron</dc:creator>
				<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://martincron.wordpress.com/?p=152</guid>
		<description><![CDATA[I recently read an outrageous claim from a company that makes software project management tools. I&#8217;m leaving the company name out of this post as I don&#8217;t want to either single them out, or to give them publicity. [Product X] companies were 25% more productive.  That’s like adding 25 people to a 100-person department, free! Let&#8217;s [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.ministryofcoding.com&#038;blog=1766325&#038;post=152&#038;subd=ministryofcoding&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I recently read an outrageous claim from a company that makes software project management tools. I&#8217;m leaving the company name out of this post as I don&#8217;t want to either single them out, or to give them publicity.</p>
<blockquote><p>[Product X] companies were 25% more productive.<span>  </span><em>That’s</em> <em>like adding 25 people to a 100-person department, free!</em></p></blockquote>
<p>Let&#8217;s just set aside the notion that you can accurately measure productivity of software teams in a meaningful way (you can&#8217;t). My immediate thought take on that was, &#8220;No, it&#8217;s like removing 25 people from a 100-person department. Hasn&#8217;t anyone read the Mythical Man-Month?&#8221;</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/ministryofcoding.wordpress.com/152/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/ministryofcoding.wordpress.com/152/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ministryofcoding.wordpress.com/152/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ministryofcoding.wordpress.com/152/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ministryofcoding.wordpress.com/152/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ministryofcoding.wordpress.com/152/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/ministryofcoding.wordpress.com/152/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/ministryofcoding.wordpress.com/152/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/ministryofcoding.wordpress.com/152/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/ministryofcoding.wordpress.com/152/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ministryofcoding.wordpress.com/152/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ministryofcoding.wordpress.com/152/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ministryofcoding.wordpress.com/152/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ministryofcoding.wordpress.com/152/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ministryofcoding.wordpress.com/152/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ministryofcoding.wordpress.com/152/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.ministryofcoding.com&#038;blog=1766325&#038;post=152&#038;subd=ministryofcoding&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.ministryofcoding.com/2008/08/04/another-25-employees-no-thank-you/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/06484d254983013dc825e6b72606201c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Martin Cron</media:title>
		</media:content>
	</item>
		<item>
		<title>Automated Test Distinctions: The Food Pyramid</title>
		<link>http://blog.ministryofcoding.com/2008/07/22/automated-test-distinctions-the-food-pyramid/</link>
		<comments>http://blog.ministryofcoding.com/2008/07/22/automated-test-distinctions-the-food-pyramid/#comments</comments>
		<pubDate>Tue, 22 Jul 2008 01:02:03 +0000</pubDate>
		<dc:creator>Martin Cron</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://martincron.wordpress.com/?p=78</guid>
		<description><![CDATA[This is something I came up with a while ago when I was working on a large integration/orchestration project for a now-defunct MVNO (mobile virtual network operator). It was a pretty complex project, which had many external collaborators and end-points into the system. The project was having some issues with being able to reliably deliver [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.ministryofcoding.com&#038;blog=1766325&#038;post=78&#038;subd=ministryofcoding&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>This is something I came up with a while ago when I was working on a large integration/orchestration project for a now-defunct MVNO (mobile virtual network operator). It was a pretty complex project, which had many external collaborators and end-points into the system. The project was having some issues with being able to reliably deliver incremental functionality on time. I had a directive to use my judgment to essentially turn the project around.</p>
<p>I had just come off a project which had excellent pure unit test coverage, but not very good overall test coverage with actual collaborators. The integration points were much more difficult and painful than they needed to be. On the other extreme, I inherited a bunch of existing non-unit tests as part of the MVNO project. These were brittle, took a long-time to run, and failed for a bunch of different reasons. As a result, they weren&#8217;t run very often, became neglected, and eventually worthless.  There was no continuous integration in place, so the feedback loop between breaking something and finding what you broke was very loose.</p>
<p>To make matters just a little more dicey, I was working with another test-focused developer who had a strong preference for writing epic end-to-end tests, while I was trying to make the code more able to be tested in isolation. I resented the fact that &#8220;his&#8221; tests were keeping me from running the tests as part of the cruise control build.</p>
<p>I came up with what I called the &#8220;Food Pyramid&#8221; as a way of balancing these different forces and points of view. I broke the one massive test project into three distinct assemblies with their own goals.  The differences between the projects are best explained in a series of pictures:</p>
<p><img class="alignnone size-full wp-image-138" src="http://martincron.files.wordpress.com/2008/07/page_1.jpg?w=497" alt=""   /></p>
<p><img class="alignnone size-full wp-image-137" src="http://martincron.files.wordpress.com/2008/07/page_2.jpg?w=497" alt=""   /></p>
<p><img class="alignnone size-full wp-image-142" src="http://martincron.files.wordpress.com/2008/07/page_3.jpg?w=497" alt=""   /></p>
<p><img class="alignnone size-full wp-image-145" src="http://martincron.files.wordpress.com/2008/07/page_4.jpg?w=497" alt=""   /></p>
<p><img class="alignnone size-full wp-image-140" src="http://martincron.files.wordpress.com/2008/07/page_5.jpg?w=497" alt=""   /></p>
<p><img class="alignnone size-full wp-image-144" src="http://martincron.files.wordpress.com/2008/07/page_6.jpg?w=497" alt=""   /></p>
<p><img class="alignnone size-full wp-image-143" src="http://martincron.files.wordpress.com/2008/07/page_7.jpg?w=497" alt=""   /></p>
<p><img class="alignnone size-full wp-image-141" src="http://martincron.files.wordpress.com/2008/07/page_8.jpg?w=497" alt=""   /></p>
<p><img class="alignnone size-full wp-image-146" src="http://martincron.files.wordpress.com/2008/07/page_9.jpg?w=497" alt=""   /></p>
<p><img class="alignnone size-full wp-image-136" src="http://martincron.files.wordpress.com/2008/07/page_10.jpg?w=497" alt=""   /></p>
<p><img class="alignnone size-full wp-image-139" src="http://martincron.files.wordpress.com/2008/07/page_11.jpg?w=497" alt=""   /></p>
<p>So, did it work? Yes and no. We eventually had much smoother and more confident deployments thanks to the end-to-end tests. I also managed to refactor and add new code more quickly with fewer bugs thanks to my unit-test safety net. But, just as I was starting to get a handle on the project, the client filed for bankruptcy and stopped paying their vendors (which unfortunately included me). It seems that having a viable business model trumps all.</p>
<p>I have, however, used these and similar distinctions successfully on subsequent projects, and I know that at least one development organization I&#8217;ve explained the idea to has adopted the pyramid as part of their overall testing strategy.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/ministryofcoding.wordpress.com/78/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/ministryofcoding.wordpress.com/78/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ministryofcoding.wordpress.com/78/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ministryofcoding.wordpress.com/78/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ministryofcoding.wordpress.com/78/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ministryofcoding.wordpress.com/78/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/ministryofcoding.wordpress.com/78/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/ministryofcoding.wordpress.com/78/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/ministryofcoding.wordpress.com/78/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/ministryofcoding.wordpress.com/78/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ministryofcoding.wordpress.com/78/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ministryofcoding.wordpress.com/78/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ministryofcoding.wordpress.com/78/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ministryofcoding.wordpress.com/78/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ministryofcoding.wordpress.com/78/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ministryofcoding.wordpress.com/78/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.ministryofcoding.com&#038;blog=1766325&#038;post=78&#038;subd=ministryofcoding&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.ministryofcoding.com/2008/07/22/automated-test-distinctions-the-food-pyramid/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/06484d254983013dc825e6b72606201c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Martin Cron</media:title>
		</media:content>

		<media:content url="http://martincron.files.wordpress.com/2008/07/page_1.jpg" medium="image" />

		<media:content url="http://martincron.files.wordpress.com/2008/07/page_2.jpg" medium="image" />

		<media:content url="http://martincron.files.wordpress.com/2008/07/page_3.jpg" medium="image" />

		<media:content url="http://martincron.files.wordpress.com/2008/07/page_4.jpg" medium="image" />

		<media:content url="http://martincron.files.wordpress.com/2008/07/page_5.jpg" medium="image" />

		<media:content url="http://martincron.files.wordpress.com/2008/07/page_6.jpg" medium="image" />

		<media:content url="http://martincron.files.wordpress.com/2008/07/page_7.jpg" medium="image" />

		<media:content url="http://martincron.files.wordpress.com/2008/07/page_8.jpg" medium="image" />

		<media:content url="http://martincron.files.wordpress.com/2008/07/page_9.jpg" medium="image" />

		<media:content url="http://martincron.files.wordpress.com/2008/07/page_10.jpg" medium="image" />

		<media:content url="http://martincron.files.wordpress.com/2008/07/page_11.jpg" medium="image" />
	</item>
		<item>
		<title>Agreement on the Lean-Agile Connection</title>
		<link>http://blog.ministryofcoding.com/2008/06/30/agreement-on-the-lean-agile-connection/</link>
		<comments>http://blog.ministryofcoding.com/2008/06/30/agreement-on-the-lean-agile-connection/#comments</comments>
		<pubDate>Mon, 30 Jun 2008 18:02:57 +0000</pubDate>
		<dc:creator>Martin Cron</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Lean Software]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://martincron.wordpress.com/?p=107</guid>
		<description><![CDATA[I&#8217;ve been arguing (mostly unsuccessfully) for some time that Lean Software Development and Agile are two different intellectual frameworks for understanding the same underlying concepts. The artificial distinctions that people draw are often based on connotations of the words themselves, such as &#8220;agile is about fast while lean is about cheap&#8221;. Now, in a shameless appeal [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.ministryofcoding.com&#038;blog=1766325&#038;post=107&#038;subd=ministryofcoding&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been arguing (mostly unsuccessfully) for some time that Lean Software Development and Agile are two different intellectual frameworks for understanding the same underlying concepts. The artificial distinctions that people draw are often based on connotations of the words themselves, such as &#8220;agile is about fast while lean is about cheap&#8221;.</p>
<p>Now, in a shameless <a href="http://c2.com/cgi/wiki?AdVerecundiam">appeal to authority</a>, I find that <a href="http://martinfowler.com/bliki/AgileVersusLean.html">Martin Fowler sees things the same way</a>. From a recent post:</p>
<blockquote><p>You can&#8217;t really talk about them being alternatives, if you are doing agile you are doing lean and vice-versa. Agile was always meant as a very broad concept, a core set of values and principles that was shared by processes that look superficially different. You don&#8217;t do agile <em>or</em> lean you do agile <em>and</em> lean. The only question is how explicitly you use ideas that draw directly from lean manufacturing.</p></blockquote>
<p>Right on!</p>
<p>One thought on drawing ideas directly from lean manufacturing: The ideas that work in both manufacturing and software (such as empowerment, incrementalism, tight feedback loops) don&#8217;t necessarily work in software just because they work in manufacturing. That&#8217;s a <span style="font-size:11pt;line-height:115%;font-family:&quot;">naïve </span>mindset that can lead you to all sorts of bad conclusions.  Some ideas work in both due to the nature of the<em> </em>people<em> </em>involved in both. </p>
<p>It&#8217;s easy to get ideas from manufacturing as it&#8217;s a human endeavor that&#8217;s more mature and has been very well studied and documented.  An observant and mindful person could surely draw lessons from all sorts of places.  It&#8217;s possible that someday we&#8217;ll all understand software development well enough that we won&#8217;t need to borrow concepts from other disciplines. It&#8217;s clear to me that we aren&#8217;t there yet, though.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/ministryofcoding.wordpress.com/107/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/ministryofcoding.wordpress.com/107/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ministryofcoding.wordpress.com/107/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ministryofcoding.wordpress.com/107/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ministryofcoding.wordpress.com/107/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ministryofcoding.wordpress.com/107/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/ministryofcoding.wordpress.com/107/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/ministryofcoding.wordpress.com/107/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/ministryofcoding.wordpress.com/107/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/ministryofcoding.wordpress.com/107/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ministryofcoding.wordpress.com/107/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ministryofcoding.wordpress.com/107/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ministryofcoding.wordpress.com/107/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ministryofcoding.wordpress.com/107/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ministryofcoding.wordpress.com/107/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ministryofcoding.wordpress.com/107/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.ministryofcoding.com&#038;blog=1766325&#038;post=107&#038;subd=ministryofcoding&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.ministryofcoding.com/2008/06/30/agreement-on-the-lean-agile-connection/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/06484d254983013dc825e6b72606201c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Martin Cron</media:title>
		</media:content>
	</item>
		<item>
		<title>Checklists are Your Friends (surgery, photography, testing, coding, marketing)</title>
		<link>http://blog.ministryofcoding.com/2008/06/26/checklists-are-your-friends-aviation-marketing-photography-programming-surgery/</link>
		<comments>http://blog.ministryofcoding.com/2008/06/26/checklists-are-your-friends-aviation-marketing-photography-programming-surgery/#comments</comments>
		<pubDate>Thu, 26 Jun 2008 19:35:52 +0000</pubDate>
		<dc:creator>Martin Cron</dc:creator>
				<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://martincron.wordpress.com/?p=105</guid>
		<description><![CDATA[The headline of the local Seattle Newspaper yesterday caught my eye. It was about how surgeons at the UW (my Alma Mater) are now using aviation-inspired checklists to make sure they don&#8217;t, you know, leave stuff inside of people. This resonated with me, because I had resolved to making checklists for photo gear packing after a near-fiasco [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.ministryofcoding.com&#038;blog=1766325&#038;post=105&#038;subd=ministryofcoding&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>The headline of the local Seattle Newspaper yesterday caught my eye. It was about how <a href="http://seattletimes.nwsource.com/html/localnews/2008018070_checklist26m.html">surgeons at the UW (my Alma Mater) are now using aviation-inspired checklists</a> to make sure they don&#8217;t, you know, leave stuff inside of people. This resonated with me, because I had resolved to making checklists for photo gear packing after a near-fiasco last weekend.</p>
<p>I was taking wedding reception photos as a favor for an old friend. For the most part, I hate the entire idea of doing wedding photography. The risk/stress/reward/effort ratios don&#8217;t work out right.  This one actually worked out really well, as the couple and wedding party were all great. They also had a &#8220;real&#8221; photographer working (who had more invested in one lens than I have in my entire setup, alas) which freed me up to take some more experimental pictures, such as HDR still lifes of the venue, controlled motion blur shots of people dancing, and grainy black and white candids (I love tmax 3200 <em>because</em> of the grain, not in spite of it).</p>
<p>I took special care to make sure that all of my camera and flash batteries were charged before the event, but I didn&#8217;t spend a lot of time packing the bag before I left. I just threw everything into the camera bag and ran out the door. When I got to the venue and started putting all of the things together, I found I was missing a small but vital piece, the caddy that holds two batteries and slides into my battery grip. Without it, my DSLR wouldn&#8217;t work. Panic!</p>
<p>After calling home 15 times, I finally got in touch with my wife, who graciously drove across town with a small piece of plastic so I could actually turn the camera on. Fortunately, I brought a film SLR as a backup, and had just finished my last roll when she pulled up.</p>
<p>If I had made a simple packing checklist, much pain and fear would have been avoided.</p>
<p>And while I&#8217;m not a fan of oppressive standards, heavyweight processes, or detailed artifacts in software development (my thinking is that if you&#8217;re constrained by your conventions, the best you&#8217;ll ever be is conventional) simple &#8220;have I forgotten this&#8221; checklists are insanely valuable.  Based on what I&#8217;ve seen, they&#8217;re also underused. </p>
<p>My first job in software was split between testing and support for a small company making technical graphics software. The testing department was pretty unstructured. We had reasonable automated test coverage (horrible by today&#8217;s standards, but OK for the time) but all manual testing was, &#8220;Hey Martin, I just fixed this bug, go poke at it!&#8221; and &#8220;We&#8217;re realeasing a beta next week, test everything!&#8221; and &#8220;We&#8217;ve got a release candidate, get the people from sales and marketing to play with it!&#8221;</p>
<p>So, for no other benefit than my own confidence, I made a some checklists, just to keep from forgetting to test specific features/permutations.  Eventually the company adopted my checklists and handed them around when we did our &#8220;all-hands&#8221; pre-release testing.  Just asking people (including me) to be mindful of the feature list when they were doing their exploratory testing helped us find many problems as well as places where we could improve the user experience.</p>
<p>I saw this again a few days ago when I was looking at a web application that made a lot of pretty common security mistakes (no SSL for login, <a href="http://www.codinghorror.com/blog/archives/001140.html">emailing passwords in cleartext,</a> etc.). &#8220;These are all essentially <em>solved problems,&#8221;</em>  I thought, &#8220;Shouldn&#8217;t there be a checklist for this sort of thing?&#8221; </p>
<p>Many experienced folks have a sort of mental checklist. Things they know instinctively to look for. Like my old mentor who would always enter &#8220;O&#8217;Brien&#8221; into name fields to catch inappropriatley escaped SQL input. This is one of the reasons why domain knowledge is so valuable. How do we get people to capture and share this domain knowledge? Couldn&#8217;t a development group be able to use a set of mature &#8220;don&#8217;t forget to think about thing X&#8221; checklists as a competitive advantage for design/development/testing?</p>
<p>While writing this, I&#8217;m reminded of my favorite marketing professor at the UW. After spending a whole quarter discussing different theories, reading case studies, and pulling examples from real-life companies, the last day of class she said (and I&#8217;m paraphrasing here, because that was some time ago).</p>
<blockquote><p>In the real world, when you start in marketing professionally, it&#8217;s just checklists: Have I identified the market for my product or service? Have I explained my offering to someone who doesn&#8217;t understand it? Have I underpriced? Have I overpriced? Am I saying something stupid or offensive in this ad? How will my competitors react to this change? How will my customers react to this change?  The answers are all easy, but bad marketers forget to ask the questions.</p></blockquote>
<p>Sure, that doesn&#8217;t get you to greatness (or even guarantee goodness), but it at least keeps you from forgetting about the obvious.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/ministryofcoding.wordpress.com/105/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/ministryofcoding.wordpress.com/105/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ministryofcoding.wordpress.com/105/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ministryofcoding.wordpress.com/105/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ministryofcoding.wordpress.com/105/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ministryofcoding.wordpress.com/105/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/ministryofcoding.wordpress.com/105/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/ministryofcoding.wordpress.com/105/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/ministryofcoding.wordpress.com/105/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/ministryofcoding.wordpress.com/105/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ministryofcoding.wordpress.com/105/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ministryofcoding.wordpress.com/105/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ministryofcoding.wordpress.com/105/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ministryofcoding.wordpress.com/105/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ministryofcoding.wordpress.com/105/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ministryofcoding.wordpress.com/105/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.ministryofcoding.com&#038;blog=1766325&#038;post=105&#038;subd=ministryofcoding&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.ministryofcoding.com/2008/06/26/checklists-are-your-friends-aviation-marketing-photography-programming-surgery/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/06484d254983013dc825e6b72606201c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Martin Cron</media:title>
		</media:content>
	</item>
	</channel>
</rss>
