<?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; Best Practice</title>
	<atom:link href="http://blog.nwcadence.com/category/best-practice/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>Now hiring our next great ALM Consultant!</title>
		<link>http://blog.nwcadence.com/2010/02/now-hiring-our-next-great-alm-consultant/</link>
		<comments>http://blog.nwcadence.com/2010/02/now-hiring-our-next-great-alm-consultant/#comments</comments>
		<pubDate>Thu, 04 Feb 2010 21:15:45 +0000</pubDate>
		<dc:creator>Lori Borg</dc:creator>
				<category><![CDATA[Best Practice]]></category>
		<category><![CDATA[Business]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.nwcadence.com/2010/02/now-hiring-our-next-great-alm-consultant/</guid>
		<description><![CDATA[Northwest Cadence is growing our team and looking for a great ALM Consultant. Something you are interested in pursuing or know someone who should? Please send any inquiries and resumes to careers@nwcadence.com.
At Northwest Cadence, we have created a work environment that emphasizes excellence, integrity, and out-of-the-box thinking.  Our customers have high expectations (rightfully so) [...]]]></description>
			<content:encoded><![CDATA[<p>Northwest Cadence is growing our team and looking for a great ALM Consultant. Something you are interested in pursuing or know someone who should? Please send any inquiries and resumes to careers@nwcadence.com.</p>
<p>At Northwest Cadence, we have created a work environment that emphasizes excellence, integrity, and out-of-the-box thinking.  Our customers have high expectations (rightfully so) and we wouldn’t have it any other way! Our team of outstanding people consistently rise to the occasion. They think smart, work hard, forget the box and have fun exceeding expectations, both inside and out of our company walls. </p>
<p>The ALM Consultant will provide project support, various deliverables, and quality solutions on Visual Studio (including Visual Studio Team System), software design, and Application Lifecycle Management. Engagements will vary and will involve providing expert training, consulting, mentoring, formulating technical strategies and policies and acting as a trusted advisor to customers and internal teams. </p>
<p>The ALM Consultant position requires up to 50% travel.  This is a full time position and will be based in the Kirkland, Washington office. </p>
<img src="http://blog.nwcadence.com/?ak_action=api_record_view&id=234&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://blog.nwcadence.com/2010/02/now-hiring-our-next-great-alm-consultant/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TechEd 2009: We&#8217;re #2 (And #3, and #4)</title>
		<link>http://blog.nwcadence.com/2009/05/teched-2009-were-2-and-3-and-4/</link>
		<comments>http://blog.nwcadence.com/2009/05/teched-2009-were-2-and-3-and-4/#comments</comments>
		<pubDate>Mon, 18 May 2009 05:56:19 +0000</pubDate>
		<dc:creator>Steven Borg</dc:creator>
				<category><![CDATA[Best Practice]]></category>
		<category><![CDATA[Event]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[metrics]]></category>
		<category><![CDATA[TechEd]]></category>
		<category><![CDATA[VS2010]]></category>
		<category><![CDATA[VSTS]]></category>

		<guid isPermaLink="false">http://blog.nwcadence.com/?p=212</guid>
		<description><![CDATA[We’re all finally home!  Jeff Levinson, Shad Timm, and I spent last week speaking, listening, learning and playing at TechEd 2009 in Los Angeles, CA.  Those who’ve been to TechEd, know the fire hose of information unleashed at the attendees coving developer topics from designing Azure cloud based application to Visual Studio Team System, not [...]]]></description>
			<content:encoded><![CDATA[<p>We’re all finally home!  Jeff Levinson, Shad Timm, and I spent last week speaking, listening, learning and playing at TechEd 2009 in Los Angeles, CA.  Those who’ve been to TechEd, know the fire hose of information unleashed at the attendees coving developer topics from designing Azure cloud based application to Visual Studio Team System, not to mention all the infrastructure talks!</p>
<p>I won’t regale you with stories of the parties or the in-hall discussions, but I do want to highlight three talks, and our role at TechEd.<br />
With all the votes counted, Northwest Cadence did well.  In addition to speaking to great audiences, interacting with really smart people and meeting some new clients, our sessions apparently hit the mark and were rated highly by the attendees!  Three of our talks deserve special mention:</p>
<ul>
<li><strong>Branching and Merging for Parallel Development</strong>, a talk by Jeff Levinson on the benefits and pitfalls or various branching strategies took 3rd place in the Developer Tools, Languages and Frameworks track.</li>
<li><strong>Practical Regulatory Compliance and Risk Management</strong>, my talk on using Team System to help software development teams achieve regulatory compliance (as well as manage risk) took 2nd place in the Developer Practices track.</li>
<li><strong>Metrics That Matter: Using Team System for Process Improvement</strong>, my talk on metrics took 4th place in the Developer Practices track.</li>
</ul>
<p>Finally, we spoke at the preconference.  (Can I say “finally”, when it preceded all the other talks?)  Of the 15 preconferences, our talk titled Improve Your Software Development: Real World Solutions with Team System 2008 ranked 2nd just behind the excellent talk on SharePoint planning and governance.</p>
<p>For anyone interested in hearing or seeing these sessions, shoot me an email or leave a comment!  I’d love to share them with you!  We’re representing several of these sessions at our<strong> TechTalk: VSTS Firestarter</strong> event on the Microsoft Campus this Thursday, and we’ll be recording them.</p>
<p>A special thanks to those customers who generously allowed us to use your stories, and especially to those who went so far as to provide us with their data warehouse and cube.  You guys rock!  Thank you!<br />
<!--[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]--><!--[if !supportAnnotations]--></p>
<div>
<div>
<div id="_com_1" class="msocomtxt" onmouseover="msoCommentShow('_anchor_1','_com_1')" onmouseout="msoCommentHide('_com_1')"><!--[if !supportAnnotations]--></div>
<p><!--[endif]--></div>
</div>
<img src="http://blog.nwcadence.com/?ak_action=api_record_view&id=212&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://blog.nwcadence.com/2009/05/teched-2009-were-2-and-3-and-4/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>We&#8217;re Speaking At Tech Ed!</title>
		<link>http://blog.nwcadence.com/2009/03/were-speaking-at-tech-ed/</link>
		<comments>http://blog.nwcadence.com/2009/03/were-speaking-at-tech-ed/#comments</comments>
		<pubDate>Mon, 16 Mar 2009 18:56:56 +0000</pubDate>
		<dc:creator>Jeff Levinson</dc:creator>
				<category><![CDATA[Best Practice]]></category>
		<category><![CDATA[Event]]></category>
		<category><![CDATA[Featured]]></category>

		<guid isPermaLink="false">http://blog.nwcadence.com/2009/03/16/were-speaking-at-tech-ed/</guid>
		<description><![CDATA[ Both Steven Borg and I will be speaking for a combined total of 4 sessions and 1 pre-con. The pre-con session is PRC05: Improve Your Software Development: Real World Solutions with Team System 2008. We’ll be discussing solutions that our customers have found helpful in improving their software development efficiencies, quality and other measurable [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.msteched.com" target="_blank"><img style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" title="TENA_blgr2_speaking" src="http://blog.nwcadence.com/wp-content/uploads/2009/03/tena-blgr2-speaking.gif" border="0" alt="TENA_blgr2_speaking" width="184" height="204" /></a> Both Steven Borg and I will be speaking for a combined total of 4 sessions and 1 pre-con. The pre-con session is PRC05: Improve Your Software Development: Real World Solutions with Team System 2008. We’ll be discussing solutions that our customers have found helpful in improving their software development efficiencies, quality and other measurable units of success. Whether you work with an agile process or a formal process, this session will provide you valuable tips for helping take your development organization to the next level!</p>
<p>Click the image for a link to Tech Ed! And be sure to drop by and visit us at the Team System booth!</p>
<img src="http://blog.nwcadence.com/?ak_action=api_record_view&id=202&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://blog.nwcadence.com/2009/03/were-speaking-at-tech-ed/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Northwest Cadence Attains Gold Certified Partner Status in Microsoft Partner Program</title>
		<link>http://blog.nwcadence.com/2009/02/northwest-cadence-attains-gold-certified-partner-status-in-microsoft-partner-program/</link>
		<comments>http://blog.nwcadence.com/2009/02/northwest-cadence-attains-gold-certified-partner-status-in-microsoft-partner-program/#comments</comments>
		<pubDate>Thu, 12 Feb 2009 23:00:56 +0000</pubDate>
		<dc:creator>Sue Ferguson</dc:creator>
				<category><![CDATA[Best Practice]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.nwcadence.com/?p=190</guid>
		<description><![CDATA[
Northwest Cadence Further Distinguishes Itself by Earning a Microsoft Competency in Custom Development Solutions and Learning Solutions 
Kirkland, WA, USA &#8211; 9 January, 2009
Northwest Cadence, www.nwcadence.com, today announced it has attained Gold Certified Partner status in the Microsoft Partner Program with a competency in Custom Development Solutions and Learning Solutions, recognizing Northwest Cadence’s expertise and [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone size-full wp-image-189" src="http://blog.nwcadence.com/wp-content/uploads/2009/02/gold_partner_rgb_65_811.jpg" alt="gold_partner_rgb_65_811" width="316" height="60" /></p>
<p class="MsoNormal" style="margin: 0in 0in 12pt; text-align: center;" align="center"><em><span style="font-size: small;"><span style="font-family: Times New Roman;">Northwest Cadence Further Distinguishes Itself by Earning a Microsoft Competency in Custom Development Solutions and Learning Solutions </span></span></em></p>
<p class="MsoBodyTextIndent3" style="margin: 6pt 0in 0pt; line-height: 200%;"><strong><span style="font-size: small;"><span style="font-family: Times New Roman;">Kirkland, WA, USA &#8211; 9 January, 2009</span></span></strong></p>
<p class="MsoBodyTextIndent3" style="margin: 6pt 0in 0pt; text-indent: 0.5in; line-height: 200%;"><span style="font-size: small;"><span style="font-family: Times New Roman;"><strong>Northwest Cadence</strong>,<strong> <a href="http://blog.nwcadence.com/wp-admin/www.nwcadence.com"><span style="color: #0000ff;">www.nwcadence.com</span></a></strong>, today announced it has attained Gold Certified Partner status in the Microsoft Partner Program with a competency in Custom Development Solutions and Learning Solutions, recognizing Northwest Cadence’s expertise and impact in the technology marketplace. As a Gold Certified Partner, Northwest Cadence has demonstrated expertise with Microsoft technologies and a proven ability to meet customers’ needs. Microsoft Gold Certified Partners receive a rich set of benefits, including access, training and support, giving them a competitive advantage in the channel. </span></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: 200%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto;"><span style="color: black; line-height: 200%; mso-bidi-font-size: 10.0pt;"><span style="font-size: small;"><span style="font-family: Times New Roman;"><span style="mso-spacerun: yes;"> </span><span style="mso-tab-count: 1;"> </span>Northwest Cadence provides consulting, coaching, and training on Visual Studio Team System and Application Lifecycle Management.<span style="mso-spacerun: yes;"> </span>With careful attention to both the present and the future, Northwest Cadence provides sound solutions that can be implemented, metrics that can be measured, and knowledge-transfer to ensure sustainable success. “This Gold designation helps tell the story of who we are. We are extremely pleased to be recognized as a Microsoft Gold Certified Partner.<span style="mso-spacerun: yes;"> </span>Although this Microsoft designation is quite an achievement, we are especially proud because it represents who we strive to be, every day” said Lori Borg, President of Northwest Cadence.<span style="mso-spacerun: yes;"> </span>“At Northwest Cadence, our mission<span style="mso-spacerun: yes;"> </span>as a team<span style="mso-spacerun: yes;"> </span>is to listen and be responsive <span style="mso-spacerun: yes;"> </span>to our customers <span style="mso-spacerun: yes;"> </span>and attaining this Gold status will enable us to continue to better serve our VSTS community.”<span style="mso-spacerun: yes;"> </span><span style="mso-spacerun: yes;"> </span></span></span></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt; text-indent: 0.5in; line-height: 200%; mso-layout-grid-align: none;"><span style="font-size: small;"><span style="font-family: Times New Roman;"><span style="mso-spacerun: yes;"> </span>“Customers are looking for partner companies that can bridge the gap between their business demands and technology capabilities,” said Allison Watson, corporate vice president of the Worldwide Partner Group at Microsoft Corp. “They need to trust in a company that can act as an expert adviser for their long-term strategic technology plans. Microsoft Gold Certified Partners, which have certified expertise and direct training and support from Microsoft, can build a positive customer experience with our technologies. Today, Microsoft recognizes <span style="mso-bidi-font-weight: bold;">Northwest Cadence as </span>a new Gold Certified Partner for demonstrating its expertise in providing customer satisfaction using Microsoft products and technology.”</span></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt; text-indent: 0.5in; line-height: 200%; mso-layout-grid-align: none;"><span style="font-size: small; font-family: Times New Roman;">As one of the requirements for attaining Gold Certified Partner status, <span style="mso-bidi-font-weight: bold;">Northwest Cadence<strong> </strong></span>had to declare a Microsoft Competency. Microsoft Competencies are designed to help differentiate a partner’s capabilities with specific Microsoft technologies to customers looking for a particular type of solution.</span><span style="font-size: 8.5pt; color: #333333; line-height: 200%; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;;"> </span><span style="font-size: small; font-family: Times New Roman;">Each Competency has a unique set of requirements and benefits, formulated to accurately represent the specific skills and services that partners bring to the technology industry. Within select Competencies, there are Specializations that focus on specific solution areas that recognize deeper expertise within that Competency. Serving as a specialized path to earning those Competencies, Specializations give direct access to the tools and resources that support that specific area of focus.</span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt; text-indent: 0.5in; line-height: 200%;"><span style="font-size: small; font-family: Times New Roman;">The Custom Development Solutions Competency is designed for technology partners providing custom-built solutions for clients that require value-added capabilities to optimize business opportunities.</span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt; text-indent: 0.5in; line-height: 200%;"><span style="font-size: small; font-family: Times New Roman;">“Our developer partners enable us to deliver high-quality solutions and applications to our customers,” said Nick Abbott, group manager in the .NET Developer Product Marketing Group at Microsoft Corp. “As the demand for applications built on the Microsoft platform continues to grow, there are more opportunities for providers of custom-developed applications than ever. The Custom Development Solutions Competency provides partners with a way to showcase their expertise delivering custom-built solutions to customers, to enhance partners’ revenue opportunities and positioning them for growth.”</span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt; text-indent: 0.5in; line-height: 200%;"><span style="font-size: small; font-family: Times New Roman;">Microsoft partners with the Learning Solutions Competency specialize in delivering high-quality training and full-service learning solutions to help customers maximize their investment in Microsoft technologies. Earning this competency identifies partner members of Microsoft’s premier commercial training and delivery channel, making it easier for partners to expand their scope of services and market potential. Microsoft Gold Certified Partners with the Learning Solutions Competency deliver a comprehensive range of information technology and developer training services, including skills assessment, technical training, student mentoring, and Microsoft Certified Professional exam preparation.</span></p>
<p style="margin: 0in 0in 0pt; text-indent: 0.5in; line-height: 200%;"><span style="font-size: small;"><span style="font-family: Times New Roman;"><span style="color: black;">The Microsoft Partner Program was launched in October 2003 and represents Microsoft’s ongoing commitment to the success of partners worldwide. The program offers a single, integrated partnering framework that recognizes partner expertise, rewards the total impact that partners have in the technology marketplace, and delivers more value to help </span>partners’ businesses be successful.</span></span></p>
<p style="margin: 0in 0in 0pt; text-indent: 0.5in; line-height: 200%;"><span style="font-size: small;"><span style="font-family: Times New Roman;"><span style="color: black;">Northwest Cadence specializes in Visual Studio Team System and Application Lifecycle Management.<span style="mso-spacerun: yes;"> </span>Deeply committed to the VSTS and ALM space, Northwest Cadence is committed to ensuring its clients have an exclusive advantage based on the company’s product expertise and ability to bring it all together. Northwest Cadence is involved in the current and future Microsoft product development of VSTS and employs a team of consultants and trainers who are designated as Microsoft VSTS MVP’s, VSTS Advisory Council Members, and Certified Trainers. Northwest Cadence is proud to be a part of Microsoft’s respected VSTS Inner Circle program.</span><em></em></span></span></p>
<p style="margin: 0in 0in 0pt;"><span style="font-size: 8pt;"><span style="font-family: Times New Roman;">The names of actual companies and products mentioned herein may be the trademarks of their respective owners.</span></span></p>
<p style="margin: 0in 0in 0pt;"><span style="font-size: 8pt;"><span style="font-family: Times New Roman;"> </span></span></p>
<p style="margin: 0in 0in 0pt;"><strong><span style="font-size: small; font-family: Times New Roman;">For more information, press only: </span></strong></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span style="font-size: small; font-family: Times New Roman;">Lori Borg, Northwest Cadence, (206) 947-0967, Lori.Borg@nwcadence.com</span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt; text-indent: 0.5in;"><span style="font-size: small; font-family: Times New Roman;"> </span></p>
<img src="http://blog.nwcadence.com/?ak_action=api_record_view&id=190&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://blog.nwcadence.com/2009/02/northwest-cadence-attains-gold-certified-partner-status-in-microsoft-partner-program/feed/</wfw:commentRss>
		<slash:comments>0</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>Branching Strategies</title>
		<link>http://blog.nwcadence.com/2008/01/branching-strategies-2/</link>
		<comments>http://blog.nwcadence.com/2008/01/branching-strategies-2/#comments</comments>
		<pubDate>Tue, 08 Jan 2008 22:30:44 +0000</pubDate>
		<dc:creator>Jeff Levinson</dc:creator>
				<category><![CDATA[Best Practice]]></category>
		<category><![CDATA[SCM]]></category>
		<category><![CDATA[Team System]]></category>
		<category><![CDATA[Branch by Quality]]></category>
		<category><![CDATA[Branching]]></category>
		<category><![CDATA[Merging]]></category>
		<category><![CDATA[Software Configuration Management]]></category>

		<guid isPermaLink="false">http://blog.nwcadence.com/2008/01/08/branching-strategies-2/</guid>
		<description><![CDATA[I hope everyone had a happy new year and a safe holiday season. Now that I&#8217;m done with beginning of the year housekeeping I&#8217;m back to blogging. This is the second in a series of posts on branching strategies. Branch by Quality is the most complex and flexible branching strategy so this strategy will span [...]]]></description>
			<content:encoded><![CDATA[<p>I hope everyone had a happy new year and a safe holiday season. Now that I&#8217;m done with beginning of the year housekeeping I&#8217;m back to blogging. This is the second in a series of posts on branching strategies. Branch by Quality is the most complex and flexible branching strategy so this strategy will span several posts.</p>
<p><strong>Branch by Quality</strong></p>
<p><a href="http://blog.nwcadence.com/wp-content/uploads/2008/01/branchbyquality.jpg" title="Branch By Quality - Basic"><img src="http://blog.nwcadence.com/wp-content/uploads/2008/01/branchbyquality.thumbnail.jpg" alt="Branch By Quality - Basic" /></a></p>
<p>Figure 1 &#8211; Branch by Quality, basic pattern</p>
<p>This pattern is the ultimate in flexibility &#8211; but can also get very complex. It allows you to handle unique situations and respond to changes very quickly. It can be used for supporting multiple versions of an application or for more flexibility can be combined with Branch By Release to provide even more options for supporting multiple versions. Additionally you don&#8217;t have to manage quite as many branches as with other branching strategies. However, it does mean that the management of each branch may get complicated. It allows for branching for isolation, hotfixes and the easy promotion of code from dev to test to production.</p>
<p>The basic structure as shown here involves three branches (or code at various qualities) &#8211; Dev which is code that is in constant change and is therefore referred to as &#8220;soft&#8221; code, QAwhich is code that changes very infrequently (no active development is ever done on this branch) and is considered more firm than the code on the Dev branch and finally Prod which contains code which has been released to production (development is never done on the Prod branch). The red lines represent the branch hierarchy. In this case Prod is the parent of QAwhich is the parent of Dev. In reality the branching can be done in any way which creates a relationship between Prod and QA and QA and Dev. Using TFS you can branch QA to Prod and QA to Dev or Prod to QA to Dev or Dev to QA to Prod to create this relationship. The only thing this effects is the default selection of drop down boxes in the merge wizard.</p>
<p>The reason why we refer to this pattern as Branch By Quality is because of the quality of each branch. Dev is potentially testable, QA is potentially releasable and Prod is released code. Each branch must maintaint this quality. Another hallmark of this pattern is a single path to production. Branch by Release has multiple paths to production &#8211; each new branch is a new path to production. With this pattern, builds for production ALWAYS come out of the QA branch (not the Prod branch as you may have assumed).</p>
<p>The process for releasing code is to promote it from Dev to QA, build the QA branch and test the compiled assemblies. If all tests pass, you do NOT rebuild the code &#8211; you simply deploy the already compiled assemblies. Then you promote the code from QA to Prod as a safekeeping. Note also the pairs of green lines which represent merges. As before, always Merge down, Copy Up to promote the smoothest transition possible.</p>
<p><span id="more-57"></span></p>
<p><strong>Dealing with Bugs</strong></p>
<p>Let&#8217;s look at a simple example where code has been promoted from Dev to QA (so the users can perform User Acceptance Tests (UAT)) and development on the next release has begun on the Dev branch. In this situation, assume a bug has been found by users during the UAT and needs to be fixed. Figure 2 shows this scenario.</p>
<p><a href="http://blog.nwcadence.com/wp-content/uploads/2008/01/branchbyquality_bugintest.jpg" title="Branch by Quality - Bug in Test"><img src="http://blog.nwcadence.com/wp-content/uploads/2008/01/branchbyquality_bugintest.thumbnail.jpg" alt="Branch by Quality - Bug in Test" /></a></p>
<p>Figure 2 &#8211; Bug in Test</p>
<p>Unlike Branch by Release, you cannot just make a fix on the testing branch because code on that branch is always potentially releasable which means that making changes to that branch can potentially cause problems. To avoid this you take a branch for isolation &#8211; in this case it follows almost the same pattern as performing hotfixes (discussed next) &#8211; from the QA branch. You can&#8217;t branch from Dev because if you do there is no direct way to merge from the isolation branch to the QA branch (you can do a baseless merge but in this case it causes more problems than it solves). So, take a branch from QA (at the point you promoted the code from Dev to QA and labeled the code on the QA branch) and fix the code on this branch. Perform testing on this branch and when it is ready for UAT, promote it to the QA branch. When UAT is complete and the fix verified, merge the QA branch down to the Dev branch. This ensures that the fix makes it back into the next version of the code.</p>
<p>This is a fairly simple example but they will get more complicated as I add to this strategy. I will do this in a new post in the near future.</p>
<img src="http://blog.nwcadence.com/?ak_action=api_record_view&id=57&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://blog.nwcadence.com/2008/01/branching-strategies-2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
