<?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-4441160589671124737</id><updated>2011-11-27T16:47:28.540-08:00</updated><category term='rest'/><category term='&quot;strangler pattern&quot;'/><category term='Business Value'/><category term='Architecture'/><category term='agile'/><category term='CQRS'/><category term='planning'/><category term='restful services'/><category term='discipline'/><category term='d=vt'/><category term='.net'/><category term='bookreview'/><category term='DDD'/><category term='URI'/><category term='newslinks'/><category term='velocity'/><category term='http'/><category term='leadership'/><category term='estimation'/><title type='text'>Agile From The Ground Up</title><subtitle type='html'>Helping your team go from fragile to agile.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://agilefromthegroundup.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4441160589671124737/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://agilefromthegroundup.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Josh Gough</name><uri>http://www.blogger.com/profile/13302284610870926934</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>20</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4441160589671124737.post-4840744337379211415</id><published>2011-06-27T19:52:00.001-07:00</published><updated>2011-06-27T19:52:20.154-07:00</updated><title type='text'>Microsoft Moles!</title><content type='html'>This is a very cool project from Microsoft Research:&lt;br&gt;&lt;br&gt;&lt;a href="http://research.microsoft.com/en-us/projects/moles/"&gt;http://research.microsoft.com/en-us/projects/moles/&lt;/a&gt;&lt;br&gt;&lt;br&gt;I&amp;#39;m able to use this to &amp;quot;fake&amp;quot; or &amp;quot;mock&amp;quot; sealed classes inside of the &lt;a href="http://ASP.NET"&gt;ASP.NET&lt;/a&gt; runtime.&lt;br&gt; &lt;br&gt;For example:&lt;br&gt;&lt;br&gt;        [TestMethod]&lt;br&gt;        [HostType(&amp;quot;Moles&amp;quot;)]&lt;br&gt;        public void WhenCannotInterpretSdnUserKeyAsIntegerThenMustRedirectToGlobalErrorPageWithProperMessage()&lt;br&gt;        {&lt;br&gt;            // Arrange&lt;br&gt;             var cookies = new HttpCookieCollection { new HttpCookie(SdnUserKeyCookieName, &amp;quot;Gibberish&amp;quot;) };&lt;br&gt;            var context = new MHttpContext();&lt;br&gt;            var request = new MHttpRequest();&lt;br&gt;            var response = new MHttpResponse();&lt;br&gt;             var redirectWasCalled = false;&lt;br&gt;            var redirectedToLocation = string.Empty;&lt;br&gt;            var responseEnded = false;&lt;br&gt;            response.RedirectStringBoolean = (string location, bool endResponse) =&amp;gt;&lt;br&gt;             {&lt;br&gt;                redirectWasCalled = true;&lt;br&gt;                redirectedToLocation = location;&lt;br&gt;                responseEnded = endResponse;&lt;br&gt;            };&lt;br&gt;            MHttpContext.CurrentGet = () =&amp;gt; context;&lt;br&gt;             context.RequestGet = () =&amp;gt; request;&lt;br&gt;            context.ResponseGet = () =&amp;gt; response;&lt;br&gt;            request.CookiesGet = () =&amp;gt; cookies;&lt;br&gt;&lt;br&gt;            // Act&lt;br&gt;            _sdnAuthenticator.Process(context);&lt;br&gt; &lt;br&gt;            // Assert&lt;br&gt;            Assert.IsTrue(redirectWasCalled);&lt;br&gt;            Assert.AreEqual(&amp;quot;/Error.aspx&amp;quot;, redirectedToLocation, true);&lt;br&gt;            Assert.IsTrue(responseEnded);&lt;br&gt;        }&lt;br&gt; &lt;br&gt;How cool is that? The moles are implemented as &amp;quot;detours&amp;quot; and replace components of the runtime when configured to do so.&lt;br&gt;&lt;br&gt;This is great stuff.&lt;br&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4441160589671124737-4840744337379211415?l=agilefromthegroundup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilefromthegroundup.blogspot.com/feeds/4840744337379211415/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilefromthegroundup.blogspot.com/2011/06/microsoft-moles.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4441160589671124737/posts/default/4840744337379211415'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4441160589671124737/posts/default/4840744337379211415'/><link rel='alternate' type='text/html' href='http://agilefromthegroundup.blogspot.com/2011/06/microsoft-moles.html' title='Microsoft Moles!'/><author><name>Josh Gough</name><uri>http://www.blogger.com/profile/13302284610870926934</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4441160589671124737.post-8505602385881919871</id><published>2011-06-23T07:27:00.001-07:00</published><updated>2011-06-23T07:27:21.485-07:00</updated><title type='text'>From 15 Minute Stand Ups to Standing Work Stations : How to Start a Trend</title><content type='html'>As many people involved with the various agile development practices know, one of the common practices is a brief &amp;quot;Daily Stand Up&amp;quot; meeting to discuss project progress, priority changes, and impediments.&lt;br&gt;&lt;br&gt;When I joined my most recent team, the Epi-X program at CDC, I wanted to try a different kind of Stand Up. This time, I raised my monitors and my keyboard and I began standing for a large portion of the day to do my work. I don&amp;#39;t claim any medical expertise, despite working at CDC, so don&amp;#39;t take my counsel on this as anything scientific.&lt;br&gt; &lt;br&gt;All I can say is that there have been some studies written about in popular articles that seem to indicate constant sitting is detrimental to long-term health, including increased risks of obesity and heart disease. I should also say other studies say there are health risks with constant standing as well!&lt;br&gt; &lt;br&gt;So, for me, it is not that I stand at my workstation all day long. I am in various sit-down meetings and discussions, and have to walk to different areas to speak with people. And, I do lower my monitor and sit from time to time as well.&lt;br&gt; &lt;br&gt;I&amp;#39;ll continue this post later, but in the past week two people in my office have followed suit! So far, we just use boxes to prop up our equipment, but I&amp;#39;m strongly considering investing in a genuine table-top adjustable desk from &lt;a href="http://www.ergodesktop.com"&gt;http://www.ergodesktop.com&lt;/a&gt;.&lt;br&gt; &lt;br&gt;One coworker that adopted this practice also bought himself a foot mat. I have been wearing sandals or occasionally kneeling on my chair.&lt;br&gt;&lt;br&gt;Remember: Stay agile, not fragile.&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4441160589671124737-8505602385881919871?l=agilefromthegroundup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilefromthegroundup.blogspot.com/feeds/8505602385881919871/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilefromthegroundup.blogspot.com/2011/06/from-15-minute-stand-ups-to-standing.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4441160589671124737/posts/default/8505602385881919871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4441160589671124737/posts/default/8505602385881919871'/><link rel='alternate' type='text/html' href='http://agilefromthegroundup.blogspot.com/2011/06/from-15-minute-stand-ups-to-standing.html' title='From 15 Minute Stand Ups to Standing Work Stations : How to Start a Trend'/><author><name>Josh Gough</name><uri>http://www.blogger.com/profile/13302284610870926934</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4441160589671124737.post-1583415329934986681</id><published>2011-05-20T19:21:00.001-07:00</published><updated>2011-05-20T19:25:11.770-07:00</updated><title type='text'>MIX 2011 Presentations Reviews</title><content type='html'>Glenn Block's presentation on WCF and URIs is very good from MIX 2011. &lt;a href="http://www.slipjig.org/"&gt;Mike Simpson&lt;/a&gt; also forwarded me a recent DotNetRocks episode in which Block discusses the WCF HTTP WebAPI.&lt;br /&gt;&lt;div&gt;MIX 2011 presentation: "There's a URI for That":&amp;nbsp;&lt;a href="http://channel9.msdn.com/events/MIX/MIX11/FRM14"&gt;http://channel9.msdn.com/events/MIX/MIX11/FRM14&lt;/a&gt;&lt;/div&gt;&lt;div&gt;DNR episode: "Glenn Block Simplifies WCF with WebAPI":&amp;nbsp;&lt;a href="http://www.dotnetrocks.com/default.aspx?showNum=661"&gt;http://www.dotnetrocks.com/default.aspx?showNum=661&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;In the MIX 2011 presentation, some highlights of things he demonstrates the following:&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Microsoft is committed to delivering a first-class HTTP programming model for WCF&lt;/li&gt;&lt;li&gt;The HttpWebResponse&amp;lt;OfTypeT&amp;gt; response type, which has full support of HTTP status codes, demonstarted with response.StatusCode = HttpStatusCode.Created to indicate a successful "resource created" response status from the server to the client.&lt;/li&gt;&lt;li&gt;The use of media types and registering X number of media type processors to handle incoming requests based on "extensions" supplied on the URI.&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Gone are the days when an extension like ".aspx" or ".txt" were tightly-coupled to the file-system and to physical files on disk. Instead, these are now fully interceptable and processable by YOUR handler code in the way YOU WANT.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Using an OData producer resource, he showed Google's GMail contacts import dialog pulling down contacts from his WCF service in vCard format, as specified by an extension, and an OData filter expression that limited the results returned to the top 3 results&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;All in all, I am feeling increasinly confident that Microsoft's direction regarding HTTP and REST is moving in a solid path. While it is of course possible to build REST/HTTP style Web APIs without WCF and without explicit support from Microsoft, the fact that Microsoft is supporting this provides two advantages:&lt;/div&gt;&lt;ol&gt;&lt;li&gt;It increases the mind-share and desire amongst .NET developers to understand the web and to leverage these technologies,&lt;/li&gt;&lt;li&gt;It provides an easier path toward enterprise-wide adoption&amp;nbsp;because mangement will begin to understand the benefits and see the backing of MS within their flagship WCF offerring.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Perhaps "hard-core" ALT.NETters and "Restafarians" will say they've been doing things like this without MS support for years, and I would not argue with that. However, most of us work in a heterogeneous world that involves a lot of layers of management and risk-mitigation. So, the extra support at an official level from Microsoft's platform can only help the general adoption curve of web technology.&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;And, regarding developers and architects, these groups of stakeholders have a lot riding on their technical choices and often face an uphill battle when the major vendor of their company's tools isn't yet "on board".&lt;br /&gt;&lt;br /&gt;I and a few of my colleagues at various companies have been building REST-style (though I'd hesitate to call it full REST because of little attention paid to links and hypermedia constraints) for a efw years and have often faced skepticism because of the "That's not what WCF does" responses. Those responses were well-founded at the time, but it's also very nice to see how far MS has come with modernizing WCF to fully support the web and the HTTP specifications for all they offer and are worth.&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;For me this is a great step in the right direction, and I look forward to evaluating further the use of WCF HTTP WebAPI&amp;nbsp;for backend resources / services.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4441160589671124737-1583415329934986681?l=agilefromthegroundup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilefromthegroundup.blogspot.com/feeds/1583415329934986681/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilefromthegroundup.blogspot.com/2011/05/mix-2011-presentations-reviews.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4441160589671124737/posts/default/1583415329934986681'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4441160589671124737/posts/default/1583415329934986681'/><link rel='alternate' type='text/html' href='http://agilefromthegroundup.blogspot.com/2011/05/mix-2011-presentations-reviews.html' title='MIX 2011 Presentations Reviews'/><author><name>Josh Gough</name><uri>http://www.blogger.com/profile/13302284610870926934</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4441160589671124737.post-2949458851748077643</id><published>2011-04-16T08:53:00.001-07:00</published><updated>2011-04-16T08:53:15.181-07:00</updated><title type='text'>MIX 2011: WCF, OData, MVC, and MEF Highlighted Presentations</title><content type='html'>MIX 11 has finished. Here are the presentations that I will be &amp;quot;diving into&amp;quot; more quickly than others.&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;My Summary of Summaries:&lt;br&gt;&lt;/b&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;The topics below caught my eye as priority because:&lt;/div&gt; &lt;div&gt;&lt;ul&gt;&lt;li&gt;They build upon &lt;a href="http://www.odata.org/developers/protocols/atom-format"&gt;OData, and thus upon Atom&lt;/a&gt; and REST . REST is the foundational architecture of the WWW, and is still not widely understand throughout the entire development industry&lt;/li&gt; &lt;ul&gt;&lt;li&gt;I&amp;#39;m likely to be joining a large project that will be providing enterprise wide alerting, notification, and reporting capabilities to X number of organizational sub-units. It&amp;#39;s critical that interfaces to such services be simple, document-based, and that output data be consumable by end-user tools like Excel. OData support is &amp;quot;baked in&amp;quot; to the latest Office products and into Sharepoint 2010.&lt;/li&gt; &lt;/ul&gt;&lt;li&gt;Regarding MVC and MEF: these two technologies are critical for modular, extensible web applications on the .NET platform. Being able to deploy sub-units independent of an independent application architecture is critical both for ease of maintenance and extensibility, but is also important in highly secure environments that require rigorous application scanning for security threats.&lt;/li&gt; &lt;/ul&gt;&lt;/div&gt;&lt;div&gt;That&amp;#39;s more than enough from me. I&amp;#39;ll let the experts Castro and Block elaborate :)&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Scott Guthrie&amp;#39;s key-note, naturally:&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://channel9.msdn.com/Events/MIX/MIX11/KEY01"&gt;http://channel9.msdn.com/Events/MIX/MIX11/KEY01&lt;/a&gt;&lt;/div&gt; &lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Why: because it&amp;#39;s The Gu. Period. Full-stop.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Pablo Castro on OData Roadmap: Powering the Next Generation of Services:&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://channel9.msdn.com/Events/MIX/MIX11/FRM11"&gt;http://channel9.msdn.com/Events/MIX/MIX11/FRM11&lt;/a&gt;&lt;/div&gt; &lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Summary:&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: 13px; color: rgb(51, 51, 51); line-height: 18px; "&gt;At home and work, the way we experience the web (share, search and interact with data) is undergoing an industry-changing paradigm shift from "the web of documents" to the "web of data" which enables new data-driven experiences to be easily created for any platform or device. Come to this session to see how OData is helping to enable this shift through a hands-on look at the near term roadmap for the Open Data Protocol and see how it will enable a new set of user experiences. From support for offline applications, to hypermedia-driven UI and much more, join us in this session to see how OData is evolving based on your feedback to enable creating immersive user experiences for any device.&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: 13px; color: rgb(51, 51, 51); line-height: 18px; "&gt;&lt;br&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: 13px; color: rgb(51, 51, 51); line-height: 18px; "&gt;&lt;b&gt;OData Roadmap: Exposing any Data Source as an OData Service: &lt;/b&gt;&lt;/span&gt;&lt;a href="http://channel9.msdn.com/Events/MIX/MIX11/FRM16"&gt;&lt;b&gt;http://channel9.msdn.com/Events/MIX/MIX11/FRM16&lt;/b&gt;&lt;/a&gt;&lt;/div&gt; &lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: 13px; color: rgb(51, 51, 51); line-height: 18px; "&gt;&lt;br&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: 13px; color: rgb(51, 51, 51); line-height: 18px; "&gt;&lt;b&gt;Summary:&lt;/b&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: 13px; color: rgb(51, 51, 51); line-height: 18px; "&gt;&lt;b&gt;&lt;br&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: 13px; color: rgb(51, 51, 51); line-height: 18px; "&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;Many of the popular OData services, including Netflix, Twitpic and Facebook Insights were built by reusing their existing web API with an OData service. Implementing this type of OData service is not simple but it's also not as hard as you might think. In this session, you'll learn how to build similar services that wrap different types of data sources using the WCF Data Services Toolkit. We'll take a look at the implementations for several of the popular services as examples of how to use the toolkit to create new OData services.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: 13px; color: rgb(51, 51, 51); line-height: 18px; "&gt;&lt;b&gt;&lt;br&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: 13px; color: rgb(51, 51, 51); line-height: 18px; "&gt;&lt;b&gt;Fun with MVC 3 and MEF: &lt;/b&gt;&lt;a href="http://channel9.msdn.com/Events/MIX/MIX11/OPN07"&gt;&lt;b&gt;http://channel9.msdn.com/Events/MIX/MIX11/OPN07&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: 13px; color: rgb(51, 51, 51); line-height: 18px; "&gt;&lt;br&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: 13px; color: rgb(51, 51, 51); line-height: 18px; "&gt;&lt;b&gt;Summary:&lt;/b&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: 13px; color: rgb(51, 51, 51); line-height: 18px; "&gt;&lt;br&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: 13px; color: rgb(51, 51, 51); line-height: 18px; "&gt;So you have a team of developers… And a nice architecture to build on… How about making that architecture easy for everyone and getting developers up to speed quickly? Learn all about integrating the managed extensibility framework and &lt;a href="http://ASP.NET"&gt;ASP.NET&lt;/a&gt; MVC for creating loosely coupled, easy to use architectures that anyone can grasp.&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: 13px; color: rgb(51, 51, 51); line-height: 18px; "&gt;&lt;br&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: 13px; color: rgb(51, 51, 51); line-height: 18px; "&gt;&lt;b&gt;OData in Action: Connecting Any Data Source to Any Device&lt;/b&gt;&lt;/span&gt;&lt;/div&gt; &lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: 13px; color: rgb(51, 51, 51); line-height: 18px; "&gt;&lt;h1 style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.2em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-size: 32px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; font-style: normal; font-family: Calibri, &amp;#39;Lucida Grande&amp;#39;, Helvetica, Arial, sans-serif; line-height: 0.9; border-bottom-style: initial; border-bottom-color: initial; background-position: initial initial; background-repeat: initial initial; "&gt; &lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-weight: normal; line-height: 18px; font-size: 13px; "&gt;&lt;a href="http://channel9.msdn.com/Events/MIX/MIX11/FRM10"&gt;http://channel9.msdn.com/Events/MIX/MIX11/FRM10&lt;/a&gt;&lt;/span&gt;&lt;/h1&gt; &lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: 13px; color: rgb(51, 51, 51); line-height: 18px; "&gt;&lt;br&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: 13px; color: rgb(51, 51, 51); line-height: 18px; "&gt;&lt;b&gt;Summary:&lt;/b&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: 13px; color: rgb(51, 51, 51); line-height: 18px; "&gt;&lt;br&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: 13px; color: rgb(51, 51, 51); line-height: 18px; "&gt;We are collecting more diverse data than ever before and at the same time undergoing a proliferation of connected devices ranging from phone to the desktop, each with its own requirements. This can pose a significant barrier to developers looking to create great end-to-end user experiences across devices. The OData protocol (&lt;a href="http://odata.org"&gt;http://odata.org&lt;/a&gt;) was created to provide a common way to expose and interact with data on any platform (DB, No SQL stores, web services, etc). In this code heavy session we'll show you how Netflix, EBay and others have used OData and Azure to quickly build secure, internet-scale services that power immersive client experiences from rich cross platform mobile applications to insightful BI reports.&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: 13px; color: rgb(51, 51, 51); line-height: 18px; "&gt;&lt;br&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: 13px; color: rgb(51, 51, 51); line-height: 18px; "&gt;&lt;b&gt;Glen Block on WCF Web Apis: There&amp;#39;s an URI for That: &lt;/b&gt;&lt;/span&gt;&lt;b&gt;&lt;a href="http://channel9.msdn.com/Events/MIX/MIX11/FRM14"&gt;http://channel9.msdn.com/Events/MIX/MIX11/FRM14&lt;/a&gt;&lt;/b&gt;&lt;/div&gt; &lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Summary:&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: 13px; color: rgb(51, 51, 51); line-height: 18px; "&gt;Web application developers today are facing new challenges around how to expose data and services. The cloud, move to devices, and shift toward browsers are all placing increasing demands on surfacing such functionality in a web-friendly manner. WCF&amp;#39;s Web API makes it easy for developers to expose their services and data to a broad set of clients and to take advantage of rich emerging web standards like Web Sockets.&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: 13px; color: rgb(51, 51, 51); line-height: 18px; "&gt;&lt;br&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: 13px; color: rgb(51, 51, 51); line-height: 18px; "&gt;&lt;br&gt; &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: 13px; color: rgb(51, 51, 51); line-height: 18px; "&gt;&lt;br&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4441160589671124737-2949458851748077643?l=agilefromthegroundup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilefromthegroundup.blogspot.com/feeds/2949458851748077643/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilefromthegroundup.blogspot.com/2011/04/mix-2011-wcf-odata-mvc-and-mef.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4441160589671124737/posts/default/2949458851748077643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4441160589671124737/posts/default/2949458851748077643'/><link rel='alternate' type='text/html' href='http://agilefromthegroundup.blogspot.com/2011/04/mix-2011-wcf-odata-mvc-and-mef.html' title='MIX 2011: WCF, OData, MVC, and MEF Highlighted Presentations'/><author><name>Josh Gough</name><uri>http://www.blogger.com/profile/13302284610870926934</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4441160589671124737.post-7780664361319390349</id><published>2011-04-05T22:58:00.001-07:00</published><updated>2011-04-07T11:38:15.713-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Business Value'/><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='leadership'/><title type='text'>Delivery and Simplicity : Don't Leave Home Without These Agile Principles</title><content type='html'>&lt;h1&gt;&lt;/h1&gt;&lt;h1&gt;&lt;span class="Apple-style-span" style="font-size: large; font-weight: normal;"&gt;Bootstrapping Agile from the Trenches&lt;/span&gt;&lt;/h1&gt;&lt;h1&gt;&lt;span class="Apple-style-span" style="font-size: small; font-weight: normal;"&gt;In February of 2006, I was offered the position of Lead Architect for the redevelopment of CDC's &lt;a href="http://www.cdc.gov/epix"&gt;Epi-X system&lt;/a&gt;, CDC's flagship secure communications platform for emergent disease outbreak notification and bi-directional collaboration between multi-jurisdictional public health authorities. However, on the same day I was offered a position at a private .NET consulting company, Abel Solutions. Realizing that actual redevelopment of Epi-X would be months, if not years away, due to the then very disruptive agency-wide reorganization, I decided to leave so that I could gain more experience in a variety of private sector industries.&lt;/span&gt;&lt;/h1&gt;&lt;h1&gt;&lt;span class="Apple-style-span" style="font-size: small; font-weight: normal;"&gt;During the five years since I left Epi-X, I've worked as a senior software engineer, architect, lead application architect, and as an independent consultant. My first assignment with Abel Solutions was to re-architect and re-develop a very popular web-based electronic commerce &amp;amp; auction system to support more than 1 million registered users and the processing of more than 300 million dollars in annual sales. For a different company, &amp;nbsp;I re-engineered the security, object-relational, and querying architecture of a complicated human resources &amp;amp; payroll processing system used by thousands of companies. Most recently, I helped lead the design and development of both a modular user-interface architecture and the core service-oriented architecture for a new correspondence banking &amp;amp; ACH settlement platform to be used by hundreds of local and regional banks to conduct business more easily with the Federal Reserve and each other.&lt;/span&gt;&lt;/h1&gt;&lt;h1&gt;&lt;span class="Apple-style-span" style="font-size: small; font-weight: normal;"&gt;For the companies sponsoring the first two projects mentioned above, I introduced and lead the successful adoption of Agile management and development practices. For the third, I was recruited specifically to consult both on their adoption of Agile and the design of its new system's user-interface and service-oriented architecture.&lt;/span&gt;&lt;/h1&gt;&lt;h1&gt;&lt;span class="Apple-style-span" style="font-size: small; font-weight: normal;"&gt;I've also consulted with many other private entrepreneurial businesses about technology strategy, and in 2008 founded both the &lt;a href="http://www.meetup.com/AtlantaScienceTavern"&gt;Atlanta Science Tavern&lt;/a&gt; and the &lt;a href="http://www.meetup.com/ATLAltDotNet"&gt;ATL ALT.NET&lt;/a&gt; community groups.&lt;/span&gt;&lt;/h1&gt;&lt;h1&gt;&lt;span class="Apple-style-span" style="font-size: large; font-weight: normal;"&gt;Aligning the Agile Approach to the Business Domain&lt;/span&gt;&lt;/h1&gt;&lt;h1&gt;&lt;span class="Apple-style-span" style="font-size: small; font-weight: normal;"&gt;Let me be the first to state that adopting Agile in the "real world" is not easy. To be successful, you must internalize the values of Agile, especially the very first one which reads:&lt;/span&gt;&lt;/h1&gt;&lt;h1 style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Our highest priority is to satisfy the customer&lt;/span&gt;&lt;/h1&gt;&lt;h1 style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;through early and continuous delivery&lt;/span&gt;&lt;/h1&gt;&lt;h1 style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;of valuable software.&lt;/span&gt;&lt;/h1&gt;&lt;h1&gt;&lt;span class="Apple-style-span" style="font-size: small; font-weight: normal;"&gt;Did you notice that this specifies nothing whatsoever about writing code? It specifies nothing at all about writing code at all. It specifies delivery of valuable software.&lt;/span&gt;&lt;/h1&gt;&lt;h1&gt;&lt;span class="Apple-style-span" style="font-size: small; font-weight: normal;"&gt;Later on in the principles document, it says:&lt;/span&gt;&lt;/h1&gt;&lt;h1 style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Simplicity--the art of maximizing the amount&lt;/span&gt;&lt;/h1&gt;&lt;h1 style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;of work not done--is essential.&lt;/span&gt;&lt;/h1&gt;&lt;h1&gt;&lt;span class="Apple-style-span" style="font-size: small; font-weight: normal;"&gt;It says simplicity is &lt;i&gt;essential&lt;/i&gt;, not optional, but &lt;i&gt;essential&lt;/i&gt;. How many projects have you seen that feature unnecessary &lt;i&gt;complexity&lt;/i&gt;? That is the exact opposite of this Agile principle. For more about this problem, see my post that &lt;a href="http://agilefromthegroundup.blogspot.com/2010/08/review-learning-from-five-years-as-skye.html"&gt;reviews a Skype architect's presentation.&lt;/a&gt;&lt;/span&gt;&lt;/h1&gt;&lt;h1&gt;&lt;span class="Apple-style-span" style="font-size: small; font-weight: normal;"&gt;You can read the rest of the Agile principles here: &lt;a href="http://agilemanifesto.org/principles.html"&gt;http://agilemanifesto.org/principles.html&lt;/a&gt;&lt;/span&gt;&lt;/h1&gt;&lt;h1&gt;&lt;span class="Apple-style-span" style="font-size: small; font-weight: normal;"&gt;I highlight this because a lot of practitioners think that Agile is some kind of magic bullet that will solve all the problems that sequential "waterfall" style development has. This is absolutely not the case. &amp;nbsp;Agile has its own pitfalls that must be addressed as well, and one of them is plainly that development teams don't even understand or truly believe in these two core principles!&lt;/span&gt;&lt;/h1&gt;&lt;h1&gt;&lt;span class="Apple-style-span" style="font-size: large; font-weight: normal;"&gt;The Core of Agile: Communication and Collaboration&lt;/span&gt;&lt;/h1&gt;&lt;h1&gt;&lt;span class="Apple-style-span" style="font-size: small; font-weight: normal;"&gt;As the principles in the Agile Manifesto explain, collaboration and communication are the two most critical underlying themes of agile development. What if, by communicating with your clients successfully you could help them avoid spending millions of dollars custom-developing a solution to a problem that you could solve using low-cost or open-source software?&lt;/span&gt;&lt;/h1&gt;&lt;h1&gt;&lt;span class="Apple-style-span" style="font-size: small; font-weight: normal;"&gt;&lt;i&gt;Would that not be the ultimate fulfillment of the first principle of Agile?&lt;/i&gt; I think it most certainly would. And, it would certainly fulfill the later example I highlighted!&lt;/span&gt;&lt;/h1&gt;&lt;h1&gt;&lt;span class="Apple-style-span" style="font-size: small; font-weight: normal;"&gt;Unfortunately, many people, even managers, fail to think this way when they adopt Agile. This is not to say that they don't mean well. It's often just the case that they recognize Agile, and associated development practices like XP and TDD, as a better way of &lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;building software&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small; font-weight: normal;"&gt;, but can lose sight of principle number one: &lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;delivery of valuable software.&lt;/span&gt;&lt;/h1&gt;&lt;h1&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Internalized Agility = Flexibility&lt;/span&gt;&lt;/span&gt;&lt;/h1&gt;&lt;h1&gt;&lt;span class="Apple-style-span" style="font-size: small; font-weight: normal;"&gt;True internalization of Agile values should cause architects, developers, testers, and all manner of managers to adopt an attitude of true collaboration with their stakeholders.&lt;/span&gt;&lt;/h1&gt;&lt;h1&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;So, keep it mind that being agile doesn't always mean &lt;/span&gt;&lt;i&gt;building software&lt;/i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;. First and foremost, it means &lt;/span&gt;&lt;i&gt;delivering valuable software&lt;/i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/h1&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4441160589671124737-7780664361319390349?l=agilefromthegroundup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilefromthegroundup.blogspot.com/feeds/7780664361319390349/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilefromthegroundup.blogspot.com/2011/04/first-agile-principle-dont-skip-it.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4441160589671124737/posts/default/7780664361319390349'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4441160589671124737/posts/default/7780664361319390349'/><link rel='alternate' type='text/html' href='http://agilefromthegroundup.blogspot.com/2011/04/first-agile-principle-dont-skip-it.html' title='Delivery and Simplicity : Don&apos;t Leave Home Without These Agile Principles'/><author><name>Josh Gough</name><uri>http://www.blogger.com/profile/13302284610870926934</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4441160589671124737.post-1580009567035040385</id><published>2011-03-29T22:38:00.001-07:00</published><updated>2011-03-29T22:38:15.957-07:00</updated><title type='text'>New Reading List: Acceptance Testing, Specification by Example</title><content type='html'>As usual, there are far, far too many topics that interest me than I will likely be able to comprehend.&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;I&amp;#39;m extremely interested in recent presentations and work from Gojko Adzic.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt; &lt;div&gt;I&amp;#39;m going to buy his books Briding the Communication Gap and Specification by Example:&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.acceptancetesting.info/the-book/"&gt;http://www.acceptancetesting.info/the-book/&lt;/a&gt;&lt;/div&gt; &lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.manning.com/adzic/"&gt;http://www.manning.com/adzic/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;You can see Gojko present about these topics in numerous places, including:&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.acceptancetesting.info/"&gt;http://www.acceptancetesting.info&lt;/a&gt;&lt;/div&gt; &lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.mefeedia.com/watch/32039109"&gt;http://www.mefeedia.com/watch/32039109&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://skillsmatter.com/podcast/design-architecture/ddd-tdd-bdd"&gt;http://skillsmatter.com/podcast/design-architecture/ddd-tdd-bdd&lt;/a&gt;&lt;/div&gt; &lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Why do these topics interest me? The easy answer is that I find it very painful, both mentally, and physically to endure lapses of communication in projects that lead to lost time, money, or functionality when I know in my heart such problems can be avoided with proper communication.&lt;/div&gt; &lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Scott Ambler has also written extensively about Executable Specifications at &lt;a href="http://www.agilemodeling.com/essays/executableSpecifications.htm"&gt;http://www.agilemodeling.com/essays/executableSpecifications.htm&lt;/a&gt;. &lt;/div&gt; &lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;These ideas bring together the two aspects of system development that matter most to me:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Achieving the correct result for my customer / user&lt;/li&gt;&lt;li&gt;Seeing something &lt;b&gt;&lt;i&gt;&lt;u&gt;valuable &lt;/u&gt;&lt;/i&gt;&lt;/b&gt;&lt;i&gt;&lt;u&gt;&lt;b&gt;running&lt;/b&gt;&lt;/u&gt;&lt;/i&gt;&lt;/li&gt; &lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Nothing is more crucial to my sense of accomplishment when building a system than to see the correct result in &lt;i&gt;&lt;b&gt;&lt;u&gt;action.&lt;/u&gt;&lt;/b&gt;&lt;/i&gt;  I know, however, that many teams value &amp;quot;documentation&amp;quot; as a very important communication artifact that serves to mediate between &amp;quot;the business&amp;quot; and &amp;quot;the development team&amp;quot;, but I find this to be a source of constant frustration for the very reasons that Gojko lays out. Instead, what is more valuable, and very satisfying, is to execute the documentation, the specification, the requirements in a testable, verifiable way that itself represents real tangible value, not just words on a dead sheet of paper.&lt;/div&gt; &lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Gojko&amp;#39;s presentations are excellent and his books look like they will really fill the &amp;quot;gap&amp;quot; in my own arsenal. I am looking forward to devoting significant time to studying these works.&lt;/div&gt; &lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;As he explains on his web site, here are the &amp;quot;Key Ideas&amp;quot; in the Bridging the Communication Gap book:&lt;/div&gt;&lt;div&gt;&lt;ul style="font-family: verdana, sans-serif; font-size: 12px; line-height: 16px; "&gt; &lt;li&gt;&lt;a href="http://www.acceptancetesting.info/key-ideas/telephone-game/" style="color: blue; text-decoration: none; "&gt;The telephone game&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.acceptancetesting.info/key-ideas/collaborative-specifications" style="color: blue; text-decoration: none; "&gt;Collaborative specifications&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://www.acceptancetesting.info/key-ideas/challenging-requirements" style="color: blue; text-decoration: none; "&gt;Challenging requirements&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.acceptancetesting.info/key-ideas/specification-by-example/" style="color: blue; text-decoration: none; "&gt;Specification by example&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://www.acceptancetesting.info/key-ideas/examples-as-acceptance-tests" style="color: blue; text-decoration: none; "&gt;Examples as acceptance tests&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.acceptancetesting.info/key-ideas/ubiquitous-language" style="color: blue; text-decoration: none; "&gt;Ubiquitous language&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://www.acceptancetesting.info/key-ideas/communicating-intent" style="color: blue; text-decoration: none; "&gt;Communicating intent&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.acceptancetesting.info/key-ideas/incremental-specifications" style="color: blue; text-decoration: none; "&gt;Incremental specifications&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://www.acceptancetesting.info/key-ideas/specification-workshop" style="color: blue; text-decoration: none; "&gt;Specification workshops&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.acceptancetesting.info/key-ideas/distilling-the-specification" style="color: blue; text-decoration: none; "&gt;Distilling the specification&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://www.acceptancetesting.info/key-ideas/executable-specifications" style="color: blue; text-decoration: none; "&gt;Executable Specifications&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.acceptancetesting.info/key-ideas/live-documentation" style="color: blue; text-decoration: none; "&gt;Live documentation&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4441160589671124737-1580009567035040385?l=agilefromthegroundup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilefromthegroundup.blogspot.com/feeds/1580009567035040385/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilefromthegroundup.blogspot.com/2011/03/new-reading-list-acceptance-testing.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4441160589671124737/posts/default/1580009567035040385'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4441160589671124737/posts/default/1580009567035040385'/><link rel='alternate' type='text/html' href='http://agilefromthegroundup.blogspot.com/2011/03/new-reading-list-acceptance-testing.html' title='New Reading List: Acceptance Testing, Specification by Example'/><author><name>Josh Gough</name><uri>http://www.blogger.com/profile/13302284610870926934</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4441160589671124737.post-866629333222914345</id><published>2011-03-28T21:49:00.000-07:00</published><updated>2011-03-29T12:16:32.833-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Business Value'/><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='Architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='&quot;strangler pattern&quot;'/><category scheme='http://www.blogger.com/atom/ns#' term='leadership'/><title type='text'>Strangulation: The Pattern of Choice for Misk Mitigating, ROI-Maximizing Agilists When Rewriting Legacy Systems</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-txhXpSY1Fag/TZFoml02RaI/AAAAAAAAAXg/3sXp5y91s00/s1600/strangler.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-txhXpSY1Fag/TZFoml02RaI/AAAAAAAAAXg/3sXp5y91s00/s1600/strangler.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;i&gt;"The most important reason to consider a strangler application over a cut-over rewrite is reduced risk. A strangler can give value steadily and the frequent releases allow you to monitor its progress more carefully. Many people still don't consider a strangler since they think it will cost more - I'm not convinced about that. Since you can use shorter release cycles with a strangler you can avoid a lot of the unnecessary features that cut over rewrites often generate.&lt;b&gt;" -- Martin Fowler, Chief Scientist, ThoughtWorks, on &lt;a href="http://www.martinfowler.com/bliki/StranglerApplication.html"&gt;The Strangler Pattern&lt;/a&gt;&lt;/b&gt;&lt;/i&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;When   rewriting a system in a new technology, it's tempting to think that the   task will be easier and quicker than the first time it was written.   Because of this, sometimes business sponsors believe that a "waterfall"   or "big bang all at once" approach will work out, but this is rarely  the  case for any project large enough and important enough to warrant   rewriting. It's always important to practice iterative and incremental   development to provide for feedback loops. But, it's even more important   to do this in the case of a large application rewrite. This article   will explain why this is true. There are a few bedrock development   principles that project sponsors and team members should put into   practice to ensure the success of large scale migrations. Having learned   these lessons from experience, these are:&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li style="font-family: Arial;"&gt;Involve   business sponsors and end-users directly (or a user-experience   specialist) and the entire support and operations teams during the   entire rewrite&lt;br /&gt;&lt;/li&gt;&lt;li style="font-family: Arial;"&gt;Involve permanent quality-assurance professionals from the beginning and during the entire rewrite&lt;br /&gt;&lt;/li&gt;&lt;li style="font-family: Arial;"&gt;Design, code, and test one complete feature rewritten from the existing system as quickly as possible&lt;br /&gt;&lt;/li&gt;&lt;li style="font-family: Arial;"&gt;Thereafter, design, code, test, and pilot user-valued, return-on-investment-generating (ROI) features in small increments&lt;/li&gt;&lt;li style="font-family: Arial;"&gt;&lt;span style="font-family: arial;"&gt;Most importantly, continuously build team member skills, knowledge, and leadership abilities&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;&lt;span style="font-family: arial;"&gt;Lessons Learned in Rewriting Large Legacy Systems&amp;nbsp;&lt;/span&gt;&lt;/h2&gt;&lt;span style="font-family: arial;"&gt;In   February of 2006 I joined a small .NET consulting company. Shortly   thereafter I was assigned to a brand new project for one of their   clients to analyze, design, and develop a new version of an existing   electronic commerce platform. The system was a highly successful,   niche-market leading auction site with nearly 700,000 registered users   at the time. In operation for more than seven years by then, the system   was built on classic ASP, C++/COM, and SQL Server 2000. It consisted of   about 330 ASP pages. Our client wanted to do two primary things.  First,  he wanted to add new, value-added features to the system to  provide a  much better user experience, one that would be similar to  eBay. These  features would be called "My Auctions". This new set of  features would  take the place of roughly 30 pages from the existing web  site. Second,  he wanted to migrate the other 300 pages, without  introducing any  functionality or usability improvements, to &lt;a href="http://asp.net/"&gt;ASP.NET&lt;/a&gt;  WebForms. Having  already personally designed and developed the entire  business object  back-end COM objects, he wanted all of the new web site  to &lt;i&gt;reuse this investment&lt;/i&gt; by utilizing COM Interop.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;h2&gt;&lt;span style="font-family: arial;"&gt;My Recommendation: Perform a Phased, Vertical Migration One Piece at a Time&lt;/span&gt;&lt;/h2&gt;&lt;span style="font-family: arial;"&gt;My   first assignment was to analyze the existing ASP and C++ code to and   produce a migration strategy recommendation. This strategy document   would lay out our company's professional opinion for migrating the   system to the .NET platform and the C# language. My recommendation was   for our client to perform a vertical migration, which is a migration   that incorporates an entire functional slice of a subset of the system   (My Auctions) which cuts across all architectural layers   (top-to-bottom). In their book &lt;u&gt;The Pragmatic Programmer&lt;/u&gt;, Dave   Thomas and Andrew Hunt call this a "tracer bullet". This was, in fact,   what Microsoft recommended in their best practices guidance documents   that I researched about performing large scale system architecture   migrations. I recommended that our client hire us to build a new core   platform on &lt;a href="http://asp.net/"&gt;ASP.NET&lt;/a&gt; with C# and get the new, value-added features to  market &lt;i&gt;&lt;b&gt;as soon as possible&lt;/b&gt;&lt;/i&gt;  on top of that core platform.  Only after these value-added features  were in production would we then  move on to replacing the rest of the  300 pages with &lt;a href="http://asp.net/"&gt;ASP.NET&lt;/a&gt;  replacements.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;h2&gt;&lt;span style="font-family: arial;"&gt;My Reasoning: Place Customer Satisfaction, ROI, and Risk Mitigation First&lt;/span&gt;&lt;/h2&gt;&lt;span style="font-family: arial;"&gt;My   reasoning was that by creating a new core platform and building the   brand new, usability-focused, value-added My Auctions features on top of   that, our client would generate a return-on-investment (ROI) much   sooner by generating more sales volume with the user-friendly features   and would simultaneously mitigate significant risk by testing the   viability of the COM Interop strategy. By virtue of the features being &lt;i&gt;value-added&lt;/i&gt;,   there would be no risk whatsoever for him to deploy them to a parallel   web server and get his users to begin pilot testing the system and &lt;b&gt;&lt;i&gt;providing   valuable feedback early on in the game when he could still make   significant changes prior to committing to replacing the entire system&lt;/i&gt;&lt;/b&gt; with the new technology.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="color: red;"&gt;&lt;span style="font-family: arial;"&gt;&lt;i&gt;&lt;b&gt;I've since learned from Dan North at QCon 2010 in S.F. that is called &lt;a href="http://www.martinfowler.com/bliki/StranglerApplication.html"&gt;The Strangler Pattern&lt;/a&gt; according to Martin Fowler, hence the title of this post!&lt;/b&gt;&lt;/i&gt; &lt;/span&gt;&lt;span style="font-family: arial;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;h2&gt;&lt;span style="font-family: arial;"&gt;Client Decision: Let's Do It All At Once&lt;/span&gt;&lt;/h2&gt;&lt;span style="font-family: arial;"&gt;Our   client considered my recommendation very carefully, but wanted to take  a  different approach. Rather than deploy the new My Auctions features   independently, side-by-side with the existing system, he wanted to have   his in-house staff work on the other 300 pages while our company  worked  on the value-added features. With more than 330 pages to  complete, I  estimated that the project would not take less than a year,  but would  more likely take two years or more to complete. Our client  and my  manager thought things could be done much faster if we had three  or four  people working on the system. This was certainly the case  early on when  I worked side-by-side with another developer in our  company. &lt;b&gt;&lt;i&gt;Within  four months, he and I had completed the new C#  application foundation  and the value-added features to the point that  they were ready for  beta-testing.&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;And that's when all the fun began!&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;h2&gt;&lt;span style="font-family: arial;"&gt;Planning is Essential; Plans are Useless&lt;/span&gt;&lt;/h2&gt;&lt;span style="font-family: arial;"&gt;As   anyone who has worked in the software industry for a number of years   knows, the best laid plans never go as you planned. Our client's lead C#   developer left his company. Soon after that, my manager at my company   was let go, but several months later he was hired by our client to take   over the development management of the project. This made sense since  he  already had strong background on the project since its inception.   Shortly after this, our client's HTML, graphics, and CSS developer quit   when asked to change his focus to become an &lt;a href="http://asp.net/"&gt;ASP.NET&lt;/a&gt;  developer. They  hired a lead C# developer and he got to working on a  large slice of the  application while I continued to work on another  large slice. Five  months later, they hired a second C# developer and he  began working on  several other slices of the application. &lt;br /&gt;&lt;br /&gt;Wanting to see the  project through to success, I joined the client as a  direct employee to  continue being the lead architect for the project.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;h2&gt;&lt;span style="font-family: arial;"&gt;Naturally, There's a Big Trade Show In The Story&lt;/span&gt;&lt;/h2&gt;&lt;span style="font-family: arial;"&gt;What   would any development story be without a "Big Trade Show" lurking   around the corner? As luck and fate would have it, in early 2008 there   was a huge industry trade show, and it was critical that we would be   able to demonstrate the new version of the system to the roughly 25,000   customers that would be passing through our booth. And, it would be  very  important that these customers be able to see their own &lt;i&gt;&lt;b&gt;real items&lt;/b&gt;&lt;/i&gt;,   either ones they were selling or ones they were buying. The problem   was, of course, that the system was not ready to replace the production   system! Due to security requirements brought about by a changing legal   environment, we had to repartition the back-end database for the new   system from 2 SQL databases into 6 separate databases just before the   trade show. It was deemed too risky to perform this radical "surgery" on   the live, production system just two months before the trade show. The   new system's schema was about 95% the same as the old system, but  there  were corrections to long-standing column name problems or  foreign-key  reference inconsistencies. This was a complicating factor,  however, for  migration.&lt;br /&gt;&lt;br /&gt;We tossed around various ideas, such as:&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family: arial;"&gt;Perform  the "surgery" on the  production database to upgrade it to the new  system schema, then use  views and synonyms to create a "pass-through"  database that looked like  the old schema, but mapped across to the new  DBs and structures.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: arial;"&gt;Do the reverse:  create several "pass-through"  new databases with views and synonyms that  actually resolved to the  single existing production database's objects.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-family: arial;"&gt;We  felt that we could mitigate risk entirely  by following the second  option. What this also allowed us to do was to  "override" some of the  production system's tables with configuration  data specific to the new  system. The approach of using synonyms and  views ensured that all writes  and reads against the pass-through  objects would actually resolve into  the production database, thus  enabling the beta version of the new  system to live side-by-side with  the legacy system.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;h2&gt;&lt;span style="font-family: arial;"&gt;The War Room&lt;/span&gt;&lt;/h2&gt;&lt;span style="font-family: arial;"&gt; After some  proof-of-concept prototyping, we realized this would be a winning  strategy. Over the next couple of weeks, the four of us on the  development team gathered daily in our "war room", and worked together  to create all the necessary SQL scripts and shell databases, synonyms,  views, etc that would be the magic glue. We ensured that we could re-run  the scripts at will and automated our quality-control checks and sanity  checks to be certain that all mappings would have proper permissions  and configurations. After enough practice runs, we felt confident that  it was ready to go. We created a single zip file which contained 5 BAK  files, and a T-SQL script. We handed them off to our lead database  administrator and he ran the scripts. Everything worked just as planned!&lt;/span&gt; &lt;br /&gt;&lt;h2&gt;&lt;span style="font-family: arial;"&gt;Cha-Ching!&lt;/span&gt;&lt;/h2&gt;&lt;div style="font-family: Arial;"&gt;At   the trade show, everything went off flawlessly! Customers attended our   booth and we, the development team, aided them directly in logging  into  the system and showcasing the new features we had worked so hard  to  develop. It was a very gratifying feeling to see how our improvised  plan  came together so well. Most importantly, we had succeeded in  mitigating  all risks to the money-generating production system, while  also  achieving the benefit of showcasing the new system to customers  with  real data. This was very exciting to them because they felt that  the new  features would greatly help them run their own businesses atop  our  platform.&lt;/div&gt;&lt;h2 style="font-family: Arial;"&gt;Phased Transition From Legacy to New&lt;/h2&gt;&lt;div style="font-family: Arial;"&gt;We   had now successfully demonstrated and validated the new, value-added   features directly with customers in person. This was a great success.   Yet, there was still much to do after the trade show. Features of lesser   prominence, those in the 300 other pages set still needed to be   developed and tested. This ended up taking a very long time, but we   ultimately cycled back to my original recommendation by adopting an   incremental replacement strategy.&lt;/div&gt;&lt;div style="font-family: Arial;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial;"&gt;&lt;b&gt;It worked like this:&lt;/b&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family: arial;"&gt;We deployed the new system to a new web server, named v2. &lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: arial;"&gt;The existing, v1 site, remained at www. &lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: arial;"&gt;We  provided a link from v1 to v2 in the header  of the v1 site, including  advertising the benefits of the new system,  but also including  disclaimers and calls for assistance in testing and  validating the  usability of the new system.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: arial;"&gt;This garnered a lot of early-adopters who helped find bugs and inconsistencies, all for free to us!&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: arial;"&gt;We monitored the usage patterns of v2 versus v1, to help estimate the load capacity under real-world conditions.&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family: arial;"&gt;Michael  Nygard's book "Release It!" proved  prophetic here. In his book he says  that "feature complete" is not the  same as "production ready."&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: arial;"&gt;We  learned this because the COM code had to be  completely replaced with  pure C# code since it could not stand up under  load using COM Interop.&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family: arial;"&gt;This result bore out my original advice to get the new features into production &lt;i&gt;&lt;b&gt;as soon as possible&lt;/b&gt;&lt;/i&gt; to monitor under real world conditions.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;li&gt;&lt;span style="font-family: arial;"&gt;We formally adopted Scrum and Agile practices by identifying business-driven priorities and working through them in sprints.&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family: arial;"&gt;We  did this by closely monitoring the  real-world usage of both the  existing v1 system and the v2 system and  focusing our effort first on  the highest traffic pages, such as  Viewing, Browsing, and Searching. Of  course, Bidding and Payment, while  producing less volume, were also  mission-critical.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: arial;"&gt;This focus allowed  us to prioritize properly. We  did not place inordinate emphasis on  automating the testing of all  areas of the system.&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family: arial;"&gt;For  example: we did not write Selenium test  suites for things like Help  Pages or Support Pages. Why? They are  seldom used! And, they generate no  revenue.&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family: arial;"&gt;Instead, we built comprehensive Selenium test suites for the Big Four: Viewing, Browsing &amp;amp; Searching, Bidding, and Payment.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;h2 style="font-family: Arial;"&gt;A Pleasant Surprise!&lt;/h2&gt;&lt;div style="font-family: Arial;"&gt;With   the site now operating both in legacy, classic mode at www, and in   "beta" mode at v2, the team began to actively monitor the new system's   health health and encourage more and more users to jump into using v2.   And, because we had focused on developing the   value-added My Auctions features in the very beginning of the project,   those features sat ready and willing to get into production! Our newest   member of the team, who joined about two years after those features  were  ready and "shelved", took it on his own initiative, to our delight, to start  building a  mobile version of the core My Auctions features using &lt;a href="http://asp.net/"&gt;ASP.NET&lt;/a&gt;  MVC and  the business objects that supported the My Auctions features.  He was  reluctant to show this prototype to the "higher ups", but the  rest of  our team encouraged him to do so. Within a few months, his  mobile  application was released into production before the global  "switchover",  described below, to the new system. A job well done!&lt;/div&gt;&lt;h2&gt;&lt;span style="font-family: arial;"&gt;Switching Over Right on Time for a Cool Billion Dollars&lt;/span&gt;&lt;/h2&gt;&lt;span style="font-family: arial;"&gt;Over   the course of more than a year, the team monitored the usage of v1 and   v2, and began to more aggressively push the late adopters and  stragglers into the new system. &lt;/span&gt;&lt;span style="font-family: arial;"&gt;Eventually a   "switchover" was made, and the v2 system took over the place of www. At   that point, there was now a link back to v1, which ran from a virtual   machine.&lt;/span&gt;&lt;span style="font-family: arial;"&gt; Several months after this, the VM was retired, and the v1 system, and all of its legacy COM, was no more.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;&lt;u&gt;&lt;i&gt;&lt;b&gt;Just  after the legacy  system was retired for good, the company celebrated  its 10th  anniversary and 1 billion dollars in sales volume!&lt;/b&gt;&lt;/i&gt;&lt;/u&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2 style="font-family: Arial;"&gt;Retrospective&lt;/h2&gt;&lt;span style="font-family: arial;"&gt;In   retrospect, I spent nearly three years working on this project and   learned a great deal! While I wish that the original plan of seeing the   entire migration take place "all at once" could have been successful, I   also am pleased that my original recommendation to take a  phased,  incremental, risk-mitigating, ROI-maximizing approach was very  sound.  Ultimately, that very approach became necessary due to the  "expected"  unexpected bumps along the road!&lt;/span&gt;&lt;br /&gt;&lt;h2&gt;&lt;span style="font-family: arial;"&gt;Application to Domains Seeking Non-Financial Returns&lt;/span&gt;&lt;/h2&gt;&lt;span style="font-family: arial;"&gt;I   understand that not all projects involve financial reward goals.  Before  I began working on the project just described, I worked for four  years  at the US Centers for Disease Control and Prevention. While  working  there, we were not seeking to generate financial  return-on-investment.  However, we did seek returns in the form of  utility and value to the  users and stakeholders of our systems. To  assess this properly, it was  critical to either observe the real users  working with the system or to  sit down with them and experience their  pain, frustration, and  sometimes: &lt;i&gt;&lt;b&gt;delight!&lt;/b&gt;&lt;/i&gt; Our team did  this regularly by  conducting evaluations, performing proficiency  testing, and through  coordinated multi-agency and stakeholder exercises  under simulated  public health emergency "war games". &lt;/span&gt;&lt;br /&gt;&lt;h2 style="font-family: Arial;"&gt;Tying This All Back to Agile&lt;/h2&gt;&lt;div style="font-family: Arial;"&gt;While   I've written more extensively on Agile in other posts on this blog,   this post has not been about the "mechanics" of agile so much as it has   been about the why. But, I want to look at just the first principle of   the Agile Manifesto and make a brief comment:&lt;/div&gt;&lt;div style="font-family: Arial;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial; text-align: center;"&gt;&lt;span style="font-size: medium;"&gt;Our highest priority is to satisfy the customer&lt;br /&gt;through early and continuous delivery&lt;br /&gt;of valuable software.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;One   might look at this principle and ask how can this be done when facing   the situation I originally faced that featured my own client asking not   for a continuous delivery model, but a "big bang" model? That's a very   good question, and it's not one that has any quick-fix answer. My best   advice here is that you need to learn the language and goals of both   your client and your client's ultimate customers. If your client values   financial returns, then ask him or her exactly what it is that  generates  financial returns.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;In my client's case, returns come in when more  people purchase items through his system. The next question should be: &lt;b&gt;&lt;i&gt;what is the shortest path we can take to increase that rate?&lt;/i&gt;&lt;/b&gt;   If the client answers that the shortest path is to rewrite the entire   system and deploy a big-bang upgrade, then you're going to have to keep   breaking that down into smaller and smaller value-added chunks. You   might have to suggest straw-men in terms of business-value if your   client will not prioritize by business value naturally. Ultimately, like   in this story, reality may bear down on the situation and if you have   done your best to incrementally develop the system in terms of business   value, then you can deliver value, upholding your end of the deal to  the  utmost of your ability within your realm of control. Sometimes  that's  the best you can do, until you run your own show!&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4441160589671124737-866629333222914345?l=agilefromthegroundup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilefromthegroundup.blogspot.com/feeds/866629333222914345/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilefromthegroundup.blogspot.com/2011/03/strangulation-pattern-of-choice-for.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4441160589671124737/posts/default/866629333222914345'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4441160589671124737/posts/default/866629333222914345'/><link rel='alternate' type='text/html' href='http://agilefromthegroundup.blogspot.com/2011/03/strangulation-pattern-of-choice-for.html' title='Strangulation: The Pattern of Choice for Misk Mitigating, ROI-Maximizing Agilists When Rewriting Legacy Systems'/><author><name>Joshua Gough</name><uri>http://www.blogger.com/profile/14059295487103799456</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://4.bp.blogspot.com/_tbvYmislW7g/TJq-X3TUxsI/AAAAAAAAAUY/cwhU2r77aLo/s1600-R/41544_560020440_8382_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-txhXpSY1Fag/TZFoml02RaI/AAAAAAAAAXg/3sXp5y91s00/s72-c/strangler.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4441160589671124737.post-3847295201929446706</id><published>2011-03-16T23:36:00.001-07:00</published><updated>2011-03-16T23:36:54.202-07:00</updated><title type='text'>Thoughts on www.MVCConf.com : Excellent</title><content type='html'>I started listening to some of the videos at &lt;a href="http://www.MVCConf.com"&gt;http://www.MVCConf.com&lt;/a&gt; today, including Scott Guthrie&amp;#39;s keynote and Glen Block&amp;#39;s lecture about WCF&amp;#39;s super-enhanced REST support. Glen now calls himself a &amp;quot;REST head&amp;quot;. Great!&lt;div&gt; &lt;br&gt;&lt;/div&gt;&lt;div&gt;The development of NuGet and Openwrap is really welcome to me. What must be 14 to 15 years ago now, when I started using PERL, I was very impressed by how well-oiled the machinery of CPAN was for installing packages and modules from the command line, even under Windows. When I started developing C# applications in 2001, I was very disappointed by the lack of a cohesive community of open-source packages available for Microsoft .NET. There have long been open-source projects. But, a package is different from a project. A package is shippable, deployable, consumable. I&amp;#39;m really happy to see this kind of thing coming into the .NET world.&lt;/div&gt; &lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;I don&amp;#39;t know where the credit goes, I&amp;#39;m sure it goes to many people. But, I definitely think a lot goes to Scott Guthrie for the enhanced openness that Microsoft has demonstrated in past years. I know from reading that this story also ties to Shawn Walker, the creator of DotNetNuke for his advanced forays into open-source based upon .NET.&lt;/div&gt; &lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Yes, I know the &amp;quot;entire stack&amp;quot; is not open-source, and that doesn&amp;#39;t bother me that much.&lt;/div&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4441160589671124737-3847295201929446706?l=agilefromthegroundup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilefromthegroundup.blogspot.com/feeds/3847295201929446706/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilefromthegroundup.blogspot.com/2011/03/thoughts-on-wwwmvcconfcom-excellent.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4441160589671124737/posts/default/3847295201929446706'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4441160589671124737/posts/default/3847295201929446706'/><link rel='alternate' type='text/html' href='http://agilefromthegroundup.blogspot.com/2011/03/thoughts-on-wwwmvcconfcom-excellent.html' title='Thoughts on www.MVCConf.com : Excellent'/><author><name>Josh Gough</name><uri>http://www.blogger.com/profile/13302284610870926934</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4441160589671124737.post-1344277968315024968</id><published>2010-09-05T00:13:00.001-07:00</published><updated>2010-09-05T23:07:37.727-07:00</updated><title type='text'>Aligning Business Requirements With Test-Driven-Development: Behavior-Driven-Development</title><content type='html'>&lt;div class="wlWriterHeaderFooter" style="float:none; margin:0px; padding:4px 0px 4px 0px;"&gt;&lt;iframe src="http://www.facebook.com/widgets/like.php?href=http://agilefromthegroundup.blogspot.com/2010/09/aligning-business-requirements-with.html" scrolling="no" frameborder="0" style="border:none; width:450px; height:80px"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;div class="zemanta-img"&gt;Test-Driven-Development (TDD) is a topic that has become ubiquitous within software development over the past ten years or so. What is somewhat lesser known at this point is a particular evolution of TDD into what Dan North and &lt;a class="zem_slink" title="Dave Astels" href="http://en.wikipedia.org/wiki/Dave_Astels" rel="wikipedia"&gt;Dave Astels&lt;/a&gt; have dubbed &lt;a class="zem_slink" title="Behavior Driven Development" href="http://en.wikipedia.org/wiki/Behavior_Driven_Development" rel="wikipedia"&gt;Behavior-Driven-Development&lt;/a&gt; (BDD). There are some specific problems with TDD that Dan and Dave have sought to correct by attempting to popularize BDD. This article will discuss some of the problems as well as some of the remedies.&lt;/div&gt;  &lt;div class="zemanta-img"&gt;&amp;#160;&lt;/div&gt;  &lt;div class="zemanta-img"&gt;While the stated goals of both TDD and BDD are similar, there are thought-process differences that should be understood by both technical developers and business people, including business analysts, project managers, product owners, and even CEOs. While one can philosophically argue that TDD “done right” is simply BDD anyway, I’ll trust North and Astels when they confidently state that the language people use is powerful and important and that is why they prefer to practice and speak of BDD now after years of experience.&lt;/div&gt;  &lt;div class="zemanta-img"&gt;&amp;#160;&lt;/div&gt;  &lt;h3&gt;Article Goal: Explain Why Businesses and Developers Might Want to Try BDD&lt;/h3&gt;  &lt;div class="zemanta-img"&gt;   &lt;br /&gt;This article will explain the distinctions between TDD and BDD and will show how using the BDD approach, as designed, should lead to:&lt;/div&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div class="zemanta-img"&gt;Reduced costs due to higher fidelity specifications and communications&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div class="zemanta-img"&gt;Reduced timelines due to less requirements churn and closer business and development alignment&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div class="zemanta-img"&gt;Increased productivity due to the executable nature of BDD specifications&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;Test-Driven-Development&lt;/h3&gt;  &lt;p&gt;As a working definition of Test-Driven-Development from &lt;a title="http://en.wikipedia.org/wiki/Test-driven_development" href="http://en.wikipedia.org/wiki/Test-driven_development"&gt;http://en.wikipedia.org/wiki/Test-driven_development&lt;/a&gt; is:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;“Test-Driven-Development (TDD) is a software development process that relies on the repetition of a very short development cycle: first the developer writes a failing automated test case that defines a desired improvement or new function, then produces code to pass that test and finally refactors the new code to acceptable standards. &lt;a class="zem_slink" title="Kent Beck" href="http://en.wikipedia.org/wiki/Kent_Beck" rel="wikipedia"&gt;Kent Beck&lt;/a&gt;, who is credited with having developed or 'rediscovered' the technique, stated in 2003 that TDD encourages simple designs and inspires confidence. &lt;/p&gt;    &lt;p&gt;Test-driven development is related to the test-first programming concepts of extreme programming, begun in 1999,[2] but more recently has created more general interest in its own right.”&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;a class="zem_slink" title="Scott Ambler" href="http://en.wikipedia.org/wiki/Scott_Ambler" rel="wikipedia"&gt;Scott Ambler&lt;/a&gt; also provides a great summary here: &lt;a title="http://www.agiledata.org/essays/tdd.html" href="http://www.agiledata.org/essays/tdd.html"&gt;http://www.agiledata.org/essays/tdd.html&lt;/a&gt;. &lt;/p&gt;  &lt;h5&gt;Test-Driven-Development Workflow Diagram&lt;/h5&gt;  &lt;p&gt;The mantra of Red, Green, Refactor is well-known by developers. It looks like this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_iiRWyargx_M/TINDIVIRLmI/AAAAAAAAAEo/s9JbLcEoczY/s1600-h/image%5B3%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_iiRWyargx_M/TINDIreRRJI/AAAAAAAAAEs/In7HR9QTBIk/image_thumb%5B1%5D.png?imgmax=800" width="384" height="736" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h5&gt;Why and When To Practice Test-Driven-Development&lt;/h5&gt;  &lt;p&gt;It’s important to look at the complete historical, and current context, of Test-Driven-Development to understand its most-appropriate, and less appropriate usage.&lt;/p&gt;  &lt;p&gt;Kent Beck, mentioned above as the most prominent formalizer of the practice, states this in his blog post “Where, Oh Where to Test?” at &lt;a title="http://www.threeriversinstitute.org/WhereToTest.html" href="http://www.threeriversinstitute.org/WhereToTest.html"&gt;http://www.threeriversinstitute.org/WhereToTest.html&lt;/a&gt;:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;“Cost, Stability, Reliability       &lt;br /&gt;&lt;/strong&gt;On reflection, I realized that level of abstraction was only a coincidental factor in deciding where to test. I identified three factors which influence where to write tests, factors which sometimes line up with level of abstraction, but sometimes not. These factors are cost, stability, and reliability.      &lt;br /&gt;      &lt;br /&gt;Cost is an important determiner of where to test, because tests are not essential to delivering value. The customer wants the system to run, now and after changes, and if I could achieve that without writing a single test they wouldn't mind a bit. The testing strategy that delivers the needed confidence at the least cost should win.      &lt;br /&gt;      &lt;br /&gt;Cost is measured both by the developer time required to write the tests and the time to execute them (which also boils down to developer time). Effective software design can reduce the cost of writing the tests by minimizing the surface area of the system. However, setting up a test of a whole system is likely to take longer than setting up a test of a single object, both in terms of developer time and CPU time.”&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;More recently, he clarified the historical context of TDD with his post “To Test or Not to Test? That’s a Good Question”: &lt;a href="http://www.threeriversinstitute.org/blog/?p=187"&gt;http://www.threeriversinstitute.org/blog/?p=187&lt;/a&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;“Turns out the eternal verities of software development are neither eternal nor verities. I’m speaking in this case of the role of tests.     &lt;br /&gt;      &lt;br /&gt;Once upon a time tests were seen as someone else’s job (speaking from a programmer’s perspective). Along came XP and said no, tests are everybody’s job, continuously. Then a cult of dogmatism sprang up around testing–if you can conceivably write a test you must.&lt;/p&gt;    &lt;p&gt;By insisting that I always write tests I learned that I can test pretty much anything given enough time. I learned that tests can be incredibly valuable technically, psychologically, socially, and economically. However, until recently there was an underlying assumption to my strategy that I wasn’t really clear about.”&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;In this post, Kent goes on to state this about a product he developed called JUnit Max:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;“When I started JUnit Max it slowly dawned on me that the rules had changed. The killer question was (is), “What features will attract paying customers?” By definition this is an unanswered question. If JUnit (or any other free-as-in-beer package) implements a feature, no one will pay for it in Max.&lt;/p&gt;    &lt;p&gt;Success in JUnit Max is defined by bootstrap revenue: more paying users, more revenue per users, and/or a higher viral coefficient. Since, per definition, the means to achieve success are unknown, what maximizes the chance for success is trying lots of experiments and incorporating feedback from actual use and adoption.”&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;He later continues:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;“When I started Max I didn’t have any automated tests for the first month. I did all of my testing manually. After I got the first few subscribers I went back and wrote tests for the existing functionality. Again, I think this sequence maximized the number of validated experiments I could perform per unit time. With little or no code, no tests let me start faster (the first test I wrote took me almost a week). Once the first bit of code was proved valuable (in the sense that a few of my friends would pay for it), tests let me experiment quickly with that code with confidence.&lt;/p&gt;    &lt;p&gt;Whether or not to write automated tests requires balancing a range of factors. Even in Max I write a fair number of tests. If I can think of a cheap way to write a test, I develop every feature acceptance-test-first. Especially if I am not sure how to implement the feature, writing a test gives me good ideas. When working on Max, the question of whether or not to write a test boils down to whether a test helps me validate more experiments per unit time. It does, I write it. If not, damn the torpedoes. I am trying to maximize the chance that I’ll achieve wheels-up revenue for Max. The reasoning around design investment is similarly complicated, but again that’s the topic for a future post.&lt;/p&gt;    &lt;p&gt;Some day Max will be a long game project, with a clear scope and sustainable revenue. Maintaining flexibility while simultaneously reducing costs will take over as goals. Days invested in one test will pay off. Until then, I need to remember to play the short game.”&lt;/p&gt; &lt;/blockquote&gt;  &lt;h5&gt;Analysis of Kent Beck’s Cost-Benefit Based Strategy&lt;/h5&gt;  &lt;p&gt;If you read Kent’s posts carefully you will see that he made careful cost-benefit analyses whenever he decided to use or not use a TDD approach. When he developed JUnit Max, he chose to get the product features to the market as soon as he could, and then once he had an idea what customers wanted, he stabilized many of those features with tests.&lt;/p&gt;  &lt;p&gt;So, what motivated Kent was a practical, reasonable, and important concern: &lt;strong&gt;financial viability&lt;/strong&gt; and &lt;strong&gt;return-on-investment&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;I thik it’s very important to be fully aware of these factors when deciding when and where to use TDD in any project. One of the main drivers of agile or Lean thinking is to optimize the whole, not necessarily individual parts all at once. Because of this, one must think about the larger context of a project.&lt;/p&gt;  &lt;h5&gt;Financial Investment Necessitates a Nuanced Approach to Development Practices&lt;/h5&gt;  &lt;p&gt;When thinking about the larger context, it’s easy for a developer to say something like: “We need this code to be well-factored, test-driven, and easy to maintain.” While this absolutely should be the goal of a developer, developers must also be cognizant of the larger context. Almost always, that larger context is that there is a financial investment in the project and the project’s success.&amp;#160; &lt;strong&gt;And, overwhelmingly more often than not, there is a specific timeline involved.&lt;/strong&gt; &lt;strong&gt;&lt;em&gt;Thus, it cannot ever be solely the developer’s responsibility to set the acceptance criteria for a system’s completion or its acceptable level of quality.&lt;/em&gt;&lt;/strong&gt; Developers and project managers must present risks and tradeoffs to business stakeholders and collaborate to deliver value that is sufficient and as risk-averse as is necessary to the business stakeholders.&lt;/p&gt;  &lt;h5&gt;Finding the Correct Balance Takes Careful Thought and Collaboration&lt;/h5&gt;  &lt;p&gt;I cannot give specific recommendations in this article about any particular situation. Rather, I would recommend that all risks and tradeoffs be written down, categorized, and reviewed with key stakeholders in an open and honest fashion. If a product owner would favor a simpler, less glitzy UI in favor of core, sound, well-tested and stable backend services, then the team must focus on delivering this. On the other hand, if a product owner says that customers will be turned off by a UI that is vapid and barren, then the team must work hard to achieve that. &lt;/p&gt;  &lt;p&gt;Building the correct features of any system is, as Kent Beck mentions, a very experimental process when the goal is not known. Because of this, it’s important to use practices that help in driving toward the correct features in the quickest fashion. Sometimes that approach is careful, stict adherence to TDD. Sometimes it is not. &lt;strong&gt;It takes judgement and careful balancing of all factors between business people and technical people to make the correct decisions.&lt;/strong&gt;&lt;/p&gt;  &lt;h5&gt;Problems That Teams Can Face When Practicing TDD&lt;/h5&gt;  &lt;p&gt;In my experience, projects can get into trouble when project leaders do not make these nuanced decisions about TDD that require careful understanding, analysis, and collaboration amongst the entire team. In a project without a schedule, then it might make sense to practice a strict form of TDD. In projects that have specific dates set in stone, a team must make decisions about when and where to apply strict TDD and when and where to accept technical debt in order to meet those dates.&lt;/p&gt;  &lt;h3&gt;Delivering Business Value and Mitigating Project Risk Through Behavior-Driven-DevelSopment&lt;/h3&gt;  &lt;p&gt;It might come as no surprise by the title of this article, that others much more learned in these practices and problems than I have sought remedies. Namely, Dan North and Dave Astels have written and presented widely on Behavior-Driven-Development (BDD) and its close aligntment to business success criteria. The rest of this article will introduce BDD and provide links to sites, videos, presentations, and a sample project in .NET by Rajesh Pillali that provide extensive information.&lt;/p&gt;  &lt;h3&gt;Introducing Behavior-Driven-Development&lt;/h3&gt;  &lt;p&gt;As stated on &lt;a href="http://behavior-driven.org/"&gt;http://behavior-driven.org&lt;/a&gt;, the definition of BDD is:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;“Behaviour-Driven Development (BDD) is an evolution in the thinking behind &lt;a href="http://behaviour-driven.org/TestDrivenDevelopment"&gt;Test-Driven-Development&lt;/a&gt; and &lt;a href="http://behaviour-driven.org/AcceptanceTestDrivenPlanning"&gt;Acceptance-Test-Driven-Planning&lt;/a&gt;. &lt;/p&gt;    &lt;p&gt;It brings together strands from &lt;a href="http://behaviour-driven.org/TestDrivenDevelopment"&gt;Test-Driven-Development&lt;/a&gt; and &lt;a href="http://behaviour-driven.org/DomainDrivenDesign"&gt;Domain-Driven-Design&lt;/a&gt; into an integrated whole, making the relationship between these two powerful approaches to software development more evident. &lt;/p&gt;    &lt;p&gt;It aims to help focus development on the delivery of prioritised, verifiable business value by providing a common vocabulary (also referred to as a &lt;a href="http://behaviour-driven.org/UbiquitousLanguage"&gt;Ubiquitous Language&lt;/a&gt;) that spans the divide between Business and Technology.”&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Dan North’s original formulation of BDD is here: &lt;a title="http://blog.dannorth.net/introducing-bdd/" href="http://blog.dannorth.net/introducing-bdd/"&gt;http://blog.dannorth.net/introducing-bdd/&lt;/a&gt;. Dave Astels clearly explains it more succinctly in his own article here: &lt;a title="http://techblog.daveastels.com/files/BDD_Intro.pdf" href="http://techblog.daveastels.com/files/BDD_Intro.pdf"&gt;http://techblog.daveastels.com/files/BDD_Intro.pdf&lt;/a&gt;&lt;/p&gt;  &lt;h4&gt;Business Analysts Write Executable Specifications When Teams Practice Behavior Driven Development&lt;/h4&gt;  &lt;p&gt;Here is an example BDD feature specification from the SpecFlow project’s web site:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_iiRWyargx_M/TIPFaQjA-vI/AAAAAAAAAEw/O79F9gIxB_4/s1600-h/image%5B7%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_iiRWyargx_M/TIPFaonT78I/AAAAAAAAAE0/0aydWwQ_k1E/image_thumb%5B3%5D.png?imgmax=800" width="517" height="331" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;There are other “Steps” in the worflow, but here is how the ultimate fulfillment of that specification gets executed and measured:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_iiRWyargx_M/TIPFam_IcVI/AAAAAAAAAE4/oXIIH8w3COs/s1600-h/image%5B11%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_iiRWyargx_M/TIPFa7qfFzI/AAAAAAAAAE8/i8A8C5_HRUs/image_thumb%5B5%5D.png?imgmax=800" width="596" height="435" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h3&gt;TODO:&lt;/h3&gt;  &lt;p&gt;Complete article&lt;/p&gt;  &lt;h3&gt;Complete Examples&lt;/h3&gt;  &lt;p&gt;Rajesh Pillali provides an excellent article on CodeProject here: &lt;a title="http://www.codeproject.com/KB/architecture/BddWithSpecFlow.aspx" href="http://www.codeproject.com/KB/architecture/BddWithSpecFlow.aspx"&gt;http://www.codeproject.com/KB/architecture/BddWithSpecFlow.aspx&lt;/a&gt;&lt;/p&gt;  &lt;div class="zemanta-pixie"&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4441160589671124737-1344277968315024968?l=agilefromthegroundup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilefromthegroundup.blogspot.com/feeds/1344277968315024968/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilefromthegroundup.blogspot.com/2010/09/aligning-business-requirements-with.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4441160589671124737/posts/default/1344277968315024968'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4441160589671124737/posts/default/1344277968315024968'/><link rel='alternate' type='text/html' href='http://agilefromthegroundup.blogspot.com/2010/09/aligning-business-requirements-with.html' title='Aligning Business Requirements With Test-Driven-Development: Behavior-Driven-Development'/><author><name>Josh Gough</name><uri>http://www.blogger.com/profile/13302284610870926934</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_iiRWyargx_M/TINDIreRRJI/AAAAAAAAAEs/In7HR9QTBIk/s72-c/image_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4441160589671124737.post-1803620833361889798</id><published>2010-09-04T23:21:00.001-07:00</published><updated>2010-09-04T23:50:11.671-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Business Value'/><category scheme='http://www.blogger.com/atom/ns#' term='DDD'/><category scheme='http://www.blogger.com/atom/ns#' term='Architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='CQRS'/><title type='text'>Retrospective of Greg Young’s Final CQRS and DDD Online Course</title><content type='html'>&lt;div class="wlWriterHeaderFooter" style="float:none; margin:0px; padding:4px 0px 4px 0px;"&gt;&lt;iframe src="http://www.facebook.com/widgets/like.php?href=http://agilefromthegroundup.blogspot.com/2010/09/retrospective-of-greg-youngs-final-cqrs.html" scrolling="no" frameborder="0" style="border:none; width:450px; height:80px"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;p&gt;I woke up at 4 am so that I could virtually attend via LiveMeeting &lt;a href="http://codebetter.com/blogs/gregyoung/default.aspx"&gt;Greg Young’s&lt;/a&gt; final online CQRS and DDD course. While I had some sound issues and had to keep coming back into the session, I can still say: Wow! Greg’s knowledge is excellent and his presentation was great.&lt;/p&gt;  &lt;p&gt;You can watch him deliver a similar talk at this Skillsmatter podcast about the business perspectives of this architecture: &lt;a title="http://skillsmatter.com/podcast/open-source-dot-net/greg-young-cqrs-event-sourcing-the-business-perspecive" href="http://skillsmatter.com/podcast/open-source-dot-net/greg-young-cqrs-event-sourcing-the-business-perspecive"&gt;http://skillsmatter.com/podcast/open-source-dot-net/greg-young-cqrs-event-sourcing-the-business-perspecive&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;It’s easiest these days for me to learn visually, so in review, here are a couple of slides from another blogger, &lt;a href="http://geekswithblogs.net/Optikal/archive/2010/06/08/140287.aspx"&gt;Dylan Smyth&lt;/a&gt;, who blogged about this that summarize the distinction between a CQRS style architecture and a more typical stack:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_iiRWyargx_M/TIM287M8B5I/AAAAAAAAAEQ/Qap3D3MjbiI/s1600-h/image3.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="image" border="0" alt="image" align="left" src="http://lh3.ggpht.com/_iiRWyargx_M/TIM29FWLpKI/AAAAAAAAAEU/2mBZbTcCXDw/image_thumb1.png?imgmax=800" width="756" height="280" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://abdullin.com/cqrs"&gt;Rinat Abdullin has a great diagram&lt;/a&gt; on his own blog depicting what Greg also calls the Task-Driven UI:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_iiRWyargx_M/TIM9oTtgbsI/AAAAAAAAAEg/D81DvqQWcng/s1600-h/image%5B8%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_iiRWyargx_M/TIM9ogyUyoI/AAAAAAAAAEk/FV5a2ssxqf0/image_thumb%5B3%5D.png?imgmax=800" width="479" height="587" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;To summarize in my own, short, words:&lt;/p&gt;  &lt;h2&gt;Typical Architecture&lt;/h2&gt;  &lt;p&gt;On the left side we have the “typical” architecture which has this kind of interaction model:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;User clicks a button in a client.&lt;/li&gt;    &lt;li&gt;Client issues a request to the server, asking for Product with ID 50, for example.&lt;/li&gt;    &lt;li&gt;Server fetches an entity for Product with ID 50.&lt;/li&gt;    &lt;li&gt;Server creates a DTO from this entity and sends it to the client.&lt;/li&gt;    &lt;li&gt;The client modifies this DTO.&lt;/li&gt;    &lt;li&gt;Client ships the modified DTO back to the server for an update.&lt;/li&gt; &lt;/ol&gt;  &lt;h2&gt;CQRS Architecture&lt;/h2&gt;  &lt;p&gt;He contrasts that the right side, which he says may appear at first to be more complex, but it actually turns out to be simpler and less costly because of the Thin Read Layer in which the operations are optimized for read, not write. This means the translation from data to DTO occurs directly here. &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;User clicks a button in a client.&lt;/li&gt;    &lt;li&gt;Client issues a read request to the server, asking for Product with ID 50.&lt;/li&gt;    &lt;li&gt;Server fetches the data for Product with ID 50.&lt;/li&gt;    &lt;li&gt;Server creates a DTO from this entity and sends it to the client.&lt;/li&gt;    &lt;li&gt;The client operates on a screen and issues a Command to the server, which is not equivalent with sending a modified DTO back to the server.&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;An important note here is that the &amp;quot;Event Store” is where the commands are serialized, which does not have to be in a relational database. The De-Normalized Data Cache is where a “view” of data created and stored as a result of the Events being stored.&lt;/p&gt;  &lt;h2&gt;CQRS Diagram&lt;/h2&gt;  &lt;p&gt;This is an image that Udi Dahan uses to describe CQRS &lt;a href="http://www.udidahan.com/2009/12/09/clarified-cqrs/"&gt;in his own post Clarified CQRS&lt;/a&gt;:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_iiRWyargx_M/TIM29SxofVI/AAAAAAAAAEY/4y0G4gsNE-c/s1600-h/image%5B4%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_iiRWyargx_M/TIM29rfyNyI/AAAAAAAAAEc/R9rkAsbkFmQ/image_thumb%5B1%5D.png?imgmax=800" width="504" height="323" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h2&gt;Domain-Driven-DESIGN&lt;/h2&gt;  &lt;p&gt;He also discussed Domain-Driven-Design after talking about CQRS, but unfortunately I did not hear all of that. &lt;/p&gt;  &lt;h2&gt;Recommend Resources&lt;/h2&gt;  &lt;p&gt;In addition to the Skillsmatter podcast above, here are some other recommended links about CQRS:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Super Simple CQRS Example from Greg Young: &lt;a title="http://codebetter.com/blogs/gregyoung/archive/2010/08/31/super-simple-cqrs-example.aspx" href="http://codebetter.com/blogs/gregyoung/archive/2010/08/31/super-simple-cqrs-example.aspx"&gt;http://codebetter.com/blogs/gregyoung/archive/2010/08/31/super-simple-cqrs-example.aspx&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;Clarified CQRS, Udi Dahan: &lt;a title="http://www.udidahan.com/2009/12/09/clarified-cqrs/" href="http://www.udidahan.com/2009/12/09/clarified-cqrs/"&gt;http://www.udidahan.com/2009/12/09/clarified-cqrs/&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;Udi Dahan on CQRS, DDD, and NServiceBus: &lt;a title="http://www.infoq.com/interviews/dahan-cqrs-ddd-nservicebus" href="http://www.infoq.com/interviews/dahan-cqrs-ddd-nservicebus"&gt;http://www.infoq.com/interviews/dahan-cqrs-ddd-nservicebus&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;Command-Query Responsibility Segregation, interview with Udi Dahan: &lt;a title="http://www.infoq.com/presentations/Command-Query-Responsibility-Segregation" href="http://www.infoq.com/presentations/Command-Query-Responsibility-Segregation"&gt;http://www.infoq.com/presentations/Command-Query-Responsibility-Segregation&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;Greg Young Discusses State Transitions in Domain-Driven Design and DDD Best Practices: &lt;a title="http://www.infoq.com/interviews/greg-young-ddd" href="http://www.infoq.com/interviews/greg-young-ddd"&gt;http://www.infoq.com/interviews/greg-young-ddd&lt;/a&gt;&lt;/li&gt; &lt;/ol&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4441160589671124737-1803620833361889798?l=agilefromthegroundup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilefromthegroundup.blogspot.com/feeds/1803620833361889798/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilefromthegroundup.blogspot.com/2010/09/retrospective-of-greg-youngs-final-cqrs.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4441160589671124737/posts/default/1803620833361889798'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4441160589671124737/posts/default/1803620833361889798'/><link rel='alternate' type='text/html' href='http://agilefromthegroundup.blogspot.com/2010/09/retrospective-of-greg-youngs-final-cqrs.html' title='Retrospective of Greg Young’s Final CQRS and DDD Online Course'/><author><name>Josh Gough</name><uri>http://www.blogger.com/profile/13302284610870926934</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_iiRWyargx_M/TIM29FWLpKI/AAAAAAAAAEU/2mBZbTcCXDw/s72-c/image_thumb1.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4441160589671124737.post-2993505701536195276</id><published>2010-08-12T20:30:00.000-07:00</published><updated>2010-08-12T20:59:28.456-07:00</updated><title type='text'>Review: Learning From Five Years as a Skype Architect</title><content type='html'>There is an excellent presentation Andres Kutt recorded at QCon London 2010 about lessons learned from working for fives years as an architect within Skype. Here's the link and full description:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.infoq.com/presentations/Learning-from-Five-Years-Skype%20"&gt;http://www.infoq.com/presentations/Learning-from-Five-Years-Skype &lt;/a&gt;&lt;br /&gt;&lt;blockquote&gt;"Andres Kutt discusses his experience as architect at Skype for five  years, sharing some of the lessons learned: rules of thumb do not always  apply, functionality is important, use simple solutions, buzzwords are  dangerous, the architecture needs to fit into the organization, and  communication is important.      &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Bio&lt;/b&gt;      &lt;br /&gt;Andres Kutt has been with Skype since 2005, leading a growing team  of architects. Before that, he worked as IT Deputy Director General for  the Estonian Tax and Customs Board, and as a free consultant for  financial institutions."&lt;/blockquote&gt;&lt;span style="font-size: large;"&gt;Review&lt;/span&gt; &lt;br /&gt;I love his comment at 36 minutes that "80% of what an architect does is communicate". This is so true and important to realize, but not all architects excel at communication. This can cause significant problems on projects. As a steward of the conceptual and functional integrity of a system, the architect must strive to understand and distill the core standards, interfaces, components, connectors, and unifying concepts of the system to the rest of the technical team. They also must be able to speak to business people and other stakeholders using non-jargon language that speaks to the underlying concerns of budgets, ROI, risk management, etc.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Key Points&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;&amp;nbsp;Rules of Thumb Do Not Apply&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;His example is that he joined Skype with the belief that "You do not put business logic in the database", but he learned about the Postgre database Skype uses and the distributed cluster and how the team there actually modified the Postgre source code to suit their needs. As a result, he no longer worries about business logic in the database.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;b&gt;Functional Architecture is Important&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt; He says that at least every nine months he gets the whole team together to sit down and all diagram the architecture together and find the problems and fix those problems by analysis and refactoring.&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Usually the architecture remains the same, but they fix problems and remove single points of failure.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Unfortunately, he says, many times architects get caught up in the finer grained details of technical implementation architecture.&lt;/li&gt;&lt;li&gt;In his experience, ugly functional architecture always leads to ugly technical architecture.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;b&gt;Simple things work. &lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;"When something takes more than three sentences to explain, it usually doesn't work"&lt;/li&gt;&lt;li&gt;"Always remove all the functionality that is not necessary"&lt;/li&gt;&lt;li&gt;"Always chop things up"&lt;/li&gt;&lt;li&gt;He gives the example of SOAP being bloated and overly complicated. Instead of SOAP, Skype uses REST.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;b&gt;Complicated things do not work well.&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;He says if you're architecture is getting too complicated you are doing something wrong.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;b&gt;Buzzwords are dangerous.&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;His example is "Cloud Computing"&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Instead of resorting to "buzzwords" or being either awed or fearful of them, seek to understand the motivations behind buzzwords when people use them. What benefits are they interested and what about that buzzword makes them think it will deliver those benefits?&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;li&gt;&lt;b&gt;You are there to solve business problems, not the most beautiful, perfect system ever.&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;He says to not take on technical debt that will cripple the business.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Talk to people in order to understand and discover requirements&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Don't expect them to trust you or your team without you trusting them and the business goals they have.&lt;/li&gt;&lt;li&gt;Also do not expect teams to magically understand requirements if they are not also talking with product folks.&lt;/li&gt;&lt;ul&gt;&lt;li&gt;UML diagrams do not help much&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;span style="font-size: large;"&gt;Comments&lt;/span&gt; &lt;br /&gt;The observations Andres makes are right on the money. I've been on so many projects, or went through periods of time on projects, where it seemed like too much management was going on. Managers, by their nature, desire to control and predict everything. They often feel that by limiting the time that one "role" of person, be they BA, QA, TA, DEV, PO, etc need to talk to each other the better the results "should be" and the faster functions "should" get delivered. These managers tend toward thinking of a "pipeline" mentality, such as:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Product Owners and Business Analysts, with the assistance of Technical Architects define functional requirements&lt;/li&gt;&lt;li&gt;Developers and QA then create tasks and test cases to implement these.&lt;/li&gt;&lt;li&gt;And, while the Developers and QA are working, the PO, BA, and TA continue to work on "what's coming next".&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;While it is a natural and admirable goal that the firsts step above should produce requirements documents and wireframes that are perfectly defined and perfectly refined state of readiness for Developers and QA to implement, it seldom happens this well.&lt;br /&gt;&lt;br /&gt;Scott Ambler has a great chart about communications in software projects in this article: http://www.agilemodeling.com/essays/communication.htm.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_iiRWyargx_M/TGTBwj-saKI/AAAAAAAAAD8/YtHguoH264Q/s1600/communicationModes.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="345" src="http://1.bp.blogspot.com/_iiRWyargx_M/TGTBwj-saKI/AAAAAAAAAD8/YtHguoH264Q/s400/communicationModes.gif" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;For me personally, I saw this recently in a project. We were facing several "unknowns" in our requirements that were effecting me and other developers. We quickly gathered several developers, QA folks, and business analysts together. We had started with a whiteboard, getting everyone to focus on shaping the common language and understanding of the problems at hand, but quickly moved to a notepad instance and simple bullet lists. Everyone quickly reached consensus within five minutes of discussion. We all walked away with a common understanding and greater confidence in the requirements.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;ul&gt;&lt;ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4441160589671124737-2993505701536195276?l=agilefromthegroundup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilefromthegroundup.blogspot.com/feeds/2993505701536195276/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilefromthegroundup.blogspot.com/2010/08/review-learning-from-five-years-as-skye.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4441160589671124737/posts/default/2993505701536195276'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4441160589671124737/posts/default/2993505701536195276'/><link rel='alternate' type='text/html' href='http://agilefromthegroundup.blogspot.com/2010/08/review-learning-from-five-years-as-skye.html' title='Review: Learning From Five Years as a Skype Architect'/><author><name>Josh Gough</name><uri>http://www.blogger.com/profile/13302284610870926934</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_iiRWyargx_M/TGTBwj-saKI/AAAAAAAAAD8/YtHguoH264Q/s72-c/communicationModes.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4441160589671124737.post-2479355126658996715</id><published>2009-12-31T11:56:00.001-08:00</published><updated>2009-12-31T12:18:44.465-08:00</updated><title type='text'>Agile Software Construction is Like Neighborhood Construction</title><content type='html'>&lt;p&gt;In my &lt;a href="http://agilefromthegroundup.blogspot.com/2009/12/review-software-development-practices.html" target="_blank"&gt;last article&lt;/a&gt;, I commented on Dr. Jan Chong's dissertation presentation &amp;quot;&lt;a href="http://www.researchchannel.org/prog/displayevent.aspx?rID=16075&amp;amp;fID=4113" target="_blank"&gt;Software Development Practices and Knowledge Sharing: A Comparison of XP and Waterfall Team Behaviors&lt;/a&gt;&amp;quot;. I raised some questions about the utility of long-term design documents and provided links to Scott Ambler and Mary Poppendieck's writings about unit tests and automated tests as a form of long-term &lt;a href="http://www.agilemodeling.com/essays/executableSpecifications.htm" target="_blank"&gt;executable specifications&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;In this article, I'm going to give a better version of an often heard analogy that &amp;quot;Software construction is like building construction&amp;quot;. Usually you hear this when product owners, project managers, or architects say things like, &lt;strong&gt;&amp;quot;We can't do that until we've got the foundation in place. Think of a building. You have to have a solid foundation first.&amp;quot;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;OK. Maybe so, but you only need it for the very first &lt;strong&gt;&lt;em&gt;independent feature, and you should be building features as independently as you can.&lt;/em&gt;&lt;/strong&gt; Here's why:&lt;/p&gt;  &lt;h1&gt;The Simple Building to Software Analogy&lt;/h1&gt;  &lt;p&gt;Here is a simplified one-to-one comparison that maps the &amp;quot;layers&amp;quot; of a building to the layers of a software application:&lt;/p&gt;  &lt;table border="1" cellspacing="0" cellpadding="2" width="400"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="199"&gt;&lt;strong&gt;&lt;u&gt;Building Component&lt;/u&gt;&lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top" width="199"&gt;&lt;strong&gt;&lt;u&gt;Software Component&lt;/u&gt;&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="199"&gt;Furnishings&lt;/td&gt;        &lt;td valign="top" width="199"&gt;User Interface Layer&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="199"&gt;Internal Structure&lt;/td&gt;        &lt;td valign="top" width="199"&gt;Business Logic Layer&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="199"&gt;External Structure&lt;/td&gt;        &lt;td valign="top" width="199"&gt;Data Access Layer&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="199"&gt;Foundation&lt;/td&gt;        &lt;td valign="top" width="199"&gt;Database&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="199"&gt;Blueprints&lt;/td&gt;        &lt;td valign="top" width="200"&gt;Requirements Specifications&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;h1&gt;Traditional Versus Agile Software Development&lt;/h1&gt;  &lt;p&gt;To prepare my final point, I present the following two slides come from the &lt;a href="http://www.autumnofagile.net" target="_blank"&gt;Autumn of Agile&lt;/a&gt; screen-cast series mentioned in prior posts.&lt;/p&gt;  &lt;p&gt;This first slide depicts the traditional sequential waterfall approach to building an application. The main theme is that waterfall projects typically result in teams developing &lt;strong&gt;horizontal layers&lt;/strong&gt; that end up delivering business value only after all layers are complete.&lt;/p&gt;  &lt;p&gt;&lt;img alt="[image[3].png]" src="http://lh3.ggpht.com/_iiRWyargx_M/SxxV-nhs89I/AAAAAAAAABU/u_nb_t2wHtQ/s1600/image%5B3%5D.png" /&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;This next slide depicts how agile (or simply iterative &amp;amp; incremental) projects develop systems. The main idea here is that features are developed &lt;strong&gt;vertically&lt;/strong&gt;. This means that the features are independently valuable, and can represent a portion of the total desired value at any time should the project schedule get cut short.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;img alt="image" src="http://lh5.ggpht.com/_iiRWyargx_M/SxxV_0Gp6EI/AAAAAAAAABg/e-N0-M0U-Sc/image_thumb%5B3%5D.png?imgmax=800" /&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h2&gt;Neighborhoods Get Built Using Agile, Not Waterfall&lt;/h2&gt;  &lt;p&gt;Let's assume we have 5 total features in the software system depicted in slides one and two. In the first slide, all 5 features are &amp;quot;finished&amp;quot; at the same time when the user-interface is built on top of the lower layers. In the second slide, a single feature is built from &amp;quot;top to bottom&amp;quot; during each iteration.&lt;/p&gt;  &lt;h3&gt;Can You Say Fffired?&lt;/h3&gt;  &lt;p&gt;Imagine a team of developers building a neighborhood like the traditional sequential waterfall approach to building software. Let's assume each iteration is 5 weeks for simplicity's sake. After 5 weeks, the developers would have built 5 separate sets of blueprints for the 5 houses to be built. Imagine that these are 5 or more separate parts of an overall software requirements specification in a software development project. They might describe database table schemas, relationships, multiplicities, etc.&lt;/p&gt;  &lt;table border="1" cellspacing="0" cellpadding="2" width="648"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="82"&gt;&amp;#160;&lt;/td&gt;        &lt;td valign="top" width="92"&gt;         &lt;p align="center"&gt;&lt;strong&gt;&lt;u&gt;Week 1&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="91"&gt;         &lt;p align="center"&gt;&lt;strong&gt;&lt;u&gt;Week 2&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="91"&gt;         &lt;p align="center"&gt;&lt;strong&gt;&lt;u&gt;Week 3&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="91"&gt;         &lt;p align="center"&gt;&lt;strong&gt;&lt;u&gt;Week 4&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="83"&gt;         &lt;p align="center"&gt;&lt;strong&gt;&lt;u&gt;Week 5&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="116"&gt;         &lt;p align="center"&gt;&lt;strong&gt;&lt;u&gt;Elapsed Weeks&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="83"&gt;         &lt;p align="center"&gt;&lt;strong&gt;&lt;u&gt;Iteration 5&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="92"&gt;         &lt;p align="center"&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="91"&gt;         &lt;p align="center"&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="91"&gt;         &lt;p align="center"&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="91"&gt;         &lt;p align="center"&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="85"&gt;         &lt;p align="center"&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="115"&gt;         &lt;p align="center"&gt;25&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="83"&gt;         &lt;p align="center"&gt;&lt;strong&gt;&lt;u&gt;Iteration 4&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="92"&gt;         &lt;p align="center"&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="91"&gt;         &lt;p align="center"&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="91"&gt;         &lt;p align="center"&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="91"&gt;         &lt;p align="center"&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="86"&gt;         &lt;p align="center"&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="115"&gt;         &lt;p align="center"&gt;20&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="83"&gt;         &lt;p align="center"&gt;&lt;strong&gt;&lt;u&gt;Iteration 3&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="92"&gt;         &lt;p align="center"&gt;&lt;strong&gt;&lt;u&gt;&amp;#160;&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="91"&gt;         &lt;p align="center"&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="91"&gt;         &lt;p align="center"&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="91"&gt;         &lt;p align="center"&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="87"&gt;         &lt;p align="center"&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="115"&gt;         &lt;p align="center"&gt;15&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="83"&gt;         &lt;p align="center"&gt;&lt;strong&gt;&lt;u&gt;Iteration 2&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="92"&gt;         &lt;p align="center"&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="91"&gt;         &lt;p align="center"&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="91"&gt;         &lt;p align="center"&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="91"&gt;         &lt;p align="center"&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="88"&gt;         &lt;p align="center"&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="114"&gt;         &lt;p align="center"&gt;10&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="83"&gt;         &lt;p align="center"&gt;&lt;strong&gt;&lt;u&gt;Iteration 1&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="91"&gt;         &lt;p align="center"&gt;Blueprints&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="91"&gt;         &lt;p align="center"&gt;Blueprints&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="91"&gt;         &lt;p align="center"&gt;Blueprints&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="91"&gt;         &lt;p align="center"&gt;Blueprints&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="88"&gt;         &lt;p align="center"&gt;Blueprints&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="114"&gt;         &lt;p align="center"&gt;5&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;I'm sure you already see how asinine this approach to neighborhood development is.&lt;/p&gt;  &lt;p&gt;Nevertheless, let's continue with the next 5 weeks and see how far our team has gotten toward delivering the first &amp;quot;potentially habitable housing increment&amp;quot;:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;table border="1" cellspacing="0" cellpadding="2" width="645"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="76"&gt;&amp;#160;&lt;/td&gt;        &lt;td valign="top" width="95"&gt;         &lt;p align="center"&gt;&lt;strong&gt;&lt;u&gt;Week 1&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="94"&gt;         &lt;p align="center"&gt;&lt;strong&gt;&lt;u&gt;Week 2&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="98"&gt;         &lt;p align="center"&gt;&lt;strong&gt;&lt;u&gt;Week 3&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="94"&gt;         &lt;p align="center"&gt;&lt;strong&gt;&lt;u&gt;Week 4&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="83"&gt;         &lt;p align="center"&gt;&lt;strong&gt;&lt;u&gt;Week 5&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="103"&gt;         &lt;p align="center"&gt;&lt;strong&gt;&lt;u&gt;Elapsed Weeks&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="76"&gt;         &lt;p align="center"&gt;&lt;strong&gt;&lt;u&gt;Iteration 5&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="95"&gt;         &lt;p align="center"&gt;&amp;#160;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="93"&gt;         &lt;p align="center"&gt;&amp;#160;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="98"&gt;         &lt;p align="center"&gt;&amp;#160;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="94"&gt;         &lt;p align="center"&gt;&amp;#160;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="87"&gt;         &lt;p align="center"&gt;&amp;#160;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="102"&gt;         &lt;p align="center"&gt;25&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="75"&gt;         &lt;p align="center"&gt;&lt;strong&gt;&lt;u&gt;Iteration 4&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="94"&gt;         &lt;p align="center"&gt;&amp;#160;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="93"&gt;         &lt;p align="center"&gt;&amp;#160;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="97"&gt;         &lt;p align="center"&gt;&amp;#160;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="94"&gt;         &lt;p align="center"&gt;&amp;#160;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="89"&gt;         &lt;p align="center"&gt;&amp;#160;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="101"&gt;         &lt;p align="center"&gt;20&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="75"&gt;         &lt;p align="center"&gt;&lt;strong&gt;&lt;u&gt;Iteration 3&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="94"&gt;         &lt;p align="center"&gt;&lt;strong&gt;&lt;u&gt;&lt;/u&gt;&lt;/strong&gt;&amp;#160;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="93"&gt;         &lt;p align="center"&gt;&amp;#160;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="97"&gt;         &lt;p align="center"&gt;&amp;#160;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="94"&gt;         &lt;p align="center"&gt;&amp;#160;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="90"&gt;         &lt;p align="center"&gt;&amp;#160;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="101"&gt;         &lt;p align="center"&gt;15&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="75"&gt;         &lt;p align="center"&gt;&lt;strong&gt;&lt;u&gt;Iteration 2&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="94"&gt;         &lt;p align="center"&gt;Foundation &lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="93"&gt;         &lt;p align="center"&gt;Foundation &lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="97"&gt;         &lt;p align="center"&gt;Foundation &lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="93"&gt;         &lt;p align="center"&gt;Foundation &lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="91"&gt;         &lt;p align="center"&gt;Foundation &lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="101"&gt;         &lt;p align="center"&gt;10&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="75"&gt;         &lt;p align="center"&gt;&lt;strong&gt;&lt;u&gt;Iteration 1&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="94"&gt;         &lt;p align="center"&gt;Blueprints&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="93"&gt;         &lt;p align="center"&gt;Blueprints&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="97"&gt;         &lt;p align="center"&gt;Blueprints&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="94"&gt;         &lt;p align="center"&gt;Blueprints&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="91"&gt;         &lt;p align="center"&gt;Blueprints&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="102"&gt;         &lt;p align="center"&gt;5&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;After 10 weeks of work, our construction company has failed to complete a single inhabitable house. What are we paying these people for? Why are they building a foundation, then moving to the next lot to build the next one? I guess they're just going to get back to it sometime later.&lt;/p&gt;  &lt;p&gt;Let's just speed ahead and see what we have after 25 weeks on the project:&lt;/p&gt;  &lt;table border="1" cellspacing="0" cellpadding="2" width="640"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="79"&gt;&amp;#160;&lt;/td&gt;        &lt;td valign="top" width="91"&gt;         &lt;p align="center"&gt;&lt;strong&gt;&lt;u&gt;Week 1&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="91"&gt;         &lt;p align="center"&gt;&lt;strong&gt;&lt;u&gt;Week 2&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="91"&gt;         &lt;p align="center"&gt;&lt;strong&gt;&lt;u&gt;Week 3&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="89"&gt;         &lt;p align="center"&gt;&lt;strong&gt;&lt;u&gt;Week 4&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="100"&gt;         &lt;p align="center"&gt;&lt;strong&gt;&lt;u&gt;Week 5&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="97"&gt;         &lt;p align="center"&gt;&lt;strong&gt;&lt;u&gt;Elapsed Weeks&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="78"&gt;         &lt;p align="center"&gt;&lt;strong&gt;&lt;u&gt;Iteration 5&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="92"&gt;         &lt;p align="center"&gt;Furnishings &lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="92"&gt;         &lt;p align="center"&gt;Furnishings &lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="92"&gt;         &lt;p align="center"&gt;Furnishings &lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="91"&gt;         &lt;p align="center"&gt;Furnishings &lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="100"&gt;         &lt;p align="center"&gt;Furnishings &lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="96"&gt;         &lt;p align="center"&gt;25&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="78"&gt;         &lt;p align="center"&gt;&lt;strong&gt;&lt;u&gt;Iteration 4&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="93"&gt;         &lt;p align="center"&gt;Internal Structure&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="93"&gt;         &lt;p align="center"&gt;Internal Structure &lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="93"&gt;         &lt;p align="center"&gt;Internal Structure&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="92"&gt;         &lt;p align="center"&gt;Internal Structure&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="99"&gt;         &lt;p align="center"&gt;Internal Structure&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="95"&gt;         &lt;p align="center"&gt;20&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="77"&gt;         &lt;p align="center"&gt;&lt;strong&gt;&lt;u&gt;Iteration 3&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="93"&gt;         &lt;p align="center"&gt;&lt;strong&gt;&lt;u&gt;&lt;/u&gt;&lt;/strong&gt;External Structure&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="93"&gt;         &lt;p align="center"&gt;External Structure&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="93"&gt;         &lt;p align="center"&gt;External Structure&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="93"&gt;         &lt;p align="center"&gt;External Structure&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="99"&gt;         &lt;p align="center"&gt;External Structure&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="95"&gt;         &lt;p align="center"&gt;15&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="77"&gt;         &lt;p align="center"&gt;&lt;strong&gt;&lt;u&gt;Iteration 2&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="93"&gt;         &lt;p align="center"&gt;Foundation &lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="93"&gt;         &lt;p align="center"&gt;Foundation &lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="93"&gt;         &lt;p align="center"&gt;Foundation &lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="93"&gt;         &lt;p align="center"&gt;Foundation &lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="99"&gt;         &lt;p align="center"&gt;Foundation &lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="95"&gt;         &lt;p align="center"&gt;10&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="77"&gt;         &lt;p align="center"&gt;&lt;strong&gt;&lt;u&gt;Iteration 1&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="93"&gt;         &lt;p align="center"&gt;Blueprints&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="93"&gt;         &lt;p align="center"&gt;Blueprints&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="93"&gt;         &lt;p align="center"&gt;Blueprints&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="93"&gt;         &lt;p align="center"&gt;Blueprints&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="99"&gt;         &lt;p align="center"&gt;Blueprints&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="96"&gt;         &lt;p align="center"&gt;5&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;This is great, finally. After 25 weeks we finally have inhabitable houses! Actually we had one inhabitable house after week 20, then one more per week until 25. That almost feels like a privilege at this point to get so many houses finished so quickly in succession.&lt;/p&gt;  &lt;h2&gt;Not in My Backyard!&lt;/h2&gt;  &lt;p&gt;Do construction companies ever really build houses like this? Not that I've ever seen. They try to complete a house as quickly as they can after the foundation concrete sets. Of course, that means they may indeed start on a second foundation before they build the remainder of the first house, but you get my point. &lt;/p&gt;  &lt;p&gt;Suppose it were 30 houses instead of 5. Could you imagine if this were a new neighborhood being built just behind your backyard. What would you think if you saw the crews building 30 separate foundations, then coming back to the first to frame it, then moving to the next to frame it, etc, etc. You'd think they had last their minds or have absolutely no respect or understanding of the Time-Value-of-Money or concern for a Return-On-Investment.&lt;/p&gt;  &lt;h2&gt;Neighborhood Construction is More Vertical, Like Agile&lt;/h2&gt;  &lt;p&gt;As you can see below, our construction crew progresses through each house from &amp;quot;the ground up&amp;quot;, which means that they finish one house completely every five weeks. This, in agile terminology, is their velocity per iteration. The learn more about agile teams and velocity, read my article &amp;quot;&lt;a href="http://agilefromthegroundup.blogspot.com/2009/09/done-features-equals-velocity.html" target="_blank"&gt;D = V * T : The formula in software DeVelopmenT to get features DONE&lt;/a&gt;&amp;quot;.&lt;/p&gt;  &lt;table border="1" cellspacing="0" cellpadding="2" width="609"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="96"&gt;&amp;#160;&lt;/td&gt;        &lt;td valign="top" width="103"&gt;         &lt;p align="center"&gt;&lt;strong&gt;&lt;u&gt;Iteration 1&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="102"&gt;         &lt;p align="center"&gt;&lt;strong&gt;&lt;u&gt;Iteration 2&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="100"&gt;         &lt;p align="center"&gt;&lt;strong&gt;&lt;u&gt;Iteration 3&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="98"&gt;         &lt;p align="center"&gt;&lt;strong&gt;&lt;u&gt;Iteration 4&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="108"&gt;         &lt;p align="center"&gt;&lt;strong&gt;&lt;u&gt;Iteration 5&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="96"&gt;         &lt;p align="center"&gt;&lt;strong&gt;&lt;u&gt;Weeks Elapsed / Houses Completed&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="103"&gt;         &lt;p align="center"&gt;5 : 1&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="102"&gt;         &lt;p align="center"&gt;10 : 2&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="100"&gt;         &lt;p align="center"&gt;15 : 3&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="99"&gt;         &lt;p align="center"&gt;20 : 4&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="108"&gt;         &lt;p align="center"&gt;25 : 5&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="96"&gt;         &lt;p align="center"&gt;&lt;strong&gt;&lt;u&gt;Week&amp;#160; 5&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="103"&gt;         &lt;p align="center"&gt;Furnishings &lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="102"&gt;         &lt;p align="center"&gt;Furnishings &lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="100"&gt;         &lt;p align="center"&gt;Furnishings &lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="99"&gt;         &lt;p align="center"&gt;Furnishings &lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="108"&gt;         &lt;p align="center"&gt;Furnishings &lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="96"&gt;         &lt;p align="center"&gt;&lt;strong&gt;&lt;u&gt;Week 4&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="103"&gt;         &lt;p align="center"&gt;Internal Structure&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="102"&gt;         &lt;p align="center"&gt;Internal Structure &lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="100"&gt;         &lt;p align="center"&gt;Internal Structure&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="99"&gt;         &lt;p align="center"&gt;Internal Structure&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="108"&gt;         &lt;p align="center"&gt;Internal Structure&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="96"&gt;         &lt;p align="center"&gt;&lt;strong&gt;&lt;u&gt;Week 3&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="103"&gt;         &lt;p align="center"&gt;&lt;strong&gt;&lt;u&gt;&lt;/u&gt;&lt;/strong&gt;External Structure&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="102"&gt;         &lt;p align="center"&gt;External Structure&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="100"&gt;         &lt;p align="center"&gt;External Structure&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="99"&gt;         &lt;p align="center"&gt;External Structure&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="108"&gt;         &lt;p align="center"&gt;External Structure&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="96"&gt;         &lt;p align="center"&gt;&lt;strong&gt;&lt;u&gt;Week 2&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="103"&gt;         &lt;p align="center"&gt;Foundation &lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="102"&gt;         &lt;p align="center"&gt;Foundation &lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="100"&gt;         &lt;p align="center"&gt;Foundation &lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="99"&gt;         &lt;p align="center"&gt;Foundation &lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="108"&gt;         &lt;p align="center"&gt;Foundation &lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="96"&gt;         &lt;p align="center"&gt;&lt;strong&gt;&lt;u&gt;Week 1&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="103"&gt;         &lt;p align="center"&gt;Blueprints&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="102"&gt;         &lt;p align="center"&gt;Blueprints&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="100"&gt;         &lt;p align="center"&gt;Blueprints&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="100"&gt;         &lt;p align="center"&gt;Blueprints&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="108"&gt;         &lt;p align="center"&gt;Blueprints&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;h2&gt;Comparing Velocity between Waterfall and Agile Approaches&lt;/h2&gt;  &lt;p&gt;In the following table, we're looking at how many houses we complete per iteration. &lt;/p&gt;  &lt;p&gt;So, the calculation is &lt;strong&gt;&lt;em&gt;number of iterations passed / number of houses completed&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;Thus, the agile velocity is constant in terms of 5 weeks. We can always count on 1 house becoming complete every 5 weeks.&lt;/p&gt;  &lt;table border="1" cellspacing="0" cellpadding="2" width="484"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="74"&gt;&amp;#160;&lt;/td&gt;        &lt;td valign="top" width="113"&gt;Total Completed Under Waterfall&lt;/td&gt;        &lt;td valign="top" width="81"&gt;Waterfall Velocity per Iteration&lt;/td&gt;        &lt;td valign="top" width="113"&gt;Total Completed Under Agile&lt;/td&gt;        &lt;td valign="top" width="101"&gt;Agile Velocity per Iteration&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="74"&gt;Week 5&lt;/td&gt;        &lt;td valign="top" width="113"&gt;0&lt;/td&gt;        &lt;td valign="top" width="83"&gt;0&lt;/td&gt;        &lt;td valign="top" width="113"&gt;1&lt;/td&gt;        &lt;td valign="top" width="101"&gt;1&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="73"&gt;Week 10&lt;/td&gt;        &lt;td valign="top" width="112"&gt;0&lt;/td&gt;        &lt;td valign="top" width="84"&gt;0&lt;/td&gt;        &lt;td valign="top" width="113"&gt;2&lt;/td&gt;        &lt;td valign="top" width="101"&gt;1&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="73"&gt;Week 15&lt;/td&gt;        &lt;td valign="top" width="112"&gt;0&lt;/td&gt;        &lt;td valign="top" width="85"&gt;0&lt;/td&gt;        &lt;td valign="top" width="113"&gt;3&lt;/td&gt;        &lt;td valign="top" width="101"&gt;1&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="73"&gt;Week 20&lt;/td&gt;        &lt;td valign="top" width="112"&gt;0&lt;/td&gt;        &lt;td valign="top" width="86"&gt;0&lt;/td&gt;        &lt;td valign="top" width="112"&gt;4&lt;/td&gt;        &lt;td valign="top" width="100"&gt;1&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="73"&gt;Week 25&lt;/td&gt;        &lt;td valign="top" width="112"&gt;5&lt;/td&gt;        &lt;td valign="top" width="87"&gt;1&lt;/td&gt;        &lt;td valign="top" width="112"&gt;5&lt;/td&gt;        &lt;td valign="top" width="101"&gt;1&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;h2&gt;Combining Return on Investment with Velocity&lt;/h2&gt;  &lt;p&gt;Finally, since we know that nobody can live in a house until it's completed, we can calculate the potential accrued Return-on-Investment (ROI) after each iteration for actually having sold houses.&lt;/p&gt;  &lt;p&gt;Let's assume we can sell each house for $100,000.&lt;/p&gt;  &lt;table border="1" cellspacing="0" cellpadding="2" width="427"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="131"&gt;&amp;#160;&lt;/td&gt;        &lt;td valign="top" width="163"&gt;Potential Waterfall ROI&lt;/td&gt;        &lt;td valign="top" width="129"&gt;Potential Agile ROI&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="131"&gt;Week 5&lt;/td&gt;        &lt;td valign="top" width="163"&gt;0&lt;/td&gt;        &lt;td valign="top" width="130"&gt;$100,000&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="131"&gt;Week 10&lt;/td&gt;        &lt;td valign="top" width="163"&gt;0&lt;/td&gt;        &lt;td valign="top" width="131"&gt;$200,000&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="131"&gt;Week 15&lt;/td&gt;        &lt;td valign="top" width="163"&gt;0&lt;/td&gt;        &lt;td valign="top" width="131"&gt;$300,000&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="131"&gt;Week 20&lt;/td&gt;        &lt;td valign="top" width="163"&gt;0&lt;/td&gt;        &lt;td valign="top" width="131"&gt;$400,000&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="131"&gt;Week 25&lt;/td&gt;        &lt;td valign="top" width="163"&gt;$500,000&lt;/td&gt;        &lt;td valign="top" width="131"&gt;$500,000&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;Taking into account the &lt;a href="http://en.wikipedia.org/wiki/Time_value_of_money" target="_blank"&gt;Time-Value-of-Money&lt;/a&gt; (TVM) we understand that it's certainly more valuable to realize returns via the agile approach to building neighborhoods as opposed to the waterfall method!&lt;/p&gt;  &lt;p&gt;Similarly, when we talk about ROI and TVM regarding software projects developed using agile methods, certainly we sometimes mean that we can gain monetary returns earlier by producing &amp;quot;potentially shippable product increments&amp;quot; faster and getting them to the market. However, what we also mean is that by focusing on building features top-to-bottom, we can get the complete experience and feedback necessary to then apply toward the next feature and we prevent the pains of having to refactor code later when it's no longer fresh and when requirements have been changing all round.&lt;/p&gt;  &lt;p&gt;Here is a good video on YouTube which depicts this relationship between time and value accrual very well:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:aa09c3fa-40ca-4b2e-8fba-4498bbc40ac8" class="wlWriterSmartContent"&gt;&lt;div&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://www.youtube.com/v/OWvSnYjqOTQ"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/OWvSnYjqOTQ" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;/div&gt;  &lt;p&gt;Until next time, stay agile, not fragile!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4441160589671124737-2479355126658996715?l=agilefromthegroundup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilefromthegroundup.blogspot.com/feeds/2479355126658996715/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilefromthegroundup.blogspot.com/2009/12/agile-software-construction-is-like.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4441160589671124737/posts/default/2479355126658996715'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4441160589671124737/posts/default/2479355126658996715'/><link rel='alternate' type='text/html' href='http://agilefromthegroundup.blogspot.com/2009/12/agile-software-construction-is-like.html' title='Agile Software Construction is Like Neighborhood Construction'/><author><name>Josh Gough</name><uri>http://www.blogger.com/profile/13302284610870926934</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_iiRWyargx_M/SxxV-nhs89I/AAAAAAAAABU/u_nb_t2wHtQ/s72-c/image%5B3%5D.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4441160589671124737.post-7971621024439070203</id><published>2009-12-31T11:50:00.000-08:00</published><updated>2009-12-31T12:07:11.922-08:00</updated><title type='text'>Review: Software Development Practices and Knowledge Sharing: A Comparison of XP and Waterfall Team Behaviors</title><content type='html'>&lt;p&gt;Jan Chong, Ph.D., wrote her dissertation on &amp;quot;Software Development Practices and Knowledge Sharing: A Comparison of XP and Waterfall Team Behaviors&amp;quot;. I came across a recorded presentation of her discussing her dissertation at The Research Channel here:&lt;/p&gt;&lt;p&gt;&lt;a title="http://www.researchchannel.org/prog/displayevent.aspx?rID=16075&amp;amp;fID=345" href="http://www.researchchannel.org/prog/displayevent.aspx?rID=16075&amp;amp;fID=345"&gt;http://www.researchchannel.org/prog/displayevent.aspx?rID=16075&amp;amp;fID=345&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Here is the description of the recorded presentation:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;font size="1"&gt;My dissertation research explores knowledge sharing behaviors among two teams of software developers, looking at how knowledge sharing may be effected by a team's choice of software development methodology. I conducted ethnographic observations with two product teams, one which adopted eXtreme Programming (XP) and one which used waterfall methods. Through analysis of 808 knowledge sharing events witnessed over 9 months in the field, I demonstrate differences across the two teams in what knowledge is formally captured (say, in tools or written documents) and what knowledge is communicated explicitly between team members. I then discuss how the practices employed by the programmers and the configuration of their work setting influenced these knowledge sharing behaviors. I then suggest implications of these differences, for both software development practice and for systems that might support software development work. &lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Jan's full biography at the time of her dissertation:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;font size="1"&gt;Jan is a doctoral candidate in the Department of Management Science and Engineering at Stanford University.&amp;#160; She is affiliated with the Center for Work, Technology and Organization.&amp;#160; Her research interests include collaborative software engineering, agile methods, knowledge management and computer supported collaborative work.&amp;#160; Jan holds a B.S. and an M.S. in Computer Science from Stanford University.&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Her complete dissertation is available here: &lt;a title="http://www.amazon.com/Knowledge-Sharing-Software-Development-Comparing/dp/3639100840" href="http://www.amazon.com/Knowledge-Sharing-Software-Development-Comparing/dp/3639100840"&gt;http://www.amazon.com/Knowledge-Sharing-Software-Development-Comparing/dp/3639100840&lt;/a&gt;&lt;/p&gt;&lt;h1&gt;Highlighted Slides from Recorded Presentation&lt;/h1&gt;&lt;p&gt;It's nice to see a formal study that compares these different styles of work. Jan spent time observing both teams for about 9 months. Here is a bit more about her methodology.&lt;/p&gt;&lt;h2&gt;Study Methodology&lt;/h2&gt;&lt;p&gt;&lt;a href="http://lh3.ggpht.com/_iiRWyargx_M/Sz0DPtALxtI/AAAAAAAAACk/Pj1vb5-c9eQ/s1600-h/image3.png"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="image" src="http://lh4.ggpht.com/_iiRWyargx_M/Sz0DPx3rneI/AAAAAAAAACo/e3_57sJ8sIE/image_thumb1.png?imgmax=800" width="531" height="383" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;h2&gt;Team Communication Styles&lt;/h2&gt;&lt;p&gt;First, for the XP team, communication is more open, faciltated by information radiators and an open workspace:&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh3.ggpht.com/_iiRWyargx_M/Sz0DQaB4oJI/AAAAAAAAACs/OFBGlD9q09s/s1600-h/image7.png"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="image" src="http://lh6.ggpht.com/_iiRWyargx_M/Sz0DQnmmX-I/AAAAAAAAACw/juAdbjhNtmc/image_thumb3.png?imgmax=800" width="530" height="347" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;The waterfall team has team members who work alone, in their own cubicles, and who communicate primarily through an online chat program. Thus, they sometimes &amp;quot;broadcast&amp;quot; information to others inside of the chatroom:&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh3.ggpht.com/_iiRWyargx_M/Sz0DRBZ1k3I/AAAAAAAAAC0/w25nLE33pHA/s1600-h/image14.png"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="image" src="http://lh4.ggpht.com/_iiRWyargx_M/Sz0DRcT5hLI/AAAAAAAAAC4/gKMtjvzE4n0/image_thumb6.png?imgmax=800" width="539" height="358" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;h2&gt;Observed Events and Data Coding&lt;/h2&gt;&lt;p&gt;Through analyzing her recordings and notes, Jan classified all the different knowledge-transfer events into the following categories:&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh4.ggpht.com/_iiRWyargx_M/Sz0DRoTofqI/AAAAAAAAAC8/vH4RyXFjhpk/s1600-h/image39.png"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="image" src="http://lh4.ggpht.com/_iiRWyargx_M/Sz0DSEgqgTI/AAAAAAAAADA/YtVKrrmtzu0/image_thumb19.png?imgmax=800" width="528" height="391" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;h2&gt;Knowledge Seeking Behaviors&lt;/h2&gt;&lt;p&gt;This slide compares the actions taken by teammates in explicitly asking for knowledge transfer from others:&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh6.ggpht.com/_iiRWyargx_M/Sz0DSZwDQzI/AAAAAAAAADE/yfO3cXLrpVI/s1600-h/image31.png"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="image" src="http://lh6.ggpht.com/_iiRWyargx_M/Sz0DSq5KkpI/AAAAAAAAADI/Z9Kv6WoPUBQ/image_thumb15.png?imgmax=800" width="524" height="378" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;h2&gt;Knowledge Offering and Relevance&lt;/h2&gt;&lt;p&gt;Below Jan has categorized types of communication that are offered and their respective relevancies. &lt;/p&gt;&lt;p&gt;&lt;a href="http://lh4.ggpht.com/_iiRWyargx_M/Sz0DS3JvlgI/AAAAAAAAADM/cs7GPtbPo7g/s1600-h/image35.png"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="image" src="http://lh3.ggpht.com/_iiRWyargx_M/Sz0DTDklFrI/AAAAAAAAADQ/iLJTYYHeGtc/image_thumb17.png?imgmax=800" width="542" height="386" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;h2&gt;Recorded Knowledge&lt;/h2&gt;&lt;p&gt;It's very interesting to note that the waterfall team recorded knowledge far more for the &amp;quot;long-term&amp;quot;, percentage-wise than on the XP team. What is not clear, however, is whether this means that the XP teams simply recorded more personal items in addition to the same type of long-term items or whether they leave out certain long-term items that waterfall teams recorded properly.&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh6.ggpht.com/_iiRWyargx_M/Sz0DTgJOtyI/AAAAAAAAADU/fTbXt2zcpU4/s1600-h/image43.png"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="image" src="http://lh6.ggpht.com/_iiRWyargx_M/Sz0DT52V4EI/AAAAAAAAADc/m6Di7xlUufA/image_thumb21.png?imgmax=800" width="529" height="386" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;h2&gt;Summary Slides&lt;/h2&gt;&lt;p&gt;The following three slides are her concluding slides:&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh5.ggpht.com/_iiRWyargx_M/Sz0DUWIGGhI/AAAAAAAAADg/z_hsWBFcRtg/s1600-h/image18.png"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="image" src="http://lh6.ggpht.com/_iiRWyargx_M/Sz0DU4EhbvI/AAAAAAAAADk/SJmWYRF3HbA/image_thumb8.png?imgmax=800" width="533" height="337" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh5.ggpht.com/_iiRWyargx_M/Sz0DU1YghtI/AAAAAAAAADo/5I4uV2938HE/s1600-h/image23.png"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="image" src="http://lh6.ggpht.com/_iiRWyargx_M/Sz0DVcPPQoI/AAAAAAAAADs/Px4uJxvIw9s/image_thumb11.png?imgmax=800" width="519" height="319" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;a href="http://lh5.ggpht.com/_iiRWyargx_M/Sz0DVjc1SMI/AAAAAAAAADw/pHxpGaHZHYU/s1600-h/image27.png"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="image" src="http://lh6.ggpht.com/_iiRWyargx_M/Sz0DWFPUq7I/AAAAAAAAAD0/e9A2_gX0pzE/image_thumb13.png?imgmax=800" width="492" height="378" /&gt;&lt;/a&gt;&amp;#160; &lt;/p&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;h1&gt;Review and Analysis&lt;/h1&gt;&lt;p&gt;I'm about to join a great team for an agile project that will be built using Scrum &amp;amp; XP practices. This opportunity is very exciting for me. That excitement is born out of my own &amp;quot;in the trenches&amp;quot; experience and observations on both Agile/Scrum/XP and waterfall. If you're reading this and unfamiliar with the differences between agile and waterfall, I recommend you take both of them for a &amp;quot;test drive&amp;quot; by reading or listening to my article entitled &lt;a href="http://agilefromthegroundup.blogspot.com/2009/07/experience-benefits-of-agile-compared.html" target="_blank"&gt;&amp;quot;From Waterfall to Agile Development in 10 Minutes: An Introduction for Everyone&amp;quot;&lt;/a&gt;. Also read &amp;quot;&lt;a href="http://agilefromthegroundup.blogspot.com/2009/12/dont-get-drowned-by-waterfall-break-out.html" target="_blank"&gt;Don't Get Drowned by Waterfall: Break out the Delusion&lt;/a&gt;&amp;quot; and&amp;#160; &amp;quot;&lt;a href="http://agilefromthegroundup.blogspot.com/2009/09/done-features-equals-velocity.html" target="_blank"&gt;D = V * T : The formula in software DeVelopmenT to get features DONE&lt;/a&gt;&amp;quot;&lt;/p&gt;&lt;p&gt;If you cannot tell by now, my preference is for agile development and not waterfall. Waterfall, at least in its pure form, as you can read in the first article, is a mistake and always has been a mistake for software systems development. While Jan stops short of claiming a preference for one style of development or the other in her analysis, it's important to note that this is because that was not her intention. She is working on improving software methodology as a whole, and seeks to synthesize best practices from actual empirically observed behavior and data.&lt;/p&gt;&lt;h2&gt;How Useful is the Long-Term Design Documentation by the Waterfall Team?&lt;/h2&gt;&lt;p&gt;Jan observed that the waterfall teams had members who worked alone and went &amp;quot;back to the code&amp;quot; when they needed to understand something or had to work on a new module they had not worked on before. What I'm not clear on is whether she meant &amp;quot;automated test case code&amp;quot; or &amp;quot;implementation code&amp;quot;. She also noted that the XP team members consulted one another more often about how things work prior to looking at code. She also noted that the waterfall teams created a higher percentage of recorded knowledge about the long-term aspects of the project. I am assuming this meant written documentation judging by her comments on video. &lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;strong&gt;Question:&lt;/strong&gt; How often the waterfall developers actually refer back to those long-term design documents, and which of those documents did they originally anticipate being useful to other developers?&lt;/em&gt;&lt;/p&gt;&lt;p&gt;The reason I would ask this is that she already noted that the waterfall team members spent a lot of time reading code, and also reading CVS check in messages when others checked in changes, but she didn't address whether they (or anyone) reads the long-term design documents for any useful purpose.&lt;/p&gt;&lt;h2&gt;Experience Highest Communication Bandwidth via Face-to-Face at Whiteboard Collaboration&lt;/h2&gt;&lt;p&gt;It has been my personal experience as a developer and architect that when working more closely, in a collaborative, open workspace, with other members of a team, I do not need to refer to implementation code or documentation as often anyway. Instead, we rely more a constantly evolved shared language, basic metaphors, automated test cases, and whiteboards to communicate the &amp;quot;gist&amp;quot; of how something works, then we refer to detailed implementation code as soon as we need the details or pinpoint a trouble area. Scott Ambler has written extensively on the subject on agile documentation and communication. Here is a chart he produced based on a survey about the most effective forms of communication:&lt;/p&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;&lt;img src="http://www.agilemodeling.com/images/communicationModes.gif" /&gt; &lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font size="1"&gt;Source: &lt;/font&gt;&lt;/strong&gt;&lt;a title="http://www.agilemodeling.com/essays/agileDocumentation.htm" href="http://www.agilemodeling.com/essays/agileDocumentation.htm"&gt;&lt;strong&gt;&lt;font size="1"&gt;http://www.agilemodeling.com/essays/agileDocumentation.htm&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;&lt;font size="1"&gt;&amp;#160;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;As you can see, paper documentation is by far the absolute worst form of communication. Face-to-face whiteboard is the most effective. Kevin Skibbe, a friend that I used to work with, is the most effective whiteboard communicator I know. What he explained to me was that when two, or more, people try to communicate via the whiteboard they must focus on developing a&lt;strong&gt;&lt;em&gt; shared mental model&lt;/em&gt;&lt;/strong&gt;. Even when it's just face-to-face communication, without a whiteboard, both people are still maintaining independent, &lt;strong&gt;&lt;em&gt;non-shared mental models&lt;/em&gt;&lt;/strong&gt; of what the other person is thinking.&lt;/p&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;h2&gt;Building Long-Term Executable Knowledge / Documentation via Automated Tests&lt;/h2&gt;&lt;p&gt;One measurement I don't explicitly noted is the notion of &amp;quot;Executable Knowledge&amp;quot;, or more frequently called &amp;quot;Executable Specifications&amp;quot;. Scott Ambler writes about this here: &lt;a title="http://www.agilemodeling.com/essays/executableSpecifications.htm" href="http://www.agilemodeling.com/essays/executableSpecifications.htm"&gt;http://www.agilemodeling.com/essays/executableSpecifications.htm&lt;/a&gt;, and Mary Poppendieck writes about it in her books and presentations: &lt;a title="http://www.poppendieck.com/" href="http://www.poppendieck.com/"&gt;http://www.poppendieck.com/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;I suggest that teams, whether waterfall or agile, incorporate this practice into their development in order to produce fewer defects, increase explicit knowledge in the code-base, and reduce the need to continually read implementation code.&lt;/p&gt;&lt;p&gt;We should first think about software systems in light of their intrinsic nature and in terms of the change process required to modify or enhance them with maximum ability to produce the desired result. That result might be faster ROI in the market, increased product quality, or what have you. &lt;/p&gt;&lt;p&gt;What we &lt;em&gt;&lt;strong&gt;never&lt;/strong&gt;&lt;/em&gt; want to do however, is result in broken functionality after we release. This is why we build regression test suites that can be executed at will to confirm as much as computationally possible of the encoded knowledge about the business domain and user requirements. &lt;/p&gt;&lt;p&gt;This is how Test-Driven-Development works. Here is how Ambler depicts this view:&lt;/p&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;&lt;img src="http://www.agiledata.org/images/tddSteps.jpg" /&gt; &lt;/p&gt;&lt;p&gt;That is a nice technical view of things, but what about the view from the business side? Ambler presents a written form of the requirement that would be provided to developers from a business analyst in the article linked above.&lt;/p&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;h2&gt;Waterfall is Always Wrong Compared to Agile for Building a New System&lt;/h2&gt;&lt;p&gt;I'm going to assume here a definition of waterfall that is primarily the standard sequential approach where requirements come first, followed by, detailed design, development, (test, drop scope, rework) (repeat prior three as necessary until completion), and deployment and maintenance.&lt;/p&gt;&lt;p&gt;If a project is about developing a completely new product from the ground up, then adopting the sequential model for a system of any degree of complexity beyond perhaps an estimated month of duration is simply calling for pain. I'm not going to explain why in this article, but I refer you to the three articles I wrote above for complete explanation. But, to summarize: &lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;strong&gt;When you begin a moderate to large custom development project, there are many requirements you simply cannot know until you have started to develop a subset of the entire envisioned project and that subset makes its way into the hands of the critical stakeholders like the project owner and the target users.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;For more evidence, refer to Craig Larman's research and explanation about the history of waterfall in this article: &lt;a title="http://www.highproductivity.org/r6047.pdf" href="http://www.highproductivity.org/r6047.pdf"&gt;http://www.highproductivity.org/r6047.pdf&lt;/a&gt;&lt;/p&gt;&lt;h2&gt;&lt;br /&gt;Waterfall is Still Wrong for Enhancing an Existing System&lt;/h2&gt;&lt;p&gt;However, suppose a software system is already released and &amp;quot;in production&amp;quot;, should a team then use waterfall techniques to build additional features?&lt;/p&gt;&lt;p&gt;I believe the answer is no. The reason is reflected above in the TDD diagram. You want to reduce the impact of changes and build up a suite of regression tests as you develop the solution. And, you want to seek feedback as early as possible to reduce time spent working on incorrect or undesired functionality.&lt;/p&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;h2&gt;Waterfall is Especially Wrong for Rebuilding an Existing System&lt;/h2&gt;&lt;p&gt;In my experience, and I've been through it a couple of times now, waterfall is notoriously wrong when you are asked to rebuild an existing system in a new technology. The reason is that often the project sponsor will state little more than the fact that they want the existing system functionality essentially duplicated. Unfortunately, much time will be wasted by the team if it tries to clone piece-by-piece the existing product. &lt;/p&gt;&lt;p&gt;A much better approach is to use the existing system as a very high fidelity &lt;em&gt;model. &lt;/em&gt;It should then use iterative and incremental agile practices to deliver features that are focused on making and keeping the project potentially shippable as soon as possible. This ensures a complete vertical &amp;quot;slice&amp;quot; of functionality through all the application's layers gets built as soon as possible. To learn more about these practices, see the screen-cast series Autumn of Agile at &lt;a href="http://www.autumnofagile.net"&gt;http://www.autumnofagile.net&lt;/a&gt;. The first episode gives a comprehensive and very compelling explanation of why agile presents better business value than waterfall. My article &amp;quot;&lt;a href="http://agilefromthegroundup.blogspot.com/2009/12/dont-get-drowned-by-waterfall-break-out.html" target="_blank"&gt;Don't Get Drowned by Waterfall: Break out the Delusion&lt;/a&gt;&amp;quot; references a few key slides from that series.&lt;/p&gt;&lt;h2&gt;&amp;#160;&lt;/h2&gt;&lt;h2&gt;The Embarrassment of Waterfall's Persistence&lt;/h2&gt;&lt;p&gt;Waterfall continues to exist in the technology world because it sounds easy to understand on the surface, but everyone also realizes the intrinsic contradiction in software development: &lt;em&gt;requirements constantly change&lt;/em&gt;. I don't blame product owners or business people for waterfall's persistence. I blame ourselves, the developers and project managers. It is our fault for not being more responsive to changing environmental conditions and changing requirements. &lt;/p&gt;&lt;p&gt;But, balancing the ability to&lt;em&gt;&lt;strong&gt; change on demand&lt;/strong&gt;&lt;/em&gt; with the requirement to &lt;strong&gt;&lt;em&gt;remain stable at all other times&lt;/em&gt;&lt;/strong&gt; is what agility is all about. That is why agile focuses on rigorous empirical testing, visual monitoring, and continuous feedback. That is why automated tests as executable specifications speed up the ability to change while simultaneously increasing quality and confidence.&lt;/p&gt;&lt;p&gt;Stay tuned for my next article which will update the &amp;quot;age old&amp;quot; building construction metaphor that says building is software is like building a building. In many ways it is, but I will make key distinctions that enable agility!&lt;/p&gt;&lt;p&gt;Until then, stay agile, not fragile.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4441160589671124737-7971621024439070203?l=agilefromthegroundup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilefromthegroundup.blogspot.com/feeds/7971621024439070203/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilefromthegroundup.blogspot.com/2009/12/review-software-development-practices.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4441160589671124737/posts/default/7971621024439070203'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4441160589671124737/posts/default/7971621024439070203'/><link rel='alternate' type='text/html' href='http://agilefromthegroundup.blogspot.com/2009/12/review-software-development-practices.html' title='Review: Software Development Practices and Knowledge Sharing: A Comparison of XP and Waterfall Team Behaviors'/><author><name>Josh Gough</name><uri>http://www.blogger.com/profile/13302284610870926934</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_iiRWyargx_M/Sz0DPx3rneI/AAAAAAAAACo/e3_57sJ8sIE/s72-c/image_thumb1.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4441160589671124737.post-3897849287677354395</id><published>2009-12-07T20:43:00.001-08:00</published><updated>2009-12-07T20:57:03.602-08:00</updated><title type='text'>Don’t Get Drowned by Waterfall: Break out of the Delusion</title><content type='html'>&lt;p&gt;Many development projects are built with an approach traditionally called “Waterfall”, or “Big bang all at once”. This means that the entire system is defined, designed, developed, tested, then released in that precise order. In its purest form, a system built using waterfall techniques is utterly useless until the time when nearly all of its features are claimed to be “feature complete” and “ready for testing”.&lt;/p&gt;  &lt;p&gt;To put it very simply: if a project has 50 features, a team will attempt to build all 50 and only then test all 50 at the same time without any formal, professional QA and automated testing done during the construction of the features. &lt;em&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;This is a recipe for wildly missed delivery dates, at best, and utter disaster, at worst.&lt;/font&gt;&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;h2&gt;Irrational Justifications for Waterfall&lt;/h2&gt;  &lt;p&gt;Why in the world would a team try to build a system this way? You might hear something like “The whole system must work before we go live, so we’re going to test everything together”. On the surface, this sounds reasonable. Of course the whole system needs functional, end-to-end testing. However, in any system of non-triviality, this is, at best, an ignorant statement that betrays a lack of experience in developing complex systems. At worst, it’s a statement of learned helplessness or laziness born out of a lack of desire or &lt;strong&gt;&lt;em&gt;perceived lack of time&lt;/em&gt;&lt;/strong&gt; to break down the system into smaller, independently testable parts.&lt;/p&gt;  &lt;h2&gt;The Fantasy of Waterfall&lt;/h2&gt;  &lt;p&gt;The fantasy vision that people developing a waterfall project have is something like the blue line in the chart below from Steve Bohlen’s &lt;a href="http://www.autumnofagile.net"&gt;Autumn of Agile&lt;/a&gt; screencast series. In this vision, late in the project all the components that have not yet worked together in completion during the first 80% of the project get tested all at once and suddenly start to work and the project is released on time on an budget. &lt;/p&gt;  &lt;p&gt;&lt;em&gt;&lt;strong&gt;Yeah. Right.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Here’s the fantasy vision, compared with an Agile approach in terms of business value accrued over time, especially if the project suddenly is called to halt:&lt;/p&gt;  &lt;h2&gt;&lt;a href="http://lh3.ggpht.com/_iiRWyargx_M/SxxWAYRtQSI/AAAAAAAAABk/Trtihh2N-G4/s1600-h/image%5B15%5D.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="375" alt="image" src="http://lh5.ggpht.com/_iiRWyargx_M/SxxWA6-pd1I/AAAAAAAAABo/KEIsMv1fmz0/image_thumb%5B7%5D.png?imgmax=800" width="644" border="0" /&gt;&lt;/a&gt; &lt;/h2&gt;  &lt;p&gt;Continuing with the Waterfall delusion, the idea is that all aspects of the system can be developed in isolation from each other, never needing feedback or rework:&lt;/p&gt;  &lt;p&gt;&lt;img src="http://lh6.ggpht.com/_iiRWyargx_M/SxxWBoPrcOI/AAAAAAAAABw/nF1JTlGoagw/image_thumb[9].png?imgmax=800" /&gt;&amp;#160;&lt;/p&gt;  &lt;h2&gt;The Reality of Waterfall&lt;/h2&gt;  &lt;p&gt;The reality is shown below. The sharp decrease in the component stability represents the big “Oops, wish we would have thought of that sooner” moments that we all know and love during waterfall projects. &lt;/p&gt;  &lt;p&gt;&lt;img src="http://lh6.ggpht.com/_iiRWyargx_M/SxxWCW2QXuI/AAAAAAAAAB4/rnHWV3IsIIA/image_thumb[11].png?imgmax=800" /&gt; &lt;/p&gt;  &lt;p&gt;I can think of two instances off the top of my head during recent real-world projects where I’ve seen this:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;While working on a large electronic commerce application rewrite, our team warned our senior management that the legacy COM architecture would not scale well under .NET. Despite our warnings and evidence, our management wanted us to &lt;strong&gt;“just forge ahead” &lt;/strong&gt;as if it was more brave or honorable to continue doing something completely stupid rather than sit down with all of us and think through the difficulties necessary to properly solve the problem and devise a plan to reach the market and achieve positive ROI. Psychologists call this cognitive dissonance. I call it lack of planning, ignorant, or maybe just &lt;strong&gt;cognitionless dumbness.&lt;/strong&gt; I eventually left that position and have kept in contact with my old colleagues who eventually had to rewrite the entire COM layer in pure .NET to attain the desired business value (release).&lt;strong&gt;&amp;#160;&lt;/strong&gt;&lt;/li&gt;    &lt;li&gt;On another recent project I’ve worked on, I was assigned the responsibility of designing and implementing a complex security model on top of the existing custom entity model the new application was already using. Hundreds of entities had already been created in this system, and a large, wide horizontal stretch of pages and controls had been created already. But, no features had yet been designed vertically deep enough to use security. As a result, the system was thus far built entirely with static stored-procedures, but the complex security model required that all SQL statements be appended with additional where clauses and custom filters. Fixing this took weeks to refactor the data-access layer and rework static stored procedures to use more of a &lt;a href="http://martinfowler.com/eaaCatalog/queryObject.html"&gt;Query Object&lt;/a&gt; pattern.&lt;/li&gt; &lt;/ol&gt;  &lt;h2&gt;Special Note: Microsoft’s Advice for Systems Re-architecture and Migration&lt;/h2&gt;  &lt;p&gt;Microsoft has a document entitled “Microsoft .NET/COM Migration and Interoperability'”, located here: &lt;a href="http://msdn.microsoft.com/en-us/library/ee817653.aspx"&gt;http://msdn.microsoft.com/en-us/library/ee817653.aspx&lt;/a&gt;. It will serve all .NET or COM / C++ developers to read this document.&lt;/p&gt;  &lt;p&gt;Microsoft recommends that when you are re-architecting a system using .NET from an older technology, such as COM / C++ that you do not attempt a big-bang, horizontal migration. Instead, they recommend that you create a completely functional, vertical slice of the application first, before expanding horiztonally.&lt;/p&gt;  &lt;p&gt;Here is an excerpt:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;“You might choose to adopt a vertical migration strategy for a number of reasons:&lt;/p&gt;    &lt;ul&gt;     &lt;li&gt;&lt;strong&gt;Planning to re-architect&lt;/strong&gt;        &lt;br /&gt;If you plan to re-architect your application, vertically migrating part of your application to the new architecture provides a good test bed for the new design. The .NET Framework also makes it easier to provide the functionality that newer architectures are built on. For example, you can use HttpHandlers to perform many of the tasks for which you would previously use ISAPI extensions, but with a much simpler programming model.”&lt;/li&gt;   &lt;/ul&gt; &lt;/blockquote&gt;  &lt;p&gt;Here is a diagram from the same document depicting a vertical migration:&lt;/p&gt;  &lt;p&gt;&lt;img alt="Ee817653.cominterop03(en-us,PandP.10).gif" src="http://i.msdn.microsoft.com/Ee817653.cominterop03(en-us,PandP.10).gif" /&gt;&lt;/p&gt;  &lt;h2&gt;How to Stop The Horizontal Waterfall Madness&lt;/h2&gt;  &lt;p&gt;If you or your project is on a path of waterfall, horizontal development, then you have your work cut out for you, but it’s not too late. It takes discipline, honesty, and courage to set things upright and vertical.&lt;/p&gt;  &lt;p&gt;Here are a few key practical steps:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Stop adding code to the system that is not scheduled for testing in the current or next month. If you do not have a product road-map and product back-log prioritized by business-value and thus don’t know when a feature is going to need that code, then stop adding it, immediately. &lt;/li&gt;    &lt;li&gt;Focus instead on the fact that you need a road-map and a prioritized product back-log and define this in terms of users’ needs. If your product owner cannot or won’t prioritize the backlog or features, then simply list them in the order that your users encounter the features or the order that your help-desk team tells you needs most improvement.&lt;/li&gt;    &lt;li&gt;Now, identify a vertical slice of the application that you can focus everyone on the team on implementing from top-to-bottom. Determine how to get this slice as close 100% functional as possible.&lt;/li&gt;    &lt;li&gt;Work daily with your users, test team, developers, and other stakeholders to create, together, a strategy for standing up and ruthlessly testing that vertical slice.&lt;/li&gt;    &lt;li&gt;Once you’ve gotten critical user feedback for usability and functionality, apply those lessons learned to the next vertical slice, and so forth!&lt;/li&gt; &lt;/ol&gt;  &lt;h2&gt;Whose Responsibility is it to Stop Waterfall Thinking?&lt;/h2&gt;  &lt;p&gt;It’s far too easy for us as developers or architects to say that we’re just doing what we’re told by our managers or our business owners. After all, they “Just want the product done”, right? &lt;/p&gt;  &lt;p&gt;Certainly, we must listen to what our managers and owners ask of us. It’s very important that we do so. However, what’s more important, to them and to the success of projects, is that we as professionals bring our expertise and our knowledge to the problem-at-hand and that we act with resolve and courage to do the job correctly. Often times this means sitting down with our managers and owners and explaining to them, however uncomfortable it makes them or you, what it really means to do iterative development with high quality. Often we must educate them about the history of waterfall and its miserable rate of success.&lt;/p&gt;  &lt;p&gt;Thus, the responsibility is &lt;strong&gt;&lt;em&gt;yours&lt;/em&gt;&lt;/strong&gt;. The responsibility is &lt;strong&gt;&lt;em&gt;mine&lt;/em&gt;&lt;/strong&gt;. The responsibility is the &lt;strong&gt;&lt;em&gt;team’s&lt;/em&gt;&lt;/strong&gt;.&amp;#160; &lt;/p&gt;  &lt;h2&gt;Craig Larman on the History of Waterfall and Iterative &amp;amp; Incremental Development&lt;/h2&gt;  &lt;p&gt;Horizontal waterfall approaches, despite being popular and widespread today, came after early practitioners used iterative &amp;amp; incremental development techniques to greater success. The sad but true history of waterfall is that the U.S. Department of Defense (DOD) misinterpreted Winston W. Royce's paper on systems development and went on to enforce it as a government standard to which large contractors then adhered. Commercial industry followed suit from the government contractors. The DOD went on the revise their standards, and within the last twenty years they have recommended iterative &amp;amp; incremental practices. &lt;/p&gt;  &lt;p&gt;Object-oriented development guru Craig Larman has written several books about iterative &amp;amp; increment project management over the years. He also wrote an extensive article about the history of iterative &amp;amp; increment development (IID) here: &lt;a href="http://www.highproductivity.org/r6047.pdf"&gt;http://www.highproductivity.org/r6047.pdf&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Here’s a crucial excerpt history from that article:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;In the 1970s and 1980s, some IID projects still incorporated a preliminary major specification stage, although their teams developed them in iterations with minor feedback. In the 1990s, in contrast, methods tended to avoid this model, preferring less early specification work and a stronger evolutionary analysis approach. &lt;/p&gt;    &lt;p&gt;The DoD was still experiencing many failures with “waterfall-mentality” projects. To correct this and to reemphasize the need to replace the waterfall model with IID, the Defense Science Board Task Force on Acquiring Defense Software Commercially, chaired by Paul Kaminski, issued a report in June 1994 that stated simply, “DoD must manage programs using iterative development. Apply evolutionary development with rapid deployment of initial functional capability.” &lt;/p&gt;    &lt;p&gt;Consequently, in December 1994, Mil-Std-498 replaced 2167A. An article by Maj. George Newberry summarizing the changes included a section titled “Removing the Waterfall Bias,” in which he described the goal of encouraging evolutionary acquisition and IID:&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;Mil-Std-498 describes software development in one or more incremental builds. Each build implements a specified subset of the planned capabilities. The process steps are repeated for each build, and within each build, steps may be overlapping and iterative. &lt;/em&gt;&lt;/p&gt;    &lt;p&gt;Mil-Std-498 itself clearly states the core IID practices of evolving requirements and design incrementally with implementation: &lt;/p&gt;    &lt;p&gt;&lt;em&gt;If a system is developed in multiple builds, its requirements may not be fully defined until the final build…. If a system is designed in multiple builds, its design may not be fully defined until the final build.&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;Tom Gilb’s Principles of Software Engineering Management was the first book with substantial chapters dedicated to IID discussion and promotion. Computer Meanwhile, in the commercial realm, Jeff Sutherland and Ken Schwaber at Easel Corp. had started to apply what would become known as the Scrum method, which employed time-boxed 30-day iterations. The method took inspiration from a Japanese IID approach used for non-software products at Honda, Canon, and Fujitsu in the 1980s; from Shashimi (“slices” or iterations); and from a version of Scrum described in 1986. A 1999 article described their later refinements to Scrum.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Stop laying down flat. Stand up straight. Have more fun, and kick waterfall to the curb!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4441160589671124737-3897849287677354395?l=agilefromthegroundup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilefromthegroundup.blogspot.com/feeds/3897849287677354395/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilefromthegroundup.blogspot.com/2009/12/dont-get-drowned-by-waterfall-break-out.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4441160589671124737/posts/default/3897849287677354395'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4441160589671124737/posts/default/3897849287677354395'/><link rel='alternate' type='text/html' href='http://agilefromthegroundup.blogspot.com/2009/12/dont-get-drowned-by-waterfall-break-out.html' title='Don’t Get Drowned by Waterfall: Break out of the Delusion'/><author><name>Josh Gough</name><uri>http://www.blogger.com/profile/13302284610870926934</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_iiRWyargx_M/SxxWA6-pd1I/AAAAAAAAABo/KEIsMv1fmz0/s72-c/image_thumb%5B7%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4441160589671124737.post-4767965692282993078</id><published>2009-09-18T18:33:00.001-07:00</published><updated>2009-09-20T10:49:56.599-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='http'/><category scheme='http://www.blogger.com/atom/ns#' term='rest'/><category scheme='http://www.blogger.com/atom/ns#' term='bookreview'/><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><category scheme='http://www.blogger.com/atom/ns#' term='URI'/><category scheme='http://www.blogger.com/atom/ns#' term='restful services'/><title type='text'>Book Review: Effective REST Services via .NET For .NET Framework 3.5</title><content type='html'>&lt;p&gt;&amp;#160;&lt;a href="http://apps.ultravioletconsulting.com/blogimages/AgileFromTheGroundUp/BookReviewEffectiveRESTServicesvia.NET.5_12CC2/image.png"&gt;&lt;img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; margin: 0px 10px 0px 0px; border-right-width: 0px" height="142" alt="image" src="http://apps.ultravioletconsulting.com/blogimages/AgileFromTheGroundUp/BookReviewEffectiveRESTServicesvia.NET.5_12CC2/image_thumb.png" width="108" align="left" border="0" /&gt;&lt;/a&gt;     &lt;br /&gt;I’m currently reading Kenn Scribner and Scott Seely’s book &lt;a href="http://www.amazon.com/gp/product/B0026Q803K/ref=pd_lpo_k2_dp_sr_1/186-1903596-3312000?pf_rd_m=ATVPDKIKX0DER&amp;amp;pf_rd_s=lpo-top-stripe-1&amp;amp;pf_rd_r=089MKW3JWS6TX83M732Z&amp;amp;pf_rd_t=201&amp;amp;pf_rd_p=486539851&amp;amp;pf_rd_i=0321613252"&gt;Effective REST Services via .NET For .NET Framework 3.5&lt;/a&gt;&lt;strong&gt;&lt;u&gt;&lt;/u&gt;&lt;/strong&gt;. This is a great book which gives a thorough background on the history of REST, quoting often from Roy Fielding’s Ph.D. dissertation on the subject. The authors do not treat the subject with “kid gloves” or “framework gloves”. Instead, they exlain the HTTP protocol and its purpose, benefits, and its drawbacks. &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Warning:&lt;/strong&gt; I’m not really that good at giving book reviews for the general audience, and I feel like there’s already plenty of information on the web about all these subjects, but for own personal benefit it helps me to summarize subjects in my own words to clarify them. For me, it’s best for me to review a table-of-contents and then just give my best shot at summarizing what I’ve read in brief paragraphs using examples. This misses lots of details, of course, and some of what I remember won’t even come from the book.&lt;/p&gt;&lt;p&gt;For me, this is crucial research material for two projects I am working on. One of these is currently public and is a simple RESTful gaming platform. You can see the progress so far on that at &lt;a href="http://apps.ultravioletconsulting.com/Skookzee"&gt;http://apps.ultravioletconsulting.com/Skookzee&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;So, don’t mistake this as a book review for anyone other than myself, but I hope you enjoy it anyway.&lt;/p&gt;&lt;h3&gt;Chapter Summaries&lt;/h3&gt;&lt;strong&gt;   &lt;h5&gt;1: RESTful Systems: Back to the Future&lt;/h5&gt;&lt;/strong&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;This chapter discusses how early on web “services” consisted simply of web servers and URIs that delivered chunks of data. Sometimes this was done through CGI processing that responded to the invocation of the incoming request, but eventually most web sites became simply file servers. Later, SOAP-based services became popular, but the problem here was that SOAP services are intrinsically Remote-Procedure-Call centric (RPC). The problem with this is that SOAP services typically encapsulate both NOUNS and VERBS, or Resources and Actions, Objects and Methods –- pick your metaphor – behind a single URI. &lt;/p&gt;&lt;p&gt;You might ask why this is a problem. One reason is that the HTTP and URI protocols were designed, as Roy Fielding describes in his dissertation, to work well in a distributed network and to enable distributed caching. Because SOAP specifically, and RPC in general, deal in coupling an invocation-time command to a remote resource, there is no architectural support to cache the results. Indeed, the idea of caching a call to a SOAP web service is something that each service would have to completely encapsulate. &lt;/p&gt;&lt;p&gt;Conversely, the way the web was actually designed was with a few key principles in mind to enable the distributed, cacheable structure of resources. First of all, the URI stands for Universal Resource Identifier, and a resource is a noun, it’s not an action or a method call. SOAP services are about exposing a single noun, the service entry point, and then encapsulating any number of nouns and verbs behind that one single noun. &lt;/p&gt;&lt;p&gt;So, in a RESTful system, each URI refers to a single, unique representation of a remote resource. For example, &lt;a href="http://agilefromthegroundup.blogspot.com/2009/09/done-features-equals-velocity.html"&gt;http://agilefromthegroundup.blogspot.com/2009/09/done-features-equals-velocity.html&lt;/a&gt; refers specifically to the HTML representation of my post about development velocity and tracking. There is, however, another URI which refers to this resource in another way: &lt;a href="http://agilefromthegroundup.blogspot.com/feeds/posts/default/4352538909387142862"&gt;http://agilefromthegroundup.blogspot.com/feeds/posts/default/4352538909387142862&lt;/a&gt;. If you click this link you will get the content of that same blog post, but as XML inside of an “&amp;lt;entry&amp;gt;” element. &lt;/p&gt;&lt;p&gt;A good depiction of this distinction is found in the document &lt;a href="http://www.w3.org/TR/webarch/"&gt;Architecture of The World Wide Web&lt;/a&gt; on the W3C web site:&lt;/p&gt;&lt;p&gt;&lt;a href="http://apps.ultravioletconsulting.com/blogimages/AgileFromTheGroundUp/BookReviewEffectiveRESTServicesvia.NET.5_12CC2/image_3.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: block; float: none; margin-left: auto; border-left: 0px; margin-right: auto; border-bottom: 0px" height="590" alt="image" src="http://apps.ultravioletconsulting.com/blogimages/AgileFromTheGroundUp/BookReviewEffectiveRESTServicesvia.NET.5_12CC2/image_thumb_3.png" width="544" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;This becomes important because of REST’s concept of a single, generic interface, or a limited number of verbs/actions/methods. In terms of HTTP this turns out to be the standard set of HTTP methods: GET, PUT, POST, DELETE, HEAD, OPTIONS. Each of these methods must behave in a consistent, expected way when combined with a requested URI. &lt;/p&gt;&lt;p&gt;Another good reference, for quicker reading, is the &lt;a href="http://www.w3.org/TR/webarch/summary.html"&gt;summary&lt;/a&gt; of the web architecture document. This gives a list of prescriptive good practices for design.&lt;/p&gt;&lt;p&gt;For example, assuming I were authenticated and that Blogger supported this ability (I’m not sure whether it does) then issuing a request with each of the common HTTP methods above against the single URI &lt;a href="http://agilefromthegroundup.blogspot.com/feeds/posts/default/4352538909387142862"&gt;http://agilefromthegroundup.blogspot.com/feeds/posts/default/4352538909387142862&lt;/a&gt; would produce the following results:    &lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;table cellspacing="0" cellpadding="2" width="682" border="2"&gt;&lt;tbody&gt;&lt;tr&gt;         &lt;td valign="top" width="66"&gt;&lt;strong&gt;Method&lt;/strong&gt;&lt;/td&gt;          &lt;td valign="top" width="204"&gt;&lt;strong&gt;Entity Body Contents&lt;/strong&gt;&lt;/td&gt;          &lt;td valign="top" width="408"&gt;&lt;strong&gt;Expected Result&lt;/strong&gt;&lt;/td&gt;       &lt;/tr&gt;&lt;tr&gt;         &lt;td valign="top" width="72"&gt;GET&lt;/td&gt;          &lt;td valign="top" width="203"&gt;Blank&lt;/td&gt;          &lt;td valign="top" width="404"&gt;Returns the HTTP headers for and the current representation of the resource, in this case an XML document. But, does not MODIFY the resource in anyway specified from the request.&lt;/td&gt;       &lt;/tr&gt;&lt;tr&gt;         &lt;td valign="top" width="77"&gt;HEAD&lt;/td&gt;          &lt;td valign="top" width="201"&gt;Blank&lt;/td&gt;          &lt;td valign="top" width="401"&gt;Returns only the HTTP headers associated with this resource, but not the XML document itself&lt;/td&gt;       &lt;/tr&gt;&lt;tr&gt;         &lt;td valign="top" width="82"&gt;OPTIONS&lt;/td&gt;          &lt;td valign="top" width="200"&gt;Blank&lt;/td&gt;          &lt;td valign="top" width="398"&gt;Returns the list of HTTP methods this resource supports, such as GET, PUT, POST, DELETE&lt;/td&gt;       &lt;/tr&gt;&lt;tr&gt;         &lt;td valign="top" width="86"&gt;PUT&lt;/td&gt;          &lt;td valign="top" width="199"&gt;A complete replacement XML &amp;lt;entry&amp;gt; document&lt;/td&gt;          &lt;td valign="top" width="396"&gt;A response code indicating whether the replacement was accepted.&lt;/td&gt;       &lt;/tr&gt;&lt;tr&gt;         &lt;td valign="top" width="89"&gt;POST&lt;/td&gt;          &lt;td valign="top" width="199"&gt;Arbitrary content, perhaps a string of content intended to be added as a comment to the blog post&lt;/td&gt;          &lt;td valign="top" width="394"&gt;A response code indicating the result, and possibly the URI of a newly created, subordinate resource, such as a direct URI to the comment added to the entry.&lt;/td&gt;       &lt;/tr&gt;&lt;tr&gt;         &lt;td valign="top" width="91"&gt;DELETE&lt;/td&gt;          &lt;td valign="top" width="198"&gt;Blank&lt;/td&gt;          &lt;td valign="top" width="393"&gt;A response code indicating whether the resource was deleted.&lt;/td&gt;       &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;&lt;p&gt;There is much more to be said about this chapter, but I leave it to you to read it for yourself and enjoy what you learn. &lt;/p&gt;&lt;h5&gt;2: The Hypertext Transfer Protocol and the Universal Resource Identifier&lt;/h5&gt;&lt;p&gt;This chapter goes into more detail about the HTTP verbs and the standard response codes and header values, then discusses much more about specific HTTP and REST anti-patterns. These are, broadly:&lt;/p&gt;&lt;table cellspacing="0" cellpadding="2" width="729" border="2"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="122"&gt;Anti-Pattern Name&lt;/td&gt;        &lt;td valign="top" width="381"&gt;Description&lt;/td&gt;        &lt;td valign="top" width="222"&gt;Real-World Examples&lt;/td&gt;     &lt;/tr&gt;&lt;tr&gt;       &lt;td valign="top" width="122"&gt;GET Tunneling&lt;/td&gt;        &lt;td valign="top" width="381"&gt;Specifying method information to the server via GET, which is supposed to NOT modify resources from client-specified commands (idempotency)&lt;/td&gt;        &lt;td valign="top" width="222"&gt;Flickr used to have GET methods with commands like “delete” embedded in them. Google’s look-ahead pre-fetch tool caused HAVOC on many user’s accounts as a result!&lt;/td&gt;     &lt;/tr&gt;&lt;tr&gt;       &lt;td valign="top" width="122"&gt;POST Tunneling&lt;/td&gt;        &lt;td valign="top" width="381"&gt;Specifying method information inside of the POST entity body.&lt;/td&gt;        &lt;td valign="top" width="222"&gt;SOAP based RPC services are a wholesale violation of this. They embed arbitrary command names inside the envelope.&lt;/td&gt;     &lt;/tr&gt;&lt;tr&gt;       &lt;td valign="top" width="122"&gt;Misused Content-Types&lt;/td&gt;        &lt;td valign="top" width="381"&gt;&amp;#160;&lt;/td&gt;        &lt;td valign="top" width="222"&gt;&amp;#160;&lt;/td&gt;     &lt;/tr&gt;&lt;tr&gt;       &lt;td valign="top" width="122"&gt;Miusing Status Codes&lt;/td&gt;        &lt;td valign="top" width="381"&gt;&amp;#160;&lt;/td&gt;        &lt;td valign="top" width="222"&gt;&amp;#160;&lt;/td&gt;     &lt;/tr&gt;&lt;tr&gt;       &lt;td valign="top" width="122"&gt;Misusing Cache&lt;/td&gt;        &lt;td valign="top" width="381"&gt;&amp;#160;&lt;/td&gt;        &lt;td valign="top" width="222"&gt;&amp;#160;&lt;/td&gt;     &lt;/tr&gt;&lt;tr&gt;       &lt;td valign="top" width="122"&gt;Cookies&lt;/td&gt;        &lt;td valign="top" width="381"&gt;&amp;#160;&lt;/td&gt;        &lt;td valign="top" width="222"&gt;&amp;#160;&lt;/td&gt;     &lt;/tr&gt;&lt;tr&gt;       &lt;td valign="top" width="122"&gt;Lack of Hypermedia Support&lt;/td&gt;        &lt;td valign="top" width="381"&gt;&amp;#160;&lt;/td&gt;        &lt;td valign="top" width="222"&gt;&amp;#160;&lt;/td&gt;     &lt;/tr&gt;&lt;tr&gt;       &lt;td valign="top" width="122"&gt;Lack of Self-Description&lt;/td&gt;        &lt;td valign="top" width="381"&gt;&amp;#160;&lt;/td&gt;        &lt;td valign="top" width="222"&gt;&amp;#160;&lt;/td&gt;     &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h6&gt;&amp;#160;&lt;/h6&gt;&lt;p&gt;The concept of URI and Addressability is covered thoroughly. This is so important for so many reasons to get into, but suffice it to say for Search-Engine-Optimization (googleiciousness / bingability) a URI should identify a single resource unambiguously so that search engine indexes can link to it.&lt;/p&gt;&lt;p&gt;Aside from this there is a wide range of computer science concepts wrapped up inside the old trusty URI.&lt;/p&gt;&lt;p&gt;For example, when you look at the URI: &lt;a href="http://agilefromthegroundup.blogspot.com/feeds/posts/default/4352538909387142862"&gt;http://agilefromthegroundup.blogspot.com/feeds/posts/default/4352538909387142862&lt;/a&gt;, you actually have a specification that tells a user agent how to attempt fetching the resource (HTTP protocol), where to start looking for it (agilefromthegroundup.blogspot.com), where within that space to look further (/feeds/post/ etc). What you also have is a contract that is late-bound by definition. The intent of the URI is to provide, of course, a Universal Resource Identifier, which specifies NOTHING about what actually resides behind that identifier. What resides behind it is completely up to the control of the server. It can be absolutely anything. It just so happens to usually be HTML, but of course can be XML, PDF, TXT, etc.&lt;/p&gt;&lt;h5&gt;3: Desktop Client Operations&lt;/h5&gt;&lt;h5&gt;4: Web Client Operations&lt;/h5&gt;&lt;h5&gt;5: IIS and ASP.NET Internals and Instrumentation&lt;/h5&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4441160589671124737-4767965692282993078?l=agilefromthegroundup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilefromthegroundup.blogspot.com/feeds/4767965692282993078/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilefromthegroundup.blogspot.com/2009/09/book-review-effective-rest-services-via.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4441160589671124737/posts/default/4767965692282993078'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4441160589671124737/posts/default/4767965692282993078'/><link rel='alternate' type='text/html' href='http://agilefromthegroundup.blogspot.com/2009/09/book-review-effective-rest-services-via.html' title='Book Review: Effective REST Services via .NET For .NET Framework 3.5'/><author><name>Josh Gough</name><uri>http://www.blogger.com/profile/13302284610870926934</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4441160589671124737.post-6224184099874459526</id><published>2009-09-12T07:48:00.001-07:00</published><updated>2009-09-20T11:10:18.408-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='newslinks'/><category scheme='http://www.blogger.com/atom/ns#' term='discipline'/><category scheme='http://www.blogger.com/atom/ns#' term='leadership'/><title type='text'>Recommended Resources: Becoming an Expert, Extending Agile, and Individual Improvement</title><content type='html'>&lt;p&gt;There are three recent presentations posted from Agile 2009 to InfoQ.com that I highly recommend you listen to and learn from. Here are the links with the descriptions:&lt;/p&gt;&lt;h4&gt;&lt;/h4&gt;&lt;h5&gt;&lt;/h5&gt;&lt;h4&gt;Mary Poppendieck: Deliberate Practices in Software Development&lt;/h4&gt;&lt;p&gt;&lt;a title="http://www.infoq.com/presentations/poppendieck-deliberate-practice-in-software-development" href="http://www.infoq.com/presentations/poppendieck-deliberate-practice-in-software-development"&gt;http://www.infoq.com/presentations/poppendieck-deliberate-practice-in-software-development&lt;/a&gt;&lt;/p&gt;&lt;h5&gt;Description:&lt;/h5&gt;&lt;blockquote&gt;&lt;p&gt;&lt;b&gt;Summary&lt;/b&gt;       &lt;br /&gt;In the nature vs. nurture debate, researchers have declared nurture the winner. People who excel are the ones who work the hardest; it takes ten+ years of deliberate practice to become an expert. Deliberate practice is not about putting in hours, it’s about working to improve performance. It does not mean doing what you are good at; it means challenging yourself under the guidance of a teacher.       &lt;br /&gt;&lt;b&gt;Bio&lt;/b&gt;       &lt;br /&gt;Mary Poppendieck started her career as a process control programmer, moved on to manage the IT department of a manufacturing plant, and then ended up in product development, where she was both a product champion and a department manager. Mary tried to retire in 1998, but instead found herself managing a government software project where she first encountered the word &amp;quot;waterfall&amp;quot;.&lt;/p&gt;&lt;/blockquote&gt;&lt;h5&gt;Josh Comments:&lt;/h5&gt;&lt;p&gt;I’ve listened to Mary’s talks at Google and read most of her &lt;u&gt;Implementing Lean Software Development&lt;/u&gt; book recently. This talk is excellent. She discusses not just software, but also music performance and artistic talent development, citing studies that have shown it typically takes about 10,000 focused hours for musicians to truly reach the level of expert, and that many of them who begin early in life reach this number of hours by age 20! Regarding software development, 10 years of working professionally is about 20,000 working hours, but of course not all of those hours are spent crafting software. I’ve been working professionally about 10 years, and I think I’m near that level of expertise in a broadened sense, but have much, much, much more to learn in the depth direction.&lt;/p&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;h4&gt;Allistair Cockburn: I Come to Bury Agile, Not to Praise It&lt;/h4&gt;&lt;p&gt;&lt;a title="http://www.infoq.com/presentations/cockburn-bury-not-praise-agile" href="http://www.infoq.com/presentations/cockburn-bury-not-praise-agile"&gt;http://www.infoq.com/presentations/cockburn-bury-not-praise-agile&lt;/a&gt;&lt;/p&gt;&lt;h5&gt;Description:&lt;/h5&gt;&lt;blockquote&gt;&lt;p&gt;&lt;b&gt;Summary&lt;/b&gt;       &lt;br /&gt;Agile came from small, colocated projects in the 1990s. It has spread to large, globally distributed commercial projects, affecting the IEEE, the PMI, the SEI and the Department of Defense. Agile now sits in a larger landscape and should be viewed accordingly. This talk shows that landscape, clarifying how classical agile fits in and what constitutes effective development outside that narrow area. &lt;/p&gt;&lt;p&gt;&lt;b&gt;Bio&lt;/b&gt;       &lt;br /&gt;Dr. Alistair Cockburn is a world-renowned expert at what is called agile development, the early and regular delivery of business value through improved communications, fast feedback and staged delivery. Dr. Cockburn co-founded the agile development movement, co-authoring the Manifesto for Agile Software Development and the project leadership Declaration of Inter-dependence.&lt;/p&gt;&lt;/blockquote&gt;&lt;h5&gt;Josh Comments:&lt;/h5&gt;&lt;p&gt;This is a great talk which is not really about burying agile, but about recognizing that the basic practices of agile now need to give way to ideas like Software Craftsmanship. He covers much more ground than this, but I’ll just highlight the Software Craftsmanship principles:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;“As aspiring Software Craftsmen we are raising the bar of professional software development by practicing it and helping others learn the craft. Through this work we have come to value:&lt;/p&gt;&lt;p&gt;Not only working software,&lt;/p&gt;&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; but also &lt;strong&gt;well-crafted software&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Not only responding to change,&lt;/p&gt;&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; but also &lt;strong&gt;steadily adding value&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Not only individuals and interactions,&lt;/p&gt;&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; but also a &lt;strong&gt;community of professionals&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Not only customer collaboration,&lt;/p&gt;&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; but also &lt;strong&gt;productive partnerships&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;That is, in pursuit of the items on the left we have found the items on the right to be indispensable.”&lt;/p&gt;&lt;/blockquote&gt;&lt;h4&gt;Ashley Johnson and Amr Elssamadisy: Scaling Up by Scaling Down: A (re)Focus on Individual Skills&lt;/h4&gt;&lt;p&gt;&lt;a title="http://www.infoq.com/presentations/scaling-up-by-scaling-down" href="http://www.infoq.com/presentations/scaling-up-by-scaling-down"&gt;http://www.infoq.com/presentations/scaling-up-by-scaling-down&lt;/a&gt;&lt;/p&gt;&lt;h5&gt;Description:&lt;/h5&gt;&lt;blockquote&gt;&lt;p&gt;&lt;b&gt;Summary&lt;/b&gt;       &lt;br /&gt;In this presentation, the causality between performance in the small (individuals and teams) and performance in the large is highlighted and explained. Discover what you can do as an individual regardless of your position in the hierarchy to enable higher performance software development.       &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Bio&lt;/b&gt;       &lt;br /&gt;Ashley Johnson splits his time between understanding the challenges that companies face, and consulting with senior IT management to facilitate organizational optimization. Author of the leading book on Agile Adoption, Amr Elssamadisy spends his time helping others learn better ways to develop software and connecting the software development process with its rightful driver - business value.&lt;/p&gt;&lt;/blockquote&gt;&lt;h5&gt;Josh Comments:&lt;/h5&gt;&lt;p&gt;What I like most about this presentation, is how Ashley Johnson incorporates audience participation and experimentation into the course of the presentation. This is the essence of teaching and learning. During my Scrum training with Jeff Sutherland, I was impressed by how Jeff used Scrum to run the training, creating his own task wall with sticky notes which also served as a burndown mechanism. He broke us up into small groups and we worked on problems and exercises that way.&lt;/p&gt;&lt;p&gt;Just to highlight, at one point Ashley asks the audience to break into pairs of two and to come up with a list of “&lt;strong&gt;What is required for a high performing team?” &lt;/strong&gt;This is what the participants came up with on their own: &lt;/p&gt;&lt;ul&gt;&lt;li&gt;Shared vision that matters&lt;/li&gt;&lt;li&gt;Trust between the team members&lt;/li&gt;&lt;li&gt;Communication&lt;/li&gt;&lt;li&gt;Passion&lt;/li&gt;&lt;li&gt;Empowerment&lt;/li&gt;&lt;li&gt;Having fun &lt;/li&gt;&lt;li&gt;Challenging each other while holding each other accountable&lt;/li&gt;&lt;li&gt;Leadership&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4441160589671124737-6224184099874459526?l=agilefromthegroundup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilefromthegroundup.blogspot.com/feeds/6224184099874459526/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilefromthegroundup.blogspot.com/2009/09/recommended-resources-becoming-expert.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4441160589671124737/posts/default/6224184099874459526'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4441160589671124737/posts/default/6224184099874459526'/><link rel='alternate' type='text/html' href='http://agilefromthegroundup.blogspot.com/2009/09/recommended-resources-becoming-expert.html' title='Recommended Resources: Becoming an Expert, Extending Agile, and Individual Improvement'/><author><name>Josh Gough</name><uri>http://www.blogger.com/profile/13302284610870926934</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4441160589671124737.post-4352538909387142862</id><published>2009-09-05T14:33:00.001-07:00</published><updated>2009-09-20T11:11:05.124-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='d=vt'/><category scheme='http://www.blogger.com/atom/ns#' term='velocity'/><category scheme='http://www.blogger.com/atom/ns#' term='planning'/><category scheme='http://www.blogger.com/atom/ns#' term='estimation'/><title type='text'>D = V * T : The formula in software DeVelopmenT to get features DONE</title><content type='html'>&lt;p&gt;There’s a hidden formula in software &lt;strong&gt;D&lt;/strong&gt;e&lt;strong&gt;V&lt;/strong&gt;elopmen&lt;strong&gt;T&lt;/strong&gt; that tells how fast a team can get features DONE and Ready-to-Ship.&lt;/p&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;p align="center"&gt;The formula is:&lt;font color="#008000"&gt; &lt;strong&gt;&lt;em&gt;D = V * T&lt;/em&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&lt;p align="center"&gt;It reads as: &lt;strong&gt;&lt;em&gt;&lt;font color="#008000"&gt;DONE Features = Velocity multiplied by Time&lt;/font&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;h4&gt;The importance of a software development team’s velocity&lt;/h4&gt;&lt;p&gt;The term &lt;strong&gt;“velocity”&lt;/strong&gt; as it applies to software development is simple to explain and to illustrate. Here’s my definition:&lt;/p&gt;&lt;blockquote&gt;&lt;p align="left"&gt;&lt;em&gt;&lt;strong&gt;Velocity: A team’s velocity is the number of features it can get completely DONE and Ready-to-Ship during a short, fixed time period (2 to 4 weeks)&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Velocity is extremely important for business owners and other project stakeholders. Without knowing the velocity of their team, they have no way to reliably plan release dates and coordinate marketing and sales teams. (2) It’s no exaggeration to say that the most important thing a professional software team can do to increase its value to an organization is to become skilled in the arts of estimation and planning. This post introduces the concepts behind&amp;#160; velocity measurement, and provides links for more detailed reading.&lt;/p&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;h3&gt;Are we there yet? Speed racing down the software delivery highway&lt;/h3&gt;&lt;p&gt;Building successful software and delivering it on time is an art of numbers. It all boils down to math, like physics or accounting.&lt;/p&gt;&lt;p&gt;Who can forget the familiar high-school formula &lt;em&gt;&lt;strong&gt;D = V * T&lt;/strong&gt;? (also written as D = R * T)&lt;/em&gt;&lt;/p&gt;&lt;p&gt;This, of course, is the famous equation for calculating how far you can travel from a given starting point to another when you already know your velocity (or rate) and how long you will be travelling.&lt;/p&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;blockquote&gt;&lt;p align="left"&gt;&lt;em&gt;&lt;strong&gt;Distance = Velocity multiplied by Time&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;em&gt;For example: if we have know we are traveling at 50 miles per hour and plan to travel for 3 hours, then we know we will travel 150 miles.&lt;/em&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;em&gt;&lt;/em&gt;&amp;#160;&lt;/p&gt;&lt;p align="left"&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;What happens though if we do not know our velocity, but instead know how far we have traveled and how much time it took to get there? Can we derive our velocity from these other two measurements? Of course we can with simple math. In this case, we have D and T, and can derive V by modifying the formula to be V = D / T.&lt;/p&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;blockquote&gt;&lt;p align="left"&gt;&lt;em&gt;&lt;strong&gt;Velocity = Distance divided by Time&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;em&gt;For example: if we have traveled 120 miles after 3 hours from point A to point B, then we know our velocity per 1 single hour is 40, or 40 mph.&lt;/em&gt;&amp;#160;&lt;/p&gt;&lt;p align="left"&gt;&amp;#160;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;a href="http://apps.ultravioletconsulting.com/blogimages/AgileFromTheGroundUp/DONEFeaturesequalsVelocitymultipliedbyTi_F682/Highway.jpg"&gt;&lt;img title="Highway" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="231" alt="Highway" src="http://apps.ultravioletconsulting.com/blogimages/AgileFromTheGroundUp/DONEFeaturesequalsVelocitymultipliedbyTi_F682/Highway_thumb.jpg" width="344" border="0" /&gt;&lt;/a&gt;&amp;#160; &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Figure 1: Two US high school math students calculating how far they can travel before returning to math class&amp;#160; in 30 minutes or before being caught by authorities for driving on the wrong side of the road.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;h3&gt;Measuring velocity in software development to decrease time-to-market and realize faster ROI&lt;/h3&gt;&lt;p&gt;I hear what you’re screaming: enough with the PSAT math prep already, how does this apply to releasing software on time? It’s so simple you’ll kick yourself, or your team, for not doing this already. &lt;/p&gt;&lt;p&gt;Agile teams use a formula that works the same way. It’s calculated differently, because most software teams aren’t very mobile while coding, though it would be relaxing to code on a boat. &lt;/p&gt;&lt;p&gt;Because a team cannot reliably know in advance how quickly it can complete a set of features, it must use the second form of the equation to derive its velocity based upon actual observation of progress first.&lt;/p&gt;&lt;p&gt;Thus, the formula for calculating an agile team’s initial velocity still reads as V = D / T, except the D stands for &lt;strong&gt;“DONE Features”&lt;/strong&gt; instead of distance. T, or time, usually stands for 2 to 4 weeks instead of 1 hour. For this article, we’ll assume it means 3 weeks.&lt;/p&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;&lt;strong&gt;Initial Velocity = DONE Features divided by Time&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;For example: if we get 6 features DONE in 3 weeks, then we know our velocity is 6 features per 3 weeks. Simplified, we’ll say 2 features per week.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Here is a simple chart depicting this velocity:&lt;/p&gt;&lt;p&gt;&lt;a href="http://apps.ultravioletconsulting.com/blogimages/AgileFromTheGroundUp/DONEFeaturesequalsVelocitymultipliedbyTi_F682/software_velocity_tracking.png"&gt;&lt;img title="software_velocity_tracking" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="327" alt="software_velocity_tracking" src="http://apps.ultravioletconsulting.com/blogimages/AgileFromTheGroundUp/DONEFeaturesequalsVelocitymultipliedbyTi_F682/software_velocity_tracking_thumb.png" width="458" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Figure 2: Velocity measurement illustration of six features becoming done during a three-week period&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;It’s tempting to look at this chart and say the velocity is 2 features per week, and that we can now start using the formula &lt;strong&gt;DONE Features = Velocity multiplied by Time&lt;/strong&gt; to plan ahead. We will use this simplification for the purposes of this article, but keep in mind that this may or may not be true, so be careful! Here are two reasons why:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;New Requirements Discovered&lt;/strong&gt;: During the course of any three-week period, teams will discover new requirements frequently. The new requirements could be bugs, change requests from the business team, or important changes required to match the competition. This is a subject for an entire volume on change management! &lt;/li&gt;&lt;li&gt;&lt;strong&gt;Definition of DONE: &lt;/strong&gt;It’s extremely important that a team agrees upon what qualifies as a DONE feature. Each team must define what it means by the word DONE. I leave that as an exercise for a future article, but you can find some recommended reading and listening below for reference. (3, 4) &lt;/li&gt;&lt;/ol&gt;&lt;p&gt;For the rest of this post, we’ll pretend that no new requirements are discovered and we’ll define a feature as DONE if it has successfully passed through each of the following development phases:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Requirements Definition &lt;/li&gt;&lt;li&gt;Analysis, Design, and sufficient Documentation &lt;/li&gt;&lt;li&gt;Coding &lt;/li&gt;&lt;li&gt;Unit Testing &lt;/li&gt;&lt;li&gt;Code Review (for development standards adherence and security design assessment) &lt;/li&gt;&lt;li&gt;Refactoring (to conform to standards and address security deficiencies) &lt;/li&gt;&lt;li&gt;Functional Testing &lt;/li&gt;&lt;li&gt;User Acceptance Testing (preferably automated) &lt;/li&gt;&lt;li&gt;Performance Testing &lt;/li&gt;&lt;li&gt;Pilot (beta testing with real or proxy users) &lt;/li&gt;&lt;li&gt;Ready-to-Ship &lt;/li&gt;&lt;/ol&gt;&lt;p&gt;This may sound like a lot of work! And, it certainly is a lot of work. All mission-critical projects consist of a number of features that must go through these steps before they can be considered DONE and Ready-to-Ship.&lt;/p&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;h3&gt;Pitfalls of using early travel velocity to forecast total road trip duration&lt;/h3&gt;&lt;p&gt;Returning to our travel example, suppose we are traveling from our city to the mountains for a conference about software estimation and planning. We know the destination is 500 miles away. We also know that the interstate through our city and into the next state has a speed limit of 70 mph. A simple calculation tells us that it would take 7.14 hours to travel 500 miles at 70 mph.&lt;/p&gt;&lt;p&gt;What if you absolutely had to be at the meeting on time? Would you think it’s wise to turn that back-of-the-napkin &lt;strong&gt;&lt;em&gt;estimate&lt;/em&gt;&lt;/strong&gt; into a &lt;strong&gt;&lt;em&gt;target&lt;/em&gt;&lt;/strong&gt; to which you could &lt;strong&gt;&lt;em&gt;commit&lt;/em&gt;&lt;/strong&gt;? &lt;/p&gt;&lt;p&gt;Most people would say it’s insane to expect that would travel into the mountains at 70 mph, the same velocity as the interstate. What’s more, you’d have to take bathroom breaks and food breaks too. You agree with most people.&lt;/p&gt;&lt;p&gt;You decide to email the mailing list for the conference and ask if anyone has ever traveled from your city to the mountain location, and get a response complete with a chart! Your colleague says she kept track of how many miles she traveled during each hour and came up with chart in figure 3 showing that it took just over 9 hours to complete the 500 miles.&lt;/p&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;&lt;a href="http://apps.ultravioletconsulting.com/blogimages/AgileFromTheGroundUp/DONEFeaturesequalsVelocitymultipliedbyTi_F682/travel_velocity_tracking.png"&gt;&lt;img title="travel_velocity_tracking" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="327" alt="travel_velocity_tracking" src="http://apps.ultravioletconsulting.com/blogimages/AgileFromTheGroundUp/DONEFeaturesequalsVelocitymultipliedbyTi_F682/travel_velocity_tracking_thumb.png" width="458" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Figure 3: Chart showing total number of miles driven after each hour in red and number of miles driven during each hour in blue&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;If we round up the number of hours traveled to an even 10, we’ll just call this 50 mph. The reasons we cannot travel at 70 mph during the entire trip is simple: mountains are more curvy and dangerous, and we have to break for food and the bathroom. Only after completing the trip one time can we look back and use the experience as a way to gauge future trips through the same or similar terrain.&lt;/p&gt;&lt;p&gt;Let’s take a beginner's look now at how agile teams can use historical data, combined with estimation, to produce better delivery date forecasts. This will be covered in more depth in my next post.&lt;/p&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;h4&gt;Producing better software delivery date forecasts using simple, empirical estimation techniques&lt;/h4&gt;&lt;p&gt;Similarly, if we know our total number of features is 50, and that our velocity is 2 features-per-week, then it’s tempting to calculate that it should take 25 weeks to complete our project.&lt;/p&gt;&lt;p&gt;Alas, software development is rarely as simple as driving down a straight interstate. Just like the journey into the mountains takes us through a variety of terrain and we must take breaks, all software development takes us through all kinds of unexpected requirements. Stakeholders request new features, markets changes, people get hired, people get fired!&lt;/p&gt;&lt;p&gt;And, most importantly, not all features are the same size or complexity. Because of this, agile teams need to take additional steps to bring predictability to delivery schedules. This is usually done with estimation techniques like Wideband Delphi or Planning Poker. These two techniques have been written about by Steve McConnell and Mike Cohn, respectively. (5, 6, 7) &lt;/p&gt;&lt;p&gt;I will cover Planning Poker in more detail in a future post, but the main idea behind it is that the entire team takes a few hours every three weeks to look ahead at the work to be done and places a relative estimate of size or complexity estimate on each item. They then measure how quickly they can complete each item. So instead our simple count of “50 features”, the team might actually have a number such as 150 “points”, which means that, on average, each feature is roughly 3 points of estimated size or complexity. For now, however, let’s continue to focus on tracking how fast the team moves through 50 features.&lt;/p&gt;&lt;p&gt;Agile teams typically use a chart that is drawn from the top down towards zero, which indicates zero more features outstanding! This is called a &lt;strong&gt;burndown chart, &lt;/strong&gt;and a realistic chart might look as follows in figure 4:&lt;/p&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;&lt;a href="http://apps.ultravioletconsulting.com/blogimages/AgileFromTheGroundUp/DONEFeaturesequalsVelocitymultipliedbyTi_F682/software_velocity_burndown_chart.png"&gt;&lt;img title="software_velocity_burndown_chart" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="378" alt="software_velocity_burndown_chart" src="http://apps.ultravioletconsulting.com/blogimages/AgileFromTheGroundUp/DONEFeaturesequalsVelocitymultipliedbyTi_F682/software_velocity_burndown_chart_thumb.png" width="532" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Figure 4: Hypothetical burndown chart illustrating how the amount of actual work, in blue, fluctuates up and down as the total number of UNDONE features approaches zero. The initial estimate of 50 features and the target velocity of burning down 2 features per week is shown in red&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;This chart shows that the team had 50 features remaining to implement at the start of week 0. The initial target velocity of 2 features per week holds up for a few weeks, shown in red, but then it falls off a bit before speeding up to be faster than 2 per week. Not to be outdone, perhaps the business team feels the team can do more work, and new features get added. This causes the time between week 11 and 24 to remain relatively flat before the velocity picks up again.&lt;/p&gt;&lt;p&gt;By the time the initial 50 features are completed, we can calculate that they burned down at a rate of about 1.5 per week. Now, this simple chart does not actually show how many features were added during the duration of the project, though it’s obvious when you see the blue spikes. There are more sophisticated charts that can help illustrate this, but I’ll leave that for next time.&lt;/p&gt;&lt;p&gt;In the meantime, please visit the suggested resources, starting with Mike Cohn’s excellent presentation about Agile Estimation and Planning, to learn more. (1)&lt;/p&gt;&lt;p&gt;Until next time, stay agile not fragile.&lt;/p&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;h4&gt;References and Resources &lt;/h4&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;“Introduction to Agile Estimation and Planning” – by Mike Cohn, PDF presentation about release planning with agile estimation and planning techniques: &lt;a title="http://www.mountaingoatsoftware.com/presentations/106-introduction-to-agile-estimating-and-planning" href="http://www.mountaingoatsoftware.com/presentations/106-introduction-to-agile-estimating-and-planning"&gt;http://www.mountaingoatsoftware.com/presentations/106-introduction-to-agile-estimating-and-planning&lt;/a&gt; &lt;/li&gt;&lt;li&gt;“Nokia Test : Where did it come from?” – by Jeff Sutherland, about how Nokia uses velocity tracking to assess their teams’ productivity and likelihood to generate future ROI: &lt;a title="http://jeffsutherland.com/scrum/2008/08/nokia-test-where-did-it-come-from.html" href="http://jeffsutherland.com/scrum/2008/08/nokia-test-where-did-it-come-from.html"&gt;http://jeffsutherland.com/scrum/2008/08/nokia-test-where-did-it-come-from.html&lt;/a&gt; &lt;/li&gt;&lt;li&gt;“How Do We Know When We Are Done?” – by Mitch Lacey, about how his team defined DONE with the whole team’s participation: &lt;a title="http://www.scrumalliance.org/articles/107-how-do-we-know-when-we-are-done" href="http://www.scrumalliance.org/articles/107-how-do-we-know-when-we-are-done"&gt;http://www.scrumalliance.org/articles/107-how-do-we-know-when-we-are-done&lt;/a&gt; &lt;/li&gt;&lt;li&gt;“Scrum, et al” – by Ken Schwaber about the history of Scrum, presented at Google : &lt;a href="http://www.youtube.com/watch?v=IyNPeTn8fpo"&gt;http://www.youtube.com/watch?v=IyNPeTn8fpo&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;u&gt;Software Estimation: Demystifying the Black Art&lt;/u&gt;&lt;/strong&gt; – by Steve McConnell, book about lessons learned and best practices for software estimation: &lt;a title="http://www.amazon.com/Software-Estimation-Demystifying-Practices-Microsoft/dp/0735605351" href="http://www.amazon.com/Software-Estimation-Demystifying-Practices-Microsoft/dp/0735605351"&gt;http://www.amazon.com/Software-Estimation-Demystifying-Practices-Microsoft/dp/0735605351&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;u&gt;Agile Estimation and Planning&lt;/u&gt;&lt;/strong&gt; – by Mike Cohn, book about how to perform agile estimation and planning using simple estimation techniques and short, fixed time-boxed development iterations: &lt;a title="http://www.amazon.com/Agile-Estimating-Planning-Mike-Cohn/dp/0131479415" href="http://www.amazon.com/Agile-Estimating-Planning-Mike-Cohn/dp/0131479415"&gt;http://www.amazon.com/Agile-Estimating-Planning-Mike-Cohn/dp/0131479415&lt;/a&gt; &lt;/li&gt;&lt;li&gt;ATL ALT.NET Meetup recorded conversation about &lt;strong&gt;&lt;u&gt;Agile Estimation and Planning&lt;/u&gt;&lt;/strong&gt;: &lt;a title="http://www.meetup.com/AtlAltDotNet/calendar/9525107/?eventId=9525107&amp;amp;action=detail" href="http://www.meetup.com/AtlAltDotNet/calendar/9525107/?eventId=9525107&amp;amp;action=detail"&gt;http://www.meetup.com/AtlAltDotNet/calendar/9525107/?eventId=9525107&amp;amp;action=detail&lt;/a&gt; (direct MP3 link: &lt;a title="http://apps.ultravioletconsulting.com/audio/ATLAltDotNet/ATLAltDotNet-2009-01-27-AgileEstimationAndPlanningDiscussion.mp3" href="http://apps.ultravioletconsulting.com/audio/ATLAltDotNet/ATLAltDotNet-2009-01-27-AgileEstimationAndPlanningDiscussion.mp3"&gt;http://apps.ultravioletconsulting.com/audio/ATLAltDotNet/ATLAltDotNet-2009-01-27-AgileEstimationAndPlanningDiscussion.mp3&lt;/a&gt;) &lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4441160589671124737-4352538909387142862?l=agilefromthegroundup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilefromthegroundup.blogspot.com/feeds/4352538909387142862/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilefromthegroundup.blogspot.com/2009/09/done-features-equals-velocity.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4441160589671124737/posts/default/4352538909387142862'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4441160589671124737/posts/default/4352538909387142862'/><link rel='alternate' type='text/html' href='http://agilefromthegroundup.blogspot.com/2009/09/done-features-equals-velocity.html' title='D = V * T : The formula in software DeVelopmenT to get features DONE'/><author><name>Josh Gough</name><uri>http://www.blogger.com/profile/13302284610870926934</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4441160589671124737.post-6819463692952207720</id><published>2009-07-19T12:59:00.001-07:00</published><updated>2009-09-05T15:41:22.891-07:00</updated><title type='text'>From Waterfall to Agile Development in 15 Minutes: An Introduction for Everyone</title><content type='html'>&lt;h4&gt;Good, Fast (Now), and Cheap: Pick All Three&lt;/h4&gt;  &lt;p&gt;&lt;span style="font-weight: bold; background-color: beige"&gt;&lt;span style="font-weight: bold; background-color: yellow"&gt;New!&lt;/span&gt; &lt;a href="http://apps.ultravioletconsulting.com/audio/AgileFromTheGroundUp/WaterfallToAgile/WaterfallToAgileIn15Minutes.mp3" target="_blank"&gt;Listen to the MP3 Podcast version of this article&lt;/a&gt;&lt;/span&gt; &lt;/p&gt;  &lt;p&gt;Company owners, sales professionals, and software development professionals all want to deliver high-quality products and services to their customers. They want to do this more quickly than their competition, reducing their time-to-market. They also want to generate a return-on-investment (ROI) as soon as possible. To top it off, they want to do all of this at a lower cost of development to maximize profitability.&lt;/p&gt;  &lt;p&gt;To successfully deliver products and services, software development professionals have designed what are called “software development methodologies”. Essentially, a methodology is a collection of practices, policies, and conventions used to plan, develop, and deliver a software system over the lifecycle of a project.&lt;/p&gt;  &lt;h4&gt;Article Goal: Use and Understand Both Waterfall and Agile Methods in the Next 15 Minutes&lt;/h4&gt;  &lt;p&gt;Two of the most widely known and used types of methodologies are broadly classified as “waterfall” and “agile”. The goal of this article is not to provide an exhaustive theoretical treatise on methodologies, but instead to simulate both waterfall and agile by getting you the reader to apply each of them to process of reading the remainder of this article. By doing this, you will experience a microcosm of what it feels like to work with each type of methodology.&lt;/p&gt;  &lt;p&gt;First, let’s get some basic definitions. These from Wikipedia will do just fine:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;Waterfall software development&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;The waterfall model is a sequential software development process, in which progress is seen as flowing steadily downwards (like a waterfall) through the phases of Conception, Initiation, Analysis, Design (validation), Construction, Testing and maintenance.&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;Agile software development&lt;/strong&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;Agile software development refers to a group of software development methodologies based on iterative development, where requirements and solutions evolve through collaboration between self-organizing cross-functional teams. The term was coined in the year 2001 when the Agile Manifesto was formulated.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Let’s use both of them now and compare and contrast them.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h4&gt;First Let’s Try a Waterfall-like Method to Read About Waterfall&lt;/h4&gt;  &lt;p&gt;In his book &lt;u&gt;&lt;strong&gt;Software Estimation&lt;/strong&gt;&lt;/u&gt;, software development legend Steve McConnell states that the first rule of estimation is to &lt;strong&gt;“Distinguish between estimates, targets, and commitments”. &lt;/strong&gt;What tends to happen on many sequential Waterfall projects is that there is no distinction whatsoever.&lt;/p&gt;  &lt;p&gt;Instead, what usually happens is that someone, usually a business owner will say, &lt;strong&gt;&amp;quot;We need to have this project done in three months, 90 days. We won’t have time for quality assurance on this project until the end, so don’t make many mistakes. Do you think you can make that date?”&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;The development staff, or, more likely, the appointed technical lead of the development staff will say, &lt;em&gt;&lt;strong&gt;“We should be able to make that date.”&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;What just happened is that the business owner just heard a &lt;strong&gt;&lt;em&gt;commitment&lt;/em&gt;&lt;/strong&gt; from the developer. The developer may actually view that date as more of an &lt;strong&gt;&lt;em&gt;estimate&lt;/em&gt;&lt;/strong&gt; or a &lt;strong&gt;&lt;em&gt;target&lt;/em&gt;&lt;/strong&gt;. But, the damage is done. The owner now believes the product or service will be ready-to-ship in 90 days. &lt;/p&gt;  &lt;p&gt;Now, regardless of the complexity of the work, the development staff will begin laboring to meet an arbitrary date chosen only by the owner and the technical lead. What’s worse, when quality assurance is “put off” to the end on projects like this, inevitably the project will run far longer than the desired and committed date. With no formal feedback loop in process until the end, the owner will likely “check in” periodically with the development team and ask the team lead,&lt;strong&gt; “How are we looking for meeting the three month date?”&lt;/strong&gt; The team lead will tell him or her, &lt;strong&gt;“We’re doing pretty good”&lt;/strong&gt;. What else can they say? They have not had any QA performed against their work, so it’s actually impossible for the development team to determine the correctness or completeness of their work!     &lt;br /&gt;    &lt;br /&gt;&lt;/p&gt;  &lt;h4&gt;You Have Exactly 90 Seconds, Now Go &lt;/h4&gt;  &lt;p&gt;So, to give you a chance to experience how this feels, I’ll play the role of the business owner who operates a web site that offers podcasts and recorded audio about software methodologies. I come to you, my team lead, and say:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;“I need you to record yourself reading the following Wikipedia entry about Waterfall software development aloud, completely, and I need you to do it in one-and-a-half minutes, 90 seconds. I want you to read it carefully because we don’t have time for correcting mistakes. We need it ready for release on our downloads section of the web site. Do you think you can do that?”&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Get out your stop-watch and time yourself! &lt;/p&gt;  &lt;p&gt;&lt;em&gt;&lt;strong&gt;Ready, Set, Read Aloud!&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;The waterfall model is a sequential software development process, in which progress is seen as flowing steadily downwards (like a waterfall) through the phases of Conception, Initiation, Analysis, Design (validation), Construction, Testing and maintenance. &lt;/p&gt;    &lt;p&gt;It should be readily apparent that the waterfall development model has its origins in the manufacturing and construction industries; highly structured physical environments in which after-the-fact changes are prohibitively costly, if not impossible. Since no formal software development methodologies existed at the time, this hardware-oriented model was simply adapted for software development. &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Owner: “How we doing?”&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Team Lead: “Pretty good…”&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Owner: “That’s great!”&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;The first formal description of the waterfall model is often cited to be an article published in 1970 by Winston W. Royce (1929–1995), although Royce did not use the term &amp;quot;waterfall&amp;quot; in this article. Ironically, Royce was presenting this model as an example of a flawed, non-working model (Royce 1970). This is in fact the way the term has generally been used in writing about software development—as a way to criticize a commonly used software practice. &lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;In Royce's original Waterfall model, the following phases are followed in order: &lt;/p&gt;    &lt;p&gt;1. Requirements specification      &lt;br /&gt;2. Design       &lt;br /&gt;3. Construction (AKA implementation or coding)&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Owner: “Are we done yet?”&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Team Lead: “How much of the last two paragraphs do we need finished before we release? We can’t make 90 seconds…”&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Owner: “We need it all. I’m very disappointed, but this means we have to let the date slip. How much longer is this going to take?”&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Team Lead: “Shouldn’t be too much longer…”&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;4. Integration      &lt;br /&gt;5. Testing and debugging (AKA Validation)       &lt;br /&gt;6. Installation       &lt;br /&gt;7. Maintenance &lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;To follow the waterfall model, one proceeds from one phase to the next in a purely sequential manner. For example, one first completes requirements specification, which are set in stone. When the requirements are fully completed, one proceeds to design. The software in question is designed and a blueprint is drawn for implementers (coders) to follow — this design should be a plan for implementing the requirements given. When the design is fully completed, an implementation of that design is made by coders. Towards the later stages of this implementation phase, separate software components produced are combined to introduce new functionality and reduced risk through the removal of errors. &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Owner: “How we doing now? Are we ready for QA?”&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Team Lead: “Just a little while longer…”&lt;/em&gt; &lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Thus the waterfall model maintains that one should move to a phase only when its preceding phase is completed and perfected. However, there are various modified waterfall models (including Royce's final model) that may include slight or major variations upon this process.&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;a href="http://apps.ultravioletconsulting.com/blogimages/AgileFromTheGroundUp/IntroducingAgileandScrumbyExperiencingTh_10D5A/waterfall.png"&gt;&lt;img title="waterfall" style="border-right: 0px; border-top: 0px; display: block; float: none; margin-left: auto; border-left: 0px; margin-right: auto; border-bottom: 0px" height="401" alt="waterfall" src="http://apps.ultravioletconsulting.com/blogimages/AgileFromTheGroundUp/IntroducingAgileandScrumbyExperiencingTh_10D5A/waterfall_thumb.png" width="519" border="0" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;/blockquote&gt;  &lt;h4&gt;All Washed Up&lt;/h4&gt;  &lt;p&gt;If you read aloud closer to how I read aloud, then it probably took you between 2 and 3 minutes (120 and 180 seconds) to read this passage. That’s a lot longer than 1.5 minutes or 90 seconds!&lt;/p&gt;  &lt;p&gt;No wonder the owner is disappointed. He asked you if you could complete the assignment in 90 seconds. You told him you should be able to do so, and then you failed to deliver.&lt;/p&gt;  &lt;p&gt;There’s got to be a better way to guess how long it’s going to take to do something we’ve never done before, right?&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h4&gt;Now Let’s Try an Iterative and Incremental (Agile) Method to Read About Agile!&lt;/h4&gt;  &lt;p&gt;This time, we’re going to do something different to plan our release. As a business owner, I’ve learned my lesson from above and I realize I need more control over my release date and my teams. Because of this, I’m going to work with you to iteratively plan the release, based upon an actual, observed rate of progress. I’m going to call this rate of progress a &lt;span style="font-weight: bold"&gt;“Sentence Velocity”&lt;/span&gt;. In later articles, we’ll read about software author Mike Cohn’s writings about user stories, story points, and velocity and how those are crucial measures of progress in an Agile world. But, since we’re starting small, we’re just going to worry about one sentence at a time.     &lt;br /&gt;    &lt;br /&gt;&lt;/p&gt;  &lt;h4&gt;Let’s Plan and Measure as We Go This Time&lt;/h4&gt;  &lt;p&gt;I’ve numbered each sentence or sentence equivalent sequentially. This time, I tell you:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;“I want you to read the following passages from &lt;a href="http://www.agilemanifesto.org/"&gt;http://www.agilemanifesto.org&lt;/a&gt; aloud in 20-second iterations. Read the numbers out loud too. I will keep a tally of how many sentences you've gotten through after each iteration. I’ll divide this tally by the number of iterations, and this will tell me your Sentence Velocity per iteration. This way I can forecast how many iterations total it will take you to finish the whole page.”&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;On Your Mark, Get Set, Go!&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;h4&gt;Manifesto for Agile Software Development (1)&lt;/h4&gt;    &lt;p&gt;We are uncovering better ways of developing software by doing it and helping others do it. (2)&lt;/p&gt;    &lt;p&gt;Through this work we have come to value: (3)&lt;/p&gt;    &lt;ul&gt;     &lt;li&gt;Individuals and interactions over processes and tools (4) &lt;/li&gt;      &lt;li&gt;Working software over comprehensive documentation (5) &lt;/li&gt;   &lt;/ul&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;em&gt;&lt;strong&gt;Owner looks at backlog, sees the team has read 5 sentences and calculates that it should take 6 iterations to complete, or 120 seconds.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;ul&gt;     &lt;li&gt;Customer collaboration over contract negotiation (6) &lt;/li&gt;      &lt;li&gt;Responding to change over following a plan (7) &lt;/li&gt;   &lt;/ul&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;That is, while there is value in the items on the right, we value the items on the left more. (8)&lt;/p&gt;    &lt;ul&gt;     &lt;li&gt;Kent Beck &lt;/li&gt;      &lt;li&gt;Mike Beedle &lt;/li&gt;      &lt;li&gt;Arie van Bennekum &lt;/li&gt;      &lt;li&gt;Alistair Cockburn &lt;/li&gt;      &lt;li&gt;Ward Cunningham (9) &lt;/li&gt;   &lt;/ul&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;em&gt;&lt;strong&gt;Owner again inspects the backlog, this time seeing 9 sentences finished, and calculated the pace is now 7 iterations, or 140 seconds. He plans his marketing, sales, training, and operations teams expectations accordingly.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;ul&gt;     &lt;li&gt;Martin Fowler &lt;/li&gt;      &lt;li&gt;James Grenning &lt;/li&gt;      &lt;li&gt;Jim Highsmith &lt;/li&gt;      &lt;li&gt;Andrew Hunt (10) &lt;/li&gt;      &lt;li&gt;Ron Jeffries &lt;/li&gt;      &lt;li&gt;Jon Kern &lt;/li&gt;      &lt;li&gt;Brian Marick &lt;/li&gt;      &lt;li&gt;Robert C. Martin (11) &lt;/li&gt;      &lt;li&gt;Steve Mellor &lt;/li&gt;      &lt;li&gt;Ken Schwaber &lt;/li&gt;      &lt;li&gt;Jeff Sutherland &lt;/li&gt;      &lt;li&gt;Dave Thomas (12) &lt;/li&gt;   &lt;/ul&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;h4&gt;Principles behind the Agile Manifesto (13)&lt;/h4&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;We follow these principles: &lt;/em&gt;(14)&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;em&gt;&lt;strong&gt;Owner observes the backlog and sees the velocity is still 7. Takes no action.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Our highest priority is to satisfy the customer through early and continuous delivery of valuable software. (15)&lt;/p&gt;    &lt;p&gt;Welcome changing requirements, even late in development. (16) Agile processes harness change for the customer's competitive advantage. (17)&lt;/p&gt;    &lt;p&gt;Deliver working software frequently, from a couple of weeks to a couple of months, with a preference to the shorter timescale. (18)&lt;/p&gt;    &lt;p&gt;Business people and developers must work together daily throughout the project. (19)&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;em&gt;&lt;strong&gt;Owner notes velocity is still 7. No action necessary.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Build projects around motivated individuals. (20) Give them the environment and support they need, and trust them to get the job done. (21)&lt;/p&gt;    &lt;p&gt;The most efficient and effective method of conveying information to and within a development team is face-to-face conversation. (22)&lt;/p&gt;    &lt;p&gt;Working software is the primary measure of progress. (23)&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;em&gt;&lt;strong&gt;Owner notes velocity is still 7. Reminds other teams to prepare for the release.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Agile processes promote sustainable development. (24) The sponsors, developers, and users should be able to maintain a constant pace indefinitely. (25)&lt;/p&gt;    &lt;p&gt;Continuous attention to technical excellence and good design enhances agility. (26)&lt;/p&gt;    &lt;p&gt;Simplicity--the art of maximizing the amount of work not done--is essential. (27)&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;em&gt;&lt;strong&gt;Owner notes velocity is still 7. The backlog has only two items now. Owner reminds everyone of the upcoming successful release.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;The best architectures, requirements, and designs emerge from self-organizing teams. (28)&lt;/p&gt;    &lt;p&gt;At regular intervals, the team reflects on how to become more effective, then tunes and adjusts its behavior accordingly. (29)&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;em&gt;&lt;strong&gt;The team delivers the project after 7 iterations, as forecasted as early as the second iteration!&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;&lt;span style="font-family: arial"&gt;&lt;/span&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;a href="http://apps.ultravioletconsulting.com/blogimages/AgileFromTheGroundUp/IntroducingAgileandScrumbyExperiencingTh_10D5A/agile.jpg"&gt;&lt;img title="agile" style="border-right: 0px; border-top: 0px; display: block; float: none; margin-left: auto; border-left: 0px; margin-right: auto; border-bottom: 0px" height="682" alt="agile" src="http://apps.ultravioletconsulting.com/blogimages/AgileFromTheGroundUp/IntroducingAgileandScrumbyExperiencingTh_10D5A/agile_thumb.jpg" width="600" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h4&gt;Reflection&lt;/h4&gt;  &lt;p&gt;When I did this in 20-second-iterations, I recorded the following sentence tallies after each iteration:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;5 &lt;/li&gt;    &lt;li&gt;9 &lt;/li&gt;    &lt;li&gt;14 &lt;/li&gt;    &lt;li&gt;19 &lt;/li&gt;    &lt;li&gt;23 &lt;/li&gt;    &lt;li&gt;27 &lt;/li&gt;    &lt;li&gt;29 &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Suppose I wanted to calculate after the first iteration how many more iterations it would take me to complete. Well, I would simply divide 29 by my current velocity of 5 and get 5 with a remainder of 4. Well, there’s no such thing as a partial interval, so I'd know I need 6 iterations. &lt;/p&gt;  &lt;p&gt;What about after 2? My velocity would now be 9 / 2, or 4.5 “Sentence Points” per iteration. 29 divided by 4.5 is 6.444, which rounds to 7 iterations.    &lt;br /&gt;    &lt;br /&gt;&lt;/p&gt;  &lt;h4&gt;My Sentence Velocity and Duration Forecast&lt;/h4&gt;  &lt;p&gt;Here’s how my sentence velocity and estimated total number of iterations after each iteration:&lt;/p&gt;  &lt;table style="width: 562px; height: 194px" cellspacing="0" cellpadding="2" width="508" border="1"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="97"&gt;&lt;strong&gt;&lt;u&gt;Iteration&lt;/u&gt;&lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top" width="196"&gt;&lt;strong&gt;&lt;u&gt;Sentences Completed&lt;/u&gt;&lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top" width="76"&gt;&lt;strong&gt;&lt;u&gt;Velocity&lt;/u&gt;&lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top" width="137"&gt;&lt;strong&gt;&lt;u&gt;Est. # Iterations&lt;/u&gt;&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="109"&gt;1&lt;/td&gt;        &lt;td valign="top" width="209"&gt;5&lt;/td&gt;        &lt;td valign="top" width="83"&gt;5&lt;/td&gt;        &lt;td valign="top" width="142"&gt;6&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="114"&gt;2&lt;/td&gt;        &lt;td valign="top" width="210"&gt;9&lt;/td&gt;        &lt;td valign="top" width="88"&gt;4.5&lt;/td&gt;        &lt;td valign="top" width="143"&gt;7&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="117"&gt;3&lt;/td&gt;        &lt;td valign="top" width="206"&gt;14&lt;/td&gt;        &lt;td valign="top" width="92"&gt;4.67&lt;/td&gt;        &lt;td valign="top" width="142"&gt;7&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="118"&gt;4&lt;/td&gt;        &lt;td valign="top" width="204"&gt;19&lt;/td&gt;        &lt;td valign="top" width="95"&gt;4.75&lt;/td&gt;        &lt;td valign="top" width="142"&gt;7&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="118"&gt;5&lt;/td&gt;        &lt;td valign="top" width="203"&gt;23&lt;/td&gt;        &lt;td valign="top" width="97"&gt;4.6&lt;/td&gt;        &lt;td valign="top" width="141"&gt;7&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="118"&gt;6&lt;/td&gt;        &lt;td valign="top" width="202"&gt;27&lt;/td&gt;        &lt;td valign="top" width="99"&gt;4.5&lt;/td&gt;        &lt;td valign="top" width="141"&gt;7&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="118"&gt;7&lt;/td&gt;        &lt;td valign="top" width="201"&gt;29&lt;/td&gt;        &lt;td valign="top" width="100"&gt;4.14&lt;/td&gt;        &lt;td valign="top" width="140"&gt;7&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;As you can see, by the second iteration, I had a velocity that reliably predicted my actual number of iterations. In reality, requirements change, and velocity goes up and down, but it averages out over time. Mike Cohn recommends taking a moving average to calculate a team's velocity.    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;In the next article we’ll more about how Agile teams often create a “burndown chart” to visually indicate how much work remains after each iteration.    &lt;br /&gt;&lt;/p&gt;  &lt;h4&gt;Conclusion&lt;/h4&gt;  &lt;p&gt;We’ve reviewed the two most prevalent software methodology styles, waterfall, and agile, and we’ve applied them to the reading process of this very article. In doing so, we first saw that it’s unwise to make a commitment to deliver a complete product on an arbitrary date. Next, we demonstrated a better way of planning by measuring our rate of progress, our velocity, and using that to forecast our project’s duration.&lt;/p&gt;  &lt;p&gt;Until next time, stay agile not fragile.&lt;/p&gt;  &lt;h4&gt;References&lt;/h4&gt;  &lt;ol&gt;   &lt;li&gt;The Waterfall model: &lt;a title="http://en.wikipedia.org/wiki/Waterfall_model" href="http://en.wikipedia.org/wiki/Waterfall_model"&gt;http://en.wikipedia.org/wiki/Waterfall_model&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Agile development: &lt;a title="http://en.wikipedia.org/wiki/Agile_software_development" href="http://en.wikipedia.org/wiki/Agile_software_development"&gt;http://en.wikipedia.org/wiki/Agile_software_development&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;The Agile Poster from VersionOne.com: &lt;a title="http://pm.versionone.com/AgilePoster.html" href="http://pm.versionone.com/AgilePoster.html"&gt;http://pm.versionone.com/AgilePoster.html&lt;/a&gt; &lt;/li&gt; &lt;/ol&gt;  &lt;br /&gt;&lt;script type="text/javascript" src="http://apps.ultravioletconsulting.com/js/jquery/iterationCounter.js"&gt;&lt;/script&gt;&lt;script type="text/javascript" src="http://apps.ultravioletconsulting.com/js/jquery/jquery.epiclock.min.js"&gt;&lt;/script&gt;&lt;script type="text/javascript" src="http://apps.ultravioletconsulting.com/js/jquery/jquery.floatingbox.js"&gt;&lt;/script&gt;&lt;script type="text/javascript" src="http://apps.ultravioletconsulting.com/js/jquery/jgcharts.js"&gt;&lt;/script&gt;&lt;script type="text/javascript" src="http://apps.ultravioletconsulting.com/js/jquery/load.js"&gt;&lt;/script&gt;&lt;link href="http://apps.ultravioletconsulting.com/js/jquery/iterationCounter.css" type="text/css" rel="stylesheet" /&gt;&lt;!--&lt;br /&gt;&lt;div id="box"&gt;&lt;center&gt;&lt;br /&gt;    &lt;table width="100%" border="0"&gt;&lt;tbody&gt;&lt;br /&gt;        &lt;tr class="Controls"&gt;&lt;br /&gt;          &lt;td&gt;&lt;a href="javascript:Start()"&gt;Start&lt;/a&gt; &lt;/td&gt;&lt;br /&gt;&lt;br /&gt;          &lt;td&gt;&lt;a href="javascript:Stop()"&gt;Stop&lt;/a&gt; &lt;/td&gt;&lt;br /&gt;&lt;br /&gt;          &lt;td&gt;&lt;a href="javascript:Reset()"&gt;Reset&lt;/a&gt; &lt;/td&gt;&lt;br /&gt;        &lt;/tr&gt;&lt;br /&gt;      &lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;    &lt;table width="100%" border="0"&gt;&lt;tbody&gt;&lt;br /&gt;        &lt;tr&gt;&lt;br /&gt;          &lt;td width="50%"&gt;secs:&lt;/td&gt;&lt;br /&gt;&lt;br /&gt;          &lt;td&gt;&lt;span id="clock"&gt;&lt;/span&gt;&lt;/td&gt;&lt;br /&gt;        &lt;/tr&gt;&lt;br /&gt;      &lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;    &lt;span id="tally"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;div id="lineChart" style="filter: alpha(opacity=50); opacity: 0.5"&gt;&lt;/div&gt;&lt;br /&gt;  &lt;/center&gt;&lt;/div&gt;&lt;br /&gt;--&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4441160589671124737-6819463692952207720?l=agilefromthegroundup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilefromthegroundup.blogspot.com/feeds/6819463692952207720/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilefromthegroundup.blogspot.com/2009/07/experience-benefits-of-agile-compared.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4441160589671124737/posts/default/6819463692952207720'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4441160589671124737/posts/default/6819463692952207720'/><link rel='alternate' type='text/html' href='http://agilefromthegroundup.blogspot.com/2009/07/experience-benefits-of-agile-compared.html' title='From Waterfall to Agile Development in 15 Minutes: An Introduction for Everyone'/><author><name>Josh Gough</name><uri>http://www.blogger.com/profile/13302284610870926934</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4441160589671124737.post-9193765146247614294</id><published>2009-04-15T06:12:00.000-07:00</published><updated>2009-04-15T06:33:25.668-07:00</updated><title type='text'>Tactic Pattern 001: Implement a Personal Task Board</title><content type='html'>&lt;span style="font-size:180%;"&gt;In A Blink&lt;/span&gt;&lt;br /&gt;Create a personal task board to create project visibility and nudge company toward Agile and Scrum&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;User Story Summary&lt;/span&gt;&lt;br /&gt;As a developer new to a team you'd like to start introducing Agile and Scrum so that you can improve productivity and quality.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Problem&lt;/span&gt;&lt;br /&gt;How do you introduce an Agile practice to a team when you have no Positional Authority to introduce a process improvement initiative?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Forces&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Company is small and not a traditional "software company"&lt;/li&gt;&lt;li&gt;Business stakeholders may be "used to" waterfall and unaware of software being developed in other ways&lt;/li&gt;&lt;li&gt;Developer teammates uncertain about Agile or Scrum or have had bad prior experiences&lt;/li&gt;&lt;li&gt;You may not have Positional Authority to introduce a process improvement initiative&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:180%;"&gt;Solution&lt;/span&gt;&lt;br /&gt;Create a personal task board and use it as an Information Radiator to communicate the priority and status of your own work to the rest of your team and company.&lt;br /&gt;&lt;br /&gt;A simple and effective wall will have horizontal headings like this:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[ Backlog / Stories ] [ Task Backlog ] [ Checked Out ] [ QA / Verify ] [ Complete ]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Underneath the Backlog / Stories column, you should write on sticky notes or index cards the high-level requirement or User Stories that you are attempting to finish. Align these in priority order from top to bottom.&lt;br /&gt;&lt;br /&gt;Next to that, create sticky notes for the individual tasks which you deem no shorter than 1/2 day and not longer than 2 days that you'll need to do to complete the requirement.&lt;br /&gt;&lt;br /&gt;When you start to work on a particular task, move it to the Checked Out column. When you're ready for someone to code review or perform QA against your work, move it to Checked Out.&lt;br /&gt;&lt;br /&gt;Finally, move it to Completed when you're finished.&lt;br /&gt;&lt;br /&gt;Notice the Task Backlog column should be wider than the others. That is because you should, ideally, only have one item under Checked Out at a time.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Real World Examples&lt;/span&gt;&lt;br /&gt;TODO&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4441160589671124737-9193765146247614294?l=agilefromthegroundup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilefromthegroundup.blogspot.com/feeds/9193765146247614294/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilefromthegroundup.blogspot.com/2009/04/tactic-pattern-001-implement-personal.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4441160589671124737/posts/default/9193765146247614294'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4441160589671124737/posts/default/9193765146247614294'/><link rel='alternate' type='text/html' href='http://agilefromthegroundup.blogspot.com/2009/04/tactic-pattern-001-implement-personal.html' title='Tactic Pattern 001: Implement a Personal Task Board'/><author><name>Josh Gough</name><uri>http://www.blogger.com/profile/13302284610870926934</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4441160589671124737.post-7542177826012581255</id><published>2009-04-14T14:19:00.001-07:00</published><updated>2009-07-30T17:01:39.378-07:00</updated><title type='text'>Agile From The Ground Up!</title><content type='html'>&lt;span style="font-size:180%;"&gt;Introducing Agile From The Ground Up!&lt;/span&gt;&lt;br /&gt;Welcome to the Agile From The Ground Up blog! My name is Josh Gough. I am a software application architect / developer in Atlanta, GA. I've been practicing iterative and incremental development techniques for most of my career. Over the last couple of years, through research and the good fortune of working with highly talented and educated teammates, I've become increasingly exposed to and involved with Agile practices in general and Scrum in particular.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Background&lt;/span&gt;&lt;br /&gt;I've helped several companies adopt Agile practices with Scrum from the "bottom up". This means that I as a developer working on the team was part of the impetus to introduce the process improvement efforts of ushering in Agile and Scrum.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Target Audiences&lt;/span&gt;&lt;br /&gt;I'll target articles and postings on this toward the following types of readers:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Company executives and product owners seeking an &lt;span style="font-weight: bold; font-style: italic;"&gt;ROI-producing strategy&lt;/span&gt; to provide a better way to plan, measure, and execute the delivery of development projects.&lt;/li&gt;&lt;li&gt;Project managers and team leaders seeking an &lt;span style="font-weight: bold; font-style: italic;"&gt;operational approach&lt;/span&gt; to successfully introduce Agile and Scrum to their teams or higher-level company executives.&lt;/li&gt;&lt;li&gt;Developers seeking proven, &lt;span style="font-weight: bold; font-style: italic;"&gt;repeatable tactics&lt;/span&gt; to nudge their leaders and companies toward adopting Agile and Scrum to improve results.&lt;/li&gt;&lt;li&gt;Students seeking to &lt;span style="font-weight: bold; font-style: italic;"&gt;understand and apply&lt;/span&gt; iterative and incremental development practices from a hands-on, real-world perspective.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;I hope you will find this information useful as you attempt to help your teams go Agile From The Ground Up!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4441160589671124737-7542177826012581255?l=agilefromthegroundup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilefromthegroundup.blogspot.com/feeds/7542177826012581255/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilefromthegroundup.blogspot.com/2009/04/agile-from-newbie-up.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4441160589671124737/posts/default/7542177826012581255'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4441160589671124737/posts/default/7542177826012581255'/><link rel='alternate' type='text/html' href='http://agilefromthegroundup.blogspot.com/2009/04/agile-from-newbie-up.html' title='Agile From The Ground Up!'/><author><name>Josh Gough</name><uri>http://www.blogger.com/profile/13302284610870926934</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
