<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2660291115609609354</id><updated>2012-02-22T05:17:35.893+02:00</updated><category term='Definition of Done'/><category term='User Story'/><category term='TDD'/><category term='Windows 8'/><category term='Sprint Planning'/><category term='Agile'/><category term='XP'/><category term='Version Control'/><category term='tablet'/><category term='Scrum'/><category term='Estimation'/><category term='Story Points'/><category term='Release Planning'/><category term='Build'/><category term='Report'/><category term='Giveaway'/><category term='Ideal Hours'/><category term='Test'/><category term='Refactoring'/><category term='Task'/><title type='text'>Software and I</title><subtitle type='html'>Musings about software, methodology, and me</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.softwareandi.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2660291115609609354/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://www.softwareandi.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Assaf Stone</name><uri>http://www.blogger.com/profile/14023994489658711542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_njIZU_X1s08/Sb0rpRzfcxI/AAAAAAAAABM/a0wzTXU3Grg/S220/Me.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>16</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2660291115609609354.post-7292913475546728782</id><published>2012-02-19T13:13:00.001+02:00</published><updated>2012-02-19T13:13:40.039+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Sprint Planning'/><category scheme='http://www.blogger.com/atom/ns#' term='User Story'/><category scheme='http://www.blogger.com/atom/ns#' term='Scrum'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><category scheme='http://www.blogger.com/atom/ns#' term='Estimation'/><title type='text'>Do Agile Estimation Techniques Really Account for Scrum Projects’ Successes?</title><content type='html'>&lt;p align="justify"&gt;&lt;a href="http://lh6.ggpht.com/-2rUaPe5CXrk/T0DZRu_XzAI/AAAAAAAAAeo/L-2svlp1GgY/s1600-h/image%25255B4%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" align="right" src="http://lh4.ggpht.com/-f2-v8AMb2TA/T0DZSQ8C9AI/AAAAAAAAAew/CWUUYwHLe-0/image_thumb%25255B2%25255D.png?imgmax=800" width="142" height="142"&gt;&lt;/a&gt;After several years of experience working with, training and coaching teams on Scrum, I have no doubt that agile (empirical) estimation techniques are better than classic, predictive estimation techniques. One question that kept nagging me over time is whether or not using &lt;strong&gt;story points&lt;/strong&gt;, &lt;strong&gt;T-shirt sizes&lt;/strong&gt;, or&lt;strong&gt; ideal hours&lt;/strong&gt; truly explains the increased success of Scrum based techniques?&lt;/p&gt; &lt;p align="justify"&gt;It took me a while, but I finally figured it out. And the answer is a definite &lt;strong&gt;‘NO’&lt;/strong&gt;!&lt;/p&gt; &lt;h3&gt;All Estimation Techniques are Merely Guesses&lt;/h3&gt; &lt;p align="justify"&gt;&lt;img style="display: inline; float: right" align="right" src="http://www.fubles.com/fublog/wp-content/gaussian.png"&gt;At the end of the day (or at least, at the end of the planning session), any estimation is just a guess: sometimes its more, and sometimes its less. This means that the distribution of the actual time versus the estimation should be pretty much &lt;a href="http://en.wikipedia.org/wiki/Normal_distribution"&gt;normal&lt;/a&gt;: In large numbers, about half of the actual results will be less than the estimation, and half will be more. On average, according to the &lt;a href="http://en.wikipedia.org/wiki/Law_of_large_numbers"&gt;Law of Large Numbers&lt;/a&gt;, it evens up.&lt;/p&gt; &lt;p align="justify"&gt;&lt;img style="display: inline; float: left" align="left" src="http://4.bp.blogspot.com/_39NGKVWYg3o/TNmW0r3yG3I/AAAAAAAABLg/21V2rAk8F-A/s1600/example.png" width="179" height="134"&gt;The better the estimation technique is, the steeper the curve will be, i.e. the closer actual results will be to the estimation.&lt;/p&gt; &lt;p align="justify"&gt;My experience is that agile techniques are in fact better at predicting the actual results, but the fact remains that if you make enough of these predictions, then regardless of the technique, the &lt;strong&gt;variance should cancel itself out &lt;/strong&gt;and the &lt;strong&gt;sum should settle on the average&lt;/strong&gt;!&lt;/p&gt; &lt;p align="justify"&gt;&lt;strong&gt;This means that the quality of the technique used to estimate each task has little or no impact of the success of estimating the time to complete the entire project!&lt;/strong&gt;&lt;/p&gt; &lt;h3 align="justify"&gt;Then Why Do Estimations Fail?&lt;/h3&gt; &lt;p align="justify"&gt;If estimations behave “normally” whole project estimations should not fail. I don’t buy into all that “programmers are notoriously optimistic” sentiment; I’m a developer myself and there is not a single soul alive that will call me optimistic, and yet, non-agile projects I worked on overran their deadlines, like everybody else’s. Something must be out there, that either changes the &lt;strong&gt;normal distribution&lt;/strong&gt;, or &lt;strong&gt;invalidates the law of large numbers&lt;/strong&gt; or both. And it has to be something that is present in classic waterfall-ish projects but not in agile ones.&lt;/p&gt; &lt;h3 align="justify"&gt;It Is All About the Independence!&lt;/h3&gt; &lt;p align="justify"&gt;The main difference, in my opinion between agile and non-agile projects is how they are planned and constructed. An agile project plan is basically a stack of user stories, with &lt;strong&gt;no*&lt;/strong&gt; dependencies between them, whereas a waterfall project plan is a Gantt chart describing tasks and their interdependencies.&lt;/p&gt; &lt;h3 align="justify"&gt;Why Is This Important?&lt;/h3&gt; &lt;p align="justify"&gt;Let’s assume a task that has two dependencies. Each were estimated, and each have a normal distribution of the actual amount of time to complete vs. the estimated time. The following figure describes such a “plan”:&lt;/p&gt; &lt;p align="justify"&gt;&lt;a href="http://lh3.ggpht.com/-cB4FsLbnSKE/T0DZTXmBA9I/AAAAAAAAAe4/LEeKko2dBsg/s1600-h/SimpleDependencies%25255B3%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="SimpleDependencies" border="0" alt="SimpleDependencies" src="http://lh4.ggpht.com/-2gQyCtCrKsw/T0DZUmLlpTI/AAAAAAAAAfA/PkByPFKZQOY/SimpleDependencies_thumb%25255B1%25255D.png?imgmax=800" width="240" height="107"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align="justify"&gt;Each task has a 50% chance to be completed before time and 50% to be completed after (There is of course no statistical chance of being completed “on time”). Now, let’s say we’re interested in calculating the probability of Task C to be completed before time, or &lt;strong&gt;not to finish late&lt;/strong&gt;. For the sake of ease, we’ll assume all three tasks to have the same estimated duration. For Task C to begin early, it needs &lt;strong&gt;both&lt;/strong&gt; of its dependencies to complete early. Since the chance of each to complete early is 50%, the chance for both is (0.5 * 0.5) = 0.25, or 25%. The chance for this not to happen, i.e. for &lt;strong&gt;at least one of them &lt;/strong&gt;to be completed late is 1-0.25 or &lt;strong&gt;75%&lt;/strong&gt;. this means that there’s a 75% for Task C to complete late, and of course it has its own probability of being late, which means that the chance of &lt;strong&gt;Task C completing late (and making the whole project run late) is more&lt;/strong&gt; &lt;strong&gt;than 75%!&lt;/strong&gt;&lt;/p&gt; &lt;p align="justify"&gt;&lt;img style="display: inline; float: right" align="right" src="http://www.mzandee.net/~zandee/statistiek/stat-online/chapter1/graphics/neg_skew.gif" width="211" height="109"&gt;It is easy to see that the more complex a project is, the more dependencies each task has the greater the chance of being late is; The distribution of the actual duration of tasks with dependencies is a &lt;a href="http://www.research-assessment-adviser.com/skewed-distribution.html"&gt;negatively skewed distribution&lt;/a&gt;.&lt;/p&gt; &lt;h3&gt;Scrum User Stories Have No Dependencies&lt;/h3&gt; &lt;p align="justify"&gt;With this in mind, Scrum user stories have no* interdependencies. If two stories &lt;em&gt;do&lt;/em&gt; have a dependency, they are should be joined to be treated as one (and if they are too big, they can and should be split again, though in a way that doesn’t create dependencies). With no dependency (or, if you wish, a single dependency that is the completion of the prior story), we get a plan that looks like this:&lt;/p&gt; &lt;p align="justify"&gt;&lt;a href="http://lh6.ggpht.com/-ro0fIV8Yg4o/T0DZW1OikCI/AAAAAAAAAfI/YKtMCASY15s/s1600-h/NoDependencies%25255B3%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="NoDependencies" border="0" alt="NoDependencies" src="http://lh4.ggpht.com/-_qsPEzUgn9M/T0DZYLgH8pI/AAAAAAAAAfQ/rQN53uQEClQ/NoDependencies_thumb%25255B1%25255D.png?imgmax=800" width="240" height="112"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;The chance of B starting early, which is the same chance of A ending early, is 50%. The chance of B &lt;strong&gt;completing &lt;/strong&gt;early is &lt;em&gt;still&lt;/em&gt; 50%! Even better the variance is reduced, which means that there is an increased probability of the total project duration being close to the the estimate (i.e. a steep probability distribution). &lt;/p&gt; &lt;h3&gt;What Does This Mean?&lt;/h3&gt; &lt;p align="justify"&gt;This means, that while a project with multi-dependent tasks has an increased skew towards lateness with each added task, a project with no dependency (beyond sequence) has an increased tendency towards the mean, or the estimate.&lt;/p&gt; &lt;p align="justify"&gt;This means that by the &lt;strong&gt;very nature&lt;/strong&gt; of &lt;strong&gt;&lt;em&gt;what&lt;/em&gt;&lt;/strong&gt; we are estimating, agile projects tend to succeed (i.e. be on budget and on time), than non-agile.&lt;/p&gt; &lt;p align="justify"&gt;Moreover, the actual estimation technique doesn’t matter – it is the estimation of &lt;strong&gt;independent units of work&lt;/strong&gt; that makes the difference.&lt;/p&gt; &lt;p align="justify"&gt;Therefore, my conclusion, and advice is that the &lt;strong&gt;very first&lt;/strong&gt; change a team needs to make is to start working on &lt;strong&gt;independent&lt;/strong&gt; features – call them user stories, features, or MMFs – it doesn’t matter; just keep them independent of each other!&lt;/p&gt; &lt;p align="justify"&gt;Hope this helps,&lt;/p&gt; &lt;p align="justify"&gt;Assaf.&lt;/p&gt; &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:07acd213-3879-4509-ad23-bb359648e953" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Agile" rel="tag"&gt;Agile&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Estimation" rel="tag"&gt;Estimation&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Scrum" rel="tag"&gt;Scrum&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Sprint+Planning" rel="tag"&gt;Sprint Planning&lt;/a&gt;,&lt;a href="http://technorati.com/tags/User+Story" rel="tag"&gt;User Story&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2660291115609609354-7292913475546728782?l=www.softwareandi.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.softwareandi.com/feeds/7292913475546728782/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.softwareandi.com/2012/02/do-agile-estimation-techniques-really.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2660291115609609354/posts/default/7292913475546728782'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2660291115609609354/posts/default/7292913475546728782'/><link rel='alternate' type='text/html' href='http://www.softwareandi.com/2012/02/do-agile-estimation-techniques-really.html' title='Do Agile Estimation Techniques Really Account for Scrum Projects’ Successes?'/><author><name>Assaf Stone</name><uri>http://www.blogger.com/profile/14023994489658711542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_njIZU_X1s08/Sb0rpRzfcxI/AAAAAAAAABM/a0wzTXU3Grg/S220/Me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/-f2-v8AMb2TA/T0DZSQ8C9AI/AAAAAAAAAew/CWUUYwHLe-0/s72-c/image_thumb%25255B2%25255D.png?imgmax=800' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2660291115609609354.post-4030882562403030937</id><published>2012-02-06T09:53:00.000+02:00</published><updated>2012-02-06T09:55:00.146+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Test'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><title type='text'>How to Write Automated Tests for Console Applications</title><content type='html'>&lt;div align="justify"&gt;&lt;a href="http://lh6.ggpht.com/-04cYKO7_WOA/Ty5rZPbr6cI/AAAAAAAAAeY/cZc1KTsh4ms/s1600-h/command_line_interface%25255B3%25255D.png"&gt;&lt;img align="right" alt="command_line_interface" border="0" height="240" src="http://lh5.ggpht.com/-wBFPB8wDfs8/Ty5rZye7VzI/AAAAAAAAAec/8O9XZJ0SE7M/command_line_interface_thumb%25255B1%25255D.png?imgmax=800" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; float: right; margin: 0px 0px 0px 4px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="command_line_interface" width="240" /&gt;&lt;/a&gt;I don’t know about the rest of you, but I still find myself writing a lot of console applications. Most of the time these are utilities or services or some kind of customization or process automation scripts. Until recently, if I wanted to write automated tests for these, I would have to separate the business logic from the program itself and test the functions. While this is obviously a &lt;strong&gt;good practice&lt;/strong&gt; for any moderately complex project, it sometimes might be &lt;strong&gt;overly complicated&lt;/strong&gt; for what is needed. Moreover, this doesn’t work for &lt;strong&gt;black-box user acceptance tests&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 align="justify"&gt;The System.Console Class&lt;/h3&gt;&lt;div align="justify"&gt;&lt;br /&gt;In the .NET Framework console apps revolve around, well, the &lt;em&gt;Console&lt;/em&gt; class. You get user input with &lt;span style="font-family: 'Courier New';"&gt;&lt;span style="color: blue;"&gt;Console&lt;/span&gt;.Read() &lt;/span&gt;&lt;span style="font-family: arial;"&gt;(and &lt;span style="font-family: 'Courier New';"&gt;ReadLine()&lt;/span&gt;, and &lt;span style="font-family: 'Courier New';"&gt;ReadKey()&lt;/span&gt;, and so on). Conversely, you send output to the user with &lt;span style="font-family: 'Courier New';"&gt;&lt;span style="color: blue;"&gt;Console&lt;/span&gt;.Write() and &lt;span style="font-family: 'Courier New';"&gt;&lt;span style="color: blue;"&gt;Console&lt;/span&gt;.WriteLine()&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: arial;"&gt;. &lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family: arial;"&gt;So let’s take a look at the code inside the .NET Framework. By the way, I used Telerik’s &lt;a href="http://www.telerik.com/products/decompiler.aspx"&gt;JustDecompile&lt;/a&gt; to browse the code. If you don’t already have a decompiler of choice, I suggest you take a look at it. It’s simple, elegant and free (and no, I don’t own stock).&lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family: arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family: arial;"&gt;So, here's the code behind &lt;b&gt;Console.ReadLine():&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div id="codeSnippetWrapper"&gt;&lt;div id="codeSnippet" style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum1" style="color: #606060;"&gt;   1:&lt;/span&gt; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; ReadLine()&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum2" style="color: #606060;"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum3" style="color: #606060;"&gt;   3:&lt;/span&gt;     &lt;span style="color: blue;"&gt;return&lt;/span&gt; Console.In.ReadLine();&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum4" style="color: #606060;"&gt;   4:&lt;/span&gt; }&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;span style="font-family: arial;"&gt;&lt;/span&gt;&lt;span style="font-family: arial;"&gt;And here’s &lt;b&gt;Console.WriteLine()&lt;/b&gt;:&lt;/span&gt;&lt;/div&gt;&lt;div id="codeSnippetWrapper"&gt;&lt;br /&gt;&lt;div id="codeSnippet" style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum1" style="color: #606060;"&gt;   1:&lt;/span&gt; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; WriteLine()&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum2" style="color: #606060;"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum3" style="color: #606060;"&gt;   3:&lt;/span&gt;     Console.Out.WriteLine();&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum4" style="color: #606060;"&gt;   4:&lt;/span&gt; }&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;As it turns out, Console’s &lt;strong&gt;read &lt;/strong&gt;and &lt;strong&gt;write&lt;/strong&gt; methods are merely pass-through methods that call the same methods on the &lt;strong&gt;In&lt;/strong&gt; and &lt;strong&gt;Out&lt;/strong&gt; &lt;a href="http://msdn.microsoft.com/en-us/library/system.io.textreader.aspx"&gt;TextReader&lt;/a&gt; and &lt;a href="http://msdn.microsoft.com/en-us/library/system.io.textwriter.aspx"&gt;TextWriter&lt;/a&gt; properties (again - respectively).&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;The text reader and writer classes, as so eloquently put in the class descriptions on MSDN, “represent a reader [and writer] that can read [and write] a sequential series of characters”. Well, that still is more helpful than some descriptions I’ve seen... Anyway, they are the abstract parents of the &lt;strong&gt;string&lt;/strong&gt; and &lt;strong&gt;stream &lt;/strong&gt;reader (and writer) classes. Why is this important? Well, the In and Out properties are by default set to the keyboard input and screen output streams.&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;span style="font-family: arial;"&gt;Now, if only there was a way to redirect those streams…&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;Enter &lt;span style="font-family: arial;"&gt;&lt;span style="font-family: 'Courier New';"&gt;&lt;span style="color: blue;"&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.console.setin.aspx"&gt;Console.SetIn()&lt;/a&gt;&lt;/span&gt; and &lt;span style="font-family: 'Courier New';"&gt;&lt;span style="color: blue;"&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.console.setout.aspx"&gt;Console.SetOut()&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: arial;"&gt; respectively. Hmm, that’s a lot more respect than I usually show in a blog post…&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;With &lt;strong&gt;SetIn&lt;/strong&gt;, I can redirect the &lt;strong&gt;In&lt;/strong&gt; text-reader to a &lt;a href="http://msdn.microsoft.com/en-us/library/system.io.stringreader.aspx"&gt;StringReader&lt;/a&gt;, and with &lt;strong&gt;SetOut&lt;/strong&gt;, I redirect the output to a &lt;a href="http://msdn.microsoft.com/en-us/library/system.io.stringwriter.aspx"&gt;String&lt;em&gt;Writer&lt;/em&gt;&lt;/a&gt;. &lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;I can now, quite easily initialize the string reader to a value that contains whichever input, or set of inputs I want to use, and the console application will read characters or lines as needed. I can then read the output of the string writer, and compare it with expected results. &lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;And the most beautiful part of it is that there is (almost) &lt;strong&gt;no need to modify the console application in any way &lt;/strong&gt;for this to work.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 align="justify"&gt;Example&lt;/h3&gt;&lt;br /&gt;The following example was written in C#, using MS-Test (forgive me) to test the code. The application is a simple one that plays the game &lt;strong&gt;7-Boom&lt;/strong&gt; (a local variation of the game &lt;a href="http://en.wikipedia.org/wiki/Bizz_buzz"&gt;BizzBuzz&lt;/a&gt;). As you will see, except for making the &lt;strong&gt;Program &lt;/strong&gt;class and &lt;strong&gt;Main()&lt;/strong&gt; method public in lines 1 and 3, so that I can reach the code from another (test) assembly, I did nothing I wouldn’t do in any other console application:&lt;br /&gt;&lt;div id="codeSnippetWrapper"&gt;&lt;br /&gt;&lt;div id="codeSnippet" style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum1" style="color: #606060;"&gt;   1:&lt;/span&gt; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; Program&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum2" style="color: #606060;"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum3" style="color: #606060;"&gt;   3:&lt;/span&gt;     &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Main()&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum4" style="color: #606060;"&gt;   4:&lt;/span&gt;     {&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum5" style="color: #606060;"&gt;   5:&lt;/span&gt;         Console.Write(&lt;span style="color: #006080;"&gt;"Enter upper limit: "&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum6" style="color: #606060;"&gt;   6:&lt;/span&gt;         var range = &lt;span style="color: blue;"&gt;int&lt;/span&gt;.Parse(Console.ReadLine());&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum7" style="color: #606060;"&gt;   7:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum8" style="color: #606060;"&gt;   8:&lt;/span&gt;         &lt;span style="color: blue;"&gt;for&lt;/span&gt; (var i = 0; i &amp;lt; range; i++)&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum9" style="color: #606060;"&gt;   9:&lt;/span&gt;         {&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum10" style="color: #606060;"&gt;  10:&lt;/span&gt;             var num = ((i % 7 == 0) || i.ToString().Contains(&lt;span style="color: #006080;"&gt;'7'&lt;/span&gt;)) ? &lt;span style="color: #006080;"&gt;"BOOM"&lt;/span&gt; : i.ToString();&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum11" style="color: #606060;"&gt;  11:&lt;/span&gt;             Console.Write(&lt;span style="color: #006080;"&gt;"{0}, "&lt;/span&gt;, num);&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum12" style="color: #606060;"&gt;  12:&lt;/span&gt;         }&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum13" style="color: #606060;"&gt;  13:&lt;/span&gt;     }&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum14" style="color: #606060;"&gt;  14:&lt;/span&gt; }&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;And here is a test:&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;div id="codeSnippet" style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum1" style="color: #606060;"&gt;   1:&lt;/span&gt; &lt;span style="color: green;"&gt;// Arrange&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum2" style="color: #606060;"&gt;   2:&lt;/span&gt; &lt;span style="color: blue;"&gt;using&lt;/span&gt; (var sw = &lt;span style="color: blue;"&gt;new&lt;/span&gt; StringWriter())&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum3" style="color: #606060;"&gt;   3:&lt;/span&gt; {&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum4" style="color: #606060;"&gt;   4:&lt;/span&gt;     &lt;span style="color: blue;"&gt;using&lt;/span&gt; (var sr = &lt;span style="color: blue;"&gt;new&lt;/span&gt; StringReader(&lt;span style="color: #006080;"&gt;"100"&lt;/span&gt;))&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum5" style="color: #606060;"&gt;   5:&lt;/span&gt;     {&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum6" style="color: #606060;"&gt;   6:&lt;/span&gt;         Console.SetOut(sw);&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum7" style="color: #606060;"&gt;   7:&lt;/span&gt;         Console.SetIn(sr);&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum8" style="color: #606060;"&gt;   8:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum9" style="color: #606060;"&gt;   9:&lt;/span&gt;         &lt;span style="color: green;"&gt;// Act&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum10" style="color: #606060;"&gt;  10:&lt;/span&gt;         SevenBoom.Program.Main();&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum11" style="color: #606060;"&gt;  11:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum12" style="color: #606060;"&gt;  12:&lt;/span&gt;         &lt;span style="color: green;"&gt;// Assert&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum13" style="color: #606060;"&gt;  13:&lt;/span&gt;         var result = sw.ToString();&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum14" style="color: #606060;"&gt;  14:&lt;/span&gt;         Assert.IsFalse(result.Contains(&lt;span style="color: #006080;"&gt;'7'&lt;/span&gt;));&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum15" style="color: #606060;"&gt;  15:&lt;/span&gt;     }&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum16" style="color: #606060;"&gt;  16:&lt;/span&gt; }&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;That’s it! I set the input that the user would have entered in line #7, and redirect the I/O in lines 9-10. All that remains is to assert that the output in line #16 meets the expectations.&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;By the way, this works exactly the same in Java as it does in C#. The difference is that in Java you will use &lt;strong&gt;System.setIn()&lt;/strong&gt; and &lt;strong&gt;System.setOut()&lt;/strong&gt; to set the &lt;em&gt;PrintStreams&lt;/em&gt; (the In and Out properties used in Console.Read &amp;amp; Console.Write).&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;So now you can write test-driven (and behavior driven) console applications with greater ease. &lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;Hope this helps,&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;Assaf.&lt;/div&gt;&lt;br /&gt;&lt;div class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:4e1c7a51-c2a5-4b1f-b242-2708e8936a09" style="display: inline; float: none; margin: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Agile" rel="tag"&gt;Agile&lt;/a&gt;,&lt;a href="http://technorati.com/tags/BDD" rel="tag"&gt;BDD&lt;/a&gt;,&lt;a href="http://technorati.com/tags/C%23" rel="tag"&gt;C#&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Java" rel="tag"&gt;Java&lt;/a&gt;,&lt;a href="http://technorati.com/tags/TDD" rel="tag"&gt;TDD&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Test" rel="tag"&gt;Test&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Unit+Tests" rel="tag"&gt;Unit Tests&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2660291115609609354-4030882562403030937?l=www.softwareandi.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.softwareandi.com/feeds/4030882562403030937/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.softwareandi.com/2012/02/how-to-write-automated-tests-for.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2660291115609609354/posts/default/4030882562403030937'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2660291115609609354/posts/default/4030882562403030937'/><link rel='alternate' type='text/html' href='http://www.softwareandi.com/2012/02/how-to-write-automated-tests-for.html' title='How to Write Automated Tests for Console Applications'/><author><name>Assaf Stone</name><uri>http://www.blogger.com/profile/14023994489658711542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_njIZU_X1s08/Sb0rpRzfcxI/AAAAAAAAABM/a0wzTXU3Grg/S220/Me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/-wBFPB8wDfs8/Ty5rZye7VzI/AAAAAAAAAec/8O9XZJ0SE7M/s72-c/command_line_interface_thumb%25255B1%25255D.png?imgmax=800' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2660291115609609354.post-2865725295227038009</id><published>2012-01-29T13:11:00.001+02:00</published><updated>2012-02-18T12:46:27.113+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='User Story'/><category scheme='http://www.blogger.com/atom/ns#' term='Definition of Done'/><category scheme='http://www.blogger.com/atom/ns#' term='Scrum'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><title type='text'>10 Signs that Your Team Isn’t Really Agile</title><content type='html'>&lt;p align="justify"&gt;[&lt;strong&gt;UPDATE&lt;/strong&gt; – This post was recently translated by Choepidiui (I hope I got the name right) into Korean. For the Korean version of this post, please go to his &lt;a href="http://choipd.wordpress.com/2012/02/11/당신-팀이-진정한-애자일이-아니란-열-가지-징후들/"&gt;site&lt;/a&gt;]&lt;/p&gt; &lt;p align="justify"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px 0px 0px 8px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" border="0" align="right" src="http://www.cksinfo.com/clipart/education/signs/caution.png" width="166" height="166"&gt;With all the hype in the software industry about Agile, Scrum and so on, it is no surprise that many companies hear or read about the virtues of these methods, perhaps at a conference or in a technical white paper, and think “we need this here”. Unfortunately, some organizations are not as ready to make the mental shift required to embrace the agile way of doing things…&lt;/p&gt; &lt;p align="justify"&gt;Below is a (by no means conclusive) list of signs that your team waded in toe-deep, rather than going the whole nine yards:&lt;/p&gt; &lt;h3&gt;You might not be truly agile if…&lt;/h3&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;h3&gt;&lt;/h3&gt; &lt;h4&gt;1. Your team is not responsible for the entire story&lt;/h4&gt; &lt;p align="justify"&gt;Perhaps the most important aspect of an agile team is that it is &lt;strong&gt;cross functional&lt;/strong&gt;. This means that the team, &lt;strong&gt;as a whole&lt;/strong&gt;,&lt;strong&gt; &lt;/strong&gt;have all the skills required to deliver a &lt;strong&gt;valuable product increment&lt;/strong&gt;. If a team has only client developers, then all server-side tasks are probably relegated to a different team. In this case, the team is &lt;strong&gt;not&lt;/strong&gt; handling a story from end to end; when they complete their work, no value has been added to the product – &lt;strong&gt;not in the eyes of the customer!&lt;/strong&gt; Teams that work like this resemble a factory where the product sits on the conveyor belt and different layers are added to it by different teams. At no moment till the last team does its thing is the feature (or product) done.&lt;/p&gt; &lt;p align="justify"&gt;It is possible to have a successful development process without cross-functional (feature) teams, but it simply isn’t agile.&lt;/p&gt; &lt;h4&gt;2. Testing is done by another team&lt;/h4&gt; &lt;p align="justify"&gt;Another equally important quality of an agile team is the ability to deliver a &lt;strong&gt;working product increment&lt;/strong&gt;. If the developers call a feature that has merely been coded and not tested “done”, then there is a serious flaw with their &lt;strong&gt;definition of done&lt;/strong&gt;. This is often another example of not being cross-functional: QA is simply another team. In order for a team’s work to be considered &lt;strong&gt;done&lt;/strong&gt;, it should be tested and integrated and ready to use.&lt;/p&gt; &lt;h4&gt;3. You are not INVESTing in your user stories&lt;/h4&gt; &lt;p align="justify"&gt;&lt;a href="http://en.wikipedia.org/wiki/INVEST_(mnemonic)"&gt;INVEST&lt;/a&gt;, is a mnemonic acronym coined by Bill Wake that describes the values of a good user story: &lt;b&gt;Independent&lt;/b&gt; of other user stories, &lt;b&gt;Negotiable&lt;/b&gt; scope up to the sprint in which they’re developed, &lt;b&gt;Valuable&lt;/b&gt; to the end user or customer, &lt;b&gt;Estimable&lt;/b&gt; by the development team, &lt;b&gt;Sized appropriately&lt;/b&gt; so that the team can complete a few of them in one sprint, and &lt;b&gt;Testable&lt;/b&gt; so that the team can prove that they have successfully completed the requirements.  &lt;p align="justify"&gt;Only if the product owner &lt;em&gt;&lt;strong&gt;INVEST&lt;/strong&gt;&lt;/em&gt;s&lt;em&gt;&lt;strong&gt; &lt;/strong&gt;&lt;/em&gt;in the stories, will he be able to order them by their value to their customer, and be able to promise that when each is complete, the customer will receive a valuable increment to the product. Likewise, the team will be able to deliver these increments rapidly, and with confidence in their quality.  &lt;h3&gt;&lt;/h3&gt; &lt;h4&gt;4. Tasks are assigned to team members by a manager&lt;/h4&gt; &lt;p align="justify"&gt;In a truly agile team, each member can pick which tasks he or she will work on next, as long as it pertains to the next most valuable user story. Traditionally, project managers or team leaders would assign tasks to team members, often months in advance. Even though this is done for the sake of optimizing a project schedule, it is a &lt;strong&gt;&lt;u&gt;wasteful&lt;/u&gt;&lt;/strong&gt; process that can’t possibly take into account how the entire project might change over time, nor what the team members’ skills and desires might be at the time. &lt;/p&gt; &lt;p align="justify"&gt;A team member may want to focus on improving his skills, or try to learn to do something outside his comfort zone. A responsible, self-managing team will find a way to make sure the tasks get done as soon as needed and in line with the reality of the project as it is at the present. The best the manager can truly hope for is to get out of the way. Besides, he has more important things to do.&lt;/p&gt; &lt;p align="justify"&gt;The only time a project manager should expend the effort of allocating resources is when a task requires a &lt;strong&gt;resource that the team doesn’t have&lt;/strong&gt;. Those should be few and far between. If this is a recurring issue, it is a sign that the team isn’t cross-functional enough (see the first point, above).&lt;/p&gt; &lt;h4&gt;5. Your team is told how much work to commit to&lt;/h4&gt; &lt;p align="justify"&gt;If a PM gives the team a certain set of resources (members), a deadline (release or sprint), and then tells them how much work they should commit to (or vetoes their commitment), then the project manager is guilty of attempting to break the iron triangle. A team should be able to commit to as much work per iteration as they believe they can (and should base their estimates on past experience). &lt;/p&gt; &lt;p align="justify"&gt;If this isn’t the case, then there is nothing agile about the plan; the plan was set in advance, etched in stone, and you aren’t willing to renegotiate it, even at the &lt;strong&gt;implicit expense of quality.&lt;/strong&gt;&lt;/p&gt; &lt;p align="justify"&gt;For a team to be truly agile, it must be accepted that the plan might be delivered with less than all of the stories originally planned (and it should be the least valuable ones that get booted).&lt;/p&gt; &lt;h4&gt;6. You are reporting rather than discussing your progress&lt;/h4&gt; &lt;p align="justify"&gt;A subtle and insidious sign that you aren’t really agile is that you report your progress to the &lt;strike&gt;project manager&lt;/strike&gt; scrum master, not to the team, at the daily stand up meeting. The meeting is there so that the (entire) team will have a sense of what each other is doing, what they are stuck on, and what they are planning to do. &lt;/p&gt; &lt;p align="justify"&gt;Despite the &lt;strong&gt;seemingly managerial &lt;/strong&gt;nature of the three questions asked (“what did you do since then last meeting?”, “what are you planning on doing till the next one?”, “what might block your progress?”) , the questions are not there for the manager to keep tabs on the team, but to elicit another team member’s thoughts on the matter (“can I help?”, “does this affect my tasks?”, etc.).&lt;/p&gt; &lt;p align="justify"&gt;Each team member should be addressing the rest of the team. The PM should be there to listen, and perhaps answer questions; he should not become the focus of the meeting.&lt;/p&gt; &lt;h4&gt;7. You are not focusing on completing the most important user story&lt;/h4&gt; &lt;p align="justify"&gt;Sometimes, a team may divide their work into stories and break them down into tasks, but instead of &lt;strong&gt;swarming&lt;/strong&gt; on the topmost story and divide the tasks among members, the &lt;strong&gt;stories&lt;/strong&gt; are divided. This has two un-agile consequences: &lt;/p&gt; &lt;p align="justify"&gt;First, at a given time, all of the stories may be partially completed (&lt;em&gt;regardless of value&lt;/em&gt;), instead of part of the stories (&lt;em&gt;based on value&lt;/em&gt;), totally complete. This transforms the team and the iteration plan into a waterfall-ish plan, rather than an agile one, as its success is based on the premise (hope) that everything will be completed on time, otherwise, nothing is.&lt;/p&gt; &lt;p align="justify"&gt;Second problem is that each member’s work has less impact and import to his team members. It is not &lt;em&gt;their&lt;/em&gt; story he’s talking about, after all. The other members have less of an incentive to listen and help. The daily meeting becomes a mere progress report that can easily be replaced with a query to the chosen ALM tool. &lt;/p&gt; &lt;p align="justify"&gt;For a team to be agile, they have to be geared towards working on the same problem, and put all their effort into cranking out &lt;strong&gt;&lt;em&gt;complete &lt;/em&gt;&lt;/strong&gt;features, as quickly as possible.&lt;/p&gt; &lt;h4&gt;8. You changed to agile last year, and haven’t changed a thing since&lt;/h4&gt; &lt;p align="justify"&gt;Here’s a tricky one – you think you nailed it; you may have brought in an expert way back then, and we worked out a plan, and it seems to work, and now it’s etched in stone and&amp;nbsp; nobody can change it. Well guess what – you’re missing on an important part of being agile: &lt;strong&gt;Actually being agile!&lt;/strong&gt; Reality changes, new ideas and new influences come up all the time. There’s always something that could be done better. &lt;/p&gt; &lt;p align="justify"&gt;An agile team holds retrospectives on a regular basis, where they put their heads together to think of what they &lt;strong&gt;did right&lt;/strong&gt; since the last meeting, what they &lt;strong&gt;could do better&lt;/strong&gt; in the next iteration, and &lt;strong&gt;what visible actions&lt;/strong&gt; need to be taken to improve.&lt;/p&gt; &lt;p align="justify"&gt;These visible actions most often manifest as a &lt;strong&gt;change &lt;/strong&gt;to the work process.&lt;/p&gt; &lt;p align="justify"&gt;&lt;em&gt;Note: If you are using an IT-based ALM tool to manage your work process (e.g. TFS, Greenhopper, etc., Version One) you should take care to account for the impact of the change on the tool.&lt;/em&gt;&lt;/p&gt; &lt;h3&gt;Time to Publish&lt;/h3&gt; &lt;p align="justify"&gt;Sometimes there are unforeseeable problems that mean you reach the deadline, and you haven’t completed all of your planned work. If you storm your stories and make sure you deliver one &lt;strong&gt;complete story at a time&lt;/strong&gt;, ordered by priority, you will likely have a good enough product (yes I know I made this point before, but it’s worth repeating…)&lt;/p&gt; &lt;p align="justify"&gt;So it’s time to post. I know I &lt;strong&gt;promised&lt;/strong&gt; 10 signs in the title, but it turns out that I can’t. At least I came through with the most important ones, fully ready on time, no?&lt;/p&gt; &lt;p align="justify"&gt;Well, if you don’t feel that way, and you think it is more important to deliver everything, than it is to meet a deadline, then here’s sign #9.&lt;/p&gt; &lt;h4&gt;9. You are not ready to release on time with an incomplete scope&lt;/h4&gt; &lt;p align="justify"&gt;If you can’t organize your work in such a way that you’re ready to deliver the most important features, those you’ve completed, at any given moment (especially at the deadline), then &lt;strong&gt;your plan isn’t agile&lt;/strong&gt;. You are likely building your product in layers, like a house, rather than in vertical slices, of product value increment.&lt;/p&gt; &lt;p align="justify"&gt;An agile product is built one user story (or value increment, or minimal marketable feature – doesn’t matter how you call it) at a time. For more on it, read my post on &lt;a href="http://www.softwareandi.com/2012/01/demystifying-agile-how-to-plan-releases.html"&gt;how to plan agile releases&lt;/a&gt;.&lt;/p&gt; &lt;h3 align="justify"&gt;Here’s another one:&lt;/h3&gt; &lt;p&gt;You can always release the remaining features at a later date, with a minor release increment…&lt;/p&gt; &lt;h4&gt;10. You are not getting customer feedback every sprint&lt;/h4&gt; &lt;p align="justify"&gt;At the end of every sprint, an agile team demonstrates the latest increment to the product. The audience may include any and all stakeholders in the project, it definitely includes the product owner / project manager and should, when relevant, &lt;strong&gt;include the customer&lt;/strong&gt;. Some teams use this as some formal milestone to show their progress, and continue with the (original) plan for the next sprint – regardless of the results! &lt;strong&gt;This is not agile&lt;/strong&gt;. &lt;/p&gt; &lt;p align="justify"&gt;A truly agile team will leverage the demo to elicit comments from the stakeholders about the recent development, to make sure that they are on track, and that if the requirements or environment changed during the last sprint, these changes will be reflected in the &lt;strong&gt;product backlog&lt;/strong&gt; and potentially in the &lt;strong&gt;upcoming sprint backlog&lt;/strong&gt;!&lt;/p&gt; &lt;p align="justify"&gt;Remember, and agile team &lt;strong&gt;embraces change&lt;/strong&gt;, rather than avoiding it.&lt;/p&gt; &lt;h3 align="justify"&gt;Summary&lt;/h3&gt; &lt;p align="justify"&gt;There. That’s 10 signs. I hope you found them enjoyable as well as educating. &lt;/p&gt; &lt;p align="justify"&gt;So do &lt;strong&gt;you&lt;/strong&gt; have any more signs that should be added to this list? &lt;strong&gt;Please add them in the comments&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;Assaf.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;h3&gt;[EDIT]&lt;/h3&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;h4 align="justify"&gt;11. You’re not agile if you can’t deal with a change in the original scope.&lt;/h4&gt; &lt;p align="justify"&gt;Now, I know I said there’d be (only) 10 signs, but based on early, prerelease feedback, I was asked to add another one. I showed them to a friend of mine before posting, and he liked what he saw. In fact, he liked the idea so much, that he suggested another one that I might add. After the release however, he suggested I change the wording. I hope you like this one better..&lt;/p&gt; &lt;p align="justify"&gt;&lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://lh4.ggpht.com/--HYhChuB0O0/TyY9-7NWOfI/AAAAAAAAAeQ/J5r2AIIO2NE/wlEmoticon-smile%25255B2%25255D.png?imgmax=800"&gt;&lt;/p&gt; &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:ef9c6409-ccb6-4d31-a1bc-2ddb4d670e26" class="wlWriterSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Agile" rel="tag"&gt;Agile&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Definition+of+Done" rel="tag"&gt;Definition of Done&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Scrum" rel="tag"&gt;Scrum&lt;/a&gt;,&lt;a href="http://technorati.com/tags/User+Story" rel="tag"&gt;User Story&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2660291115609609354-2865725295227038009?l=www.softwareandi.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.softwareandi.com/feeds/2865725295227038009/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.softwareandi.com/2012/01/10-signs-that-your-team-isnt-really.html#comment-form' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2660291115609609354/posts/default/2865725295227038009'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2660291115609609354/posts/default/2865725295227038009'/><link rel='alternate' type='text/html' href='http://www.softwareandi.com/2012/01/10-signs-that-your-team-isnt-really.html' title='10 Signs that Your Team Isn’t Really Agile'/><author><name>Assaf Stone</name><uri>http://www.blogger.com/profile/14023994489658711542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_njIZU_X1s08/Sb0rpRzfcxI/AAAAAAAAABM/a0wzTXU3Grg/S220/Me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/--HYhChuB0O0/TyY9-7NWOfI/AAAAAAAAAeQ/J5r2AIIO2NE/s72-c/wlEmoticon-smile%25255B2%25255D.png?imgmax=800' height='72' width='72'/><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2660291115609609354.post-4063942124333051238</id><published>2012-01-22T16:38:00.001+02:00</published><updated>2012-01-22T16:38:31.695+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Sprint Planning'/><category scheme='http://www.blogger.com/atom/ns#' term='Story Points'/><category scheme='http://www.blogger.com/atom/ns#' term='Scrum'/><category scheme='http://www.blogger.com/atom/ns#' term='Release Planning'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><category scheme='http://www.blogger.com/atom/ns#' term='Ideal Hours'/><category scheme='http://www.blogger.com/atom/ns#' term='Estimation'/><title type='text'>How to Use Agile Estimation in Scrum Projects</title><content type='html'>&lt;p align="justify"&gt;&lt;a href="http://lh6.ggpht.com/-vx6iljvmqw4/TxwfS3sG54I/AAAAAAAAAdA/6WSS4m_mHuk/s1600-h/image%25255B3%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" align="right" src="http://lh5.ggpht.com/-ddB-Xhc5yOQ/TxwfTlxGN9I/AAAAAAAAAdI/xFsUhzmSHtQ/image_thumb%25255B1%25255D.png?imgmax=800" width="240" height="166"&gt;&lt;/a&gt;Like it or not, estimations are a big part of professional and commercial software development. Estimations are used in most projects regardless of methodology: Waterfall or Scrum, traditional or agile, every stakeholder needs to know the numbers. Projects succeed or fail as a result of these. Unfortunately, humans, as a rule, tend to suck at estimating.&lt;/p&gt; &lt;p align="justify"&gt;This post will compare and contrast the different estimation techniques and applications used by both agile and non-agile methodologies, and explain how to use them (and not &lt;em&gt;mis&lt;/em&gt;use them), particularly in a Scrum project.&lt;/p&gt; &lt;h3&gt;What is Wrong with how We Estimate?&lt;/h3&gt; &lt;p align="justify"&gt;&lt;a href="http://lh5.ggpht.com/-h9GjYQrteyQ/TxwfURqfRdI/AAAAAAAAAdQ/1FFQOeKxhfU/s1600-h/image%25255B7%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px 8px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" align="left" src="http://lh6.ggpht.com/-dF4oLNaIioE/TxwfVOkBqxI/AAAAAAAAAdY/LTAYTrkCceo/image_thumb%25255B3%25255D.png?imgmax=800" width="160" height="240"&gt;&lt;/a&gt;Traditional project plans involve using &lt;strong&gt;calendric&lt;/strong&gt; estimates in order to synchronize the development efforts of the team(s) by placing the work on a time line (usually, using a Gantt chart). This means that for every part of the solution, the developers must &lt;strong&gt;predict&lt;/strong&gt; the when it will be ready (i.e. the delivery date). This means they need to know when they will &lt;em&gt;start&lt;/em&gt;, how much time it will take to deliver the work, and how much time will be “wasted” on &lt;strong&gt;impediments&lt;/strong&gt; (both foreseeable and unforeseeable). While knowing this makes the project planners’ work easier, obtaining this knowledge is extremely difficult; Estimating the development effort is difficult enough, but predicting the total amount of time that will be spent &lt;em&gt;not&lt;/em&gt; developing is near impossible. &lt;/p&gt; &lt;p align="justify"&gt;What’s worse, is that contrary to popular belief, the &lt;a href="http://en.wikipedia.org/wiki/Law_of_large_numbers"&gt;Law of Large Numbers&lt;/a&gt; does &lt;strong&gt;not&lt;/strong&gt; apply to project plans! Due to the nature of dependencies, &lt;strong&gt;a single late dependency is enough&lt;/strong&gt; to push the delivery date of a &lt;em&gt;dependent&lt;/em&gt; component. On the other hand, in order for a component to be delivered &lt;strong&gt;early&lt;/strong&gt;, it is &lt;strong&gt;necessary that all dependencies&lt;/strong&gt; will be completed early. In short, &lt;strong&gt;lateness aggregates, while earliness does not.&lt;/strong&gt;&lt;/p&gt; &lt;p align="justify"&gt;A side effect of this is that the more complex the Gantt based project is, the more lateness is likely to be accumulated, as the project advances, and the further we are in the project, the more we run the risk of being late.&lt;/p&gt; &lt;p align="justify"&gt;Of course, a late project means that the software is delivered at a &lt;strong&gt;higher cost&lt;/strong&gt;, with &lt;strong&gt;less features&lt;/strong&gt;, and / or simply &lt;strong&gt;later than expected and agreed&lt;/strong&gt;. This means that a late project often becomes a &lt;strong&gt;failed&lt;/strong&gt; project.&lt;/p&gt; &lt;p align="justify"&gt;Clearly, a different method of doing things is necessary; Agile methodologists came up with different estimation techniques to reduce the chances and ramifications of failure.&lt;/p&gt; &lt;h3&gt;Agile Estimations Are Easier to Make&lt;/h3&gt; &lt;p align="justify"&gt;The three most common agile estimations are &lt;strong&gt;T-Shirt Sizes&lt;/strong&gt;, &lt;strong&gt;Ideal Time&lt;/strong&gt;, and &lt;strong&gt;Story Points&lt;/strong&gt;:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;div align="justify"&gt;&lt;strong&gt;T-Shirt Size &lt;/strong&gt;estimations are coarse grained separation of requirements into buckets of &lt;strong&gt;small&lt;/strong&gt;, &lt;strong&gt;medium&lt;/strong&gt;, &lt;strong&gt;large&lt;/strong&gt;, or &lt;strong&gt;very-large&lt;/strong&gt; efforts. This estimate is of course extremely easy to make intuitively, and of course insufficient as a basis for project planning due to its low resolution, but is often &lt;strong&gt;sufficient for the purpose of pricing single features&lt;/strong&gt; (example scenario might be when required to give a customer a &lt;strong&gt;cost estimate&lt;/strong&gt; for some &lt;strong&gt;custom feature&lt;/strong&gt; in the system).&lt;/div&gt;&lt;/li&gt; &lt;li&gt; &lt;div align="justify"&gt;&lt;strong&gt;Ideal Time&lt;/strong&gt; estimates are similar to &lt;em&gt;calendric&lt;/em&gt; estimates in that they involve high resolution predictions of the effort involved in developing a feature. The difference is that ideal estimates are made while &lt;strong&gt;ignoring&lt;/strong&gt; all &lt;strong&gt;surprises and interferences&lt;/strong&gt;! The question that ideal estimates answer is “how much time will it take to develop a solution, &lt;strong&gt;assuming you work on nothing else, and nothing else disturbs you&lt;/strong&gt;”. Taking the &lt;em&gt;unknowable&lt;/em&gt; impediment factor out of the equation improves the accuracy of the estimates, but you can’t simply substitute ideal time for calendric time because the unknown impediments &lt;em&gt;still&lt;/em&gt; &lt;em&gt;do&lt;/em&gt; exist, and the fact remains that humans aren’t good at making absolute estimates, with no point of reference. In Scrum, &lt;strong&gt;Ideal Hours&lt;/strong&gt; are often used to estimate the effort of completing &lt;strong&gt;tasks&lt;/strong&gt;, which should be short, simple and straightforward.&lt;/div&gt;&lt;/li&gt; &lt;li&gt; &lt;div align="justify"&gt;&lt;strong&gt;Story Points&lt;/strong&gt; are a radically different method of estimating development effort. With story points you do not go out and say how much work something is, in and of itself, but rather state how the &lt;strong&gt;effort&lt;/strong&gt; to develop one component &lt;strong&gt;compares&lt;/strong&gt; to the effort of developing another. These estimates are much easier to make, and &lt;strong&gt;surprisingly accurate&lt;/strong&gt; because we are &lt;em&gt;much better&lt;/em&gt; at comparing things than estimating them. Of course, comparisons and relationships have &lt;strong&gt;no unit of measure&lt;/strong&gt;, and thus can’t be used to establish a timeline. At least not in the normal sense. In Scrum, &lt;strong&gt;Story Points&lt;/strong&gt; are usually used to estimate the effort of completing &lt;strong&gt;user stories&lt;/strong&gt; (hence the name).&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt; &lt;h3&gt;Agile Estimation Techniques Make Better Plans&lt;/h3&gt; &lt;p align="justify"&gt;&lt;a href="http://lh6.ggpht.com/-cyonf3zGmgo/TxwfVwg6GDI/AAAAAAAAAdg/scfRfItyLL0/s1600-h/image%25255B20%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px 7px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" align="left" src="http://lh4.ggpht.com/-LITSqMWiYvU/TxwfWzZES7I/AAAAAAAAAdo/jMs58Xcba6Y/image_thumb%25255B9%25255D.png?imgmax=800" width="106" height="128"&gt;&lt;/a&gt;While agile estimation techniques tend to end up more accurate than calendric estimates, the estimations are still guesses, and guesses still mean risk. Agile teams try to reduce this risk by reducing the amount of guesswork involved in the project plan.&lt;/p&gt; &lt;p align="justify"&gt;Classic project plans involve estimating the time it will take to deliver &lt;strong&gt;each component&lt;/strong&gt;, and add up all the estimates to create &lt;strong&gt;one big guess-of-a-plan&lt;/strong&gt;. While agile project plans involve estimating the work on each component as well, that is where the similarity &lt;strong&gt;ends&lt;/strong&gt;.&lt;/p&gt; &lt;p align="justify"&gt;&lt;a href="http://lh5.ggpht.com/-7LeqjtPu-hA/TxwfXqYeheI/AAAAAAAAAdw/YPZYLJDByMk/s1600-h/image%25255B16%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px 0px 0px 6px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" align="right" src="http://lh4.ggpht.com/-XpjEhAx4dEI/TxwfYWNCkKI/AAAAAAAAAd4/F9n3LEsSOOA/image_thumb%25255B7%25255D.png?imgmax=800" width="151" height="150"&gt;&lt;/a&gt;The agile project plan is &lt;strong&gt;not&lt;/strong&gt; based on the &lt;strong&gt;prediction&lt;/strong&gt; of work effort, but rather on &lt;strong&gt;empirical evidence&lt;/strong&gt;! Only the team’s first iteration (&lt;em&gt;ever&lt;/em&gt;) is planned based on a prediction. The rest are based on the &lt;strong&gt;measured&lt;/strong&gt; evidence of &lt;strong&gt;previous&lt;/strong&gt; iterations (or &lt;em&gt;sprints&lt;/em&gt;, as they are often called in Scrum-shops). The team estimates that it will successfully complete as much work in the next iteration as it did in the previous iteration(s).&lt;/p&gt; &lt;p align="justify"&gt;For example, if a team successfully completed 120 &lt;strong&gt;ideal hours&lt;/strong&gt; worth of work (that is, the amount of work they did added up to what they estimated as 120 ideal hours), then they will estimate that they will do the same in the next iteration. This technique works the same with &lt;strong&gt;story points&lt;/strong&gt;: A team that can complete an average of 50 story points in an iteration is likely to repeat that success in the next one. A team’s &lt;em&gt;velocity&lt;/em&gt;, or &lt;em&gt;cadence&lt;/em&gt; can then be measured in &lt;strong&gt;ideal hours per iteration&lt;/strong&gt; or &lt;strong&gt;story points per sprint&lt;/strong&gt;.&lt;/p&gt; &lt;p align="justify"&gt;What about interruptions? Well here’s the beauty of the technique: You can &lt;strong&gt;consistently&lt;/strong&gt;&amp;nbsp;&lt;strong&gt;account &lt;/strong&gt;for the predictable ones (e.g. vacations, repeat meetings, scheduled events) and factor those out, and you can &lt;strong&gt;consistently ignore&lt;/strong&gt; the unplanned ones, as they are likely to be more or less an equal part of every iteration of the team.&lt;/p&gt; &lt;h3&gt;Where’s the Difference?&lt;/h3&gt; &lt;p align="justify"&gt;The difference between &lt;strong&gt;predictive&lt;/strong&gt; &lt;strong&gt;plans &lt;/strong&gt;(classic, waterfall-ish, Gantt based) and &lt;strong&gt;empirical plans&lt;/strong&gt; (Agile, Scrum) are:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;div align="justify"&gt;&lt;strong&gt;Predictive&lt;/strong&gt; plans are based on more &lt;strong&gt;estimation&lt;/strong&gt; (i.e. guesses, i.e. risk) than empirical ones&lt;/div&gt;&lt;/li&gt; &lt;li&gt; &lt;div align="justify"&gt;&lt;strong&gt;Empirical&lt;/strong&gt; plans have an &lt;strong&gt;increasingly sound&lt;/strong&gt; statistical ground as the project progresses&lt;/div&gt;&lt;/li&gt; &lt;li&gt; &lt;div align="justify"&gt;&lt;strong&gt;Predictive&lt;/strong&gt; plans have an &lt;strong&gt;increasing chance of running late&lt;/strong&gt;, as the project progresses&lt;/div&gt;&lt;/li&gt; &lt;li&gt; &lt;div align="justify"&gt;With &lt;strong&gt;predictive&lt;/strong&gt; plans the unknown factors &lt;strong&gt;aggregate&lt;/strong&gt;, with &lt;strong&gt;empirical&lt;/strong&gt; plans they &lt;strong&gt;cancel&lt;/strong&gt; each other out.&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt; &lt;p align="justify"&gt;Finally, as stated in the &lt;a href="http://www.softwareandi.com/2012/01/demystifying-agile-how-to-plan-releases.html"&gt;previous post&lt;/a&gt;, agile plans, being based on stories that are designed to be discrete units of business-value, with &lt;strong&gt;as little interdependencies as possible&lt;/strong&gt;, agile plans further mitigate the risk of estimation failure by causing the ramification to be failure to deliver on time &lt;strong&gt;only the least valuable features&lt;/strong&gt;!&lt;/p&gt; &lt;h3&gt;In Conclusion&lt;/h3&gt; &lt;p align="justify"&gt;To me, the agile choice is a no brainer. Agile plans are simply safer to execute, the chance of failure is lesser, and the result is less harmful. I would even go as far as to say that companies promising to deliver a non-trivial project without using an agile plan of some sorts are being less than honest – with themselves &lt;em&gt;as well as&lt;/em&gt; the customer.&lt;/p&gt; &lt;p align="justify"&gt;&lt;a href="http://lh6.ggpht.com/-DOfDCiGFWvc/TxwfY2LWNjI/AAAAAAAAAd8/q_L9-ltuuBg/s1600-h/image%25255B24%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" align="right" src="http://lh3.ggpht.com/-A2Cvh2-yBXI/TxwfZrK4uGI/AAAAAAAAAeI/xDnuJgbY3lc/image_thumb%25255B11%25255D.png?imgmax=800" width="226" height="151"&gt;&lt;/a&gt;Moreover, I think it is high time that customers &lt;strong&gt;&lt;em&gt;demand&lt;/em&gt;&lt;/strong&gt; their contractors to use agile methods in order to win contracts.&lt;/p&gt; &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:e7090a0c-b395-4aa2-bd83-bc120f6afd0f" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Agile" rel="tag"&gt;Agile&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Estimation" rel="tag"&gt;Estimation&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Scrum" rel="tag"&gt;Scrum&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Release+Planning" rel="tag"&gt;Release Planning&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Sprint+Planning" rel="tag"&gt;Sprint Planning&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Story+Points" rel="tag"&gt;Story Points&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Ideal+Hours" rel="tag"&gt;Ideal Hours&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2660291115609609354-4063942124333051238?l=www.softwareandi.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.softwareandi.com/feeds/4063942124333051238/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.softwareandi.com/2012/01/how-to-use-agile-estimation-in-scrum.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2660291115609609354/posts/default/4063942124333051238'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2660291115609609354/posts/default/4063942124333051238'/><link rel='alternate' type='text/html' href='http://www.softwareandi.com/2012/01/how-to-use-agile-estimation-in-scrum.html' title='How to Use Agile Estimation in Scrum Projects'/><author><name>Assaf Stone</name><uri>http://www.blogger.com/profile/14023994489658711542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_njIZU_X1s08/Sb0rpRzfcxI/AAAAAAAAABM/a0wzTXU3Grg/S220/Me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/-ddB-Xhc5yOQ/TxwfTlxGN9I/AAAAAAAAAdI/xFsUhzmSHtQ/s72-c/image_thumb%25255B1%25255D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2660291115609609354.post-6078732433559766008</id><published>2012-01-05T18:36:00.001+02:00</published><updated>2012-01-15T14:53:54.647+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Sprint Planning'/><category scheme='http://www.blogger.com/atom/ns#' term='User Story'/><category scheme='http://www.blogger.com/atom/ns#' term='Scrum'/><category scheme='http://www.blogger.com/atom/ns#' term='Release Planning'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><category scheme='http://www.blogger.com/atom/ns#' term='Estimation'/><title type='text'>Demystifying Agile: How to Plan Releases with Scrum</title><content type='html'>&lt;p align="justify"&gt; &lt;p align="justify"&gt;&lt;a href="http://lh5.ggpht.com/-c3bHwTUtZk8/TwsP3rz7fjI/AAAAAAAAAcM/cD535KujZ3Q/s1600-h/no-release-voodoo%25255B3%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="no-release-voodoo" border="0" alt="no-release-voodoo" align="right" src="http://lh3.ggpht.com/-Ccw1hkbqr8o/TwsP42Ds-cI/AAAAAAAAAcU/dXXHygLuQWY/no-release-voodoo_thumb%25255B1%25255D.png?imgmax=800" width="223" height="240"&gt;&lt;/a&gt;The agile release process might sometimes seem like voodoo (or even &lt;em&gt;dark&lt;/em&gt; voodoo) to some managers and developers, particularly those more accustomed to the traditional way of planning processes used in waterfall projects. This post will explain the inherent problems with waterfall projects, how agile methodologies such as Scrum overcome these problems, and of course, the reasons that the agile release planning method works.&lt;/p&gt; &lt;h3&gt;&lt;/h3&gt; &lt;h3&gt;You Can’t Control Everything&lt;/h3&gt; &lt;p align="justify"&gt;&lt;a href="http://lh4.ggpht.com/-Xx2FNQ00iLA/TwsP5UHb_eI/AAAAAAAAAcc/vSgXUErtrlc/s1600-h/image%25255B7%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px; padding-top: 0px" title="image" border="0" alt="image" align="left" src="http://lh6.ggpht.com/-lwxg6Xv9X30/TwsP6bDtjWI/AAAAAAAAAck/yUP61cOMmbI/image_thumb%25255B3%25255D.png?imgmax=800" width="240" height="173"&gt;&lt;/a&gt;The &lt;a href="http://en.wikipedia.org/wiki/A_Guide_to_the_Project_Management_Body_of_Knowledge"&gt;PMBOK&lt;/a&gt; call it the project management triangle; the agile community call it the &lt;a href="http://www.ambysoft.com/essays/brokenTriangle.html"&gt;Iron Triangle&lt;/a&gt;. Regardless of the name, it is a real and hard constraint: Of the three aspects of the project – &lt;strong&gt;scope&lt;/strong&gt;, &lt;strong&gt;resources &lt;/strong&gt;(or cost), and &lt;strong&gt;time&lt;/strong&gt; you may pick and control any &lt;em&gt;two&lt;/em&gt;. The third cannot be controlled &lt;strong&gt;without harming the quality&lt;/strong&gt;, and is calculated (roughly) by the following formula:&lt;/p&gt; &lt;p align="center"&gt;&lt;a href="http://lh5.ggpht.com/-TEYLclLXZIY/TwsP67rGCQI/AAAAAAAAAcs/DkZ8JIZn83g/s1600-h/image%25255B3%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/-OGL-KikGpHU/TwsP7u7aMFI/AAAAAAAAAc0/qHYQSWFxNRs/image_thumb%25255B1%25255D.png?imgmax=800" width="211" height="25"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align="justify"&gt;This means that if you have a project where the budget is fixed, and there is a hard deadline (i.e. release date), then you cannot control the scope that will be delivered by the team by the time of the release.&lt;/p&gt; &lt;p align="justify"&gt;Moreover, &lt;a href="http://en.wikipedia.org/wiki/Brooks's_law"&gt;&lt;strong&gt;Brook’s Law&lt;/strong&gt;&lt;/a&gt;, states that adding people to a late (i.e. already started) project will only make it &lt;em&gt;later&lt;/em&gt;. According to this, since the cost of a &lt;strong&gt;software project&lt;/strong&gt; is mostly the cost of the team members, the &lt;strong&gt;resources must remain fixed for the project&lt;/strong&gt; (or release).&lt;/p&gt; &lt;p align="justify"&gt;Nevertheless, traditional project managers seem to try to define the entire &lt;strong&gt;scope&lt;/strong&gt; of a project, define the releases and milestones (i.e. the &lt;strong&gt;time&lt;/strong&gt;), with a fixed preset budget (i.e. &lt;strong&gt;cost&lt;/strong&gt;).&lt;/p&gt; &lt;p align="justify"&gt;It is simply doomed to fail. According to the &lt;a href="http://standishgroup.com/about/index.php"&gt;Standish Group&lt;/a&gt; and the &lt;a href="http://www1.standishgroup.com/newsroom/chaos_2009.php"&gt;Chaos Report&lt;/a&gt;, most projects (68 percent) do.&lt;/p&gt; &lt;h3&gt;&lt;/h3&gt; &lt;h3&gt;Why do Projects Fail?&lt;/h3&gt; &lt;p align="justify"&gt;According to &lt;a href="http://martinfowler.com/bliki/WhatIsFailure.html"&gt;Martin Fowler&lt;/a&gt;, it is not the &lt;em&gt;projects &lt;/em&gt;that fail, but rather the &lt;em&gt;estimates&lt;/em&gt; that fail; it is our attempt to calculate how much time it will take to deliver a certain scope with a certain amount of resources.&lt;/p&gt; &lt;p align="justify"&gt;I would argue, that the failure to estimate is the &lt;em&gt;reason&lt;/em&gt; that projects fail. &lt;a href="http://www.softwareandi.com/2011/08/another-stab-at-work-estimation.html"&gt;We really don’t know how to estimate&lt;/a&gt;. Projects fail because they &lt;strong&gt;rely too heavily&lt;/strong&gt; on the estimates.&lt;/p&gt; &lt;h3&gt;How do Agile Methods Reconcile with the Iron Triangle?&lt;/h3&gt; &lt;p&gt;Given values such as courage and honesty, it is no surprise that agile methodologists simply acknowledge that estimation is not a good basis for a release plan, and search for alternatives.&lt;/p&gt; &lt;p&gt;Given the Iron Triangle, Brook’s Law, and the fact that most customers demand a hard release date, an agile PM accepts that he cannot control the scope that will be delivered; that is, while the PM may make guesses (i.e. estimates) as to the content that will be delivered on the deadline, he cannot be sure that every last task will be completed.&lt;/p&gt; &lt;p&gt;What he can promise, and make certain of, is that he will deliver &lt;strong&gt;the best product possible&lt;/strong&gt; on the release date, with the &lt;strong&gt;rest of the desired features in consecutive releases&lt;/strong&gt;.&lt;/p&gt; &lt;h3&gt;How do Agile Methods Deliver the Best Product on Time?&lt;/h3&gt; &lt;p align="justify"&gt;By slicing the entire scope into vertical slices, small increments in &lt;em&gt;valuable&lt;/em&gt; functionality (often called &lt;strong&gt;user stories&lt;/strong&gt;), the agile PM now has a stack of user stories to be released, or a product backlog&lt;strong&gt;. &lt;/strong&gt;By defining the stories in such a way that they have as few interdependencies as possible, the PM may order them as he desires. The PM will of course, choose to order them by &lt;strong&gt;business value&lt;/strong&gt; to the customer.&lt;/p&gt; &lt;p align="justify"&gt;The development team, in turn, will swarm on each story, by order of value (priority), and focus on completely delivering one story at a time (completely means coding, testing, integrating and anything else required).&lt;/p&gt; &lt;p align="justify"&gt;In this way, at any given moment, including the release date, the team has a product that is shippable and is the most valuable product they &lt;em&gt;could&lt;/em&gt; &lt;em&gt;possibly &lt;/em&gt;develop.&lt;/p&gt; &lt;h3&gt;Is the Best Product Possible Good Enough?&lt;/h3&gt; &lt;p align="justify"&gt;While the best product might not be everything that was envisioned, because again – that is simply not possible: not with waterfall, not with agile, not anyway – the “&lt;strong&gt;Best Product” will have the capabilities most valued by the customer.&lt;/strong&gt;&lt;/p&gt; &lt;p align="justify"&gt;The &lt;a href="."&gt;findings&lt;/a&gt; of the Standish Group show that only 20% of the features in any given product are frequently used, while &lt;strong&gt;64% are rarely or never&lt;/strong&gt; used. Therefore, statistically speaking, even if you only complete 36% of your scope, you may still have a good enough product!&lt;/p&gt; &lt;p align="justify"&gt;Of course, assuming that you aren’t slacking, and the project’s deadline isn’t insanely short, it is more likely that you will complete a significantly larger portion of your scope. It is even possible that you will have a “good enough” product that you can ship even &lt;strong&gt;before the deadline&lt;/strong&gt;! There is not a single customer that will say no to reducing &lt;strong&gt;time to market&lt;/strong&gt;!&lt;/p&gt; &lt;p align="justify"&gt;So I’d say, yes – the Best Product &lt;em&gt;is&lt;/em&gt; good enough.&lt;/p&gt; &lt;p align="justify"&gt;And that’s how it’s done. I hope &lt;/p&gt; &lt;p align="justify"&gt;How about your products? Do you work this way? Are your experiences similar? Share!&lt;/p&gt; &lt;p align="justify"&gt;Thanks,&lt;/p&gt; &lt;p align="justify"&gt;Assaf.&lt;/p&gt; &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:215e11d6-d3e2-44dd-9ef2-435105af4296" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Agile" rel="tag"&gt;Agile&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Estimation" rel="tag"&gt;Estimation&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Scrum" rel="tag"&gt;Scrum&lt;/a&gt;,&lt;a href="http://technorati.com/tags/User+Story" rel="tag"&gt;User Story&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Release+Planning" rel="tag"&gt;Release Planning&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Sprint+Planning" rel="tag"&gt;Sprint Planning&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2660291115609609354-6078732433559766008?l=www.softwareandi.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.softwareandi.com/feeds/6078732433559766008/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.softwareandi.com/2012/01/demystifying-agile-how-to-plan-releases.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2660291115609609354/posts/default/6078732433559766008'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2660291115609609354/posts/default/6078732433559766008'/><link rel='alternate' type='text/html' href='http://www.softwareandi.com/2012/01/demystifying-agile-how-to-plan-releases.html' title='Demystifying Agile: How to Plan Releases with Scrum'/><author><name>Assaf Stone</name><uri>http://www.blogger.com/profile/14023994489658711542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_njIZU_X1s08/Sb0rpRzfcxI/AAAAAAAAABM/a0wzTXU3Grg/S220/Me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/-Ccw1hkbqr8o/TwsP42Ds-cI/AAAAAAAAAcU/dXXHygLuQWY/s72-c/no-release-voodoo_thumb%25255B1%25255D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2660291115609609354.post-7646138422030100424</id><published>2012-01-05T18:35:00.001+02:00</published><updated>2012-01-22T16:41:13.334+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scrum'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><title type='text'>Demystifying Agile</title><content type='html'>&lt;p align="justify"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" border="0" align="right" src="http://lh3.ggpht.com/_7PUa1gN7wbM/SRxE_tzQgDI/AAAAAAAACsE/JF4hkAjkCuk/crystal-ball.jpg" width="158" height="144"&gt;Understanding the mechanics of Scrum is easy; otherwise there’s no way they could be taught in 16 hours, in a Certified Scrum Master &lt;a href="http://www.scrumalliance.org/events/results?search%5Bevent_type%5D=course"&gt;class&lt;/a&gt;. Understanding &lt;strong&gt;&lt;em&gt;why&lt;/em&gt;&lt;/strong&gt; the mechanics work is a different thing altogether. In this series of posts, I will attempt to explain how and why they work the way they do; I firmly believe that attempting to use the mechanics of scrum without understanding the Agile spirit is a recipe for failure. I hope you enjoy the series.&lt;/p&gt; &lt;p align="justify"&gt;Table of Contents:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;div align="justify"&gt;&lt;a href="http://www.softwareandi.com/2012/01/demystifying-agile-how-to-plan-releases.html"&gt;Demystifying Agile: How to Plan Releases with Scrum&lt;/a&gt;&lt;/div&gt; &lt;li&gt; &lt;div align="justify"&gt;&lt;a href="http://www.softwareandi.com/2012/01/how-to-use-agile-estimation-in-scrum.html"&gt;How to Use Agile Estimation in Scrum Projects&lt;/a&gt;&lt;/div&gt; &lt;li&gt; &lt;div align="justify"&gt;Proving Pair Programming: How and Why it Works&lt;/div&gt; &lt;li&gt; &lt;div align="justify"&gt;How to Manage a Self Managing Team&lt;/div&gt; &lt;li&gt; &lt;div align="justify"&gt;Agile Contracts: Unveiling the Trick to Happy Customers&lt;/div&gt; &lt;li&gt; &lt;div align="justify"&gt;Agile Tips &amp;amp; Tricks: How to Solve Real Issues with Scrum&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt; &lt;p align="justify"&gt;&lt;em&gt;Bookmark this page! More posts to come… &lt;/p&gt; &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:f648b828-6ca3-4bb3-8000-4c921ff4e20a" class="wlWriterSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Agile" rel="tag"&gt;Agile&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Scrum" rel="tag"&gt;Scrum&lt;/a&gt;&lt;/div&gt;&lt;/em&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2660291115609609354-7646138422030100424?l=www.softwareandi.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.softwareandi.com/feeds/7646138422030100424/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.softwareandi.com/2012/01/demystifying-agile.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2660291115609609354/posts/default/7646138422030100424'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2660291115609609354/posts/default/7646138422030100424'/><link rel='alternate' type='text/html' href='http://www.softwareandi.com/2012/01/demystifying-agile.html' title='Demystifying Agile'/><author><name>Assaf Stone</name><uri>http://www.blogger.com/profile/14023994489658711542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_njIZU_X1s08/Sb0rpRzfcxI/AAAAAAAAABM/a0wzTXU3Grg/S220/Me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_7PUa1gN7wbM/SRxE_tzQgDI/AAAAAAAACsE/JF4hkAjkCuk/s72-c/crystal-ball.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2660291115609609354.post-8260487367197631483</id><published>2011-12-25T11:50:00.001+02:00</published><updated>2011-12-25T11:50:03.027+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Test'/><category scheme='http://www.blogger.com/atom/ns#' term='Version Control'/><category scheme='http://www.blogger.com/atom/ns#' term='Report'/><category scheme='http://www.blogger.com/atom/ns#' term='Build'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><title type='text'>A Software Developer’s New Year’s Resolution</title><content type='html'>&lt;h4 align="justify"&gt;&lt;em&gt;Or: 5 Things You Can Do Today to Improve Your Software Product&lt;/em&gt;&lt;/h4&gt; &lt;p align="justify"&gt;&lt;a href="http://lh6.ggpht.com/-51UCCQlfCSs/TvbxwYJqyQI/AAAAAAAAAbM/p3CK5xKPuyA/s1600-h/image%25255B3%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" align="right" src="http://lh6.ggpht.com/-3955wl_c6Qk/TvbxxIIXdmI/AAAAAAAAAbQ/iXmWItAR5j8/image_thumb%25255B1%25255D.png?imgmax=800" width="240" height="216"&gt;&lt;/a&gt;New Year’s eve is around the corner. It is the end of this year, and there’s a whole new year full of potential to be better, just waiting to begin. So how can &lt;em&gt;you &lt;/em&gt;make it better? If you, like me, are a professional developer, then you can improve your life (and your boss’s and your team’s) by reducing software delivery related stress. Here are 5 things you can do, effective immediately, to make your product better:&lt;/p&gt; &lt;h3&gt;1. Make a Version Management Plan&lt;/h3&gt; &lt;p align="justify"&gt;If your version control system is a mess, the first thing you should do is straighten it out. If you are not using one, then you should begin doing so immediately. There really is no excuse not to do so. For starters, there are plenty of high quality tools out there that are open source and free (&lt;a href="http://git-scm.com/"&gt;git&lt;/a&gt;, &lt;a href="http://mercurial.selenic.com/"&gt;mercurial&lt;/a&gt;, and &lt;a href="http://subversion.apache.org/"&gt;subversion&lt;/a&gt; are the most common ones), as well as other commercial tools (I happen to use and consult on the use of Microsoft’s &lt;a href="http://msdn.microsoft.com/en-us/vstudio/ff637362"&gt;TFS&lt;/a&gt;). Either download and start using a free one, or get one that offers a trial period.&lt;/p&gt; &lt;p align="justify"&gt;If you are using a VCS, but it’s a mess, and you find yourself mired deeply in merge-hell every time you want to deliver your software (internally &lt;em&gt;or &lt;/em&gt;externally; it doesn’t matter), then you should straighten it out. Unfortunately, if you have a considerably sized source repository, this may seem as an impossible endeavor. Here’s &lt;em&gt;one &lt;/em&gt;way to alleviate at least &lt;em&gt;some&lt;/em&gt; of the pains of software delivery, in a few easy steps:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;div align="justify"&gt;Create a new root-level folder named &lt;strong&gt;sources&lt;/strong&gt;. This folder will contain your new source code repository. &lt;/div&gt;&lt;/li&gt; &lt;li&gt; &lt;div align="justify"&gt;Create a branch from your current repository, and call it &lt;strong&gt;main&lt;/strong&gt; (e.g. &lt;strong&gt;/sources/main&lt;/strong&gt;). This will represent your latest and greatest version, and should be kept as stable as possible, at any moment. No development will be done on it; you will only merge &lt;strong&gt;completed changes&lt;/strong&gt; into it. &lt;/div&gt;&lt;/li&gt; &lt;li&gt; &lt;div align="justify"&gt;Create a branch from main, named &lt;strong&gt;dev&lt;/strong&gt; (e.g. &lt;strong&gt;/sources/dev&lt;/strong&gt;). This branch will be the branch that developers work on to &lt;strong&gt;create new features&lt;/strong&gt;, checking code in and out from there. If there are multiple independent teams, you may have multiple &lt;strong&gt;dev&lt;/strong&gt; branches.&lt;/div&gt;&lt;/li&gt; &lt;li&gt; &lt;div align="justify"&gt;Create a &lt;strong&gt;releases&lt;/strong&gt; folder, which will contain &lt;strong&gt;release branches&lt;/strong&gt; from main. Every time you wish to release your software (internally or externally), create a &lt;em&gt;release branch &lt;/em&gt;from main (e.g. &lt;strong&gt;/sources/releases/1.2&lt;/strong&gt;).&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt; &lt;p align="justify"&gt;This is just one possible branching plan. It works particularly well for agile development, where effort is made towards developing as many features as possible before a release, merging them into main when ever they are &lt;strong&gt;done&lt;/strong&gt;, and branching when the iteration is over. Note the following division of work:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;div align="justify"&gt;New features are developed &lt;u&gt;only&lt;/u&gt; in &lt;strong&gt;dev&lt;/strong&gt;. They are merged &lt;em&gt;back&lt;/em&gt; into main when completed.&lt;/div&gt;&lt;/li&gt; &lt;li&gt; &lt;div align="justify"&gt;Fixes are developed on release branches and &lt;em&gt;reverse-integrated&lt;/em&gt; into &lt;strong&gt;main&lt;/strong&gt;, and then back to &lt;strong&gt;dev&lt;/strong&gt;, so that they won’t get lost.&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p align="justify"&gt;This structure allows you to develop new software and stabilize a release at the same time without one effort polluting another. It is also a step towards being able to release a new version &lt;em&gt;anytime&lt;/em&gt;.&lt;/p&gt; &lt;p align="justify"&gt;If your development and release mechanism is well established, but not suited to fit this branch plan, make one that does work. Just make sure to be able to support &lt;strong&gt;feature and fix separation&lt;/strong&gt; as well as the ability &lt;strong&gt;release anytime&lt;/strong&gt; you need.&lt;/p&gt; &lt;h3&gt;2. Automate Your Build&lt;/h3&gt; &lt;p align="justify"&gt;Even if all you do is copy sources from the repository to some drop folder, you have &lt;em&gt;some&lt;/em&gt; sort of a build process. Automate it. Even just a part of it. Even just the compilation phase. Every step you let a computer do rather than yourself, is one less step to worry about. If you aren’t already using an automated build tool, you should start now. There are many open source tools as well as commercial ones. Most are powerful enough to suit your needs. Remember – If you can run it from command line, you can automate it as well.&lt;/p&gt; &lt;p align="justify"&gt;Every time you run the build, you will not only create a deployment package of your system, but you will get a good indication about the health of your product (if the product doesn’t build, you will want to know sooner rather than later). Additionally, you will have the start of a platform for testing the system.&lt;/p&gt; &lt;p align="justify"&gt;For a synergetic benefit with your versioning plan, schedule the following automated builds:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;div align="justify"&gt;Build the software every time you check in changes to your code (on &lt;strong&gt;dev&lt;/strong&gt; or a &lt;strong&gt;release&lt;/strong&gt; branch); most build and VCS tools support this – it is called &lt;strong&gt;continuous integration&lt;/strong&gt;.&lt;/div&gt;&lt;/li&gt; &lt;li&gt; &lt;div align="justify"&gt;Build the software every time you wish to merge &lt;strong&gt;dev&lt;/strong&gt; to &lt;strong&gt;main&lt;/strong&gt;. It is even better if you require a successful build as a &lt;strong&gt;prerequisite&lt;/strong&gt; for the merge. This is called a &lt;strong&gt;gated check-in&lt;/strong&gt; in many tools. &lt;/div&gt;&lt;/li&gt; &lt;li&gt; &lt;div align="justify"&gt;Schedule a nightly build on &lt;strong&gt;main&lt;/strong&gt;. This will let you know what the state of your system is. Fix any problems here first. Keeping a healthy build will allow you to deliver software at the drop of a hat. Amaze your PM!&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt; &lt;h3 align="justify"&gt;3. Add a Health Report&lt;/h3&gt; &lt;p align="justify"&gt;Even a simple email message to the team in case a build fails will greatly improve your ability to fix problems with your software. Shorter feedback cycles means that you can &lt;strong&gt;fix problems when their causes are still fresh in your mind!&lt;/strong&gt; Let your build system email you if it fails. Almost every system supports it. Conversely, you may wish to post &lt;strong&gt;successful &lt;/strong&gt;build reports to some company wiki. Let everyone know of your successes. &lt;/p&gt; &lt;h3&gt;4. Add an Automated Test&lt;/h3&gt; &lt;p align="justify"&gt;While the benefits of TDD as a design mechanism are far greater than just having a suite of tests, we should not belittle the benefit of an automated regression test. Even a simple &lt;strong&gt;record &amp;amp; replay&lt;/strong&gt; automated smoke test, with a black-box test tool will greatly improve your system. Start with a single test that runs through as many parts of your system as you can easily manage. (Note – this might mean you need to add a &lt;strong&gt;deployment&lt;/strong&gt; action to your automated build). Report if it fails. Run it every time you build. &lt;strong&gt;The more tests you add, the greater confidence you’ll have in your build system!&lt;/strong&gt; Maintain your tests; fix any tests that fail due to legitimate changes and remove those that are no longer relevant. You don’t want your system to cry wolf!&lt;/p&gt; &lt;h3&gt;5. No Broken Windows!&lt;/h3&gt; &lt;p align="justify"&gt;&lt;a href="http://lh5.ggpht.com/-HnhbA9lwkRg/Tvbxxk6ku9I/AAAAAAAAAbY/a7fHPm5KSFo/s1600-h/image%25255B7%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" align="right" src="http://lh3.ggpht.com/-aO2h4x9Gy5A/TvbxycZ_fGI/AAAAAAAAAbk/Y3-k2KphQCA/image_thumb%25255B3%25255D.png?imgmax=800" width="76" height="90"&gt;&lt;/a&gt;The most important thing you can do is to make a new year’s resolution that you will &lt;strong&gt;not suffer any problem with your software delivery lifecycle to remain unfixed!&lt;/strong&gt; Once you fall off the wagon, your system will start to decay back to uncontrollable chaos. Think of maintaining your ALM like &lt;strong&gt;brushing your teeth&lt;/strong&gt;. You may not like it but you do it every day (more than once), or your teeth will rot out until ultimately you won’t be able to eat!&lt;/p&gt; &lt;h4&gt;In conclusion,&lt;/h4&gt; &lt;p align="justify"&gt;My new year’s resolution is to vigilantly keep my teams’ products “on the wagon”.What is yours?&lt;/p&gt; &lt;p align="justify"&gt;Happy Holidays, and Happy New Year!&lt;/p&gt; &lt;p align="justify"&gt;See you all next year,&lt;/p&gt; &lt;p align="justify"&gt;Assaf.&lt;/p&gt; &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:2a12d23c-948d-492a-8436-270c5b45e1af" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Agile" rel="tag"&gt;Agile&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Build" rel="tag"&gt;Build&lt;/a&gt;,&lt;a href="http://technorati.com/tags/TDD" rel="tag"&gt;TDD&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Test" rel="tag"&gt;Test&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Report" rel="tag"&gt;Report&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Version+Control" rel="tag"&gt;Version Control&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2660291115609609354-8260487367197631483?l=www.softwareandi.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.softwareandi.com/feeds/8260487367197631483/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.softwareandi.com/2011/12/software-developers-new-years.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2660291115609609354/posts/default/8260487367197631483'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2660291115609609354/posts/default/8260487367197631483'/><link rel='alternate' type='text/html' href='http://www.softwareandi.com/2011/12/software-developers-new-years.html' title='A Software Developer’s New Year’s Resolution'/><author><name>Assaf Stone</name><uri>http://www.blogger.com/profile/14023994489658711542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_njIZU_X1s08/Sb0rpRzfcxI/AAAAAAAAABM/a0wzTXU3Grg/S220/Me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/-3955wl_c6Qk/TvbxxIIXdmI/AAAAAAAAAbQ/iXmWItAR5j8/s72-c/image_thumb%25255B1%25255D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2660291115609609354.post-9015750698555849762</id><published>2011-12-10T09:02:00.001+02:00</published><updated>2011-12-11T06:38:24.602+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Sprint Planning'/><category scheme='http://www.blogger.com/atom/ns#' term='Scrum'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><category scheme='http://www.blogger.com/atom/ns#' term='Estimation'/><title type='text'>How to Measure Technical Debt</title><content type='html'>&lt;h5&gt;&lt;em&gt;Or: An Executive’s Guide to the Cost of Software Architecture Shortcuts&lt;/em&gt;&lt;/h5&gt; &lt;p align="justify"&gt;&lt;a href="http://lh6.ggpht.com/-tRMoNYAYM-Y/TuQzuUpQFRI/AAAAAAAAAao/JyJrawKmXRc/s1600-h/poor-monopoly-guy-290x280%25255B4%25255D.gif"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top: 0px; border-right: 0px; padding-top: 0px" title="poor-monopoly-guy-290x280" border="0" alt="poor-monopoly-guy-290x280" align="right" src="http://lh5.ggpht.com/-RIv947t_n3o/TuQzvPoYunI/AAAAAAAAAaw/irzO0VyekL0/poor-monopoly-guy-290x280_thumb%25255B2%25255D.gif?imgmax=800" width="156" height="151"&gt;&lt;/a&gt;In my experience, in any software project of sufficient complexity, it is necessary to cut corners in the software architecture. These shortcuts are decision that you make &lt;em&gt;now&lt;/em&gt; so that you will be able to release your next version of the software that much earlier; these shortcuts are the result of not having enough time to do things “right”.&lt;/p&gt; &lt;p align="justify"&gt;This is called your project’s &lt;a href="http://martinfowler.com/bliki/TechnicalDebt.html"&gt;Technical Debt.&lt;/a&gt;&lt;/p&gt; &lt;p align="justify"&gt;Like &lt;em&gt;financial debt&lt;/em&gt;, which is the metaphor used to explain it, technical debt happens when you “buy” more software features than you have resources (developers and time) for. Like financial debt, it accrues interest over time. And like financial debt, if you don’t pay it back, you may eventually get foreclosed and go bankrupt. That last part is not a metaphor. Your software project simply ends up costing more to maintain than the value you derive from it, and either the project or the company gets shut down, or both.&lt;/p&gt; &lt;p align="justify"&gt;There are essentially two ways to deal with debt (technical, like financial):&lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;div align="justify"&gt;You pay it all at once – This means that you do not “withdraw” any more features, until your debt has been fully paid. It has the benefit of being able to make a fresh start. It has the disadvantage of risking “starvation” while you try to pay the “bank”.&lt;/div&gt; &lt;li&gt; &lt;div align="justify"&gt;You pay it in installments – This means that you pay off your debt, a small part at a time, still “withdrawing” features, but less than you normally would, cutting down to essentials, for as long as you are still paying off the debt. It takes longer to finish, but you can still “eat” while paying.&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt; &lt;p align="justify"&gt;Of course there’s the third option of continuing to withdraw as before, until you go broke, or luckily win the ‘lottery” (investment, buy-out, etc.)&lt;/p&gt; &lt;p align="justify"&gt;There is no one clear way to deal with debt (financial or technical). It will depend on the situation, and the players. And most of all it will depend on the &lt;strong&gt;amount&lt;/strong&gt; of debt.&lt;/p&gt; &lt;h3 align="justify"&gt;Quantifying the Debt&lt;/h3&gt; &lt;p align="justify"&gt;With financial debt, it is easy to determine how much you owe. There’s the amount of money you borrowed, and the interest rate. Both are usually well known, and it is just a matter of keeping track of it, to make sure you can withstand it.&lt;/p&gt; &lt;p align="justify"&gt;With &lt;em&gt;technical debt&lt;/em&gt;, you still have the &lt;em&gt;amount &lt;/em&gt;you borrowed, and the &lt;em&gt;interest rate&lt;/em&gt;, but you usually &lt;strong&gt;don’t know the numbers&lt;/strong&gt;. &lt;/p&gt; &lt;p align="justify"&gt;Let’s start with figuring out the &lt;strong&gt;derived value&lt;/strong&gt; of taking the loan. Whenever you demand that a feature or set of features be completed faster than it would normally take if the team were to maintain an appropriate quality level, you are “borrowing” from the &lt;strong&gt;architecture&lt;/strong&gt;. Figure out how much &lt;strong&gt;time&lt;/strong&gt; you saved, and multiply it by the &lt;em&gt;hourly cost &lt;/em&gt;of the developers. That is the &lt;strong&gt;amount of money&lt;/strong&gt; you borrowed from the architecture. Figure out what the &lt;strong&gt;reduction in the &lt;em&gt;Time to Market&lt;/em&gt;&lt;/strong&gt; will earn you, and that is the &lt;strong&gt;derived value&lt;/strong&gt; of the loan.&lt;/p&gt; &lt;p align="justify"&gt;The interest rate is not so easily calculated &lt;em&gt;a-priori&lt;/em&gt;, but it can be estimated (with about as much accuracy as the development cost estimates your team makes – which may be good or bad; depends on your experience):&lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;div align="justify"&gt;Map out the areas impacted by the shortcut&lt;/div&gt; &lt;li&gt; &lt;div align="justify"&gt;Estimate how much it would cost (developers x time) to develop a feature in the impacted areas, &lt;strong&gt;before the shortcut(s)&lt;/strong&gt;&lt;/div&gt; &lt;li&gt; &lt;div align="justify"&gt;Now, estimate the cost to develop the same feature &lt;strong&gt;&lt;em&gt;after&lt;/em&gt; introducing the technical debt&lt;/strong&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt; &lt;p align="justify"&gt;The &lt;em&gt;difference&lt;/em&gt; in the cost is the &lt;strong&gt;interest&lt;/strong&gt; you are paying. &lt;strong&gt;Keep track&lt;/strong&gt; of the interest as it will change with every change you make to the system. A good practice is to calculate the interest every iteration or sprint. You should consider doing this as part of the &lt;a href="http://www.mountaingoatsoftware.com/scrum/sprint-planning-meeting"&gt;&lt;strong&gt;sprint planning&lt;/strong&gt;&lt;/a&gt;. This will have the added benefit of giving the product owner the opportunity to pay off some of the debt. &lt;/p&gt; &lt;p align="justify"&gt;Note that like financial debt, the interest grows over time. The rate varies, and it is difficult to guess what it will be, except by projecting based on past experience. As you begin to accumulate this data, you will be able to make educated decisions on when you &lt;strong&gt;can afford&lt;/strong&gt; to go into &lt;em&gt;technical debt&lt;/em&gt;, and when you should &lt;strong&gt;avoid &lt;/strong&gt;it. You should reassess your &lt;strong&gt;technical debt’s interest rate &lt;/strong&gt;&lt;em&gt;every&lt;/em&gt; &lt;strong&gt;sprint planning&lt;/strong&gt;.&lt;/p&gt; &lt;p align="justify"&gt;Armed with this knowledge, developers should now be able to collaborate with management in order to decide how to develop and whether or not it is okay to cut a corner on that next feature.&lt;/p&gt; &lt;p align="justify"&gt;Finally, remember: Your architecture is a &lt;strong&gt;cold blooded loan shark&lt;/strong&gt;, who will just as soon take your installments, as he will bust your project’s kneecaps over a missed payment.&lt;/p&gt; &lt;p align="justify"&gt;What do you think? Do you have a preferred method of calculating / estimating technical debt, or a way to handle it? &lt;/p&gt; &lt;p align="justify"&gt;Please share!&lt;/p&gt; &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:5550351d-abba-40d1-9931-1fc317086120" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Agile" rel="tag"&gt;Agile&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Estimation" rel="tag"&gt;Estimation&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Scrum" rel="tag"&gt;Scrum&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Sprint+Planning" rel="tag"&gt;Sprint Planning&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Technical+Debt" rel="tag"&gt;Technical Debt&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2660291115609609354-9015750698555849762?l=www.softwareandi.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.softwareandi.com/feeds/9015750698555849762/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.softwareandi.com/2011/12/how-to-measure-technical-debt.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2660291115609609354/posts/default/9015750698555849762'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2660291115609609354/posts/default/9015750698555849762'/><link rel='alternate' type='text/html' href='http://www.softwareandi.com/2011/12/how-to-measure-technical-debt.html' title='How to Measure Technical Debt'/><author><name>Assaf Stone</name><uri>http://www.blogger.com/profile/14023994489658711542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_njIZU_X1s08/Sb0rpRzfcxI/AAAAAAAAABM/a0wzTXU3Grg/S220/Me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/-RIv947t_n3o/TuQzvPoYunI/AAAAAAAAAaw/irzO0VyekL0/s72-c/poor-monopoly-guy-290x280_thumb%25255B2%25255D.gif?imgmax=800' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2660291115609609354.post-1048689560375016732</id><published>2011-12-07T18:29:00.001+02:00</published><updated>2011-12-23T10:04:39.865+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Definition of Done'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><category scheme='http://www.blogger.com/atom/ns#' term='Estimation'/><title type='text'>10 Reasons to Avoid Test Driven Development</title><content type='html'>&lt;p align="justify"&gt;&lt;a href="http://lh5.ggpht.com/-MjVekYdXCT4/Tt-VZOY9pxI/AAAAAAAAAaY/cc16iLbYm4U/s512/no-TDD%25255B3%25255D.png?imgmax=800"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px 0px 0px 5px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="no-TDD" border="0" alt="no-TDD" align="right" src="http://lh4.ggpht.com/-xv_Nn0NakzE/Tt-VZ5hBeNI/AAAAAAAAAac/8HIvMKG7Xjg/s512/no-TDD_thumb%25255B1%25255D.png?imgmax=800" width="240" height="184"&gt;&lt;/a&gt;Test Driven Development (TDD), and all of its derivatives (BDD, ATDD) are, in my opinion great methods to drive a team’s development efforts, and raise the quality of the product. But TDD is not a silver bullet. It doesn’t fit every project. The following post lists the top ten reasons &lt;strong&gt;not&lt;/strong&gt; to write automated tests for your code.&lt;/p&gt; &lt;p align="justify"&gt;&amp;nbsp;&lt;/p&gt; &lt;p align="justify"&gt;If one or more of these conditions apply to you, you should consider forgoing TDD, and in fact any agile techniques, as they will be a waste of effort:&lt;/p&gt; &lt;h3 align="justify"&gt;&lt;strong&gt;10. There is no client&lt;/strong&gt;&lt;/h3&gt; &lt;p align="justify"&gt;Sometimes you are developing a product that will not be used by anyone. In this case, any effort expended on raising the quality is a complete waste. Nobody will care.&lt;/p&gt; &lt;h3 align="justify"&gt;&lt;strong&gt;9. The client is an avid tester&lt;/strong&gt;&lt;/h3&gt; &lt;p align="justify"&gt;Some people love nothing more than to beta-test new software. The joy of finding new bugs and trying to figure out what went wrong is what they live for. Others are scientists at heart, and love trying to go over stack traces, in order to reverse-engineer the code. If your client happens to be one of those, then writing automated tests will take all the fun out of using your software. Don’t do it!&lt;/p&gt; &lt;h3 align="justify"&gt;8. The project is short, simple and straight-forward&lt;/h3&gt; &lt;p align="justify"&gt;If your team can complete the project in a short period of time (no more than a few weeks), and will &lt;strong&gt;&lt;em&gt;never, ever&lt;/em&gt;&lt;/strong&gt; have to reopen it for maintenance, then the benefits of&lt;strong&gt; maintainability, reusability and extensibility&lt;/strong&gt; will be lost on you. Spending time and effort on these values is wasteful.&lt;/p&gt; &lt;h3 align="justify"&gt;&lt;strong&gt;7. Your architecture is perfect&lt;/strong&gt;&lt;/h3&gt; &lt;p align="justify"&gt;If there is no way to improve your architecture, then there is no need for it to be extensible. TDD, by the nature of its incremental development flow, forces the architecture to be extensible, simply by making you extend it as you go, and this, like lipstick on a pig, is something you just don’t need.&lt;/p&gt; &lt;h3 align="justify"&gt;6. Your documentation is perfect&lt;/h3&gt; &lt;p align="justify"&gt;You never miss an API, and any change you make to your software gets documented instantaneously. The tests you create with TDD serve as a form of documentation, an example of how to use the API. Properly named and written tests actually explain the context of the test, so it is easy to find the test that shows you what you need to understand. &lt;em&gt;Your&lt;/em&gt; documentation is so complete, that writing tests are a clear violation of the &lt;a href="http://c2.com/cgi/wiki?DontRepeatYourself"&gt;DRY principle&lt;/a&gt;, so you should clearly avoid tests.&lt;/p&gt; &lt;h3 align="justify"&gt;5. Your team never changes and all members’ memories are perfect&lt;/h3&gt; &lt;p align="justify"&gt;The collective memory never forgets a single line of code it wrote, nor what the context was when writing it. You therefore, do not need the tests to remind you what the code does, why it does it, or how to use it. This also means that your team members &lt;strong&gt;never leave&lt;/strong&gt;, nor are any &lt;strong&gt;new members recruited&lt;/strong&gt;, because if this were to happen, you’d lose memories, or have members who don’t remember the code (having not been there when it was written). If this is the case, don’t bother with tests; they will just interfere with your incredible velocity.&lt;/p&gt; &lt;h3 align="justify"&gt;4. “Done” means the code is checked in&lt;/h3&gt; &lt;p align="justify"&gt;Many teams have a &lt;a href="http://www.allaboutagile.com/definition-of-done-10-point-checklist/"&gt;definition of done&lt;/a&gt; (DoD) that means that the feature is “done” when it is in a state that the end user can receive and run (coded, tested, deployed, documented, etc.). Many others however, your team included, prefer a simpler and more easily achieved definition that accepts “checked in” as “done”. For you it is sufficient that the developer declared that he or she completed his part, and anything else is someone else’s responsibility. If you don’t need the code to be tested for the product owner / manager / user to accept it, then you are better served moving on to the next feature as soon as you can, instead of dragging on your relationship with &lt;em&gt;this&lt;/em&gt; feature.&lt;/p&gt; &lt;h3 align="justify"&gt;3. You’re paid to code, not test&lt;/h3&gt; &lt;p align="justify"&gt;Ignoring the fact that unit tests are code (sophistry), testing is what we have testers for. Perhaps your team's testers are fast enough that they can run tests on your code and give you &lt;strong&gt;feedback&lt;/strong&gt; within mere moments, pinpointing the areas where you broke the code, so you can fix it while the changes are fresh in your mind, as well as a complete regression suite on the product, in case you broke something in a different component every night (they don’t mind working nights; they love the peaceful quiet). Good for you, cherish those testers, and make sure they have enough work so they won’t get bored and move on to a more challenging company.&lt;/p&gt; &lt;h3 align="justify"&gt;2. Debugging doesn’t count, and testing takes too long&lt;/h3&gt; &lt;p align="justify"&gt;Like with any competitive company, your team must deliver on time, which means they must make estimates on the time it will take to deliver. Since your &lt;strong&gt;DoD&lt;/strong&gt; doesn’t include testing, and you probably can’t guess how long it will take to debug the feature, what with all the cycling back and forth from development to QA, you estimate how long it will take to &lt;em&gt;code&lt;/em&gt; it. If you want to meet your commitment, you can’t be adding a &lt;strong&gt;20% overhead&lt;/strong&gt; to your delivery time or you’ll miss the deadline. Worse, if you add 20% to your estimates, your manager might call you out on padding the estimates, which is his job. If that happens, who knows what might happen? Better play it safe. &lt;/p&gt; &lt;h3 align="justify"&gt;1. It’s just a theory&lt;/h3&gt; &lt;p align="justify"&gt;Like Evolution (and Gravity), it’s just a theory. Even if all of the above reasons weren’t valid, nobody has ever successfully proven that &lt;strong&gt;&lt;em&gt;this product &lt;/em&gt;&lt;/strong&gt;could be completed faster and with better quality using new-age development methodologies like TDD. It’s just a matter of opinion.&lt;/p&gt; &lt;h3 align="justify"&gt;&lt;em&gt;Test yourself&lt;/em&gt;&lt;/h3&gt; &lt;p align="justify"&gt;Now, to test whether or not you should use test driven development, go over the above list. Count how many reasons apply to you. If you scored &lt;strong&gt;ten&lt;/strong&gt; points, don’t use TDD. In fact, if you scored more than &lt;strong&gt;one&lt;/strong&gt; (reason #8 might actually be legitimate), &lt;em&gt;&lt;strong&gt;don’t write any code at all.&lt;/strong&gt;&lt;/em&gt; Perhaps you’d be better served choosing a career that has fewer unknowns and moving parts. Perhaps paving roads? &lt;/p&gt; &lt;p align="justify"&gt;&lt;em&gt;&lt;font color="#0000ff"&gt;Disclaimer: This post was written… Aw, just figure it out yourself!&lt;/font&gt;&lt;/em&gt;&lt;/p&gt; &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:9521dc30-04ab-4089-85a3-1fb02dcd3461" class="wlWriterSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Agile" rel="tag"&gt;Agile&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Scrum" rel="tag"&gt;Scrum&lt;/a&gt;,&lt;a href="http://technorati.com/tags/TDD" rel="tag"&gt;TDD&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Estimation" rel="tag"&gt;Estimation&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Unit+Tests" rel="tag"&gt;Unit Tests&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Definition+of+Done" rel="tag"&gt;Definition of Done&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2660291115609609354-1048689560375016732?l=www.softwareandi.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.softwareandi.com/feeds/1048689560375016732/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.softwareandi.com/2011/12/10-reasons-to-avoid-test-driven.html#comment-form' title='34 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2660291115609609354/posts/default/1048689560375016732'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2660291115609609354/posts/default/1048689560375016732'/><link rel='alternate' type='text/html' href='http://www.softwareandi.com/2011/12/10-reasons-to-avoid-test-driven.html' title='10 Reasons to Avoid Test Driven Development'/><author><name>Assaf Stone</name><uri>http://www.blogger.com/profile/14023994489658711542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_njIZU_X1s08/Sb0rpRzfcxI/AAAAAAAAABM/a0wzTXU3Grg/S220/Me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/-xv_Nn0NakzE/Tt-VZ5hBeNI/AAAAAAAAAac/8HIvMKG7Xjg/s72-c/no-TDD_thumb%25255B1%25255D.png?imgmax=800' height='72' width='72'/><thr:total>34</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2660291115609609354.post-2950073388016288197</id><published>2011-11-25T15:32:00.001+02:00</published><updated>2011-11-26T19:50:16.284+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Sprint Planning'/><category scheme='http://www.blogger.com/atom/ns#' term='User Story'/><category scheme='http://www.blogger.com/atom/ns#' term='Definition of Done'/><category scheme='http://www.blogger.com/atom/ns#' term='Scrum'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><category scheme='http://www.blogger.com/atom/ns#' term='Task'/><title type='text'>How to Break a User Story into Tasks</title><content type='html'>&lt;p align="justify"&gt;&lt;a href="http://lh3.ggpht.com/-h1mfzAU4Wtk/Ts_RINO7nyI/AAAAAAAAAaI/wMCE3RSk0_M/s1600-h/ScrumBoard%25255B2%25255D.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top: 0px; border-right: 0px; padding-top: 0px" title="ScrumBoard" border="0" alt="ScrumBoard" align="right" src="http://lh4.ggpht.com/-5pTppKv4lsM/Ts_RKHcU5sI/AAAAAAAAAaQ/nO7wr5tdSrA/ScrumBoard_thumb.jpg?imgmax=800" width="244" height="118"&gt;&lt;/a&gt;One of the vaguest aspects of Scrum is breaking stories into tasks, which is done in (the second half of) the Sprint Planning. Most of the questions I get when training or coaching boil down to one question: “How do I break a user story into tasks”?&lt;/p&gt; &lt;h3&gt;&lt;/h3&gt; &lt;h3&gt;Defining The Problem&lt;/h3&gt; &lt;p align="justify"&gt;My favorite definition for a user story is that it is a &lt;strong&gt;thin, vertical slice of functionality, describing a small increment in value to the user (or customer)&lt;/strong&gt;. &lt;/p&gt; &lt;p align="justify"&gt;A task, on the other hand is a &lt;strong&gt;step taken by the development team, required to fulfill the requirements of the user story&lt;/strong&gt;. I further like to define, as a rule of thumb, that a task should take half a day to 2 days to complete. &lt;/p&gt; &lt;p align="justify"&gt;The question therefore should be &lt;strong&gt;what are the steps the team needs to take for the story to be considered complete?&lt;/strong&gt;&lt;/p&gt; &lt;h3 align="justify"&gt;Look at Your Architecture&lt;/h3&gt; &lt;p align="justify"&gt;Explicitly or implicitly, your project has an architecture. It might be anything from a master piece drawn out in painstaking elaboration by a the architecture team, to a high-level conceptual architecture diagram. You should look at the components in your system, and ask your self &lt;strong&gt;which components&lt;/strong&gt; do you need to modify (or add) for the story. &lt;/p&gt; &lt;p align="justify"&gt;For example, Let’s say that we have a product that is a social networking web site of some sorts. given a story such as &lt;strong&gt;In order to broaden my network, as a user, I want to be able to import contacts from Gmail&lt;/strong&gt;. Looking at a typical architecture for such a product, my tasks could be something like:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;div align="justify"&gt;Add a new &lt;strong&gt;Import Contacts&lt;/strong&gt; page&lt;/div&gt;&lt;/li&gt; &lt;li&gt; &lt;div align="justify"&gt;Add a service to &lt;strong&gt;get contacts from Gmail&lt;/strong&gt;&lt;/div&gt;&lt;/li&gt; &lt;li&gt; &lt;div align="justify"&gt;Modify the &lt;strong&gt;contact&lt;/strong&gt; class to accommodate Gmail specific data (let’s assume such exists)&lt;/div&gt;&lt;/li&gt; &lt;li&gt; &lt;div align="justify"&gt;Modify the &lt;strong&gt;contacts data schema&lt;/strong&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p align="justify"&gt;Assuming these tasks are &lt;em&gt;right-sized&lt;/em&gt; (4-16 hours), that’s it. If one of these tasks is bigger, break it down. If a task is smaller, merge it with a related one (if such exists. If not, don’t sweat it. My 4-16 rule is just a guideline). We now have all the tasks for us to complete the &lt;em&gt;coding&lt;/em&gt; of the story.&lt;/p&gt; &lt;h3 align="justify"&gt;Look at the Definition of Done&lt;/h3&gt; &lt;p align="justify"&gt; Of course, just &lt;em&gt;coding&lt;/em&gt; your story isn’t sufficient for the story to be truly done. In Scrum, “done” means ready to ship, or as I like to define it: &lt;strong&gt;the story is as it will be received by the customer / user&lt;/strong&gt;. Agile teams have a list of requirements that should&amp;nbsp; be true for &lt;em&gt;any&lt;/em&gt; story they complete. You should look at &lt;em&gt;your&lt;/em&gt; &lt;strong&gt;&lt;a href="http://www.allaboutagile.com/definition-of-done-10-point-checklist/"&gt;Definition of Done&lt;/a&gt; (DoD) &lt;/strong&gt;to see what tasks remain.&lt;/p&gt; &lt;p align="justify"&gt;For example, let’s say your &lt;strong&gt;DoD &lt;/strong&gt;includes the following:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;div align="justify"&gt;Code Complete&lt;/div&gt;&lt;/li&gt; &lt;li&gt; &lt;div align="justify"&gt;Automated UAT (User Acceptance Tests)&lt;/div&gt;&lt;/li&gt; &lt;li&gt; &lt;div align="justify"&gt;Documentation is updated&lt;/div&gt;&lt;/li&gt; &lt;li&gt; &lt;div align="justify"&gt;Added to shipping package (e.g. InstallShield)&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p align="justify"&gt;In this case, you should add tasks that help you achieve the story’s DoD. For the above example you might do the following:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;div align="justify"&gt;Write UATs for the story&lt;/div&gt;&lt;/li&gt; &lt;li&gt; &lt;div align="justify"&gt;Document the &lt;em&gt;Contacts Import &lt;/em&gt;feature&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p align="justify"&gt;Assuming you didn’t have to add any new assemblies (i.e. libraries, packages, DLLs, executables, etc.), to your installation, you probably wouldn’t have any need to modify your packaging tool. No need to add a task for that.&lt;/p&gt; &lt;h3 align="justify"&gt;That’s It!&lt;/h3&gt; &lt;p align="justify"&gt;You now have 6 tasks for the story:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;div align="justify"&gt;Add a new &lt;strong&gt;Import Contacts&lt;/strong&gt; page&lt;/div&gt;&lt;/li&gt; &lt;li&gt; &lt;div align="justify"&gt;Add a service to &lt;strong&gt;get contacts from Gmail&lt;/strong&gt;&lt;/div&gt;&lt;/li&gt; &lt;li&gt; &lt;div align="justify"&gt;Modify the &lt;strong&gt;contact&lt;/strong&gt; class to accommodate Gmail specific data (let’s assume such exists)&lt;/div&gt;&lt;/li&gt; &lt;li&gt; &lt;div align="justify"&gt;Modify the &lt;strong&gt;contacts data schema&lt;/strong&gt;&lt;/div&gt;&lt;/li&gt;&lt;!--EndFragment--&gt;&lt;/ul&gt; &lt;ul&gt; &lt;li&gt; &lt;div align="justify"&gt;Write UATs for the story&lt;/div&gt;&lt;/li&gt; &lt;li&gt; &lt;div align="justify"&gt;Document the &lt;em&gt;Contacts Import &lt;/em&gt;feature&lt;/div&gt;&lt;/li&gt;&lt;!--EndFragment--&gt;&lt;/ul&gt; &lt;p align="justify"&gt;You can now estimate how much time each one will take, and are ready to move on, and break down the next story.&lt;/p&gt; &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:db83f4ac-aea1-4780-8791-067b86f135d2" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Agile" rel="tag"&gt;Agile&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Scrum" rel="tag"&gt;Scrum&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Tasks" rel="tag"&gt;Tasks&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Sprint+Planning" rel="tag"&gt;Sprint Planning&lt;/a&gt;,&lt;a href="http://technorati.com/tags/User+Story" rel="tag"&gt;User Story&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Definition+of+Done" rel="tag"&gt;Definition of Done&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2660291115609609354-2950073388016288197?l=www.softwareandi.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.softwareandi.com/feeds/2950073388016288197/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.softwareandi.com/2011/11/how-to-break-user-story-into-tasks.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2660291115609609354/posts/default/2950073388016288197'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2660291115609609354/posts/default/2950073388016288197'/><link rel='alternate' type='text/html' href='http://www.softwareandi.com/2011/11/how-to-break-user-story-into-tasks.html' title='How to Break a User Story into Tasks'/><author><name>Assaf Stone</name><uri>http://www.blogger.com/profile/14023994489658711542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_njIZU_X1s08/Sb0rpRzfcxI/AAAAAAAAABM/a0wzTXU3Grg/S220/Me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/-5pTppKv4lsM/Ts_RKHcU5sI/AAAAAAAAAaQ/nO7wr5tdSrA/s72-c/ScrumBoard_thumb.jpg?imgmax=800' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2660291115609609354.post-4207190269313261992</id><published>2011-11-22T12:01:00.001+02:00</published><updated>2011-11-22T14:09:03.392+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Refactoring'/><category scheme='http://www.blogger.com/atom/ns#' term='XP'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><title type='text'>How to Refactor Your Code</title><content type='html'>&lt;p align="justify"&gt;&lt;a href="http://lh3.ggpht.com/-lXCd960InXc/TsuQyejGZgI/AAAAAAAAAZ4/MwdNvwwFmw4/s1600-h/Red-Green-Refactor%25255B6%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top: 0px; border-right: 0px; padding-top: 0px" title="Red-Green-Refactor" border="0" alt="Red-Green-Refactor" align="right" src="http://lh6.ggpht.com/-h8uceWI9Go8/TsuQ2nA4NZI/AAAAAAAAAaA/_Xo5rtK5Tig/Red-Green-Refactor_thumb%25255B3%25255D.png?imgmax=800" width="240" height="184"&gt;&lt;/a&gt;If you develop your products using &lt;a href="http://www.agiledata.org/essays/tdd.html"&gt;TDD&lt;/a&gt; or any of its derivatives (&lt;a href="http://testobsessed.com/blog/2008/12/08/acceptance-test-driven-development-atdd-an-overview/"&gt;ATDD&lt;/a&gt;, &lt;a href="http://dannorth.net/introducing-bdd/"&gt;BDD&lt;/a&gt;, etc), you are following the&lt;strong&gt; &lt;font color="#ff0000"&gt;Red&lt;/font&gt; → &lt;font color="#00ff00"&gt;Green&lt;/font&gt; → Refactor&lt;/strong&gt; loop. If you are just getting started with TDD, you might find that while the &lt;em&gt;red&lt;/em&gt; and &lt;em&gt;green&lt;/em&gt; (write a &lt;font color="#ff0000"&gt;failing test&lt;/font&gt;, and then make the &lt;font color="#00ff00"&gt;test pass&lt;/font&gt;) are simple enough to understand and to demonstrate, the &lt;strong&gt;&lt;em&gt;refactor&lt;/em&gt;&lt;/strong&gt; phase is much less clear, and I’ve found few sources that explain it properly. In this post I will attempt to thoroughly explain what I do, and what I consider to be a best practice.&lt;/p&gt; &lt;h4 align="justify"&gt;Refactor to Remove Redundancy&lt;/h4&gt; &lt;p align="justify"&gt;I usually use the refactor phase to reconstruct my code by removing duplications in code. I do this mostly in my &lt;strong&gt;production code&lt;/strong&gt; (the code that will ship to my customer). I often leave duplications in my &lt;strong&gt;test code&lt;/strong&gt; (the code that tests the production code), because for my tests I value readability over adhering to the &lt;a href="http://c2.com/cgi/wiki?DontRepeatYourself"&gt;DRY&lt;/a&gt; principle.&lt;/p&gt; &lt;p align="justify"&gt;You should always start with your &lt;em&gt;failing &lt;/em&gt;test (or &lt;em&gt;unsatisfied &lt;/em&gt;specification, if you're into BDD). Production classes and methods that you pull from your tests should be &lt;strong&gt;public&lt;/strong&gt;. &lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;div align="justify"&gt;Note: If you're developing in .NET, you may wish to consider using the &lt;strong&gt;internal&lt;/strong&gt; keyword (and adding the &lt;a href="http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.internalsvisibletoattribute.aspx"&gt;&lt;u&gt;InternalsVisibleTo&lt;/u&gt;&lt;/a&gt; assembly attribute to your production assembly, so that your test project can use the code) instead. Then you would make it &lt;strong&gt;public&lt;/strong&gt; only if another &lt;strong&gt;production assembly&lt;/strong&gt; depends on it.&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p align="justify"&gt;When you reach the &lt;em&gt;refactoring &lt;/em&gt;phase (after making at test pass, or before writing a failing one), you should look at the code and walk through the following steps:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;div align="justify"&gt;Any substantial or complex code that you need in two (or more) methods should be extracted into a &lt;strong&gt;private method&lt;/strong&gt;, and called from both (all) of the original locations.&lt;/div&gt; &lt;ul&gt; &lt;li&gt; &lt;div align="justify"&gt;Note: &lt;em&gt;Any&lt;/em&gt; method that you create as part of the &lt;em&gt;refactoring&lt;/em&gt; phase of your TDD should be made &lt;strong&gt;private&lt;/strong&gt;. &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt; &lt;li&gt; &lt;div align="justify"&gt;Make helper methods &lt;strong&gt;protected&lt;/strong&gt; only &lt;strong&gt;&lt;u&gt;when&lt;/u&gt;&lt;/strong&gt; a derived production class needs them. &lt;/div&gt; &lt;li&gt; &lt;div align="justify"&gt;Any method created in the refactoring phase (now private or protected), that you need in &lt;strong&gt;another production class&lt;/strong&gt; should be &lt;strong&gt;extracted&lt;/strong&gt; to a helper class and made &lt;strong&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/7c5ka91b(v=VS.100).aspx"&gt;internal&lt;/a&gt; &lt;/strong&gt;(or &lt;strong&gt;public &lt;/strong&gt;in any language that doesn’t support the concept). &lt;/div&gt; &lt;li&gt; &lt;div align="justify"&gt;If the helper class is needed in &lt;strong&gt;another assembly&lt;/strong&gt;, then: &lt;/div&gt; &lt;ul&gt; &lt;li&gt; &lt;div align="justify"&gt;If the &lt;em&gt;other&lt;/em&gt; assembly already depends on the helper class' assembly, make the helper class &lt;strong&gt;public&lt;/strong&gt; (if it isn't already). &lt;/div&gt; &lt;li&gt; &lt;div align="justify"&gt;If the other assembly does &lt;strong&gt;not&lt;/strong&gt; depend on the helper class' assembly, extract the helper class to a &lt;strong&gt;helper assembly&lt;/strong&gt; (the best fit, or a new one) and make it &lt;strong&gt;public&lt;/strong&gt;. Be sure to make the original assembly reference the new helper assembly, if it doesn't already.&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt; &lt;h4&gt;Refactor for Readability&lt;/h4&gt; &lt;p align="justify"&gt;There are no real steadfast rules for this. What I usually do is go over the code I just wrote (or modified) and look for any violations of team coding standards, or poorly named identifiers (classes, methods, variables, etc.). I usually don’t have very many of those, as I tend to name them properly (which is to say, to &lt;em&gt;my own&lt;/em&gt; satisfaction, but then again I’m often considered the strictest coder on my teams). &lt;/p&gt; &lt;p align="justify"&gt;One trick I do use, is to go over the methods and see if I it reads easily. By easily I mean &lt;em&gt;is it fluent?&lt;/em&gt; I don’t go all-out trying to develop a &lt;a href="http://martinfowler.com/bliki/FluentInterface.html"&gt;fluent API&lt;/a&gt;, but just see if the classes, methods and variables lend themselves towards some semblance of the English language. The following is an example of a block of “fluent” code:&lt;/p&gt; &lt;div class="csharpcode"&gt; &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:b25cd494-3203-4cd3-bb3b-dbd8189705a7" class="wlWriterSmartContent"&gt; &lt;div style="border-bottom: #000080 1px solid; border-left: #000080 1px solid; font-family: 'Courier New', courier, monospace; color: #000; font-size: 10pt; border-top: #000080 1px solid; border-right: #000080 1px solid"&gt; &lt;div style="padding-bottom: 2px; padding-left: 5px; padding-right: 5px; font-family: verdana, tahoma, arial, sans-serif; background: #000080; color: #fff; font-weight: bold; padding-top: 2px"&gt;Code Snippet&lt;/div&gt; &lt;div style="background: #ddd; max-height: 300px; overflow: auto"&gt; &lt;ol style="padding-bottom: 0px; margin: 0px 0px 0px 2em; padding-left: 5px; padding-right: 0px; background: #ffffff; padding-top: 0px"&gt; &lt;li&gt;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; user = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; User(usernameInput.Text, passwordInput.Text);&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp; &lt;li&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (userManagementService.Authenticates(user))&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;li style="background: #f3f3f3"&gt;{&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Navigate.To(requestedWebPage);&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;li style="background: #f3f3f3"&gt;} &lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt; &lt;style type="text/css"&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;br /&gt;&lt;/style&gt;  &lt;p&gt;Fluency isn’t a must-have, but I find it better than commenting. Comments can lie. Code doesn’t.&lt;/p&gt; &lt;h4&gt;Refactor for Complexity Reduction&lt;/h4&gt; &lt;p align="justify"&gt;&lt;a href="http://en.wikipedia.org/wiki/Cyclomatic_complexity"&gt;Cyclomatic Complexity&lt;/a&gt; is a code metric that measures how many distinct paths exist in a program’s code. A high value is more difficult to read and maintain. I find that &lt;em&gt;sometimes&lt;/em&gt; reducing complexity makes it easier to maintain the code. I therefore advise on doing this kind of refactoring especially when you need to improve your understanding of the codebase, rather than after making every test pass.&lt;/p&gt; &lt;p align="justify"&gt;Here’s a list of techniques that can reduce the complexity of your code:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;div align="justify"&gt;&lt;strong&gt;Invert conditional statements – &lt;/strong&gt;If your code is nested in if statements, where on one branch you do something and on the other you do nothing, you might invert the condition (checking whether the condition does &lt;em&gt;not&lt;/em&gt; occur), and then &lt;strong&gt;return&lt;/strong&gt; (exit the method) if the if-statement evaluated to &lt;em&gt;true&lt;/em&gt;. The following block of code will run if the statement evaluates to false (what would originally have run if it &lt;em&gt;did &lt;/em&gt;evaluate positively).&lt;/div&gt; &lt;li&gt; &lt;div align="justify"&gt;Extract blocks of code into private methods. The complexity is moved to a different method &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt; &lt;h4 align="justify"&gt;&amp;nbsp;&lt;/h4&gt; &lt;h4 align="justify"&gt;Refactor for Extensibility&lt;/h4&gt; &lt;p align="justify"&gt;This refactoring technique ties in with complexity reduction, and requires the use of some design patterns. I usually use the &lt;a href="http://www.dofactory.com/Patterns/PatternStrategy.aspx"&gt;&lt;em&gt;Strategy Pattern&lt;/em&gt;&lt;/a&gt;&lt;em&gt;&amp;nbsp;&lt;/em&gt;for this kind of refactoring. The idea is to remove multi-branch conditionals (such as chained if statements or switch-case statements) and extract the different cases into &lt;em&gt;concrete strategy&lt;/em&gt; classes.&lt;/p&gt; &lt;p align="justify"&gt;There are several benefit to this refactoring technique:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;div align="justify"&gt;New cases can be added without modifying (or with minimal modification to) existing code. This reduces the chance that existing code may break&lt;/div&gt; &lt;li&gt; &lt;div align="justify"&gt;Cyclomatic complexity is reduced&lt;/div&gt; &lt;li&gt; &lt;div align="justify"&gt;The strategies can be tested separately if you feel the need to (remember that they are originally covered by the original tests).&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt; &lt;h4&gt;Other Refactorings&lt;/h4&gt; &lt;p align="justify"&gt;There are many more reasons to refactor code, but the above cover most of the cases I come across. If you are interested in reading more on refactoring software, I suggest reading the following books:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;div align="justify"&gt;&lt;a href="http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672/ref=sr_1_1?s=books&amp;amp;ie=UTF8&amp;amp;qid=1321955898&amp;amp;sr=1-1"&gt;Refactoring: Improving the Design of Existing Code&lt;/a&gt; by &lt;a href="http://www.amazon.com/Martin-Fowler/e/B000AQ6PGM/ref=sr_ntt_srch_lnk_1?qid=1321955898&amp;amp;sr=1-1"&gt;Martin Fowler&lt;/a&gt;, &lt;a href="http://www.amazon.com/Kent-Beck/e/B000APC0EY/ref=sr_ntt_srch_lnk_1?qid=1321955898&amp;amp;sr=1-1"&gt;Kent Beck&lt;/a&gt;, John Brant and William Opdyke&lt;/div&gt; &lt;li&gt; &lt;p&gt;&lt;a href="http://www.amazon.com/Refactoring-Patterns-Joshua-Kerievsky/dp/0321213351/ref=sr_1_3?s=books&amp;amp;ie=UTF8&amp;amp;qid=1321955898&amp;amp;sr=1-3"&gt;Refactoring to Patterns&lt;/a&gt; by &lt;a href="http://www.amazon.com/Joshua-Kerievsky/e/B001KDF9O8/ref=sr_ntt_srch_lnk_3?qid=1321955898&amp;amp;sr=1-3"&gt;Joshua Kerievsky&lt;/a&gt;&lt;/p&gt; &lt;li&gt; &lt;p&gt;&lt;a href="http://www.amazon.com/Professional-Refactoring-ASP-NET-Wrox-Programmer/dp/047043452X/ref=sr_1_11?s=books&amp;amp;ie=UTF8&amp;amp;qid=1321955898&amp;amp;sr=1-11"&gt;Professional Refactoring in C# &amp;amp; ASP.NET (Wrox Programmer to Programmer)&lt;/a&gt; by &lt;a href="http://www.amazon.com/Danijel-Arsenovski/e/B001JS6M2C/ref=sr_ntt_srch_lnk_11?qid=1321955898&amp;amp;sr=1-11"&gt;Danijel Arsenovski&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Hope this helps.  &lt;p&gt;Assaf.&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:c8de3379-2d70-45d4-ac56-14d885c9fb0d" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Agile" rel="tag"&gt;Agile&lt;/a&gt;,&lt;a href="http://technorati.com/tags/TDD" rel="tag"&gt;TDD&lt;/a&gt;,&lt;a href="http://technorati.com/tags/BDD" rel="tag"&gt;BDD&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Refactor" rel="tag"&gt;Refactor&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Extreme+Programming" rel="tag"&gt;Extreme Programming&lt;/a&gt;,&lt;a href="http://technorati.com/tags/XP" rel="tag"&gt;XP&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2660291115609609354-4207190269313261992?l=www.softwareandi.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2660291115609609354/posts/default/4207190269313261992'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2660291115609609354/posts/default/4207190269313261992'/><link rel='alternate' type='text/html' href='http://www.softwareandi.com/2011/11/if-you-develop-your-products-using-tdd.html' title='How to Refactor Your Code'/><author><name>Assaf Stone</name><uri>http://www.blogger.com/profile/14023994489658711542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_njIZU_X1s08/Sb0rpRzfcxI/AAAAAAAAABM/a0wzTXU3Grg/S220/Me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/-h8uceWI9Go8/TsuQ2nA4NZI/AAAAAAAAAaA/_Xo5rtK5Tig/s72-c/Red-Green-Refactor_thumb%25255B3%25255D.png?imgmax=800' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-2660291115609609354.post-2328291326886879096</id><published>2011-08-29T11:33:00.001+03:00</published><updated>2011-08-31T16:39:07.447+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Giveaway'/><category scheme='http://www.blogger.com/atom/ns#' term='Build'/><category scheme='http://www.blogger.com/atom/ns#' term='tablet'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows 8'/><title type='text'>What Will Microsoft Give Away at the Build Conference?</title><content type='html'>&lt;p align="justify"&gt;In just over two weeks, on September 13th, the &lt;a href="http://www.buildwindows.com/" target="_blank"&gt;Build Windows&lt;/a&gt; conference will begin in Anaheim, CA. Microsoft is expected to unveil Windows 8 and show software and hardware developers how to use it. The good ol’ guys in Redmond have kept a &lt;em&gt;really&lt;/em&gt; tight lid on what exactly is going on there, and even now, at the time of the writing of this post, they haven’t revealed any information about the agenda and the sessions.&lt;/p&gt; &lt;p align="justify"&gt;There have been several posts, some seem better informed, while others seem like baseless gossip, regarding what is going to happen with WPF, .NET and the rest of the existing development tools Microsoft have supported for the last decade or so, given some unfortunate remark regarding HTML5, CSS &amp;amp; Javascript being the new tools of choice for developing Windows 8 “immersive” applications.&lt;/p&gt; &lt;p align="justify"&gt;One thing that they have kept &lt;em&gt;extremely&lt;/em&gt; quiet about however, is what they will giveaway as gifts to those who came to the conference&lt;/p&gt; &lt;h3 align="justify"&gt;Giveaways&lt;/h3&gt; &lt;p align="justify"&gt;The year 2011 is, without doubt, the year of the tablet. IPad2, several Android Honeycomb tablets and now the demos that Microsoft made at &lt;a href="http://www.youtube.com/watch?v=UYSSdSNFjhU" target="_blank"&gt;Computex&lt;/a&gt; and &lt;a href="http://www.microsoft.com/presspass/features/2011/jun11/06-01corporatenews.aspx" target="_blank"&gt;Channel9&lt;/a&gt; (all of which show case Windows 8 on tablets) all point towards a tablet being the main focus of development this year.&lt;/p&gt; &lt;p align="justify"&gt;Moreover, in &lt;a href="http://www.google.com/events/io/2011/index-live.html" target="_blank"&gt;Google I/O 2011&lt;/a&gt;, Google &lt;a href="http://news.cnet.com/8301-30685_3-20061487-264.html" target="_blank"&gt;handed out 5000 Samsung 10.1 Galaxy Tabs&lt;/a&gt;, one to each registered guest.&lt;/p&gt; &lt;p align="justify"&gt;Microsoft can’t afford to, with all the hype created around Windows 8 and tablets this year, do any less.&lt;/p&gt; &lt;p align="justify"&gt;It is my best, educated guess, that Microsoft will be handing out &lt;strong&gt;&lt;em&gt;tablets with the latest build of Windows 8!&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt; &lt;h3 align="justify"&gt;So, What’ll it be, exactly?&lt;/h3&gt; &lt;p align="justify"&gt;In the aforementioned Computex demo, in the 19th minute (18:30, to be exact), &lt;a href="http://www.microsoft.com/presspass/exec/Angiulo/" target="_blank"&gt;Mike Angiulo&lt;/a&gt;, Microsoft’s Vice President of Windows Planning demoed the new ARM based developers’ tablet (designed especially for software and hardware developers, with extra ports, and all), and said, and I quote:&lt;a href="http://lh3.ggpht.com/-37c7J0ZzS5k/TltOzy4YseI/AAAAAAAAAYU/lMCXIU9Kx8c/s1600-h/Windows8DeveloperSystem%25255B3%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px 0px 0px 10px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Windows8DeveloperSystem" border="0" alt="Windows8DeveloperSystem" align="right" src="http://lh4.ggpht.com/-S_YFh68xSgc/TltO01ylpmI/AAAAAAAAAYY/Q0VgK3ibick/Windows8DeveloperSystem_thumb%25255B1%25255D.png?imgmax=800" width="404" height="227"&gt;&lt;/a&gt;&lt;/p&gt; &lt;blockquote&gt; &lt;p align="justify"&gt;“Now we have these &lt;strong&gt;developer reference systems&lt;/strong&gt; that are all &lt;strong&gt;up and running&lt;/strong&gt;… these are systems that are built for hardware and software developers… what they do represent are integrated, working PCs”&lt;/p&gt;&lt;/blockquote&gt; &lt;p align="justify"&gt;Mike went into some detail about the developer tablet’s specs:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;div align="justify"&gt;ARM based, Snapdragon, 1.2GHZ chip&lt;/div&gt; &lt;li&gt; &lt;div align="justify"&gt;13mm thick&lt;/div&gt; &lt;li&gt; &lt;div align="justify"&gt;11.6” Screen&lt;/div&gt; &lt;li&gt; &lt;div align="justify"&gt;Extensive USB support (seamless connection to a DOK was demonstrated, worked as expected)&lt;/div&gt; &lt;li&gt; &lt;div align="justify"&gt;720p rear camera&lt;/div&gt; &lt;li&gt; &lt;div align="justify"&gt;All of the common sensors (proximity, orientation, etc.)&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p align="justify"&gt;It looks like it runs (“flies” even) beautifully, instantly loading and playing an H.264 full HD video. Real-world usage will probably not be as good as demoed, but still…&lt;/p&gt; &lt;p align="justify"&gt;Based on this, I believe that we (yes, I’m registered, and going to be there) will receive the &lt;strong&gt;developer reference tablet running Windows 8&lt;/strong&gt;.&lt;/p&gt; &lt;p align="justify"&gt;Remember, if I was right, you read it here first!&lt;/p&gt; &lt;p align="justify"&gt;See you at “Build”,&lt;/p&gt; &lt;p align="justify"&gt;Assaf.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2660291115609609354-2328291326886879096?l=www.softwareandi.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.softwareandi.com/feeds/2328291326886879096/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.softwareandi.com/2011/08/what-will-microsoft-give-away-at-build.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2660291115609609354/posts/default/2328291326886879096'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2660291115609609354/posts/default/2328291326886879096'/><link rel='alternate' type='text/html' href='http://www.softwareandi.com/2011/08/what-will-microsoft-give-away-at-build.html' title='What Will Microsoft Give Away at the Build Conference?'/><author><name>Assaf Stone</name><uri>http://www.blogger.com/profile/14023994489658711542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_njIZU_X1s08/Sb0rpRzfcxI/AAAAAAAAABM/a0wzTXU3Grg/S220/Me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/-S_YFh68xSgc/TltO01ylpmI/AAAAAAAAAYY/Q0VgK3ibick/s72-c/Windows8DeveloperSystem_thumb%25255B1%25255D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2660291115609609354.post-5030344081326938412</id><published>2011-08-12T11:00:00.000+03:00</published><updated>2011-08-12T15:11:04.954+03:00</updated><title type='text'>Alternatives to Planning Poker</title><content type='html'>&lt;p align="justify"&gt;This blog post is inspired by a tweet I saw: &lt;/p&gt; &lt;p align="justify"&gt;&lt;a href="http://lh5.ggpht.com/-99u3dd9vGvM/TkTfAEAk_RI/AAAAAAAAAYM/EldIBWd9-UI/s1600-h/image2.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" align="right" src="http://lh5.ggpht.com/-Nm6TJFCzNF0/TkTfA419NaI/AAAAAAAAAYQ/iCJX1136XDE/image_thumb.png?imgmax=800" width="244" height="106"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align="justify"&gt;The best thing about planning poker, and in my opinion the one thing that it brings to the table that no other system does, is the escape it offers from &lt;em&gt;&lt;a href="http://en.wikipedia.org/wiki/Herd_mentality"&gt;herd mentality&lt;/a&gt;&lt;/em&gt;. Planning Poker allows each member of the team to make his own opinion uninfluenced by others, and then allows the team as a whole to use &lt;em&gt;&lt;a href="http://en.wikipedia.org/wiki/The_Wisdom_of_Crowds"&gt;Wisdom of Crowds&lt;/a&gt; &lt;/em&gt;to reach a good estimate.&lt;/p&gt; &lt;p align="justify"&gt;The downside is that it is silly.&lt;/p&gt; &lt;p align="justify"&gt;At least that’s how it looks from the outside. I mean, come on! A bunch of grownups spending precious hours of the work day, at the office, taking up a conference room while playing cards, until someone pulls a &lt;em&gt;Joker&lt;/em&gt; (or whichever card signals the need for a coffee break)? I know the value of games and having fun at work, but I’m pretty sure that most adults are capable of enjoying good solid productive work without having to look goofy.&lt;/p&gt; &lt;p align="justify"&gt;Here’s what I suggest:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;div align="justify"&gt;Discuss the PBI (Product Backlog Item) for a short while (2 minutes seems like a good average). &lt;/div&gt; &lt;li&gt; &lt;div align="justify"&gt;Everyone takes a quiet moment to make a gut estimate. It doesn’t matter how it is made – relative (i.e. story points), absolute (ideal days) or rough (T-Shirt sizes), and writes it down. &lt;/div&gt; &lt;li&gt; &lt;div align="justify"&gt;Alongside the estimate everybody lists the top reason (or few reasons, if you must – but that’s all!) he believes his estimate to be true. Examples could be: &lt;/div&gt; &lt;ol&gt; &lt;li&gt; &lt;div align="justify"&gt;“We’ve done this before. Just extract and modify the ACME algorithm” &lt;/div&gt; &lt;li&gt; &lt;div align="justify"&gt;“Nobody’s done it here before” &lt;/div&gt; &lt;li&gt; &lt;div align="justify"&gt;“The data access layer is a mess. It will take a week to refactor” &lt;/div&gt; &lt;li&gt; &lt;div align="justify"&gt;“Only George knows how to do it, and he’s off, snorkeling in Aruba…”. &lt;/div&gt; &lt;li&gt; &lt;div align="justify"&gt;“A simple state machine and we’re done! I’m the state machine guru!”. &lt;/div&gt; &lt;li&gt; &lt;div align="justify"&gt;“Haven’t got a clue. Just want to play it safe.”&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt; &lt;li&gt; &lt;div align="justify"&gt;When everyone is done, merge the reasons, and decide on the best estimate. &lt;/div&gt; &lt;li&gt; &lt;div align="justify"&gt;Rinse and repeat: If consensus is reached, repeat with the next item. Otherwise, repeat with the same.&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt; &lt;p align="justify"&gt;Does it look familiar? It should. But &lt;em&gt;shhhh!&lt;/em&gt; Don’t tell anyone. Let’s keep it our secret.&lt;/p&gt; &lt;p align="justify"&gt;Oh, and you can call it &lt;strong&gt;team estimation&lt;/strong&gt;. Now that’s a good, serious meaningful name, isn’t?&lt;/p&gt; &lt;p align="justify"&gt;Now run along, have some fun (the good productive, serious kind, not the goofy kind).&lt;/p&gt; &lt;p align="justify"&gt;Assaf.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2660291115609609354-5030344081326938412?l=www.softwareandi.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.softwareandi.com/feeds/5030344081326938412/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.softwareandi.com/2011/08/alternatives-to-planning-poker.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2660291115609609354/posts/default/5030344081326938412'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2660291115609609354/posts/default/5030344081326938412'/><link rel='alternate' type='text/html' href='http://www.softwareandi.com/2011/08/alternatives-to-planning-poker.html' title='Alternatives to Planning Poker'/><author><name>Assaf Stone</name><uri>http://www.blogger.com/profile/14023994489658711542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_njIZU_X1s08/Sb0rpRzfcxI/AAAAAAAAABM/a0wzTXU3Grg/S220/Me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/-Nm6TJFCzNF0/TkTfA419NaI/AAAAAAAAAYQ/iCJX1136XDE/s72-c/image_thumb.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2660291115609609354.post-1960101454497610643</id><published>2011-08-09T16:06:00.001+03:00</published><updated>2011-08-09T17:54:35.190+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><category scheme='http://www.blogger.com/atom/ns#' term='Estimation'/><title type='text'>Another Stab at Work Estimation</title><content type='html'>&lt;h3&gt;The Story&lt;/h3&gt; &lt;p align="justify"&gt;A couple of days ago, I was at a client, helping with his company’s migration from one version control system to another. As part of the work, we had to get the latest version of the source (i.e. download them to a local folder on the PC), copy it to the target system’s workspace (i.e. perform a standard windows copy to &lt;em&gt;another&lt;/em&gt; folder on the PC), and then check in the sources.&lt;/p&gt; &lt;p align="justify"&gt;I want to discuss the &lt;strong&gt;&lt;em&gt;copying&lt;/em&gt;&lt;/strong&gt; process. Yes, the copy. &lt;/p&gt; &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-1gmcXhNfu-Y/TkEw17oaYbI/AAAAAAAAAYE/_rfwKgZw5Y8/s1600-h/filescopy%25255B9%25255D.jpg"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="filescopy" border="0" alt="filescopy" align="right" src="http://lh4.ggpht.com/-qbAUP8id6Ps/TkEw2kicVpI/AAAAAAAAAYI/bHsVf1-i2EQ/filescopy_thumb%25255B5%25255D.jpg?imgmax=800" width="372" height="171"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align="justify"&gt;Not much to copying you say? Well, essentially, you’re right. You select the folder that you are going to copy &lt;strong&gt;from&lt;/strong&gt; (I selected a folder that was just over 1GB in size, and just over 50,000 files altogether)&lt;strong&gt; &lt;/strong&gt;. Then you copy it to the target folder. That’s it. Oh, and you wait.&lt;/p&gt; &lt;p align="justify"&gt;That’s what I &lt;em&gt;really&lt;/em&gt; want to discuss. The &lt;strong&gt;Wait&lt;/strong&gt;.&lt;/p&gt; &lt;p align="justify"&gt;This was my experience:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;div align="justify"&gt;First I had to wait for a few seconds (I think it was about 10 seconds) while windows &lt;strong&gt;calculated&lt;/strong&gt;&lt;/div&gt; &lt;li&gt; &lt;div align="justify"&gt;Next, it started copying, and said it would take roughly 3 minutes.&lt;/div&gt; &lt;li&gt; &lt;div align="justify"&gt;After a few more seconds, of copying it reevaluated the work at 4 minutes or so. &lt;/div&gt; &lt;li&gt; &lt;div align="justify"&gt;After that windows started to progressively update the estimate until it reached about 5:30 minutes.&lt;/div&gt; &lt;li&gt; &lt;div align="justify"&gt;At that point, the estimation seemed to be on track, as the remaining time steadily went down.&lt;/div&gt; &lt;li&gt; &lt;div align="justify"&gt;About 5 seconds or so from the end of the copy, it began taking longer for each second to complete (i.e. it took longer than 5 seconds to complete from that point, and it took longer than a second to tick off one second from the remaining time).&lt;/div&gt; &lt;li&gt; &lt;div align="justify"&gt;Finally, Windows reported that it was done. &lt;strong&gt;0 remaining seconds&lt;/strong&gt;. Means it’s done, doesn’t it? I thought so. Windows seems to have a different definition of done, apparently. It took 10 more seconds till it was &lt;strong&gt;&lt;em&gt;really&lt;/em&gt;&lt;/strong&gt; done.&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt; &lt;p align="justify"&gt;Sounds familiar to anyone? It should. Anyone who ever used a computer (I’ll hazard a guess that other PCs and operating systems have similar experiences) probably doesn’t even notice it anymore, seeing as it is such a common occurrence.&lt;/p&gt; &lt;p align="justify"&gt;That’s not what I’m talking about, though. I’m talking to all of you corporate developers, team leaders and managers.&lt;/p&gt; &lt;h3 align="justify"&gt;The Moral&lt;/h3&gt; &lt;p align="justify"&gt;In my experience many (perhaps most?) teams go through a frighteningly similar cycle whenever they &lt;strong&gt;estimate the cost of development&lt;/strong&gt; on a feature, or a project.&lt;/p&gt; &lt;p align="justify"&gt;This is (all to often) my experience:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;div align="justify"&gt;The team spends some effort “calculating” the effort required to develop each feature. Usually, it seems like the same 10 seconds are spent, the results are equally optimistic, and just as &lt;em&gt;“accurate”&lt;/em&gt;. &lt;/div&gt; &lt;li&gt; &lt;div align="justify"&gt;The team makes their estimate (optimistic and inaccurate).&lt;/div&gt; &lt;li&gt; &lt;div align="justify"&gt;Next, they start working on the problem. Soon enough, the team encounters the first problem they &lt;strong&gt;didn’t think of&lt;/strong&gt;. The estimate goes up.&lt;/div&gt; &lt;li&gt; &lt;div align="justify"&gt;This goes on several times, pushing the deadline into the slack assigned to development.&lt;/div&gt; &lt;li&gt; &lt;div align="justify"&gt;Eventually, the team reaches some rhythm, and it &lt;em&gt;seems&lt;/em&gt; like the team is on track. At least they report that they are.&lt;/div&gt; &lt;li&gt; &lt;div align="justify"&gt;Towards the end, when the deadline is just around the corner. In what is sometimes called “Crunch-time”, or the “robustness” phase, the team keeps announcing “we’re almost done”, or “we’ll finish tomorrow”. This usually takes quite a bit more than a day, of course.&lt;/div&gt; &lt;li&gt; &lt;div align="justify"&gt;Then they say that they’re done. Only they’re not. They completed part of the work – coding. “Testing? What’s that – that’s what QA are for. We meant done coding, not ready to deploy. What’s the matter with you?!?” It will take some more time before it actually is fit to let out in public.&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt; &lt;p align="justify"&gt;&lt;strong&gt;And everybody is surprised.&lt;/strong&gt;&lt;/p&gt; &lt;p align="justify"&gt;&lt;em&gt;That&lt;/em&gt; is what I don’t get. A &lt;strong&gt;computer&lt;/strong&gt;, performing a &lt;strong&gt;copy&lt;/strong&gt;, one of the simplest and straightforward tasks, can’t get the estimates right. And I was copying &lt;strong&gt;locally!&lt;/strong&gt; And that was to another folder on the same disk (even the same logical drive).&lt;/p&gt; &lt;p align="justify"&gt;How do you expect a &lt;strong&gt;human being&lt;/strong&gt;, performing an act of &lt;strong&gt;research &amp;amp; development&lt;/strong&gt;, doing something nobody did before (or at the very least not done by &lt;em&gt;this &lt;/em&gt;human being, in &lt;em&gt;this &lt;/em&gt;environment), to out-perform a computer?&lt;/p&gt; &lt;p align="justify"&gt;I know managers and customers depend on these numbers. I suggest a 12 step program to deal with that. There are alternatives.&lt;/p&gt; &lt;p align="justify"&gt;Welcome to the world of &lt;strong&gt;Agile&lt;/strong&gt; development.&lt;/p&gt; &lt;p align="justify"&gt;See you in the next post..&lt;/p&gt; &lt;p align="justify"&gt;Assaf.&lt;/p&gt; &lt;p align="justify"&gt;P.S. The next folder I had to copy, I used &lt;a href="http://ipmsg.org/tools/fastcopy.html.en" target="_blank"&gt;FastCopy&lt;/a&gt;. Took me less than half the time. Didn’t waste any of it on estimations.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2660291115609609354-1960101454497610643?l=www.softwareandi.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.softwareandi.com/feeds/1960101454497610643/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.softwareandi.com/2011/08/another-stab-at-work-estimation.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2660291115609609354/posts/default/1960101454497610643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2660291115609609354/posts/default/1960101454497610643'/><link rel='alternate' type='text/html' href='http://www.softwareandi.com/2011/08/another-stab-at-work-estimation.html' title='Another Stab at Work Estimation'/><author><name>Assaf Stone</name><uri>http://www.blogger.com/profile/14023994489658711542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_njIZU_X1s08/Sb0rpRzfcxI/AAAAAAAAABM/a0wzTXU3Grg/S220/Me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/-qbAUP8id6Ps/TkEw2kicVpI/AAAAAAAAAYI/bHsVf1-i2EQ/s72-c/filescopy_thumb%25255B5%25255D.jpg?imgmax=800' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2660291115609609354.post-509385314912781560</id><published>2011-06-28T15:12:00.001+03:00</published><updated>2011-06-28T15:12:12.586+03:00</updated><title type='text'>Our Talk at Sela Dev-Days–ALM Best Practices with TFS 2010</title><content type='html'>&lt;p&gt;Today &lt;a href="http://blogs.microsoft.co.il/blogs/yuvmaz/" target="_blank"&gt;Yuval Mazor&lt;/a&gt; and I gave the talk above in front of ~20 people, as part of the ALM day of &lt;a href="http://www.sela.co.il" target="_blank"&gt;Sela Group&lt;/a&gt;’s &lt;a href="http://www.sela.co.il/s/minisdp/index.html" target="_blank"&gt;Dev Days 2011&lt;/a&gt;. People were quite receptive – and I believe we got them to understand not only how you do things in TFS 2010, but also why. Some of the things we talked about:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Best practices for managing software development projects with TFS 2010  &lt;li&gt;What are work items and how to use them (including customizations and links)  &lt;li&gt;How to properly build a branching plan  &lt;li&gt;Where and how to apply automated builds and CI &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Unfortunately, we didn’t have enough time to cover TFS 2010 reports in detail – which means another talk is in order!&lt;/p&gt; &lt;p&gt;The presentation is available online &lt;a href="https://skydrive.live.com/redir.aspx?cid=13389367FEC74DC1&amp;amp;resid=13389367FEC74DC1%21225&amp;amp;page=view" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Thanks to &lt;a href="http://blogs.microsoft.co.il/blogs/shair/" target="_blank"&gt;Shai Raiten&lt;/a&gt; for the photography:&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-8RKs5kgYSG0/TgnFFDFQ2BI/AAAAAAAAAXo/7fuz8O7TGlU/s1600-h/ALMBestPracticesSelaDevDays2011_thum%25255B2%25255D.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="ALMBestPracticesSelaDevDays2011_thum" border="0" alt="ALMBestPracticesSelaDevDays2011_thum" src="http://lh5.ggpht.com/-NfJ8zHYMc9A/TgnFGjRhWVI/AAAAAAAAAXs/9m33ZJmerk4/ALMBestPracticesSelaDevDays2011_thum_thumb.jpg?imgmax=800" width="670" height="503"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;A big thank-you to our audience – it was great having you!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2660291115609609354-509385314912781560?l=www.softwareandi.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.softwareandi.com/feeds/509385314912781560/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.softwareandi.com/2011/06/our-talk-at-sela-dev-daysalm-best_28.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2660291115609609354/posts/default/509385314912781560'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2660291115609609354/posts/default/509385314912781560'/><link rel='alternate' type='text/html' href='http://www.softwareandi.com/2011/06/our-talk-at-sela-dev-daysalm-best_28.html' title='Our Talk at Sela Dev-Days–ALM Best Practices with TFS 2010'/><author><name>Assaf Stone</name><uri>http://www.blogger.com/profile/14023994489658711542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_njIZU_X1s08/Sb0rpRzfcxI/AAAAAAAAABM/a0wzTXU3Grg/S220/Me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/-NfJ8zHYMc9A/TgnFGjRhWVI/AAAAAAAAAXs/9m33ZJmerk4/s72-c/ALMBestPracticesSelaDevDays2011_thum_thumb.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2660291115609609354.post-8660675952531947383</id><published>2011-06-28T15:09:00.001+03:00</published><updated>2011-06-28T15:09:13.841+03:00</updated><title type='text'>Software &amp; I</title><content type='html'>&lt;p&gt;Hello all,&lt;/p&gt; &lt;p&gt;It took me a considerable amount of time to come up with a name for this blog. It was particularly difficult, because I didn’t want to pigeon-hole myself and limit the blog to just one subject. My other blog, &lt;a href="http://blogs.microsoft.co.il/blogs/assafstone/" target="_blank"&gt;Nightmare on ALM Street&lt;/a&gt;, specializes in gems about my current primary job – implementing application lifecycle processes with Microsoft Team Foundation Server.&lt;/p&gt; &lt;p&gt;But there’s more to me – even professionally – than just that. I’m a software developer, and while I mostly develop on the Microsoft technology stack (e.g. .NET and C#), I also dabble in other languages such as Java for Android development, non TFS / Agile / Scrum methodology, and even things that are not software related.&lt;/p&gt; &lt;p&gt;So I needed a blog that will talk about all that – Software being a major part of it, and other things that interest me.&lt;/p&gt; &lt;p&gt;In the end I came up with a simple and straight forward title – &lt;strong&gt;Software and I&lt;/strong&gt;. &lt;/p&gt; &lt;p&gt;I&amp;nbsp; promise to talk about anything that interests me – and hopefully, it will be of interest to you as well.&lt;/p&gt; &lt;p&gt;Lastly, I would like to give a very special thank you, to my good friend, Maor Linn, for designing the blog’s title banner. If you like it, give a holler – I’ll be sure to let him know.&lt;/p&gt; &lt;p&gt;Thanks,&lt;/p&gt; &lt;p&gt;Assaf.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2660291115609609354-8660675952531947383?l=www.softwareandi.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.softwareandi.com/feeds/8660675952531947383/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.softwareandi.com/2011/06/software-i.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2660291115609609354/posts/default/8660675952531947383'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2660291115609609354/posts/default/8660675952531947383'/><link rel='alternate' type='text/html' href='http://www.softwareandi.com/2011/06/software-i.html' title='Software &amp;amp; I'/><author><name>Assaf Stone</name><uri>http://www.blogger.com/profile/14023994489658711542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_njIZU_X1s08/Sb0rpRzfcxI/AAAAAAAAABM/a0wzTXU3Grg/S220/Me.jpg'/></author><thr:total>1</thr:total></entry></feed>
