<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/2.3.1" -->
<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/"
	>

<channel>
	<title>Constructing Software</title>
	<link>http://constructingsoftware.com</link>
	<description>thoughts on software construction</description>
	<pubDate>Thu, 03 Jul 2008 20:11:45 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.3.1</generator>
	<language>en</language>
			<item>
		<title>Even Faster Web Sites</title>
		<link>http://constructingsoftware.com/2008/07/03/even-faster-web-sites/</link>
		<comments>http://constructingsoftware.com/2008/07/03/even-faster-web-sites/#comments</comments>
		<pubDate>Thu, 03 Jul 2008 20:11:45 +0000</pubDate>
		<dc:creator>Zach Scott</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[performance]]></category>

		<category><![CDATA[steve souders]]></category>

		<category><![CDATA[user experience]]></category>

		<guid isPermaLink="false">http://constructingsoftware.com/2008/07/03/even-faster-web-sites/</guid>
		<description><![CDATA[To create a great user experience there is almost nothing more important than speed.  According to Steve Souders, an expert in this area, 80-90% of the end-user response time is spent on the front-end.
Here is the list of best practices he recommends:

Make fewer HTTP requests
Use a CDN
Add an Expires header
Gzip components
Put stylesheets at the [...]]]></description>
			<content:encoded><![CDATA[<p>To create a great user experience there is almost nothing more important than speed.  According to Steve Souders, an expert in this area, 80-90% of the end-user response time is spent on the front-end.</p>
<p>Here is the list of best practices he recommends:</p>
<ol>
<li>Make fewer HTTP requests</li>
<li>Use a CDN</li>
<li>Add an Expires header</li>
<li>Gzip components</li>
<li>Put stylesheets at the top</li>
<li>Put scripts at the bottom</li>
<li>Avoid CSS expressions</li>
<li>Make JS and CSS external</li>
<li>Reduce DNS lookups</li>
<li>Minify JS</li>
<li>Avoid redirects</li>
<li>Remove duplicate scripts</li>
<li>Configure ETags</li>
<li>Make AJAX cacheable</li>
</ol>
<p>Watch this Video of Steve&#8217;s talk at the recent Google I/O conference:</p>
<p><a href="http://sites.google.com/site/io/even-faster-web-sites">Even Faster Web Sites (Google I/O Session Videos and Slides)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://constructingsoftware.com/2008/07/03/even-faster-web-sites/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Dear Commodore 64: Thanks for getting me started.</title>
		<link>http://constructingsoftware.com/2008/03/22/dear-commodore-64-thanks-for-getting-me-started/</link>
		<comments>http://constructingsoftware.com/2008/03/22/dear-commodore-64-thanks-for-getting-me-started/#comments</comments>
		<pubDate>Sat, 22 Mar 2008 16:47:24 +0000</pubDate>
		<dc:creator>Zach Scott</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[commodore 64]]></category>

		<guid isPermaLink="false">http://constructingsoftware.com/2008/03/22/dear-commodore-64-thanks-for-getting-me-started/</guid>
		<description><![CDATA[I can&#8217;t remember what bizzare series of clicks lead me there, but I just discovered an online copy of the original C-64 manual.  I flipped through it and relived all the emotions of entering and running every single one of the programs in it. I was 10 years old. One of my favorites was the [...]]]></description>
			<content:encoded><![CDATA[<p>I can&#8217;t remember what bizzare series of clicks lead me there, but I just discovered an online copy of the original C-64 manual.  I flipped through it and relived all the emotions of entering and running every single one of the programs in it. I was 10 years old. One of my favorites was the bouncing ball program in Section 4 - Animation on pg. 30.</p>
<p><a href="http://www.scribd.com/doc/40437/Commodore-64-Users-Guide" title="Commodore 64 Users Guide" target="_blank">http://www.scribd.com/doc/40437/Commodore-64-Users-Guide</a></p>
]]></content:encoded>
			<wfw:commentRss>http://constructingsoftware.com/2008/03/22/dear-commodore-64-thanks-for-getting-me-started/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Python up front. Java in the back.</title>
		<link>http://constructingsoftware.com/2008/03/03/python-up-front-java-in-the-back/</link>
		<comments>http://constructingsoftware.com/2008/03/03/python-up-front-java-in-the-back/#comments</comments>
		<pubDate>Mon, 03 Mar 2008 22:47:25 +0000</pubDate>
		<dc:creator>Zach Scott</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[Java]]></category>

		<category><![CDATA[python]]></category>

		<category><![CDATA[sun]]></category>

		<guid isPermaLink="false">http://constructingsoftware.com/2008/03/03/python-up-front-java-in-the-back/</guid>
		<description><![CDATA[I&#8217;ve always thought that the ideal web development platform would be comprised of a dynamically typed language in the presentation tier supported by a statically typed language where the business and persistence logic lives. It just never made sense to me to use a statically typed language for building web user-interfaces considering that there&#8217;s very little [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve always thought that the ideal web development platform would be comprised of a dynamically typed language in the presentation tier supported by a statically typed language where the business and persistence logic lives. It just never made sense to me to use a statically typed language for building web user-interfaces considering that there&#8217;s very little gain to be had from type-safety.</p>
<p>The news today that <a target="_blank" href="http://www.infoworld.com/article/08/03/03/hirings-python_1.html?source=rss&amp;url=http://www.infoworld.com/article/08/03/03/hirings-python_1.html">Sun hired two key Python programmers</a> makes me hopeful that they&#8217;re thinking what I&#8217;m thinking.</p>
]]></content:encoded>
			<wfw:commentRss>http://constructingsoftware.com/2008/03/03/python-up-front-java-in-the-back/feed/</wfw:commentRss>
		</item>
		<item>
		<title>xUnit Test Patterns</title>
		<link>http://constructingsoftware.com/2008/03/03/xunit-test-patterns/</link>
		<comments>http://constructingsoftware.com/2008/03/03/xunit-test-patterns/#comments</comments>
		<pubDate>Mon, 03 Mar 2008 18:44:53 +0000</pubDate>
		<dc:creator>Zach Scott</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[test patterns]]></category>

		<category><![CDATA[xUnit]]></category>

		<guid isPermaLink="false">http://constructingsoftware.com/2008/03/03/xunit-test-patterns/</guid>
		<description><![CDATA[Dustin Bartlett, one of the developers on the team here at Point2, was just in my office asking me about Mock testing. It turned into an interesting discussion about when to use Mock objects and when not to. 
Ultimately I suggested he take a look at some of the material at xunitpatterns.com, a site developed by Gerard [...]]]></description>
			<content:encoded><![CDATA[<p>Dustin Bartlett, one of the developers on the team here at Point2, was just in my office asking me about Mock testing. It turned into an interesting discussion about when to use Mock objects and when not to. </p>
<p>Ultimately I suggested he take a look at some of the material at <a href="http://xunitpatterns.com/">xunitpatterns.com</a>, a site developed by Gerard Meszaros while he was authoring the book <a target="_blank" href="http://www.amazon.ca/dp/0131495054?tag=xuntespat-20&amp;camp=8641&amp;creative=330649&amp;linkCode=as1&amp;creativeASIN=0131495054&amp;adid=1QQT3YH8K8YBA14D6JWH&amp;">xUnit Test Patterns</a>. I was fortunate enough to be mentored by Gerard on several projects I worked on in Calgary, and have a tremendous amount of respect for him and his knowledge when it comes to testing software.</p>
<p>After looking at <a href="http://xunitpatterns.com/">xunitpatterns.com</a> Dustin and I realized the real question was what type of <a target="_blank" href="http://xunitpatterns.com/Test%20Double%20Patterns.html">Test Double</a> should be used. For the problem at hand, we decided to go with a <a href="http://xunitpatterns.com/Configurable%20Test%20Double.html">Configurable Test Double</a>. If you are stuck on a testing problem, or just want to improve your testing skills, I strongly recommend looking at Gerard&#8217;s site and picking up his book.</p>
]]></content:encoded>
			<wfw:commentRss>http://constructingsoftware.com/2008/03/03/xunit-test-patterns/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Snake charming&#8230; or charming snake</title>
		<link>http://constructingsoftware.com/2008/02/29/snake-charming-or-charming-snake/</link>
		<comments>http://constructingsoftware.com/2008/02/29/snake-charming-or-charming-snake/#comments</comments>
		<pubDate>Fri, 29 Feb 2008 18:46:58 +0000</pubDate>
		<dc:creator>Zach Scott</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://constructingsoftware.com/2008/02/29/snake-charming-or-charming-snake/</guid>
		<description><![CDATA[I just have to say, &#8220;I love Python!&#8221;

public void printPowers&#40;&#41; &#123;
    for &#40;int r = 0; r &#60; 100; r++&#41; &#123;
        int x = Math.pow&#40;r, r&#41;;
        System.out.print&#40;x&#41;;
        System.out.print&#40;&#34;,&#34;&#41;;
    [...]]]></description>
			<content:encoded><![CDATA[<p>I just have to say, &#8220;I love Python!&#8221;</p>

<div class="wp_syntax"><div class="code"><pre class="java"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">void</span> printPowers<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
    <span style="color: #b1b100;">for</span> <span style="color: #66cc66;">&#40;</span><span style="color: #993333;">int</span> r = <span style="color: #cc66cc;">0</span>; r &lt; <span style="color: #cc66cc;">100</span>; r++<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
        <span style="color: #993333;">int</span> x = <span style="color: #aaaadd; font-weight: bold;">Math</span>.<span style="color: #006600;">pow</span><span style="color: #66cc66;">&#40;</span>r, r<span style="color: #66cc66;">&#41;</span>;
        <span style="color: #aaaadd; font-weight: bold;">System</span>.<span style="color: #006600;">out</span>.<span style="color: #006600;">print</span><span style="color: #66cc66;">&#40;</span>x<span style="color: #66cc66;">&#41;</span>;
        <span style="color: #aaaadd; font-weight: bold;">System</span>.<span style="color: #006600;">out</span>.<span style="color: #006600;">print</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;,&quot;</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p><strong>In Java - *with class definition and formatting left out</strong></p>

<div class="wp_syntax"><div class="code"><pre class="python"><span style="color: black;">&#91;</span>r**r <span style="color: #ff7700;font-weight:bold;">for</span> r <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">100</span><span style="color: black;">&#41;</span><span style="color: black;">&#93;</span></pre></div></div>

<p><strong>In Python</strong></p>
<p>Another thing I didn&#8217;t mention: The java implementation won&#8217;t work because int can&#8217;t store 99^99, but Python takes care of handling arbitrarily large numbers for you. It&#8217;s great.</p>
<p><hints id="hah_hints"></hints></p>
]]></content:encoded>
			<wfw:commentRss>http://constructingsoftware.com/2008/02/29/snake-charming-or-charming-snake/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Daily Refactoring #1 - Extract Method</title>
		<link>http://constructingsoftware.com/2008/02/29/daily-refactoring-1-extract-method/</link>
		<comments>http://constructingsoftware.com/2008/02/29/daily-refactoring-1-extract-method/#comments</comments>
		<pubDate>Fri, 29 Feb 2008 18:37:14 +0000</pubDate>
		<dc:creator>Zach Scott</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[extract method]]></category>

		<category><![CDATA[refactoring]]></category>

		<guid isPermaLink="false">http://constructingsoftware.com/2008/02/29/daily-refactoring-1-extract-method/</guid>
		<description><![CDATA[Overview
Extract method is probably the refactoring I use most frequently.  It is covered in detail in The Refactoring Book, so I&#8217;ll leave out many of the details here that the book covers.  I strongly encourage anyone interested in refactoring to read this book and keep it close by as a reference. The intent [...]]]></description>
			<content:encoded><![CDATA[<h3>Overview</h3>
<p>Extract method is probably the refactoring I use most frequently.  It is covered in detail in <a href="http://www.amazon.com/Refactoring-Improving-Existing-Addison-Wesley-Technology/dp/0201485672" target="_blank"><strong>The Refactoring Book</strong></a>, so I&#8217;ll leave out many of the details here that the book covers.  I strongly encourage anyone interested in refactoring to read this book and keep it close by as a reference. The intent of this post and of this series of daily refactorings is to introduce a set of commonly used refactorings and to spark discussion about concrete real-world experience with them.</p>
<p>I want to get people thinking about the importance of refactoring and how it impacts how we think about upfront design vs just-in-time design and the ways in which refactoring can help us avoid over engineering.</p>
<h3>What is Extract Method?</h3>
<p>A refactoring that moves code out of a method by creating a new method and delegating to it.</p>
<p>To illustrate, let&#8217;s start with some code that could benefit from applying extract method:</p>

<div class="wp_syntax"><div class="code"><pre class="java"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #aaaadd; font-weight: bold;">BigDecimal</span> calculateTotal<span style="color: #66cc66;">&#40;</span>List&lt;item&gt; items<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
&nbsp;
	<span style="color: #808080; font-style: italic;">// calculate sub total</span>
	<span style="color: #aaaadd; font-weight: bold;">BigDecimal</span> subTotal = <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #aaaadd; font-weight: bold;">BigDecimal</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;0.00&quot;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #b1b100;">for</span> <span style="color: #66cc66;">&#40;</span>Item i : items<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		subTotal.<span style="color: #006600;">add</span><span style="color: #66cc66;">&#40;</span>i.<span style="color: #006600;">getAmount</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #808080; font-style: italic;">// calculate tax</span>
	<span style="color: #aaaadd; font-weight: bold;">BigDecimal</span> taxRate = TaxRateHelper.<span style="color: #006600;">getTaxRateForState</span><span style="color: #66cc66;">&#40;</span>_user.<span style="color: #006600;">getState</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #aaaadd; font-weight: bold;">BigDecimal</span> taxAmount = subTotal.<span style="color: #006600;">multiply</span><span style="color: #66cc66;">&#40;</span>taxRate<span style="color: #66cc66;">&#41;</span>;
&nbsp;
	<span style="color: #aaaadd; font-weight: bold;">BigDecimal</span> total = taxRate + taxAmount;
	total.<span style="color: #006600;">setScale</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">2</span>, <span style="color: #aaaadd; font-weight: bold;">BigDecimal</span>.<span style="color: #006600;">ROUND_HALF_EVEN</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
	<span style="color: #000000; font-weight: bold;">return</span> total;
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p><hints id="hah_hints"></hints><br />
This code isn&#8217;t terrible by any stretch but it could be cleaned up by applying extract method.  It&#8217;s easy to see that more than one thing is being done in this method.  It is calculating a sub-total, tax amount, and total. Let&#8217;s extract these out as separate methods:</p>

<div class="wp_syntax"><div class="code"><pre class="java"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #aaaadd; font-weight: bold;">BigDecimal</span> calculateTotal<span style="color: #66cc66;">&#40;</span>List&lt;item&gt; items<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
	<span style="color: #aaaadd; font-weight: bold;">BigDecimal</span> subTotal = calculateSubTotal<span style="color: #66cc66;">&#40;</span>items<span style="color: #66cc66;">&#41;</span>;
	<span style="color: #aaaadd; font-weight: bold;">BigDecimal</span> taxAmount = calculateTaxAmount<span style="color: #66cc66;">&#40;</span>subTotal<span style="color: #66cc66;">&#41;</span>;
	<span style="color: #aaaadd; font-weight: bold;">BigDecimal</span> total = taxRate + taxAmount;
	total.<span style="color: #006600;">setScale</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">2</span>, <span style="color: #aaaadd; font-weight: bold;">BigDecimal</span>.<span style="color: #006600;">ROUND_HALF_EVEN</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #000000; font-weight: bold;">return</span> total;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #aaaadd; font-weight: bold;">BigDecimal</span> calculateSubTotal<span style="color: #66cc66;">&#40;</span>List&lt;item&gt; items<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
	<span style="color: #aaaadd; font-weight: bold;">BigDecimal</span> subTotal = <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #aaaadd; font-weight: bold;">BigDecimal</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;0.00&quot;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #b1b100;">for</span> <span style="color: #66cc66;">&#40;</span>Item i : items<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		subTotal.<span style="color: #006600;">add</span><span style="color: #66cc66;">&#40;</span>i.<span style="color: #006600;">getAmount</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
	<span style="color: #000000; font-weight: bold;">return</span> subTotal;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #aaaadd; font-weight: bold;">BigDecimal</span> calculateTaxAmount<span style="color: #66cc66;">&#40;</span><span style="color: #aaaadd; font-weight: bold;">BigDecimal</span> amount<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
	<span style="color: #aaaadd; font-weight: bold;">BigDecimal</span> taxRate = TaxRateHelper.<span style="color: #006600;">getTaxRateForState</span><span style="color: #66cc66;">&#40;</span>_customer.<span style="color: #006600;">getState</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #aaaadd; font-weight: bold;">BigDecimal</span> taxAmount = subTotal.<span style="color: #006600;">multiply</span><span style="color: #66cc66;">&#40;</span>taxRate<span style="color: #66cc66;">&#41;</span>;
	<span style="color: #000000; font-weight: bold;">return</span> taxAmount;
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p>What impact did this refactoring have?  What were some of the benefits?</p>
<ul>
<li>The original calculateTotal method is more cohesive and sticks to doing one thing.</li>
<li>The comments that described what the different sections of code were doing are no longer required because the method name clearly documents what the code does.</li>
<li>Each of the methods calculateTaxAmount and calculateSubTotal are no longer tightly coupled to calculateTotal and can be called independently.</li>
</ul>
<p>Of all the benefits provided perhaps the one that I think has the most impact is that extract method increases cohesiveness and decreases coupling. The benefits of having a loosely coupled, highly cohesive system are well-worth the effort it takes to perform extract method, especially considering most modern development tools (such as ReSharper, IntelliJ, and Eclipse) support this refactoring.</p>
<p>Can you see any other refactorings that this code could benefit from?</p>
]]></content:encoded>
			<wfw:commentRss>http://constructingsoftware.com/2008/02/29/daily-refactoring-1-extract-method/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Agile Task Estimation: Ideal Developer Days vs Abstract Points</title>
		<link>http://constructingsoftware.com/2008/02/22/agile-task-estimation-ideal-developer-days-vs-abstract-points/</link>
		<comments>http://constructingsoftware.com/2008/02/22/agile-task-estimation-ideal-developer-days-vs-abstract-points/#comments</comments>
		<pubDate>Fri, 22 Feb 2008 19:33:08 +0000</pubDate>
		<dc:creator>Zach Scott</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://constructingsoftware.com/2008/02/22/agile-task-estimation-ideal-developer-days-vs-abstract-points/</guid>
		<description><![CDATA[We just finished the series of planning sessions for Sprint2 which began on Feb 19th and runs for 4 weeks. We prioritized, decomposed, and estimated the work to be done and estimated how much could be accomplished in the 4 week period.
Planning 
The planning sessions which include the scrum masters, product owners, and developers started after each [...]]]></description>
			<content:encoded><![CDATA[<p>We just finished the series of planning sessions for Sprint2 which began on Feb 19th and runs for 4 weeks. We prioritized, decomposed, and estimated the work to be done and estimated how much could be accomplished in the 4 week period.</p>
<h3>Planning </h3>
<p>The planning sessions which include the scrum masters, product owners, and developers started after each of the product owners had their respective product backlogs prioritized.  The team spent hours together decomposing the items on the product backlog into bite-sized, testable pieces that could be estimated. It was a challenging learning experience for everyone, mostly around effectively time-boxing discussions and knowing what to discuss and what can wait, however we came out of it relatively unscathed, and definitely wiser and more cohesive for the experience.</p>
<h3>Estimating </h3>
<p>After we had enough tasks broken down we gather the team of developers together to estimate each of the tasks.  The purpose of this is to know how much the development team can be expected to produce in a sprint.  The development team must be comfortable with the commitment and the product owners must be confident that the team will deliver on that commitment. We always plan more tasks than we think we can develop in one sprint so we don&#8217;t exhaust the available pool of work if the team performs better than anticipated.</p>
<p>The estimates are given in jellybeans rather than days or hours to avoid the myth that we can give such precise predictions about the work to be done.  This is a myth that has been hurting development teams for far too long.  Some things can be predicted very accurately such as, &#8220;How long does a direct flight from Saskatoon to San Francisco on a 737 take ( if such a flight existed)?&#8221; Others like, &#8220;How long with this football game take?&#8221;, can&#8217;t be predicted as easily.  But it can be estimated.</p>
<h3>What the heck is a jellybean?</h3>
<p>A jellybean is an abstract measure of the size of a development task.  To give the football analogy, we might consider that 1 quarter of a football game takes 1 jellybean.  That means a whole football game takes 4 jellybeans.  Although we don&#8217;t know exactly how long this is, it&#8217;s usefull nonetheless.  For example we may want to know how long it will take to play a football game that consists of 10 quarters.  That&#8217;s easy: 10 jellybeans.</p>
<p>Velocity is important when considering how much time it will take a team to produce one jellybean worth of work.</p>
<h3>Velocity</h3>
<p>Velocity is the measurement of how many jellybeans a team can accomplish in one sprint. It&#8217;s not something we can determine ahead of time with any confidence or accuracy, but rather something that is measured over time.  I&#8217;m sure you have experienced being on a development project where you we&#8217;re given a task AND told how long it must take. </p>
<p>&#8220;Please have this TPS report generator completed by Friday.&#8221;</p>
<p>In football, the health of the team, injuries, penalties, weather, commercials, etc. all contribute to the velocity of the game.  It may take 1 hour to accomplish 1 jellybean (1 quarter or 15 perfect minutes) of football.  This is something we all understand and accept.</p>
<p>With a measured (and therefore predictable) velocity of 100 jellybeans, we would know that the team of developers has demonstrated over an extended period of time that it can accomplish 100 jellybeans worth of work in one 4 week sprint.  Changes to the team size, nature of work, distractions in the office, advances in technology, professional development, etc. will all have an effect on this velocity.</p>
<h4>Ideal Developer Days </h4>
<p>There are several techniques available for estimating the size of each task, the least abstract being ideal developer days which is exactly how we did our estimation.</p>
<p>The team is asked to arrive at an agreement about the number of <strong>ideal developer days</strong>a task will take by getting together in a room and playing estimation poker. Each team member comes up with an independent estimate.  We all share our estimate with the team (on a card) at the same time, then we discuss discrepancies in estimates until the majority agree. At first it was uncomfortable for me, and I sensed for some other people as well, to look around at the number of people in the &#8220;meeting&#8221; and think about how much time we were wasting.  However it became obvious that the benefits were outweighing the cost.  The team left these estimating sessions with a shared commitment to these estimates and a better shared understanding of what work needed to be done.</p>
<h4>Relative Task Size</h4>
<p>An alternative to the ideal developer days technique is relative task size.  This technique still uses estimation poker, but instead the team is asked to arrive at an agreement about the size of a new task relative to the size of some tasks that have already been accomplished.</p>
<p>Let&#8217;s return to the football analogy.  Suppose the team is asked to estimate how big a period of NHL hockey is.  Well they know that 1 quarter of football has been estimated at 1 jellybean and they have the option of estimating 1, 2, 3, 5, 8, 13 (you may have noticed that these are numbers in the Fibonacci sequence) There might be a debate about whether a quarter of hockey is 1 or 2 jellybeans, but the team eventually arrives at 1. This means that relatively speaking a quarter of football is about the same size as a period of hockey.</p>
<h3>Summary </h3>
<p>Although ideal developer days are more concrete and easy to understand than relative task size there are a number of drawbacks to the approach.  I favor relative task size because improvements in the team dynamics, technologies, and practices are be reflected in velocity. With ideal developer days velocity does not reflect these improvements and we can mistakenly believe that the team is not getting better.</p>
<p>How does relative task size reflect technology and team improvements in velocity? Let&#8217;s look at a simple example:</p>
<p>Using ideal developer days we estimate the following: TASK1 - 1 jellybean, TASK2 - 4 jellybeans, TASK3 - 3 jellybeans.  The total is 8 jellybeans.  Let&#8217;s assume that we&#8217;ve measured the teams velocity over time and the team can accomplish 8 jellybeans of work in one sprint.</p>
<p>Now let&#8217;s step one year into the future.  We have some new technology available that makes the same type of work very easy.  Using ideal developer days as our estimation technique we estimate 3 similar tasks (these are not the same, but they are similar to TAKS1-3): TASK237 - 1, TASK238 - 1, TASK239 - 2.  If the teams velocity hasn&#8217;t changed we will obviously have to add a few more tasks to top it up to 8 jellybeans.  The problem with this is that it can appear that the team is holding at a velocity of 8 jellybeans, which does not account for the increase in performance.  Had we used relative task size to estimate these instead, we would have seen that TASK238-239 receiving similar estimates to TASK1-2 regardless of the technology improvement and the additional tasks the team is able to accomplish would cause the measured velocity to increase.</p>
]]></content:encoded>
			<wfw:commentRss>http://constructingsoftware.com/2008/02/22/agile-task-estimation-ideal-developer-days-vs-abstract-points/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Point2 Real Estate: First Sprint Kick-Off</title>
		<link>http://constructingsoftware.com/2008/02/19/point2-real-estate-first-sprint-kick-off/</link>
		<comments>http://constructingsoftware.com/2008/02/19/point2-real-estate-first-sprint-kick-off/#comments</comments>
		<pubDate>Wed, 20 Feb 2008 04:57:34 +0000</pubDate>
		<dc:creator>Zach Scott</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[NLS]]></category>

		<category><![CDATA[Point2]]></category>

		<category><![CDATA[real estate]]></category>

		<category><![CDATA[scrum]]></category>

		<guid isPermaLink="false">http://constructingsoftware.com/2008/02/19/point2-real-estate-first-sprint-kick-off/</guid>
		<description><![CDATA[Today marked the first day in a journey that is sure to take the Point2 Real Estate team to new heights.  It was the first day that the entire real estate development team started sprinting.  At 9:15 this morning we gathered as a team for our first kick-off meeting and listened as product owners described [...]]]></description>
			<content:encoded><![CDATA[<p>Today marked the first day in a journey that is sure to take the Point2 Real Estate team to new heights.  It was the first day that the entire real estate development team started sprinting.  At 9:15 this morning we gathered as a team for our first kick-off meeting and listened as product owners described the vision and direction for each of their products and contextualized the work that is to be done over the next 4 weeks. It was a very exciting moment that was met with much anticipation.  One in which we all took the first leap in our trek from where we are today towards the future Point2, a company that will no doubt be a force to reckon with.  Although we have a clear idea about where we&#8217;re going and how to get there, we all know the course will change along the way, and so will the tools and practices, but we have to get started now and be ready for change.  I call it Ready-Fire-Aim, Aim, Aim, Aim&#8230;<br />
<br/><br />
Much work has gone into planning for this first sprint.  I especially want to thank the product owners that put so much time and energy into the monumental task of organizing and prioritizing all the features, tasks, bugs, and dreams that Point2 has ever had for it&#8217;s Real Estate products.  Your efforts are greatly appreciated!  I especially want to thank James Townley who went above and beyond and impressed us all. You inspire me with your tremendous work ethic and dedication.</p>
]]></content:encoded>
			<wfw:commentRss>http://constructingsoftware.com/2008/02/19/point2-real-estate-first-sprint-kick-off/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Using OpenID</title>
		<link>http://constructingsoftware.com/2008/02/09/using-openid/</link>
		<comments>http://constructingsoftware.com/2008/02/09/using-openid/#comments</comments>
		<pubDate>Sat, 09 Feb 2008 08:19:59 +0000</pubDate>
		<dc:creator>Zach Scott</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[certificate]]></category>

		<category><![CDATA[myopenid]]></category>

		<category><![CDATA[openid]]></category>

		<category><![CDATA[plugins]]></category>

		<category><![CDATA[ssl]]></category>

		<guid isPermaLink="false">http://constructingsoftware.com/2008/02/09/using-openid/</guid>
		<description><![CDATA[I just added the OpenID plugin to my wordpress blog and set up an account at myopenid.com.  It was very easy to setup and now I can login from my laptop using the client ssl certificate installed by myopenid.com.  That means I never have to enter a password.  This is very convenient.  If I lose my laptop I [...]]]></description>
			<content:encoded><![CDATA[<p>I just added the <a target="_blank" href="http://openid.net">OpenID</a> <a target="_blank" href="http://sourceforge.net/projects/wpopenid/">plugin</a> to my wordpress blog and set up an account at <a target="_blank" href="http://www.myopenid.com/" title="myOpenID">myopenid.com</a>.  It was very easy to setup and now I can login from my laptop using the client ssl certificate installed by myopenid.com.  That means I never have to enter a password.  This is very convenient.  If I lose my laptop I just have to remember to go to myopenid.com and revoke the certificate.</p>
<p>Also, anybody with an OpenID account can post comments without first creating a username and password.</p>
]]></content:encoded>
			<wfw:commentRss>http://constructingsoftware.com/2008/02/09/using-openid/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Point2 is Rolling with Scrum</title>
		<link>http://constructingsoftware.com/2008/02/03/point2-is-rolling-with-scrum/</link>
		<comments>http://constructingsoftware.com/2008/02/03/point2-is-rolling-with-scrum/#comments</comments>
		<pubDate>Sun, 03 Feb 2008 18:06:03 +0000</pubDate>
		<dc:creator>Zach Scott</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[agile]]></category>

		<category><![CDATA[change]]></category>

		<category><![CDATA[NLS]]></category>

		<category><![CDATA[Point2]]></category>

		<category><![CDATA[scrum]]></category>

		<guid isPermaLink="false">http://constructingsoftware.com/2008/02/03/point2-is-rolling-with-scrum/</guid>
		<description><![CDATA[It&#8217;s been a while since my last post.  I&#8217;ve been super busy with all the changes happening around here, but things are settling down now.  What&#8217;s new you ask?  Scrum is rolling and it&#8217;s as great now as it was every other time I&#8217;ve been part of a true Agile/Scrum environment.We are just wrapping up [...]]]></description>
			<content:encoded><![CDATA[<p><span style="font-family: Georgia">It&#8217;s been a while since my last post.  I&#8217;ve been super busy with all the changes happening around here, but things are settling down now.  What&#8217;s new you ask?  Scrum is rolling and it&#8217;s as great now as it was every other time I&#8217;ve been part of a true Agile/Scrum environment.<o:p></o:p></span><span style="font-family: Georgia">We are just wrapping up a pilot sprint that was run for one of the products with a smaller team. They hit their jellybean targets &#8212; jellybeans are used to estimate how much work a team can accomplish &#8212; and are wrapping things up with a full integration and regression test cycle and preparing for the next sprint. The development team, which comprises the gamut of skill sets that are required to make a truly cross functional team, are crazy excited about this new way of working.  For the first time they are involved in every step of the process from planning to QA and development and are encouraged to find ways to continuously improve.  We&#8217;re all embracing change.<o:p></o:p></span><span style="font-family: Georgia">We will be starting our first official sprint on Feb 19th which will include all Point2 NLS related products.  The scrum area where our daily stand-ups happen is in the final stages of construction.  By the 5th we will have 25 feet of whiteboard and cork-board space for collaborating and tracking the project, bookshelves for our technical library, and several tables on top of which will be the planned tasks and story cards. <o:p></o:p></span><span style="font-family: Georgia">I&#8217;ll post pictures.<o:p></o:p></span></p>
]]></content:encoded>
			<wfw:commentRss>http://constructingsoftware.com/2008/02/03/point2-is-rolling-with-scrum/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>

<!-- Dynamic Page Served (once) in 0.663 seconds -->
<!-- Cached page served by WP-Cache -->
