<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Cory Foy</title>
	<atom:link href="http://blog.coryfoy.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.coryfoy.com</link>
	<description>It&#039;s all about delivering</description>
	<lastBuildDate>Fri, 23 Mar 2012 14:58:34 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>On Community and Conferences</title>
		<link>http://blog.coryfoy.com/2012/03/on-community-and-conferences/</link>
		<comments>http://blog.coryfoy.com/2012/03/on-community-and-conferences/#comments</comments>
		<pubDate>Fri, 23 Mar 2012 13:43:01 +0000</pubDate>
		<dc:creator>Cory Foy</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.coryfoy.com/?p=864</guid>
		<description><![CDATA[Technology Community &#8211; let&#8217;s chat for a second. Over the past…well, since you were created, you&#8217;ve been a male-dominated field. Unlike some other fields, you are well known for your cutesy &#8220;lack of social interaction&#8221;. Of course, now you are getting popular &#8211; it&#8217;s cool to be a &#8220;brogrammer&#8221; and code and hang out at [...]]]></description>
			<content:encoded><![CDATA[<p>Technology Community &#8211; let&#8217;s chat for a second. Over the past…well, since you were created, you&#8217;ve been a male-dominated field. Unlike some other fields, you are well known for your cutesy &#8220;lack of social interaction&#8221;. Of course, now you are getting popular &#8211; it&#8217;s cool to be a &#8220;brogrammer&#8221; and code and hang out at bars, making lots of money and sneering at the people who have held you down in the past. Also, I realize that even though you&#8217;ve been around for many years, you maintain a youthful edge to your appearance. </p>
<p align="center"><img src="http://www.cornetdesign.com/images/GrowingupGeek_AE7B/image.png" alt="Yes, me and a transformer" height="400" /><br/>(Yes, that&#8217;s me and a transformer)</p>
<p>Your brain is quite smart &#8211; looking at each individual neuron as a programmer, you have a lot of talent and good things to say. Unfortunately, the part of your brain that doesn&#8217;t filter what you say gets vocal from time to time and says things that are highly inappropriate. Like saying a key benefit of your event is &#8220;women&#8221;. Or digging yourself into a hole arguing on the internet instead of being responsible and taking the initiative to take things offline yourself (Hint: if someone is giving you negative advice that you think is inappropriate or you don&#8217;t like, either take it to email, or ignore it. It&#8217;s never worth it to engage publicly). Or giving talks filled with lingerie or negative connotations about people&#8217;s religious affiliations, race, sex, creed, family choices, etc. </p>
<p><a href="http://blog.coryfoy.com/2012/03/on-community-and-conferences/cliveclemons/" rel="attachment wp-att-865"><img src="http://blog.coryfoy.com/wp-content/uploads/2012/03/cliveclemons-300x229.jpg" alt="Inappropriate" title="Inappropriate" width="300" height="229" class="aligncenter size-medium wp-image-865" /></a></p>
<p>And, to some degree, I can forgive you. The newer neurons haven&#8217;t had a chance to be through the same experiences. To know what it&#8217;s like to have the one community where you think you can feel safe among your kind actually be no different than the other vile, inappropriate communities you&#8217;ve been a part of. To have fellow geeks make jokes like, &#8220;Hey Barbara, I heard you have DSL!&#8221; and then hear your other peers laugh because they weren&#8217;t referring to Digital Subscriber Lines. </p>
<p>But you older neurons &#8211; you are supposed to be the leaders. And as such, it is your responsibility to be the wise old geeks. The kind to go up to those younger neurons and help them see that such talk has no place in a community such as ours. There&#8217;s no need for conference blacklists, or anything like that. Because old, wise geeks talk. And network. And communicate how well topics were accepted or not. And discover which neurons actually care about building a community versus getting a laugh using tired old content because their talk doesn&#8217;t have enough real content to actually stand on its own. </p>
<p>You older neurons also have to stand behind those trying to make a difference. How long do we want to be known as the community where you shut off the lights, slide pizza under the door, and keep our Steam wallets full and hope for the best? </p>
<blockquote><p>Software Craftsmanship rejects the narrow role specialization that software engineering forced on developers and instead celebrates true craftsmen who can take a complete job from start to finish.” – Pete McBreen – Software Craftsmanship: The New Imperative</p></blockquote>
<p>Metaphors aside, I have two daughters. One of my daughters said about a year ago, <em>&#8220;When I grow up, I want to be myself so I can catch lizards and fix things&#8221;</em>. I never want her to go to an event, or hear a talk, or read an article and ever think otherwise &#8211; especially from someone <em>in my community</em>. Software developers who aren&#8217;t white, male and nerdy from the get go have to struggle enough as it is without listening to those younger neurons try to be funny and the people in the audiences being totally OK with it.</p>
<p>And, as Pete says above, true craftsmen focus on the ability to take a complete job from start to finish. In addition, they focus on building the community &#8211;  a community of professionals. That means it&#8217;s not enough to just &#8220;be offended&#8221; at these types of things &#8211; we have to take an active role in setting a standard that we won&#8217;t accept it as a community, and reaching out to bridge the gaps that we as a community have allowed to foster for a long time.</p>
<p>There&#8217;s something very wrong when I, as a dad, am more worried about my daughters being exposed to the software community at large rather than the little boys that will inevitably end up at my door step. Or when I have to worry that if I teach my nieces programming that they&#8217;ll then be ostracized by the very community I want them to be excited about. We need to come together and simply say, no more. We won&#8217;t stand for that, we won&#8217;t tolerate it, and we&#8217;re going to actively work to bring diversity into our community and help people see more role models than the white, nerdy and male ones we have right now.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.coryfoy.com/2012/03/on-community-and-conferences/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Agile, Craftsmanship and Exciting News!</title>
		<link>http://blog.coryfoy.com/2012/02/agile-craftsmanship-and-exciting-news/</link>
		<comments>http://blog.coryfoy.com/2012/02/agile-craftsmanship-and-exciting-news/#comments</comments>
		<pubDate>Wed, 15 Feb 2012 16:10:59 +0000</pubDate>
		<dc:creator>Cory Foy</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.coryfoy.com/?p=858</guid>
		<description><![CDATA[&#8220;Software Craftsmanship rejects the narrow role specialization that software engineering forced on developers and instead celebrates true craftsmen who can take a complete job from start to finish.&#8221; &#8211; Pete McBreen &#8211; Software Craftsmanship: The New Imperative For the past several years, my focus has been on helping organizations adopt lean and agile practices to [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>&#8220;Software Craftsmanship rejects the narrow role specialization that software engineering forced on developers and instead celebrates true craftsmen who can take a complete job from start to finish.&#8221; &#8211; Pete McBreen &#8211; Software Craftsmanship: The New Imperative</p></blockquote>
<p>For the past several years, my focus has been on helping organizations adopt lean and agile practices to improve how they deliver software. I tended to play one of two roles &#8211; either convincing managers and executives why it was critical to look at the whole picture, or convincing development teams that paying attention to the business and being involved was a Really Good Idea.</p>
<p>Around October of 2010, I made the decision to take a sabbatical from conferences, mailing lists, twitter, etc. Basically just spend a year reflecting on where I was and the impact I wanted to have. During that time I got to see things like <a href="http://www.coderetreat.org">Code Retreats</a> and the impact that had on communities. I got to watch communities like Chicago grow and prosper because of the collaboration by the people who were part of it. And I got to participate as a minor role as a mentor with the groups participating in <a href="http://www.gazellelab.com">Gazelle Lab</a>. </p>
<p>And it made me realize that &#8211; more than wanting to move to a place like Chicago or Silicon Valley &#8211; that I wanted to make that kind of community happen where I live in the Tampa area. We have great people, great companies, and great opportunities to continue with the momentum here. But, with a hectic travel schedule (I&#8217;m Platinum for the year on Delta &#8211; 75k miles &#8211; and it&#8217;s only the end of February) I knew that I&#8217;d have to find something different. But beyond just something different &#8211; an opportunity to be with a company or start something which valued the community, which valued building the skills and experiences of developers. </p>
<p>About three weeks ago, I talked with some people who had done something similar in Chicago &#8211; Micah Martin and Paul Pagel with <a href="http://www.8thlight.com">8th Light</a>. And the more we chatted, the more it became clear that together we could make something amazing happen.</p>
<p>So I&#8217;m excited to announce that on March 5th, I&#8217;m going to be joining 8th Light to help expand an amazing company to a new market &#8211; Tampa, FL! We&#8217;ll be bringing a lot of the same principles to the Tampa office that are shared in Chicago &#8211; apprenticeship programs, 8th Light University and a company focused on building beautifully crafted software products that deliver the highest value to our customers. </p>
<p>We&#8217;ll be hosting several exciting events over the next couple of months, including bringing Uncle Bob Martin down to Tampa for presentations. More importantly, we&#8217;re going to be on the lookout for people interesting in becoming a part of an organization truly committed to a continuous learning process, and the growth of its people. </p>
<p>This also means I&#8217;ll be leaving <a href="http://www.netobjectives.com">Net Objectives</a> which has taught me a lot about furthering my thinking around architecture and design, as well as scaling and adopting lean principles at scale. I&#8217;m thankful to Alan Shalloway, Alan Chedalawada, Amir Kolsky, Mike Cox, Scott Bain and Ken Pugh for their insights, discussions and partnership. </p>
<p>But I&#8217;m excited about the opportunities we&#8217;ll have here in the Tampa area to rejoin the communities and help build some amazing partnerships, products and events. My email address of foyc at cory foy dot com is still around, or you can email me at cory at 8thlight dot com, so if you have any ideas, or would like any information, be sure to let me know!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.coryfoy.com/2012/02/agile-craftsmanship-and-exciting-news/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Pareto and Minimal Viable Products/Hypothesis</title>
		<link>http://blog.coryfoy.com/2011/12/pareto-and-minimal-viable-productshypothesis/</link>
		<comments>http://blog.coryfoy.com/2011/12/pareto-and-minimal-viable-productshypothesis/#comments</comments>
		<pubDate>Mon, 19 Dec 2011 16:56:18 +0000</pubDate>
		<dc:creator>Cory Foy</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.coryfoy.com/?p=847</guid>
		<description><![CDATA[In a recent post, Jim Shore blogs about a &#8220;Minimum Viable Hypothesis.&#8221; With MVH, the first step after figuring out the problem to solve isn&#8217;t to create a minimum viable product. Instead, the first step is to brainstorm market hypotheses. Which groups have the desire and funds for a solution? What Jim is blogging about [...]]]></description>
			<content:encoded><![CDATA[<p>In a recent post, Jim Shore blogs about a &#8220;<a href="http://jamesshore.com/Blog/Minimum-Viable-Hypothesis.html">Minimum Viable Hypothesis</a>.&#8221;</p>
<blockquote><p>With MVH, the first step after figuring out the problem to solve isn&#8217;t to create a minimum viable product. Instead, the first step is to brainstorm market hypotheses. Which groups have the <em>desire</em> and <em>funds</em> for a solution?</p></blockquote>
<p>What Jim is blogging about is another side of the minimal coin, and since we teach this in our classes, I thought it would be worth posting about how both sides look.</p>
<p>First, let&#8217;s imagine you have The Next Great Idea. Your mind buzzes with all of the uses, and ways it could help people and make money. You literally have a laundry list of the features, and markets. But now you are in one of two positions:</p>
<ol>
<li>You are approaching a market where you have to sell a solution to someone&#8217;s problem. Of course, as the great <a href="http://www.geraldmweinberg.com">Jerry Weinberg</a> says, selling a solution implies that someone has a problem, and people don&#8217;t have problems (at least none they&#8217;ll admit to you if they didn&#8217;t hire you to solve it). Here you are proposing different or better ways of doing things, and quality and feature sets matter.</li>
<li>You are approaching a market with an actual need or void. Here, time to market matters because if you miss the market opportunity, someone else will fill it.</li>
</ol>
<p>These may sound similar, but there is a key distinction in how we approach the Pareto solution &#8211; known as the 80/20 rule (20% of the system provides ~80% of the value). One chart we use shows the results of a Standish Group survey of 2000 projects at 1000 companies detailing the usage of features and functions in a typical system:</p>
<p><a href="http://blog.coryfoy.com/wp-content/uploads/2011/12/standishusage.jpg"><img src="http://blog.coryfoy.com/wp-content/uploads/2011/12/standishusage-300x217.jpg" alt="Standish Usage of Functions and Features in a Typical System" title="Standish Usage of Functions and Features in a Typical System" width="300" height="217" class="alignnone size-medium wp-image-848" /></a></p>
<p>A key takeaway we teach our students is that, if you want to go faster, stop doing the 45% of features that are never used. And even if the Standish group numbers are debated &#8211; the reaction of my students thinking about their own systems easily validates that we waste a lot of time in the Never Used category.</p>
<p>But, the chart details something else. If we actually <em>know</em> the Always and Sometimes features up front, why would we wait to ship the product to complete the other features?</p>
<p>This, to me, is the key distinction of the Minimal Viable Product. We know the highest value items, so we work to build and ship those first. We then are guided by the feedback (and profits) of the release to incrementally improve the product. And, in my experience, you can only know those items if you are filling an actual need or void.</p>
<p><a href="http://blog.coryfoy.com/wp-content/uploads/2011/12/paretorelease.png"><img src="http://blog.coryfoy.com/wp-content/uploads/2011/12/paretorelease-300x278.png" alt="Pareto Release (80/20 Rule)" title="Pareto Release" width="300" height="278" class="alignleft size-medium wp-image-850" /></a>When we do release, it looks something like the chart to the left. We push out a release which gets a ton of value and revenue first, and then use the feedback so that each subsequent release adds incremental value to the product and the customers. </p>
<p>If, instead, you are attempting to fill a <em>perceived</em> need or void, or you think you can do better, then you don&#8217;t want to focus on what you think the 80/20 is, because you could easily be wrong &#8211; wasting a lot of time and money in the process (as Jim detailed in his post). Instead, what you are looking for is a release which gives you enough information to discover where the market is and what those 80/20 features are. I like Jim&#8217;s term of the &#8220;Minimal Viable Hypothesis&#8221; here, because that is what it is. You are making a guess &#8211; a hypothesis &#8211; of where the market is, and now you need to run some experiments to see if that&#8217;s actually viable &#8211; before you build an entire set of theories around it.</p>
<p><a href="http://blog.coryfoy.com/wp-content/uploads/2011/12/mvhrelease.png"><img src="http://blog.coryfoy.com/wp-content/uploads/2011/12/mvhrelease-300x291.png" alt="Minimal Viable Hypothesis Release" title="Minimal Viable Hypothesis Release" width="300" height="291" class="alignleft size-medium wp-image-849" /></a>So, in a Minimal Viable Hypothesis release, we&#8217;d see an initial release with minor adoption and profits, because we are using it as a feedback loop. In fact, I joke with my students and tell them that, in this case, you should purposely deliver what the customer doesn&#8217;t want so that a) You are reminded that you are going to have to rebuild it anyway b) You get the feedback loop faster, since you know it&#8217;s what they don&#8217;t want and c) When you get people fired up, you learn a lot &#8211; and people mad at software are pretty fired up!</p>
<p>So, thanks Jim for a great label for the other type of release. I think that most people will find themselves solidly in the MVH camp &#8211; and that many startups would be very wise to heed the advice to get something to your customers to use as a feedback loop for making what they really want.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.coryfoy.com/2011/12/pareto-and-minimal-viable-productshypothesis/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Simple Design with Design Patterns</title>
		<link>http://blog.coryfoy.com/2011/10/simple-design-with-design-patterns/</link>
		<comments>http://blog.coryfoy.com/2011/10/simple-design-with-design-patterns/#comments</comments>
		<pubDate>Fri, 28 Oct 2011 01:57:04 +0000</pubDate>
		<dc:creator>Cory Foy</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.coryfoy.com/?p=835</guid>
		<description><![CDATA[Over the past couple of months I&#8217;ve been working with several clients struggling with doing incremental architecture and design. As an organization moves away from a typical waterfall method &#8211; with lots of time for analysis and design &#8211; they have to find ways to still build scalable, sustainable systems in an incremental fashion. I [...]]]></description>
			<content:encoded><![CDATA[<p>Over the past couple of months I&#8217;ve been working with several clients struggling with doing incremental architecture and design. As an organization moves away from a typical waterfall method &#8211; with lots of time for analysis and design &#8211; they have to find ways to still build scalable, sustainable systems in an incremental fashion.</p>
<p>I just finished up an article for the Norwegian Developers Conference Magazine around iterative design. In talking through the article points with the ever wonderful <a href="http://twitter.com/coreyhaines">Corey Haines</a> and <a href="http://patmaddox.com/">Pat Maddox</a>, Corey brought up the notion that he tends to shy away from design patterns discussions with beginners because it tends to lead to large, bloated designs.</p>
<p>It&#8217;s unfortunate that the application of design patterns far too often <em>does</em> lead to large, bloated, unmaintainable designs. It&#8217;s a very common misconception that the patterns are &#8220;recipes&#8221; we apply to a solution to build it into something recognizable. But, in fact, patterns are actually inherent in the problem itself, and present options for understanding different approaches towards the design of a solution. It&#8217;s when we blindly apply that pattern or sets of a pattern as the solution that we get in trouble.</p>
<p>I have some larger examples in the article, but I thought it would be fun to apply the thinking to <a href="http://en.wikipedia.org/wiki/Conway%27s_Game_of_Life">Conway&#8217;s Game of Life</a> &#8211; a canonical example in many of the <a href="http://coderetreat.com/">Code Retreats</a> and other design and emergent code exercises. It&#8217;s a simple game with simple rules that produces some amazingly complex behavior. </p>
<p>To follow along, there are two key elements to understand. The first is the guidelines the authors of the <a href="http://en.wikipedia.org/wiki/Design_Patterns">&#8220;Gang of Four&#8221; (GoF) Design Patterns book</a> laid out for the application of patterns. These are:</p>
<ol>
<li><strong>Design to Interfaces</strong> &#8211; This is commonly construed as meaning we should design all interactions to be through interface types. Instead the guidance is saying that we should design based on the interfaces and interactions between the objects &#8211; something we call Programming by Intention</li>
<li><strong>Favor Object Delegation over Inheritance</strong> &#8211; Solving specialization through inheritance works OK &#8211; until we hit a second specialization case. So we should favor delegating work to other classes over creating specialized subclasses whenever possible</li>
<li><strong>Encapsulate the Concept that Varies</strong> &#8211; When things vary &#8211; whether they are implementations, designs, relationships or anything else &#8211; we need to find ways make it appear to the calling classes that the varying issue isnʼt actually varying </li>
</ol>
<p>These are critical guidelines to follow, and complement Kent Beck&#8217;s <a href="http://c2.com/cgi/wiki?XpSimplicityRules">4 Rules of Simple Design</a> and Robert Martin&#8217;s <a href="http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod">SOLID Principles</a> (See <a href="http://lostechies.com/derickbailey/2009/02/11/solid-development-principles-in-motivational-pictures/">Derick Bailey&#8217;s post</a> for a great explanation of SOLID &#8211; with pictures!). </p>
<p>The second is the rules of the Game of Life. The board is laid out with cells, and each cell has up to 8 neighbors. At each tick in time, the following transitions happen simultaneously (from <a href="http://en.wikipedia.org/wiki/Conway%27s_Game_of_Life">the Wikipedia article</a>):</p>
<ol>
<li>Any live cell with fewer than two live neighbors dies, as if caused by under-population</li>
<li>Any live cell with two or three live neighbors lives on to the next generation</li>
<li>Any live cell with more than three live neighbors dies, as if by overcrowding</li>
<li>Any dead cell with exactly three live neighbors becomes a live cell, as if by reproduction</li>
</ol>
<p>Normally we can start implementing this exercise using a test-first method. But what happens if we step back and look at the problem and see what patterns are inherent in it? We know that we have a cell, and that it has two variations &#8211; Alive or Dead. Each variation has different behavior. However &#8211; and this is key &#8211; the two variations don&#8217;t produce different versions of the cell. This matters, because we could implement a cell using subclassing for the states:</p>
<pre>
          |Cell|
|AliveCell|    |DeadCell|
</pre>
<p>But it would make our system more difficult because we&#8217;d have to swap cell instances every time the state changes. But it is a variation, and looking at the third GoF guideline above, we should encapsulate that variation, which does happen above. But, we violate the second guideline, which is to favor delegation over inheritance. </p>
<p>So, if we keep looking at this, a <code>Cell</code> doesn&#8217;t actually care what state it&#8217;s in &#8211; all it cares about is that it has a state. A <code>Cell</code> also doesn&#8217;t care about what happens because of that state &#8211; it only cares that it needs to see if its state should be updated. So, we could think about the problem with this design:</p>
<pre>
|Cell| <------- |Status|
           |Alive|    |Dead|
</pre>
<p>And now the job of the cell becomes to respond to a time tick and find out if it needs a new status. With that thinking, we can apply a <a href="http://www.netobjectives.com/PatternRepository/index.php?title=TheStrategyPattern">Strategy</a> based on the state to determine the next state to move into, or run the <code>Cell</code> through a <a href="http://www.netobjectives.com/PatternRepository/index.php?title=TheChainOfResponsibilityPattern">Chain of Responsibility</a> to determine the next state (each step would return the correct Status object, with the default to return the existing one). </p>
<p>Is this overkill? Having a Cell with a separate Status object which gets selected based on a Strategy or Chain of Responsibility? No! Because at this point, we aren't talking about <em>solutions</em> but about the patterns inherent in the problem. Certainly if we implemented a <code>Cell</code> with a <code>Status</code> object with an <code>AliveStatus</code> class and a <code>DeadStatus</code> class someone, somewhere, should slap us upside the head. But if we just use patterns thinking as an initial vector for our approach, we can think through some of the different scenarios, and then begin implementing the code test-first following the 4 Rules of Simple Design and probably end up with a <code>Cell</code> class that has a <code>Boolean is_alive</code> field. </p>
<p>So, when you are tackling a problem, step back and look at what the problem is trying to tell you. More than likely there is some type of variation which needs to be encapsulate, and several patterns inherent in that problem. Just don't blindly continue on with implementing the patterns based on a book. Patterns aren't the code you write. They are the ideas in the problem you are solving - and you should implement those ideas in the simplest way you can. </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.coryfoy.com/2011/10/simple-design-with-design-patterns/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Switching Financial Institutions &#8211; It&#8217;s Easier Than You Think</title>
		<link>http://blog.coryfoy.com/2011/10/switching-financial-institutions-its-easier-than-you-think/</link>
		<comments>http://blog.coryfoy.com/2011/10/switching-financial-institutions-its-easier-than-you-think/#comments</comments>
		<pubDate>Thu, 06 Oct 2011 10:06:10 +0000</pubDate>
		<dc:creator>Cory Foy</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.coryfoy.com/?p=832</guid>
		<description><![CDATA[This is a bit off-topic with my normal content, but there&#8217;s been lots of talk over the past several months about fees and banks and switching away to credit unions or other institutions. As longtime Bank of America account holders, we just recently switched all of our accounts to USAA. It may seem like it&#8217;s [...]]]></description>
			<content:encoded><![CDATA[<p>This is a bit off-topic with my normal content, but there&#8217;s been lots of talk over the past several months about fees and banks and switching away to credit unions or other institutions. As longtime Bank of America account holders, we just recently switched all of our accounts to USAA. It may seem like it&#8217;s going to be a big hassle, but, in fact, it was a fairly straightforward process that I would encourage anyone who is thinking about switching to do.</p>
<p>To give you a sense &#8211; our oldest BoA account was over 20 years old. We had 7 Checking and Savings accounts, plus our mortgage, credit card, business credit card, auto loans, etc. Here were the steps we took:</p>
<ol>
<li><strong>Prepare, prepare, prepare</strong> &#8211; We gathered up a list of everything that would need to change. Almost all of our bills are done through Bill Pay &#8211; not automatic withdrawal &#8211; so we knew we&#8217;d only have one place to go there. We have automatic transfers set up between our accounts, and documented those. We also made sure we had enough lead time to make the switch during a pay cycle, so that my paycheck would go in and we could pay everything from the USAA accounts</li>
<li><strong>Open the new accounts</strong> &#8211; I called USAA and with one phone call was able to set up the initial checking and savings accounts, a joint personal credit card for my wife and I, and a separate credit card for my expenses while on the road. We also transferred our auto insurance from State Farm to USAA, which we did on the same call. All told it took about 20 minutes to get it all set up, and I was very happy with the experience</li>
<li><strong>Switch Direct Deposit</strong> &#8211; USAA has a great &#8220;Switch Kit&#8221; which gives you everything you need to switch direct deposits and any other automatic withdrawals. So I sent everything to our HR administrator who made sure the direct deposit would be changed.</li>
<li><strong>Setup Bill Pay</strong> &#8211; Probably the hardest part, since there isn&#8217;t really an automated way to move over all the payees. We focused on the ones that we pay out of the first paycheck cycle, and then moved over the rest once the first cycle had run.</li>
<li><strong>Transferring Funds</strong> &#8211; What we did here was consolidate all of our BoA accounts into our main savings account, and then did a wire transfer to USAA. We had to pay $15 I believe for the transfer, but it was safe and secure &#8211; and fast. We did leave some money in our BoA accounts for the next section.</li>
<li><strong>Monitoring the old accounts</strong> &#8211; We kept a little bit of money in our old accounts and monitored them closely for any automatic debits. There&#8217;s always something you forget &#8211; iTunes, automatic tolls, etc. As we saw them, we transferred them over. We did the same thing for our bills and watched for any automatic debits (life insurance, etc) and moved those over as well.</li>
<li><strong>Closing out the accounts</strong> &#8211; Once everything had been up and running for about six weeks, we started closing down our old accounts. We started with the BB&#038;T card I was using for my travel expenses, and my BoA Business Card. We had already closed out the savings accounts we had setup for the kids once they were moved over. We ended up leaving our auto loan and our mortgage with BoA, so we&#8217;ll still have accounts with them for a little while yet, but all of our banking is now through USAA!</li>
</ol>
<p>For the pain I thought it was going to be, it was actually a fairly straightforward process. And seeing all the news stories of late around bank fee hikes (<a href="http://money.cnn.com/2011/10/04/pf/citi_fee/index.htm">$20 a month for checking? Really?</a>) I&#8217;m very glad we made the switch.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.coryfoy.com/2011/10/switching-financial-institutions-its-easier-than-you-think/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Recreating Scrum using Kanban and Explicit Policies</title>
		<link>http://blog.coryfoy.com/2011/07/recreating-scrum-using-kanban-and-explicit-policies/</link>
		<comments>http://blog.coryfoy.com/2011/07/recreating-scrum-using-kanban-and-explicit-policies/#comments</comments>
		<pubDate>Mon, 18 Jul 2011 14:30:17 +0000</pubDate>
		<dc:creator>Cory Foy</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.coryfoy.com/?p=819</guid>
		<description><![CDATA[This afternoon I was teaching a public class on Lean-Agile principles and practices, and a question came up about the differences between Scrum and Kanban. As a fun exercise, I recreated Scrum using Kanban coupled with a set of Explicit Policies. To briefly summarize the differences, Scrum is a methodology which consists at its core [...]]]></description>
			<content:encoded><![CDATA[<p>This afternoon I was teaching a public class on Lean-Agile principles and practices, and a question came up about the differences between Scrum and Kanban. As a fun exercise, I recreated Scrum using Kanban coupled with a set of Explicit Policies. </p>
<p>To briefly summarize the differences, Scrum is a methodology which consists at its core a &quot;three of threes&quot; &#8211; three roles (ScrumMaster, Product Owner, and Team), three meetings (Daily Standup, Iteration Planning, Sprint Demonstration), and three artifacts (Product Backlog, Sprint Backlog, and a Burndown Chart). In short, the Product Owner has a prioritized backlog (Product Backlog) of work that she wants done for the product, or for the next release. The team meets with the Product Owner (Iteration Planning) to commit to a subset of that work they&#8217;ll spend the next fixed-length period of time (Sprint) working on. The stories committed to become the Sprint Backlog. In addition, the stories are estimated using Story Points, and the team can not commit to completing more stories than what their Velocity is (the number of Story Points they can complete, on average, during a Sprint). </p>
<p>Kanban, on the other hand, is a continuous flow model. It also starts with a prioritized backlog, but does not define who the owner of that backlog is (though we highly recommend it being a Product Champion, who has the authority to make change in items and priority). The team pulls work from the backlog as they have capacity, working on the story until it is finished. They then pull the next most important story from the backlog, and repeat. </p>
<p>The team in Kanban limits the amount of work they pull in based on <em>Work in Process</em> limits. These are explicit limits, set by the team, of how much work they can have flowing through the system at one time. Forecasting of how much more time is left is done using Average Cycle Time (though there are other ways, as I <a href="http://blog.coryfoy.com/2011/04/story-points-are-dead-long-live-story-points/">wrote about recently</a>). Outside of that, Kanban doesn&#8217;t set how often the owner of the backlog needs to prioritize the work (as long as there is work ready to be pulled when the team needs it) nor does it define when work will be demonstrated for the customer. This doesn&#8217;t mean that it isn&#8217;t important &#8211; in fact, it is critical. However, the way it is done is, again, through Explicit Policies &#8211; the team makes a decision of how often they want to meet with the backlog owner, and how often they want to demonstrate the work completed. They then publicize that decision as a policy.</p>
<p>It&#8217;s through the use of these policies that we can recreate Scrum using only Kanban. The key is defining the right set of explicit policies to make it all work.</p>
<p>&#160;</p>
<h2>Time</h2>
<p>Let&#8217;s start first with the time aspect. We&#8217;ll assume we&#8217;re using two weeks as our sprint length throughout the rest of this article. If our sprint length is indeed two weeks, we are saying, from a Scrum perspective, the following:</p>
<ul>
<li>We have an <i>input cadence</i> of two weeks. This means that every two weeks the Product Owner will have a chance to reprioritize what the team is working on.</li>
<li>We have an <i>output cadence</i> of two weeks. This means that every two weeks, the Product Owner will have a chance to see the work that has been completed</li>
<li>Assuming we are doing retrospectives, we have a <i>retrospective cadence</i> of two weeks, which is how often we&#8217;ll meet to reflect on our work and our process.</li>
</ul>
<p>Each of these items are, in fact, <i>implicit policies</i> we take on by using Scrum and by setting our Sprint length. So, recreating these in Kanban is fairly straightforward:</p>
<ul>
<li>We set an explicit policy that every two weeks we&#8217;ll meet with the backlog owner to update the backlog and make sure we have enough work loaded for the team. This sets our <i>input cadence</i>. Note that the normal policy in Kanban is that if work hasn&#8217;t been started, it can be reprioritized at any time, so what we&#8217;re really setting here is a meeting cadence.</li>
<li>We then set an explicit policy that every two weeks we&#8217;ll meet and demonstrate whatever is in the done column. This is our <i>output cadence</i>.</li>
<li>Finally, we set an explicit policy that we will meet every two weeks to reflect on our work in process, setting our <i>retrospective cadence</i>.</li>
</ul>
<p>Well, that was easy! What&#8217;s next?</p>
<p>&#160;</p>
<h2>Velocity</h2>
<p>One of the key ways we limit work in progress in Scrum is through the use of velocity. Knowing the average number of story points a team can complete in a two week period accomplishes two things:</p>
<ol>
<li>We are able to forecast out how much longer we have before we are finished with what is in the product backlog</li>
<li>We are able to limit how much work we pull in based on what is presumed to be our capacity for work</li>
</ol>
<p>To recreate this in Kanban, we&#8217;ll need to do the following:</p>
<ul>
<li>First, the stories will need to be estimated using Story Points. Pretty straightforward, since that is what Scrum does</li>
<li>We set an explicit policy that every two weeks we will sum the story points in the done column, and call that our velocity</li>
</ul>
<p>So, now we have our velocity, but it isn&#8217;t quite satisfying. After all, part of what we use velocity for in Scrum is to limit the amount of work we have in progress. So what should we do with the number here?</p>
<p>If we go back to the concept of WIP Limits in Kanban, they are usually applied at the column level. Also, WIP limits are traditionally defined as limiting the number of stories that can be in play at one time &#8211; not the <i>size</i> of stories that can be in play. However, there&#8217;s nothing saying we have to stick with that &#8211; after all, these are <i>our</i> policies!</p>
<p>So, we set a WIP limit on the Backlog column of our Kanban board that is equal to the velocity calculation we just used. The WIP limit here would actually be based on Story points, not story counting, so sometimes we might have 3 stories, and sometimes we might have 9 in the column, depending on their size.</p>
<p>At this point, we now have a Kanban board with an input cadence of two weeks, an output cadence of two weeks, a limit on the backlog column based on how many story points were in the done column after two weeks, and a retrospective cadence of two weeks. Pretty close!</p>
<p>At this point in the class, one of my students pointed out that, while we are close to Scrum, we&#8217;re missing the ability that the product owner know that the stories started at the beginning of the two week period are going to be the ones demonstrated at the end. This leads to our third section.</p>
<p>&#160;</p>
<h2>Commitment</h2>
<p>In Scrum the team is <i>committing</i> to the work in the Sprint Backlog. To make sure that goes well, we generally recommend teams don&#8217;t pull in stories above a certain size. For example, teams using a Fibonacci sequence may not commit to stories which are larger than 5 Story Points, because of the uncertainty involved. This is challenging, because we don&#8217;t really have a way of setting explicit policies around <i>commitment models</i>, but perhaps we can do something to improve the odds that a story entering the backlog will be demonstrated in two weeks.</p>
<p>To do that, we can do one of two things (or both):</p>
<ol>
<li>We set an explicit policy that stories entering the board have a Service Level Agreement of being completed in two weeks or less. This may impact the way work is pulled across the board.</li>
<li>We set an explicit policy of entrance criteria which prohibits stories that have an average cycle time greater than some threshold &#8211; say 5-8 days. This can be done by sizing the stories using something like T-Shirt sizes (XS, S, M, L, XL) then calculating the average cycle time for each size. You can <a href="http://blog.coryfoy.com/2011/04/story-points-are-dead-long-live-story-points/">see my post</a> on estimating in Kanban for more information.</li>
</ol>
<p>With those in place, we can&#8217;t guarantee the work will be demonstrated, but we can come close into a high confidence level that the work will be ready by the next demonstration.</p>
<p>&#160;</p>
<h2>Summary</h2>
<p>Now, of course, this is all a bit silly. But, it does raise a very critical point. Explicit Policies in Kanban are the magic sauce to a successful implementation. It&#8217;s also important to note that the policies need to be owned by the team. That way, even if they did set all of the above policies, they had the ability to change the ones that weren&#8217;t working for them.</p>
<p>Both Kanban and Scrum are rather interesting methodologies that can be applied to various teams. But no matter which you choose, the team should own the methodology and the implementation so that they can make it work for them. Every team and every implementation is different. The key is that when your team differs, make it explicit what it is your team does and why &#8211; and reflect regularly on it.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.coryfoy.com/2011/07/recreating-scrum-using-kanban-and-explicit-policies/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Utilization and the Myth of Shared Resources</title>
		<link>http://blog.coryfoy.com/2011/06/utilization-and-the-myth-of-shared-resources/</link>
		<comments>http://blog.coryfoy.com/2011/06/utilization-and-the-myth-of-shared-resources/#comments</comments>
		<pubDate>Wed, 29 Jun 2011 22:39:42 +0000</pubDate>
		<dc:creator>Cory Foy</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.coryfoy.com/?p=810</guid>
		<description><![CDATA[Over the past couple of weeks, I’ve had the chance to work with several organizations who equate “efficiency” with “utilization.” This morning, I tweeted that if your organization is assigning people 10% to a project, no agile method is going to help you. Renée Ramirez asked for data or evidence supporting the point that this [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.coryfoy.com/wp-content/uploads/2011/06/image.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px 5px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top: 0px; border-right: 0px; padding-top: 0px" title="@cory_foy: No agile method will help you if your organization is assigning people 10% to a project" border="0" alt="@cory_foy: No agile method will help you if your organization is assigning people 10% to a project" align="left" src="http://blog.coryfoy.com/wp-content/uploads/2011/06/image_thumb.png" width="278" height="146" /></a>Over the past couple of weeks, I’ve had the chance to work with several organizations who equate “efficiency” with “utilization.” This morning, I <a href="http://twitter.com/cory_foy/status/85872927299485698">tweeted</a> that if your organization is assigning people 10% to a project, no agile method is going to help you. <a href="http://twitter.com/rramirez4444">Renée Ramirez</a> asked for data or evidence supporting the point that this is A Bad Idea ©. </p>
<p>Let’s start with the simple approach. <a href="http://blog.coryfoy.com/wp-content/uploads/2011/06/image1.png"><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="Goodie! A spot for me!" border="0" alt="Picture of a traffic jam, courtesy of http://www.flickr.com/photos/travel_aficionado/2255177001/, Creative Commons License" align="right" src="http://blog.coryfoy.com/wp-content/uploads/2011/06/image_thumb1.png" width="183" height="244" /></a>Take a look at this picture of a traffic jam. How many of us would be excited seeing this, because the red circle indicates a spot just right for our car to fit in? Would we actually go, “Goodie! A spot for me!&quot;? Probably not. Seeing a traffic jam like that would encourage us to sleep in a little longer, or perhaps work from home. Yet, for some reason, we don’t tend to think about our time in the same way. “Oh, Bob is only 80% on Project Zeta, so he can spare some time to help us out on Project Farrrgh Phase 2Ai.”</p>
<p>This thinking is what happens when we focus on utilization as a metric of efficiency, instead of throughput. On a road, throughput would be measured by the amount of cars that can flow through it. It may seem more efficient to jam pack the cars together, but if you actually measured it, you would likely find that by flowing less cars at a time, they can go faster, and more can get through.</p>
<p><a href="http://blog.coryfoy.com/wp-content/uploads/2011/06/image2.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px 5px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top: 0px; border-right: 0px; padding-top: 0px" title="Slack Line" border="0" alt="Slack Line, from http://www.flickr.com/photos/trygveu/2435316455/, Creative Commons Share-Alike License" align="left" src="http://blog.coryfoy.com/wp-content/uploads/2011/06/image_thumb2.png" width="244" height="165" /></a>On software teams, this measure of throughput is often considered the teams velocity, or capacity. And when we fill it completely up, we leave no room for slack in the process. In the great book <a href="http://www.amazon.com/Slack-Getting-Burnout-Busywork-Efficiency/dp/0767907698">Slack: Getting Past Burnout, Busywork, and the Myth of Total Efficiency</a>, Tom DeMarco states, “Extreme busyness is injurious to the real work of the organization.” He goes on further to state that we can only achieve 100% utilization by allowing buffers to build up at each stage in the cycle, which actually <em>increases</em> the amount of time for work to flow. In other words, to keep people maximally busy, value-added work has to be sitting there &#8211; waiting for them &#8211; when they finish whatever they are currently working on. Work that is just sitting is <em>delayed</em>. Delays lead to <em>inventory</em> as work just sits, not being used. Inventory and delays, in Lean Thinking, are considered <em>waste</em>. Why would we introduce waste into a process we are <em>trying to improve</em>?</p>
<p>But, let’s look at this from another angle, through the lens of “Shared Resources”. Let’s go back to poor Bob from earlier. Only now, it’s worse. Two new projects have come on the horizon that need his expertise, and they were more important than Project Zeta. So, now Bob’s utilization schedule looks like:</p>
<ul>
<li>Project Zeta: 15%</li>
<li>Project Farrrgh Phase 2Ai: 20%</li>
<li>Project TTime: 25%</li>
<li>Project ICWUD: 40%</li>
</ul>
<p>If we actually map this to Bob’s time for the week, it would look like:</p>
<ul>
<li>Project Zeta: 6 hours</li>
<li>Project Farrrgh Phase 2Ai: 8 hours </li>
<li>Project TTime: 10 hours</li>
<li>Project ICWUD: 16 hours</li>
</ul>
<p>But this doesn’t tell the whole story. In our own workings with organizations doing value-stream mappings, we find that most people are lucky to get 6 hours of value-add work in an 8-hour day. Meetings, coffee, phone calls, bathroom breaks, etc. all work together to eat our time up. So poor Bob is actually further behind with a map of time like this:</p>
<ul>
<li>Project Zeta: 4.5 hours</li>
<li>Project Farrrgh Phase 2Ai: 6 hours </li>
<li>Project TTime: 7.5 hours</li>
<li>Project ICWUD: 12 hours</li>
</ul>
<p>This <em>might</em> work if Bob could do this sequentially. So, on Monday, he would work on Project Zeta for 4.5 hours, then spend 1.5 hours on Project Farrrgh. On Tuesday, he would spend 4.5 hours on Project Farrrgh, and 1.5 on Project TTime. On Wednesday he would spend 6 hours on Project TTime, leaving Thursday and Friday for Project ICWUD. But, if we look at Bob’s calendar for <em>just Monday</em>, it actually looks like this:</p>
<table border="0" cellspacing="0" cellpadding="2" width="324">
<tbody>
<tr>
<td valign="top" width="322">Monday</td>
</tr>
<tr>
<td valign="top" width="322">8-9: Zeta Call         <br />9-11: TTime Update          <br />11-12: ICWUD Code Review          <br />1-3: ICWUD Analysis Session          <br />3:30-5: Farrrgh Code Review</td>
</tr>
</tbody>
</table>
<p>Anyone who has had a meeting schedule like this can attest that during the in between times – as you are getting ready to leave, and right after you’ve arrived – you are in a transition state. We call this “context switching” – and it costs you. Gerry Weinberg posits that this cost <a href="http://drdobbs.com/architecture-and-design/184415019">could be as high as 40%</a>. But, let’s imagine that it is 15 minutes on either end to context switch into and out of the projects. So, the schedule really looks like:</p>
<ul>
<li>8-8:15 Context Switch</li>
<li>8:15-8:45 Zeta Call</li>
<li>8:45-9:00 Context Switch</li>
<li>9:00-9:15 Context Switch</li>
<li>9:15-10:45 TTime Update</li>
<li>10:45-11:00 Context Switch</li>
<li>11:00-11:15 Context Switch</li>
<li>11:15-11:45 ICWUD Code Review</li>
<li>11:45-12:00 Context Switch</li>
<li>1:00-1:15 Context Switch</li>
<li>1:15-2:45 ICWUD Analysis Session</li>
<li>2:45-3:00 Context Switch</li>
<li>3:30-3:45 Context Switch</li>
<li>3:45-5:00 Farrrgh Code Review</li>
</ul>
<p>So, in his day, Bob spent over 2 hours context switching. This can be much worse when you deal with conference calls, videoconferences, powerpoints, rooms that aren’t set up, etc. </p>
<p>Now, let’s equate that to dollars. Assume that Bob’s schedule is similar throughout the week, causing 10 hours of context switching a week. And across all 4 projects, we have a similar ratio, meaning that everyone is assigned to multiple projects. So if we had 30 team members total, each losing 10 hours a week to context switching, then it gets expensive very quickly.</p>
<p><a href="http://blog.coryfoy.com/wp-content/uploads/2011/06/image3.png"><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="Storm Troopers dancing with paychecks" border="0" alt="This is no time for celebration! From http://www.flickr.com/photos/jdhancock/3583835507/ under Creative Commons license" align="right" src="http://blog.coryfoy.com/wp-content/uploads/2011/06/image_thumb3.png" width="286" height="214" /></a>How expensive? Let’s assume an average salary of $60,000. We then add 25% for operating costs – benefits, taxes, etc., giving us a total of $75,000. Dividing that by the approximate number of working hours in a year – 2000 – gives us a cost of $37.50 per hour. 30 team members * 10 hours context switching * $37.50 per hour = $11,250 <strong><em>per week</em></strong> we lose to context switching, or close to $600,000 per year.</p>
<p>Unfortunately, for a vast majority of companies, the hidden costs of delays, waste, inventory and other problems stay hidden behind a veil of utilization measurements, individual reward structures, and a culture that lacks a continuous improvement mindset. </p>
<p>So next time you feel yourself being drug into a traffic jam, take a look at how long it really takes you to get settled, and think about how much value add work you are really getting in. You might just find that the cost of “Shared Resources” is what is creating the vicious cycle that makes you think it is your saving grace.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.coryfoy.com/2011/06/utilization-and-the-myth-of-shared-resources/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Book Review: The Clean Coder by Uncle Bob Martin</title>
		<link>http://blog.coryfoy.com/2011/06/book-review-the-clean-coder-by-uncle-bob-martin/</link>
		<comments>http://blog.coryfoy.com/2011/06/book-review-the-clean-coder-by-uncle-bob-martin/#comments</comments>
		<pubDate>Sat, 11 Jun 2011 02:17:56 +0000</pubDate>
		<dc:creator>Cory Foy</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Book Review]]></category>

		<guid isPermaLink="false">http://blog.coryfoy.com/?p=803</guid>
		<description><![CDATA[As someone who has been closely involved in both the &#8220;agile software&#8221; movement as well as the &#8220;Software Craftsmanship&#8221; movement, I have been following the work of Robert Martin for some time. So I was quite interested when I got my copy of his latest book &#8220;Clean Coder&#8221; where he &#8220;introduces the disciplines, techniques, tools [...]]]></description>
			<content:encoded><![CDATA[<p>As someone who has been closely involved in both the &#8220;agile software&#8221; movement as well as the &#8220;Software Craftsmanship&#8221; movement, I have been following the work of Robert Martin for some time. So I was quite interested when I got my copy of his latest book &#8220;Clean Coder&#8221; where he &#8220;introduces the disciplines, techniques, tools and practices of true software craftsmanship&#8221;. Would his book live up to being a guide for the next generation of developers, or would it go on my shelf as another interesting book that I had read, once?</p>
<p>Before even getting into the book, it is good to know the style of Robert Martin, affectionately known as &#8220;Uncle Bob&#8221; to many people. Bob is a former preacher who comes at life &#8211; and topics he teaches &#8211; with a no-holds-bar approach. So when he approaches topics such as &#8220;Professionalism&#8221; and the software industry, I come expecting passionate discussion and serious assertions. The Clean Coder is no exception.</p>
<p>The book starts off with an overview of the <a href="http://en.wikipedia.org/wiki/Space_Shuttle_Challenger">Challenger</a> space shuttle disaster. As a native Floridian who could see shuttle launches from my house (and, in fact, saw the Challenger explode just as it crested the trees from where we lived) this really resonated with me. The accident was a result of engineers saying no, but management overriding the decision. With this introduction, Bob makes it quite clear that when we choose not to stand up for that which we believe, it can have dire consequences. </p>
<p>We then dive right in, starting with the topic of Professionalism. The assertion is made that the key to professionalism is responsibility &#8211; &#8220;You can’t take pride and honor is something you can’t be held accountable for&#8221;. But how do we take and achieve responsibility? Chapter one lays out two ways. To start, it looks at the Hippocratic Oath, specifically the rule of &#8220;First, Do No Harm&#8221;. The book maps this to software by saying to do no harm to function or structure, ensure that QA doesn’t find anything, know that your software works, and have automated QA. In fact, when I work with teams, I teach them that if your testing &#8220;phase&#8221; finds bugs, it’s a problem with your process that needs to be addressed immediately, so the concept of ensuing that QA doesn’t find anything is a great concept to bring out.</p>
<p>Then we move on to Work Ethic &#8211; specifically around knowing your field. This means continuous learning, practice (through things like <a href="http://en.wikipedia.org/wiki/Kata_%28programming%29">Katas</a> and <a href="http://codingdojo.org/">Dojos</a>), collaboration, mentoring, identifying with your employer/customer, and practicing humility. To help with that, Chapters 2 and 3 talk specifically about saying &#8220;No&#8221; and &#8220;Yes&#8221;. When we say no, and when we want to say no, we should mean it. Saying, &#8220;We’ll try&#8221; means that you, or your team, isn’t already giving it their best, and that through some extraordinary effort you’ll pull it off. Say no and stick to it. But, when you say Yes, mean it. People are counting on you to be truthful with them.</p>
<p>Chapters 4, 5, and 6 begin to talk about the specific practices of coding. Chapter 4 talks about the coding process itself. One of the hardest statements the book makes here is to stay out of &#8220;the zone&#8221; when coding. Bob asserts that you lose parts of the big picture when you go down to that level. While I may struggle with that assertion, I do agree with his next statement that debugging time is expensive, so you should avoid having to do debugger-driven development whenever possible. He finishes the chapter with examples of pacing yourself (walking away, taking a shower) and how to deal with being late on your projects (remembering that hope is not a plan, and being clear about the impact of overtime) along with a reminder that it is good to both give and receive help, whether it be small questions or mentoring others.</p>
<p>Chapters 5 and 6 cover Test-Driven Development and Practicing. The long and short is that TDD is becoming a wide-spread adopted practice, in that you don’t get as many funny looks from people when you mention TDD as you once did. And that coding at work doesn’t equal practicing your tools and techniques &#8211; instead you should set aside specific time to become better through coding exercises, reading and researching other areas (languages, tools, approaches), and attending events and conferences.</p>
<p>Chapters 7 and 8 cover testing practices. In Chapter 7 the book looks at Acceptance Tests and the cycle of writing them &#8211; specifically at what point the customer is involved (hint: continuously) and how to ensure they stay involved. Chapter 8 goes to more of the unit testing level, and defines some strategies and models for looking at unit testing, including an interesting &#8220;Test Automation Pyramid&#8221;</p>
<p>Now that we’ve covered the developer herself, coding and testing, the book moves on to discussing time. Chapter 9 covers Time Management strategies &#8211; staying out of &#8220;bogs&#8221; and &#8220;blind alleys&#8221;, using techniques like the &#8220;Pomodoro&#8221; technique to create focus, and the law of two-feet &#8211; if you are in a meeting and aren’t getting value out of it, you should feel free to (respectfully) leave, or otherwise modify the meeting to get value from it. </p>
<p>Chapter 10 covers several different methods of estimation. In the teams I work with, estimation is perhaps one of the hardest things &#8211; not because estimating can be hard (which it can be) but because either they are held so tightly to the estimates that they are afraid to make them, or, worse, they are told what the estimates are going to be. The book really only skims the surface here, covering several techniques from Planning Poker, to PERT, to &#8220;Flying Fingers&#8221;, but gives a decent overview of how to do those techniques.</p>
<p>Rounding out the discussions of time comes Chapter 11 and talking about Pressure. The key of this chapter is that because you have committed to your principles, practices and disciplines, you should be able to stay calm under pressure. I can certainly say from experience that the worst experiences in my career are when people weren’t able to stay calm, and the way the book is laid out, if you are following the practices outlines so far, you should be able to be the voice of reason and calmness.</p>
<p>The last three chapters cover teams and collaboration. Chapter 12 talks about important practices such as shared code ownership, pairing, and respect for other team members.  Chapter 13 covers teams and the importance of having teams that gel together. The book finishes with Chapter 14 and discussions of the importance of apprenticeship, mentorship and craftsmanship.</p>
<p>As I mentioned earlier, I’ve been involved in the &#8220;agile&#8221; movement for quite some time, and have spoken with Bob on many occasions, so many of the practices in the book weren’t new. I did quite appreciate the stories he had to tell about his experiences. However, I think that some people may be turned off by the hard line around &#8220;professionalism&#8221;. Sometimes you do need to say no, and I think it is good to have encouragement from a book to do that. But sometimes things are more complex, and I think that you would have a harder time looking to this particular book for help with the edge cases.</p>
<p>In conclusion, I think this is a book which provides worthwhile information and an interesting look at how people are looking at software development as a profession. If you read between some of the hard lines made, there are some great nuggets to be gleaned from the book for software developers of any level.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.coryfoy.com/2011/06/book-review-the-clean-coder-by-uncle-bob-martin/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Story Points Are Dead! (Long Live Story Points?)</title>
		<link>http://blog.coryfoy.com/2011/04/story-points-are-dead-long-live-story-points/</link>
		<comments>http://blog.coryfoy.com/2011/04/story-points-are-dead-long-live-story-points/#comments</comments>
		<pubDate>Mon, 18 Apr 2011 04:12:56 +0000</pubDate>
		<dc:creator>Cory Foy</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.coryfoy.com/?p=788</guid>
		<description><![CDATA[(Alternate Subtitle: How the heck do you do estimation and forecasting in Kanban?) One of the biggest changes for many team who are adopting agile is in the way they slice, track and measure their work. They learn about “User Stories” which are sized using “Story Points”. The team adds up the number of Story [...]]]></description>
			<content:encoded><![CDATA[<p>(Alternate Subtitle: How the heck do you do estimation and forecasting in Kanban?)</p>
<p>One of the biggest changes for many team who are adopting agile is in the way they slice, track and measure their work. They learn about “<a href="http://www.mountaingoatsoftware.com/topics/user-stories">User Stories</a>” which are sized using “Story Points”. The team adds up the number of Story Points in a given “Sprint” which gives them their “Velocity”. I don’t put the words in quotes to belittle them, but to point out the official terms.</p>
<p>In fact, there are some very good elements to this. The story format can be quite helpful for focusing teams on what it is they are trying to deliver. Further, the idea of breaking down the work into small, incremental chunks is fantastic. And story points have a great attribute about them – they are <em>relative</em>. You aren’t trying to measure the exact amount, but rather a relative estimation (“This story is twice as hard as this other one, so we’ll call this a 4 and that one a 2”). </p>
<p>But the one drawback comes when you begin interacting with other teams, or looking at different methodologies. Specifically:</p>
<ul>
<li>How do you deal with teams with different sprint lengths?</li>
<li>How do you know teams are estimating the same way?</li>
<li>Can you ever really trust velocity numbers across teams?</li>
<li>How do you forecast estimates across teams?</li>
<li>What happens when you remove the timebox of the sprint completely?</li>
<li>How do you “credit” stories which aren’t completed during the Sprint?</li>
</ul>
<p>In fact, there are <a href="http://www.infoq.com/news/2010/02/comparing-velocity-across-teams">several</a> solutions to the above problem. For example, you can have an <a href="http://blog.mountaingoatsoftware.com/establishing-a-common-baseline-for-story-points">estimation session</a> where members from each team estimate a set of items, and the teams use that as the baselines. You can do other mathematical tricks to make it work, too. So it is possible.</p>
<p>But what if you didn’t have to do that? What if there was a way to get a more quantifiable estimate <em>without</em> resorting to detailed hour estimates, <em>without</em> removing the relative estimation and whose accuracy and confidence levels could be proven?</p>
<p>To understand, let’s take a look at a scenario that I see played out quite often. We have a user story which a team has committed to, say to change a user entry screen. The team “completes” the user story. In fact, all of the teams complete their user stories. But yet, the application still isn’t shipping, there are lots of delays, and it isn’t clear why.</p>
<p>Well, at least at the surface it isn’t clear why. If you step back, you discover that after the team is finished, it goes into User Acceptance Testing, and then packaging, and then deployment. In other words, the User Story isn’t actually done – even though the team said it was. This may not seem like a huge deal, but let’s look at the consequences:</p>
<ol>
<li>The team isn’t honoring their commitment to their process</li>
<li>Forecasting based on the velocity is useless, since there is additional work happening behind the scenes not being accounted for</li>
<li>The team grows frustrated because they know the velocity number isn’t reality</li>
</ol>
<p>Note that none of the above is the fault of the methodology itself. The team isn’t adhering to it, and from that are causing potentially very large problems. So, if this <em>is</em> our reality, and it <em>isn’t</em> possible to shrink the UAT/Packaging/Deploy to the size of the sprint, what should the team do? And since these are variable length stories, how can we accurately forecast and estimate?</p>
<p>Luckily we actually have a very simple method which combines relative estimation, Cycle Time and Classes of Service. Let’s tackle the first two first. Going back to our story above, the team pulls a story to change the screen. In Scrum, they would discuss the story with the customer, break it down into tasks, and estimate it using Story Points. Instead of doing story points, let’s imagine they used T-Shirt sizes – Extra Small, Small, Medium, Large, Extra Large. So far it isn’t that much different – I generally advised teams that anything larger than an 8 shouldn’t go in a sprint. </p>
<p>But here’s where it gets different, Rather than add up the story points completed during the sprint, they measure the <em>cycle time</em> of the stories. The Cycle Time is the amount of time that it takes for a story to go from initially being worked on through shipped. It includes any loopbacks or rework. Now, let’s imagine we charted the T-Shirt Size and Cycle Time for each of our user stories. We might get a chart that looks like this:</p>
<table border="1" cellspacing="0" cellpadding="2" width="400">
<tbody>
<tr>
<td valign="top" width="199">T-Shirt Size</td>
<td valign="top" width="199">Cycle Time</td>
</tr>
<tr>
<td valign="top" width="199">S</td>
<td valign="top" width="199">4 days</td>
</tr>
<tr>
<td valign="top" width="199">S</td>
<td valign="top" width="199">5 days</td>
</tr>
<tr>
<td valign="top" width="199">M</td>
<td valign="top" width="199">13 days</td>
</tr>
<tr>
<td valign="top" width="199">S</td>
<td valign="top" width="199">3 days</td>
</tr>
<tr>
<td valign="top" width="199">M</td>
<td valign="top" width="199">16 days</td>
</tr>
<tr>
<td valign="top" width="199">L</td>
<td valign="top" width="199">26 days</td>
</tr>
<tr>
<td valign="top" width="199">M</td>
<td valign="top" width="199">15 days</td>
</tr>
<tr>
<td valign="top" width="199">L</td>
<td valign="top" width="199">31 days</td>
</tr>
<tr>
<td valign="top" width="199">S</td>
<td valign="top" width="199">5 days</td>
</tr>
<tr>
<td valign="top" width="199">L</td>
<td valign="top" width="200">23 days</td>
</tr>
</tbody>
</table>
<p>You can see a couple of things. First, we can quickly calculate the <em>Average Cycle Time</em> for a given size story:</p>
<ul>
<li>Small &#8211; ~4 days</li>
<li>Medium &#8211; ~15 days</li>
<li>Large &#8211; ~27 days</li>
</ul>
<p>But, more importantly, we know the <em>confidence</em> in those estimates. For Small stories, we know that the minimum is 3 days, and the max is 5 days, with a standard deviation of only about 1 day. But for Large stories, the minimum is 23 days, and the maximum is 31 days, giving us a standard deviation of just over 4 days. So the risk is higher that we won’t meet the Average Cycle Time. </p>
<p>So now that we have our Average Cycle Time, we can use that for forecasting. If a certain feature consists of 5 medium stories, 3 large stories, and 10 small stories, we can estimate out approximately how long it will take us – (5*15) + (3*27) + (10*4) = 196 days. But in reality, it could take us as long as (5*16) + (3*31) + (10*5) = 223 days if every story took the maximum amount of time.</p>
<p>What’s nice about this way of looking at forecasting and estimating is that the calculations are based on the actual time it takes the teams to do the work. And it is easy to calculate across teams, since you can take into account variances and differences as part of the calculations.</p>
<p>If you remember earlier, I mentioned there was one more element to Average Cycle Time for forecasting – Classes of Service. Jeff Anderson has a <a href="http://agileconsulting.blogspot.com/2010/07/using-class-of-service-concept.html">good blog post</a> on the concept, but in a nutshell, classes of service are a recognition that all work is not the same, and should likely not be treated the same. </p>
<p>What this means for us is that we can extend out our Average Cycle Time estimation to include Classes of Service. Let’s say that we’ve defined three classes of service: Normal work, Bug Fixes and Critical Fixes. By simply having those marked on our board, we can track the Average Cycle Time for each category of work. In fact, I use this with teams to help them understand how to get a better handle when some work requires the assistance of a certain part of the organization, and when other work requires a different part.</p>
<p>Let’s imagine that we have a separate department which houses the Database Administrators. When we make a change that requires a database change, it has to be handed off to them. That’s a type of work which has a different workflow, and different policy requirements – meaning a good candidate to be labeled as a different class of service. Now our table might look like:</p>
<table border="1" cellspacing="0" cellpadding="2" width="400">
<tbody>
<tr>
<td valign="top" width="133">&nbsp;</td>
<td valign="top" width="132">Normal Work</td>
<td valign="top" width="133">Database Work</td>
</tr>
<tr>
<td valign="top" width="133">Small</td>
<td valign="top" width="132">4 days</td>
<td valign="top" width="133">5 days</td>
</tr>
<tr>
<td valign="top" width="133">Medium</td>
<td valign="top" width="132">15 days</td>
<td valign="top" width="133">18 days</td>
</tr>
<tr>
<td valign="top" width="133">Large</td>
<td valign="top" width="132">27 days</td>
<td valign="top" width="134">34 days</td>
</tr>
</tbody>
</table>
<p>Should you actually break your work and forecasting down to this level? Not necessarily. After all, if you have flexible dates, or can cut scope to account for work changes, then going through all of the work to understand the averages, deviations and probabilities may not be worth it. But if you have a high need for better estimates, then using Average Cycle Time may give you what you are looking for.</p>
<p>One final note – even if you are using Scrum, I still highly recommend tracking the Average Cycle Time of the stories. You don’t have to throw out your Story Points, but you might find that you look better wearing a T-Shirt instead.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.coryfoy.com/2011/04/story-points-are-dead-long-live-story-points/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Breaking Down Features to User Stories</title>
		<link>http://blog.coryfoy.com/2011/03/breaking-down-features-to-user-stories/</link>
		<comments>http://blog.coryfoy.com/2011/03/breaking-down-features-to-user-stories/#comments</comments>
		<pubDate>Wed, 16 Mar 2011 00:24:17 +0000</pubDate>
		<dc:creator>Cory Foy</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.coryfoy.com/?p=783</guid>
		<description><![CDATA[In my recent post on root cause analysis and the 5-Why&#8217;s Lisa Crispin wondered if they could be used in breaking down user stories, too: Are the 5 whys only for root cause analysis? Can they be used to find out the purpose of a new user story or theme? There are many ways to [...]]]></description>
			<content:encoded><![CDATA[<p>In my recent <a href="http://blog.coryfoy.com/2011/03/root-cause-and-5-whys">post </a> on root cause analysis and the 5-Why&#8217;s <a href="http://www.lisacrispin.com">Lisa Crispin</a> wondered if they could be used in breaking down <a href="http://blog.coryfoy.com/2011/03/root-cause-and-5-whys/comment-page-1/#comment-1225">user stories, too</a>:</p>
<blockquote><p>Are the 5 whys only for root cause analysis? Can they be used to find out the purpose of a new user story or theme?</p></blockquote>
<p>There are many ways to break down user stories to discover their purpose. Three of the most useful are 5 Why&#8217;s, Given-When-Then, and Use Case Scenarios.</p>
<p>Let&#8217;s imagine we&#8217;ve gotten the following feature request from our business customer:</p>
<blockquote><p>We need the system to handle multiple allocation requests</p></blockquote>
<p><em>(Note: This is a scenario from a customer I was talking to this morning. They had a little more detail, but we&#8217;ll pretend we just have the barebones)</em></p>
<p>Let&#8217;s take a look at what happens to this feature using each of the methods.</p>
<h2>5 Why&#8217;s</h2>
<p>In the 5 Why&#8217;s scenario, we start asking why the customer needs this. It may not drive us to user stories at the end, but we will have a better understanding of what is going on, and we may find user stories along the way. Let&#8217;s watch.</p>
<blockquote><p>Developer: Why do we need the system to handle multiple allocation requests?<br />
Customer: Because some orders will need to be split up.<br />
Developer: And why do they need to be split up?<br />
Customer: Because not everything will fit onto one pallet.<br />
Developer: Why won&#8217;t it all fit? <br />
Customer: Because we can only put so many of an item onto a single pallet. There&#8217;s just only so much room available to stack stuff safely.<br />
Developer: So why does that affect the system?<br />
Customer: Because we don&#8217;t want customers to have to think about pallet splitting. We just want them to be able to place the order, and the system figure out how many pallets it needs to go onto.</p></blockquote>
<p>We can see from that exchange that we learned a lot more about the system than we initially had:</p>
<ul>
<li>Pallets have an upper bound of how many items can fit onto it
<li>
<li>The system should know how much of an item a pallet can hold</li>
<li>Customers will order more than one pallet&#8217;s worth of stuff in a single order
<ul>
<li>We&#8217;ll have to ship multiple pallets</li>
<li>We&#8217;ll have to track multiple pallets</li>
<li>We may have to handle returning multiple pallets of items</li>
</ul>
</li>
<li>Multiple pallets should still be considered a single order</li>
<li>It isn&#8217;t clear if we can mix different items from the same order onto a pallet</li>
</ul>
<p>We can then begin to turn these insights into user stories which capture what we need. But what if we tried just going straight into understanding what we would need from the system to make it work?</p>
<h2>Given &#8211; When &#8211; Then</h2>
<p>If you&#8217;ve seen the wonderful Ruby tool <a href="http://cukes.info/">Cucumber</a> then you are familiar with the syntax of Given-When-Then. It basically says that Given some preconditions, When an action happens in the system, Then post conditions should be met. We can apply that to our original feature and see what happens.</p>
<blockquote><p>Developer: Ok, so you&#8217;ve said that the system should handle multiple allocations. At what point should it be able to handle those?<br />
Customer: Well, when the customer places the order <br />
Developer: Ok, so When the customer places an order…what should happen?<br />
Customer: Well, it&#8217;s not just any order. When a customer places an order that doesn&#8217;t fit on a single pallet. <br />
Developer: Ok, so Given we know how much can fit on a pallet, and Given that the customer has placed an order which is larger than a single pallet can handle, When they place an order, what should happen? <br />
Customer: Well, the order should be split up among multiple pallets<br />
Developer: Ok, and should those be treated as the same order, or should they be shipped as separate ones? <br />
Customer: No, no, they need to all go out and be tracked as one order</p></blockquote>
<p>So from this conversation we might be able to create a scenario like the following:</p>
<blockquote><p><strong>Given</strong> a pallet can hold 15 items<br />
<strong>When</strong> a customer places an order for 45 items<br />
<strong>Then</strong> the items should be split among three pallets<br />
<strong>And</strong> all the pallets should have the same order number</p></blockquote>
<p>We can then continue to create scenarios around the various things that will come up about the system. What about orders with different item types? What about orders which don&#8217;t fill up a pallet fully? What about returns? We can use the Given-When-Then syntax to come up with each of those.</p>
<h2>Use Case Scenarios</h2>
<p>When you start running into complex scenarios, a cautiously handy tool can be <a href="http://en.wikipedia.org/wiki/Use_case">Use Cases</a>. I say &#8220;cautiously handy&#8221; because Use Cases can tend to focus our thoughts away from communication and closer to the realm of documentation focus. We should always be thinking about the &#8220;Working Software over Comprehensive Documentation&#8221; line from the <a href="http://www.agilemanifesto.org">Agile Manifesto</a> and use that to guide us on what our focus should be (and see Alistair Cockburn&#8217;s article <a href="http://alistair.cockburn.us/Use+cases%2c+ten+years+later">Use cases, ten years later</a>).</p>
<p>At their core, Use Cases define several flows, similar to what we saw in the Given-When-Then syntax.  There is the normal flow, which is the &#8220;happy path&#8221; through the system. There are alternate flows which are different paths the user can take. And then there are exceptional paths, which define what happens when a user runs into a problem (for a more in-depth look, see Alistair&#8217;s <a href="http://alistair.cockburn.us/Basic+use+case+template">Basic user case template</a>).</p>
<p>Let&#8217;s go back to our developer and customer to see what happens:</p>
<blockquote><p>Developer: Ok, explain to me how the user would see multiple allocation working<br />
Customer: Well, they would start by placing an order on the entry screen which includes a quantity greater than a single pallet can hold. When they placed the order, the system would split the order up into sub-orders or something and put the correct number of items onto the multiple pallets necessary. The customer would only see one shipment with multiple pallets. <br />
Developer: What if the order contained different types of items? (<em>Alternate Case</em>)<br />
Customer: The system should pack the items in such a way that we use the minimum number of pallets. <br />
Developer: So different types of items can be on the same pallet? <br />
Customer: Sometimes, yes. Other times they should be on different pallets. We have an identification for each type of item which must be packed separately<br />
Developer: So what should happen if the customer puts incompatible types into the same order? (<em>Exceptional Flow</em>)<br />
Customer: Nothing, I suppose. They&#8217;ll just have more pallets. Well, actually, I think that we should notify them of the number of pallets it will take to process their order <br />
Developer: Do they have the ability to cancel the order at that point? (<em>Alternate Flow</em>)<br />
Customer: No, no. It&#8217;s informational only. Obviously it&#8217;s better for us if we minimize the number of pallets we have to use, but no one is going to <em>not</em> order because they have to be put on different pallets</p></blockquote>
<p>When we work with teams who use the Use Case format, I explain that a Use Case is <em>not</em> a User Story. Instead, we take the different flows through the Use Case and generate stories from it. It actually works out quite well, since the Use Case document tends to capture a higher level vision of what is going on, and then we drive out that implementation using User Stories. At a minimum, the normal flow, the alternate flows and the exceptional flows will all have their own User Stories. </p>
<p>I hope that helps show some different ways you can approach the problem of breaking down user stories. Remember, the goal is <em>not</em> about following a process, but ensuring that you are focusing on how whatever it is you are doing is helping you communicate more effectively with your customers or business owners &#8211; and ultimately helping you build your software faster and better.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.coryfoy.com/2011/03/breaking-down-features-to-user-stories/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

