<?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>Hey, it&#039;s OPOWER! &#187; Development</title>
	<atom:link href="http://www.heyitsopower.com/category/development/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.heyitsopower.com</link>
	<description>Energy Efficiency Starts at /usr/home</description>
	<lastBuildDate>Tue, 27 Jul 2010 20:14:37 +0000</lastBuildDate>
	
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Maven-izing Google&#8217;s Data Client Java Library</title>
		<link>http://www.heyitsopower.com/development/maven-izing-googles-data-client-java-library/</link>
		<comments>http://www.heyitsopower.com/development/maven-izing-googles-data-client-java-library/#comments</comments>
		<pubDate>Tue, 27 Jul 2010 20:09:14 +0000</pubDate>
		<dc:creator>Tom Vaughan</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Maven]]></category>

		<guid isPermaLink="false">http://www.heyitsopower.com/?p=238</guid>
		<description><![CDATA[Quick and dirty perl script for mvn deploy:deploy-file for the 40+ JARs google ships in it java client bundle.]]></description>
			<content:encoded><![CDATA[<p>OPOWER&#8217;s first Innovation Day was a lot of fun.  I was waiting about 30 minutes for my primary project (building an AWS machine image for our hudson slave) to complete and I got sucked in to a different project involving automatically downloading google analytics for all the traffic on all the websites we host for our clients.</p>
<p>Clicking around google&#8217;s well-documented &#8220;get started&#8221; guides, it looked like they haven&#8217;t made their client JARs available in any MVN repos anywhere.  There is a (not-google-sponsored) source forge project that points to a sonatype repo, but instead of adding another 3rd party repo to our small but growing list, I figured it&#8217;d be easier for small proof of concept purposes to just manually install the google JARs in OPOWER&#8217;s repo (thereby making them accessible to all our developer&#8217;s boxes).</p>
<p>It quickly became clear that the number of JARs google ships with makes it faster and less error prone to script the mvn repo installation than doing manual command line copy &amp; pasting.  Lo, my gift to the world:</p>
<ul>
<li>Grab latest JARs from the &#8220;gdata-java&#8221; link here: <a href="http://code.google.com/p/gdata-java-client/downloads/list">http://code.google.com/p/gdata-java-client/downloads/list</a></li>
<li>Unzip on the server hosting your company&#8217;s mvn repo</li>
<li>cd down in to ./gdata/java/lib</li>
<li>Make a file &#8216;installall.pl&#8217; in that lib directory:</li>
<pre class="java">#!/usr/bin/perl -w

my @jars = `ls *.jar`;
chomp(@jars);
foreach my $jar (@jars) {
  if($jar =~ /(.*)-(\d\.\d)\.jar/) {
    my $cmd = "./install.pl --artifactId $1 --version $2 --jar $jar";
    open(CMD, "$cmd|") or die "Could not execute $cmd $!";
    while(&lt;CMD&gt;) {
       print $_;
    }
   close(CMD);
  }
}</pre>
<li>Still in that directory, make another file &#8216;install.pl&#8217;:</li>
<pre class="java">#!/usr/bin/perl -w

use strict;
use warnings;
use Getopt::Long;

sub usage();

my $artifactId;
my $version;
my $jar;
GetOptions('artifactId=s' =&gt; \$artifactId ,
           'version=s' =&gt; \$version,
           'jar' =&gt; \$jar);
die usage() unless ($artifactId &amp;&amp; $version &amp;&amp; $jar);

my $cmd = "mvn deploy:deploy-file " .
      "-DgroupId=com.google.gdata " .
      "-DartifactId=$artifactId " .
      "-Dversion=$version " .
      "-Dfile=$jar " .
      "-Dpackaging=jar " .
      "-DgeneratePom=true " .
      "-Durl=file:///opt/mvn_repo " .  &lt;---  change this for your env
      "-Drepository=opower_local";  &lt;--- change this for your env
print "executing command = $cmd\n";
$cmd = "date";
open(CMD, "$cmd|") or die "Could not exec $cmd $!";
while(&lt;CMD&gt;) {
    print $_;
}
close(CMD);

sub usage() {
    print "Usage: ./install.pl [--artifactId artifactId] [--version version] [--jar jarfile]\n";
    print "Example: ./install.pl --artifactId gdata-webmastertools --version 1.0 --jar gdata-webmastertools-1.0.jar\n";
    exit 1;
}</pre>
<li>Don&#8217;t forget to chmod 755 *.pl</li>
<li>Then just run ./installall.pl and all those google JARs should get installed in your repo</li>
</ul>
<p>That assumes the &#8220;mvn&#8221; executable was in your path and that you run the scripts from within the same directory as all the JARs, but it&#8217;s easily modified for whatever your situation may be.</p>
<p>Note that relative to ./lib there are 2 jars in ../deps/ that you should also install in your repo because the google JARs to avoid ClassNotFoundExceptions in some runtime code paths.</p>
<p>Once in, you should be able to boot strap a mvn client project against a Google Data source with a pom not too dissimilar from:</p>
<pre class="java">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"&gt;
  &lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;
  &lt;artifactId&gt;foo&lt;/artifactId&gt;
  &lt;packaging&gt;jar&lt;/packaging&gt;
  &lt;version&gt;1.0.0-SNAPSHOT&lt;/version&gt;
  &lt;name&gt;Google Client Example&lt;/name&gt;

  &lt;scm&gt;
    &lt;developerConnection&gt;foo&lt;/developerConnection&gt;
  &lt;/scm&gt;

  &lt;dependencies&gt;
    &lt;dependency&gt;
        &lt;groupId&gt;com.google.gdata&lt;/groupId&gt;
        &lt;artifactId&gt;gdata-core&lt;/artifactId&gt;
        &lt;version&gt;1.0&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
        &lt;groupId&gt;com.google.gdata&lt;/groupId&gt;
        &lt;artifactId&gt;gdata-analytics&lt;/artifactId&gt;
        &lt;version&gt;2.1&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
        &lt;groupId&gt;com.google.gdata&lt;/groupId&gt;
        &lt;artifactId&gt;gdata-client&lt;/artifactId&gt;
        &lt;version&gt;1.0&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
        &lt;groupId&gt;com.google&lt;/groupId&gt;
        &lt;artifactId&gt;google-collect&lt;/artifactId&gt;
        &lt;version&gt;1.0-rc1&lt;/version&gt;
    &lt;/dependency&gt;
  &lt;/dependencies&gt;
&lt;/project&gt;</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.heyitsopower.com/development/maven-izing-googles-data-client-java-library/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Heisenberg&#8217;s Key Performance Indicators</title>
		<link>http://www.heyitsopower.com/development/heisenbergs-key-performance-indicators/</link>
		<comments>http://www.heyitsopower.com/development/heisenbergs-key-performance-indicators/#comments</comments>
		<pubDate>Mon, 26 Jul 2010 20:13:49 +0000</pubDate>
		<dc:creator>Tom Vaughan</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Product]]></category>

		<guid isPermaLink="false">http://www.heyitsopower.com/?p=228</guid>
		<description><![CDATA[How do you objectively measure the progress of a software engineering team from iteration to iteration when they are so many variables (human and otherwise)?]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.heyitsopower.com/wordpress/home/35481/domains/heyitsopower.com/html/wordpress/wp-content/uploads/2010/07/Heisenberg.jpg"><img class="alignright size-medium wp-image-229" title="Heisenberg, when younger." src="http://www.heyitsopower.com/wordpress/home/35481/domains/heyitsopower.com/html/wordpress/wp-content/uploads/2010/07/Heisenberg-209x300.jpg" alt="A picture of Heisenberg." width="209" height="300" /></a>I was <span style="text-decoration: line-through;">trolling</span> trawling through reddit waiting for a JAR to compile and <a href="http://nerds-central.blogspot.com/2010/07/development-management-act-of.html">found this blog post</a>.  That blog made a couple claims that had crossed my mind a couple months ago when our engineering director solicited  feedback about using Key Performance Indicators for the dev team.  The blog post&#8217;s point wasn&#8217;t so much that the <em>act </em>of measuring a team changes its performance but rather that when the team is aware of what&#8217;s being measured, it naturally &#8220;cheats&#8221; in ways to maximize the measured value.  The first comment on the blog post alerted me to a law I hadn&#8217;t known about, but which sounds pretty intuitively correct:</p>
<p><a href="http://en.wikipedia.org/wiki/Goodhart%27s_law">Goodhart&#8217;s Law</a>: <em>Any observed statistical regularity will tend to collapse once pressure is placed upon it for control purposes</em></p>
<p>Here at OPOWER, developers and product managers don&#8217;t deal with KPIs on a day-to-day basis&#8230;.I think it&#8217;s mostly a management-level &#8220;let&#8217;s starting capturing some numbers over several months and see if there&#8217;s anything out-of-whack&#8221; kind of thing.</p>
<p>In terms of development KPIs, some of the things we thought it might be interesting to collect included:</p>
<ul>
<li>story points delivered per iteration</li>
<li>% of story points (aggregate) done in an iteration that were planned at the beginning</li>
<li>% QA coverage of production (automated)</li>
<li>etc.</li>
</ul>
<p>The &#8220;story points delivered per iteration&#8221; is, I think, precisely the kind of thing Goodhart was talking about when he made up his law.  <em>That said</em>, we are a business and we are expected to work and be productive, so it isn&#8217;t exactly a satisfying for a VP or CEO to hear from their dev team &#8220;sorry, you can&#8217;t measure us because we&#8217;ll just skew the measurement number to please you.&#8221;  So what&#8217;s management to do with their IT cabal?</p>
<p><em>Assuming</em> you could normalize what story points mean across different teams, and <em>assuming</em> you can account for &#8220;point inflation&#8221; and <em>assuming</em> you accurately tracked vacations and network outages and late requirements and all the other stuff that goes along with uncertainty in exactly how much gets delivered in an iteration, must you also assume that the team gradually skews the number to meet the goal?  What if the goal was kept secret?  What if the team didn&#8217;t know they were being measured?  That&#8217;s hardly a way to foster a healthy relationship between management and product development.<a href="http://www.heyitsopower.com/wordpress/home/35481/domains/heyitsopower.com/html/wordpress/wp-content/uploads/2010/07/heisenberg_bb.jpg"><img class="alignright size-full wp-image-230" title="Heisenberg, slightly older ;-)" src="http://www.heyitsopower.com/wordpress/home/35481/domains/heyitsopower.com/html/wordpress/wp-content/uploads/2010/07/heisenberg_bb.jpg" alt="A picture of Walt from Breaking Bad" width="160" height="247" /></a></p>
<p>One way around this dilemma is to find some totally objective metric in the software engineering process.  In other words, if you could apply KPIs to &#8220;number of sprockets coming off the assembly line such that each sprocket is within .1% tolerance,&#8221; what is a similar kind of thing in our iteration process we could measure?  I.e., one that doesn&#8217;t easily fall prey to inflation or manipulation?  If you can find something like that, lemme know.  Until then, I won&#8217;t be holding my breath.</p>
<p>Another possible option would be to go ahead and publicly measure highly subjective KPIs anyway and ask the measurees (us) to be as objective as possible when measuring.  I.e., fly in the face of Goodhart&#8217;s Law.  After all, it&#8217;s just a Law.  Like De Morgan&#8217;s Law, except maybe with a bit more wiggle room.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.heyitsopower.com/development/heisenbergs-key-performance-indicators/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Standing Desk</title>
		<link>http://www.heyitsopower.com/development/the-standing-desk/</link>
		<comments>http://www.heyitsopower.com/development/the-standing-desk/#comments</comments>
		<pubDate>Mon, 24 May 2010 15:25:31 +0000</pubDate>
		<dc:creator>Tom Vaughan</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[ergonomics]]></category>
		<category><![CDATA[standing desk]]></category>

		<guid isPermaLink="false">http://www.heyitsopower.com/?p=204</guid>
		<description><![CDATA[Dave, My OPOWER colleague switched from a normal office desk &#38; chair situation to a standing desk more than a year ago and ever since, I&#8217;d been considering doing the same.  For my entire programming career, I&#8217;ve had terrible posture in my chair and tended to do &#8220;the maxell pose&#8221; where my wrists are resting [...]]]></description>
			<content:encoded><![CDATA[<p>Dave, My OPOWER colleague switched from a normal office desk &amp; chair situation to a standing desk more than a year ago and ever since, I&#8217;d been considering doing the sa<a href="http://www.heyitsopower.com/wordpress/home/35481/domains/heyitsopower.com/html/wordpress/wp-content/uploads/2010/05/maxell_blown_away.jpg"><img class="alignright size-medium wp-image-207" title="maxell_blown_away" src="http://www.heyitsopower.com/wordpress/home/35481/domains/heyitsopower.com/html/wordpress/wp-content/uploads/2010/05/maxell_blown_away-300x199.jpg" alt="" width="300" height="199" /></a>me.  For my entire programming career, I&#8217;ve had terrible posture in my chair and tended to do &#8220;the maxell pose&#8221; where my wrists are resting at a severe angle on the lip of my desk.</p>
<p>There have been a couple articles recently about the effects of sitting in a chair all day that pushed me to action.  This <a href="http://www.businessweek.com/magazine/content/10_19/b4177071221162.htm" target="_blank">article from business week</a> was particularly eye opening.</p>
<p>OPOWER is super cool about empowering developers to be more productive/comfortable/happy/etc so getting approval for expensing some generic Ikea furniture was as easy as a head nod.  A couple weekends ago, I drove down to Ikea and picked up an <a href="http://www.ikea.com/us/en/catalog/products/S49843462">Utby desk</a> for about $100 and an <a href="http://www.ikea.com/us/en/catalog/products/90167477">Ekby Viktor</a> shelf with <a href="http://www.ikea.com/us/en/catalog/products/00054564">Capita</a> legs for another $20 or so.  I didn&#8217;t think the desk by itself was going to be quite at the recommended elbow height, so I swung by Home Depot and got 4 cinder blocks too.</p>
<p>I ended up putting a stack of paper between my monitor and the shelf to really get it up at eye level and I&#8217;m pretty happy with the way it turned out:</p>
<p><a href="http://www.heyitsopower.com/wordpress/home/35481/domains/heyitsopower.com/html/wordpress/wp-content/uploads/2010/05/standing_desk_tom.jpg"><img class="aligncenter size-medium wp-image-205" title="standing_desk_tom" src="http://www.heyitsopower.com/wordpress/home/35481/domains/heyitsopower.com/html/wordpress/wp-content/uploads/2010/05/standing_desk_tom-225x300.jpg" alt="Me enjoying my new standing desk." width="225" height="300" /></a></p>
<p>Dave&#8217;s setup is very similar, but he seems to like focusing <em>down</em> on his single screen whereas I like having a couple monitors at different focus points where I can physically distinguish tasks (documentation, music, images on my laptop off to the side and development tasks on the main monitor straight ahead).</p>
<div id="attachment_206" class="wp-caption aligncenter" style="width: 235px"><a href="http://www.heyitsopower.com/wordpress/home/35481/domains/heyitsopower.com/html/wordpress/wp-content/uploads/2010/05/standing_desk_dave.jpg"><img class="size-medium wp-image-206" title="standing_desk_dave" src="http://www.heyitsopower.com/wordpress/home/35481/domains/heyitsopower.com/html/wordpress/wp-content/uploads/2010/05/standing_desk_dave-225x300.jpg" alt="Dave at his standing desk" width="225" height="300" /></a><p class="wp-caption-text">Dave at his standing desk</p></div>
<p>It&#8217;s been a couple weeks since I switched and I can draw the following conclusions so far:</p>
<ul>
<li>Your feet hurt like a sonofabitch at the end of 8, 9, 10 hours if you&#8217;re not used to standing that whole time</li>
<li>A little bar stool or some off-the-floor step helps a lot in shifting your weight around so you&#8217;re not always bearing down on both heels</li>
<li>My back feels a ton better</li>
<li>I <em>feel</em> more productive (though I don&#8217;t know empirically if I actually am) because (a) I feel really focused on the monitor right in front of me &#8212; more so than when sitting down and (b) I&#8217;m a little more self-conscious of my screen being visible to everyone walking by, so I suspect I&#8217;ve got a higher percentage of work-related stuff on my screen at all times than I did before.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.heyitsopower.com/development/the-standing-desk/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Slides on Improving Your Agile Development Process</title>
		<link>http://www.heyitsopower.com/development/slides-on-improving-your-agile-development-process/</link>
		<comments>http://www.heyitsopower.com/development/slides-on-improving-your-agile-development-process/#comments</comments>
		<pubDate>Thu, 29 Oct 2009 17:32:40 +0000</pubDate>
		<dc:creator>Dave Copeland</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Workflow]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[devdays]]></category>
		<category><![CDATA[process improvement]]></category>

		<guid isPermaLink="false">http://www.heyitsopower.com/?p=131</guid>
		<description><![CDATA[Dead last, after the headline act, and after Joel Spolsky told everyone to go home, I did a lightning talk at DC&#8217;s recent DevDays (A StackOverflow production) on how we have used process metrics from our bug tracker to improve our process.
Improving your Agile Process
View more documents from David Copeland.

]]></description>
			<content:encoded><![CDATA[<p>Dead last, after the headline act, and after Joel Spolsky told everyone to go home, I did a lightning talk at DC&#8217;s recent DevDays (<a href="http://www.stackoverflow.com">A StackOverflow</a> production) on how we have used <a href="/development/measuring-our-awesomeness-iteration-by-iteration/">process metrics</a> from our bug tracker to improve our process.</p>
<div id="__ss_2359457" style="width: 425px; text-align: left;"><a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" title="Improving your Agile Process" href="http://www.slideshare.net/davetron5000/measuring-agile-process-shorter-2359457">Improving your Agile Process</a><object style="margin:0px" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="355" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=measuringagileprocess-shorter-091027130310-phpapp01&amp;rel=0&amp;stripped_title=measuring-agile-process-shorter-2359457" /><param name="allowfullscreen" value="true" /><embed style="margin:0px" type="application/x-shockwave-flash" width="425" height="355" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=measuringagileprocess-shorter-091027130310-phpapp01&amp;rel=0&amp;stripped_title=measuring-agile-process-shorter-2359457" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;">View more <a style="text-decoration:underline;" href="http://www.slideshare.net/">documents</a> from <a style="text-decoration:underline;" href="http://www.slideshare.net/davetron5000">David Copeland</a>.</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.heyitsopower.com/development/slides-on-improving-your-agile-development-process/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tweaking the Agile Calendar</title>
		<link>http://www.heyitsopower.com/development/tweaking-the-agile-calendar/</link>
		<comments>http://www.heyitsopower.com/development/tweaking-the-agile-calendar/#comments</comments>
		<pubDate>Thu, 15 Oct 2009 16:24:57 +0000</pubDate>
		<dc:creator>Tom Vaughan</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Workflow]]></category>

		<guid isPermaLink="false">http://www.heyitsopower.com/?p=100</guid>
		<description><![CDATA[For the first five iterations, the dev team had been following this schedule:
<ul>
	<li>Iteration N, Week 1 = Design for iteration N and 2nd week of QA for iteration N-1</li>
	<li>Iteration N, Week 2 = Development</li>
	<li>Iteration N, Week 3 = Development</li>
	<li>Iteration N, Week 4 = 1st week of QA for iteration N</li>
	<li>Iteration N, Week 5 / Iteration N +1, Week 1 = 2nd week of QA for iteration N, design for iteration N + 1</li>
</ul>
We started to notice a couple things that have caused us to try out a new schedule in our upcoming 6th iteration.]]></description>
			<content:encoded><![CDATA[<p>For the first five iterations, the dev team had been following this schedule:</p>
<ul>
<li>Iteration N, Week 1 = Design for iteration N and 2nd week of QA for iteration N-1</li>
<li>Iteration N, Week 2 = Development</li>
<li>Iteration N, Week 3 = Development</li>
<li>Iteration N, Week 4 = 1st week of QA for iteration N</li>
<li>Iteration N, Week 5 / Iteration N +1, Week 1 = 2nd week of QA for iteration N, design for iteration N + 1</li>
</ul>
<p>We started to notice a couple things that have caused us to try out a new schedule in our upcoming 6th iteration.</p>
<p>First, we realized that we left very little time for fit to hit the shan.  If we had a tough QA cycle, we didn&#8217;t design enough.  If we didn&#8217;t design enough, we underestimated how much development would be needed (i.e. too many story points).  If we had too many story points, we&#8217;d go in to QA late.  And the cycle repeats.</p>
<p>Note that many of you Agile purists out there will cringe at the above description, especially this sentence: &#8220;If we had too many story points, we&#8217;d go in to QA late.&#8221;</p>
<p>I know.  We cringed too.</p>
<p>We&#8217;re committing to a couple new explicit practices going in to our next iterations:</p>
<ol>
<li>More formal velocity check-ins.  If less than 50% of our story points are closed by COB of the first Friday, we should have a come-to-jeebus meeting on Monday morning.</li>
<li>We absolutely need to respect the impact that dedicated design time has on the effectiveness of everything down-stream.  It&#8217;s too easy to say &#8220;Agile&#8221; as a synonym for &#8220;code by the seat of your pants,&#8221; but that&#8217;s not what it&#8217;s about and we know that.  We just need to get better at dedicating time to it.</li>
</ol>
<p>So with those ideas in mind, we&#8217;re moving to something like the following:</p>
<p><img class="aligncenter size-full wp-image-107" title="iteration_detail_screenprint_cropped" src="http://www.heyitsopower.com/wordpress/home/35481/domains/heyitsopower.com/html/wordpress/wp-content/uploads/2009/10/iteration_detail_screenprint_cropped.PNG" alt="iteration_detail_screenprint_cropped" width="1050" height="246" /></p>
<p>It&#8217;s a five-week iteration, with 2 solid weeks built in for QA and 1 dedicated week of design.</p>
<p>I think if we can get to a point where our regression and automation testing is good enough (and we develop enough confidence our automated tests), that we may be able to get back to a 4 week cycle.  In the mean time, we&#8217;re going to see if we can actually go faster by slowing down.</p>
<p>Stay tuned!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.heyitsopower.com/development/tweaking-the-agile-calendar/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Agile impressions, 5 iterations in&#8230;</title>
		<link>http://www.heyitsopower.com/development/agile-impressions-5-iterations-in/</link>
		<comments>http://www.heyitsopower.com/development/agile-impressions-5-iterations-in/#comments</comments>
		<pubDate>Thu, 15 Oct 2009 15:45:38 +0000</pubDate>
		<dc:creator>Tom Vaughan</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Workflow]]></category>

		<guid isPermaLink="false">http://www.heyitsopower.com/?p=92</guid>
		<description><![CDATA[I'm assuming from the amount of hype out there that if a development team isn't using "Agile" right now, they probably feel like the one kid on the block who didn't have a Nintendo (with the Duck Hunt option, of course).

<img class="alignright size-medium wp-image-93" title="duckhunt" src="http://www.heyitsopower.com/wordpress/home/35481/domains/heyitsopower.com/html/wordpress/wp-content/uploads/2009/10/duckhunt-300x165.png" alt="duckhunt" width="300" height="165" />Well, we here at OPOWER loved our Duck Hunt, so we've been attempting to use "Agile" for the last 5 months or so.  Agile means a lot of things to a lot of people, so I'll spell out what it means for us and then reflect on some of the pros, cons, and room-for-improvement in our practice.]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m assuming from the amount of hype out there that if a development team isn&#8217;t using &#8220;Agile&#8221; right now, they probably feel like the one kid on the block who didn&#8217;t have a Nintendo (with the Duck Hunt option, of course).</p>
<p><img class="alignright size-medium wp-image-93" title="duckhunt" src="http://www.heyitsopower.com/wordpress/home/35481/domains/heyitsopower.com/html/wordpress/wp-content/uploads/2009/10/duckhunt-300x165.png" alt="duckhunt" width="300" height="165" />Well, we here at OPOWER loved our Duck Hunt, so we&#8217;ve been attempting to use &#8220;Agile&#8221; for the last 5 months or so.  Agile means a lot of things to a lot of people, so I&#8217;ll spell out what it means for us and then reflect on some of the pros, cons, and room-for-improvement in our practice.</p>
<ul>
<li>&lt;cringe&gt;Embrace change&lt;/cringe&gt; (duh)&#8230;but especially in this startup environment, we need to remember to do no more than is necessary, because any &#8220;extra mile&#8221; functionality is likely to be totally unused as priorities and direction changes.</li>
<li>Be scientific about development&#8230;<a href="/development/measuring-our-awesomeness-iteration-by-iteration/">measure, measure measure</a>.  We track velocities, average-open-days-per-bug-by-severity, etc.</li>
<li>&#8220;Individuals and interactions over processes and tools&#8221;&#8230;we self-organize, aren&#8217;t afraid to try new combinations of responsibilities and assignments, provide regular feedback to each other and we don&#8217;t dictate a development environment or technology stack.</li>
</ul>
<p>The best thing about the technical side of this company is that the entire development team and project management team is on-board with the idea of rapid iterations, continuous improvement and a focus on technical excellent and &#8220;maximizing the amount of work not done.&#8221;</p>
<p>This manifests itself in several practices that I&#8217;d chalk up in the &#8220;pro&#8221; column:</p>
<ul>
<li>Light weight documentation&#8230;use wikis and person-to-person contact (recorded on bug tickets for posterity) to flush out designs and requirement.</li>
<li>Continuous integration and continuous improvement (we just installed Sonar last week&#8230;we&#8217;ll blog about its effectiveness later)</li>
<li>Regular code reviews, 360 reviews, and &#8220;how did we collectively perform this iteration&#8221; meetings</li>
<li>Few formal meetings, many informal, impromptu &#8220;drive bys&#8221;</li>
</ul>
<p><strong>But the best thing about our Agile environment</strong> right now is that it is a work-in-progress &#8220;process framework&#8221; that repeats quickly enough for us to remember what to improve.</p>
<p>What do I mean by that?</p>
<p>It&#8217;s my impression that on the longer, more drawn-out software engagements (say&#8230;6 or 12 months), you can make a series of mistakes in the design phase, the build phase, the qa phase, etc. and then by the time you&#8217;re on the next project you repeat all those mistakes again because it&#8217;s been 6 or 12 months since you last learned your lesson.  Instead of concrete lessons, you develop a career full of &#8220;gut instincts.&#8221;</p>
<p>We&#8217;re still honing in on the right amount of measurement and process for OPOWER, but because we&#8217;re all on board with the idea of quick-hit iterations with a continuous focus on improvement, I have high hopes for our ability to become (stay?) a top-notch software engineering organization.</p>
<p><img class="alignleft size-medium wp-image-95" title="duckhunt_many" src="http://www.heyitsopower.com/wordpress/home/35481/domains/heyitsopower.com/html/wordpress/wp-content/uploads/2009/10/duckhunt_many-300x213.png" alt="duckhunt_many" width="300" height="213" />There&#8217;s lots of room for improvement, that I think I&#8217;ll save for another post on another day.  We could definitely stand to &#8220;communicate out&#8221; more&#8211; with the product team and with our operations team.  We need to do a better job of making sure our iterations are lining up with the corporate strategy.  We could improve on the whole &#8220;customer collaboration over contract negotiation&#8221; part of the manifesto.  But you can only squeeze that trigger so fast, right?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.heyitsopower.com/development/agile-impressions-5-iterations-in/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Move meetings to move developers</title>
		<link>http://www.heyitsopower.com/development/move-meetings-to-move-developers/</link>
		<comments>http://www.heyitsopower.com/development/move-meetings-to-move-developers/#comments</comments>
		<pubDate>Fri, 28 Aug 2009 15:08:35 +0000</pubDate>
		<dc:creator>Tom Vaughan</dc:creator>
				<category><![CDATA[Best Practice]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[concentration]]></category>
		<category><![CDATA[meetings]]></category>
		<category><![CDATA[procrastination]]></category>

		<guid isPermaLink="false">http://www.heyitsopower.com/?p=55</guid>
		<description><![CDATA[Here's the scenario:

You cruise in to the office at 8:45, get your coffee, check the reddits, and ignore that email from your parents asking if their computer picked up a virus because McAfee won't stop popping up a tooltray icon helpfully informing them that they're totally vulnerable.  Right around 9:15, you get motivated to tackle that 2 point user story for the current iteration.

You head over to the wiki, check out the specs for the requirement, find out what the Trac ticket number is and see if there are any comments with last minute advice or dependencies.  None?  Good. . . let's get started!]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s the scenario:</p>
<p>You cruise in to the office at 8:45, get your coffee, check the reddits, and ignore that email from your parents asking if their computer picked up a virus because McAfee won&#8217;t stop popping up a tooltray icon helpfully informing them that they&#8217;re totally vulnerable.  Right around 9:15, you get motivated to tackle that 2 point user story for the current iteration.</p>
<p>You head over to the wiki, check out the specs for the requirement, find out what the Trac ticket number is and see if there are any comments with last minute advice or dependencies.  None?  Good. . . let&#8217;s get started!</p>
<p>Oh, huh. . . it&#8217;s 9:40.  There&#8217;s that all-hands meeting at 10 o&#8217;clock.  I <em>could</em> get started, but I&#8217;m not really going to get anything done in 20 minutes really&#8230;.and that link to the <a href="http://www.buzzfeed.com/akdobbins/three-keyboard-cat-moon-shirt">keyboard-cat-three-wolf-t-shirt</a> <em>did</em> look interesting.</p>
<p>The 10 o&#8217;clock meeting runs a little long, and then there&#8217;s the lunch train, and suddenly it&#8217;s the afternoon and you haven&#8217;t been in The Zone once.</p>
<p><strong>The Zone</strong></p>
<p>We&#8217;ve all been in The Zone &#8211; that magical place where time appears to stop and you rock out an insane amount of code in what seems like 10 minutes, but when you look up from your keyboard the sun is down and the cleaning crew is giving you a weird look because you didn&#8217;t realize you were trying to sing along to Sigur Ros.</p>
<p>Trying to force yourself into The Zone is like trying to force yourself to see through those <a href="http://cdn-write.demandstudios.com/upload//0000/000/90/4/94.gif">stereograms</a> (hint: it&#8217;s always a Schooner).  And as hard as it is to get <em>in</em> The Zone, it&#8217;s annoying easily to get <em>out</em> of The Zone.</p>
<p>There are a lot of recommendations out there to help create &#8220;zone-friendly&#8221; work places including:</p>
<ul>
<li>separate offices</li>
<li>ambient music</li>
<li>leaving something intentionally broken the night before to give you that excuse to dive in the next morning</li>
<li><a href="http://cdn-write.demandstudios.com/upload//0000/000/90/4/94.gif">shift your tasks to the upper right</a></li>
<li><a href="http://www.paulgraham.com/makersschedule.html">Paul Graham&#8217;s thoughts</a> on the matter</li>
<li>etc. etc.</li>
</ul>
<p>We were wrapping up our all-hands meeting yesterday when the ever-perceptive Dave noted that our weekly meeting schedules were really not all that Zone-Friendly.  With a couple of exceptions, we had standing meetings along the following schedule:<br />
<img src="http://www.heyitsopower.com/wordpress/wp-content/uploads/2009/08/zone_unfriendly.png" alt="Standing Meetings" /></p>
<p>And keep in mind, that&#8217;s just the standing meetings, so it&#8217;s the bare-minimum one would expect.  Now let&#8217;s add some &#8220;procrastination shading&#8221; to that calendar to demonstrate the actual standing meeting impact:<br />
<img src="http://www.heyitsopower.com/wordpress/wp-content/uploads/2009/08/zone_unfriendly_shaded.png" alt="Standing Meetings" /></p>
<p>If we shuffled some meetings around (especially around the meat of the middle of the week), I think we could end up &#8220;finding&#8221; 2 or 3 hours a week more conducive to The Zone:<br />
<img src="http://www.heyitsopower.com/wordpress/wp-content/uploads/2009/08/zone_friendly_shaded.png" alt="Friendly Standing Meetings" /></p>
<p>Of course, this is an idealized example, but it&#8217;s something we&#8217;re thinking about and playing with.</p>
<p>What do you guys out there in development land do?  Any recommendations of particular effectiveness?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.heyitsopower.com/development/move-meetings-to-move-developers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>New Developer Law</title>
		<link>http://www.heyitsopower.com/development/new-developer-law/</link>
		<comments>http://www.heyitsopower.com/development/new-developer-law/#comments</comments>
		<pubDate>Wed, 26 Aug 2009 14:06:25 +0000</pubDate>
		<dc:creator>Tom Vaughan</dc:creator>
				<category><![CDATA[Best Practice]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://www.heyitsopower.com/?p=34</guid>
		<description><![CDATA[NEW LAW FOR DEVELOPERS:

If you throw an exception about some connection being refused, you'd better damn well put what connection you were attempting to make in the exception message.

What inspired this law?  Thanks for asking.]]></description>
			<content:encoded><![CDATA[<p>NEW LAW FOR DEVELOPERS:</p>
<p><em>If you throw an exception about some connection being refused, you&#8217;d better damn well put what connection you were attempting to make in the exception message.</em></p>
<p>What inspired this law?  Thanks for asking.</p>
<p>Check out this snippet in the middle of an 80 line stack dump:</p>
<pre>2009-08-25 17:23:42.373::WARN:  Nested in org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'coreAutopatcher' defined in class path resource [config/migrationContext.xml]: Invocation of init method failed; nested exception is com.tacitknowledge.util.migration.MigrationException: Error applying patches:
com.mchange.v2.resourcepool.CannotAcquireResourceException: A ResourcePool could not acquire a resource from its primary factory or source.
at com.mchange.v2.resourcepool.BasicResourcePool.awaitAvailable(BasicResourcePool.java:1319)
at com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:557)
at com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:477)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:525)</pre>
<p>&#8220;A ResourcePool could not acquire a resource from its primary factory or source&#8221;.  Awesome.  Sooo helpful.  /wristsemoragegrowl</p>
<p>Also, a WARN?  Seriously?  You&#8217;re a connection pool.  Do you think not connecting to your underlying datasource warrants maybe something as stern as an ERROR?  Or, heaven forbid, a FATAL?</p>
<p>I&#8217;m sure I could have turned up logging somewhere, but I noticed Spring&#8217;s DelegatingDataSource bean standing out from among the stack lines and set a break point on its called method to figure out exactly which of my many connections was unable to be resolved:</p>
<p><img class="aligncenter size-full wp-image-37" title="what_am_i_connecting_to" src="http://www.heyitsopower.com/wordpress/wp-content/uploads/2009/08/what_am_i_connecting_to.png" alt="what_am_i_connecting_to" width="909" height="307" /></p>
<p>There&#8217;s the culprit!  localhost:5455.  You know, whoever the idiot is who runs that localhost server needs to get his act together.  I should call the guys from YouTube and have them do a Maury Povich-style video expose on why he can&#8217;t keep any of his connections stable.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.heyitsopower.com/development/new-developer-law/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Subversion Branching &#8220;Good&#8221; Practice</title>
		<link>http://www.heyitsopower.com/development/subversion-branching-good-practice/</link>
		<comments>http://www.heyitsopower.com/development/subversion-branching-good-practice/#comments</comments>
		<pubDate>Mon, 24 Aug 2009 00:56:52 +0000</pubDate>
		<dc:creator>Jeff Kolesky</dc:creator>
				<category><![CDATA[Best Practice]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[branching]]></category>
		<category><![CDATA[subversion]]></category>

		<guid isPermaLink="false">http://www.heyitsopower.com/?p=18</guid>
		<description><![CDATA[I am relatively new to Subversion — well, two years into using it now, but this is the first project I have used it on.  Subversion, like any tool, has its quirks and works best when you really know how to use it.  When I started, I treated the "trunk/branches/tags" directory structure exactly like a directory structure.  It took me a little playing around until I stumbled on what I would call a best practice.  When I checkout a new project, I do it like so:

svn co http://domain.com/svnroot/project/trunk project

That way, when I go to the project directory, I do not have to then go into the trunk directory to get to my files.]]></description>
			<content:encoded><![CDATA[<p>I am relatively new to Subversion — well, two years into using it now, but this is the first project I have used it on.  Subversion, like any tool, has its quirks and works best when you really know how to use it.  When I started, I treated the &#8220;trunk/branches/tags&#8221; directory structure exactly like a directory structure.  It took me a little playing around until I stumbled on what I would call a best practice.  When I checkout a new project, I do it like so:</p>
<p><code>svn co http://domain.com/svnroot/project/trunk project</code></p>
<p>That way, when I go to the <code>project</code> directory, I do not have to then go into the <code>trunk</code> directory to get to my files.  Saving an extra directory level is not the best benefit though.  When I set up my IDE (yes, I use an IDE), I put the IDE files in that one directory and do not have to recreate them for each branch or tag that I might check out.  I essentially treat the &#8220;trunk/branches/tags&#8221; part of the directory as pure metadata, which makes perfect sense to me.</p>
<p>When I switched over to this system, there was one big drawback.  I could not easily tell where I am just by looking at my prompt.  I had to run <code>svn info | grep URL</code> to see if I was on a branch.  So instead of letting my prompt handicap me, I decided to get smart about my prompt.  Using bash, my prompt used to look like this:</p>
<p><code>jeff:/opt/pose/main/report/src/main/java</code></p>
<p>but now it looks like this (supercharged with Subversion metadata):</p>
<p><code>jeff:/opt/pose/main/report/src/main/java [SVN: /main/report/trunk]</code></p>
<p>I&#8217;m no bash expert, so I dug around on the web and learned a bit about how <code>PROMPT_COMMAND</code> works.  Here is what I have in my <code>.bash_profile</code> now:</p>
<p><code><br />
function spwd ()<br />
{<br />
    stat .svn > /dev/null 2>&#038;1;<br />
    if [ "$?" == "0" ]; then<br />
        SURL=`svn info | grep URL | perl -pe 's/URL: (.*)/\1/'`;<br />
        if [ `echo ${SURL} | grep -E "branches|tags"` ]; then<br />
            SVER=`echo ${SURL} | perl -pe 's{.*/(branches|tags)/(.*)}{\1/\2}' | cut -d/ -f1-2`;<br />
            SPTH=`echo ${SURL} | perl -pe 's{.*svnroot/(.*)/(branches|tags)/.*}{/\1}'`;<br />
            SPWD="${SPTH}/${SVER}";<br />
        else<br />
            SPWD=`echo ${SURL} | perl -pe 's{.*svnroot/(.*)/trunk(.*)}{/\1/trunk}'`;<br />
        fi;<br />
        export PS1="\u:\w [SVN: $SPWD]\n$ ";<br />
    else<br />
        export PS1="\u:\w $ ";<br />
    fi<br />
}<br />
export PROMPT_COMMAND=spwd<br />
</code></p>
<p>It may not be the most efficient way to do it, but it sure works well and lets me know in an instant what trunk, branch or tag I happen to be working on at that very moment.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.heyitsopower.com/development/subversion-branching-good-practice/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Cheated Frogs of Vim</title>
		<link>http://www.heyitsopower.com/culture/the-cheated-frogs-of-vim/</link>
		<comments>http://www.heyitsopower.com/culture/the-cheated-frogs-of-vim/#comments</comments>
		<pubDate>Thu, 20 Aug 2009 14:00:30 +0000</pubDate>
		<dc:creator>Tom Vaughan</dc:creator>
				<category><![CDATA[Culture]]></category>
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://www.heyitsopower.com/?p=26</guid>
		<description><![CDATA[We're still too small of a company to have more than 1 or 2 logical groupings of the development team, and before today they've been basically "the web team" and "everyone else."  Of course, there's a lot of cross-pollination and everything nowadays ultimately manifests itself somehow as "'web".

Still, the "everyone else" paint brush was wearing thin.  In addition to the "web team", we had "the scale team" (a.k.a "Ops R&#038;D") and "the AMI team" and "the core team" and "the report team". . .but most of those were "teams" averaged size 1 and their membership varied from iteration-to-iteration.]]></description>
			<content:encoded><![CDATA[<p>We&#8217;re still too small of a company to have more than 1 or 2 logical groupings of the development team, and before today they&#8217;ve been basically &#8220;the web team&#8221; and &#8220;everyone else.&#8221;  Of course, there&#8217;s a lot of cross-pollination and everything nowadays ultimately manifests itself somehow as &#8220;&#8216;web&#8221;.</p>
<p>Still, the &#8220;everyone else&#8221; paint brush was wearing thin.  In addition to the &#8220;web team&#8221;, we had &#8220;the scale team&#8221; (a.k.a &#8220;Ops R&amp;D&#8221;) and &#8220;the AMI team&#8221; and &#8220;the core team&#8221; and &#8220;the report team&#8221;. . .but most of those were &#8220;teams&#8221; averaged size 1 and their membership varied from iteration-to-iteration.</p>
<p>Sick of referring to ourselves with a hand-wave and a &#8220;you-know. . .the non-web-team,&#8221; I plugged our names in to an acronym engine and we found the perfect name for ourselves:</p>
<p><strong><em>The Cheated Frogs of Vim</em></strong></p>
<p>While I put in my fair share of vi time in previous development gigs, I&#8217;m a little too fond of modern debuggers to go whole-hog with Vim as my &#8220;IDE.&#8221;  Dave, on the other hand, is pretty hard-core with his Vim skills, so our new team name may have some sticking power.</p>
<p>Our wizard graphics guy even cooked up a logo for us:</p>
<div id="attachment_27" class="wp-caption aligncenter" style="width: 310px"><img class="size-medium wp-image-27" title="CheatedFrogs" src="http://www.heyitsopower.com/wordpress/wp-content/uploads/2009/08/CheatedFrogs-300x300.png" alt="New dev team logo!" width="300" height="300" /><p class="wp-caption-text">New dev team logo!</p></div>
]]></content:encoded>
			<wfw:commentRss>http://www.heyitsopower.com/culture/the-cheated-frogs-of-vim/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
