<?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/"
	>

<channel>
	<title>//FIXME &#187; Guerilla Software Recovery</title>
	<atom:link href="http://eraserhead.net/category/philosophizing-over-coding/guerilla-software-recovery/feed/" rel="self" type="application/rss+xml" />
	<link>http://eraserhead.net</link>
	<description>Jason Felice's blog</description>
	<lastBuildDate>Sat, 04 Sep 2010 03:13:54 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>R Utilities for Software Kanban &#8211; Plotting Your CFD</title>
		<link>http://eraserhead.net/2010/04/r-utilities-for-software-kanban-plotting-your-cfd/</link>
		<comments>http://eraserhead.net/2010/04/r-utilities-for-software-kanban-plotting-your-cfd/#comments</comments>
		<pubDate>Mon, 12 Apr 2010 13:59:53 +0000</pubDate>
		<dc:creator>Jason</dc:creator>
				<category><![CDATA[Guerilla Software Recovery]]></category>
		<category><![CDATA[CFD]]></category>
		<category><![CDATA[Kanban]]></category>
		<category><![CDATA[Process]]></category>
		<category><![CDATA[R]]></category>
		<category><![CDATA[Workflow]]></category>

		<guid isPermaLink="false">http://eraserhead.net/?p=537</guid>
		<description><![CDATA[I&#8217;ve started a set of R utilities for software kanban at GitHub.  I&#8217;ve been using the R environment more lately, and I really like how easy it makes visualizing and working with data.  It has a bit of an &#8220;old-school&#8221; environment feel as well and it is functional and efficient.  If you [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve started a set of <a href="http://github.com/eraserhd/rkanban">R utilities for software kanban</a> at <a href="http://github.com/">GitHub</a>.  I&#8217;ve been using the R environment more lately, and I really like how easy it makes visualizing and working with data.  It has a bit of an &#8220;old-school&#8221; environment feel as well and it is functional and efficient.  If you are an R guru (I&#8217;m not really, though I&#8217;m learning) and you have utilities, please contribute!</p>
<p>The utilities expect data to be stored in a <tt>data.frame</tt>.  The first column must be named &#8220;Date&#8221; and have &#8220;Date&#8221; class.  The second column is currently ignored; however, the intention is that it indicates the ticket category (usually represented on the board by ticket color), and so it should be a factor.  Columns three onward (as many as you have flow steps) are tallies of each work flow step for the day, in reverse chronological order &#8211; starting with &#8220;Done&#8221; and ending with &#8220;Backlog&#8221;, in other words.</p>
<p>The easiest way to get this data into R is to store it in a CSV file and use <tt>read.csv</tt> to load it.  Here is some sample data:</p>
<pre>
Date,Category,Done,QA,Development,Ready,Backlog
2009/10/20,Project,0,2,2,0,0
2009/10/20,Urgent,0,0,1,0,0
2009/10/22,Project,1,2,1,0,0
2009/10/22,Urgent,0,0,2,0,0
2009/10/23,Project,1,2,2,0,0
2009/10/23,Urgent,0,0,2,0,0
</pre>
<p>Load this into R with:</p>
<pre>
> my.data <- read.csv("my_data.csv")
</pre>
<p>An alternate method for maintaining your data within R is to use the <tt>fix()</tt> function on a daily basis, which is what I do.  Two warnings, however:</p>
<ol>
<li>Make sure to save your workspace so that you don't lose your stats.</p>
<li><tt>fix()</tt> will strip the "Date" class from the Date column.
</ol>
<p>To re-add the Date class after using <tt>fix()</tt>, do this:</p>
<pre>
> my.data$Date <- as.Date(my.data$Date)
</pre>
<h2>Plotting your CFD</h2>
<p>Check out the <a href="http://github.com/eraserhd/rkanban">rkanban</a> sources into the "rkanban" directory under your R working directory and source the <tt>kanban.R</tt> file.</p>
<p>You can then plot your CFD from within R like so:</p>
<pre>
> source("rkanban/kanban.R")
> PlotCFD(my.data)
</pre>
<p><img src="http://eraserhead.net/files/plotcfd.png"></p>
]]></content:encoded>
			<wfw:commentRss>http://eraserhead.net/2010/04/r-utilities-for-software-kanban-plotting-your-cfd/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Make Work Visible</title>
		<link>http://eraserhead.net/2010/03/make-work-visible/</link>
		<comments>http://eraserhead.net/2010/03/make-work-visible/#comments</comments>
		<pubDate>Wed, 10 Mar 2010 04:24:34 +0000</pubDate>
		<dc:creator>Jason</dc:creator>
				<category><![CDATA[Guerilla Software Recovery]]></category>
		<category><![CDATA[Patterns]]></category>

		<guid isPermaLink="false">http://eraserhead.net/?p=497</guid>
		<description><![CDATA[Context
A significant portion of your activities aren&#8217;t visible to your management, possibly because

you have become the &#8220;product expert&#8221; which consults with others or
your products&#8217; production deployments require significant developer attention
  
Therefore,
Divide your whiteboard up into columns representing your work flow (e.g. &#8220;Backlog,&#8221; &#8220;Ready&#8221;, &#8220;Develop&#8221;, &#8220;QA&#8221;, &#8220;Done&#8221;) and obtain a large supply of Post-It(tm) notes. [...]]]></description>
			<content:encoded><![CDATA[<h2>Context</h2>
<p>A significant portion of your activities aren&#8217;t visible to your management, possibly because
<ul>
<li>you have become the &#8220;product expert&#8221; which consults with others or
<li>your products&#8217; production deployments require significant developer attention
  </ul>
<h2>Therefore,</h2>
<p>Divide your whiteboard up into columns representing your work flow (e.g. &#8220;Backlog,&#8221; &#8220;Ready&#8221;, &#8220;Develop&#8221;, &#8220;QA&#8221;, &#8220;Done&#8221;) and obtain a large supply of Post-It(tm) notes.  Use separate colors for the items assigned to you by your management and the items which come to you as the domain expert.  If necessary, track enough information to build a cumulative flow diagram.</p>
<h2>Discussion</h2>
<p>There is something visceral about this approach that conveys understanding in a way which is not possible by explanation or discussion.  It may be the case that your management <em>knows</em> what is happening but doesn&#8217;t quite &#8220;<em>get it</em>.&#8221;</p>
<p>This is a minimum useful subset of <a href="http://limitedwipsociety.org/">software kanban</a> and an instance of &#8220;Information Radiator.&#8221;</p>
<p>A cumulative flow diagram can be created by simply counting the number of tickets in each bucket each morning and entering these into a spreadsheet in backwards order.  You can read your average work-in-process (WIP) and cycle time from this diagram, making it an incredibly inexpensive way to measure the amount of effort spent on visible work versus other work.</p>
<h2>Observed Instances</h2>
<h3>One</h3>
<p>[to be filled in]</p>
]]></content:encoded>
			<wfw:commentRss>http://eraserhead.net/2010/03/make-work-visible/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Automate Release Checks</title>
		<link>http://eraserhead.net/2010/03/automate-release-checks/</link>
		<comments>http://eraserhead.net/2010/03/automate-release-checks/#comments</comments>
		<pubDate>Mon, 08 Mar 2010 13:00:58 +0000</pubDate>
		<dc:creator>Jason</dc:creator>
				<category><![CDATA[Guerilla Software Recovery]]></category>
		<category><![CDATA[Patterns]]></category>
		<category><![CDATA[Process]]></category>

		<guid isPermaLink="false">http://eraserhead.net/?p=485</guid>
		<description><![CDATA[Context

Each release of your product has some unique aspect to it, for example an intended customer-specific configuration.
Releases of your product are frequently made which fail in some, though not necessarily always the same, downstream step.
Verifying correct operation of each build empirically is time consuming or costly.

Therefore

Write a program which is the simplest possible wrapper for [...]]]></description>
			<content:encoded><![CDATA[<h2>Context</h2>
<ul>
<li>Each release of your product has some unique aspect to it, for example an intended customer-specific configuration.
<li>Releases of your product are frequently made which fail in some, though not necessarily always the same, downstream step.
<li>Verifying correct operation of each build empirically is time consuming or costly.
</ul>
<h2>Therefore</h2>
<ol>
<li>Write a program which is the simplest possible wrapper for your release of the artifact consumed downstream.
<li>Each time a failure causes a flow interruption, modify the program to detect this problem with the artifact and fail loudly, refusing to produce the artifact.
</ol>
<h2>Discussion</h2>
<p>This pattern operates on the general principle that a shorter feedback loop for failures will have less negative effect on effort hours and throughput.  This is the same principle embodied by test-driven development applied in a slightly different context.  To build on the analogy, consider instituting a policy of adding the automated release check to your artifact-builder <em>before</em> correcting the downstream problem, and verifying the release check by attempting to release a new build without correcting the original problem.</p>
<p>This is a kind of test-driven development which is fed by downstream regressions.  It is an attempt to introduce a positive <a href="http://en.wikipedia.org/wiki/Ratchet_effect">rachet effect</a>.</p>
<p>If you do not have some unique aspect to each release, you could simply add unit tests which fail the build if in-repository artifacts are somehow inconsistent or incorrect.  Even though we don&#8217;t usually think to add unit tests to verify, say, properties of configuration files stored in the repository, these unit tests provide a tighter feedback loop than this pattern and should be preferred.</p>
<h2>Observed Instances</h2>
<h3>One</h3>
<p>We have a product where frequent, customer-specific releases are made to an independent QA department.  Two files are delivered, an installer exe and an ini file.  The ini file is read by the installer exe and causes the installer to install the correct components and install the proper configuration into the registry.  The install is a lengthy process (twenty minutes) on machines which have a lot of software installed, discouraging developers from running the installer.  Also, verifying correct operation requires setting up a protocol emulator which may not be available.</p>
<p>The ini file layout is very brittle.  It contains many options which must be consistent with other options.  There are also many options which must be specified for every component in the configuration.  Yet other options can cause some other options to be ignored entirely.  The install itself rarely fails, it leaves the machine configured in an unusable state instead.</p>
<p>A significant portion of my time was spent in the QA lab troubleshooting failed installs.  When I first started maintaining this software, it seemed like one third of a typical day might be spent in the QA lab.  Since QA is on an isolated network, I went through many thumb drives, not remembering which machine I had last left it in.</p>
<p>I wrote a wrapper for building the install after reading the ini file.  This also had the benefit of allowing us to remove unused components from an install.  For each failure found in QA, I made it fail loudly and abort before building an install if the problem was detected with the ini file.</p>
<p>I haven&#8217;t been in the QA lab in more than four months.  I have kept the same thumb drive for perhaps a year, though I&#8217;m no longer sure what&#8217;s on it.</p>
<p>This has had an unexpected compounding positive effect:  The most likely causes of an install failing are now either procedural or due to configuration changes made for testing in QA.  Previously, the most likely cause of an install failing was that it had been packaged incorrectly.  As a result of this shift, development is no longer the first on the scene of a failed install.  Instead, the techs responsible for deploying the software to the customer handle most QA installation issues.</p>
<p>It might seem that a more fundamental problem in this occurrence is the brittleness of the configuration format, that it admits self-inconsistency.  This is probably true; however, I could not determine a way to re-engineering the format piecemeal, and customer commitments (as well as time logged in the QA lab!) made such a large project unlikely on a maintenance-mode product.  Also, the current installer has all sorts of difficult-to-understand logic with undocumented intent.  This solution was truly cheap to get running.</p>
]]></content:encoded>
			<wfw:commentRss>http://eraserhead.net/2010/03/automate-release-checks/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
