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

<channel>
	<title>Where Technology Meets Teamwork &#187; Process</title>
	<atom:link href="http://blog.nwcadence.com/category/process/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.nwcadence.com</link>
	<description>Thoughts on VSTS, Sharepoint and other collaborative technologies</description>
	<lastBuildDate>Thu, 04 Feb 2010 22:30:35 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Operations and Development &#8211; Working Together &#8211; Oh My!</title>
		<link>http://blog.nwcadence.com/2009/11/operations-and-development-working-together-oh-my/</link>
		<comments>http://blog.nwcadence.com/2009/11/operations-and-development-working-together-oh-my/#comments</comments>
		<pubDate>Mon, 02 Nov 2009 17:22:43 +0000</pubDate>
		<dc:creator>JeffSmith</dc:creator>
				<category><![CDATA[Process]]></category>
		<category><![CDATA[ITIL Operations SLAs Agile Process CMMI]]></category>

		<guid isPermaLink="false">http://blog.nwcadence.com/2009/11/operations-and-development-working-together-oh-my/</guid>
		<description><![CDATA[Many in the development world have not yet heard of ITIL, but I believe it will come to matter soon enough. The ability to optimize organizational performance, not simply development performance, is a competitive edge and the path toward lowered cost and increased growth in the long term. If you are delivering critical web applications, [...]]]></description>
			<content:encoded><![CDATA[<p>Many in the development world have not yet heard of ITIL, but I believe it will come to matter soon enough. The ability to optimize organizational performance, not simply development performance, is a competitive edge and the path toward lowered cost and increased growth in the long term. If you are delivering critical web applications, you really want to get this. I have been in a handful of organizations now that have learned to manage better across development and operations; That is, these different areas were not separated by a wall and Development did not simply toss the application software over and wish Operations good luck. They learned to work as one organization &#8211; and it was the difference between predictable sanity and much heartache.</p>
<p>It is the considered opinion of some that attempting to resolve the misalignment of Operations and Development is too difficult to crack, or that most organizations have no interest in solving such problems. That said, I have seen it done and the effort was worth it. Maybe your organization is not ready, but I am hopeful that this post provokes consideration. A key thought in the process &#8211; don&#8217;t get balled up in ITIL, CMMI, Agile, or anyone else&#8217;s canned magic; This is always important, but the larger scale improvements will hit organizational barriers harder than anything else. Solve the problems you have, leverage your existing strengths, and keep the dogma at bay.</p>
<p>What does it look like &#8211; to have things working well? Consider an organization running managed services on limited hardware and limited budget in general. Lets say, about 150 applications on a small set of common infrastructure. The organization does real systems engineering and they have an architecture committee(Ops &amp; Dev working together!), which does solid analysis of the alternatives &#8211; which considers network architecture, servers, costs, capacity, potential updates to machines, open source libraries, SAN storage, performance, maintenance considerations, and more. Every 6 months they potentially do a serious technology refresh and they are regularly driving new functionality in all technical areas. They run highly available and meet their SLAs, their delivery dates, and their budget&#8230; because they actually work together.</p>
<p>Deployments are a collaborative effort of network, security, development, open system, systems engineering, QA teams, along with business owners and release management personnel. In the real organizations where I have seen this capability, it emerged over time &#8211; but not a ridiculous amount of time. Without naming names &#8211; we will look at one experience…</p>
<p>First, it was necessary to stabilize the patient. Having QA testing on the weekend just to make the Saturday midnight deployment, then deploying the wrong code, having to build new code in the maintenance window… all of this pretty much without a reasonable net&#8230; Desperate times indeed. Sometimes you must get this low to get serious, it seems.</p>
<p>So the end-to-end cycle needed stability, because things were piling in chaotically at the end. Needing developers in the maintenance window was ridiculous… so part of the &#8220;sale&#8221; was that developers would no longer be pager-bound on the weekend. Of course, QA needed relief also; Most of this disarray was because development was allowed to get code changes in late in the week, leaving no time for proper test. They were allowed to deliver late &#8211; so they did. As it happened, we had a decent toolset; But we needed some rules.</p>
<p>Does this sound familiar? What&#8217;s important to note here is that we have not mentioned code reviews or technical documentation or requirements; We needed first to get an organizational understanding of how this was supposed to work. Once we had flow, then we could focus on the tasks inside. Because so much variation was allowed, the actors in the process could not really depend on much. Delivery was prayer and heroics.</p>
<p>The key gatekeeper here was QA; If they could not have reasonable time with the code(and not on a Saturday!), it was hard to drive quality. But another critical element was needed… one I consider the most fundamental element of working software development; The build needed to be stable… and, in this case, the best answer was to take it away from those who had no time to get it right. Build should be script-driven, done on a dedicated non-developer machine. Developers should be able to replicate the build results prior to check-in, but the build machine is the arbiter of truth. [That is - we really do not care if it worked on your machine! <img src='http://blog.nwcadence.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  ] Luckily, the QA Manager had the strength to say &#8220;Enough!&#8221; and Operations was tired of deployment windows going awry.</p>
<p>In this organization, we essentially had 1 or 2 maintenance windows per week. Getting your customer into a (sane) minimal but regular deployment schedule is something to drive for. Managing and leveling customer demand is part of a smart approach.</p>
<p>Based on the once a week model, we identified two checkpoints in the process: (1) Your code had to be in for test by noon on Wednesday, with all your ducks in a row[build complete, deployed into test environment with no issues, all related records in the right state, and deployment date approved: Noon was when the report was generated for the 1pm deployment meeting[, and (2) Your code had to be Ready for Production by Friday 10am(signed off as tested in QA environment, promoted to pre-production and verified, all tickets in the right state; A deployment report was generated for the 11am Final Deployment meeting). This was the standard process. Changes, as you might guess by the fast flow; QA had time to do their job, deployment mechanisms were verified, and time existed for contemplating risk and organizing for a solid deployment window. The Friday meeting included review of all the scheduled deployments and planning out the sequence of activities, the players involved, and so on… The Wednesday meeting had included preliminary discussions on these.</p>
<p>Of course, not everything will obey. So we had mechanisms for the exceptions. What is important, of course, is that you make sure exceptions are more rare.</p>
<p>Escalations and emergency deployments were also possible &#8211; but the signature requirements were nontrivial and they usually included both business owner and senior management. Development might want code delivered… they might be real proud of what they have accomplished; but a compressed QA cycle or rushed planning effort is real risk. Operations owns the stability of the production environment and the company pays a price for outages. Process needs to enforce and make evident such realities.</p>
<p>We continued to address production emergencies as priority interrupts, and identified a fix first and document after mechanism for anything that could be addressed quickly and without code change. (Not everything is code) Sometimes being in the environment negated access to the tooling. Note: We had monitoring in place for security and compliance, so many production changes were always noticed anyway &#8211; but we reinforced and followed up , so that production fixes(and other updates) had proper discussion recorded and audit trails. Outages and impairments also demanded follow-up root-cause analysis.</p>
<p>What is important about this process stabilization is what it enabled. Getting everyone on the same page was only a beginning. Once we had a rhythm, the metrics in the tooling started to have meaning. We could see bottlenecks and quality issues and manpower challenges. And individual groups could see better how to address local challenges. Developers really knew how to code, it seemed… the system before had just kept them too on edge to do their best or to improve anything. QA finally started having their weekends back and could also now execute solid test plans. Operations found their groove, because things were working.</p>
<p>The simplest change of all &#8211; getting on the same page with a contained and sane process flow &#8211; enabled continuing improvements going forward; Real improvement &#8211; reduced costs generally, respectable growth, and stable builds with increasing quality checks(e.g. unit test, static analysis). By laying a stable foundation, we were able to put more focus on the special cases that always come up &#8211; infrastructure updates and migrations, technology refreshes, architectural improvements, periods of long-running performance test and penetration tests in pre-production, and so on. Simple application deployments actually became simple. We got better at production monitoring, closed long-open defects, and more &#8211; we felt a sense of pride and accomplishment.</p>
<p>What&#8217;s important to note here: We did this without being led by ITIL or CMMI or any notion of agile. We did it without high-dollar ITSM tooling. You should try it!</p>
<img src="http://blog.nwcadence.com/?ak_action=api_record_view&id=228&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://blog.nwcadence.com/2009/11/operations-and-development-working-together-oh-my/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>New Radio TFS Episode on Adopting Team System with Steven Borg</title>
		<link>http://blog.nwcadence.com/2009/03/new-radio-tfs-episode-on-adopting-team-system-with-steven-borg/</link>
		<comments>http://blog.nwcadence.com/2009/03/new-radio-tfs-episode-on-adopting-team-system-with-steven-borg/#comments</comments>
		<pubDate>Wed, 01 Apr 2009 02:39:36 +0000</pubDate>
		<dc:creator>Steven Borg</dc:creator>
				<category><![CDATA[Event]]></category>
		<category><![CDATA[Process]]></category>
		<category><![CDATA[TFS]]></category>
		<category><![CDATA[Team System]]></category>

		<guid isPermaLink="false">http://blog.nwcadence.com/?p=208</guid>
		<description><![CDATA[  

A few weeks ago during the MVP summit, I had the wonderful experience of hanging out with Martin Woodward of Teamprise and RadioTFS fame.  We chatted for an hour on strategies for adopting TFS successfully, recorded the conversation, and it has just been released as this months episode of Radio TFS.
Have a listen: [...]]]></description>
			<content:encoded><![CDATA[<p><!--[if !mso]> <mce:style><!  v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);} --> <!--[endif]--><!--[if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:TrackMoves /> <w:TrackFormatting /> <w:PunctuationKerning /> <w:ValidateAgainstSchemas /> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:DoNotPromoteQF /> <w:LidThemeOther>EN-US</w:LidThemeOther> <w:LidThemeAsian>X-NONE</w:LidThemeAsian> <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript> <w:Compatibility> <w:BreakWrappedTables /> <w:SnapToGridInCell /> <w:WrapTextWithPunct /> <w:UseAsianBreakRules /> <w:DontGrowAutofit /> <w:SplitPgBreakAndParaMark /> <w:DontVertAlignCellWithSp /> <w:DontBreakConstrainedForcedTables /> <w:DontVertAlignInTxbx /> <w:Word11KerningPairs /> <w:CachedColBalance /> </w:Compatibility> <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel> <m:mathPr> <m:mathFont m:val="Cambria Math" /> <m:brkBin m:val="before" /> <m:brkBinSub m:val="&#45;-" /> <m:smallFrac m:val="off" /> <m:dispDef /> <m:lMargin m:val="0" /> <m:rMargin m:val="0" /> <m:defJc m:val="centerGroup" /> <m:wrapIndent m:val="1440" /> <m:intLim m:val="subSup" /> <m:naryLim m:val="undOvr" /> </m:mathPr></w:WordDocument> </xml><![endif]--><!--[if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"   DefSemiHidden="true" DefQFormat="false" DefPriority="99"   LatentStyleCount="267"> <w:LsdException Locked="false" Priority="0" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Normal" /> <w:LsdException Locked="false" Priority="9" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="heading 1" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9" /> <w:LsdException Locked="false" Priority="39" Name="toc 1" /> <w:LsdException Locked="false" Priority="39" Name="toc 2" /> <w:LsdException Locked="false" Priority="39" Name="toc 3" /> <w:LsdException Locked="false" Priority="39" Name="toc 4" /> <w:LsdException Locked="false" Priority="39" Name="toc 5" /> <w:LsdException Locked="false" Priority="39" Name="toc 6" /> <w:LsdException Locked="false" Priority="39" Name="toc 7" /> <w:LsdException Locked="false" Priority="39" Name="toc 8" /> <w:LsdException Locked="false" Priority="39" Name="toc 9" /> <w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption" /> <w:LsdException Locked="false" Priority="10" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Title" /> <w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font" /> <w:LsdException Locked="false" Priority="11" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtitle" /> <w:LsdException Locked="false" Priority="22" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Strong" /> <w:LsdException Locked="false" Priority="20" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Emphasis" /> <w:LsdException Locked="false" Priority="59" SemiHidden="false"    UnhideWhenUsed="false" Name="Table Grid" /> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text" /> <w:LsdException Locked="false" Priority="1" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="No Spacing" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 1" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 1" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 1" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 1" /> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision" /> <w:LsdException Locked="false" Priority="34" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="List Paragraph" /> <w:LsdException Locked="false" Priority="29" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Quote" /> <w:LsdException Locked="false" Priority="30" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Quote" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 1" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 1" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 1" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 1" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 1" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 2" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 2" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 2" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 2" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 2" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 2" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 2" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 2" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 2" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 3" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 3" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 3" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 3" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 3" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 3" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 3" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 3" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 3" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 4" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 4" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 4" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 4" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 4" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 4" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 4" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 4" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 4" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 5" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 5" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 5" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 5" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 5" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 5" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 5" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 5" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 5" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 6" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 6" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 6" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 6" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 6" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 6" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 6" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 6" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 6" /> <w:LsdException Locked="false" Priority="19" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis" /> <w:LsdException Locked="false" Priority="21" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis" /> <w:LsdException Locked="false" Priority="31" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference" /> <w:LsdException Locked="false" Priority="32" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Reference" /> <w:LsdException Locked="false" Priority="33" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Book Title" /> <w:LsdException Locked="false" Priority="37" Name="Bibliography" /> <w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading" /> </w:LatentStyles> </xml><![endif]--><!--  /* Font Definitions */  @font-face 	{font-family:"Cambria Math"; 	panose-1:2 4 5 3 5 4 6 3 2 4; 	mso-font-charset:0; 	mso-generic-font-family:roman; 	mso-font-pitch:variable; 	mso-font-signature:-1610611985 1107304683 0 0 159 0;} @font-face 	{font-family:Calibri; 	panose-1:2 15 5 2 2 2 4 3 2 4; 	mso-font-charset:0; 	mso-generic-font-family:swiss; 	mso-font-pitch:variable; 	mso-font-signature:-1610611985 1073750139 0 0 159 0;}  /* Style Definitions */  p.MsoNormal, li.MsoNormal, div.MsoNormal 	{mso-style-unhide:no; 	mso-style-qformat:yes; 	mso-style-parent:""; 	margin:0in; 	margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:11.0pt; 	font-family:"Calibri","sans-serif"; 	mso-fareast-font-family:Calibri; 	mso-fareast-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman";} h2 	{mso-style-priority:9; 	mso-style-unhide:no; 	mso-style-qformat:yes; 	mso-style-link:"Heading 2 Char"; 	mso-margin-top-alt:auto; 	margin-right:0in; 	mso-margin-bottom-alt:auto; 	margin-left:0in; 	mso-pagination:widow-orphan; 	mso-outline-level:2; 	font-size:18.0pt; 	font-family:"Times New Roman","serif"; 	mso-fareast-font-family:Calibri; 	mso-fareast-theme-font:minor-latin; 	font-weight:bold;} a:link, span.MsoHyperlink 	{mso-style-noshow:yes; 	mso-style-priority:99; 	color:blue; 	text-decoration:underline; 	text-underline:single;} a:visited, span.MsoHyperlinkFollowed 	{mso-style-noshow:yes; 	mso-style-priority:99; 	color:purple; 	mso-themecolor:followedhyperlink; 	text-decoration:underline; 	text-underline:single;} p 	{mso-style-noshow:yes; 	mso-style-priority:99; 	mso-margin-top-alt:auto; 	margin-right:0in; 	mso-margin-bottom-alt:auto; 	margin-left:0in; 	mso-pagination:widow-orphan; 	font-size:12.0pt; 	font-family:"Times New Roman","serif"; 	mso-fareast-font-family:Calibri; 	mso-fareast-theme-font:minor-latin;} span.Heading2Char 	{mso-style-name:"Heading 2 Char"; 	mso-style-priority:9; 	mso-style-unhide:no; 	mso-style-locked:yes; 	mso-style-link:"Heading 2"; 	mso-ansi-font-size:18.0pt; 	mso-bidi-font-size:18.0pt; 	font-family:"Calibri","sans-serif"; 	mso-fareast-font-family:Calibri; 	mso-fareast-theme-font:minor-latin; 	font-weight:bold;} span.byline 	{mso-style-name:byline; 	mso-style-unhide:no;} span.vcard 	{mso-style-name:vcard; 	mso-style-unhide:no;} span.separator 	{mso-style-name:separator; 	mso-style-unhide:no;} .MsoChpDefault 	{mso-style-type:export-only; 	mso-default-props:yes; 	font-size:10.0pt; 	mso-ansi-font-size:10.0pt; 	mso-bidi-font-size:10.0pt;} @page Section1 	{size:8.5in 11.0in; 	margin:1.0in 1.0in 1.0in 1.0in; 	mso-header-margin:.5in; 	mso-footer-margin:.5in; 	mso-paper-source:0;} div.Section1 	{page:Section1;} --><!--[if gte mso 10]> <mce:style><!   /* Style Definitions */  table.MsoNormalTable 	{mso-style-name:"Table Normal"; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-priority:99; 	mso-style-qformat:yes; 	mso-style-parent:""; 	mso-padding-alt:0in 5.4pt 0in 5.4pt; 	mso-para-margin:0in; 	mso-para-margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:11.0pt; 	font-family:"Calibri","sans-serif"; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:"Times New Roman"; 	mso-fareast-theme-font:minor-fareast; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi;} --> <!--[endif]--><!--[if gte mso 9]><xml> <o:shapedefaults v:ext="edit" spidmax="1027" /> </xml><![endif]--><!--[if gte mso 9]><xml> <o:shapelayout v:ext="edit"> <o:idmap v:ext="edit" data="1" /> </o:shapelayout></xml><![endif]--></p>
<h2></h2>
<p><!--[if gte vml 1]><v:shapetype id="_x0000_t75" coordsize="21600,21600"  o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f"  stroked="f"> <v:stroke joinstyle="miter" /> <v:formulas> <v:f eqn="if lineDrawn pixelLineWidth 0" /> <v:f eqn="sum @0 1 0" /> <v:f eqn="sum 0 0 @1" /> <v:f eqn="prod @2 1 2" /> <v:f eqn="prod @3 21600 pixelWidth" /> <v:f eqn="prod @3 21600 pixelHeight" /> <v:f eqn="sum @0 0 1" /> <v:f eqn="prod @6 1 2" /> <v:f eqn="prod @7 21600 pixelWidth" /> <v:f eqn="sum @8 21600 0" /> <v:f eqn="prod @7 21600 pixelHeight" /> <v:f eqn="sum @10 21600 0" /> </v:formulas> <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect" /> <o:lock v:ext="edit" aspectratio="t" /> </v:shapetype><v:shape id="Picture_x0020_2" o:spid="_x0000_s1026" type="#_x0000_t75"  alt="Steven Borg"  href="http://www.radiotfs.com/2009/03/25/AdoptingTeamSystemWithStevenBorg.aspx" mce_href="http://www.radiotfs.com/2009/03/25/AdoptingTeamSystemWithStevenBorg.aspx"  style='position:absolute;margin-left:133.8pt;margin-top:0;width:112.5pt;  height:125.25pt;z-index:251657728;visibility:visible;mso-wrap-style:square;  mso-wrap-distance-left:0;mso-wrap-distance-top:0;mso-wrap-distance-right:0;  mso-wrap-distance-bottom:0;mso-position-horizontal:right;  mso-position-horizontal-relative:text;mso-position-vertical:absolute;  mso-position-vertical-relative:line' o:allowoverlap="f" o:button="t"> <v:imagedata src="file:///C:\Users\Steve.NWC\AppData\Local\Temp\msohtmlclip1\01\clip_image001.jpg" mce_src="file:///C:\Users\Steve.NWC\AppData\Local\Temp\msohtmlclip1\01\clip_image001.jpg"   o:title="Steven Borg" /> <w:wrap type="square" /> </v:shape><![endif]--><!--[if !vml]-->A few weeks ago during the MVP summit, I had the wonderful experience of hanging out with <a title="Martin Woodward" href="http://www.woodwardweb.com/" target="_blank">Martin Woodward </a>of <a title="Teamprise" href="http://www.teamprise.com" target="_blank">Teamprise </a>and <a title="RadioTFS" href="http://www.radiotfs.com/" target="_blank">RadioTFS</a> fame.  We chatted for an hour on strategies for adopting TFS successfully, recorded the conversation, and it has just been released as this months episode of <a title="RadioTFS" href="http://www.radiotfs.com/" target="_blank">Radio TFS</a>.</p>
<p>Have a listen: <a title="Steven Borg on Adopting VSTS and Team System" href="http://www.radiotfs.com/ct.ashx?id=bc94d141-9eaf-4283-bc7e-5e330e1af1e4&amp;url=http%3a%2f%2ffeedproxy.google.com%2f%7er%2fradiotfs%2f%7e5%2fi1-NQOtWtwk%2fradiotfs_018.mp3" target="_blank">Adopting Team System with Steven Borg</a></p>
<img src="http://blog.nwcadence.com/?ak_action=api_record_view&id=208&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://blog.nwcadence.com/2009/03/new-radio-tfs-episode-on-adopting-team-system-with-steven-borg/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Practical Process Improvement (Part 5)</title>
		<link>http://blog.nwcadence.com/2008/12/practical-process-improvement-part-5/</link>
		<comments>http://blog.nwcadence.com/2008/12/practical-process-improvement-part-5/#comments</comments>
		<pubDate>Sat, 27 Dec 2008 02:20:15 +0000</pubDate>
		<dc:creator>Jeff Levinson</dc:creator>
				<category><![CDATA[Best Practice]]></category>
		<category><![CDATA[Process]]></category>
		<category><![CDATA[Requirements]]></category>
		<category><![CDATA[Process Improvement]]></category>
		<category><![CDATA[Test Cases]]></category>
		<category><![CDATA[Testing Requirements]]></category>
		<category><![CDATA[Use Cases]]></category>

		<guid isPermaLink="false">http://blog.nwcadence.com/?p=165</guid>
		<description><![CDATA[The first four posts (Part 1, Part 2, Part 3, Part 4) dealt with working through a process for handling bugs and improving that process. But what about preventing bugs to begin with? In this part I&#8217;ll talk about some preventative measures to help eliminate bugs at the requirements and development phase.
Let’s start with functional [...]]]></description>
			<content:encoded><![CDATA[<p>The first four posts (<a href="http://blog.nwcadence.com/2008/10/01/practical-process-improvement-part-1/">Part 1</a>, <a href="http://blog.nwcadence.com/2008/10/23/practical-process-improvement-part-2/">Part 2</a>, <a href="http://blog.nwcadence.com/2008/10/31/practical-process-improvement-part-3/">Part 3</a>, <a href="http://blog.nwcadence.com/2008/11/14/practical-process-improvement-part-4/">Part 4</a>) dealt with working through a process for handling bugs and improving that process. But what about preventing bugs to begin with? In this part I&#8217;ll talk about some preventative measures to help eliminate bugs at the requirements and development phase.</p>
<p>Let’s start with functional bugs. These are the bugs that really shouldn’t be in applications. Now, I am a realist and I understand that it is impractical to try to eliminate all bugs (you can do it but at what cost?) in most applications. This does not hold true for life-critical applications in which there is no margin for error. However, how do you eliminate all of the functional bugs? Testers are not the way to eliminate bugs. If a bug gets to the testing stage you’ve already introduced waste. You want to ensure that before the software gets to the testers, that there are no bugs.</p>
<p><strong>Note: In Lean theory, there would be no testers (or “inspectors”) because all they would be doing is finding a problem that shouldn’t have been introduced in the first place. But in software development I believe this is impractical in most cases.</strong></p>
<p>Let me pose this question to you (this is more applicable if you are a developer but if you aren’t, put yourself in the developers’ shoes): How does a developer know when they are done writing code?</p>
<p>Seems like a simple question, right? I commonly get five answers when I ask this question:</p>
<ol>
<li>You’re never done coding a requirement, it’s an ongoing, evolving process with no end in sight.</li>
<li>When my code does what the requirement says it should do.</li>
<li>You’re done when the analyst says you’re done.</li>
<li>You’re done when all of the unit tests pass.</li>
<li>You&#8217;re done on the day the code is due.</li>
</ol>
<p>The fourth answer is usually from groups doing Test Driven Development or heavy unit testing in a true agile process such as Extreme Programming (XP). I’ll address questions about methodology later in this book.</p>
<p>Looking at answers 1, 2, 3 and 5 you can almost feel the depression. Certainly answer number 1 is depressing – essentially you never finish and you can never know when you’re finished. Answer 5 means that the developer feels that maybe they don&#8217;t get the time to finish the way they would like to &#8211; again, depressing. Answers 2 and 3 are essentially the same (you hope anyway) but there is a major problem. As I’ve noted already, requirements are subjective which means that while you think you’re done you probably aren’t done.</p>
<h4>Test Cases <em>before Code</em></h4>
<p>A better answer is: “I’m done when all of the test cases for this requirement pass.” Now this presents some problems. First, most organizations do <em>not</em> create test cases at the same time as they create requirements. Second, those organizations that do create test cases at this stage do not create repeatable test cases (a.k.a. flimsy test cases). Finally, I have not worked with any organizations that require the users to sign off on test cases the same way they have to sign off on requirements. It kind of doesn’t make sense does it? To have customers sign off on documents which are mostly vague but not have the customers sign off on documents that provide definitive proof that a requirement has been met.</p>
<p>So then, the solution to this problem is simple, assign testers to work with analysts and write test cases for requirements before the requirements are handed to developers. Sounds simple, right? This is where a cost justification comes in. You need additional resources earlier in the process which will save costs later in the process. It’s hard to prove a negative to management and get the appropriate resources and funding.</p>
<p>Another issue with this simple solution is that depending on the type of methodology you are using, it may be difficult to break people of old habits. The manners in which requirements are documented make a huge difference in the ease of creating related test cases. For instance, the best format (let me qualify this &#8211; in my opinion) for requirements in relationship to test cases are <em>use cases</em>. A sample use case is shown in the table below.</p>
<table border="1" cellspacing="0" cellpadding="2" width="993">
<tbody>
<tr>
<td width="206" valign="top">ID:</td>
<td width="785" valign="top">UC-POS-01</td>
</tr>
<tr>
<td width="210" valign="top">Title:</td>
<td width="782" valign="top">Enter Merchandise</td>
</tr>
<tr>
<td width="213" valign="top">Created By:</td>
<td width="779" valign="top">Jeff Levinson</td>
</tr>
<tr>
<td width="216" valign="top">Date Created:</td>
<td width="777" valign="top">7/19/2007</td>
</tr>
<tr>
<td width="218" valign="top">Last Updated By:</td>
<td width="775" valign="top"></td>
</tr>
<tr>
<td width="220" valign="top">Date Last Updated:</td>
<td width="773" valign="top"></td>
</tr>
<tr>
<td width="222" valign="top">Actors:</td>
<td width="772" valign="top">Salesperson</td>
</tr>
<tr>
<td width="223" valign="top">Description:</td>
<td width="771" valign="top">The salesperson enters items into the POS system</td>
</tr>
<tr>
<td width="224" valign="top">Trigger:</td>
<td width="770" valign="top">Customer wants to check out</td>
</tr>
<tr>
<td width="225" valign="top">Preconditions:</td>
<td width="769" valign="top">None</td>
</tr>
<tr>
<td width="226" valign="top">Postconditions:</td>
<td width="768" valign="top">The POS system has a list of items for purchase by the customer and displays the total that the customer owes.</td>
</tr>
<tr>
<td width="227" valign="top">Normal Path:</td>
<td width="767" valign="top">
<ol>
<li>Salesperson logs onto the system</li>
<li>System verifies identity</li>
<li>Salesperson elects to ring up a new purchase</li>
<li>System displays the new purchase screen</li>
<li>Salesperson scans the item barcode</li>
<li>System displays the items
<ol>
<li>Title</li>
<li>Description</li>
<li>Price</li>
</ol>
</li>
<li>[Repeat steps 5 and 6 until order is complete]</li>
<li>Salesperson completes the order</li>
<li>System displays the total cost of all items, including sales tax</li>
</ol>
</td>
</tr>
<tr>
<td width="228" valign="top">Alternative Path:</td>
<td width="767" valign="top">A1: Invalid logon<br />
[Branch at Step 1]</p>
<ol>
<li>System notifies user that the logon attempt failed</li>
<li>User retries to log onto the system</li>
</ol>
<p>[After three tries the user is logged out and needs a manager to re-enable their logon]<br />
[Resume at Step 2 if logon successful]</p>
<p>A2: The item does not have a barcode<br />
[Branch at Step 5]</p>
<ol>
<li>Salesperson manually enters the UPC code into the system</li>
</ol>
<p>[Resume at Step 5]</p>
<p>A3: The item is not found<br />
[Branch at Step 5]</p>
<ol>
<li>Salesperson enters the UPC code</li>
<li>System prompts the Salesperson for the following:
<ol>
<li>Actual UPC code of the item</li>
<li>Item title</li>
<li>Item price</li>
</ol>
</li>
<li>Salesperson enters the appropriate information</li>
</ol>
<p>[Resume at Step 7]</td>
</tr>
<tr>
<td width="228" valign="top">Exceptions:</td>
<td width="767" valign="top">None</td>
</tr>
<tr>
<td width="228" valign="top">Frequency of Use:</td>
<td width="767" valign="top">Approx. 100 times per day.</td>
</tr>
<tr>
<td width="228" valign="top">Notes:</td>
<td width="767" valign="top">None</td>
</tr>
</tbody>
</table>
<p>While you can probably find lots of other situations, alternate paths and exception paths, this serves as a good example for entering items you may find at any retail store.</p>
<p>The reason why use cases are the best starting point for test cases is because they already describe the interaction between the user and the system so you know what the user is supposed to be providing and you know what information the system is supposed to be responding with.</p>
<p>If you are using a methodology such as Scrum which advocates <em>user stories</em> there may be some difficulties. Not because there is anything inherently wrong with user stories, but you can’t write code from a user story. User stories are designed to note a high level requirement and describe the users’ use of the functionality to provide perspective and context for the developers. What many forget to do is to provide more detailed requirements (which can be in the form of use cases) which can form the basis of test cases (if you are going to write use cases based off of user stories, then the description would be the user story). In other circumstances there is no formal method for writing requirements documents which means the structure of each document is entirely up to the analyst who writes the requirements.</p>
<p>Let’s look at a sample test case which tests the use case in the table above.</p>
<table border="1" cellspacing="0" cellpadding="2" width="988">
<tbody>
<tr>
<td width="70" valign="top"><strong>Step #</strong></td>
<td width="353" valign="top"><strong>Action</strong></td>
<td width="555" valign="top"><strong>Expected Result</strong></td>
</tr>
<tr>
<td width="75" valign="top">1</td>
<td width="353" valign="top">Log onto the system</td>
<td width="555" valign="top">System displays the main menu screen</td>
</tr>
<tr>
<td width="79" valign="top">2</td>
<td width="353" valign="top">Select the new sale menu item</td>
<td width="555" valign="top">System displays the new purchase screen</td>
</tr>
<tr>
<td width="83" valign="top">3</td>
<td width="353" valign="top">Scan an item barcode</td>
<td width="555" valign="top">System displays the item information</td>
</tr>
</tbody>
</table>
<p>HOLD EVERYTHING! What’s wrong with this test case (besides that it isn’t complete)? This is the typical test case that I see when I work with customers all of the time. If you are a professional tester reading this you know the answer to this: <em>This test case is not repeatable</em>. Believe it or not, I have had to disabuse people of the notion that this type of test case is a good test case. But let’s see what the problem is here. In step 1 I log on as the user. Well, what user? It assumes that the logon was successful so that means I need to log on with a valid user. What user though? This is a test system and will hopefully not have production values in it. In step 3 I’m supposed to scan a barcode for the test. What barcode? Can I use the paperback book I’m reading at lunch for this purpose or maybe the barcode from the candy bar that I bought for lunch? Again, the system is supposed to display the appropriate information which assumes I’ve picked an item actually in the inventory. This makes for a poor testing and a poor coding experience. Let’s try this test case again.</p>
<table border="1" cellspacing="0" cellpadding="2" width="983">
<tbody>
<tr>
<td width="83" valign="top"><strong>Step #</strong></td>
<td width="356" valign="top"><strong>Action</strong></td>
<td width="539" valign="top"><strong>Expected Result</strong></td>
</tr>
<tr>
<td width="83" valign="top">1</td>
<td width="356" valign="top">Log onto the system with username: Jeff and password: <a href="mailto:P@ssw0rd">P@ssw0rd</a></td>
<td width="538" valign="top">System displays the main menu screen</td>
</tr>
<tr>
<td width="83" valign="top">2</td>
<td width="356" valign="top">Select the New Purchase menu item by pressing &#8220;A&#8221;</td>
<td width="537" valign="top">System displays the new purchase screen</td>
</tr>
<tr>
<td width="83" valign="top">3</td>
<td width="356" valign="top">Scan the book barcode &#8220;Gone with the Wind&#8221; (ISBN: 1416548890)</td>
<td width="536" valign="top">System displays:<br />
- Gone With The Wind<br />
- A southern love story<br />
- 11.55</td>
</tr>
<tr>
<td width="83" valign="top">4</td>
<td width="356" valign="top">Press the Total button</td>
<td width="535" valign="top">System displays the subtotal as 11.55, Sales Tax as 8.25% and the total as 12.50</td>
</tr>
</tbody>
</table>
<p>Now this is almost a repeatable test case. What’s missing? There really is only one thing missing here (there are a few minor things but I’m sticking with the major issues) – the setup. How does the system know the tax amount is 8.25%? It can be different depending on where the machine is located. Test cases need to included necessary infrastructure setup and in this case the test would have to be run with different sales tax amounts (or no sales tax amount if we want to assume that maybe this is being used for internet sales in some cases).</p>
<p>In order to have a complete battery of tests this test case would have to be repeated with numerous different values. How many different scenarios do you test? What are the likelihood of the different scenarios occurring and what is the cost if they do occur and the software fails. In the above example, one may assume that you could simply ignore the situation in which the item isn’t found in inventory. After all, if the item is on the store shelf it had to have been received and if it was received it was scanned into inventory. Maybe the chance of this occurring is very, very low but what if it does occur? Without being able to manually enter the item you would not be able to sell the item to the customer. So the cost of this mistake is the amount of the item plus some of the stores reputation. This may be too high a price. It is critical to understand the importance of each of the scenarios when making the decision of what to test.</p>
<p>Well, why don’t we just test everything? The short answer is that it isn’t feasible (again, this does not apply to life-critical applications but it does apply to virtually everything else). The cost in time, resources and equipment to test everything has to be balanced against the ROI. I believe it is possible to make error free applications but at what cost? If it costs 10,000 to test every aspect of the alternate paths but those only become a reality once every 5,000 sales for low dollar amounts, does it provide a benefit? The answer is probably not. As with almost everything else, use the 80/20 rule. That is, 80% of the usage of your application is going to involve 20% of the code (we write an enormous amount of code to handle exception paths and alternate situations). Test that 20% of the code 100%. The other 80% of the code can be tested as problems are discovered or as time permits.</p>
<p>Now that you have a series of good test cases which concretely detail what the system must do, a developer can now answer the question, “When do you know you are done coding?” The answer is, “When the functional test cases I was provided pass.” This is the <em>only</em> right answer (but not usually the one the developers can use).</p>
<img src="http://blog.nwcadence.com/?ak_action=api_record_view&id=165&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://blog.nwcadence.com/2008/12/practical-process-improvement-part-5/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Practical Process Improvement (Part 4)</title>
		<link>http://blog.nwcadence.com/2008/11/practical-process-improvement-part-4/</link>
		<comments>http://blog.nwcadence.com/2008/11/practical-process-improvement-part-4/#comments</comments>
		<pubDate>Fri, 14 Nov 2008 17:37:12 +0000</pubDate>
		<dc:creator>Jeff Levinson</dc:creator>
				<category><![CDATA[Best Practice]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[Process]]></category>
		<category><![CDATA[Lean Software Development]]></category>
		<category><![CDATA[Process Improvement]]></category>
		<category><![CDATA[Roles & Responsibilities]]></category>

		<guid isPermaLink="false">http://blog.nwcadence.com/?p=153</guid>
		<description><![CDATA[In the previous two posts (Part 2 and Part 3) I covered an ideal bug process and the metrics you gather from the process. In this post I&#8217;ll start talking about how to use those metrics to really improve the process. I&#8217;ll also talk a bit more about who&#8217;s responsible for what. The main goal [...]]]></description>
			<content:encoded><![CDATA[<p>In the previous two posts (<a href="http://blog.nwcadence.com/2008/10/23/practical-process-improvement-part-2/" target="_blank">Part 2</a> and <a href="http://blog.nwcadence.com/2008/10/31/practical-process-improvement-part-3/" target="_blank">Part 3</a>) I covered an ideal bug process and the metrics you gather from the process. In this post I&#8217;ll start talking about how to use those metrics to really improve the process. I&#8217;ll also talk a bit more about who&#8217;s responsible for what. The main goal here is to show that it is not a major impact on the development team (if you&#8217;re using Team System &#8211; if you&#8217;re doing this manually it may require more time).</p>
<h3>Roles &amp; Responsibilities</h3>
<p>The figure below shows who is responsible for transitioning items between states in a perfect world.</p>
<p><a href="http://blog.nwcadence.com/wp-content/uploads/2008/11/roles-and-responsibilities.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" src="http://blog.nwcadence.com/wp-content/uploads/2008/11/roles-and-responsibilities-thumb.png" border="0" alt="Roles_and_Responsibilities" width="244" height="163" /></a></p>
<p>This figure very succinctly states the following:</p>
<ol>
<li>A user, analyst, developer or tester can file a bug report.</li>
<li>A project manager must assign the bug report to someone to investigate. The person they will assign it to is an analyst.</li>
<li>An analyst can determine if the investigation is complete. They can also close a bug for the reasons noted in the previous section.</li>
<li>A project manager assigns the bug to a developer (or not if the bug is being fixed in a later release).</li>
<li>A developer will set the bug to Active when they start working on it.</li>
<li>A developer determines when the bug is fixed.</li>
<li>Depending on the release process, either a Release Manager or QA Manager will note when the bug is ready for testing (and assign it to a tester). This is because there may be a configuration management (i.e. branching structure) which the code fix needs to be promoted through so that the testers can actually get it in a good build.</li>
<li>A tester will note that the bug is being tested.</li>
<li>A tester will note that the bug fix has been verified. If the bug has not been fixed, a tester can also re-assign the bug to a developer.</li>
<li>A release manager will determine which release the bug fix will be deployed in and prepare the appropriate documentation.</li>
<li>Upon successful release, the project manager will close the bug.</li>
</ol>
<h3>Reports</h3>
<p>So, you have this great bug tracking process now and you know what information you can get from each step. How do you get it easily? What reports are most important? Where do you cut down on waste?</p>
<h4>Waste</h4>
<p>Let’s start with looking at a report showing waste and determine how it might be eliminated. The next figure shows a chart of the average flow time for bugs in a system using the above process.</p>
<p><a href="http://blog.nwcadence.com/wp-content/uploads/2008/11/bug-throughput.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" src="http://blog.nwcadence.com/wp-content/uploads/2008/11/bug-throughput-thumb.png" border="0" alt="Bug throughput" width="244" height="160" /></a></p>
<p>This chart is based on the following data:</p>
<p><strong></strong></p>
<table border="1" cellspacing="0" cellpadding="1" width="400">
<tbody>
<tr>
<td width="183" valign="top">State</td>
<td width="110" valign="top">Updated Time</td>
<td width="104" valign="top">Time (in hours)</td>
</tr>
<tr>
<td width="183" valign="top">Proposed</td>
<td width="110" valign="top">8/25/2008 9:30</td>
<td width="104" valign="top"></td>
</tr>
<tr>
<td width="183" valign="top">Under Investigation</td>
<td width="110" valign="top">8/25/2008 10:30</td>
<td width="104" valign="top">1</td>
</tr>
<tr>
<td width="183" valign="top">Investigation Complete</td>
<td width="110" valign="top">8/26/2008 11:00</td>
<td width="104" valign="top">8.5</td>
</tr>
<tr>
<td width="183" valign="top">Assigned</td>
<td width="110" valign="top">8/27/2008 10:00</td>
<td width="104" valign="top">7</td>
</tr>
<tr>
<td width="183" valign="top">Active</td>
<td width="110" valign="top">8/27/2008 10:15</td>
<td width="104" valign="top">.25</td>
</tr>
<tr>
<td width="183" valign="top">Fixed, unverified</td>
<td width="110" valign="top">8/27/2008 16:30</td>
<td width="104" valign="top">6.25</td>
</tr>
<tr>
<td width="183" valign="top">Ready for Testing</td>
<td width="110" valign="top">8/29/2008 17:00</td>
<td width="104" valign="top">16.5</td>
</tr>
<tr>
<td width="183" valign="top">In Testing</td>
<td width="110" valign="top">9/1/2008 11:00</td>
<td width="104" valign="top">2</td>
</tr>
<tr>
<td width="183" valign="top">Fixed, verified</td>
<td width="110" valign="top">9/1/2008 11:30</td>
<td width="104" valign="top">.5</td>
</tr>
<tr>
<td width="183" valign="top">Scheduled for Deployment</td>
<td width="110" valign="top">9/2/2008 15:00</td>
<td width="104" valign="top">11.5</td>
</tr>
<tr>
<td width="183" valign="top">Closed</td>
<td width="110" valign="top">9/4/2008 13:00</td>
<td width="104" valign="top">14</td>
</tr>
<tr>
<td width="183" valign="top">Total</td>
<td width="110" valign="top"></td>
<td width="104" valign="top">67.5</td>
</tr>
</tbody>
</table>
<p>Note that I have included only working hours – no weekends or after hours. While this would normally be an average of these values, I wanted to demonstrate how time is determined. Still, if this were an average, you would note that the average time to fix bugs and deploy them is 67.5 hours or almost three days on average. Where can you reduce the amount of time wasted?</p>
<p><strong><em><span style="text-decoration: underline;">Note</span></em></strong></p>
<p><em>In Lean, batching is considered a bad process. The reason for this is that when you batch it means that someone is waiting to receive all of the times that make up that batch and therefore time is wasted. However, in software development, and specifically when dealing with change and release configuration management there really is no other way because fixes almost always must go in together. Promoting them one at a time would take more time than it would save and is also a major configuration headache.</em></p>
<p>Looking at the chart and table, the actual time spent working on the bug is 15.25 hours (the hours spent investigating, fixing and testing). The time wasted is 50.25 hours (the hours spent waiting while the bug was waiting to be investigated, between the investigation being completed and the bug being assigned, between the bug being assigned and the bug being worked, between the bug being fixed and it being tested and finally between the time the bug was tested until the time the bug was deployed). Again, going back to the principle of waste in Lean theory, the 50.25 hours is complete waste. Now having said that, let’s take a reality check since not all of Lean can apply to software development. Where can you reasonably shave hours?</p>
<p>The first thing to do is to understand <em>why</em> an item may be in a given state for an extended period of time. Let’s look at a hypothetical process and see what may happen in some of these states where waste is occurring.</p>
<p>The next post in this series will cover the hypothetical process. We&#8217;ll also start covering different scenarios and organization size when dealing with issues because this is <strong>NOT </strong>a one-size fits all process.</p>
<img src="http://blog.nwcadence.com/?ak_action=api_record_view&id=153&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://blog.nwcadence.com/2008/11/practical-process-improvement-part-4/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Practical Process Improvement (Part 3)</title>
		<link>http://blog.nwcadence.com/2008/10/practical-process-improvement-part-3/</link>
		<comments>http://blog.nwcadence.com/2008/10/practical-process-improvement-part-3/#comments</comments>
		<pubDate>Fri, 31 Oct 2008 19:53:19 +0000</pubDate>
		<dc:creator>Jeff Levinson</dc:creator>
				<category><![CDATA[Best Practice]]></category>
		<category><![CDATA[Process]]></category>
		<category><![CDATA[Bug States]]></category>
		<category><![CDATA[Practical Process Improvement]]></category>
		<category><![CDATA[Process Improvement]]></category>
		<category><![CDATA[Team Foundation Server]]></category>
		<category><![CDATA[Team System]]></category>
		<category><![CDATA[TFS]]></category>
		<category><![CDATA[VSTS]]></category>

		<guid isPermaLink="false">http://blog.nwcadence.com/?p=136</guid>
		<description><![CDATA[In the last post in this series I discussed the process involved around the first part of the ideal bug process. In this post I will finish up the rest of the process and metrics for handling bugs.
Fixed, unverified
This state indicates the bug has been fixed according to the developer.
This means that the developer has [...]]]></description>
			<content:encoded><![CDATA[<p>In the <a href="http://blog.nwcadence.com/2008/10/23/practical-process-improvement-part-2/" target="_blank">last</a> post in this series I discussed the process involved around the first part of the ideal bug process. In this post I will finish up the rest of the process and metrics for handling bugs.</p>
<h4><span style="text-decoration: underline;">Fixed, unverified</span></h4>
<p>This state indicates the bug has been fixed according to the developer.</p>
<p>This means that the developer has fixed the code, checked it in and associated it with the appropriate bug work item. They have run the test case provided by the analyst in the Under Investigation state. In addition, the time between the bug being in the Active state and the Fixed, unverified state is the time it took the developer to fix the bug. In other words, we now have an approximation of the developer effort to fix the bug. It doesn’t provide an exact time but it provides an overall throughput time.</p>
<h4><span style="text-decoration: underline;">Ready for Testing</span></h4>
<p>This state indicates the bug has been assigned to a tester but the testing has not yet started.</p>
<p>There are a number of reasons for this state. The first is that your branching model is such that a tester does not have access immediately after the code has been finished (i.e. you are waiting to promote code to the QA branch). The second is that there is simply other work going on and that the tester just can’t get to it right now. The transition between Fixed, unverified and Ready for Testing should be made by a Test Manager to acknowledge that the bug has been assigned to a tester (or to the testing group in general) and that it is on the right code branch for testing. The transition to this state does not provide any other meaningful information.</p>
<h4><span style="text-decoration: underline;">In Testing</span></h4>
<p>This state indicates that the bug is actively being tested.</p>
<p>The other important information provided by this state is the amount of time between the bug being ready for testing and when the testing started. This again shows <em>waste</em>.</p>
<h4><span style="text-decoration: underline;">Fixed, verified</span></h4>
<p>This state indicates that the bug has been fixed according to independent testers.</p>
<p>The time between this state and the In Testing state provides the amount of time spent testing this bug and is considered work time.</p>
<p><strong>Note: For those familiar with Lean theory, this work would be classified as <em>waste</em>. The reason is because work should never pass a station with defects – it means the process for building the code needs to be fixed. However, as I have mentioned before, I believe this is mostly impractical in software development.</strong></p>
<h4><span style="text-decoration: underline;">Scheduled for Deployment</span></h4>
<p>This state simply indicates that the fix is scheduled to be released.</p>
<p>An important piece of information to capture at this state is the release that the fix is being deployed in. This helps create a Release Notes document to provide the user explaining the changes in the upcoming release.</p>
<h4><span style="text-decoration: underline;">Closed</span></h4>
<p>The bug is closed after the release that it is included in has been deployed.</p>
<p>The time between the bug report being Proposed and the bug being Closed provides the entire throughput for the bug being fixed. This information is a good metric of whether or not your process is improving (if reducing the amount of time to accept and fix bugs is one of your goals). While removing individual pieces of waste is important, you have to keep your eye on the overall goal.</p>
<p><em><strong><span style="text-decoration: underline;">A note about UAT</span></strong></em></p>
<p>You may be wondering about the lack of inclusion of User Acceptance testing steps to track users’ acceptance of the bug. There are two reasons why this isn’t included. The first is, does it provide you any additional information? Sure, it lets you know the users accepted it, but you can do that as part of the QA process. Second, by doing UAT separately it means that you have to have separate UAT environments from QA which many organizations can’t afford. Is the cost worth it? This may be something you need to take into account as you think through your process.</p>
<p>This finished the process and description of each step in the process. The next post in this series will cover Roles &amp; Responsibilities and Reports and how to track improvements in the process.</p>
<img src="http://blog.nwcadence.com/?ak_action=api_record_view&id=136&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://blog.nwcadence.com/2008/10/practical-process-improvement-part-3/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Practical Process Improvement (Part 2)</title>
		<link>http://blog.nwcadence.com/2008/10/practical-process-improvement-part-2/</link>
		<comments>http://blog.nwcadence.com/2008/10/practical-process-improvement-part-2/#comments</comments>
		<pubDate>Thu, 23 Oct 2008 18:49:11 +0000</pubDate>
		<dc:creator>Jeff Levinson</dc:creator>
				<category><![CDATA[Best Practice]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[Process]]></category>
		<category><![CDATA[Team System]]></category>

		<guid isPermaLink="false">http://blog.nwcadence.com/?p=123</guid>
		<description><![CDATA[In my last post I talked about why metrics are important and what the goals are in using metrics. In this post I&#8217;ll talk about the bug process. How does your team handle bugs, how can you gather metrics on it and which metrics are important? This post covers the process itself. So let&#8217;s take [...]]]></description>
			<content:encoded><![CDATA[<p>In my <a href="http://blog.nwcadence.com/2008/10/01/practical-process-improvement-part-1/">last</a> post I talked about why metrics are important and what the goals are in using metrics. In this post I&#8217;ll talk about the bug process. How does your team handle bugs, how can you gather metrics on it and which metrics are important? This post covers the process itself. So let&#8217;s take a look at an &#8220;ideal&#8221; bug handling process:</p>
<p><a href="http://blog.nwcadence.com/wp-content/uploads/2008/10/bug-process.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" src="http://blog.nwcadence.com/wp-content/uploads/2008/10/bug-process-thumb.png" border="0" alt="Bug Process" width="164" height="244" /></a></p>
<p>Let&#8217;s look at each of the states so we understand what the state represents. And if this looks like the start of a new methodology, well, it is and it isn&#8217;t. It is because I&#8217;m going to detail out of this series of posts how to handle numerous items and there is a lot of methodology and process displayed here. But it isn&#8217;t because much of this is just common sense. Also, note that you do not need to implement every step. This process that I&#8217;m describing here can be scaled based on your needs.</p>
<p>The states and their descriptions are these:</p>
<h4><span style="text-decoration: underline;">Proposed</span></h4>
<p>This state indicates that a reported bug has been received. It does not indicate that any action has been taken with regard to working on the reported bug.</p>
<p>The key item to note is the reason which in this case tells us what group filed the bug. This is important because as has already been noted, it costs more to fix a bug the later it is found in the process. This allows you to note where the bugs are found and determine where certain weaknesses lie.</p>
<h4><span style="text-decoration: underline;">Under Investigation</span></h4>
<p>This state provides status to the end user to indicate that the bug report is currently being triaged.</p>
<p>The state transition provides us one very useful piece of information – the time it takes from the bug being received until someone starts working on it. This is the first of the areas where we find <em>waste</em>.</p>
<p>This state requires some work though – no free rides here. Several things need to happen:</p>
<p>1. A duplicate bug must be checked for. If a duplicate is found, then this bug needs to be closed and linked to the original bug report.</p>
<p>2. Find the test case that relates to the functionality at issue.</p>
<p>3. The analyst needs to determine what the correct functionality is supposed to be. If it works correctly (as designed) then what the user is actually reporting is a change request and a change request needs to be created. This bug can be closed and linked to the change request.</p>
<p>4. The bug needs to be reproduced. If it can’t be then it is closed.</p>
<p>5. If the bug can be reproduced, then the test case needs to be modified (or created).</p>
<p>What does this information provide us?</p>
<p>If the bug is a duplicate it means at least one thing and maybe two. First it means that this bug occurs in a commonly used piece of code and is therefore a cause for concern. Secondly, depending on the lag time between the original bug report being filed and the duplicate bug being filed may indicate that the bugs aren’t being fixed in a reasonable period of time.</p>
<p>If you cannot find the associated test case(s) then there is another issue. First, why was no test case created? Was it because this is in a less frequently used part of the system? If so, that may be acceptable (maybe it isn’t part of the normal path and so minimal testing was done on it), but it means that this part of the system is being used and additional test cases may need to be created to proactively identify any additional, related bugs. If you do find the test case, what about the test case missed the bug? Is there a gap in the test case? Are all paths not tested? Can you go back and review the code coverage report to see if there is a path through the code that was missed? These questions and their answers will help you proactively identify other areas in this particular area of code so you can take mitigating steps.</p>
<p>What if the functionality is as designed? The user is then requesting a change to the functionality – maybe. They may not understand how the functionality is supposed to work. But what does this tell you? Were the users trained in the correct use of the application? Is there online help for the application and is it effective? If the users haven’t been trained and you receive a high number of these items then maybe it’s time for a training class. If they have been trained and there is online help, then maybe the help isn’t effective or effectively integrated into the application. This may indicate that changes in those areas are needed – but only if you know what to look for.</p>
<p>If the bug can’t be reproduced, it must be closed. However, it must <em>not</em> drop off of the radar. When duplicate bugs are found you need to remember to check the closed bugs as well. If you find a number of non-reproducible bugs being duplicated, it may be time to activate the bug and try to have the developers spend some time investigating the situation.</p>
<p>Finally, if the bug is validated, that isn’t good enough. There needs to be a test case which shows what the correct behavior of the system is supposed to be so that the developers know when they are done fixing the bug and they have a way to verify that fix. If there is an existing test case and it is incorrect, then you need to look back at the requirements to determine if the test case was incorrect or whether the requirements were incorrect and make the appropriate changes (each of these points to a different area that needs to be looked at for improvement).</p>
<h4><span style="text-decoration: underline;">Investigation Complete</span></h4>
<p>This state indicates that the bug report has been verified and is now an actual bug. And again, it provides a solid indication to the end user of the status of their bug report.</p>
<p>The transition from Under Investigation to Investigation Complete provides the first piece of information on work performed in order to fix the bug (after all, you can’t fix the bug until you have verified it).</p>
<p>At this point the assignment of work can commence. However, there may be a high number of work items to assign so it may be up to a Change Control Board (CCB) to accept and validate work for a release. If that is the case then the list of Investigation Complete items will make up part of the agenda. This however can present problems. See the section entitled “Waste” later in this chapter for the problems related to this and some ideas on how to fix them.</p>
<h4><span style="text-decoration: underline;">Assigned</span></h4>
<p>This state is an indicator that the bug has been assigned to a developer for work.</p>
<p>This is called a buffer state. The transition between Investigation Complete and Assigned is basically unimportant. What is important is that this transition says is that you are planning to fix the bug. Now, what it doesn’t tell you is what release you are planning on fixing it in. Using TFS you can simply re-assign the bug to an appropriate future iteration. The assigned state also tells users that no one has <em>started</em> working on the bug yet. Additionally this state provides feedback to the CCB about what work is scheduled to be done but hasn’t started yet so the CCB doesn’t accept more bugs than can be reasonably fixed.</p>
<h4><span style="text-decoration: underline;">Active</span></h4>
<p>This state indicates that the bug is actually being fixed. No bug must ever move to this state without having an accompanying test case.</p>
<p>This state isn’t as important as the transition to this state. The time between the bug being assigned and the bug being active is lag time and is therefore <em>waste</em>.</p>
<p>One of the activities that <em>should</em> be performed during this phase is the creation of a unit test to verify the existence of the bug in code. This will help create a large library of unit tests which target previous bugs which makes regression tests easier to run.</p>
<p> </p>
<p>In this part I&#8217;ve started to describe what happens in each state and what information you can gather from each state. In the next post I will round out the steps in this particular process and then I&#8217;ll move on to discussing the benefits of the metrics. Note that this process covers virtually every type of metric you may need (there are a few it doesn&#8217;t cover but I&#8217;ll talk about that in the next post). Note also that you can pick and choose which states you want. For example, if you&#8217;re reasonably confident that you don&#8217;t have bugs sitting around for a long period of time, then maybe the early buffer states aren&#8217;t needed. Or if you aren&#8217;t sure where the problem is occurring, use broad categories and introduce additional steps to pinpoint a problem as needed.</p>
<p>Stay tuned for the next post!</p>
<img src="http://blog.nwcadence.com/?ak_action=api_record_view&id=123&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://blog.nwcadence.com/2008/10/practical-process-improvement-part-2/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Practical Process Improvement (Part 1)</title>
		<link>http://blog.nwcadence.com/2008/10/practical-process-improvement-part-1/</link>
		<comments>http://blog.nwcadence.com/2008/10/practical-process-improvement-part-1/#comments</comments>
		<pubDate>Wed, 01 Oct 2008 14:46:12 +0000</pubDate>
		<dc:creator>Jeff Levinson</dc:creator>
				<category><![CDATA[Best Practice]]></category>
		<category><![CDATA[Process]]></category>
		<category><![CDATA[Practical Process Improvement]]></category>
		<category><![CDATA[Process Improvement]]></category>

		<guid isPermaLink="false">http://blog.nwcadence.com/?p=96</guid>
		<description><![CDATA[So, its been a while since I regularly posted but starting every week or two weeks I&#8217;ll be posting a bit on the topic of Process Improvement. Not from a  high on the pulpit position but from the &#8220;how do I figure out what my problem is and, and more importantly, how do I solve [...]]]></description>
			<content:encoded><![CDATA[<p>So, its been a while since I regularly posted but starting every week or two weeks I&#8217;ll be posting a bit on the topic of Process Improvement. Not from a  high on the pulpit position but from the &#8220;how do I figure out what my problem is and, and more importantly, how do I solve it.&#8221; This will be a practical series of steps covering everything from handling bugs to managing change and will incorporate the why as well as the what.</p>
<p>Any and all comments are appreciated &#8211; especially if you think I got something wrong.</p>
<p>This part lays the groundwork for practical process improvement.</p>
<p><span style="font-size: 11pt; line-height: 115%; font-family: ">At this point you’ve made one of two decisions – you are going to implement process for the first time (your current process is referred to as <em style="mso-bidi-font-style: normal;">chaos</em>) or you are going to improve your existing process. Process for process improvements sake is a poor reason to change or implement a process. So, what are you trying to improve (a.k.a. where are you now)? Before you know where you want to go you have to have some type of baseline to measure your progress against. Implementing a process is all about small, measured steps – try to do everything at once and you are guaranteed to fail. </span></p>
<p><span style="font-size: 11pt; line-height: 115%; font-family: ">You want to work in small iterations in order to improve your process &#8211; even if you are working on a formal (or waterfall) based project. Why small iterations? Did I just tell you to change to an agile development process? Well, no, not exactly. Short iterations allow for rapid feedback and the ability to measure and introduce change quickly and at well defined points. This does not mean you have to start using XP or Crystal or Scrum or any of a dozen other agile methodologies. And these methodologies don&#8217;t work particularly well in every situation &#8211; especially if you are working on a much more structured project such as a life-critical system.</span></p>
<p><span style="font-size: 11pt; line-height: 115%; font-family: ">The goal here is not so much to measure velocity (although that in itself is highly useful), unless that&#8217;s an area you want to improve on which I&#8217;ll talk about in a much later part of the series, as to be able to introduce a change and gauge its effectiveness.</span></p>
<p><span style="font-size: 11pt; line-height: 115%; font-family: ">The other thing that is critical is metrics. If you&#8217;re making changes because you think you need to make a change (aka &#8220;the gut feeling reason&#8221;) then you aren&#8217;t going to be able to prove whether the change helped you or not except annecdotally. While we as developers don&#8217;t mind this, management really does. They don&#8217;t want to plow money into process changes without knowing the benefit they are getting for their dime. So let&#8217;s give them what they want and also help ourselves in the process. Don&#8217;t make any changes without having a baseline &#8211; ever. In addition, when you are doing a retrospective on whether the change worked or not, do it by comparing metrics (as well as gut feeling) to determine the effectiveness.</span></p>
<p><span style="font-size: 11pt; line-height: 115%; font-family: ">Next, pick and choose what you want to change (aka get the low hanging fruit first). Choose items that are more simple to change and are easier to measure. In light of this, I&#8217;m going to start off this series with simple areas (or at least, in what our experiences with customers have taught us are simple areas) and move to more difficult areas later on.</span></p>
<p><span style="font-size: 11pt; line-height: 115%; font-family: ">In preparation for the next part of this series, the first area I&#8217;m going to walk you through improving is the bug handling process. This doesn&#8217;t cover how to reduce the number of bugs you get initially (well, it does in part but that isn&#8217;t the focus) but how you handle the bugs in your process. As I mentioned before, you need baseline metrics to determine the effectiveness of the changes. To begin with, spend the next week or two and measure how long it takes from when you receive the bug (the date and time &#8211; to the hour) to when the bug fix is released into production.</span></p>
<p><span style="font-size: 11pt; line-height: 115%; font-family: ">In the next part I&#8217;ll talk about how to reduce that time frame (obviously this fix will only be important if you feel that it takes a large period of time to implement the fix and that your customers are unhappy) and what you should be doing at each stage.</span></p>
<img src="http://blog.nwcadence.com/?ak_action=api_record_view&id=96&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://blog.nwcadence.com/2008/10/practical-process-improvement-part-1/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Sexy Technology, Latest and Greatest and things still fail</title>
		<link>http://blog.nwcadence.com/2008/05/sexy-technology-latest-and-greatest-and-things-still-fail/</link>
		<comments>http://blog.nwcadence.com/2008/05/sexy-technology-latest-and-greatest-and-things-still-fail/#comments</comments>
		<pubDate>Sun, 18 May 2008 14:00:44 +0000</pubDate>
		<dc:creator>Jeff Levinson</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Process]]></category>
		<category><![CDATA[Personal Thoughts]]></category>
		<category><![CDATA[Web 2.0]]></category>
		<category><![CDATA[Web 2.0 failures]]></category>

		<guid isPermaLink="false">http://blog.nwcadence.com/2008/05/18/sexy-technology-latest-and-greatest-and-things-still-fail/</guid>
		<description><![CDATA[There have been numerous reports in the last year of &#8220;issues&#8221; with Twitter, Facebook, Seesmic and other &#8220;web 2.0&#8243; sites (I put that term in quotes because I have lots of issues with what it means since I don&#8217;t think it means anything &#8211; but that&#8217;s just me personally). I keep thinking back to the [...]]]></description>
			<content:encoded><![CDATA[<p>There have been numerous reports in the last year of &#8220;issues&#8221; with Twitter, Facebook, Seesmic and other &#8220;web 2.0&#8243; sites (I put that term in quotes because I have lots of issues with what it means since I don&#8217;t think it means anything &#8211; but that&#8217;s just me personally). I keep thinking back to the days of the dot com boom where anyone could get a job &#8211; even if they didn&#8217;t know how to code. And companies were so interested in getting cool new features out that they didn&#8217;t realize they didn&#8217;t have the basics down.</p>
<p>Basically the problems that we see with these new sites are the same problems we saw in the dot com boom era &#8211; unstructured processes, not well understood source code and a lack of quality assurance. Now granted, this isn&#8217;t the case everywhere but it isn&#8217;t limited to these newer websites either &#8211; sites like Google and Microsoft are also prone to errors (for instance, my latest favorite error with Google is Error #102. This is helpfully addressed by this message from Google if you go to look it up:</p>
<blockquote><p>You&#8217;re encountering a known issue with Gmail. Our engineers are currently investigating and working diligently to find a solution.</p>
<p>In the meantime, please try signing in to Gmail through our secured interface, available via https://mail.google.com or by clicking <a href="https://mail.google.com/"><font color="#0000cc">here</font></a>.</p>
<p>If you continue to experience difficulties, please access your mail from the older version of Gmail by clicking <strong>Older Version</strong> at the top of any Gmail page, going to http://mail.google.com/mail/?ui=1, or clicking <a href="http://mail.google.com/mail/?ui=1"><font color="#0000cc">here</font></a>.</p></blockquote>
<p>Not very helpful).</p>
<p>Anyway, the issue that I see in all of this is process which provides structure and control. IT organizations which dive headfirst into writing code without thinking of the consequences of not having an adequate structure and processes to support their business are looking for trouble. Some people may disagree with me and say that the &#8220;glitches&#8221; that I mentioned above are just growing pains of working with new technology. Well, if the technology isn&#8217;t ready yet, why is it being used to support $100 million+ size businesses? Doesn&#8217;t that seem kind of irresponsible? Wouldn&#8217;t you test out new technology before using it on mission critical applications? Or is it just me?</p>
<p>Many people have said that process gets in the way and they point to Agile development as a better way of doing things. I hate to mention it but Agile (what does that word really mean), no matter which methodology you use, is highly structured. And process never gets in the way &#8211; unless you have the wrong process. And there-in lies the problem with most IT organizations. They may have process, but it isn&#8217;t the right one so no one uses it. Good processes help support and nurish both IT and the business that IT supports. There really is a better way to do things&#8230;</p>
<p> Maybe I&#8217;m just ranting, but I would like to hear your thoughts.</p>
<img src="http://blog.nwcadence.com/?ak_action=api_record_view&id=71&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://blog.nwcadence.com/2008/05/sexy-technology-latest-and-greatest-and-things-still-fail/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
