<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4800899166044488588</id><updated>2011-11-27T15:36:52.327-08:00</updated><category term='Lean'/><category term='My Code'/><category term='Visual Studio'/><category term='documentation'/><category term='MAF'/><category term='Code Analysis'/><category term='Team Members'/><category term='Tiago Pascoal'/><category term='Power Tools'/><category term='VSX'/><category term='GhostDoc'/><category term='Ed Blankenship'/><category term='Maintainability'/><category term='Test'/><category term='Project Manager'/><category term='Visual Studio 2010'/><category term='Hanselman'/><category term='ReaderWriterLockSlim'/><category term='NDepend'/><category term='MEF'/><category term='TeamReview'/><category term='polyglot'/><category term='fishbowl'/><category term='VSTS'/><category term='Code Review'/><category term='Code Coverage'/><category term='Compare'/><category term='Open Space'/><category term='James Shore'/><category term='Macro'/><category term='altdotnet'/><category term='CA1502'/><category term='Story Cards'/><category term='Sandcastle. TheWolf'/><category term='Enterpriser Library'/><category term='Video'/><category term='Willy-Peter Schaub'/><category term='Poster'/><category term='DYK2010'/><category term='Steven Borg'/><category term='alt.net'/><category term='Patterns and Practices'/><category term='Richard Hundhausen'/><category term='Eugene Zakhareyev'/><category term='TFS'/><category term='Rails'/><category term='MVP'/><category term='Design'/><category term='Style Cop'/><category term='API'/><category term='Requirements'/><category term='Open Source'/><category term='CA1505'/><category term='C#'/><category term='Team System'/><category term='Visual Aids'/><category term='Jeffrey Richter'/><category term='Agile'/><category term='Ruby'/><category term='Cyclomatic Complexity'/><category term='FXCop'/><category term='Tools'/><category term='Chuck Sterling'/><category term='modeling'/><category term='Patterns'/><category term='Fowler'/><category term='WPF'/><category term='Sondre Bjellås'/><category term='Omar Villarreal'/><category term='CodePlex'/><category term='Dave Laribee'/><title type='text'>JB Brown</title><subtitle type='html'>Visual Studio ALM, Lean, Agile, TeamReview, .Net and more</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.controlstatements.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://www.controlstatements.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name> </name><uri>http://www.blogger.com/profile/04526542006501977139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_gbqB01_VTFI/SMszDOF2x1I/AAAAAAAAACY/mlPCkvxKzQI/S220/DSC_2833.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>51</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4800899166044488588.post-399993934925300763</id><published>2009-11-14T07:00:00.000-08:00</published><updated>2009-11-14T07:00:02.310-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Team System'/><category scheme='http://www.blogger.com/atom/ns#' term='TFS'/><category scheme='http://www.blogger.com/atom/ns#' term='DYK2010'/><title type='text'>DYK in 2010 - You can delete a Team Project collection?</title><content type='html'>&lt;b&gt;Deleting Team Project collections can be done through command line&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Use "&lt;a href="http://msdn.microsoft.com/en-us/library/ms253116%28VS.100%29.aspx"&gt;TFSConfig&lt;/a&gt; Collection" to delete a team project collection&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;On your TFS Server open a command window (as TFS Administrator) to [TFS Install Drive]:\Program Files\Microsoft Team Foundation Server 2010\Tools&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Enter "TFSConfig Collection /delete /collectionName:[COLLECTION NAME]"&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Respond to the irreversible "Are you sure" prompt&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_gbqB01_VTFI/SvYTGpfQBAI/AAAAAAAAAGo/BeFjTucZlig/s1600-h/DeleteTFSCollection.png"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 125px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5401525808014558210" border="0" alt="" src="http://3.bp.blogspot.com/_gbqB01_VTFI/SvYTGpfQBAI/AAAAAAAAAGo/BeFjTucZlig/s400/DeleteTFSCollection.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;br /&gt;&lt;a href="http://jb-brown.blogspot.com/2009/11/dyk-in-2010-facts-and-links.html"&gt;&lt;span style="font-size:130%;"&gt;Visual Studio 2010 Facts and Links&lt;/span&gt;&lt;/a&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4800899166044488588-399993934925300763?l=www.controlstatements.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.controlstatements.com/feeds/399993934925300763/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4800899166044488588&amp;postID=399993934925300763' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/399993934925300763'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/399993934925300763'/><link rel='alternate' type='text/html' href='http://www.controlstatements.com/2009/11/dyk-in-2010-you-can-delete-team-project.html' title='DYK in 2010 - You can delete a Team Project collection?'/><author><name> </name><uri>http://www.blogger.com/profile/04526542006501977139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_gbqB01_VTFI/SMszDOF2x1I/AAAAAAAAACY/mlPCkvxKzQI/S220/DSC_2833.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_gbqB01_VTFI/SvYTGpfQBAI/AAAAAAAAAGo/BeFjTucZlig/s72-c/DeleteTFSCollection.png' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4800899166044488588.post-5057574720546574345</id><published>2009-11-13T07:00:00.000-08:00</published><updated>2009-11-13T07:00:01.785-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Team System'/><category scheme='http://www.blogger.com/atom/ns#' term='TFS'/><category scheme='http://www.blogger.com/atom/ns#' term='DYK2010'/><title type='text'>DYK in 2010 - Security and Group Membership is slightly different?</title><content type='html'>&lt;b&gt;Team Project Collections have their own Group Membership and Security&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;New in TFS 2010 are Team Project Collections, a way to make groups of Team Projects. Along with these groups comes a new level of Group Membership and Security management within the Team Foundation Administration Console.&lt;br /&gt;&lt;br /&gt;To view or manage your Team Project Collection group membership and security.&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Open the &lt;a href="http://jb-brown.blogspot.com/2009/11/dyk-in-2010-theres-new-way-to-manage.html"&gt;Team Foundation Administration Console&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;In the left pane expand Application Tier -&gt; Team Project Collections&lt;/li&gt;&lt;br /&gt;&lt;li&gt;In the top of the right pane highlight a Team Project Collection&lt;/li&gt;&lt;br /&gt;&lt;li&gt;In the bottom of the right pane choose the "General" tab&lt;/li&gt;&lt;br /&gt;&lt;li&gt;On the left of the general tab click either "Administer Group Membership" or "Administer Security"&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_gbqB01_VTFI/SvYFSfGBI-I/AAAAAAAAAGY/Bk9o8wbRmAY/s1600-h/TeamProjectCollectionsGroupMembershipAndSecurity.png"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 205px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5401510618220012514" border="0" alt="" src="http://3.bp.blogspot.com/_gbqB01_VTFI/SvYFSfGBI-I/AAAAAAAAAGY/Bk9o8wbRmAY/s400/TeamProjectCollectionsGroupMembershipAndSecurity.png" /&gt;&lt;/a&gt;&lt;br /&gt;When you click "Administer Group Membership" you see the following.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_gbqB01_VTFI/SvYF66BmiaI/AAAAAAAAAGg/AVyzWyA8-qE/s1600-h/TeamProjectCollectionsGroupMembership.png"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 312px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5401511312644016546" border="0" alt="" src="http://2.bp.blogspot.com/_gbqB01_VTFI/SvYF66BmiaI/AAAAAAAAAGg/AVyzWyA8-qE/s400/TeamProjectCollectionsGroupMembership.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;br /&gt;&lt;a href="http://jb-brown.blogspot.com/2009/11/dyk-in-2010-facts-and-links.html"&gt;&lt;span style="font-size:130%;"&gt;Visual Studio 2010 Facts and Links&lt;/span&gt;&lt;/a&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4800899166044488588-5057574720546574345?l=www.controlstatements.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.controlstatements.com/feeds/5057574720546574345/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4800899166044488588&amp;postID=5057574720546574345' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/5057574720546574345'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/5057574720546574345'/><link rel='alternate' type='text/html' href='http://www.controlstatements.com/2009/11/dyk-in-2010-security-and-group.html' title='DYK in 2010 - Security and Group Membership is slightly different?'/><author><name> </name><uri>http://www.blogger.com/profile/04526542006501977139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_gbqB01_VTFI/SMszDOF2x1I/AAAAAAAAACY/mlPCkvxKzQI/S220/DSC_2833.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_gbqB01_VTFI/SvYFSfGBI-I/AAAAAAAAAGY/Bk9o8wbRmAY/s72-c/TeamProjectCollectionsGroupMembershipAndSecurity.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4800899166044488588.post-281201581173176239</id><published>2009-11-12T07:00:00.000-08:00</published><updated>2009-11-12T07:00:03.763-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Team System'/><category scheme='http://www.blogger.com/atom/ns#' term='TFS'/><category scheme='http://www.blogger.com/atom/ns#' term='DYK2010'/><title type='text'>DYK in 2010 - Each Team Project Collection has it's own database?</title><content type='html'>&lt;b&gt;Team Project Collection databases&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;When setting up a Team Project Collection you are given the choice to use an existing empty database or create a new one. That's right each Team Project Collection has it's own DB to allow for moving (Detaching/Attaching) the collection seperate from other collections.&lt;br /&gt;&lt;br /&gt;Durring Team Project Collection setup you'll see this screen. &lt;p&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_gbqB01_VTFI/SvX_44t5g3I/AAAAAAAAAGI/j4fuyYv-M64/s1600-h/TeamProjectCollectionsDB.png"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 157px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5401504680863433586" border="0" alt="" src="http://4.bp.blogspot.com/_gbqB01_VTFI/SvX_44t5g3I/AAAAAAAAAGI/j4fuyYv-M64/s400/TeamProjectCollectionsDB.png" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;Then once the Team Project Collection is complete you can see the new dedicated database.&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_gbqB01_VTFI/SvYA0tqkqNI/AAAAAAAAAGQ/OVthGFPPQUk/s1600-h/TeamProjectCollectionsDBInSqlServer.png"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 360px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5401505708688845010" border="0" alt="" src="http://3.bp.blogspot.com/_gbqB01_VTFI/SvYA0tqkqNI/AAAAAAAAAGQ/OVthGFPPQUk/s400/TeamProjectCollectionsDBInSqlServer.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;br /&gt;&lt;a href="http://jb-brown.blogspot.com/2009/11/dyk-in-2010-facts-and-links.html"&gt;&lt;span style="font-size:130%;"&gt;Visual Studio 2010 Facts and Links&lt;/span&gt;&lt;/a&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4800899166044488588-281201581173176239?l=www.controlstatements.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.controlstatements.com/feeds/281201581173176239/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4800899166044488588&amp;postID=281201581173176239' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/281201581173176239'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/281201581173176239'/><link rel='alternate' type='text/html' href='http://www.controlstatements.com/2009/11/dyk-in-2010-each-team-project.html' title='DYK in 2010 - Each Team Project Collection has it&apos;s own database?'/><author><name> </name><uri>http://www.blogger.com/profile/04526542006501977139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_gbqB01_VTFI/SMszDOF2x1I/AAAAAAAAACY/mlPCkvxKzQI/S220/DSC_2833.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_gbqB01_VTFI/SvX_44t5g3I/AAAAAAAAAGI/j4fuyYv-M64/s72-c/TeamProjectCollectionsDB.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4800899166044488588.post-7237347843356857156</id><published>2009-11-11T07:00:00.000-08:00</published><updated>2009-11-11T07:00:04.225-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Team System'/><category scheme='http://www.blogger.com/atom/ns#' term='TFS'/><category scheme='http://www.blogger.com/atom/ns#' term='DYK2010'/><title type='text'>DYK in 2010 - You can create "groups" of Team Projects</title><content type='html'>&lt;b&gt;Team Project Collections&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;In the Team Foundation Administration Console you can now create groups of Team Projects with the new Team Project Collections feature. If you are upgrading an existing TFS your current Team Projects will be placed in the Team Project Collect ion aptly named "DefaultCollection."&lt;br /&gt;&lt;br /&gt;To create and manage Team Project Collections&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Open the &lt;a href="http://jb-brown.blogspot.com/2009/11/dyk-in-2010-theres-new-way-to-manage.html"&gt;Team Foundation Administration Console&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Under the "Application Tier" section choose "Team Project Collections"&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_gbqB01_VTFI/SvX8TVueIkI/AAAAAAAAAF4/tpFaECu9OT0/s1600-h/TeamProjectCollections.png"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 303px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5401500737280549442" border="0" alt="" src="http://3.bp.blogspot.com/_gbqB01_VTFI/SvX8TVueIkI/AAAAAAAAAF4/tpFaECu9OT0/s400/TeamProjectCollections.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;In Visual Studio 2010 beta 2 the Team Project Collections show up in the connection dialog as "Directory" choices&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_gbqB01_VTFI/SvX-OJf1LRI/AAAAAAAAAGA/40inMo6n3LY/s1600-h/TeamProjectCollectionsInVS.png"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 229px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5401502847121829138" border="0" alt="" src="http://1.bp.blogspot.com/_gbqB01_VTFI/SvX-OJf1LRI/AAAAAAAAAGA/40inMo6n3LY/s400/TeamProjectCollectionsInVS.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;More on &lt;a href="http://msdn.microsoft.com/en-us/library/dd273726%28VS.100%29.aspx"&gt;Creating Team Project Collections in 2010 Beta 2&lt;/a&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;br /&gt;&lt;a href="http://jb-brown.blogspot.com/2009/11/dyk-in-2010-facts-and-links.html"&gt;&lt;span style="font-size:130%;"&gt;Visual Studio 2010 Facts and Links&lt;/span&gt;&lt;/a&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4800899166044488588-7237347843356857156?l=www.controlstatements.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.controlstatements.com/feeds/7237347843356857156/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4800899166044488588&amp;postID=7237347843356857156' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/7237347843356857156'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/7237347843356857156'/><link rel='alternate' type='text/html' href='http://www.controlstatements.com/2009/11/dyk-in-2010-you-can-create-groups-of.html' title='DYK in 2010 - You can create &quot;groups&quot; of Team Projects'/><author><name> </name><uri>http://www.blogger.com/profile/04526542006501977139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_gbqB01_VTFI/SMszDOF2x1I/AAAAAAAAACY/mlPCkvxKzQI/S220/DSC_2833.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_gbqB01_VTFI/SvX8TVueIkI/AAAAAAAAAF4/tpFaECu9OT0/s72-c/TeamProjectCollections.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4800899166044488588.post-3582239710312924471</id><published>2009-11-10T07:00:00.000-08:00</published><updated>2009-11-10T07:00:02.607-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Team System'/><category scheme='http://www.blogger.com/atom/ns#' term='TFS'/><category scheme='http://www.blogger.com/atom/ns#' term='DYK2010'/><title type='text'>DYK in 2010 - There are new TFS configuration options</title><content type='html'>&lt;strong&gt;Basic, Advanced, Application Tier, and Upgrade&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;If you consider "upgrade" as a type, there are 4 types of configuration options for TFS 2010.  You can find them in the &lt;a href="http://jb-brown.blogspot.com/2009/11/dyk-in-2010-theres-new-way-to-manage.html"&gt;Team Foundation Administration Console&lt;/a&gt;.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Basic - the compact, quick, easy way to install TFS 2010. Although you don't get sharepoint, reporting, or many choices about your installation.&lt;br /&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 297px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5401497765238924834" border="0" alt="" src="http://2.bp.blogspot.com/_gbqB01_VTFI/SvX5mWAh5iI/AAAAAAAAAFQ/_lGt4I4ZpMU/s400/TFSBasic.png" /&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Advanced - similar to a 2008 install but with more options - lots of choices and the full TFS feature set at your finger tips.&lt;br /&gt;&lt;br /&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 297px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5401497842675959410" border="0" alt="" src="http://4.bp.blogspot.com/_gbqB01_VTFI/SvX5q2e9RnI/AAAAAAAAAFY/fEyvQtQ3ifo/s400/TFSAdvanced.png" /&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Application Tier - if you have a multi-tier deployment with your TFS Databases somewhere else, this is for you.&lt;br /&gt;&lt;br /&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 300px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5401497904779525618" border="0" alt="" src="http://3.bp.blogspot.com/_gbqB01_VTFI/SvX5ud1mffI/AAAAAAAAAFg/F2619KeOxqg/s400/TFSApplicationTier.png" /&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Upgrade - speaks for itself - you have a 2008 TFS and you want to upgrade it to 2010&lt;br /&gt;&lt;br /&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 301px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5401498348213922514" border="0" alt="" src="http://3.bp.blogspot.com/_gbqB01_VTFI/SvX6IRwmatI/AAAAAAAAAFw/V8cF69TDEiI/s400/TFSUpgrade.png" /&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;br /&gt;&lt;a href="http://jb-brown.blogspot.com/2009/11/dyk-in-2010-facts-and-links.html"&gt;&lt;span style="font-size:130%;"&gt;Visual Studio 2010 Facts and Links&lt;/span&gt;&lt;/a&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4800899166044488588-3582239710312924471?l=www.controlstatements.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.controlstatements.com/feeds/3582239710312924471/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4800899166044488588&amp;postID=3582239710312924471' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/3582239710312924471'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/3582239710312924471'/><link rel='alternate' type='text/html' href='http://www.controlstatements.com/2009/11/dyk-in-2010-there-are-new-tfs.html' title='DYK in 2010 - There are new TFS configuration options'/><author><name> </name><uri>http://www.blogger.com/profile/04526542006501977139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_gbqB01_VTFI/SMszDOF2x1I/AAAAAAAAACY/mlPCkvxKzQI/S220/DSC_2833.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_gbqB01_VTFI/SvX5mWAh5iI/AAAAAAAAAFQ/_lGt4I4ZpMU/s72-c/TFSBasic.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4800899166044488588.post-8340581709540246015</id><published>2009-11-09T07:00:00.000-08:00</published><updated>2009-11-09T07:00:00.904-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Team System'/><category scheme='http://www.blogger.com/atom/ns#' term='TFS'/><category scheme='http://www.blogger.com/atom/ns#' term='DYK2010'/><title type='text'>DYK in 2010 - You can also configure TFS from command line?</title><content type='html'>&lt;b&gt;The Key is the &lt;a href="http://msdn.microsoft.com/en-us/library/ms253116%28VS.100%29.aspx"&gt;TFSConfig&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;It must be run from the TFS server (App tier) in [TFS Install Drive]:\Program Files\Microsoft Team Foundation Server 2010\Tools. Obviously to administer TFS you need to run it from an account that has TFS Administration privileges.&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;br /&gt;&lt;a href="http://jb-brown.blogspot.com/2009/11/dyk-in-2010-facts-and-links.html"&gt;&lt;span style="font-size:130%;"&gt;Visual Studio 2010 Facts and Links&lt;/span&gt;&lt;/a&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4800899166044488588-8340581709540246015?l=www.controlstatements.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.controlstatements.com/feeds/8340581709540246015/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4800899166044488588&amp;postID=8340581709540246015' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/8340581709540246015'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/8340581709540246015'/><link rel='alternate' type='text/html' href='http://www.controlstatements.com/2009/11/dyk-in-2010-you-can-also-configure-tfs.html' title='DYK in 2010 - You can also configure TFS from command line?'/><author><name> </name><uri>http://www.blogger.com/profile/04526542006501977139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_gbqB01_VTFI/SMszDOF2x1I/AAAAAAAAACY/mlPCkvxKzQI/S220/DSC_2833.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4800899166044488588.post-7550356288929252976</id><published>2009-11-08T07:00:00.000-08:00</published><updated>2009-11-08T07:00:09.006-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Team System'/><category scheme='http://www.blogger.com/atom/ns#' term='TFS'/><category scheme='http://www.blogger.com/atom/ns#' term='DYK2010'/><title type='text'>DYK in 2010 - There's a new way to manage and configure TFS</title><content type='html'>&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;strong&gt;Team Foundation Administration Console&lt;/strong&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;In TFS 2010 there are new TFS management and configuration options. These are surfaced in the Team Foundation Administration Console. Among these options are the TFS configuration setup (Basic, Complete, Advanced), Team Project collection setup and more.&lt;br /&gt;&lt;br /&gt;To find the Team Foundation Administration Console &lt;/div&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Install TFS 2010&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Login to your TFS server&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Click Start -&gt; All Programs -&gt; Microsoft Team Foundation Server 2010 -&gt; Team Foundation Administration Console&lt;br /&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 257px; DISPLAY: block; HEIGHT: 386px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5401493981556677618" border="0" alt="" src="http://4.bp.blogspot.com/_gbqB01_VTFI/SvX2KGsYm_I/AAAAAAAAAFI/4MsJ7iDJlD4/s400/StartMenuTeamFoundationAdministrationConsole.png" /&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Check out the Team Foundation Administration Console &lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 301px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5401492278552182466" border="0" alt="" src="http://1.bp.blogspot.com/_gbqB01_VTFI/SvX0m-gePsI/AAAAAAAAAFA/6mi6hJn57RE/s400/TeamFoundationAdministrationConsoleMain.png" /&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;/ol&gt;&lt;/div&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;br /&gt;&lt;a href="http://jb-brown.blogspot.com/2009/11/dyk-in-2010-facts-and-links.html"&gt;&lt;span style="font-size:130%;"&gt;Visual Studio 2010 Facts and Links&lt;/span&gt;&lt;/a&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4800899166044488588-7550356288929252976?l=www.controlstatements.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.controlstatements.com/feeds/7550356288929252976/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4800899166044488588&amp;postID=7550356288929252976' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/7550356288929252976'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/7550356288929252976'/><link rel='alternate' type='text/html' href='http://www.controlstatements.com/2009/11/dyk-in-2010-theres-new-way-to-manage.html' title='DYK in 2010 - There&apos;s a new way to manage and configure TFS'/><author><name> </name><uri>http://www.blogger.com/profile/04526542006501977139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_gbqB01_VTFI/SMszDOF2x1I/AAAAAAAAACY/mlPCkvxKzQI/S220/DSC_2833.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_gbqB01_VTFI/SvX2KGsYm_I/AAAAAAAAAFI/4MsJ7iDJlD4/s72-c/StartMenuTeamFoundationAdministrationConsole.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4800899166044488588.post-4661631298749517987</id><published>2009-11-07T17:01:00.000-08:00</published><updated>2009-11-07T17:18:48.617-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Team System'/><category scheme='http://www.blogger.com/atom/ns#' term='TFS'/><category scheme='http://www.blogger.com/atom/ns#' term='DYK2010'/><title type='text'>DYK in 2010 - MSDN documentation is already available?</title><content type='html'>&lt;b&gt;2010 documentation is under "Application Lifecycle Management"&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;In case you we're looking for it under "Team System" it's under &lt;a href="http://msdn.microsoft.com/en-us/library/fda2bad5%28VS.100%29.aspx"&gt;Visual Studio 2010 Beta 2 -&gt; Application Lifecycle Management&lt;/a&gt; instead.&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;br /&gt;&lt;a href="http://jb-brown.blogspot.com/2009/11/dyk-in-2010-facts-and-links.html"&gt;&lt;span style="font-size:130%;"&gt;Visual Studio 2010 Facts and Links&lt;/span&gt;&lt;/a&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4800899166044488588-4661631298749517987?l=www.controlstatements.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.controlstatements.com/feeds/4661631298749517987/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4800899166044488588&amp;postID=4661631298749517987' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/4661631298749517987'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/4661631298749517987'/><link rel='alternate' type='text/html' href='http://www.controlstatements.com/2009/11/dyk-in-2010-msdn-documentation-is.html' title='DYK in 2010 - MSDN documentation is already available?'/><author><name> </name><uri>http://www.blogger.com/profile/04526542006501977139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_gbqB01_VTFI/SMszDOF2x1I/AAAAAAAAACY/mlPCkvxKzQI/S220/DSC_2833.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4800899166044488588.post-744444339442133647</id><published>2009-11-07T16:57:00.000-08:00</published><updated>2009-11-09T18:28:50.622-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Team System'/><category scheme='http://www.blogger.com/atom/ns#' term='TFS'/><category scheme='http://www.blogger.com/atom/ns#' term='DYK2010'/><title type='text'>DYK in 2010 - Facts and Links</title><content type='html'>A (continually updated) list of Visual Studio 2010 Facts and Links - I'll be referencing this from other posts.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Launch date is March 22, 2010&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.microsoft.com/presspass/newsroom/developer/factsheets/VS2010PackagingFS.docx"&gt;2010 Sku Structure, Upgrade Plan, and Pricing&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.microsoft.com/visualstudio/en-us/try/default.mspx#download"&gt;Visual Studio Beta 2 Downloads&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=6C70FD8F-615E-4203-A028-ACB2C2B8B88F&amp;amp;displaylang=en"&gt;TFS Beta 2 download&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=cf13ea45-d17b-4edc-8e6c-6c5b208ec54d"&gt;Use Visual Studio 2008 with TFS 2010 Download&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/dd831853(VS.100).aspx"&gt;MSDN Documentation&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://vslabmgmt.codeplex.com/"&gt;VM Prep Tool for Visual Studio Team Lab Management 2010&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4800899166044488588-744444339442133647?l=www.controlstatements.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.controlstatements.com/feeds/744444339442133647/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4800899166044488588&amp;postID=744444339442133647' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/744444339442133647'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/744444339442133647'/><link rel='alternate' type='text/html' href='http://www.controlstatements.com/2009/11/dyk-in-2010-facts-and-links.html' title='DYK in 2010 - Facts and Links'/><author><name> </name><uri>http://www.blogger.com/profile/04526542006501977139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_gbqB01_VTFI/SMszDOF2x1I/AAAAAAAAACY/mlPCkvxKzQI/S220/DSC_2833.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4800899166044488588.post-8550135121155975278</id><published>2009-10-19T12:02:00.001-07:00</published><updated>2009-10-19T12:07:47.480-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Team System'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='VSTS'/><title type='text'>First Look: Beta 2 Diagnostic Tools</title><content type='html'>John Robbins is either the fastest blogger known to man, or is an extemely well prepared geek. He has already provided a series of great First Look blog posts about Visual Studio Beta 2 Diagnostic Tools, check them out.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.wintellect.com/CS/blogs/jrobbins/archive/2009/10/19/vs-2010-beta-2-debugger-in-depth-first-look.aspx"&gt;VS 2010 Beta 2 Debugger In-Depth First Look&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.wintellect.com/CS/blogs/jrobbins/archive/2009/10/19/vs-2010-beta-2-intellitrace-in-depth-first-look.aspx"&gt;&lt;br /&gt;VS 2010 Beta 2 IntelliTrace In-Depth First Look&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.wintellect.com/CS/blogs/jrobbins/archive/2009/10/19/vs-2010-beta-2-code-analysis-in-depth-first-look.aspx"&gt;VS 2010 Beta 2 Code Analysis In-Depth First Look&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.wintellect.com/CS/blogs/jrobbins/archive/2009/10/19/vs-2010-beta-2-sampling-and-instrumentation-profiling-in-depth-first-look.aspx"&gt;&lt;br /&gt;VS 2010 Beta 2 Sampling and Instrumentation Profiling In Depth First Look&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.wintellect.com/CS/blogs/jrobbins/archive/2009/10/19/vs-2010-beta-2-concurrency-resource-profiling-in-depth-first-look.aspx"&gt;VS 2010 Beta 2 Concurrency Resource Profiling In Depth First Look&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4800899166044488588-8550135121155975278?l=www.controlstatements.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.controlstatements.com/feeds/8550135121155975278/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4800899166044488588&amp;postID=8550135121155975278' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/8550135121155975278'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/8550135121155975278'/><link rel='alternate' type='text/html' href='http://www.controlstatements.com/2009/10/first-look-beta-2-diagnostic-tools.html' title='First Look: Beta 2 Diagnostic Tools'/><author><name> </name><uri>http://www.blogger.com/profile/04526542006501977139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_gbqB01_VTFI/SMszDOF2x1I/AAAAAAAAACY/mlPCkvxKzQI/S220/DSC_2833.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4800899166044488588.post-2245641374849233344</id><published>2009-10-19T11:43:00.000-07:00</published><updated>2009-10-19T11:50:55.907-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Team System'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='TFS'/><category scheme='http://www.blogger.com/atom/ns#' term='VSTS'/><title type='text'>Using VSTS 2008 Client and TFS 2010</title><content type='html'>Want to test out TFS 2010 with your existing Visual Studio 2008 install?&lt;br /&gt;&lt;br /&gt;Use the &lt;a href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;FamilyID=cf13ea45-d17b-4edc-8e6c-6c5b208ec54d"&gt;2008 Forward Compatibility Service Pack&lt;/a&gt; - "This is an update for the 2008 SP1 version of Visual Studio Team System Team Explorer and allows the 2008 SP1 version to work with the Team Foundation Server 2010. The update will allow teams to move forward and use the Team Foundation Server 2010 server even if part of the team continues to use the Team Explorer 2008 SP1 client."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4800899166044488588-2245641374849233344?l=www.controlstatements.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.controlstatements.com/feeds/2245641374849233344/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4800899166044488588&amp;postID=2245641374849233344' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/2245641374849233344'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/2245641374849233344'/><link rel='alternate' type='text/html' href='http://www.controlstatements.com/2009/10/using-vsts-2008-client-and-tfs-2010.html' title='Using VSTS 2008 Client and TFS 2010'/><author><name> </name><uri>http://www.blogger.com/profile/04526542006501977139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_gbqB01_VTFI/SMszDOF2x1I/AAAAAAAAACY/mlPCkvxKzQI/S220/DSC_2833.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4800899166044488588.post-693455482399305463</id><published>2009-10-19T09:16:00.000-07:00</published><updated>2009-10-19T10:52:39.071-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Team System'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='VSTS'/><title type='text'>Visual Studio 2010 Beta 2 - the Ultimate one</title><content type='html'>Beta 2 is available on MSDN- when you get there you'll notice a few things&lt;br /&gt;&lt;ol&gt;&lt;li&gt;MSDN looks different&lt;/li&gt;&lt;li&gt;There's are new VS, TFS..etc Logos&lt;br /&gt;&lt;/li&gt;&lt;li&gt;There isn't a "Team Suite" or other former Team System versions.  What you're looking for is now called "Visual Studio Ultimate"&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;There are now less Visual Studio SKUs and here's how they compare to the 2008 versions.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://ykfuoq.bay.livefilestore.com/y1pWwnimebH92t44IpJtdxp8PzjYqt0DrG8D6Ny15MNn2K_ADXvx-q4URd4nRcApHG45EKGt_qyk8sOqylQAPkk3g/2010Pricing.jpg"&gt;&lt;br /&gt;&lt;br /&gt;The following graphic shows the migration path for existing MSDN customers, this should happen around the &lt;span style="font-weight:bold;"&gt;March 22, 2010 launch date&lt;/span&gt;. That's right the Launch Date is out!&lt;br /&gt;&lt;br /&gt;&lt;img src="http://ykfuoq.bay.livefilestore.com/y1p6aaf4mE0TmiiLFFHiZzqe9qHPUzUzuoDIQ3CX45NVMfWb_CbcsB9d27ar3Z-vMDV-yj7uUs1M3A-RNODENrpVA/2010Upgrade.jpg"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;For more information here's a great fact sheet from Microsoft News room about the &lt;a href="http://www.microsoft.com/presspass/newsroom/developer/factsheets/VS2010PackagingFS.docx"&gt;Sku structure, Migration and pricing&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4800899166044488588-693455482399305463?l=www.controlstatements.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.controlstatements.com/feeds/693455482399305463/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4800899166044488588&amp;postID=693455482399305463' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/693455482399305463'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/693455482399305463'/><link rel='alternate' type='text/html' href='http://www.controlstatements.com/2009/10/visual-studio-2010-beta-2-ultimate-one.html' title='Visual Studio 2010 Beta 2 - the Ultimate one'/><author><name> </name><uri>http://www.blogger.com/profile/04526542006501977139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_gbqB01_VTFI/SMszDOF2x1I/AAAAAAAAACY/mlPCkvxKzQI/S220/DSC_2833.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4800899166044488588.post-7299023625069587708</id><published>2009-05-25T17:10:00.000-07:00</published><updated>2009-05-26T17:19:37.787-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Team System'/><category scheme='http://www.blogger.com/atom/ns#' term='Project Manager'/><category scheme='http://www.blogger.com/atom/ns#' term='My Code'/><category scheme='http://www.blogger.com/atom/ns#' term='VSTS'/><title type='text'>Where to find VSTS Project Manager Ideas and Answers</title><content type='html'>If you search the web, &lt;a href="http://www.codeplex.com/"&gt;&lt;span id="SPELLING_ERROR_0" class="blsp-spelling-error"&gt;&lt;span id="SPELLING_ERROR_0" class="blsp-spelling-error"&gt;CodePlex&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href="http://www.teamsystemwidgets.com/"&gt;The Team System Widget list&lt;/a&gt;, and the &lt;a href="http://visualstudiogallery.msdn.microsoft.com/en-us/"&gt;Visual Studio Gallery&lt;/a&gt; you can find all types of great goodies.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;But where are all the Project Manager resources?&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Now there is a location - &lt;a href="http://vstsprojectmanager.codeplex.com/"&gt;&lt;span id="SPELLING_ERROR_1" class="blsp-spelling-error"&gt;&lt;span id="SPELLING_ERROR_1" class="blsp-spelling-error"&gt;VSTS&lt;/span&gt;&lt;/span&gt; Project Manager&lt;/a&gt; - Where Project Managers that use Team System go for ideas and answers.&lt;br /&gt;&lt;br /&gt;Let's look at one of the resources available - an Excel Dashboard for &lt;span id="SPELLING_ERROR_2" class="blsp-spelling-error"&gt;&lt;a href="http://www.codeplex.com/"&gt;&lt;span id="SPELLING_ERROR_2" class="blsp-spelling-error"&gt;CodePlex&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; project teams to manage their projects. This was generously contributed by Ben &lt;span id="SPELLING_ERROR_3" class="blsp-spelling-error"&gt;&lt;span id="SPELLING_ERROR_3" class="blsp-spelling-error"&gt;Amodio&lt;/span&gt;&lt;/span&gt; after I saw a great presentation from him at the &lt;a href="http://jasonhaley.com/blog/post/2009/03/30/Downtown-SeattleNet-User-Group-e28093-April-8-2009.aspx"&gt;&lt;span id="SPELLING_ERROR_4" class="blsp-spelling-error"&gt;&lt;span id="SPELLING_ERROR_4" class="blsp-spelling-error"&gt;Dowtown&lt;/span&gt;&lt;/span&gt; Seattle.Net User Group&lt;/a&gt; and asked enough questions that he whipped out this dashboard in no-time at all.&lt;br /&gt;&lt;br /&gt;So, follow along with me using your project as I go through the steps to use the Dashboard for &lt;a href="http://teamreview.codeplex.com/"&gt;&lt;span id="SPELLING_ERROR_5" class="blsp-spelling-error"&gt;&lt;span id="SPELLING_ERROR_5" class="blsp-spelling-error"&gt;TeamReview&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;, and then &lt;span id="SPELLING_ERROR_6" class="blsp-spelling-error"&gt;analyze&lt;/span&gt; the results and discuss the immediate insight it provides.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;Setting up the &lt;span id="SPELLING_ERROR_7" class="blsp-spelling-error"&gt;&lt;span id="SPELLING_ERROR_6" class="blsp-spelling-error"&gt;CodePlex&lt;/span&gt;&lt;/span&gt; dashboard&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;I've explained this in an extreme amount of detail, so it looks much longer than it is - in reality it only takes about 5-10 minutes the first time and then you are set-up. Once you're done you'll make your colleagues jealous that you have such accurate insight into the state of your project - and all you are doing is hitting the refresh button once in a while.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;The workbook we are going to load up needs a Team Query that has all the work items and some important fields, so let's set that up in &lt;span id="SPELLING_ERROR_8" class="blsp-spelling-error"&gt;&lt;span id="SPELLING_ERROR_7" class="blsp-spelling-error"&gt;VSTS&lt;/span&gt;&lt;/span&gt; in preparation. &lt;span id="SPELLING_ERROR_9" class="blsp-spelling-error"&gt;&lt;span id="SPELLING_ERROR_8" class="blsp-spelling-error"&gt;CodePlex&lt;/span&gt;&lt;/span&gt; doesn't allow us to add new Team queries, so you'll have to create a private one. In Team Explorer under "Work Items", right click on "My Queries" and choose "Add Query"&lt;br /&gt;&lt;br /&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; DISPLAY: block; CURSOR: hand" border="0" alt="" src="http://taeyga.bay.livefilestore.com/y1pKek98Hq2YEP-cdQHSTu4nQs67GKTCGE4jTbLIOPBuQm4O8GmcPcH59uGAXsMW5_sYKHTm1G0lt9KL_a4bnDIsA/AddQuery.jpg" /&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The default filters that are provided are exactly what we want - everything! So save this as "All History" where it's "only visible to you"&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; DISPLAY: block; CURSOR: hand" border="0" alt="" src="http://taeyga.bay.livefilestore.com/y1pm9nB7XXfjOQvNwOsM5hdXBaIUBjaG_El0V6w6BBKIERr3lXnNLKZ2Y0O65F8RdQVxRAoQug6xt2Vs2mBpH32zg/CreateAllHistory.jpg" /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Now we're ready for the Excel Dashboard - Download the &lt;a href="http://vstsprojectmanager.codeplex.com/SourceControl/ListDownloadableCommits.aspx"&gt;latest Source&lt;/a&gt; from VSTSProjectManager.codeplex.com&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Open the \&lt;span id="SPELLING_ERROR_10" class="blsp-spelling-error"&gt;&lt;span id="SPELLING_ERROR_9" class="blsp-spelling-error"&gt;CodePlex&lt;/span&gt;&lt;/span&gt;\Excel Dashboards\&lt;span id="SPELLING_ERROR_11" class="blsp-spelling-error"&gt;&lt;span id="SPELLING_ERROR_10" class="blsp-spelling-error"&gt;CodePlex&lt;/span&gt;&lt;/span&gt; Dashboard.&lt;span id="SPELLING_ERROR_12" class="blsp-spelling-error"&gt;&lt;span id="SPELLING_ERROR_11" class="blsp-spelling-error"&gt;xlsm&lt;/span&gt;&lt;/span&gt; workbook.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;This is a macro enabled workbook so the first thing we need to do is make sure it's in a location on your computer where macros are allowed to execute. From the file menu select "Excel Options"&lt;br /&gt;&lt;br /&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; DISPLAY: block; CURSOR: hand" border="0" alt="" src="http://taeyga.bay.livefilestore.com/y1pc2qWWnQNBT4XF2yGE7f_pwnPz-9mMrqIaC6OHDALVQY1atljnnAsZCbkT55rQ5Bgqffbph85BQfDIE2P1gcojA/ExcelOptions.jpg" /&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Then on the "Trust Center" channel click "Trust Center Settings.."&lt;br /&gt;&lt;br /&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; DISPLAY: block; CURSOR: hand" border="0" alt="" src="http://taeyga.bay.livefilestore.com/y1p5LVl8wIHob7o2C-EY6XLlofNUIIVRFmmcsb58rZ1zdP_ntrQxRJW8sEA-SkoJ83J8AeIrV3RPF-K5a44LHDSog/TrustCenter.jpg" /&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Now, in the "Trust Locations" channel verify that the workbook is already in a trusted location, or add a new trusted location and then click &lt;span id="SPELLING_ERROR_13" class="blsp-spelling-error"&gt;&lt;span id="SPELLING_ERROR_12" class="blsp-spelling-error"&gt;ok&lt;/span&gt;&lt;/span&gt; a few times to get back to the main workbook screen&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; DISPLAY: block; CURSOR: hand" border="0" alt="" src="http://taeyga.bay.livefilestore.com/y1pzaIGsx_eD8v_0etB-tJZWDjK02JT85OSXxjRvmlFOYfHYozzYaVhVoSFqSlC0FdSoSrEsL9jKFTdBbhXsZxFxg/TrustCenterLocations.jpg" /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Now that has been completed click the "Options" button to enable macros&lt;br /&gt;&lt;br /&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; DISPLAY: block; CURSOR: hand" border="0" alt="" src="http://taeyga.bay.livefilestore.com/y1pUduHOb7Iif_YwkAKiJJLHCe7XvfcSBxrzIdeaNEqFGVr0Db2aCUyqM4FIggIqhxaidYIfvUV9qSo20w5OuXX1w/Macros.jpg" /&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Choose the option to enable macros and then click OK&lt;br /&gt;&lt;br /&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; DISPLAY: block; CURSOR: hand" border="0" alt="" src="http://taeyga.bay.livefilestore.com/y1pflLZaebskFFfOK-BCqYk9RriTDU9Z0APsOaKPKa2NbM1BcfkHnIiR-9ykChiHP-QAt6vj0LkmyLLu2DPgRR9kg/EnableMacros.jpg" /&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The workbook comes with some "Test data" (ahem, masked stuff from &lt;a href="http://teamreview.codeplex.com/"&gt;&lt;span id="SPELLING_ERROR_14" class="blsp-spelling-error"&gt;&lt;span id="SPELLING_ERROR_13" class="blsp-spelling-error"&gt;TeamReview&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;) and isn't going to help you make decisions - so it's time to import your &lt;span id="SPELLING_ERROR_15" class="blsp-spelling-error"&gt;&lt;span id="SPELLING_ERROR_14" class="blsp-spelling-error"&gt;CodePlex&lt;/span&gt;&lt;/span&gt; project data. In Excel click on the "Work Item Data" Spreadsheet, then go to the "Team" tab and choose "New List"&lt;br /&gt;&lt;br /&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; DISPLAY: block; CURSOR: hand" border="0" alt="" src="http://taeyga.bay.livefilestore.com/y1p1sSevQOoQ0Pv-choaOVOSJWFKS-X_f9uAMUpka0lSv5U6PnHU_fRVKQuRwAsD-btt0wNquU4CU9VdC_hhVkWWw/NewList.jpg" /&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Now we can connect to the Private Query that we created in the first few steps. Enter or choose your &lt;span id="SPELLING_ERROR_16" class="blsp-spelling-error"&gt;&lt;span id="SPELLING_ERROR_15" class="blsp-spelling-error"&gt;CodePlex&lt;/span&gt;&lt;/span&gt; server and then provide your &lt;span id="SPELLING_ERROR_17" class="blsp-spelling-error"&gt;&lt;span id="SPELLING_ERROR_16" class="blsp-spelling-error"&gt;CodePlex&lt;/span&gt;&lt;/span&gt; credentials; finally you should be able to select your &lt;span id="SPELLING_ERROR_18" class="blsp-spelling-error"&gt;&lt;span id="SPELLING_ERROR_17" class="blsp-spelling-error"&gt;CodePlex&lt;/span&gt;&lt;/span&gt; project&lt;br /&gt;&lt;br /&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; DISPLAY: block; CURSOR: hand" border="0" alt="" src="http://taeyga.bay.livefilestore.com/y1puayPxgq6CSrbLkQU6ZsXXiACN6Tkpvm9vKLTfPP-6-MFLj58gFw4_TjIHv8Cnt8Oh1efuPV7kswspIAkRc7dsA/ConnectToTeamProject.jpg" /&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Next you'll be prompted to select a Team Query - this is where you should choose the "All History" personal query you set up earlier.&lt;br /&gt;&lt;br /&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; DISPLAY: block; CURSOR: hand" border="0" alt="" src="http://taeyga.bay.livefilestore.com/y1p6m-pWepJKdhH5oBki4L7IICTIvm4ry3rq4w837bjcXn9fSNlKQ3fsSbVm44H3jUbCRn4oAG7J7AtEg25x_RUvg/All%20History.jpg" /&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Only a few more steps to go.. The "All History" query may not return all the columns the workbook requires, so click "Choose Columns" and move everything over. You don't need them all, but it's easier than being selective.&lt;br /&gt;&lt;br /&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; DISPLAY: block; CURSOR: hand" border="0" alt="" src="http://taeyga.bay.livefilestore.com/y1pz55SbZfhWM_9ORGqlOheiKhM4nGf8koidoFzVM_iHJSkkPmgrpFuXpJqJaG6caQGaAVOaZ5K906F-DvmeiRFzA/ExcelChooseColumns.jpg" /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span id="SPELLING_ERROR_19" class="blsp-spelling-error"&gt;&lt;span id="SPELLING_ERROR_18" class="blsp-spelling-error"&gt;Ok&lt;/span&gt;&lt;/span&gt; - now it's time to configure the workbook to look at your real data instead of the test data. Go to the "How to Use This Dashboard" spreadsheet and click the "&lt;span id="SPELLING_ERROR_20" class="blsp-spelling-error"&gt;&lt;span id="SPELLING_ERROR_19" class="blsp-spelling-error"&gt;Autoconfigure&lt;/span&gt;&lt;/span&gt;" button.&lt;br /&gt;&lt;br /&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; DISPLAY: block; CURSOR: hand" border="0" alt="" src="http://taeyga.bay.livefilestore.com/y1pFPRNy1XCpPIubKR3h3XKCZp-irlGETe-parm9y2Aac3Dn37jCByIqmQhUcPbsSk8HRbEzLa7xu5QMl1rkQZj-g/AutoConfigure.jpg" /&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;You're done! Go to the Dashboard spreadsheet and analyze your project.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;Gain Insight into your Project&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;No wonder &lt;span id="SPELLING_ERROR_21" class="blsp-spelling-error"&gt;&lt;span id="SPELLING_ERROR_20" class="blsp-spelling-error"&gt;TeamReview's&lt;/span&gt;&lt;/span&gt; last release had me feeling anxious about getting it published and overwhelmed with testing to feel comfortable pushing the final "can't turn back now" button - look at how big 1.1.0 was compared to the previous releases. That's quite a progression in release size.&lt;br /&gt;&lt;/p&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; DISPLAY: block; CURSOR: hand" border="0" alt="" src="http://taeyga.bay.livefilestore.com/y1pQ2qBuB_rMldYm0DSzAVc1Gw78WLyAEhk-gpKlDvHpZwIZWGIoFK_xgyn6ont8K_8NpY0fxuqY5BdH-_eyCu3iA/WorkItemsByRelease.jpg" /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Scanning down and to the left a few pixels it's easy to see why the release was so big, it wasn't just me writing code this time - the team got a new coder and Ian (&lt;span id="SPELLING_ERROR_22" class="blsp-spelling-error"&gt;&lt;span id="SPELLING_ERROR_21" class="blsp-spelling-error"&gt;bluess&lt;/span&gt;&lt;/span&gt;57) was making some great head-way on work items. He contributed way more than this chart gives him credit for - and I contributed a lot less than the chart shows. In the end, having two ambitious coders made the release size swell faster than I had experienced in the past and beyond the point where I was passively comfortable publishing the release.&lt;br /&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; DISPLAY: block; CURSOR: hand" border="0" alt="" src="http://taeyga.bay.livefilestore.com/y1pX0zLGRKUDMdgyEgxWIYWgfzZjHTRfCAaq2syYrSKVNzx93ZeTDap-TCylzMYk7RW2hNn0O9oqHkBlUeBSWkwJA/Monthly%20Close%20Rate.jpg" /&gt; &lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Looking back at the Work Items By Release chart it looks like the next release - only 3 days old - is heading down the same track as the last. Since I know that now, before any work has really started, I have options and can re-adjust the release back-log to have less items, be focused on a certain sub-area to avoid regression testing the whole code base, or recruit a tester.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;The Results&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;I've uncovered some very accurate insight about &lt;span id="SPELLING_ERROR_23" class="blsp-spelling-error"&gt;&lt;span id="SPELLING_ERROR_22" class="blsp-spelling-error"&gt;TeamReview&lt;/span&gt;&lt;/span&gt; release planning that will help me plan the next release without feeling over-whelmed with testing - and it only took a few minutes of work. To top it off, next time I'll just be able to hit refresh! &lt;/p&gt;&lt;p&gt;I'm really hoping more people like Ben and people like me can share and learn from &lt;a href="http://vstsprojectmanager.codeplex.com/"&gt;VSTSProjectManager.CodePlex.com&lt;/a&gt; because Team System has some great facilities for making informed decisions based on accurate data. Hopefully &lt;span id="SPELLING_ERROR_23" class="blsp-spelling-error"&gt;VSTS&lt;/span&gt; Project Manager will help guide Project Managers on how to get that data into a format that allows them to get the most out of Team System.&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4800899166044488588-7299023625069587708?l=www.controlstatements.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.controlstatements.com/feeds/7299023625069587708/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4800899166044488588&amp;postID=7299023625069587708' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/7299023625069587708'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/7299023625069587708'/><link rel='alternate' type='text/html' href='http://www.controlstatements.com/2009/05/where-to-find-vsts-project-manager.html' title='Where to find VSTS Project Manager Ideas and Answers'/><author><name> </name><uri>http://www.blogger.com/profile/04526542006501977139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_gbqB01_VTFI/SMszDOF2x1I/AAAAAAAAACY/mlPCkvxKzQI/S220/DSC_2833.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4800899166044488588.post-6979587674379300313</id><published>2009-05-25T14:58:00.000-07:00</published><updated>2009-05-25T15:26:59.312-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Team System'/><category scheme='http://www.blogger.com/atom/ns#' term='TeamReview'/><category scheme='http://www.blogger.com/atom/ns#' term='Code Review'/><category scheme='http://www.blogger.com/atom/ns#' term='My Code'/><category scheme='http://www.blogger.com/atom/ns#' term='VSTS'/><title type='text'>TeamReview Introduction Video</title><content type='html'>If you'd like to see exactly how &lt;a href="http://TeamReview.codeplex.com"&gt;TeamReview&lt;/a&gt; works before trying it watch this 6 and a half minute introduction video I just put together showing the basic usage and workflow of TeamReview&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe style="BORDER-BOTTOM: #dde5e9 1px solid; BORDER-LEFT: #dde5e9 1px solid; PADDING-BOTTOM: 0px; BACKGROUND-COLOR: #ffffff; MARGIN: 3px; PADDING-LEFT: 0px; WIDTH: 240px; PADDING-RIGHT: 0px; HEIGHT: 66px; BORDER-TOP: #dde5e9 1px solid; BORDER-RIGHT: #dde5e9 1px solid; PADDING-TOP: 0px" marginheight="0" src="http://cid-b57dc13b6d4b6f71.skydrive.live.com/embedrowdetail.aspx/.Public/TeamReview%20Introduction/TeamReview.mp4" frameborder="0" marginwidth="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe style="BORDER-BOTTOM: #dde5e9 1px solid; BORDER-LEFT: #dde5e9 1px solid; PADDING-BOTTOM: 0px; BACKGROUND-COLOR: #ffffff; MARGIN: 3px; PADDING-LEFT: 0px; WIDTH: 240px; PADDING-RIGHT: 0px; HEIGHT: 66px; BORDER-TOP: #dde5e9 1px solid; BORDER-RIGHT: #dde5e9 1px solid; PADDING-TOP: 0px" marginheight="0" src="http://cid-b57dc13b6d4b6f71.skydrive.live.com/embedrowdetail.aspx/.Public/TeamReview%20Introduction/TeamReview%20-%20Low%20Bandwidth.mp4" frameborder="0" marginwidth="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe style="BORDER-BOTTOM: #dde5e9 1px solid; BORDER-LEFT: #dde5e9 1px solid; PADDING-BOTTOM: 0px; BACKGROUND-COLOR: #ffffff; MARGIN: 3px; PADDING-LEFT: 0px; WIDTH: 240px; PADDING-RIGHT: 0px; HEIGHT: 66px; BORDER-TOP: #dde5e9 1px solid; BORDER-RIGHT: #dde5e9 1px solid; PADDING-TOP: 0px" marginheight="0" src="http://cid-b57dc13b6d4b6f71.skydrive.live.com/embedrowdetail.aspx/.Public/TeamReview%20Introduction/TeamReview.wmv" frameborder="0" marginwidth="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe style="BORDER-BOTTOM: #dde5e9 1px solid; BORDER-LEFT: #dde5e9 1px solid; PADDING-BOTTOM: 0px; BACKGROUND-COLOR: #ffffff; MARGIN: 3px; PADDING-LEFT: 0px; WIDTH: 240px; PADDING-RIGHT: 0px; HEIGHT: 66px; BORDER-TOP: #dde5e9 1px solid; BORDER-RIGHT: #dde5e9 1px solid; PADDING-TOP: 0px" marginheight="0" src="http://cid-b57dc13b6d4b6f71.skydrive.live.com/embedrowdetail.aspx/.Public/TeamReview%20Introduction/TeamReview%20-%20iPod.m4v" frameborder="0" marginwidth="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe style="BORDER-BOTTOM: #dde5e9 1px solid; BORDER-LEFT: #dde5e9 1px solid; PADDING-BOTTOM: 0px; BACKGROUND-COLOR: #ffffff; MARGIN: 3px; PADDING-LEFT: 0px; WIDTH: 240px; PADDING-RIGHT: 0px; HEIGHT: 66px; BORDER-TOP: #dde5e9 1px solid; BORDER-RIGHT: #dde5e9 1px solid; PADDING-TOP: 0px" marginheight="0" src="http://cid-b57dc13b6d4b6f71.skydrive.live.com/embedrowdetail.aspx/.Public/TeamReview%20Introduction/TeamReview%20-%20iPhone.m4v" frameborder="0" marginwidth="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4800899166044488588-6979587674379300313?l=www.controlstatements.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.controlstatements.com/feeds/6979587674379300313/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4800899166044488588&amp;postID=6979587674379300313' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/6979587674379300313'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/6979587674379300313'/><link rel='alternate' type='text/html' href='http://www.controlstatements.com/2009/05/teamreview-introduction-video.html' title='TeamReview Introduction Video'/><author><name> </name><uri>http://www.blogger.com/profile/04526542006501977139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_gbqB01_VTFI/SMszDOF2x1I/AAAAAAAAACY/mlPCkvxKzQI/S220/DSC_2833.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4800899166044488588.post-2380282334712787290</id><published>2009-05-22T22:11:00.000-07:00</published><updated>2009-05-22T22:31:25.821-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Team System'/><category scheme='http://www.blogger.com/atom/ns#' term='TeamReview'/><category scheme='http://www.blogger.com/atom/ns#' term='Code Review'/><category scheme='http://www.blogger.com/atom/ns#' term='My Code'/><category scheme='http://www.blogger.com/atom/ns#' term='VSTS'/><title type='text'>Priority, ChangeSet association and Saved settings are new in TeamReview</title><content type='html'>&lt;a href="http://teamreview.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=25541"&gt;A new release of &lt;span id="SPELLING_ERROR_0" class="blsp-spelling-error"&gt;TeamReview&lt;/span&gt; &lt;/a&gt;has been published - and this is a fun one. For the first time I wasn't the only coder. Our newest team member both added a bunch of great new inspiration to the release and cleaned up &lt;span id="SPELLING_ERROR_1" class="blsp-spelling-error"&gt;a lot&lt;/span&gt; of my perpetual hacking-just-to-make-it-work, and &lt;a href="http://teamreview.codeplex.com/"&gt;&lt;span id="SPELLING_ERROR_2" class="blsp-spelling-error"&gt;TeamReview&lt;/span&gt; &lt;/a&gt;is much better off for it.&lt;br /&gt;&lt;br /&gt;As I said - we have some very fun stuff for you to try out-&lt;br /&gt;&lt;ol&gt;&lt;li&gt;You can now &lt;span id="SPELLING_ERROR_4" class="blsp-spelling-corrected"&gt;associate&lt;/span&gt; code review responses directly with a change-set&lt;/li&gt;&lt;li&gt;A priority can be assigned to your code review feedback - and - this is backwards compatible to the client - you can have an old client and a new Work Item Type&lt;/li&gt;&lt;li&gt;You can choose individual code review responses in the Code Review Replay window&lt;/li&gt;&lt;li&gt;TeamReview has it's own output window to help you remember what you've done in your code review activity&lt;/li&gt;&lt;li&gt;The default values for the size and location of the New Code Review Response window are persisted between VS.Net sessions&lt;/li&gt;&lt;li&gt;The last used values for the New Code Review Response fields are saved per Team Project and are persisted between VS.Net sessions&lt;/li&gt;&lt;li&gt;Thanks to &lt;a href="http://cs.gogo-asp.net/blogs/libaty/"&gt;Libaty&lt;/a&gt; we have an optional Japanese language Work Item Type definition for Code Review Response&lt;/li&gt;&lt;li&gt;A &lt;span id="SPELLING_ERROR_5" class="blsp-spelling-corrected"&gt;handful&lt;/span&gt; of bug fixes&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;a href="http://teamreview.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=25541"&gt;Release 1.1.0&lt;/a&gt; has the full detail on these new features and the links to download the latest version of &lt;span id="SPELLING_ERROR_6" class="blsp-spelling-error"&gt;TeamReview&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4800899166044488588-2380282334712787290?l=www.controlstatements.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.controlstatements.com/feeds/2380282334712787290/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4800899166044488588&amp;postID=2380282334712787290' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/2380282334712787290'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/2380282334712787290'/><link rel='alternate' type='text/html' href='http://www.controlstatements.com/2009/05/priority-changeset-association-and.html' title='Priority, ChangeSet association and Saved settings are new in TeamReview'/><author><name> </name><uri>http://www.blogger.com/profile/04526542006501977139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_gbqB01_VTFI/SMszDOF2x1I/AAAAAAAAACY/mlPCkvxKzQI/S220/DSC_2833.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4800899166044488588.post-6903397993859793551</id><published>2009-04-02T16:19:00.000-07:00</published><updated>2009-04-02T16:32:45.242-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MVP'/><category scheme='http://www.blogger.com/atom/ns#' term='Chuck Sterling'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='VSTS'/><category scheme='http://www.blogger.com/atom/ns#' term='Steven Borg'/><title type='text'>Visual Studio Team System MVP award!</title><content type='html'>Yesterday I received the &lt;a href="http://mvp.support.microsoft.com/"&gt;Microsoft MVP award&lt;/a&gt; for &lt;a href="http://msdn.microsoft.com/en-us/teamsystem/default.aspx"&gt;Visual Studio Team System&lt;/a&gt;!  &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It's quite an honor, and I am very excited about it. I haven't yet been calm enough to sit down and read through all the details, benefits, and opportunities that come with the award. However, I have already scheduled a new internet provider for more bandwidth to take advantage of some of the freebies I do know about. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Thanks to everyone from the MVP Program, with special recognition to &lt;a href="http://blog.nwcadence.com/author/stevenborg/"&gt;Steven Borg&lt;/a&gt; and &lt;a href="http://blogs.msdn.com/charles_sterling/"&gt;Chuck Sterling&lt;/a&gt; for handling my nomination.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4800899166044488588-6903397993859793551?l=www.controlstatements.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.controlstatements.com/feeds/6903397993859793551/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4800899166044488588&amp;postID=6903397993859793551' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/6903397993859793551'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/6903397993859793551'/><link rel='alternate' type='text/html' href='http://www.controlstatements.com/2009/04/visual-studio-team-system-mvp-award.html' title='Visual Studio Team System MVP award!'/><author><name> </name><uri>http://www.blogger.com/profile/04526542006501977139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_gbqB01_VTFI/SMszDOF2x1I/AAAAAAAAACY/mlPCkvxKzQI/S220/DSC_2833.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4800899166044488588.post-6200241790624538487</id><published>2009-03-29T22:29:00.000-07:00</published><updated>2009-03-29T23:13:34.724-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Team System'/><category scheme='http://www.blogger.com/atom/ns#' term='TeamReview'/><category scheme='http://www.blogger.com/atom/ns#' term='Code Review'/><category scheme='http://www.blogger.com/atom/ns#' term='My Code'/><category scheme='http://www.blogger.com/atom/ns#' term='VSTS'/><title type='text'>New TeamReview release &amp; new TeamReview contributors</title><content type='html'>&lt;a href="http://teamreview.codeplex.com/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;TeamReview&lt;/span&gt;&lt;/a&gt; has crossed a few milestones lately that I am proud of, including&lt;a href="http://teamreview.codeplex.com/Release/"&gt; another release &lt;/a&gt;(details below), and we have one big upcoming celebration to tell you about.  &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Today "the most complete code review tool for Team System" surpassed the 2K download mark. Yesterday we published the 9&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;th&lt;/span&gt; release of &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;TeamReview&lt;/span&gt; to add some nice-to-have features out-lined below. You may have noticed I said "we published" instead of "I published" in the last sentence. One of the things I am most proud of, and most excited about is that 2 new contributors recently joined and have started making some great changes. Somehow going from just one guy with a far-fetched idea hacking out some code to now being part of a team of 4 developers delivering on the product's vision makes this open source project seem more real. Maybe it's my perspective, but at least to me it feels like a "bigger" open source project with a brighter future than before. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The cherry on top of all the fore-mentioned positives is that &lt;a href="http://TeamReview.codeplex.com/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;TeamReview&lt;/span&gt;&lt;/a&gt; will be celebrating it's first birthday on April 8&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;th&lt;/span&gt;! It's hard for me to believe it's been a year, time flies when you're having fun.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Here are the features in yesterday's release to make &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;TeamReview&lt;/span&gt; an even better product.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;A packaged &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;VSTS&lt;/span&gt; 2010 install&lt;/li&gt;&lt;li&gt;Support for DB Projects&lt;/li&gt;&lt;li&gt;More support for Solution Items and projects within Solution folders&lt;/li&gt;&lt;li&gt;Form fields are sorted logically&lt;/li&gt;&lt;li&gt;The New Code Review Response form is re-sizable&lt;/li&gt;&lt;li&gt;The New Code Review Response form will show in the same position and size as last used during that Visual Studio "session"&lt;/li&gt;&lt;li&gt;The Code Review Replay form is updated with values when work items are edited and saved.&lt;/li&gt;&lt;li&gt;The grid in the Code Review Replay form is sortable&lt;/li&gt;&lt;li&gt;A few minor bug fixes&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4800899166044488588-6200241790624538487?l=www.controlstatements.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.controlstatements.com/feeds/6200241790624538487/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4800899166044488588&amp;postID=6200241790624538487' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/6200241790624538487'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/6200241790624538487'/><link rel='alternate' type='text/html' href='http://www.controlstatements.com/2009/03/new-teamreview-release-new-teamreview.html' title='New TeamReview release &amp; new TeamReview contributors'/><author><name> </name><uri>http://www.blogger.com/profile/04526542006501977139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_gbqB01_VTFI/SMszDOF2x1I/AAAAAAAAACY/mlPCkvxKzQI/S220/DSC_2833.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4800899166044488588.post-7384171393898427244</id><published>2009-03-22T13:10:00.000-07:00</published><updated>2009-03-22T14:36:24.253-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Team System'/><category scheme='http://www.blogger.com/atom/ns#' term='TeamReview'/><category scheme='http://www.blogger.com/atom/ns#' term='Code Review'/><category scheme='http://www.blogger.com/atom/ns#' term='VSTS'/><title type='text'>VSTS Code Review Tools Evaluation</title><content type='html'>&lt;div&gt;In early February &lt;a href="http://jbhawkeye.googlepages.com/VSTSCodeReview.ppt"&gt;I gave a presentation on Code Review Tools in Team System&lt;/a&gt;. During that event we recorded a group evaluation on various aspects of the tools. I am finally publishing those results. The evaluation was relatively simple, I demonstrated the product and then asked the group if the tool supported various aspects that are beneficial to code reviews, and recored that as a simple Yes or No.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As you can see, the &lt;a href="http://msdn.microsoft.com/en-us/library/ms182019(VS.80).aspx"&gt;Out-of-the-box guidelines &lt;/a&gt;had the worst combined score, with the &lt;a href="http://blogs.msdn.com/tomholl/archive/2009/01/06/the-joy-of-code-reviews.aspx"&gt;Yell method&lt;/a&gt;, and the &lt;a href="http://blogs.msdn.com/abhinaba/archive/2008/07/07/auto-generating-code-review-email-for-tfs.aspx"&gt;CRMail&lt;/a&gt; offering doing a little better but each scoring fairly low on our evaluation. &lt;a href="http://www.codeplex.com/TFSCodeReviewFlow"&gt;TFS Code Review Workflow&lt;/a&gt; and &lt;a href="http://www.attrice.info/cm/tfs/"&gt;Attrice's Code Review Sidekick&lt;/a&gt; fared better, with &lt;a href="http://TeamReview.codeplex.com/"&gt;TeamReview&lt;/a&gt; having the highest approval rating of the available code review tools for Team System.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://www.dotnetda.com/Events/EventNewsletter.aspx?EventDate=2/9/2009%2012:00:00%20AM"&gt;Evaluation Form -  Code Reviews in Visual Studio Team System&lt;/a&gt; &lt;div&gt;Presented by JB Brown and the &lt;a href="http://www.dotnetda.com/"&gt;.Net Developers Association&lt;/a&gt;, Feb 9, 2009 - Redmond Wa.&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="0" cellspacing="0" class="tblGenFixed" id="tblMain_0" style="border:1px solid black;width:100%"&gt;&lt;tbody&gt;&lt;tr  style="background-color:#cccccc;"&gt;&lt;td style="border:1px solid black;"&gt;&lt;span class="Apple-style-span"  style="font-weight: bold;color:#000000;"&gt;Supports..&lt;/span&gt;&lt;/td&gt;&lt;td style="border:1px solid black;"&gt;&lt;span class="Apple-style-span"  style="font-weight: bold;color:#000000;"&gt;OOB&lt;/span&gt;&lt;/td&gt;&lt;td style="border:1px solid black;"&gt;&lt;span class="Apple-style-span"  style="font-weight: bold;color:#000000;"&gt;Yell&lt;/span&gt;&lt;/td&gt;&lt;td style="border:1px solid black;"&gt;&lt;span class="Apple-style-span"  style="font-weight: bold;color:#000000;"&gt;CRMail&lt;/span&gt;&lt;/td&gt;&lt;td style="border:1px solid black;"&gt;&lt;span class="Apple-style-span"  style="font-weight: bold;color:#000000;"&gt;TFS Workflow&lt;/span&gt;&lt;/td&gt;&lt;td style="border:1px solid black;"&gt;&lt;span class="Apple-style-span"  style="font-weight: bold;color:#000000;"&gt;Attrice&lt;/span&gt;&lt;/td&gt;&lt;td style="border:1px solid black;"&gt;&lt;span class="Apple-style-span"  style="font-weight: bold;color:#000000;"&gt;TeamReview&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border:1px solid black;"&gt;Updates to the project (project is active)&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;Y&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;Y&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;N/A&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;N&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;Y&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;Y&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border:1px solid black;"&gt;Workflow&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;N&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;N&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;N&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;Y&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;N&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;Y&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border:1px solid black;"&gt;Conversation&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;N&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;Y&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;N&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;N&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;N&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;Y&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border:1px solid black;"&gt;Good, Fast, Clear, Objective Feedback&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;N&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;Y&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;N&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;Y&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;N&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;Y&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border:1px solid black;"&gt;Clear outcomes&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;N&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;Y&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;N&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;Y&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;N&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;Y&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border:1px solid black;"&gt;Identifying and managing the bad things.. &lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;N&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;N&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;N&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;N&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;N&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;N&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border:1px solid black;"&gt;Sharing Tacit Domain-Based Knowledge&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;N&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;Y&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;N&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;N&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;N&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;Y&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border:1px solid black;"&gt;Distributed teams, different time-zones&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;N&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;N&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;Y&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;Y&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;Y&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;Y&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border:1px solid black;"&gt;Team Members without Visual Studio&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;N&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;Y&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;Y&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;N&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;Y&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;N&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border:1px solid black;"&gt;First class member of ALM&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;N&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;N&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;N&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;Y&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;N&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;Y&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border:1px solid black;"&gt;Low TCO&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;N&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;Y&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;Y&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;N&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;Y&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;Y&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border:1px solid black;"&gt;Auditing, reporting, trending&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;N&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;N&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;N&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;Y&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;N&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;Y&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border:1px solid black;"&gt;VSTS 2005&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;Y&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;Y&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;Y&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;Y&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;Y&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;Y&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border:1px solid black;"&gt;VSTS 2008&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;Y&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;Y&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;Y&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;Y&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;Y&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;Y&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border:1px solid black;"&gt;VSTS 2010&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;Y&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;Y&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;Y&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;N&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center"&gt;?&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;Y&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border:1px solid black;"&gt;Developer Joy&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;N&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;N&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;N&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;N&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;Y&lt;/td&gt;&lt;td style="border:1px solid black;text-align:center;"&gt;Y&lt;/td&gt;&lt;/tr&gt;&lt;tr style="background-color:#cccccc;"&gt;&lt;td style="border:1px solid black;font-weight: bold;color:#000000;text-align:center;"&gt;Creating Business Value via Code Reviews with VSTS&lt;/td&gt;&lt;td style="border:1px solid black;font-weight: bold;color:#000000;text-align:center;"&gt;N&lt;/td&gt;&lt;td style="border:1px solid black;font-weight: bold;color:#000000;text-align:center;"&gt;N&lt;/td&gt;&lt;td style="border:1px solid black;font-weight: bold;color:#000000;text-align:center;"&gt;N&lt;/td&gt;&lt;td style="border:1px solid black;font-weight: bold;color:#000000;text-align:center;;text-align:center;"&gt;y&lt;/td&gt;&lt;td style="border:1px solid black;font-weight: bold;color:#000000;text-align:center;"&gt;Y&lt;/td&gt;&lt;td style="border:1px solid black;font-weight: bold;color:#000000;text-align:center;"&gt;Y&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4800899166044488588-7384171393898427244?l=www.controlstatements.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.controlstatements.com/feeds/7384171393898427244/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4800899166044488588&amp;postID=7384171393898427244' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/7384171393898427244'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/7384171393898427244'/><link rel='alternate' type='text/html' href='http://www.controlstatements.com/2009/03/vsts-code-review-tools-evaluation.html' title='VSTS Code Review Tools Evaluation'/><author><name> </name><uri>http://www.blogger.com/profile/04526542006501977139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_gbqB01_VTFI/SMszDOF2x1I/AAAAAAAAACY/mlPCkvxKzQI/S220/DSC_2833.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4800899166044488588.post-5923985573711582128</id><published>2009-03-18T21:12:00.000-07:00</published><updated>2009-03-19T11:16:26.171-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><category scheme='http://www.blogger.com/atom/ns#' term='Team System'/><category scheme='http://www.blogger.com/atom/ns#' term='Compare'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='VSTS'/><title type='text'>Whitespace in Team System Compare Results</title><content type='html'>&lt;Br&gt;&lt;br /&gt;&lt;strong&gt;Why do VSTS diff results include whitespace?&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;A teammate of mine shared a great tip with me during a merging exercise the other day. We noticed many differences shown in a file comparison that didn't seem different to us. It was simply whitespace that was causing the comparison tool to show more differences than would actually matter to the compiler.&lt;br /&gt;&lt;br /&gt;He then recommended creating the following setting buried deep in the chasms of Visual Studio in&lt;br /&gt;&lt;br /&gt;Tools -&gt; Options -&gt; Source Control -&gt; Visual Studio Team Foundation Server -&gt; Configure Users Tools.. -&gt; Add -&gt;&lt;br /&gt;&lt;br /&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 356px; CURSOR: hand; HEIGHT: 187px; TEXT-ALIGN: center" alt="" src="http://dmrsga.bay.livefilestore.com/y1pAxMOJq71UF5m-mgWj_1b_j6jE2izIUfJO17eLoo_Q2wQ-dZc2hGoaOgm1Dmn9VyzNeUTWxt9MlY/IgnoreWhiteSpaceWithDiffMerge.bmp" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;It's the "%5 /ingorespace" ending that differentiates the new Compare behavior from the out-of-the-box results. Now a Compare action will create results that you might expect - only the differences the compiler cares about.&lt;br /&gt;&lt;br /&gt;James Manning has a great &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_0"&gt;blog post&lt;/span&gt; &lt;a href="http://blogs.msdn.com/jmanning/articles/535573.aspx"&gt;explaining all the options&lt;/a&gt; and further Visual Studio configuration for compare tools.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4800899166044488588-5923985573711582128?l=www.controlstatements.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.controlstatements.com/feeds/5923985573711582128/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4800899166044488588&amp;postID=5923985573711582128' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/5923985573711582128'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/5923985573711582128'/><link rel='alternate' type='text/html' href='http://www.controlstatements.com/2009/03/whitesapce-in-team-system-compare.html' title='Whitespace in Team System Compare Results'/><author><name> </name><uri>http://www.blogger.com/profile/04526542006501977139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_gbqB01_VTFI/SMszDOF2x1I/AAAAAAAAACY/mlPCkvxKzQI/S220/DSC_2833.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4800899166044488588.post-8098286210459542630</id><published>2009-02-20T19:44:00.000-08:00</published><updated>2009-02-20T19:45:21.426-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VSX'/><category scheme='http://www.blogger.com/atom/ns#' term='Team System'/><category scheme='http://www.blogger.com/atom/ns#' term='Sondre Bjellås'/><category scheme='http://www.blogger.com/atom/ns#' term='Team Members'/><category scheme='http://www.blogger.com/atom/ns#' term='Ed Blankenship'/><category scheme='http://www.blogger.com/atom/ns#' term='My Code'/><category scheme='http://www.blogger.com/atom/ns#' term='Power Tools'/><category scheme='http://www.blogger.com/atom/ns#' term='VSTS'/><category scheme='http://www.blogger.com/atom/ns#' term='Eugene Zakhareyev'/><title type='text'>Fixing the 2008 Power Tools Team Members IM feature</title><content type='html'>If, like me, your development team uses VSTS along with Office Communicator, you may find like I did that the Team Members feature of the &lt;a href="http://www.codeplex.com/tfscollab"&gt;TFS 2008 Power Tools &lt;/a&gt;does not work.  In this article I will explain why (atleast 1 reason why) and give you some code to help start you down the path to getting it to work for you.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The problem&lt;/span&gt;&lt;br /&gt;I spent a while trying out all the permissions and compatibility mode setting suggestions I could find on the internet, before finally asking for help. &lt;a href="http://blogs.infragistics.com/blogs/eblankenship/"&gt;Team System MVP Ed Blankenship&lt;/a&gt; came to the rescue and had me check for matching SIP and SMTP addresses for team members - and of course they didn't match. I looked at my contact info in Outlook and saw something like this screen shot, with JB.Brown@exchange.ControlStatements.com being my primary SMTP address.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_gbqB01_VTFI/SZ895bJ0BdI/AAAAAAAAAEY/fpd4XY8FYRc/s1600-h/JBBrownOutlook.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 255px;" src="http://3.bp.blogspot.com/_gbqB01_VTFI/SZ895bJ0BdI/AAAAAAAAAEY/fpd4XY8FYRc/s400/JBBrownOutlook.JPG" alt="" id="BLOGGER_PHOTO_ID_5305026942816486866" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;What I then found out from Ed, and two other Team System MVPs; &lt;a href="http://teamfoundation.blogspot.com/"&gt;Eugene Zakhareyev&lt;/a&gt; and &lt;a href="http://sondreb.com/"&gt;Sondre Bjellås&lt;/a&gt;, was that Team System doesn't specifically know or store the SIP address of Team Members, it only knows SMTP. This works great for shops where they match, and is the reason the defect ended up being shipped. When they don't match the 2008 Power Tools can't find Team Members on IM. For example Team System tries to look for the IM address JB.Brown@exchange.ControlStatments.com which is not my IM address - my IM address doesn't have the "exchange" sub-domain.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Options to make it work&lt;/span&gt;&lt;br /&gt;The obvious, and expensive, answer is to contact your exchange admin and force them into changing their naming standards.&lt;br /&gt;&lt;br /&gt;Since that's unlikely to happen, the second best option is to fix the Power Tools code. This is a problem though, because even if we could get access to the Power Tools source code and could alter it to use a different value for looking up IM addresses, where would we get those values from? Team System doesn't store SIP address for memberships. So, this option is also pretty expensive and unlikely to happen quickly. I'm hoping however that the 2010 version of TFS will have expanded membership properties to include SIP in some way.  Until then we'll need an answer.&lt;br /&gt;&lt;br /&gt;The good news is that there is a published API that can be leveraged to write a custom &lt;a href="http://blogs.msdn.com/bharry/archive/2008/11/13/extending-the-new-tfs-team-members-power-tool.aspx"&gt;ICollaborationProvider to extend VSTS&lt;/a&gt;. In fact there is already a &lt;a href="http://www.codeplex.com/tfscollab"&gt;CodePlex project for sharing CollaborationProviders&lt;/a&gt;. It would be a waste of time and effort though to re-write all the stuff to get data out of TFS, Establish IM sessions, get contact status, keep track of running conversations, etc. All that needs to be done is change the addresses being used based on a text pattern - remove the "exchange." from STMP and use it as SIP.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Answer&lt;br /&gt;&lt;/span&gt;The API still presents a way to achieve what we want without a lot of expensive work.&lt;br /&gt;&lt;br /&gt;The solution is fairly simple, and seems to work, at least for me and a few of my team members.&lt;span style="font-weight: bold;"&gt;  &lt;/span&gt;The &lt;a href="http://cid-2e7d0cdf00ca33a3.skydrive.live.com/browse.aspx/Public"&gt;code is linked here&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;(use a&lt;/span&gt;&lt;/span&gt;t your own peril and discretion) and I hope to get it added to the &lt;a href="http://www.codeplex.com/tfscollab"&gt;Collaboration CodePlex project&lt;/a&gt; shortly. It's certain that not everyone will want a simple find-and-replace, so I've encapsulated the make-IM-work algorithm into an abstract class and deferred the step to get the SIP address from the SMTP address to implementers to allow for easy extension.&lt;br /&gt;&lt;br /&gt;What's most important is that there is a simple way to plug in your own method for fetching SIP addresses from the SMTP values provided by Team System.&lt;br /&gt;&lt;br /&gt;Here's the new abstract class to take care of most of the Collaboration providing. I inherited from the built-in CommunicatorProvider so that all I had to worry about was overriding the little pieces I wanted to be different. Also this prevented me from having to deal with the entire Communicator API, as well as the entire Collaboration API and kept me from doing a full regression testing of the Team Members functionality - it's still Communicator after all.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;using MessengerAPI;&lt;br /&gt;using Microsoft.TeamFoundation.Collaboration;&lt;br /&gt;using Microsoft.TeamFoundation.Collaboration.Microsoft;&lt;br /&gt;&lt;br /&gt;namespace TfsCommunity.Collaboration.Communicator&lt;br /&gt;{&lt;br /&gt; /// &amp;lt;summary&amp;gt;&lt;br /&gt; /// Create an algorithim that will allow us to inject our own SIP&lt;br /&gt; /// addresses for Team Members since Team System only knows about&lt;br /&gt; /// their SMTP addresses. These aren't always the same, so we need&lt;br /&gt; /// a way to get from SMTP to SIP for Communicator functionality&lt;br /&gt; /// in the Team Members piece of the TFS 2008 Power Tools October release.&lt;br /&gt; /// &amp;lt;/summary&amp;gt;&lt;br /&gt; public abstract class CustomCommunicatorProvider : CommunicatorProvider&lt;br /&gt; {&lt;br /&gt;  /// &amp;lt;summary&amp;gt;&lt;br /&gt;  /// Defer how the contact ID is acutally augmented, so that we can&lt;br /&gt;  /// have different implementations base on need&lt;br /&gt;  /// &amp;lt;/summary&amp;gt;&lt;br /&gt;  /// &amp;lt;/pre&amp;gt;&amp;lt;param name="contactId"&amp;gt;&lt;br /&gt;  /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br /&gt;  public abstract string AugmentContactId(string contactId);&lt;br /&gt;&lt;br /&gt;  /// &amp;lt;summary&amp;gt;&lt;br /&gt;  /// When adding a new contact make sure we use the desired SIP, not SMTP&lt;br /&gt;  /// &amp;lt;/summary&amp;gt;&lt;br /&gt;  /// &amp;lt;param name="contactId"&amp;gt;&lt;br /&gt;  public override void AddContact(string contactId)&lt;br /&gt;  {&lt;br /&gt;   base.AddContact(AugmentContactId(contactId));&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  /// &amp;lt;summary&amp;gt;&lt;br /&gt;  /// When getting a contact, get it by SIP - if nothing comes back then add it by SIP&lt;br /&gt;  /// &amp;lt;/summary&amp;gt;&lt;br /&gt;  /// &amp;lt;param name="contactId"&amp;gt;&lt;br /&gt;  /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br /&gt;  public override Contact GetContact(string contactId)&lt;br /&gt;  {&lt;br /&gt;   string augmentedContactId = AugmentContactId(contactId);&lt;br /&gt;   Contact c = base.GetContact(augmentedContactId);&lt;br /&gt;   if (c != null)&lt;br /&gt;    return c;&lt;br /&gt;   else&lt;br /&gt;   {&lt;br /&gt;    IMessengerContact contact = (IMessengerContact)base.Messenger.GetContact(augmentedContactId, base.Messenger.MyServiceId);&lt;br /&gt;    MessengerContact mc = base.NewContact(contact);  &lt;br /&gt;    return base.GetContact(augmentedContactId);&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  /// &amp;lt;summary&amp;gt;&lt;br /&gt;  /// Make sure my contact address is SIP and not SMTP&lt;br /&gt;  /// &amp;lt;/summary&amp;gt;&lt;br /&gt;  public override string MyContactId&lt;br /&gt;  {&lt;br /&gt;      get{ return AugmentContactId(base.MyContactId);}&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  /// &amp;lt;summary&amp;gt;&lt;br /&gt;  /// When adding a new contact, use our custom &amp;lt;see cref="MessengerContactDecorator"&amp;gt;&lt;br /&gt;  /// as the implementation of &amp;lt;see cref="IMessengerContact"&amp;gt; so that we can ensure&lt;br /&gt;  /// that the SIP is the &amp;lt;see cref="IMessengerContact.SignInName"&amp;gt; value.&lt;br /&gt;  /// &amp;lt;/see&amp;gt;&lt;br /&gt;  /// &amp;lt;param name="mc"&amp;gt;&lt;br /&gt;  /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br /&gt;  protected override MessengerContact NewContact(IMessengerContact mc)&lt;br /&gt;  {&lt;br /&gt;   var contactDecorator = new MessengerContactDecorator(mc, AugmentContactId(mc.SigninName));&lt;br /&gt;   return base.NewContact(contactDecorator);&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;That's pretty simple, not a whole lot of code. In fact there's probably more comments shown above than code. There's 1 structure piece left and the all-important translation from SMTP to SIP to show. Let's look at the structure piece first.&lt;br /&gt;&lt;br /&gt;When adding a new contact to the Team Members section the CommunicatorProvider.NewContact() method shown above is invoked, and the passed in argument contains a get-only property for "SignInName" which happens to be the SMTP address. To fix that NewContact() is overriden with a Decorator pattern to wrap the passed in argument to achieve the same IMessengerContact interface but have a new value for the SignInName property. Here's the decorator - MessengerContactDecorator.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;using MessengerAPI;&lt;br /&gt;&lt;br /&gt;namespace TfsCommunity.Collaboration.Communicator&lt;br /&gt;{&lt;br /&gt; /// &amp;lt;summary&amp;gt;&lt;br /&gt; /// Decorate an object of the same interface, so that we can change&lt;br /&gt; /// the value of the &amp;lt;see cref="SignInName"&amp;gt; property to be SIP&lt;br /&gt; /// and not SMTP&lt;br /&gt; /// &amp;lt;/see&amp;gt;&lt;br /&gt; public class MessengerContactDecorator : IMessengerContact&lt;br /&gt; {&lt;br /&gt;  //our decorated instance - it's SignInName value would return SMTP&lt;br /&gt;  private IMessengerContact decorated;&lt;br /&gt;&lt;br /&gt;  //the new value we want to return for SignInName - the SIP address&lt;br /&gt;  private string newSignInName;&lt;br /&gt;&lt;br /&gt;  /// &amp;lt;summary&amp;gt;&lt;br /&gt;  /// Basic constructor - the thing we are decorating and how we want to&lt;br /&gt;  /// augment the behavior&lt;br /&gt;  /// &amp;lt;/summary&amp;gt;&lt;br /&gt;  /// &amp;lt;/summary&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;param name="contact"&amp;gt;&lt;br /&gt;  /// &amp;lt;param name="signInName"&amp;gt;&lt;br /&gt;  public MessengerContactDecorator(IMessengerContact contact, string signInName)&lt;br /&gt;  {&lt;br /&gt;   decorated = contact;&lt;br /&gt;   newSignInName = signInName;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  /// &amp;lt;summary&amp;gt;&lt;br /&gt;  /// The only place in this class that really matters -  This is the new&lt;br /&gt;  /// implementation that returns a SIP address - an augmentation of our&lt;br /&gt;  /// decorated instance's value of SignInName&lt;br /&gt;  /// &amp;lt;/summary&amp;gt;&lt;br /&gt;  public string SigninName&lt;br /&gt;  {&lt;br /&gt;   get&lt;br /&gt;   {&lt;br /&gt;    //this is it...&lt;br /&gt;    return newSignInName;&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  #region IMessengerContact implementation - nothing changed.. just calls decorated instance&lt;br /&gt;&lt;br /&gt;  public bool Blocked&lt;br /&gt;  {&lt;br /&gt;   get{return decorated.Blocked;}&lt;br /&gt;   set{decorated.Blocked = value;}&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public bool CanPage&lt;br /&gt;  {&lt;br /&gt;   get { return decorated.CanPage; }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public string FriendlyName&lt;br /&gt;  {&lt;br /&gt;   get { return decorated.FriendlyName; }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public bool IsSelf&lt;br /&gt;  {&lt;br /&gt;   get { return decorated.IsSelf; }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public string ServiceId&lt;br /&gt;  {&lt;br /&gt;   get { return decorated.ServiceId; }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public string ServiceName&lt;br /&gt;  {&lt;br /&gt;   get { return decorated.ServiceName; }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public MISTATUS Status&lt;br /&gt;  {&lt;br /&gt;   get { return decorated.Status; }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public string get_PhoneNumber(MPHONE_TYPE PhoneType)&lt;br /&gt;  {&lt;br /&gt;   return decorated.get_PhoneNumber(PhoneType);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public object get_Property(MCONTACTPROPERTY ePropType)&lt;br /&gt;  {&lt;br /&gt;   return decorated.get_Property(ePropType);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void set_Property(MCONTACTPROPERTY ePropType, object pvPropVal)&lt;br /&gt;  {&lt;br /&gt;   decorated.set_Property(ePropType, pvPropVal);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  #endregion&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Now finally the good stuff, everything else was structure to extend CommunicatorProvider, now for the content - our new Provider to fix the SIP address problem.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;using Microsoft.TeamFoundation.Collaboration;&lt;br /&gt;&lt;br /&gt;namespace TfsCommunity.Collaboration.Communicator&lt;br /&gt;{&lt;br /&gt; /// &amp;lt;summary&amp;gt;&lt;br /&gt;   /// &amp;lt;para&amp;gt;&lt;br /&gt;   ///&lt;br /&gt;   ///          This is an example implementation.. you plug your changes in here&lt;br /&gt;   ///&lt;br /&gt;   /// &amp;lt;/para&amp;gt;&lt;br /&gt; /// &amp;lt;/summary&amp;gt;&lt;br /&gt; [CollaborationProvider("Communicator Provider for SIP/IM addresses that can pattern match SMTP addresses")]&lt;br /&gt; public class FindAndReplaceCommunicator : CustomCommunicatorProvider&lt;br /&gt; {&lt;br /&gt;  const string replace = "@";&lt;br /&gt;  const string find = "@exchange.";&lt;br /&gt;&lt;br /&gt;  public override string AugmentContactId(string contactId)&lt;br /&gt;  {&lt;br /&gt;   return contactId.Replace(find, replace);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;To Deploy&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Download &lt;a href="http://cid-2e7d0cdf00ca33a3.skydrive.live.com/browse.aspx/Public"&gt;the code&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;(use a&lt;/span&gt;&lt;/span&gt;t your own peril and discretion)&lt;/li&gt;&lt;li&gt;Change the FindAndReplaceCommunicator to meet your needs for fetching SIP addresses&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Compile&lt;/li&gt;&lt;li&gt;Drop it in C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\PublicAssemblies\CollaborationProviders&lt;/li&gt;&lt;li&gt;Restart Visual Studio&lt;/li&gt;&lt;li&gt;Right Click on "Team Members"&lt;/li&gt;&lt;li&gt;Choose "Personal Settings.."&lt;/li&gt;&lt;li&gt;Click "Change"&lt;/li&gt;&lt;li&gt;Choose "Communication Provider for SIP/IM addresses that can pattern match SMTP addresses"&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Click OK&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_gbqB01_VTFI/SZ9LnLq7DKI/AAAAAAAAAEg/6nqWCcYPX9Y/s1600-h/CollaborationProvider.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 309px;" src="http://1.bp.blogspot.com/_gbqB01_VTFI/SZ9LnLq7DKI/AAAAAAAAAEg/6nqWCcYPX9Y/s400/CollaborationProvider.JPG" alt="" id="BLOGGER_PHOTO_ID_5305042022585535650" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;And now your Team Members should light up red, green and yellow. Now if only double clicking one would start a conversation...&lt;br /&gt;&lt;br /&gt;If you find any optimizations, issues, fixes, or extend this in any way please post it back as a comment so that we can all benefit ( and I can fix my code ).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4800899166044488588-8098286210459542630?l=www.controlstatements.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.controlstatements.com/feeds/8098286210459542630/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4800899166044488588&amp;postID=8098286210459542630' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/8098286210459542630'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/8098286210459542630'/><link rel='alternate' type='text/html' href='http://www.controlstatements.com/2009/02/fixing-2008-power-tools-team-members-im.html' title='Fixing the 2008 Power Tools Team Members IM feature'/><author><name> </name><uri>http://www.blogger.com/profile/04526542006501977139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_gbqB01_VTFI/SMszDOF2x1I/AAAAAAAAACY/mlPCkvxKzQI/S220/DSC_2833.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_gbqB01_VTFI/SZ895bJ0BdI/AAAAAAAAAEY/fpd4XY8FYRc/s72-c/JBBrownOutlook.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4800899166044488588.post-6931313671561338133</id><published>2009-02-08T13:24:00.000-08:00</published><updated>2009-02-08T23:11:44.406-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Team System'/><category scheme='http://www.blogger.com/atom/ns#' term='TeamReview'/><category scheme='http://www.blogger.com/atom/ns#' term='Code Review'/><category scheme='http://www.blogger.com/atom/ns#' term='VSTS'/><title type='text'>Team System Code Review Presentation</title><content type='html'>Tomorrow (Feb 9, 2009) I'll be demonstrating out of the box and open source solutions &lt;a href="http://jb-brown.blogspot.com/2009/01/team-system-code-review.html"&gt;for performing Team System Code Reviews&lt;/a&gt;. Each participant will have the opportunity to record their own evaluation to take home as a I show off the various tools. We'll also try to do the same as a group in order to share opinions as thoughts as long as it doesn't get time consuming.&lt;br /&gt;&lt;br /&gt;For a preview here's &lt;a href="http://jbhawkeye.googlepages.com/VSTSCodeReview.ppt"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;JB&lt;/span&gt; Brown's Team System Code Review Tools Presentation&lt;/a&gt;, and here's &lt;a href="http://jbhawkeye.googlepages.com/CodeReview.xls"&gt;the evaluation form&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The only thing I ask is that you notify me of any corrections I should make or of suggestions about other criteria for the evaluation form.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4800899166044488588-6931313671561338133?l=www.controlstatements.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.controlstatements.com/feeds/6931313671561338133/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4800899166044488588&amp;postID=6931313671561338133' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/6931313671561338133'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/6931313671561338133'/><link rel='alternate' type='text/html' href='http://www.controlstatements.com/2009/01/team-system-code-review-presentation.html' title='Team System Code Review Presentation'/><author><name> </name><uri>http://www.blogger.com/profile/04526542006501977139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_gbqB01_VTFI/SMszDOF2x1I/AAAAAAAAACY/mlPCkvxKzQI/S220/DSC_2833.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4800899166044488588.post-5899811576652481066</id><published>2009-01-30T16:20:00.000-08:00</published><updated>2009-01-30T20:39:01.829-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Team System'/><category scheme='http://www.blogger.com/atom/ns#' term='TeamReview'/><category scheme='http://www.blogger.com/atom/ns#' term='Code Review'/><category scheme='http://www.blogger.com/atom/ns#' term='My Code'/><title type='text'>New release of TeamReview - Team System code review</title><content type='html'>&lt;span id="ctl00_ctl00_MasterContent_Content_ReleasePanelOrderingContainer_ReleaseDescriptionLiteral"&gt;I've just published &lt;a href="http://www.codeplex.com/TeamReview/Release/ProjectReleases.aspx?ReleaseId=21782"&gt;a new release of &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;TeamReview&lt;/span&gt;&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;As the release summary indicates &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;TeamReview&lt;/span&gt; should work on more file types and with more project structure variances, and in Visual Studio Team System 2010.&lt;br /&gt;&lt;br /&gt;Not mentioned in the summary is a small but really nice change that the New Code Review Response window no longer holds focus, so you can now copy and paste from the editor window into the New Code Review Response form for the Description and Suggested Resolution fields.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4800899166044488588-5899811576652481066?l=www.controlstatements.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.controlstatements.com/feeds/5899811576652481066/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4800899166044488588&amp;postID=5899811576652481066' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/5899811576652481066'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/5899811576652481066'/><link rel='alternate' type='text/html' href='http://www.controlstatements.com/2009/01/new-release-of-teamreview-team-system.html' title='New release of TeamReview - Team System code review'/><author><name> </name><uri>http://www.blogger.com/profile/04526542006501977139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_gbqB01_VTFI/SMszDOF2x1I/AAAAAAAAACY/mlPCkvxKzQI/S220/DSC_2833.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4800899166044488588.post-7134574412466916811</id><published>2009-01-27T20:00:00.000-08:00</published><updated>2009-01-27T20:12:50.435-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Team System'/><category scheme='http://www.blogger.com/atom/ns#' term='TeamReview'/><category scheme='http://www.blogger.com/atom/ns#' term='Code Review'/><category scheme='http://www.blogger.com/atom/ns#' term='VSTS'/><title type='text'>Team System Code Review</title><content type='html'>Are you looking for an answer on how to perform code review in Team System? Do you want to know about the most successful open source tools for VSTS code review?&lt;br /&gt;&lt;br /&gt;On &lt;a href="http://www.dotnetda.com/Events/EventNewsletter.aspx?EventDate=2/9/2009%2012:00:00%20AM"&gt;Feburary 9th I'll be presenting&lt;/a&gt; that topic at the&lt;a href="http://www.dotnetda.com/Default.aspx"&gt; .Net Developers Association&lt;/a&gt; meeting starting at 6pm in &lt;a href="http://www.dotnetda.com/mapVE.aspx"&gt;Microsoft Building 40, Steptoe Room #1450&lt;/a&gt;&lt;div&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;Join me for a demonstration of out-of-the-box and open source code review tools and processes for Visual Studio Team System. We'll discuss the pros and cons of each and analyze them for how they provide business value through code reviews.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4800899166044488588-7134574412466916811?l=www.controlstatements.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.controlstatements.com/feeds/7134574412466916811/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4800899166044488588&amp;postID=7134574412466916811' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/7134574412466916811'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/7134574412466916811'/><link rel='alternate' type='text/html' href='http://www.controlstatements.com/2009/01/team-system-code-review.html' title='Team System Code Review'/><author><name> </name><uri>http://www.blogger.com/profile/04526542006501977139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_gbqB01_VTFI/SMszDOF2x1I/AAAAAAAAACY/mlPCkvxKzQI/S220/DSC_2833.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4800899166044488588.post-1477434187193171513</id><published>2009-01-07T20:31:00.000-08:00</published><updated>2009-01-13T14:55:39.644-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Team System'/><category scheme='http://www.blogger.com/atom/ns#' term='TeamReview'/><category scheme='http://www.blogger.com/atom/ns#' term='Tiago Pascoal'/><category scheme='http://www.blogger.com/atom/ns#' term='My Code'/><title type='text'>The Social Dynamics of Code Reviews</title><content type='html'>&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Tiago&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;Pascoal&lt;/span&gt; has hit the &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_2"&gt;proverbial&lt;/span&gt; nail-on-the-head with his post "&lt;a href="http://agilior.pt/blogs/tiago.pascoal/archive/2008/12/28/6528.aspx"&gt;Your Code Sucks and I Hate You&lt;/a&gt;" regarding code reviews and the lack of &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_3"&gt;proficient&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;OOTB&lt;/span&gt; Team System code review tools. In his article he does mention &lt;a href="http://www.codeplex.com/TeamReview"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;TeamReview&lt;/span&gt;&lt;/a&gt; as the "The more complete solution for Team System" - which of course I very much &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_6"&gt;appreciate&lt;/span&gt;. Thanks &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;Tiago&lt;/span&gt;!&lt;br /&gt;&lt;br /&gt;The larger compelling argument that &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;Tiago&lt;/span&gt; makes so subtly and accurately is that there are successful code review tools to emulate that create continuous business improvements by leveraging under-valued existing feedback channels in the software development process. These same feedback channels are there for the taking for Team System users, like anyone else creating software, so long as there is a business advantage for doing so. Creating that advantage is where Team System's &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;OOTB&lt;/span&gt; offering falls short and where &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;TeamReview&lt;/span&gt; shines.&lt;br /&gt;&lt;br /&gt;What's the line, "I'm not only the president, I'm also a client?" Yeah it's really &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_11"&gt;cheesy&lt;/span&gt; and worn-out - but it's particularly true statement for me. &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;TeamReview&lt;/span&gt;, and it's predecessor were originally used in my office after a lot of semi-forceful &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_13"&gt;prodding&lt;/span&gt; (begging) from me due to my code review experience. After nearly two years, it's easy for me to say that the use of &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;TeamReview&lt;/span&gt; has caused a change in &lt;a href="http://mumak.net/stuff/your-code-sucks.html"&gt;The Social Dynamics of Code Reviews &lt;/a&gt;with my team. We now get the greater business value of code review without most of the personal confrontation costs and the &lt;a href="http://jb-brown.blogspot.com/2008/06/teamreview-new-business-value-from-code.html"&gt;transition costs of traditional team review conversational style&lt;/a&gt;. I actually find myself really liking code-review now, because for the most part it's just reading code and externalizing my thoughts right with the code as I read it, and implementing feedback is an immediate sigh-of-&lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_15"&gt;happiness&lt;/span&gt;-for-better-code gratification with &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;TeamReview&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;In bigger marketing &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_17"&gt;grandiose&lt;/span&gt; words &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_18"&gt;TeamReview&lt;/span&gt; has helped celebrate the business &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_19"&gt;benefit&lt;/span&gt; of the professional exchange of view points, exploration of possibilities, and challenging of assumptions. Above all, I know from my team's use that &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_20"&gt;TeamReview&lt;/span&gt; allows the natural synergistic elements of code reviews to happen more frequently and have a much greater positive business affect than exists with Team System out-of-the-box.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4800899166044488588-1477434187193171513?l=www.controlstatements.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.controlstatements.com/feeds/1477434187193171513/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4800899166044488588&amp;postID=1477434187193171513' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/1477434187193171513'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/1477434187193171513'/><link rel='alternate' type='text/html' href='http://www.controlstatements.com/2009/01/social-dynamics-of-code-reviews.html' title='The Social Dynamics of Code Reviews'/><author><name> </name><uri>http://www.blogger.com/profile/04526542006501977139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_gbqB01_VTFI/SMszDOF2x1I/AAAAAAAAACY/mlPCkvxKzQI/S220/DSC_2833.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4800899166044488588.post-2073453271921262632</id><published>2008-11-29T12:42:00.000-08:00</published><updated>2008-11-30T22:44:43.710-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VSX'/><category scheme='http://www.blogger.com/atom/ns#' term='Team System'/><category scheme='http://www.blogger.com/atom/ns#' term='TeamReview'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='My Code'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='VSTS'/><title type='text'>Migrating a Visual Studio Add-In to 2010 - Part 2</title><content type='html'>My last post was an introduction into the new construction pieces of Visual Studio 2010 add-ins: &lt;a href="http://code.msdn.microsoft.com/mef"&gt;Managed Extensibility Framework (MEF)&lt;/a&gt;, &lt;a href="http://msdn.microsoft.com/en-us/library/bb384241.aspx"&gt;Managed Add-In Framework (MAF)&lt;/a&gt;, and &lt;a href="http://msdn.microsoft.com/en-us/library/aa970268.aspx"&gt;Windows Presentation Foundation (WPF)&lt;/a&gt;.  As mentioned before the migration path for an add-in from Visual Studio 2008 to 2010 doesn't necessitate a re-write if you don't want to leverage these new pieces; let's put that to a test today with &lt;a href="http://www.codeplex.com/TeamReview"&gt;TeamReview&lt;/a&gt;.&lt;br /&gt;&lt;table border="0" cellpadding="2" cellspacing="2"&gt;&lt;br /&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align="left" valign="top" width="5%"&gt;&lt;br /&gt;&lt;img src="http://www.istartedsomething.com/wp-content/uploads/2008/11/pdchd.jpg" /&gt;&lt;br /&gt;&lt;/td&gt;&lt;td valign="top" width="95%"&gt;&lt;span style="font-weight: bold;"&gt;Software&lt;/span&gt;&lt;br /&gt;First, let's lay out the bits I'll be using. Luckily I attended PDC 08, so I was given most of them on "The Goods" USB hard-drive. It's all available for download however, here are the links.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=922B4655-93D0-4476-BDA4-94CF5F8D4814&amp;amp;displaylang=en"&gt;Visual Studio 2010 &amp;amp; .Net 4 CTP&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/TeamReview/SourceControl/changeset/view/16102"&gt;The code from TeamReview prior to me making 2010 changes - Change Set 16102&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;That's it! Just get the 2010 &amp;amp; .Net 4 CTP up and running, and after that download the code for TeamReview.&lt;br /&gt;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Converting the Solution and Project files&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Startup the 2010 CTP server&lt;/li&gt;&lt;li&gt;Login as TFSSetup / 1Setuptfs&lt;/li&gt;&lt;li&gt;Accept the licensing terms&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Start Visual Studio 2010&lt;/li&gt;&lt;li&gt;Create a copy of the 2008 folder of TeamReview (or your add-in) into a "2010" folder for your conversion to 2010, because we don't want to convert the 2008 source in place.&lt;/li&gt;&lt;li&gt;Mark the 2010 folder and it's contents as writable. If your 2008 copy was in source control it was probably read-only on disk, which means so is your 2010 copy. The conversion wizard we're going to run the 2010 copy through needs to be able to update those files, so mark them as writable.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Open up the 2010 copy in Visual Studio 2010&lt;/li&gt;&lt;li&gt;Follow the default settings of the Conversion Wizard&lt;br /&gt;&lt;img src="http://jbhawkeye.googlepages.com/ConversionWizard1.jpg" /&gt;&lt;br /&gt;&lt;img src="http://jbhawkeye.googlepages.com/ConversionWizard2.jpg" /&gt;&lt;br /&gt;&lt;img src="http://jbhawkeye.googlepages.com/ConversionWizard3.jpg" /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Once the Conversion Wizard is done, review the Conversion Report. You'll likely see a line similar to the following one in your projects. Visual Studio 2010 has some new facilities for segmenting and managing FxCop Rules into distinct sets. That's most likely what causes this line.&lt;br /&gt;&lt;blockquote&gt;Created rule set file "Z:\Developer\TeamReview\2010\TeamReview\VS 2008 Rules.ruleset" for the "Debug (Any CPU)" configuration.&lt;/blockquote&gt;&lt;br /&gt;&lt;img src="http://jbhawkeye.googlepages.com/ConversionReport.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Now the moment of truth. Compile it and find that (hopefully) nothing breaks. You may find like I did that some assembly references were broken. This makes sense if your 2010 machine doesn't have those referenced assemblies. For example converting TeamReview resulted in 56 errors.&lt;br /&gt;&lt;img src="http://jbhawkeye.googlepages.com/ConversionErrors.jpg" /&gt; &lt;p&gt;These errors aren't really the fault of the conversion wizard because those references were to the 2008 version of various Team System assemblies, and really they should be 2010 references now. So, it's time to go hunting for those new references. &lt;/p&gt;&lt;p&gt;For the most part you can open up your project files in notepad and simply replace the number "9" in the assembly name and hint paths with the number "10" to find the new reference. For example the new version of some Team System assemblies that are in "..../Program Files/Visual Studio 9.0/...." for 2008 are now in "..../Program Files/Visual Studio 10.0/...." in 2010. I had a bit of trouble finding a few assemblies that originated from the &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=30402623-93ca-479a-867c-04dc45164f5b&amp;amp;displaylang=en"&gt;Visual Studio 2008 SDK&lt;/a&gt;. Low and behold a bare-bones version of the 2010 SDK is in the CTP virtual image at "c:\Users\public\documents\CTPWalkthroughs\Visual Studio\SDK". So, close down Visual Studio and ran the installer with all the default options. After the SDK installation completes, you should be able to find the new version of all the assemblies needed in the GAC.&lt;br /&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;Now re-compile and and you may find that you still have 1 error (that may lead to some other missing reference errors).&lt;br /&gt;&lt;p&gt;&lt;img src="http://jbhawkeye.googlepages.com/ConversionSettingsBuildError.jpg" /&gt;&lt;/p&gt;&lt;br /&gt;If you "find all references" on the Settings class you'll see the two declarations with an error indicator in the "Find References" window.&lt;br /&gt;&lt;p&gt;&lt;img src="http://jbhawkeye.googlepages.com/FindSymbolResults.jpg" /&gt;&lt;/p&gt;&lt;br /&gt;By looking at the non-converted 2008 code you can see that the conversion wizard didn't mess this up and in-fact there was a mismatch in the 2008 code that the compiler didn't catch, but does now in 2010. Because this code is only executed on add-in installation, which is typically a hard thing to debug and troubleshoot on many different system configurations let's go with the the more relaxed option and set both to "pulic sealed partial."&lt;/li&gt;&lt;li&gt;Try again, and.. Success! It compiles. (this is &lt;a href="http://www.codeplex.com/TeamReview/SourceControl/changeset/view/18131"&gt;Change Set 18131&lt;/a&gt;) But will it run in 2010? Nope, we haven't changed the installer to put the Add-In in the 2010 location and not the 2008 location. Also, the Add-In's configuration hasn't been changed to identify that it runs in Visual Studio version 10 (2010) and not Visual Studio Version 9 (2008). Let's do those steps next.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;First open the TeamReview.VSNetAddIn.AddIn (or your *.Addin) file and change the references from "9" to "10"&lt;br /&gt;&lt;img src="http://jbhawkeye.googlepages.com/AddInFile.jpg" /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Next, open up Program.cs in the TeamReview.SetupRegistrationAction project, this is the custom code that runs during the install. It knows where to put the Add-in file where Visual Studio can find it. Find the reference to 2008 and change it to 10 - &lt;span style="font-weight: bold;"&gt;not 2010 - just 10&lt;/span&gt;. I'm not sure why this change was made but it caught me off-guard the first time.&lt;br /&gt;&lt;img src="http://jbhawkeye.googlepages.com/Program.jpg" /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Rebuild, and run the MSI or EXE in the bin/debug directory of theTeamReview.Setup project&lt;br /&gt;&lt;img src="http://jbhawkeye.googlepages.com/TeamReview2010Install.jpg" /&gt;&lt;br /&gt;&lt;img src="http://jbhawkeye.googlepages.com/TeamReview2010Install2.jpg" /&gt;&lt;br /&gt;&lt;img src="http://jbhawkeye.googlepages.com/TeamReview2010Install3.jpg" /&gt; &lt;br clear="all"&gt;&lt;/li&gt;&lt;li&gt;Go to the Add-In Manager in the Tools menu. Activate TeamReview, and &lt;a href="http://www.codeplex.com/TeamReview#example"&gt;test it out&lt;/a&gt;.&lt;br /&gt;&lt;img src="http://jbhawkeye.googlepages.com/TeamReview2010AddInManager.jpg" /&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Completion&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;That completes a basic conversion of an AddIn from Visual Studio 2008 to 2010 - seemingly working with barely any code change. It needs to be tested more, but so far the migration path seems to be pretty painless. The code changes that were made as part of this post can be found in &lt;a href="http://www.codeplex.com/TeamReview/SourceControl/changeset/view/18138"&gt;Change Set 18138.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Now for the fun to begin. The next post will start taking advantage of those new pieces in 2010 - MAF, MEF, and WPF.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4800899166044488588-2073453271921262632?l=www.controlstatements.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.controlstatements.com/feeds/2073453271921262632/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4800899166044488588&amp;postID=2073453271921262632' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/2073453271921262632'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/2073453271921262632'/><link rel='alternate' type='text/html' href='http://www.controlstatements.com/2008/11/migrating-visual-studio-add-in-to-2010_29.html' title='Migrating a Visual Studio Add-In to 2010 - Part 2'/><author><name> </name><uri>http://www.blogger.com/profile/04526542006501977139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_gbqB01_VTFI/SMszDOF2x1I/AAAAAAAAACY/mlPCkvxKzQI/S220/DSC_2833.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4800899166044488588.post-1449600844473759373</id><published>2008-11-28T20:59:00.000-08:00</published><updated>2008-11-29T21:33:49.965-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WPF'/><category scheme='http://www.blogger.com/atom/ns#' term='MEF'/><category scheme='http://www.blogger.com/atom/ns#' term='Team System'/><category scheme='http://www.blogger.com/atom/ns#' term='TeamReview'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='VSTS'/><category scheme='http://www.blogger.com/atom/ns#' term='MAF'/><title type='text'>Migrating a Visual Studio Add-In to 2010 - Part 1</title><content type='html'>With the release of &lt;a href="http://msdn.microsoft.com/en-us/vs2008/products/cc948977.aspx"&gt;Visual Studio 2010&lt;/a&gt; looming in the distant future and it's new capabilties now seemed like a good time to discover the impact to &lt;a href="http://www.codeplex.com/TeamReview"&gt;TeamReview&lt;/a&gt;. It's an open source add-in after all, so why not use it as a case study?&lt;br /&gt;&lt;br /&gt;And so it begins. I'll be publishing pieces of this "case study" as I progress through the migration. Because Part-1 is a little lengthy here's a guide.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="#newpieces"&gt;New pieces of Visual Studio 2010&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#maf"&gt;Managed Add-In Framework (MAF)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#mef"&gt;Managed Extensibility Framework (MEF)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#wpf"&gt;Windows Presentation Foundation (WPF)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#mafmef"&gt;MAF and MEF Working Together&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#mefwpf"&gt;MEF and WPF Working Together&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#mefmafwpf"&gt;MEF, MAF and WPF as on big happy family&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name="newpieces"&gt; &lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;New pieces of Visual Studio 2010&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;VS 2010 leverages the &lt;a href="http://msdn.microsoft.com/en-us/library/bb384241.aspx"&gt;Managed Add-In Framework (MAF)&lt;/a&gt; released in .Net Framework 3.5, the new &lt;a href="http://code.msdn.microsoft.com/mef"&gt;Managed Extensibility Framework (MEF)&lt;/a&gt; scheduled for .Net 4.0,  and a re-work of the Visual Studio editor to use &lt;a href="http://msdn.microsoft.com/en-us/library/aa970268.aspx"&gt;Windows Presentation Foundation (WPF)&lt;/a&gt;, which was released in the .Net 3.0 framework.  Unfortunately I haven't used any of these technologies yet, so the migration will be quite the learning experience . It sounds like there is a low-impact migration path for an existing add-in to work in VS 2010 without rewriting everything to use these new pieces.  A few people I've talked to say their is a "shim" as part of VS 2010 that allows "most" things to work without change. So that seems like a good first step for TeamReview. However, before we try that let's delve a little deeper into the new pieces.&lt;br /&gt;&lt;br /&gt;&lt;a name="maf"&gt; &lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Managed AddIn Framework (MAF)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/bb384200.aspx"&gt;From the Add-In Overview&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;The add-in model consists of a series of segments that make up the add-in pipeline (also known as the communication pipeline), that is responsible for all communication between the add-in and the host. The pipeline is a symmetrical communication model of segments that exchange data between an add-in and its host. Developing these segments between the host and the add-in provides the required layers of abstraction that support versioning and isolation of the add-in.&lt;br /&gt;&lt;br /&gt;The following illustration shows the pipeline&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i.msdn.microsoft.com/Bb384200.AddIn1%28en-us,VS.90%29.png" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;The rest of the summary lists the add-in model's capabilities in more detail, here's a short review.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Independent versioning of hosts and add-ins. Use an older add-in in a newer host and vice versa.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Discovery and Activation of Add-ins. Find an add-in by unique identifier or by the type of add-in.&lt;/li&gt;&lt;li&gt;Configurable Isolation level of the add-in and host including using the add-in as an external process of the host&lt;/li&gt;&lt;li&gt;Lifetime Management of the Add-In. Due to the various isolation models that can be used garbage collection of a single process or app domain isn't enough.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;It seems clear from the literature that MAF will become the core Add-In framework for all/most Microsoft products with Visual Studio and Office included. This would allow a single add-in to be used in many products, which is difficult currently due to the disperate add-in model designs.&lt;br /&gt;&lt;br /&gt;At this point my assumption is that I'll have to write some pieces on the right side of the diagram above and that Microsoft has taken care of defining the contracts. Hopefully I won't have to spend too much time writing framework pieces and Microsoft has even written the add-in side adapter and the add-in view and I just have to write the Add-in.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;MAF Resources&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/bb384241.aspx"&gt;System.Addin Conceptual/How To Documentation&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/system.addin.hosting.aspx"&gt;System.Addin API Reference&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blogs.msdn.com/clraddins/default.aspx"&gt;CLR Add-In Team blog&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/clraddins"&gt;System.Addin Tools and Samples (code from the CLR Add-In Team)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.markharris.net.au/blog/tag/managed-addin-framework/"&gt;&lt;/a&gt;&lt;a href="http://channel9.msdn.com/posts/DanielMoth/Managed-AddIn-Framework/"&gt;Managed Add-In Framework (Screencast by Daniel Moth)&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://channel9.msdn.com/posts/DanielMoth/Version-Resilience-in-the-Managed-AddIn-Framework/"&gt;Version Resilience in the Managed Add-In Framework (Screencast by Daniel Moth)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.danielmoth.com/Blog/2008/02/maf-screencasts.html"&gt;Managed Add-In Framework (Blogpost on Screencasts by Daniel Moth)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blogs.msdn.com/clraddins/archive/2008/02/22/add-in-performance-what-can-you-expect-as-you-cross-an-isolation-boundary-and-how-to-make-it-better-jesse-kaplan.aspx"&gt;Add-In Performance: What can you expect as you cross an isolation boundary and how to make it better [Jesse Kaplan]&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Managed Extensibility Framework (MEF)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name="mef"&gt; &lt;/a&gt;&lt;br /&gt;&lt;a href="http://code.msdn.microsoft.com/mef"&gt;From the MEF Home Page&lt;/a&gt;&lt;br /&gt;&lt;blockquote&gt;The Managed Extensibility Framework (MEF) is a new library in .NET that enables greater reuse of applications and components. Using MEF, .NET applications can make the shift from being statically compiled to dynamically composed. If you are building extensible applications, extensible frameworks and application extensions, then MEF is for you.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;That sounds a lot like a &lt;a href="http://www.hanselman.com/blog/ListOfNETDependencyInjectionContainersIOC.aspx"&gt;IoC Container&lt;/a&gt; to me. However, MEF is not just another IoC container, in fact it's not meant to be an IoC container at all. MEF unlike IoC containers is used to compose an application by dynamically including new bounds of functionality through discovery. Each extension can it-self include more discovery of extensions.  IoC containers on the other hand know much about the structure and type of functionality and usually determine the parts via configuration. Often IoC is used to choose between a few known options that provide the same type of functionality, such as a stub for testing or the real thing for implementation. Contrary to IoC designs the composition of a MEF app can take endless permutations, and the set of options is not known by the application or the developer before hand.&lt;br /&gt;&lt;br /&gt;MEF is meant for larger systems such as Visual Studio which can be extended by numerous people around the world to do un-predictable augmentations of that system. This is starkly different from the goal of an IoC design that's usually used by a development team for flexible testing and extension, but only within tight constraints of known needs. So, MEF is not just another general purpose IoC container.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;MEF Resources&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/MEF"&gt;MEF home page (CodePlex)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blogs.msdn.com/kcwalina/archive/2008/04/25/MEF.aspx"&gt;Introduction to MEF&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://silverlight.services.live.com/7359/gg/video.wmv"&gt;Scott Gutherie PDC 08 Keynote presentation&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blogs.msdn.com/brada/archive/2008/09/29/simple-introduction-to-composite-applications-with-the-managed-extensions-framework.aspx"&gt;MEF Example (Brad Abrams)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/MEFContrib"&gt;MEF Contrib (CodePlex)&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blogs.msdn.com/sburke/archive/2008/10/03/mef-n-ioc.aspx"&gt;Mef'n IoC (Shawn Burke's Blog)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/MEF/Thread/View.aspx?ThreadId=35083"&gt;MEF Vs. Unitiy Vs. System.AddIn...Also, Is Microsoft Involved?&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name="wpf"&gt; &lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Windows Presentation Foundation (WPF)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;By now most of us have an understanding of what WPF is so we don't need to go into much detail. However for a short recap here's an "official" wording from &lt;a href="http://msdn.microsoft.com/en-us/library/aa970268.aspx"&gt;the Introduction page&lt;/a&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Windows Presentation Foundation (WPF) is a next-generation presentation system for building Windows client applications with visually stunning user experiences. With WPF, you can create a wide range of both standalone and browser-hosted applications.&lt;/blockquote&gt;Why are we talking about WPF in this Visual Studio Add-In article? The 2010 shell and editor is written in WPF. If you want to extend it you're best bet is with WPF.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;WPF Resources&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa970268.aspx"&gt;Introduction to Windows Presentation Foundation&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Windows_Presentation_Foundation"&gt;Getting Started with WPF&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms746927.aspx"&gt;WPF Fundamentals&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.heise-online.co.uk/news/PDC-Visual-Studio-2010-gets-a-new-WPF-interface--/111833"&gt;Visual Studio Gets a New WPF Interface&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.onedotnetway.com/writing-visual-studio-2010-shell-in-wpf-reflects-confidence/"&gt;Writing Visual Studio 2010 Shell in WPF Reflects Confidence&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://silverlight.services.live.com/7359/gg/video.wmv"&gt;Scott Gutherie PDC 08 Keynote presentation&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name="mefmaf"&gt; &lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;MEF and MAF working together&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;MEF is a more generic extensibility model with lazy loads of dependencies, the ability to traverse large catalogs of extensions, dependencies-of-dependencies etc. MAF is focused on isolation and versioning of an add-in model where the host and add-in are most often written by different people or companies at different times.&lt;br /&gt;&lt;br /&gt;Whether right or wrong, I find it helpful to conceptually bucket the two by thinking of MEF as achieving the intent of the &lt;a href="http://en.wikipedia.org/wiki/Decorator_pattern"&gt;Decorator pattern&lt;/a&gt; and MAF as achieving the intent of the &lt;a href="http://en.wikipedia.org/wiki/Bridge_pattern"&gt;&lt;span style="text-decoration: underline;"&gt;Bridge Pattern&lt;/span&gt;&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Are they both used by Visual Studio 2010? Yes.&lt;br /&gt;&lt;br /&gt;MEF can be used to augment the look and display of the editor for example to change XML comment display in C# files like &lt;a href="http://silverlight.services.live.com/7359/gg/video.wmv"&gt;Scott Guthrie did in his PDC 08 Keynote&lt;/a&gt;. MAF would be used for more invasive changes such as adding brand new functionality that you might want to be isolated from the VS process, or that you want to work in both VS and Office products, or so you can have a different versioning timeline from Visual Studio.&lt;br /&gt;&lt;br /&gt;Could you use them together? Yeah, for example TeamReview will be included into Visual Studio via MAF, and then I could my define own MEF extensibility points and provide default implementations to the various TeamReview responsibilities to allow others to extend some aspect of TeamReview with MEF.&lt;br /&gt;&lt;br /&gt;&lt;a name="mefwpf"&gt; &lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;MEF and WPF Working Together&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;If like me, you aren't a WPF programmer already this section doesn't matter as much as the previous two. However, if you are - sorry, I'm not - so what I can tell you is that is that MEF takes care of the composing of WPF portions of an app, so &lt;a href="http://www.codeplex.com/CompositeWPF"&gt;Prism/CompositeWPF&lt;/a&gt; is no longer the first choice for putting WPF pieces together in Visual Studio 2010. Instead MEF should be your instinctual composing tool.&lt;br /&gt;&lt;br /&gt;&lt;a name="mefmafwpf"&gt; &lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;MEF, MAF, and WPF as one big happy family&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In the end an Add-In will be loaded with MAF, compose itself with MEF, potential surface extensibility points with MEF, and create it's UI facilities with WPF. All three new acronym babies working together as part of one big big happy Visual Studio family.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;More Resources&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://blog.matthidinger.com/2008/10/12/Managed+AddIn+Framework+SystemAddIn+With+WPF+Part+1.aspx"&gt;MAF with WPF (Matt's Blog)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.matthidinger.com/2008/10/12/Increase+AddIn+Performance+With+MAF+And+WPF+Using+LoaderOptimization.aspx"&gt;Increase Performance wiht MAF and WPF using LoaderOptimization (Matt's Blog)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.global-webnet.net/BlogEngine/post/2008/09/16/MEF-WPF-QuickStart.aspx"&gt;MEF - WPF Quick Start (Bill Krat)&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://msmvps.com/blogs/carlosq/archive/2008/11/14/net-frameworks-clrs-and-visual-studio-add-ins.aspx"&gt;.NET Frameowrks, CLRs, and Visual Studio Add-Ins (Carlos Quintero MVP)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blogs.msdn.com/vsxteam/"&gt;VSX Team Blog&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4800899166044488588-1449600844473759373?l=www.controlstatements.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.controlstatements.com/feeds/1449600844473759373/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4800899166044488588&amp;postID=1449600844473759373' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/1449600844473759373'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/1449600844473759373'/><link rel='alternate' type='text/html' href='http://www.controlstatements.com/2008/11/migrating-visual-studio-add-in-to-2010.html' title='Migrating a Visual Studio Add-In to 2010 - Part 1'/><author><name> </name><uri>http://www.blogger.com/profile/04526542006501977139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_gbqB01_VTFI/SMszDOF2x1I/AAAAAAAAACY/mlPCkvxKzQI/S220/DSC_2833.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4800899166044488588.post-4295768509396302526</id><published>2008-11-23T11:49:00.000-08:00</published><updated>2008-11-23T15:29:59.909-08:00</updated><title type='text'>Seattle Alt.Net meeting -December 13</title><content type='html'>The &lt;a href="http://www.google.com/calendar/event?action=VIEW&amp;amp;eid=M3JuM2l2YjFpNTFrOXBlZWkycjRrZjBlcTAgYWx0bmV0c2VhdHRsZUBnb29nbGVncm91cHMuY29t&amp;amp;tok=MTcjY2JpbHNvbkBnbWFpbC5jb21mMjI0ODkzNzhhMzRiMmJlMGQ5NmFmY2QzYTIzM2ExNzNmYjdmYzAy&amp;amp;ctz=America%2FLos_Angeles&amp;amp;hl=en&amp;amp;gsessionid=yUnzCUAmKfNniwwB3_JAxg"&gt;next meetup&lt;/a&gt; for the &lt;a href="http://groups.google.com/group/altnetseattle/"&gt;Seattle Alt.Net group&lt;/a&gt; will be held on December 13.  Seems like there will be a planning session for an upcoming open-spaces Alt.Net meeting in Seattle.&lt;br /&gt;&lt;br /&gt;Where: Microsoft, &lt;a href="http://maps.google.com/maps?f=q&amp;amp;hl=en&amp;amp;geocode=&amp;amp;q=320+westlake+ave+seattle,wa&amp;amp;sll=37.0625,-95.677068&amp;amp;sspn=53.87374,107.226563&amp;amp;ie=UTF8&amp;amp;z=16&amp;amp;g=320+westlake+ave+seattle,wa&amp;amp;iwloc=addr"&gt;320 Westlake Avenue N, Seattle&lt;/a&gt;&lt;br /&gt;When: Saturday, Dec. 13th, 10am-5pm&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Once you arrive, go up to the third floor, and there will be  # posted to call to get in.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4800899166044488588-4295768509396302526?l=www.controlstatements.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.controlstatements.com/feeds/4295768509396302526/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4800899166044488588&amp;postID=4295768509396302526' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/4295768509396302526'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/4295768509396302526'/><link rel='alternate' type='text/html' href='http://www.controlstatements.com/2008/11/seattle-altnet-meeting-december-13.html' title='Seattle Alt.Net meeting -December 13'/><author><name> </name><uri>http://www.blogger.com/profile/04526542006501977139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_gbqB01_VTFI/SMszDOF2x1I/AAAAAAAAACY/mlPCkvxKzQI/S220/DSC_2833.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4800899166044488588.post-7236305388814984258</id><published>2008-11-15T20:46:00.001-08:00</published><updated>2008-11-15T21:52:16.059-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Team System'/><category scheme='http://www.blogger.com/atom/ns#' term='TeamReview'/><category scheme='http://www.blogger.com/atom/ns#' term='My Code'/><category scheme='http://www.blogger.com/atom/ns#' term='Code Analysis'/><title type='text'>Seattle Code Camp Presentation</title><content type='html'>Today I presented at &lt;a href="https://seattle.codecamp.us/default.aspx"&gt;Seattle Code Camp&lt;/a&gt; on Coding Standards and Code Review in Visual Studio Team System 2008. The content was a bit of a re-hash of some stuff I've been doing at work with CI Builds and mofiying FxCop rules and at home with &lt;a href="http://www.codeplex.com/teamreview"&gt;TeamReview&lt;/a&gt;. While there were only a few attendees, it was still very cool. If you have the opportunity to volunteer for a local meet-up please go for it and don't think twice.&lt;br /&gt;&lt;br /&gt;Here's &lt;a href="http://jbhawkeye.googlepages.com/jb-brown_blogspot_com.rar"&gt;all the content &lt;/a&gt;from my presentation including code samples and a team build file - start with the index.html at the root to guide you through. You can find posts on this blog that covers most of it if you look hard enough, ok.. if you look at all.&lt;br /&gt;&lt;br /&gt;I didn't get to how treating XML comment compiler wanings as errors works out, or how to baseline your code base by automating &lt;a href="http://www.roland-weigelt.de/ghostdoc/"&gt;Ghost Doc&lt;/a&gt; with TheWolf macro that I wrote - but those code samples are included in the downloadable &lt;a href="http://jbhawkeye.googlepages.com/jb-brown_blogspot_com.rar"&gt;rar file&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Here was the offiical blurb on my Seattle Code Camp presentation:&lt;/p&gt;&lt;p&gt;&lt;a id="How+to+get+better+Coding+Standards+and+Code+Review+from+VSTS+"&gt;&lt;strong&gt;How to get better Coding Standards and Code Review from VSTS &lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;There's some good stuff in VSTS for coding standards and code review, but how can you use it, and more importantly how can you make it better? In this session I will share my experience of successfully extending and customizing VSTS simultaneously in the open source community and at the enterprise level to get better code by automating the most important code standards and creating more valuable code reviews. Experience, an adoption/implementation plan, and code will be shared.&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4800899166044488588-7236305388814984258?l=www.controlstatements.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.controlstatements.com/feeds/7236305388814984258/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4800899166044488588&amp;postID=7236305388814984258' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/7236305388814984258'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/7236305388814984258'/><link rel='alternate' type='text/html' href='http://www.controlstatements.com/2008/11/seattle-code-camp-presentation.html' title='Seattle Code Camp Presentation'/><author><name> </name><uri>http://www.blogger.com/profile/04526542006501977139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_gbqB01_VTFI/SMszDOF2x1I/AAAAAAAAACY/mlPCkvxKzQI/S220/DSC_2833.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4800899166044488588.post-2650685438952790024</id><published>2008-09-23T13:11:00.000-07:00</published><updated>2008-09-23T13:15:57.157-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Test'/><category scheme='http://www.blogger.com/atom/ns#' term='Code Coverage'/><category scheme='http://www.blogger.com/atom/ns#' term='VSTS'/><title type='text'>VSTS Code Coverage Bug?</title><content type='html'>I am doing code coverage analysis with Visual Studio, which is generally an easy task now with the tools that are included. However, I have an issue that I can't overcome. Let's say I have assemblies A, B, C, and D and have marked them all for coverage analysis. I run the tests and look at the results and find a report that contains A, B, and C - but not D. I investigate and find that no tests actually execute any code in D (let's say it's the asp.net front end and I don't leverage &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;UI&lt;/span&gt; testing yet). Because there are no tests for D causing D to be missing from the report the total code coverage percentage and "blocks not covered" are incorrect.&lt;br /&gt;&lt;br /&gt;Does anyone know how I can do either of the following?&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Calculate the total "number of blocks" in D so that I can manually adjust the coverage report to be correct? &lt;/li&gt;&lt;li&gt;Get the Coverage report to automatically show the number of blocks not covered for assemblies that are instrumented for coverage but are not tested at all? &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;While I do want test coverage to improve I am analyzing coverage reports saved at historic points in time in the code base. Thus I don't want to create a test that simply executes at least 1 block of code in each assembly and the re-calculate test coverage by running the tests. That would be a pretty time consuming work-around to something that seems like a simple problem.&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4800899166044488588-2650685438952790024?l=www.controlstatements.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.controlstatements.com/feeds/2650685438952790024/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4800899166044488588&amp;postID=2650685438952790024' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/2650685438952790024'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/2650685438952790024'/><link rel='alternate' type='text/html' href='http://www.controlstatements.com/2008/09/vsts-code-coverage-bug.html' title='VSTS Code Coverage Bug?'/><author><name> </name><uri>http://www.blogger.com/profile/04526542006501977139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_gbqB01_VTFI/SMszDOF2x1I/AAAAAAAAACY/mlPCkvxKzQI/S220/DSC_2833.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4800899166044488588.post-7753624780109538958</id><published>2008-09-03T17:56:00.000-07:00</published><updated>2008-09-03T18:13:38.531-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Team System'/><category scheme='http://www.blogger.com/atom/ns#' term='TeamReview'/><category scheme='http://www.blogger.com/atom/ns#' term='Richard Hundhausen'/><title type='text'>TeamReview makes the list</title><content type='html'>&lt;a href="http://www.codeplex.com/TeamReview"&gt;TeamReview&lt;/a&gt; has made it onto the definitive &lt;a href="http://www.teamsystemwidgets.com/"&gt;Team System Widget list&lt;/a&gt;! &lt;br /&gt;&lt;br /&gt;A generous thank you goes out to  Team System MVP, &lt;a href="http://blog.hundhausen.com/"&gt;Richard  Hundhausen&lt;/a&gt;, of &lt;a href="http://www.accentient.com/"&gt;Accentient&lt;/a&gt; for not only inlcuding TeamReview on the list but for also providing me with a tremendous introduction to Team System in a &lt;a href="http://www.accentient.com/training.htm"&gt;TFS Deep Dive workshop&lt;/a&gt; I attended through Accentient a few years ago. The course material is still at my desk, and I still use it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4800899166044488588-7753624780109538958?l=www.controlstatements.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.controlstatements.com/feeds/7753624780109538958/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4800899166044488588&amp;postID=7753624780109538958' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/7753624780109538958'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/7753624780109538958'/><link rel='alternate' type='text/html' href='http://www.controlstatements.com/2008/09/teamreview-makes-list.html' title='TeamReview makes the list'/><author><name> </name><uri>http://www.blogger.com/profile/04526542006501977139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_gbqB01_VTFI/SMszDOF2x1I/AAAAAAAAACY/mlPCkvxKzQI/S220/DSC_2833.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4800899166044488588.post-1086959130427204799</id><published>2008-09-02T19:46:00.000-07:00</published><updated>2009-02-18T18:13:35.656-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GhostDoc'/><category scheme='http://www.blogger.com/atom/ns#' term='documentation'/><category scheme='http://www.blogger.com/atom/ns#' term='My Code'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='Macro'/><category scheme='http://www.blogger.com/atom/ns#' term='Sandcastle. TheWolf'/><title type='text'>Using GhostDoc in a macro to comment an entire solution</title><content type='html'>At work we've started leveraging &lt;a href="http://msdn.microsoft.com/en-us/vsts2008/products/default.aspx"&gt;Visual Studio Team System&lt;/a&gt; to essentially &lt;a href="http://jb-brown.blogspot.com/2008/07/automating-checking-of-standards-and.html"&gt;automate the checking of Standards and Best Practices (S&amp;amp;BPs).&lt;/a&gt; We decided that anything that could be automatically enforced could be deemed part of the S&amp;amp;BPs because it was cost effective. Anything else could be deemed guidance but would not be required. One of the aspects that we desired was being able to effectively use &lt;a href="http://www.codeplex.com/Sandcastle"&gt;Sandcastle&lt;/a&gt; to generate technical documentation. I personally feel that the most valuable documentation from XML comments comes form the comments on &lt;a href="http://c2.com/cgi/wiki?AcceptanceTest"&gt;Acceptance Tests&lt;/a&gt; since they define the expectations of the system. To make those XML comments required we created &lt;a href="http://jb-brown.blogspot.com/2008/07/automating-checking-of-standards-and.html"&gt;a shared MSBuild&lt;/a&gt; file that treated some of the XML compiler warnings as errors.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Playing Catch-Up&lt;/span&gt;&lt;br /&gt;This unfortunately left us with a lot of catch-up work. We needed to fill in and correct thousands of missing comments. While it would have been the most valuable to add thoughtful defined explanations in those places it also would have been the most costly - and it wasn't in our project budget to take on that cost. As a result I &lt;a href="http://blogs.msdn.com/jmanning/archive/2008/07/19/macro-to-organize-usings-for-a-project.aspx"&gt;adapted a Visual Studio macro&lt;/a&gt; with some code-DOM traversing material borrowed from &lt;a href="http://www.codeplex.com/TeamReview"&gt;TeamReview&lt;/a&gt; in order to leverage &lt;a href="http://www.roland-weigelt.de/ghostdoc/"&gt;GhostDoc&lt;/a&gt; to automatically fill in missing comments and fix some comment structure for an entire Visual Studio solution. This allowed us to take on the endeavor of changing our S&amp;amp;BPs, being able to enforce them for the better, and allowed us to move forward without immediately paying for Technical Debt due to the change in S&amp;amp;BPs.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Again, GhostDoc comments are meant to get us over the hurdle of not being able to enforce a coding standard. I know as well as you that auto-generated stuff isn't very valuable, but without it we wouldn't be able to approach this endeavor.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Before you run the macro&lt;/span&gt;&lt;br /&gt;Be sure your code compiles and that you have the entire solution checked out from source control. Otherwise you'll get lots and lots of prompts, potentially two for every file.&lt;br /&gt;&lt;br /&gt;Below is the code. The macro is named after the &lt;a href="http://www.youtube.com/watch?v=ANPsHKpti48"&gt;Winston Wolf &lt;/a&gt;character in the movie &lt;a href="http://www.imdb.com/title/tt0110912/"&gt;Pulp Fiction&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Code&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;Option Explicit Off&lt;br /&gt;Imports System&lt;br /&gt;Imports EnvDTE&lt;br /&gt;Imports EnvDTE80&lt;br /&gt;Imports EnvDTE90&lt;br /&gt;Imports System.Diagnostics&lt;br /&gt;&lt;br /&gt;Public Module &lt;span class="nfakPe"&gt;TheWolf&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Public Sub CleanUpSolution()&lt;br /&gt;IterateFiles()&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Private Sub IterateFiles()&lt;br /&gt;Dim project As EnvDTE.Project&lt;br /&gt;Dim projects As EnvDTE.Projects&lt;br /&gt;Dim window As Window&lt;br /&gt;Dim target As Object&lt;br /&gt;DTE.ExecuteCommand("View.&lt;div dir="ltr"&gt;&lt;wbr&gt;SolutionExplorer")&lt;br /&gt;window = DTE.Windows.Item(Constants.&lt;wbr&gt;vsWindowKindCommandWindow)&lt;br /&gt;projects = DTE.Solution.Projects&lt;br /&gt;If projects.Count = 0 Then&lt;br /&gt;  Exit Sub&lt;br /&gt;End If&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;For Each project In projects&lt;br /&gt;  If (Not project.ProjectItems Is Nothing) Then&lt;br /&gt;      CleanUpProject(project.&lt;wbr&gt;ProjectItems())&lt;br /&gt;  End If&lt;br /&gt;Next&lt;br /&gt;'RebuildSolution()&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;Private Sub CleanUpProject(ByVal items)&lt;br /&gt;Dim file As ProjectItem&lt;br /&gt;For Each file In items&lt;br /&gt;  If file.Name.EndsWith(".cs") OrElse file.Name.EndsWith(".vb") Then&lt;br /&gt;      ActivateFile(file)&lt;br /&gt;      RemoveAndSortUsings()&lt;br /&gt;      FormatDocument()&lt;br /&gt;      DocumentCode(file)&lt;br /&gt;  End If&lt;br /&gt;&lt;br /&gt;  'Handle folders within a project&lt;br /&gt;  If Not file.ProjectItems() Is Nothing Then&lt;br /&gt;      If file.ProjectItems.Count &gt; 0 Then&lt;br /&gt;          CleanUpProject(file.&lt;wbr&gt;ProjectItems())&lt;br /&gt;      End If&lt;br /&gt;  End If&lt;br /&gt;  SaveAll()&lt;br /&gt;  CloseAll()&lt;br /&gt;Next&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;Private Sub RebuildSolution()&lt;br /&gt;DTE.ExecuteCommand("Build.&lt;wbr&gt;RebuildSolution")&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;Private Sub SaveAll()&lt;br /&gt;Try&lt;br /&gt;  DTE.ExecuteCommand("File.&lt;wbr&gt;SaveAll")&lt;br /&gt;Catch ex As Exception&lt;br /&gt;End Try&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;Private Sub CloseAll()&lt;br /&gt;Try&lt;br /&gt;  DTE.ExecuteCommand("File.&lt;wbr&gt;CloseAllButThis")&lt;br /&gt;  DTE.ExecuteCommand("File.&lt;wbr&gt;Close")&lt;br /&gt;Catch ex As Exception&lt;br /&gt;End Try&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;Private Sub ActivateFile(ByVal file As ProjectItem)&lt;br /&gt;file.Open()&lt;br /&gt;If (Not file.Document Is Nothing) Then&lt;br /&gt;  file.Document.Activate()&lt;br /&gt;End If&lt;br /&gt;Try&lt;br /&gt;  DTE.ExecuteCommand("View.&lt;wbr&gt;ViewCode")&lt;br /&gt;Catch ex As Exception&lt;br /&gt;  'do nothing - it's probably already viewable&lt;br /&gt;End Try&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;Private Sub RemoveAndSortUsings()&lt;br /&gt;Try&lt;br /&gt;  DTE.ExecuteCommand("Edit.&lt;wbr&gt;RemoveAndSort")&lt;br /&gt;Catch ex As Exception&lt;br /&gt;  'does not work on VB code&lt;br /&gt;End Try&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;Private Sub FormatDocument()&lt;br /&gt;DTE.ExecuteCommand("Edit.&lt;wbr&gt;FormatDocument")&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;Private Sub DocumentCode(ByVal file As ProjectItem)&lt;br /&gt;Dim element As EnvDTE.CodeElement&lt;br /&gt;Dim document As EnvDTE.TextDocument&lt;br /&gt;document = CType(file.Document.Object("")&lt;wbr&gt;, EnvDTE.TextDocument)&lt;br /&gt;If (document Is Nothing) Then&lt;br /&gt;  Return&lt;br /&gt;End If&lt;br /&gt;DocumentElements(document, file.FileCodeModel.&lt;wbr&gt;CodeElements)&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;Private Sub DocumentElement(ByVal document As EnvDTE.TextDocument, ByVal element As EnvDTE.CodeElement)&lt;br /&gt;Dim startPoint As EnvDTE.EditPoint&lt;br /&gt;document.Selection.GotoLine(&lt;wbr&gt;element.StartPoint.Line, True)&lt;br /&gt;startPoint = document.CreateEditPoint(&lt;wbr&gt;document.Selection.&lt;wbr&gt;ActivePoint)&lt;br /&gt;document.Selection.&lt;wbr&gt;MoveToPoint(startPoint, True)&lt;br /&gt;DTE.ExecuteCommand("Weigelt.&lt;wbr&gt;GhostDoc.AddIn.DocumentThis")&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;Private Sub DocumentElements(ByVal document As EnvDTE.TextDocument, ByVal elements As EnvDTE.CodeElements)&lt;br /&gt;Try&lt;br /&gt;  For Each element In elements&lt;br /&gt;&lt;br /&gt;      Select Case element.Kind&lt;br /&gt;          Case vsCMElement.&lt;wbr&gt;vsCMElementFunction&lt;br /&gt;              Dim func As EnvDTE.CodeFunction&lt;br /&gt;              func = CType(element, EnvDTE.CodeFunction)&lt;br /&gt;              If (func.Access &lt;&gt; vsCMAccess.vsCMAccessPrivate And func.Access &lt;&gt; vsCMAccess.vsCMAccessProject) Then&lt;br /&gt;                  DocumentElement(document, element)&lt;br /&gt;              End If&lt;br /&gt;              DocumentElements(document, func.Children)&lt;br /&gt;          Case vsCMElement.&lt;wbr&gt;vsCMElementProperty&lt;br /&gt;              Dim prop As EnvDTE.CodeProperty&lt;br /&gt;              prop = CType(element, EnvDTE.CodeProperty)&lt;br /&gt;              If (prop.Access &lt;&gt; vsCMAccess.vsCMAccessPrivate And prop.Access &lt;&gt; vsCMAccess.vsCMAccessProject) Then&lt;br /&gt;                  DocumentElement(document, element)&lt;br /&gt;              End If&lt;br /&gt;              DocumentElements(document, prop.Children)&lt;br /&gt;          Case vsCMElement.vsCMElementEvent&lt;br /&gt;              Dim evt As EnvDTE80.CodeEvent&lt;br /&gt;              evt = CType(element, EnvDTE80.CodeEvent)&lt;br /&gt;              If (evt.Access &lt;&gt; vsCMAccess.vsCMAccessPrivate And evt.Access &lt;&gt; vsCMAccess.vsCMAccessProject) Then&lt;br /&gt;                  DocumentElement(document, element)&lt;br /&gt;              End If&lt;br /&gt;              DocumentElements(document, evt.Children)&lt;br /&gt;          Case vsCMElement.vsCMElementClass&lt;br /&gt;              Dim cls As EnvDTE.CodeClass&lt;br /&gt;              cls = CType(element, EnvDTE.CodeClass)&lt;br /&gt;              If (cls.Access &lt;&gt; vsCMAccess.vsCMAccessPrivate And cls.Access &lt;&gt; vsCMAccess.vsCMAccessProject) Then&lt;br /&gt;                  DocumentElement(document, element)&lt;br /&gt;              End If&lt;br /&gt;              DocumentElements(document, cls.Children)&lt;br /&gt;          Case vsCMElement.vsCMElementStruct&lt;br /&gt;              Dim strct As EnvDTE.CodeStruct&lt;br /&gt;              strct = CType(element, EnvDTE.CodeStruct)&lt;br /&gt;              If (strct.Access &lt;&gt; vsCMAccess.vsCMAccessPrivate And strct.Access &lt;&gt; vsCMAccess.vsCMAccessProject) Then&lt;br /&gt;                  DocumentElement(document, element)&lt;br /&gt;              End If&lt;br /&gt;              DocumentElements(document, strct.Children)&lt;br /&gt;          Case vsCMElement.&lt;wbr&gt;vsCMElementDelegate&lt;br /&gt;              Dim dlg As EnvDTE.CodeDelegate&lt;br /&gt;              dlg = CType(element, EnvDTE.CodeDelegate)&lt;br /&gt;              If (dlg.Access &lt;&gt; vsCMAccess.vsCMAccessPrivate And dlg.Access &lt;&gt; vsCMAccess.vsCMAccessProject) Then&lt;br /&gt;                  DocumentElement(document, element)&lt;br /&gt;              End If&lt;br /&gt;              DocumentElements(document, dlg.Children)&lt;br /&gt;          Case vsCMElement.vsCMElementEnum&lt;br /&gt;              Dim enm As EnvDTE.CodeEnum&lt;br /&gt;              enm = CType(element, EnvDTE.CodeEnum)&lt;br /&gt;              If (enm.Access &lt;&gt; vsCMAccess.vsCMAccessPrivate And enm.Access &lt;&gt; vsCMAccess.vsCMAccessProject) Then&lt;br /&gt;                  DocumentElement(document, element)&lt;br /&gt;              End If&lt;br /&gt;              DocumentElements(document, enm.Children)&lt;br /&gt;          Case (vsCMElement.&lt;wbr&gt;vsCMElementVariable)&lt;br /&gt;              Dim var As EnvDTE.CodeVariable&lt;br /&gt;&lt;br /&gt;              var = CType(element, EnvDTE.CodeVariable)&lt;br /&gt;              If (var.Access &lt;&gt; vsCMAccess.vsCMAccessPrivate And var.Access &lt;&gt; vsCMAccess.vsCMAccessProject) Then&lt;br /&gt;                  DocumentElement(document, element)&lt;br /&gt;              End If&lt;br /&gt;          Case vsCMElement.&lt;wbr&gt;vsCMElementNamespace&lt;br /&gt;              Dim nmspc As EnvDTE.CodeNamespace&lt;br /&gt;              nmspc = CType(element, EnvDTE.CodeNamespace)&lt;br /&gt;              DocumentElements(document, nmspc.Children)&lt;br /&gt;&lt;pre&gt;                Case vsCMElement.&lt;wbr&gt;vsCMElementInterface&lt;br /&gt;              Dim inter As EnvDTE.CodeInterface&lt;br /&gt;              inter = CType(element, EnvDTE.CodeInterface)&lt;br /&gt;              If (inter.Access &lt;&gt; vsCMAccess.vsCMAccessPrivate And inter.Access &lt;&gt; vsCMAccess.vsCMAccessProject) Then&lt;br /&gt;                  DocumentElement(document, element)&lt;br /&gt;              End If              &lt;br /&gt;              DocumentElements(document, inter.Children)&lt;/pre&gt;            End Select&lt;br /&gt;&lt;br /&gt;  Next&lt;br /&gt;Catch ex As Exception&lt;br /&gt;&lt;br /&gt;End Try&lt;br /&gt;&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;End Module&lt;br /&gt;&lt;/div&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4800899166044488588-1086959130427204799?l=www.controlstatements.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.controlstatements.com/feeds/1086959130427204799/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4800899166044488588&amp;postID=1086959130427204799' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/1086959130427204799'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/1086959130427204799'/><link rel='alternate' type='text/html' href='http://www.controlstatements.com/2008/09/using-ghostdoc-in-macro-to-comment.html' title='Using GhostDoc in a macro to comment an entire solution'/><author><name> </name><uri>http://www.blogger.com/profile/04526542006501977139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_gbqB01_VTFI/SMszDOF2x1I/AAAAAAAAACY/mlPCkvxKzQI/S220/DSC_2833.jpg'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4800899166044488588.post-998938062047449287</id><published>2008-09-02T18:01:00.000-07:00</published><updated>2009-10-16T14:42:24.442-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='FXCop'/><title type='text'>Automating the Checking of Standards and Best Practices</title><content type='html'>During the past few months I have been taking care of some developer "ecosystem" tasks at work. You know, all those tedious first-time tasks that nobody looks forward to doing but everyone should see the value of having them done. Things that increase a team's sustainability. Things like setting up a CI build, dealing with tests that have been &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_0"&gt;ostracized&lt;/span&gt; for over a year, converting projects to the latest &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;IDE&lt;/span&gt; and framework, making sure project files are set to create debug symbols properly, re-checking the "run code analysis on build" setting, deleting the slanderous comments that blame me - I'm sure you get the picture.&lt;br /&gt;&lt;br /&gt;One of the more interesting challenges in this endeavour has been trying to create what is essentially automatically enforced Standards and Best Practices (S&amp;amp;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;BPs&lt;/span&gt;) to be used by the entire group. The &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;IDE&lt;/span&gt; and Team System can assist in that enforcement with Code Analysis rules, Team System check-in policies, and automatically executed tests. However, if you're a .Net developer you probably know the disdain that some of us have for enforcing the full multitude of available Static &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_4"&gt;Analysis&lt;/span&gt; rules. It's a fairly common &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_5"&gt;occurrence&lt;/span&gt; to find the rules to be unchecked of the "run code analysis on build" setting to be turned off, or simply that developers suppress all violations with a highly tuned reflex of the mouse-button finger. Additionally, I've never seen anyone spend the time to fix all the code &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_6"&gt;analysis&lt;/span&gt; warnings, because they don't "stop the line" by breaking the build.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;One &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;FxCop&lt;/span&gt; file for all Visual Studio Projects&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;There is a way to have a single shared &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;FxCop&lt;/span&gt; rule file that all projects reference, that project files can't override, and that role-base security can be applied. And it's easy to implement.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Create a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;StaticAnalysis&lt;/span&gt;.targets file with the content below&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Put the file somewhere &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_10"&gt;convenient&lt;/span&gt; in &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;TFS&lt;/span&gt; source control&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Change the source control permissions of that file to be limited&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Edit each &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;csproj&lt;/span&gt; or &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;vbproj&lt;/span&gt; file in notepad and add the following line just before the &amp;lt;/Import Project="$(MSbuildBinPath)\Microsoft.CSharp.targets" /&amp;gt; tag - placement is important for overriding the specific project's Static Analysis settings (c# version shown here)&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&amp;lt;import project="[Relative TFS Work Space Path to Project]\StaticAnalysis.targets"&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Build&lt;/li&gt;&lt;li&gt;Make sure your build server will properly get the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;StaticAnalysis&lt;/span&gt;.targets file to the location you referenced in your &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;vbproj&lt;/span&gt; or &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;csproj&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Check-In&lt;/li&gt;&lt;li&gt;Notify your team that they need to get latest of the code and the location where you checked in the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_17"&gt;StaticAnalysis&lt;/span&gt;.targets file&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;What's in the file&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The &lt;warningsaserrors&gt;top line includes compiler warning numbers that we want to be treated as errors so that violations of them will "stop the line" and not just be ignored. Most of the numbers below are for XML comment issues. If you want to treat these XML comment problems as errors, c&lt;a href="http://jb-brown.blogspot.com/2008/09/using-ghostdoc-in-macro-to-comment.html"&gt;onsider this macro &lt;/a&gt;to help you clean up existing issues. You can get the number from warning statements in the output window when you compile.&lt;br /&gt;&lt;br /&gt;&lt;project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"&gt;The second section is the list of &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_18"&gt;FxCop&lt;/span&gt; rules turned on as a waning (+), on as an error (+!) or off (-).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The File&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"&amp;gt;&lt;br /&gt;&amp;lt;PropertyGroup&amp;gt;&lt;br /&gt;&amp;lt;WarningsAsErrors&amp;gt;1572,1591,0105,1574,0649&amp;lt;/WarningsAsErrors&amp;gt;&lt;br /&gt;&amp;lt;CodeAnalysisRules&amp;gt;&lt;br /&gt;&lt;a href="http://jb-brown.blogspot.com/2008/05/changing-fxcop-maintainability-and.html"&gt;+!JBBrown.FxCop.Rules#JB1502;&lt;br /&gt;+!JBBrown.FxCop.Rules#JB1505;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;+!Microsoft.Usage#CA2209;&lt;br /&gt;+!Microsoft.Usage#CA2215;&lt;br /&gt;+!Microsoft.Usage#CA2202;&lt;br /&gt;+!Microsoft.Usage#CA2241;&lt;br /&gt;+!Microsoft.Design#CA1012;&lt;br /&gt;+!Microsoft.Design#CA2210;&lt;br /&gt;+!Microsoft.Design#CA1040;&lt;br /&gt;+!Microsoft.Design#CA1005;&lt;br /&gt;-!Microsoft.Design#CA1020;&lt;br /&gt;+!Microsoft.Design#CA1021;&lt;br /&gt;+!Microsoft.Design#CA1010;&lt;br /&gt;+!Microsoft.Design#CA1011;&lt;br /&gt;+!Microsoft.Design#CA1009;&lt;br /&gt;+!Microsoft.Design#CA1050;&lt;br /&gt;+!Microsoft.Design#CA1026;&lt;br /&gt;+!Microsoft.Design#CA1019;&lt;br /&gt;+!Microsoft.Design#CA1031;&lt;br /&gt;+!Microsoft.Design#CA1047;&lt;br /&gt;+!Microsoft.Design#CA1000;&lt;br /&gt;+!Microsoft.Design#CA1048;&lt;br /&gt;+!Microsoft.Design#CA1051;&lt;br /&gt;+!Microsoft.Design#CA1002;&lt;br /&gt;+!Microsoft.Design#CA1061;&lt;br /&gt;+!Microsoft.Design#CA1006;&lt;br /&gt;+!Microsoft.Design#CA1046;&lt;br /&gt;+!Microsoft.Design#CA1045;&lt;br /&gt;+!Microsoft.Design#CA1038;&lt;br /&gt;+!Microsoft.Design#CA1008;&lt;br /&gt;+!Microsoft.Design#CA1028;&lt;br /&gt;+!Microsoft.Design#CA1004;&lt;br /&gt;+!Microsoft.Design#CA1035;&lt;br /&gt;+!Microsoft.Design#CA1063;&lt;br /&gt;+!Microsoft.Design#CA1032;&lt;br /&gt;+!Microsoft.Design#CA1023;&lt;br /&gt;+!Microsoft.Design#CA1033;&lt;br /&gt;+!Microsoft.Design#CA1039;&lt;br /&gt;-!Microsoft.Design#CA1016;&lt;br /&gt;+!Microsoft.Design#CA1014;&lt;br /&gt;+!Microsoft.Design#CA1017;&lt;br /&gt;+!Microsoft.Design#CA1018;&lt;br /&gt;+!Microsoft.Design#CA1027;&lt;br /&gt;+!Microsoft.Design#CA1059;&lt;br /&gt;+!Microsoft.Design#CA1060;&lt;br /&gt;+!Microsoft.Design#CA1034;&lt;br /&gt;+!Microsoft.Design#CA1013;&lt;br /&gt;+!Microsoft.Design#CA1036;&lt;br /&gt;+!Microsoft.Design#CA1044;&lt;br /&gt;+!Microsoft.Design#CA1041;&lt;br /&gt;+!Microsoft.Design#CA1025;&lt;br /&gt;+!Microsoft.Design#CA1052;&lt;br /&gt;+!Microsoft.Design#CA1053;&lt;br /&gt;+!Microsoft.Design#CA1057;&lt;br /&gt;+!Microsoft.Design#CA1058;&lt;br /&gt;+!Microsoft.Design#CA1001;&lt;br /&gt;+!Microsoft.Design#CA1049;&lt;br /&gt;+!Microsoft.Design#CA1054;&lt;br /&gt;+!Microsoft.Design#CA1056;&lt;br /&gt;+!Microsoft.Design#CA1055;&lt;br /&gt;+!Microsoft.Design#CA1030;&lt;br /&gt;+!Microsoft.Design#CA1003;&lt;br /&gt;+!Microsoft.Design#CA1007;&lt;br /&gt;+!Microsoft.Design#CA1043;&lt;br /&gt;+!Microsoft.Design#CA1024;&lt;br /&gt;+!Microsoft.Design#CA1062;&lt;br /&gt;&lt;br /&gt;-Microsoft.Globalization#CA1301;&lt;br /&gt;-Microsoft.Globalization#CA1302;&lt;br /&gt;-Microsoft.Globalization#CA1303;&lt;br /&gt;-Microsoft.Globalization#CA1304;&lt;br /&gt;-Microsoft.Globalization#CA1305;&lt;br /&gt;-Microsoft.Globalization#CA1306;&lt;br /&gt;+!Microsoft.Globalization#CA2101;&lt;br /&gt;-Microsoft.Globalization#CA1300;&lt;br /&gt;&lt;br /&gt;-!Microsoft.Interoperability#CA1403;&lt;br /&gt;-!Microsoft.Interoperability#CA1406;&lt;br /&gt;-!Microsoft.Interoperability#CA1413;&lt;br /&gt;-!Microsoft.Interoperability#CA1402;&lt;br /&gt;-!Microsoft.Interoperability#CA1407;&lt;br /&gt;-!Microsoft.Interoperability#CA1404;&lt;br /&gt;-!Microsoft.Interoperability#CA1410;&lt;br /&gt;-!Microsoft.Interoperability#CA1411;&lt;br /&gt;-!Microsoft.Interoperability#CA1405;&lt;br /&gt;-!Microsoft.Interoperability#CA1409;&lt;br /&gt;-!Microsoft.Interoperability#CA1415;&lt;br /&gt;-!Microsoft.Interoperability#CA1408;&lt;br /&gt;-!Microsoft.Interoperability#CA1414;&lt;br /&gt;-!Microsoft.Interoperability#CA1412;&lt;br /&gt;-!Microsoft.Interoperability#CA1400;&lt;br /&gt;-!Microsoft.Interoperability#CA1401;&lt;br /&gt;&lt;br /&gt;-!Microsoft.Mobility#CA1600;&lt;br /&gt;-!Microsoft.Mobility#CA1601;&lt;br /&gt;&lt;br /&gt;+!Microsoft.Naming#CA1700;&lt;br /&gt;+!Microsoft.Naming#CA1712;&lt;br /&gt;+!Microsoft.Naming#CA1713;&lt;br /&gt;+!Microsoft.Naming#CA1709;&lt;br /&gt;+!Microsoft.Naming#CA1708;&lt;br /&gt;+!Microsoft.Naming#CA1715;&lt;br /&gt;+!Microsoft.Naming#CA1710;&lt;br /&gt;+!Microsoft.Naming#CA1720;&lt;br /&gt;-!Microsoft.Naming#CA1707;&lt;br /&gt;+!Microsoft.Naming#CA1722;&lt;br /&gt;+!Microsoft.Naming#CA1711;&lt;br /&gt;+!Microsoft.Naming#CA1716;&lt;br /&gt;+!Microsoft.Naming#CA1725;&lt;br /&gt;+!Microsoft.Naming#CA1719;&lt;br /&gt;+!Microsoft.Naming#CA1721;&lt;br /&gt;+!Microsoft.Naming#CA1724;&lt;br /&gt;+!Microsoft.Naming#CA1726;&lt;br /&gt;&lt;br /&gt;+!Microsoft.Maintainability#CA1501;&lt;br /&gt;+!Microsoft.Maintainability#CA1500;&lt;br /&gt;-Microsoft.Maintainability#CA1502;&lt;br /&gt;-Microsoft.Maintainability#CA1505;&lt;br /&gt;&lt;br /&gt;+!Microsoft.Performance#CA1809;&lt;br /&gt;+!Microsoft.Performance#CA1811;&lt;br /&gt;+!Microsoft.Performance#CA1812;&lt;br /&gt;+!Microsoft.Performance#CA1813;&lt;br /&gt;+!Microsoft.Performance#CA1823;&lt;br /&gt;+!Microsoft.Performance#CA1800;&lt;br /&gt;+!Microsoft.Performance#CA1805;&lt;br /&gt;+!Microsoft.Performance#CA1810;&lt;br /&gt;+!Microsoft.Performance#CA1822;&lt;br /&gt;+!Microsoft.Performance#CA1815;&lt;br /&gt;+!Microsoft.Performance#CA1814;&lt;br /&gt;+!Microsoft.Performance#CA1819;&lt;br /&gt;+!Microsoft.Performance#CA1804;&lt;br /&gt;+!Microsoft.Performance#CA1820;&lt;br /&gt;+!Microsoft.Performance#CA1802;&lt;br /&gt;+!Microsoft.Performance#CA1807;&lt;br /&gt;+!Microsoft.Performance#CA1817;&lt;br /&gt;+!Microsoft.Performance#CA1818;&lt;br /&gt;&lt;br /&gt;-!Microsoft.Portability#CA1901;&lt;br /&gt;-!Microsoft.Portability#CA1900;&lt;br /&gt;&lt;br /&gt;+!Microsoft.Reliability#CA2002;&lt;br /&gt;+!Microsoft.Reliability#CA2003;&lt;br /&gt;+!Microsoft.Reliability#CA2004;&lt;br /&gt;+!Microsoft.Reliability#CA2006;&lt;br /&gt;+!Microsoft.Reliability#CA2000;&lt;br /&gt;&lt;br /&gt;+!Microsoft.Security#CA2116;&lt;br /&gt;+!Microsoft.Security#CA2117;&lt;br /&gt;+!Microsoft.Security#CA2105;&lt;br /&gt;+!Microsoft.Security#CA2115;&lt;br /&gt;+!Microsoft.Security#CA2104;&lt;br /&gt;+!Microsoft.Security#CA2122;&lt;br /&gt;+!Microsoft.Security#CA2114;&lt;br /&gt;+!Microsoft.Security#CA2123;&lt;br /&gt;+!Microsoft.Security#CA2111;&lt;br /&gt;+!Microsoft.Security#CA2108;&lt;br /&gt;+!Microsoft.Security#CA2107;&lt;br /&gt;+!Microsoft.Security#CA2103;&lt;br /&gt;+!Microsoft.Security#CA2118;&lt;br /&gt;+!Microsoft.Security#CA2109;&lt;br /&gt;+!Microsoft.Security#CA2119;&lt;br /&gt;+!Microsoft.Security#CA2106;&lt;br /&gt;+!Microsoft.Security#CA2112;&lt;br /&gt;+!Microsoft.Security#CA2120;&lt;br /&gt;+!Microsoft.Security#CA2121;&lt;br /&gt;+!Microsoft.Security#CA2126;&lt;br /&gt;+!Microsoft.Security#CA2124;&lt;br /&gt;+!Microsoft.Security#CA2100;&lt;br /&gt;&lt;br /&gt;+!Microsoft.Usage#CA2236;&lt;br /&gt;+!Microsoft.Usage#CA1816;&lt;br /&gt;+!Microsoft.Usage#CA2227;&lt;br /&gt;+!Microsoft.Usage#CA2213;&lt;br /&gt;+!Microsoft.Usage#CA2216;&lt;br /&gt;+!Microsoft.Usage#CA2214;&lt;br /&gt;+!Microsoft.Usage#CA2222;&lt;br /&gt;+!Microsoft.Usage#CA1806;&lt;br /&gt;+!Microsoft.Usage#CA2217;&lt;br /&gt;+!Microsoft.Usage#CA2212;&lt;br /&gt;+!Microsoft.Usage#CA2219;&lt;br /&gt;+!Microsoft.Usage#CA2201;&lt;br /&gt;+!Microsoft.Usage#CA2228;&lt;br /&gt;+!Microsoft.Usage#CA2221;&lt;br /&gt;+!Microsoft.Usage#CA2220;&lt;br /&gt;+!Microsoft.Usage#CA2240;&lt;br /&gt;+!Microsoft.Usage#CA2229;&lt;br /&gt;+!Microsoft.Usage#CA2238;&lt;br /&gt;+!Microsoft.Usage#CA2207;&lt;br /&gt;+!Microsoft.Usage#CA2208;&lt;br /&gt;+!Microsoft.Usage#CA2235;&lt;br /&gt;+!Microsoft.Usage#CA2237;&lt;br /&gt;+!Microsoft.Usage#CA2232;&lt;br /&gt;+!Microsoft.Usage#CA2223;&lt;br /&gt;+!Microsoft.Usage#CA2211;&lt;br /&gt;+!Microsoft.Usage#CA2233;&lt;br /&gt;+!Microsoft.Usage#CA2225;&lt;br /&gt;+!Microsoft.Usage#CA2226;&lt;br /&gt;+!Microsoft.Usage#CA2231;&lt;br /&gt;+!Microsoft.Usage#CA2224;&lt;br /&gt;+!Microsoft.Usage#CA2218;&lt;br /&gt;+!Microsoft.Usage#CA2234;&lt;br /&gt;+!Microsoft.Usage#CA2239;&lt;br /&gt;+!Microsoft.Usage#CA2200;&lt;br /&gt;+!Microsoft.Usage#CA1801;&lt;br /&gt;+!Microsoft.Usage#CA2205;&lt;br /&gt;+!Microsoft.Usage#CA2230;&lt;br /&gt;&amp;lt;/codeanalysisrules&amp;gt;&lt;br /&gt;&amp;lt;RunCodeAnalysis&amp;gt;true&amp;lt;/RunCodeAnalysis&amp;gt;&lt;br /&gt;&amp;lt;/PropertyGroup&amp;gt;&lt;br /&gt;&amp;lt;/Project&amp;gt;&lt;/project&gt;&lt;/warningsaserrors&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4800899166044488588-998938062047449287?l=www.controlstatements.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.controlstatements.com/feeds/998938062047449287/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4800899166044488588&amp;postID=998938062047449287' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/998938062047449287'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/998938062047449287'/><link rel='alternate' type='text/html' href='http://www.controlstatements.com/2008/07/automating-checking-of-standards-and.html' title='Automating the Checking of Standards and Best Practices'/><author><name> </name><uri>http://www.blogger.com/profile/04526542006501977139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_gbqB01_VTFI/SMszDOF2x1I/AAAAAAAAACY/mlPCkvxKzQI/S220/DSC_2833.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4800899166044488588.post-6982834526704295855</id><published>2008-09-01T13:45:00.000-07:00</published><updated>2008-09-01T16:09:18.890-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Omar Villarreal'/><category scheme='http://www.blogger.com/atom/ns#' term='Team System'/><category scheme='http://www.blogger.com/atom/ns#' term='Poster'/><category scheme='http://www.blogger.com/atom/ns#' term='TeamReview'/><category scheme='http://www.blogger.com/atom/ns#' term='My Code'/><category scheme='http://www.blogger.com/atom/ns#' term='Willy-Peter Schaub'/><title type='text'>Team System MVPs press on TeamReview</title><content type='html'>Over the last few weeks a couple of Team System MVPs,&lt;a href="http://teamsystemrocks.com/blogs/omarv/default.aspx"&gt; Omar Villarreal&lt;/a&gt; and &lt;a href="http://dotnet.org.za/willy/default.aspx"&gt;Willy-Peter &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;Schaub&lt;/span&gt;&lt;/a&gt; have been doing &lt;a href="http://www.codeplex.com/TeamReview"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;TeamReview&lt;/span&gt;&lt;/a&gt; a tremendous favor. Omar has been giving some great feedback on the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;TeamReview&lt;/span&gt; product and helped identify and resolve a few bugs. &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_4"&gt;Additionally&lt;/span&gt; he was able to get Willy-Peter's attention which lead to a wonderful write-up of &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;TeamReview&lt;/span&gt; and an outstanding &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;WorkFlow&lt;/span&gt; guidance poster.&lt;br /&gt;&lt;br /&gt;From Omar &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;Villarreal&lt;/span&gt; on &lt;a href="http://teamsystemrocks.com/blogs/omarv/default.aspx"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;using TeamReview&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;From Willy-Peter &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;Schaub&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://dotnet.org.za/willy/archive/2008/08/25/teamreview-take-a-look-at-this-product.aspx"&gt;Introduction&lt;/a&gt; to &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;TeamReview&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://dotnet.org.za/willy/archive/2008/08/26/a-quick-look-at-teamreview.aspx"&gt;Evaluation&lt;/a&gt; of &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;TeamReview&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://dotnet.org.za/willy/archive/2008/09/01/tfs-new-quick-reference-poster-an-overview-of-teamreview.aspx"&gt;Follow-Up&lt;/a&gt; on &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;TeamReview&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Quick Reference Work Flow Posters: &lt;a href="http://www.saarchitect.net/Publications/Value%20Add%20Information/Quick%20Reference%20Posters/BBD%20Technology%20Readiness/JPG%20%28high-quality%20A4-A2%20scalability%29/0202%20Microsoft%20Team%20System%20TeamReview.jpg"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;JPG&lt;/span&gt; (high quality)&lt;/a&gt;, &lt;a href="http://www.saarchitect.net/Publications/Value%20Add%20Information/Quick%20Reference%20Posters/BBD%20Technology%20Readiness/PDF%20%28low-medium%20quality%29/0202%20Microsoft%20Team%20System%20TeamReview.pdf"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;PDF&lt;/span&gt; (low-&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;meduim&lt;/span&gt; quality)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://dotnet.org.za/blogs/willy/WindowsLiveWriter/TFSNewQuickReferencePosterAnoverviewofTe_D56E/0202%20Microsoft%20Team%20System%20TeamReview_thumb.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px;" src="http://dotnet.org.za/blogs/willy/WindowsLiveWriter/TFSNewQuickReferencePosterAnoverviewofTe_D56E/0202%20Microsoft%20Team%20System%20TeamReview_thumb.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Thanks Omar and Willy-Peter!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4800899166044488588-6982834526704295855?l=www.controlstatements.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.controlstatements.com/feeds/6982834526704295855/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4800899166044488588&amp;postID=6982834526704295855' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/6982834526704295855'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/6982834526704295855'/><link rel='alternate' type='text/html' href='http://www.controlstatements.com/2008/09/team-system-mvps-press-on-teamreview.html' title='Team System MVPs press on TeamReview'/><author><name> </name><uri>http://www.blogger.com/profile/04526542006501977139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_gbqB01_VTFI/SMszDOF2x1I/AAAAAAAAACY/mlPCkvxKzQI/S220/DSC_2833.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4800899166044488588.post-3663158428921854455</id><published>2008-08-25T23:01:00.001-07:00</published><updated>2008-08-25T23:11:35.799-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VSX'/><category scheme='http://www.blogger.com/atom/ns#' term='Team System'/><category scheme='http://www.blogger.com/atom/ns#' term='TeamReview'/><category scheme='http://www.blogger.com/atom/ns#' term='TFS'/><category scheme='http://www.blogger.com/atom/ns#' term='My Code'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><title type='text'>Attending VSX DevCon 2008</title><content type='html'>I will be attending &lt;a href="http://msdn.microsoft.com/en-us/vsx/cc512752.aspx"&gt;VSX DevCon 2008&lt;/a&gt;. If you see a guy with &lt;a href="http://www.codeplex.com/TeamReview"&gt;TeamReview&lt;/a&gt; on his badge, talking about Code Review process a lot, or otherwise trying to pimp some open source project on &lt;a href="http://www.codeplex.com/"&gt;CodePlex&lt;/a&gt; called  &lt;a href="http://www.codeplex.com/TeamReview"&gt;TeamReview&lt;/a&gt; that uses the VSX model and the Team System API..... it's me.&lt;br /&gt;&lt;br /&gt;More importantly, if you've used &lt;a href="http://www.codeplex.com/TeamReview"&gt;TeamReview&lt;/a&gt; and can give me constructive feedback I'd love to hear it, and I'm not above buying a drink or two in order to monopolize your time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4800899166044488588-3663158428921854455?l=www.controlstatements.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.controlstatements.com/feeds/3663158428921854455/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4800899166044488588&amp;postID=3663158428921854455' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/3663158428921854455'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/3663158428921854455'/><link rel='alternate' type='text/html' href='http://www.controlstatements.com/2008/08/attending-vsx-devcon-2008.html' title='Attending VSX DevCon 2008'/><author><name> </name><uri>http://www.blogger.com/profile/04526542006501977139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_gbqB01_VTFI/SMszDOF2x1I/AAAAAAAAACY/mlPCkvxKzQI/S220/DSC_2833.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4800899166044488588.post-7521706438627901000</id><published>2008-06-01T14:58:00.000-07:00</published><updated>2008-08-25T22:56:33.274-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Style Cop'/><category scheme='http://www.blogger.com/atom/ns#' term='Team System'/><category scheme='http://www.blogger.com/atom/ns#' term='NDepend'/><category scheme='http://www.blogger.com/atom/ns#' term='TeamReview'/><category scheme='http://www.blogger.com/atom/ns#' term='Code Review'/><category scheme='http://www.blogger.com/atom/ns#' term='My Code'/><category scheme='http://www.blogger.com/atom/ns#' term='FXCop'/><title type='text'>TeamReview - new business value from code review</title><content type='html'>&lt;a href="http://msdn.microsoft.com/en-us/vsts2008/products/default.aspx" target="_new"&gt;Visual Studio Team System&lt;/a&gt; allows software development to focus more time on the most valuable piece of creating software – creating business value. With the integration and collaboration support of Team System teams can now focus more on their business domain and spend less time creating and managing the software development process and its supporting ecosystem. VSTS, like all the best software tools, removes waste from the software development process allowing teams to deliver more value. &lt;a href="http://www.codeplex.com/TeamReview" target="_new"&gt;TeamReview&lt;/a&gt; continues the waste reduction that Team System supplies by augmenting the code review sub-ecosystem with a Vs.Net add-in that integrates Team System and VS.Net’s extensibility model to create a new completely in-IDE code review experience.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;The .Net Code Review Ecosystem&lt;br /&gt;&lt;/strong&gt;.Net code review tools have been improving over recent years and removing some of the traditional necessity of code review, but not the most valuable aspect. There are static analysis tools like &lt;a href="http://msdn.microsoft.com/en-us/library/bb429476%28vs.80%29.aspx" target="_new"&gt;FxCop&lt;/a&gt; to automatically review for all the code-deterministic industry standard guidance. There are source analysis tools like Microsoft’s recently released &lt;a href="http://code.msdn.microsoft.com/sourceanalysis/" target="_new"&gt;Source Analysis &lt;/a&gt;(a.k.a. StyleCop) to review all the source code style choices made. With Continuous Integration and TDD code is reviewed to make sure it builds and meets the expected business scenarios. Products like &lt;a href="http://www.ndepend.com/" target="_new"&gt;NDepend &lt;/a&gt;have been recently introduced to review code and provide statistical information to help determine if designs are following principles that lead to sustainability. All of these types of tools augment the ecosystem in which we review our software. However, none of them provide any help in one of the most critical aspects of code review - the answer to the question “&lt;em&gt;does this code deliver the best value for the business domain?&lt;/em&gt;” Just because code passes FxCop, StyleCop, looks good in NDepend and passes automated tests doesn’t mean it provides the best business value. Those tools are part of a domainless code review ecosystem, they don’t have any insight into any of the businesses we create software for or how well our code serves that domain. The answer to the “best value” question is in some ways subjective, but the most capable people to provide the answer are the coders in that domain using the tacit technical and business knowledge that only they retain. Code reviews are the way to apply and share that tacit knowledge and find the answer to the “best value” question.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Traditional Code Review Style&lt;br /&gt;&lt;/strong&gt;Traditional code reviews are conversational in style. One person asks for a review and they get any number of responses from any number of people. Each response is usually recorded in note style indicating where the code is, what it’s doing, and how to make it better. There are a lot of transitions in the traditional process; for example transitions of people to and from meetings, transitions in and out of the code to a note taking, reading, or explanation system, transitions from reviewing developer to developer representative to requesting developer and back, etc. In each transition there is waste in the cost of the transition and waste in intent and accuracy lost during the transition.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;TeamReview&lt;/strong&gt;&lt;br /&gt;&lt;a href="http://www.codeplex.com/teamreview" target="_new"&gt;TeamReview&lt;/a&gt; uses Team System and &lt;a href="http://msdn.microsoft.com/en-us/vsx/default.aspx" target="_new"&gt;VS.Net’s extensibility&lt;/a&gt; features to retain the conversational style of code reviews without the transition waste. With TeamReview team members have the ability to provide their code review feedback without transitioning out of the IDE. That response subsequently becomes directly available to the requester also without transitioning out of the IDE. Code Review feedback is given by highlighting a chunk of code, choosing the “New Code Review Response” option of the TeamReview menu, entering a few fields, and assigning it to another team member. &lt;a href="http://www.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=TeamReview&amp;amp;DownloadId=32264" target="_new"&gt;[1]&lt;/a&gt; &lt;a href="http://www.codeplex.com/project/download/FileDownload.aspx?ProjectName=TeamReview&amp;amp;DownloadId=32256" target="_new"&gt;[2]&lt;/a&gt; When the requester is ready to review and implement feedback they choose the “Replay Code Review” option of the TeamReview menu, which displays a grid of all the feedback in a new window in the IDE. &lt;a href="http://www.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=TeamReview&amp;amp;DownloadId=32257" target="_new"&gt;[3]&lt;/a&gt; Clicking on any of the grid rows will open the local copy of the code file and highlight the snippet of reviewed code putting the developer at the exact place where changes are suggested with all the information necessary to act on that suggestion. &lt;a href="http://www.codeplex.com/project/download/FileDownload.aspx?ProjectName=TeamReview&amp;amp;DownloadId=33393" target="_new"&gt;[4] &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The beauty behind this process is that submitting feedback with TeamReview creates a new work item in the Team System project that includes the entered feedback, highlighted code, file name, line numbers, and names of the Project, Namespace, Type, and code member such as the method or property name. &lt;a href="http://www.codeplex.com/project/download/FileDownload.aspx?ProjectName=TeamReview&amp;amp;DownloadId=33395" target="_new"&gt;[5]&lt;/a&gt; The work item is a new work item type, Code Review Response, that is shipped as part of the TeamReview download. &lt;a href="http://www.codeplex.com/project/download/FileDownload.aspx?ProjectName=TeamReview&amp;amp;DownloadId=33394" target="_new"&gt;[6]&lt;/a&gt; &lt;a href="http://www.codeplex.com/TeamReview/Release/ProjectReleases.aspx?ReleaseId=13638"&gt;[7]&lt;/a&gt; As you might have guessed reviewing and acting upon responses with TeamReview’s “Code Review Replay” option is implemented behind the scenes by TeamReview running a TFS query for those items and then displaying them in a grid, followed by using Vs.Net extensibility model to handle select and click events.&lt;br /&gt;&lt;br /&gt;Since the review process and the details of the code within that process are stored in Work Items not only do you gain the standard project management capabilities that come with work items you also have the ability to perform code review forensics. For example a query for code review responses that are in an open state is easily added to the Team Queries of the TFS project. Another query could find code projects, namespaces, types, or members that traditionally get the most code review feedback indicating a trend that they may need to be refactored. Another query could find all code review responses for a particular Type to get suggestions about that type’s responsibility and design intent if that type was being redesigned, re-used or extended. A report could determine the lag time between feedback being supplied and being implemented by comparing the work item creation and closed dates.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;br /&gt;TeamReview exploits the advantages of Team System and the Vs.net extensibility model to reduce transition waste and surface new value from the code review process. Using Work Items to facilitate the code review process creates a completely in-IDE code review experience, the ability to project-manage the code review tasks, and the opportunity to get new value from the code review process through code review forensics.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;For More..&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;On how to use TeamReview see &lt;a href="http://www.codeplex.com/TeamReview"&gt;TeamReview by Example&lt;/a&gt; section on the TeamReview home page&lt;/li&gt;&lt;li&gt;To download TeamRevew see the &lt;a href="http://www.codeplex.com/TeamReview/Release/ProjectReleases.aspx?ReleaseId=16526"&gt;current release (1.0.6) of TeamReview&lt;/a&gt;&lt;span style="text-decoration: underline;"&gt;&lt;/span&gt;&lt;a href="http://www.codeplex.com/TeamReview/Release/ProjectReleases.aspx?ReleaseId=13638"&gt; &lt;/a&gt;&lt;/li&gt;&lt;li&gt;To setup your TFS Project for TeamReview see the &lt;a href="http://www.codeplex.com/TeamReview/Thread/View.aspx?ThreadId=25834"&gt;Setup instructions &lt;/a&gt;&lt;/li&gt;&lt;li&gt;To debug or contribute to TeamReview see the &lt;a href="http://www.codeplex.com/TeamReview/Thread/View.aspx?ThreadId=26814"&gt;debugging instructions&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4800899166044488588-7521706438627901000?l=www.controlstatements.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.controlstatements.com/feeds/7521706438627901000/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4800899166044488588&amp;postID=7521706438627901000' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/7521706438627901000'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/7521706438627901000'/><link rel='alternate' type='text/html' href='http://www.controlstatements.com/2008/06/teamreview-new-business-value-from-code.html' title='TeamReview - new business value from code review'/><author><name> </name><uri>http://www.blogger.com/profile/04526542006501977139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_gbqB01_VTFI/SMszDOF2x1I/AAAAAAAAACY/mlPCkvxKzQI/S220/DSC_2833.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4800899166044488588.post-5388056823368671110</id><published>2008-05-20T19:41:00.000-07:00</published><updated>2008-05-20T20:36:21.328-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Jeffrey Richter'/><category scheme='http://www.blogger.com/atom/ns#' term='ReaderWriterLockSlim'/><category scheme='http://www.blogger.com/atom/ns#' term='Patterns and Practices'/><category scheme='http://www.blogger.com/atom/ns#' term='Enterpriser Library'/><title type='text'>Why is ReaderWriterLockSlim missing from Enterprise Library 4?</title><content type='html'>With the &lt;a href="http://msdn.microsoft.com/en-us/library/cc512464.aspx"&gt;release of Enterprise Library 4&lt;/a&gt; I thought for sure the &lt;a href="http://www.c-sharpcorner.com/UploadFile/leon.pereira/ELCachingApplBlock07142005063621AM/ELCachingApplBlock.aspx?ArticleID=40220f5a-cf1d-465a-aaa0-ed5de8c324a5"&gt;Caching Application Block&lt;/a&gt;'s use of the simple &lt;a href="http://msdn.microsoft.com/en-us/library/system.threading.monitor.aspx"&gt;System.Threading.Monitor &lt;/a&gt;would be replaced with the new &lt;a href="http://msdn.microsoft.com/en-us/library/system.threading.readerwriterlockslim.aspx"&gt;ReaderWriterLockSlim&lt;/a&gt; that is part of .Net 3.5. After all, &lt;a href="http://en.wikipedia.org/wiki/Jeffrey_Richter"&gt;Jeffrey Richter&lt;/a&gt; was right about &lt;a href="http://msdn.microsoft.com/en-us/magazine/cc163599.aspx"&gt;the slow performing ReaderWriterLock&lt;/a&gt;, and now there is a better solution than what was in Enterprise Library 3.1, right? Yet in the source of EL 4 you can still find the calls to Monitor and some simple lock(object) statements. It seems like an easy performance win to me, but hopefully there is a good reason it's not included that I just don't know about.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4800899166044488588-5388056823368671110?l=www.controlstatements.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.controlstatements.com/feeds/5388056823368671110/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4800899166044488588&amp;postID=5388056823368671110' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/5388056823368671110'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/5388056823368671110'/><link rel='alternate' type='text/html' href='http://www.controlstatements.com/2008/05/why-is-readerwriterslimlock-missing.html' title='Why is ReaderWriterLockSlim missing from Enterprise Library 4?'/><author><name> </name><uri>http://www.blogger.com/profile/04526542006501977139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_gbqB01_VTFI/SMszDOF2x1I/AAAAAAAAACY/mlPCkvxKzQI/S220/DSC_2833.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4800899166044488588.post-7128715402419710123</id><published>2008-05-11T10:58:00.001-07:00</published><updated>2008-05-11T13:18:33.754-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lean'/><category scheme='http://www.blogger.com/atom/ns#' term='documentation'/><category scheme='http://www.blogger.com/atom/ns#' term='modeling'/><title type='text'>Documentation is Modeling</title><content type='html'>I've had the opportunity to discuss the value of documentation as a part of the software creation process lately. I hadn't noticed until then how much my views were influenced by a couple of pages in &lt;a href="http://www.amazon.com/Principles-Patterns-Practices-Robert-Martin/dp/0131857258"&gt;Agile Principles, Patterns, and Practices in C# &lt;/a&gt;by Robert and Micah Martin. The book is absolutely phenomenal and has had a strong influence on my development in the last few years. There's a small transition between two sections of the book as it leads out of principles and into modeling practices. That transition struck a cord with me in regards to documentation and that cord is resonating loudly as of late.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Modeling&lt;/strong&gt;&lt;br /&gt;A bridge builder creates a model to test the strength to weight ratio of the bridge. An airplane designer creates a model to put it in the wind tunnel to test the aerodynamics of the design. The bridge and airplane models were smaller versions of the real thing built to learn something about how to better build the real thing. Why smaller? Smaller is cheaper in these cases. An important aspect of modeling is that the model is cheaper to build than the real thing. If the model is more expensive to build than the real thing it wouldn't be providing any strategic value, you could just skip building the model and go straight to building the real thing. The second value in the bridge and airplane models is that they were built to be tested. One was tested by how much weight it could hold, one was tested to see how efficiently it could move through the air. Without being tested the models provide no value, they're just like the model car kits I put together as a kid, they're fun to look at but not good for anything else. Without testing the model you don't learn anything about building the real thing.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Value from Modeling&lt;/strong&gt;&lt;br /&gt;Modeling provides value only when both of the following are true. Without both being true modeling is just wasted work to create something pretty to put on a shelve and admire.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;The model is cheaper to build than the real thing.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The model is built to be tested to figure out how to build a better real thing.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;strong&gt;Modeling Software &lt;/strong&gt;&lt;br /&gt;Software is no different from the bridge or aerospace industries in regards to modeling. We model software by writing something down on a piece of paper, whiteboard, or napkin to express the characteristics and designs of the real thing. We then test that model by asking our peers, customers and other knowledgeable people if their assumptions, scenarios, goals, etc are all fulfilled by the model. Their answers determine how much the real thing will reflect the model, or if remodeling needs to be done. Modeling in software takes many forms, UML, requirements documents, technical specifications, test cases, use cases, etc. They are however all textual models that can be tested to prove some virtual characteristic of the software.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Value From Documentation&lt;/strong&gt;&lt;br /&gt;Thus, applying the two points above that determine when modeling is valuable we can determine when to document and how to get the most value out of documentation.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Documentation should be relatively cheap.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Documentation should be created when we want to test the software before building it.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;To get the most from documentation we should only create it when we need to test and when we can create the documentation and test it cheaper than creating and testing the software. I think the key point that is often missed is that the documentation needs to be easily testable. Documentation in thesis form might be a well written masterpiece but it's not easily testable. To figure out if a particular scenario will be fulfilled I would have to read the whole document to find all the references for impacts to that scenario and then compose them into one and apply my scenario test. That is not cheap, nor easy. Modeling software with User Stories however is much easier to test because the model is organized into identifiable pieces of work in the way that the development team builds and tests the software. This results in a shared thought pattern (ahem, mental model) by the entire team - the modelers and the builders. User Stories convey the virtual characteristics in ways that allow for cheaper and easier testing of the documentation in order to build better software.&lt;/p&gt;&lt;p&gt;So, as we create documentation to help us build software we should ask ourselves:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Is this documentation testable? (If no - then don't create it.)&lt;/li&gt;&lt;li&gt;Can something be learned about the software by testing this documentation? (If no - then don't create it)&lt;/li&gt;&lt;li&gt;How can I make this documentation cheaper to build and maintain?&lt;/li&gt;&lt;li&gt;How can I make this documentation easier to Test? &lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4800899166044488588-7128715402419710123?l=www.controlstatements.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.controlstatements.com/feeds/7128715402419710123/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4800899166044488588&amp;postID=7128715402419710123' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/7128715402419710123'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/7128715402419710123'/><link rel='alternate' type='text/html' href='http://www.controlstatements.com/2008/05/documentation-is-modeling.html' title='Documentation is Modeling'/><author><name> </name><uri>http://www.blogger.com/profile/04526542006501977139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_gbqB01_VTFI/SMszDOF2x1I/AAAAAAAAACY/mlPCkvxKzQI/S220/DSC_2833.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4800899166044488588.post-3881267512023226437</id><published>2008-05-10T14:28:00.000-07:00</published><updated>2008-05-10T16:29:57.825-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CA1505'/><category scheme='http://www.blogger.com/atom/ns#' term='Maintainability'/><category scheme='http://www.blogger.com/atom/ns#' term='My Code'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='Cyclomatic Complexity'/><category scheme='http://www.blogger.com/atom/ns#' term='FXCop'/><category scheme='http://www.blogger.com/atom/ns#' term='CA1502'/><title type='text'>Changing FxCop Maintainability and Cyclomatic Complexity rules</title><content type='html'>&lt;span &gt;I'm finally moving to &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;VSTS&lt;/span&gt; 2008, and yesterday I spent some time playing with the new &lt;/span&gt;&lt;a href="http://blogs.msdn.com/fxcop/archive/2007/10/03/new-for-visual-studio-2008-code-metrics.aspx"&gt;&lt;span &gt;Maintainability index&lt;/span&gt;&lt;/a&gt;&lt;span &gt;. I am a big fan of &lt;/span&gt;&lt;a href="http://www.ndepend.com/"&gt;&lt;span &gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;NDepend&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span &gt; and have used it for a year or so now in an effort to create more sustainable code, thus the new Maintainability index was &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_2"&gt;promising&lt;/span&gt; to me. However, after finding out the range for the index is 0 - 100 and the thresholds are 10 for an error and 20 for a warning I was again &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_3"&gt;disappointed&lt;/span&gt; with the extremely conservative implementation, just like I was with the high &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;Cyclomatic&lt;/span&gt; Complexity thresholds.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;How to change the thresholds&lt;/strong&gt;&lt;br /&gt;I started out trying to use the &lt;/span&gt;&lt;a href="http://jb-brown.blogspot.com/2007/06/change-fxcop-cyclomatic-complexity.html"&gt;&lt;span &gt;same approach that worked with 2005&lt;/span&gt;&lt;/a&gt;&lt;span &gt; in order to change the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;FxCop&lt;/span&gt; thresholds for these two rules. However editing the IL and reconstituting the Maintainability.&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;dll&lt;/span&gt; without the strong name doesn't work anymore with 2008 because it references two other strong named assemblies. Also, I was never really ethically satisfied with the old approach any way.&lt;br /&gt;&lt;br /&gt;After looking at the assembly with &lt;/span&gt;&lt;a href="http://www.aisto.com/roeder/dotnet/"&gt;&lt;span &gt;Reflector&lt;/span&gt;&lt;/a&gt;&lt;span &gt; and reading &lt;/span&gt;&lt;a href="http://www.binarycoder.net/fxcop/"&gt;&lt;span &gt;a great tutorial on creating &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;FxCop&lt;/span&gt; rules&lt;/span&gt;&lt;/a&gt;&lt;span &gt; I started approaching the problem with the &lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/Decorator_pattern"&gt;&lt;span &gt;Decorator pattern&lt;/span&gt;&lt;/a&gt;&lt;span &gt; to wrap the existing rules with my own. I assumed then that I could deactivate the Microsoft shipped version of the rules and activate my own in each Vs.Net project's Static Analysis settings. Implementing the Decorator pattern was a bit tricky though because the existing rules have both the Internal and Sealed modifier so I couldn't simply "new up" an instance nor could I inherit from the shipped types and override the pieces I wanted to augment. Luckily &lt;/span&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.reflection.aspx"&gt;&lt;span &gt;reflection&lt;/span&gt;&lt;/a&gt;&lt;span &gt; provides a way to do everything that I needed even though the type signatures don't.&lt;br /&gt;&lt;br /&gt;What I ended up with was a new JBBrown.FxCop.Rules.dll containing 3 class definitions - 1 abstract class and 2 new &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;FxCop&lt;/span&gt; rules that implement the abstraction. The abstract class does the work of instantiating the Microsoft shipped rule, setting the thresholds and delegating &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;FxCop&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;API&lt;/span&gt; calls off to the decorated instance. The two new rules specify the new threshold values by providing the names of private variables within the Microsoft shipped rules to be reset to new custom chosen values. This is what the resulting  VS.Net project's Static Analysis settings looks like when using the Decorated rules.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5198894682624372466" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://2.bp.blogspot.com/_gbqB01_VTFI/SCYvKz5-LvI/AAAAAAAAABE/QTU2UUnUGrY/s400/MaintainabilityRules.jpg" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;The Code&lt;/strong&gt;&lt;br /&gt;&lt;span &gt;The entire source can be found &lt;/span&gt;&lt;a href="http://jbhawkeye.googlepages.com/JBBrown.FxCop.Rules.zip"&gt;&lt;span &gt;here&lt;/span&gt;&lt;/a&gt;&lt;span &gt; to allow you to set your own preferred thresholds for the Maintainability and &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;Cyclomatic&lt;/span&gt; Complexity &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;FxCop&lt;/span&gt; rules. After you compile the project then just drop the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;dll&lt;/span&gt; in your Rules directory and restart your Vs.Net. The &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;FxCop&lt;/span&gt; rule directory path should be similar to "C:\Program Files\Microsoft Visual Studio 9.0\Team Tools\Static Analysis Tools\&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;FxCop&lt;/span&gt;\Rules"&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4800899166044488588-3881267512023226437?l=www.controlstatements.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.controlstatements.com/feeds/3881267512023226437/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4800899166044488588&amp;postID=3881267512023226437' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/3881267512023226437'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/3881267512023226437'/><link rel='alternate' type='text/html' href='http://www.controlstatements.com/2008/05/changing-fxcop-maintainability-and.html' title='Changing FxCop Maintainability and Cyclomatic Complexity rules'/><author><name> </name><uri>http://www.blogger.com/profile/04526542006501977139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_gbqB01_VTFI/SMszDOF2x1I/AAAAAAAAACY/mlPCkvxKzQI/S220/DSC_2833.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_gbqB01_VTFI/SCYvKz5-LvI/AAAAAAAAABE/QTU2UUnUGrY/s72-c/MaintainabilityRules.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4800899166044488588.post-3425042037237588403</id><published>2008-05-02T18:32:00.000-07:00</published><updated>2008-05-02T18:41:44.646-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Team System'/><category scheme='http://www.blogger.com/atom/ns#' term='TeamReview'/><category scheme='http://www.blogger.com/atom/ns#' term='My Code'/><title type='text'>TeamReview 1.0.2: Code Review - just a lot less painful</title><content type='html'>&lt;span style="font-family:Times New Roman;"&gt;A few days ago I released &lt;a href="http://www.codeplex.com/TeamReview"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;TeamReview&lt;/span&gt;&lt;/a&gt; &lt;a href="http://www.codeplex.com/TeamReview/Release/ProjectReleases.aspx?ReleaseId=12926"&gt;version 1.0.2&lt;/a&gt;, which introduced integrated &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;IDE&lt;/span&gt; support for Code Review Item closing/editing during the Code Review Replay process. Also, thanks to &lt;a href="http://blog.maartenballiauw.be/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;Maarten&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;Balliauw&lt;/span&gt;&lt;/a&gt; a bug was fixed for &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;VSTS&lt;/span&gt; 2008.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Times New Roman;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Times New Roman;"&gt;If you could &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_5"&gt;benefit&lt;/span&gt; from cheaper, easier and more valuable code review &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;TeamReview&lt;/span&gt; might be your answer; check out this &lt;a href="http://www.codeplex.com/teamreview"&gt;TeamReview Example&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Times New Roman;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Times New Roman;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4800899166044488588-3425042037237588403?l=www.controlstatements.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.controlstatements.com/feeds/3425042037237588403/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4800899166044488588&amp;postID=3425042037237588403' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/3425042037237588403'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/3425042037237588403'/><link rel='alternate' type='text/html' href='http://www.controlstatements.com/2008/05/teamreview-102-code-review-just-lot.html' title='TeamReview 1.0.2: Code Review - just a lot less painful'/><author><name> </name><uri>http://www.blogger.com/profile/04526542006501977139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_gbqB01_VTFI/SMszDOF2x1I/AAAAAAAAACY/mlPCkvxKzQI/S220/DSC_2833.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4800899166044488588.post-5183238875123129310</id><published>2008-04-30T18:18:00.001-07:00</published><updated>2008-05-27T19:29:41.427-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lean'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><category scheme='http://www.blogger.com/atom/ns#' term='James Shore'/><category scheme='http://www.blogger.com/atom/ns#' term='Story Cards'/><category scheme='http://www.blogger.com/atom/ns#' term='Requirements'/><title type='text'>Defining a Project Vision with the Minimum Useful Feature Set</title><content type='html'>A while back at work I was included in a project kick-off session. The general idea of what would be developed was already determined, but neither the exact features nor a feature priority had been identified. What we needed to do was find the most valuable features that met the product vision.&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size:130%;"&gt;We needed to find the Minimum Useful Feature Set (&lt;/span&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"  style="font-size:130%;"&gt;MUFS&lt;/span&gt;&lt;span style="font-size:130%;"&gt;).&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;The practice and principles I describe below helped us discover the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;MUFS&lt;/span&gt; and has since been used in a few more projects and has been a great introduction to Lean for many.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;strong&gt;What is a Minimum Useful Feature Set?&lt;/strong&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;A &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;MUFS&lt;/span&gt; is the smallest amount of work that provides the most new market value. If that definition seems vague and subjective it's because it is; and defining the most valuable work for any business to endeavor upon is not easy - people struggle at it everyday. One thing that is clear about a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;MUFS&lt;/span&gt; is that the value from a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;MUFS&lt;/span&gt; is not necessarily cash flow coming in from customers. Many times a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;MUFS&lt;/span&gt; value can be realized from such things as internal learning from a prototype, the ability to do some &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_6"&gt;usability&lt;/span&gt; testing on a subsection of what will eventually be delivered, or simply realizing that a critical user story has not been satisfied. Thus a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;MUFS&lt;/span&gt; does not necessarily mean "something that can be deployed to customers."&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;strong&gt;Sounds complicated - where did you get this stuff?&lt;/strong&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;It's an application of Lean, the Minimum Useful Feature Set term comes from &lt;a href="http://www.amazon.com/Implementing-Lean-Software-Development-Addison-Wesley/dp/0321437381"&gt;Implementing Lean Software Development&lt;/a&gt; from Mary and Tom &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;Poppendieck&lt;/span&gt;. The &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;MUFS&lt;/span&gt; is a result of eliminating waste - specifically waste from what I'll call Kitchen Sink Marketing - when software tries to satisfy everyone in a market all at once by including every possible feature instead of satisfying the most valued part of the remaining market successfully in increments.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;strong&gt;So how do I figure out the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;MUFS&lt;/span&gt; when there are so many potential features?&lt;/strong&gt;&lt;/div&gt;&lt;br /&gt;To discover the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;MUFS&lt;/span&gt; you can use a technique that you probably are already familiar with, but apply it a bit differently. The Planning Game has been used by many development teams to estimate the development effort of a User Story after Features are chosen by a business. Later in this article I'll present how to use the Planning Game in a new way, with a different group of people at an earlier stage in the project in order to eliminate waste and identify the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;MUFS&lt;/span&gt;. However, before we get to how this works let's talk about why it works.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Latest Responsible Moment Decision Making&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;James Shore has a great post &lt;a href="http://www.jamesshore.com/Presentations/Beyond%20Story%20Cards.html"&gt;Beyond Story Cards&lt;/a&gt; that explains the Latest Responsible Moment Decision Making well. I'll be using a lot of his material here, so let it be known that he deserves credit for this section.&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size:130%;"&gt;'Latest responsible moment' is a core agile idea. The term comes from &lt;a href="http://en.wikipedia.org/wiki/Lean_software_development"&gt;&lt;u&gt;Lean Software Development&lt;/u&gt;&lt;/a&gt;. The idea is that you want to put off decisions as long as you can: to the latest responsible moment. But it's the latest &lt;i&gt;responsible&lt;/i&gt; moment, not the 'last possible' moment. That wouldn't be responsible. - James Shore&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_gbqB01_VTFI/SBt5JC0O5yI/AAAAAAAAAAM/ta_rVGuEPaU/s1600-h/latest_responsible_moment_decision_making.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5195879791383734050" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: pointer; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_gbqB01_VTFI/SBt5JC0O5yI/AAAAAAAAAAM/ta_rVGuEPaU/s400/latest_responsible_moment_decision_making.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;Lean Manufacturing uses a principle called &lt;a href="http://en.wikipedia.org/wiki/Just_In_Time_%28business%29"&gt;Just In Time&lt;/a&gt;. Like most things in Lean, the fundamental purpose of Just In Time is to eliminate waste. Instead of each station on an assembly line running at full capacity and pushing inventory out of the station and into a pile, a storage facility, or somewhere else that station only runs fast enough for the next station to pull what is needed &lt;span style="FONT-STYLE: italic"&gt;just in time&lt;/span&gt; to do it's work to meet the pull of the following station etc. This avoids materials being consumed without any realized value. When materials are pushed out of a station and into a pile or storage area they have incurred the cost of being created, the cost of being transitioned to the storage and will incur the cost of being found again for consumption and the cost of being transitioned back to wherever they are needed - if they don't expire, and if they are needed, which sometimes is not the case. In software we don't have a constrained amount of raw materials going in and tangible goods coming out of an assembly line. Instead we have a limited amount of decision power going in and software being delivered at the end. &lt;blockquote&gt;&lt;span style="font-size:130%;"&gt;To make sure that we are not creating decision waste we should make decisions only when they are needed - at the latest responsible moment - when you have the most information, that information is the most accurate and making the decision is the most valuable thing that can be done.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;Thus with Latest Responsible Moment Decision Making decisions are pulled into existence because they are demanded by something that needs to consume that decision immediately. This is opposite of what we often experience in software where decisions are made and pushed into later phases of development with the belief that those decisions will be needed. Those pushed decisions may not be valuable at all and would end up in the waste section of the image above by not contributing to the delivery of the software. Even if the pushed decisions end up being needed and inside the focus-time cone above they still incur the waste of decision inventory storage and retrieval from somewhere such as your email inbox or a spec document.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;How to define a Vision with the Planning Game&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is how we found the Minimum Useful Feature Set by using the principle of Latest Responsible Moment Decision Making.&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Prepare you materials&lt;br /&gt;&lt;/span&gt;&lt;ol&gt;&lt;li&gt;Set up the meeting, invite the Customer/Customer representative and a representative from each group that will be affected by the project. Some examples include the project manager, the marketing representative, the solution architect, a customer service lead, a tester, and one person from each system that will probably be impacted. Somewhere around a 70/30 business/technical mix of people seems to work well. In total a group of around 10 to 15 people is good.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Get A lot of 3 x5 index cards&lt;/li&gt;&lt;li&gt;Find some tape&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Get some markers&lt;/li&gt;&lt;li&gt;Find a white board or paper&lt;/li&gt;&lt;li&gt;In your meeting room draw the Latest Responsible Moment Decision Making diagram&lt;/li&gt;&lt;li&gt;In you meeting room draw the following X-Y chart (to be explained later)&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_gbqB01_VTFI/SBt90i0O50I/AAAAAAAAAAc/eqLKWIupbaQ/s1600-h/Value_Ease_Of_Deployment.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5195884936754554690" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: pointer; TEXT-ALIGN: center" alt="" src="http://2.bp.blogspot.com/_gbqB01_VTFI/SBt90i0O50I/AAAAAAAAAAc/eqLKWIupbaQ/s400/Value_Ease_Of_Deployment.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Define a few roles&lt;br /&gt;&lt;/span&gt;&lt;ol&gt;&lt;li&gt;The visionary - this is the customer or customer &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_13"&gt;representative&lt;/span&gt;. The person paying for the project that knows what they want. This person is responsible for making sure that decisions are made within the Focus-Time cone above as indicated by the green vertical line. For fun you can refer to this person as the Focus Waste Engineer.&lt;/li&gt;&lt;li&gt;The facilitator - the person who knows the Planning Game, can teach it to others and can politely settle disputes. This person is in charge of making sure that the group is making timely decisions as indicated by the orange horizontal line above. For fun you can refer to this person as the Time Waste Engineer.&lt;/li&gt;&lt;li&gt;The scribe - no matter how successful the &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_14"&gt;facilitator&lt;/span&gt; is at minimizing decision waste, people will discuss &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_15"&gt;tangential&lt;/span&gt; things that may be valuable. The scribe records them, mostly to comfort group members that the important stuff they say isn't just gone forever.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Explain Latest Responsible Moment Decision Making&lt;br /&gt;&lt;/span&gt;Supplement the description above with some information that Lean was established by Toyota over half a century ago and that it has been used successfully by companies around the world for many years to gain a competitive advantage in their market.&lt;span style="FONT-WEIGHT: bold"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Create Feature Cards&lt;br /&gt;&lt;/span&gt;Feature cards are nothing more than &lt;a href="http://jamesshore.com/Presentations/Beyond%20Story%20Cards.html"&gt;Story cards&lt;/a&gt;, but for features, or a Theme of stories if you prefer. I just use a different name so that if/when you get to the normal Story Cards or Story points part of your project people don't get confused.&lt;span style="FONT-WEIGHT: bold"&gt;&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;A feature card is a 3x5 index card with the name of the feature on the front and behaviors of the feature on the back&lt;/li&gt;&lt;li&gt;It's a 3x5 because &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;there's&lt;/span&gt; no room to record decision waste by making too many or too detailed decisions&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Feature Cards are placeholders for future conversations&lt;/li&gt;&lt;li&gt;Feature Cards are not the spec, the spec comes later (if at all)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Don't worry about spelling, punctuation etc&lt;/li&gt;&lt;li&gt;If a behavior doesn't fit on one line it's probably more than one behavior in disguise&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Play Planning Poker&lt;br /&gt;&lt;/span&gt;This is much like your basic &lt;a href="http://www.crisp.se/planningpoker/"&gt;planning poker&lt;/a&gt;. However instead of playing poker for development effort you are instead going to play poker twice, once for Value and once for Ease of Deployment. Value in this case is defined by the amount of good a feature will contribute to achieving the Vision. Ease of Deployment is estimated instead of cost of development for a couple of reasons. The first is simply for information display purposes - we want the good stuff in the upper right since that's how most people expect to read the graph. Also, cost of development is often viewed as just the Dev and &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_17"&gt;QA&lt;/span&gt; efforts and doesn't include other costs such as sales staff training, customer service impacts, marketing efforts, etc. - and all of that stuff is real cost so it should be included. Thus, estimate the 'ease of deployment' instead of the 'cost of development' to remove that ambiguous 'development' word from being a stumbling block.&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;&lt;br /&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;As you play planning poker you'll need to record both the Value and Ease Of Deployment values as noted by the "V=80" and "D=30" on this example Feature Card&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_gbqB01_VTFI/SBuE6C0O51I/AAAAAAAAAAk/g1IkvVTjlBU/s1600-h/Feature_card.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5195892727825229650" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: pointer; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_gbqB01_VTFI/SBuE6C0O51I/AAAAAAAAAAk/g1IkvVTjlBU/s400/Feature_card.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Discover the Minimum Useful Feature Set&lt;/span&gt;&lt;br /&gt;Once you have created all your Feature Cards and played Planning Poker for Value and Ease of Deployment you tape up each feature at the appropriate place on to the Value-Ease of Deployment graph shown above. &lt;blockquote&gt;&lt;span style="font-size:130%;"&gt;At this point you'll have a very easy to understand visual representation of the relative ROI ratio of each feature.&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;Now starting at the bottom left of the graph read a feature and ask if the feature should be included in the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_18"&gt;MUFS&lt;/span&gt;. You may have to remind the group at this time that just because a feature is not in the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_19"&gt;MUFS&lt;/span&gt; it doesn't mean it won't be delivered, it just means it won't be planned for the first development cycle and that cycle may or may not end in a customer release. I don't have any defined voting or other process for doing this step in identifying the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_20"&gt;MUFS&lt;/span&gt;. I've found so far that one isn't needed and that general discussion is valuable and "close enough consensus" will be achieved. By starting in the bottom left with the features that are hard to deploy with low value the decisions are easy and the group will get comfortable with this process and establish a &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_21"&gt;rhythm&lt;/span&gt;. When the group indicates that feature isn't part of the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_22"&gt;MUFS&lt;/span&gt; remove it from the chart and tape it up somewhere else for display. Leaving it up on the side is a &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_23"&gt;gentle&lt;/span&gt; reminder to people that the feature isn't lost forever, it could still be delivered later. As you start moving from the bottom-left to the top-right picking off features the discussion will get more involved and the weighing of pros and cons will become more lively. This is an indicator that you are close to identifying the green &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_24"&gt;MUFS&lt;/span&gt; arch shown in the Value-Ease of Deployment image above. After you've crossed that arch and get very close to the top right you'll find that the decisions are again easy and not much &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_25"&gt;discussion&lt;/span&gt; is needed.&lt;br /&gt;&lt;br /&gt;When you are done with all the Feature Cards the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_26"&gt;MUFS&lt;/span&gt; is the collection of features left taped to the value-ease of deployment chart - &lt;span style="FONT-STYLE: italic"&gt;you'll need to mark each card as part of the MUFS so that you'll know when they come off the board&lt;/span&gt;. The smaller the arch is - the higher the ROI ratio is for the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_27"&gt;MUFS&lt;/span&gt;. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4800899166044488588-5183238875123129310?l=www.controlstatements.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.controlstatements.com/feeds/5183238875123129310/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4800899166044488588&amp;postID=5183238875123129310' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/5183238875123129310'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/5183238875123129310'/><link rel='alternate' type='text/html' href='http://www.controlstatements.com/2008/04/defining-project-vision-with-minimum.html' title='Defining a Project Vision with the Minimum Useful Feature Set'/><author><name> </name><uri>http://www.blogger.com/profile/04526542006501977139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_gbqB01_VTFI/SMszDOF2x1I/AAAAAAAAACY/mlPCkvxKzQI/S220/DSC_2833.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_gbqB01_VTFI/SBt5JC0O5yI/AAAAAAAAAAM/ta_rVGuEPaU/s72-c/latest_responsible_moment_decision_making.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4800899166044488588.post-4073470247680445601</id><published>2008-04-30T12:59:00.000-07:00</published><updated>2008-04-30T13:24:54.287-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='alt.net'/><category scheme='http://www.blogger.com/atom/ns#' term='polyglot'/><category scheme='http://www.blogger.com/atom/ns#' term='Dave Laribee'/><category scheme='http://www.blogger.com/atom/ns#' term='fishbowl'/><category scheme='http://www.blogger.com/atom/ns#' term='altdotnet'/><title type='text'>Polyglot programmer</title><content type='html'>&lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  &gt;My thanks go out to Dave Laribee for sharing &lt;a href="http://codebetter.com/blogs/david_laribee/archive/2008/04/22/polyglot-programmer-fishbowl.aspx"&gt;the opening “Fishbowl” session of Alt.net on video&lt;/a&gt;. The fishbowl topic is “Polyglot Programmer” which was a topic mentioned many times during the weekend. The fishbowl method of hosting a discussion was neat to see. This fishbowl was done in order to show the rest of us how it worked, so there’s some explaining mixed in with the Polyglot discussion.&lt;br /&gt;&lt;br /&gt;You won't see me, but my Mt. Dew  bottle has a cameo.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  &gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4800899166044488588-4073470247680445601?l=www.controlstatements.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.controlstatements.com/feeds/4073470247680445601/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4800899166044488588&amp;postID=4073470247680445601' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/4073470247680445601'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/4073470247680445601'/><link rel='alternate' type='text/html' href='http://www.controlstatements.com/2008/04/polyglot-programmer.html' title='Polyglot programmer'/><author><name> </name><uri>http://www.blogger.com/profile/04526542006501977139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_gbqB01_VTFI/SMszDOF2x1I/AAAAAAAAACY/mlPCkvxKzQI/S220/DSC_2833.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4800899166044488588.post-698441989585711608</id><published>2008-04-23T22:07:00.000-07:00</published><updated>2008-04-23T22:14:44.166-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='alt.net'/><title type='text'>The Alt.Net Community</title><content type='html'>If you share the goals of &lt;a href="http://www.altdotnet.org"&gt;Alt.Net&lt;/a&gt; but missed the "big" conference this past weekend, join the &lt;a href="http://tech.groups.yahoo.com/group/altdotnet/"&gt;mailing list&lt;/a&gt; on Yahoo. Or a regional list such as &lt;a href="http://groups.google.com/group/altnetseattle"&gt;this Google Group for Seattle&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4800899166044488588-698441989585711608?l=www.controlstatements.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.controlstatements.com/feeds/698441989585711608/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4800899166044488588&amp;postID=698441989585711608' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/698441989585711608'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/698441989585711608'/><link rel='alternate' type='text/html' href='http://www.controlstatements.com/2008/04/altnet-community.html' title='The Alt.Net Community'/><author><name> </name><uri>http://www.blogger.com/profile/04526542006501977139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_gbqB01_VTFI/SMszDOF2x1I/AAAAAAAAACY/mlPCkvxKzQI/S220/DSC_2833.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4800899166044488588.post-5587928242984401533</id><published>2008-04-23T12:36:00.000-07:00</published><updated>2008-04-23T12:44:41.340-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Visual Aids'/><category scheme='http://www.blogger.com/atom/ns#' term='Video'/><category scheme='http://www.blogger.com/atom/ns#' term='Team System'/><category scheme='http://www.blogger.com/atom/ns#' term='TFS'/><title type='text'>Planning and Migrating TFS Videos</title><content type='html'>&lt;a href="http://www.saarchitect.net/Publications/Forms/AllItems.aspx?RootFolder=%2FPublications%2FValue%20Add%20Information%2FTechnology%20Videos"&gt;These videos&lt;/a&gt; are an outstanding find for those planning or implementing a TFS install or migration.&lt;br /&gt;&lt;br /&gt;Thanks to &lt;a href="http://dotnet.org.za/willy/default.aspx"&gt;Willy-Peter Schaub&lt;/a&gt; for &lt;a href="http://dotnet.org.za/willy/archive/2008/04/23/team-foundation-server-are-we-satisfied-and-ready-for-the-product.aspx"&gt;sharing this&lt;/a&gt; with the community&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4800899166044488588-5587928242984401533?l=www.controlstatements.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.controlstatements.com/feeds/5587928242984401533/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4800899166044488588&amp;postID=5587928242984401533' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/5587928242984401533'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/5587928242984401533'/><link rel='alternate' type='text/html' href='http://www.controlstatements.com/2008/04/planning-and-migrating-tfs-videos.html' title='Planning and Migrating TFS Videos'/><author><name> </name><uri>http://www.blogger.com/profile/04526542006501977139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_gbqB01_VTFI/SMszDOF2x1I/AAAAAAAAACY/mlPCkvxKzQI/S220/DSC_2833.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4800899166044488588.post-5818835941239110436</id><published>2008-04-21T16:20:00.000-07:00</published><updated>2008-04-21T16:30:26.077-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='alt.net'/><category scheme='http://www.blogger.com/atom/ns#' term='Open Space'/><category scheme='http://www.blogger.com/atom/ns#' term='Fowler'/><category scheme='http://www.blogger.com/atom/ns#' term='Hanselman'/><category scheme='http://www.blogger.com/atom/ns#' term='altdotnet'/><title type='text'>Alt.Net in Seattle</title><content type='html'>I was able to attend &lt;a href="http://altdotnet.org/events/seattle"&gt;Alt.Net in Seattle &lt;/a&gt;last weekend. I am drained now and need some recovery time. It was mentally intense for me. If you haven't been to an &lt;a href="http://en.wikipedia.org/wiki/Open_Space_Technology"&gt;Open Spaces&lt;/a&gt; conference before I recommend that you find one soon. While there are many highlights that I could catalog I was mostly in awe to be around such a telented and notable group of individuals. Also, it's just plain fun to say I saw some guy try and win a professional dissagreement against both &lt;a href="http://www.martinfowler.com/"&gt;Martin Fowler &lt;/a&gt;and &lt;a href="http://www.hanselman.com/blog/"&gt;Scott Hanselman&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4800899166044488588-5818835941239110436?l=www.controlstatements.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.controlstatements.com/feeds/5818835941239110436/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4800899166044488588&amp;postID=5818835941239110436' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/5818835941239110436'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/5818835941239110436'/><link rel='alternate' type='text/html' href='http://www.controlstatements.com/2008/04/altnet-in-seattle.html' title='Alt.Net in Seattle'/><author><name> </name><uri>http://www.blogger.com/profile/04526542006501977139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_gbqB01_VTFI/SMszDOF2x1I/AAAAAAAAACY/mlPCkvxKzQI/S220/DSC_2833.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4800899166044488588.post-1057871549911298568</id><published>2008-04-21T16:08:00.001-07:00</published><updated>2008-04-21T16:18:47.936-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Team System'/><category scheme='http://www.blogger.com/atom/ns#' term='TeamReview'/><category scheme='http://www.blogger.com/atom/ns#' term='CodePlex'/><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><category scheme='http://www.blogger.com/atom/ns#' term='Code Review'/><category scheme='http://www.blogger.com/atom/ns#' term='My Code'/><title type='text'>TeamReview released</title><content type='html'>Last week I released a new open source project on &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;CodePlex&lt;/span&gt;, &lt;a href="http://www.codeplex.com/TeamReview"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;TeamReview&lt;/span&gt;&lt;/a&gt;. It's a Visual Studio.Net &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;addin&lt;/span&gt; that facilitates an in-&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;IDE&lt;/span&gt; code review process and provides many advantages over the traditional code review meeting, or "reply all" email broadcast.&lt;br /&gt;&lt;br /&gt;After trying to &lt;a href="http://www.codeplex.com/CodeReviewAddIn/SourceControl/PatchList.aspx"&gt;patch Guy &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;Kolbis&lt;/span&gt; Code Review &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;Addin&lt;/span&gt; &lt;/a&gt;and having my patches unevaluated for over 9 months I finally resigned myself to finding a different way to contribute to the community. I commend Guy &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;Kolbis's&lt;/span&gt; ideas and he deserves credit for what he's done. However, the product offering of &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;TeamReview&lt;/span&gt; and the code base that it's built upon are big differentiators between the two projects.&lt;br /&gt;&lt;br /&gt;Check out the &lt;a href="http://www.codeplex.com/TeamReview"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;TeamReview&lt;/span&gt; by Example &lt;/a&gt;on the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;CodePlex&lt;/span&gt; home page and then try out &lt;a href="https://www.codeplex.com/Release/ProjectReleases.aspx?ProjectName=TeamReview&amp;amp;ReleaseId=12538"&gt;release 1.0.1&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4800899166044488588-1057871549911298568?l=www.controlstatements.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.controlstatements.com/feeds/1057871549911298568/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4800899166044488588&amp;postID=1057871549911298568' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/1057871549911298568'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/1057871549911298568'/><link rel='alternate' type='text/html' href='http://www.controlstatements.com/2008/04/teamreview-released.html' title='TeamReview released'/><author><name> </name><uri>http://www.blogger.com/profile/04526542006501977139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_gbqB01_VTFI/SMszDOF2x1I/AAAAAAAAACY/mlPCkvxKzQI/S220/DSC_2833.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4800899166044488588.post-6824157996243748029</id><published>2007-09-10T18:46:00.000-07:00</published><updated>2007-09-11T01:05:06.350-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='Patterns'/><category scheme='http://www.blogger.com/atom/ns#' term='Design'/><category scheme='http://www.blogger.com/atom/ns#' term='Rails'/><title type='text'>Cage Match: Decorator, Pipeline, Chain Of Responsibility</title><content type='html'>Update Note:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;When I first wrote this post I argued that the alias_method_chain example in the article linked below felt more like the Pipeline / Pipes and Filters pattern to me. What I didn't comprehend was that the alias_method_chain &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_0"&gt;functionality&lt;/span&gt; of Ruby invokes behavior in another block of code within the context of the preceding block in the chain, and not simply an iteration of blocks of code (methods). So, while eating crow, I'll leave my post with some editorial adjustments to keep my &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_1"&gt;comparison&lt;/span&gt; of the patterns and &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_2"&gt;retain&lt;/span&gt; the knowledge that I can alias "alias_method_chain" to "decorate_methods" to make me feel more comfortable, and less misguided.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The Pipeline Pattern has been part of the coding that I've been doing lately, so when I got sent a great discussion of the &lt;a href="http://cfis.savagexi.com/articles/2007/09/05/rails-unusual-architecture"&gt;Decorator Pattern in the Rails &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_0"&gt;implementation&lt;/span&gt;&lt;/a&gt; from my design patterns discussion group co-host &lt;a href="http://www.brokenbuild.com/"&gt;Wes&lt;/a&gt; I had to check it out. Charlie started a pretty &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_1"&gt;intriguing&lt;/span&gt; discussion about the differences between the&lt;a href="http://en.wikipedia.org/wiki/Decorator_pattern"&gt; Decorator &lt;/a&gt;and &lt;a href="http://en.wikipedia.org/wiki/Chain_of_responsibility_pattern"&gt;Chain of Responsibility&lt;/a&gt; (&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;CoR&lt;/span&gt;&lt;/span&gt;) patterns. Charlie started out his article with the claim that the Rails architecture was a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;CoR&lt;/span&gt;&lt;/span&gt; implementation and later on had a smart reply by &lt;a href="http://pezra.barelyenough.org/blog/"&gt;Peter Williams&lt;/a&gt; that the architecture was not &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;CoR&lt;/span&gt;&lt;/span&gt;, but rather closer to Decorator. It's hard to argue with a code author about the patterns they used, and even harder when the response comes from someone like me who is not a user of that code. (I should have known better, guess I'll learn) However I'd like to compare the Chain of &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_6"&gt;Responsibility&lt;/span&gt; and Decorator patterns with the &lt;a href="http://www.enterpriseintegrationpatterns.com/PipesAndFilters.html"&gt;Pipeline /Pipes-and-Filters&lt;/a&gt; pattern.&lt;br /&gt;&lt;br /&gt;I think the Charlie was on a common thought-track when he &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_7"&gt;inadvertently&lt;/span&gt; described a piece of the Rails Architecture as Chain of Responsibility. Limited by the pattern vocabulary in the &lt;a href="http://en.wikipedia.org/wiki/Design_Patterns"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;GoF&lt;/span&gt;&lt;/span&gt;&lt;/a&gt; book any list of methods to invoke in sequence might lead you to thinking about the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;CoR&lt;/span&gt;. In fact &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;Chalrie's&lt;/span&gt; description of the code still &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_9"&gt;contains&lt;/span&gt; the words "chain" and "link" in many places. In retrospect, the name alias_method_chain is a bit misleading for folks with a design pattern history and common practices that &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_10"&gt;include&lt;/span&gt; pattern hints in the names of code elements, such as &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;ValidatorFactory&lt;/span&gt;, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;ItemIterator&lt;/span&gt;, or &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;BowlingFacade&lt;/span&gt;. Following the thought process in the article I began to think (and ultimately &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_14"&gt;falsely&lt;/span&gt; came to the conclusion) that it wasn't &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;CoR&lt;/span&gt;, but rather Pipeline / Pipes and Filters.&lt;br /&gt;&lt;br /&gt;Until recently I wouldn't have been able to distinguish Chain of Responsibility and Pipeline, but after a while working with Pipeline I've formulated the following reasoning. As it often is with patterns, the two &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_11"&gt;vary&lt;/span&gt; in their intent. The Pipeline Pattern is not &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;CoR&lt;/span&gt;&lt;/span&gt; because pipeline &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_13"&gt;pieces&lt;/span&gt; are collectively responsible for handling a message unless an exception condition is met in any one piece, while &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_17"&gt;CoR&lt;/span&gt;&lt;/span&gt; passes the request only up-to the point at which a single chain claims responsibility for the complete &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_15"&gt;processing&lt;/span&gt; of the message. Pipeline is &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_16"&gt;meant&lt;/span&gt; to be used as a static whole, while &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_17"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_18"&gt;CoR&lt;/span&gt;&lt;/span&gt; (and Decorator) are designed for dynamic part-whole composition. The individual components of the Rails implementation probably aren't designed to be used in any combination, or in whole-part compositions, but rather designed to be used as a single conceptual entity with it's &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_18"&gt;&lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_19"&gt;pieces&lt;/span&gt;&lt;/span&gt; always in the same order relying on processing precedence.&lt;br /&gt;&lt;br /&gt;Charlie's frustration with not being able to break existing dependencies in the Rails framework and inject a new participant in the middle of the established code helps support the argument for Pipeline with it's static whole nature instead of the dynamic part-whole design of &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_19"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_20"&gt;CoR&lt;/span&gt;&lt;/span&gt; and Decorator. The author's follow up &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_20"&gt;quandary&lt;/span&gt; about being able to distinguish the conceptual difference between the "Decorators" and Rails filters helped me believe that Pipeline/ Pipes-and-Filters was a more accurate description of the design than &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_21"&gt;CoR&lt;/span&gt;. Conceptually it seemed like Pipeline / Pipes-and-Filters to me, not &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_21"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_22"&gt;CoR&lt;/span&gt;&lt;/span&gt; or Decorator.&lt;br /&gt;&lt;br /&gt;Where I went wrong was being too confident in my interpretation of the problem and the &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_23"&gt;consequences&lt;/span&gt; of the pattern that Charlie was experiencing. I skipped the very crucial step of evaluating the pattern within it's context; I didn't look at how the alias_method_chain structure and the aliased methods' implementations fit together. As a result the Decorator pattern wins the cage match with a knock-out punch to my ego at the end of the first round.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4800899166044488588-6824157996243748029?l=www.controlstatements.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.controlstatements.com/feeds/6824157996243748029/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4800899166044488588&amp;postID=6824157996243748029' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/6824157996243748029'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/6824157996243748029'/><link rel='alternate' type='text/html' href='http://www.controlstatements.com/2007/09/cage-match-decorator-pipeline-chain-of.html' title='Cage Match: Decorator, Pipeline, Chain Of Responsibility'/><author><name> </name><uri>http://www.blogger.com/profile/04526542006501977139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_gbqB01_VTFI/SMszDOF2x1I/AAAAAAAAACY/mlPCkvxKzQI/S220/DSC_2833.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4800899166044488588.post-2657660436072873848</id><published>2007-07-29T12:36:00.001-07:00</published><updated>2007-07-29T12:44:12.541-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Visual Aids'/><category scheme='http://www.blogger.com/atom/ns#' term='Team System'/><category scheme='http://www.blogger.com/atom/ns#' term='API'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Design'/><title type='text'>Team System, WorkFlow and C# Concept Posters</title><content type='html'>Some great &lt;a href="http://www.drp.co.za/Media/Posters/PostersPDF/tabid/62/Default.aspx"&gt;concept posters &lt;/a&gt;for the visual learners amongst us can be found at the &lt;a href="http://www.drp.co.za/"&gt;Developer Readiness Program&lt;/a&gt;. The colorful Team System, WorkFlow, and C# posters are going to be the primary focus of the new decor in my cube.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4800899166044488588-2657660436072873848?l=www.controlstatements.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.controlstatements.com/feeds/2657660436072873848/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4800899166044488588&amp;postID=2657660436072873848' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/2657660436072873848'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/2657660436072873848'/><link rel='alternate' type='text/html' href='http://www.controlstatements.com/2007/07/team-system-workflow-and-c-concept.html' title='Team System, WorkFlow and C# Concept Posters'/><author><name> </name><uri>http://www.blogger.com/profile/04526542006501977139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_gbqB01_VTFI/SMszDOF2x1I/AAAAAAAAACY/mlPCkvxKzQI/S220/DSC_2833.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4800899166044488588.post-3871465879358102969</id><published>2007-07-23T10:22:00.000-07:00</published><updated>2007-07-23T10:48:19.577-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Video'/><category scheme='http://www.blogger.com/atom/ns#' term='API'/><category scheme='http://www.blogger.com/atom/ns#' term='Design'/><title type='text'>Best Practices for Designing Frameworks that are Reusable Object-Oriented Libraries</title><content type='html'>&lt;p class="MsoNormal" style=""&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;I finally got around to watching &lt;a href="http://www.researchchannel.org/prog/displayevent.aspx?rID=11087&amp;fID=2740"&gt;best practices for designing frameworks that are reusable object-oriented libraries&lt;/a&gt;. The presentation is based on the content from MSDN’s &lt;a href="http://msdn2.microsoft.com/en-us/library/czefa0ke%28vs.71%29.aspx"&gt;Design Guidelines for Class Library Developers&lt;/a&gt; and the &lt;a href="http://www.amazon.com/Framework-Design-Guidelines-Conventions-Development/dp/0321246756"&gt;Framework Design Guidelines&lt;/a&gt; book. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p class="MsoNormal" style=""&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-weight: bold;"&gt;Presentation Positives:&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;ul style="margin-top: 0in;" type="disc"&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;100% .Net focused – some topics      that you’d only consider in a .Net environment&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;Well organized&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;Well presented for a developer      presentation, I liked the analogies and a great quote from Napoleon&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;He gives an overview of      Microsoft’s api review process, including mentioning a tool that makes an      API word document from the code. I haven’t searched for the tool yet.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;There’s a 20 minute section at      the very end where he explains constructing teams that produce good API      designs&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style=""&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-weight: bold;"&gt;Presentation Negatives:&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;ul style="margin-top: 0in;" type="disc"&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;It’s long; there is a “fast      mode” that makes the presentation watch-able in 1 sitting though&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;The speaker is a bit repetitive      at times to really “hammer home” a point&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;No details on processes or      tools that help an organization measure “API effectiveness” or “API cost” &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;No helpful ways to train and      educate “shu” level on good API design other than reading the design      guidelines. He recommends having someone who is “ha” or “ri” level be      responsible for the API on a project and have an organization wide API review      team for inter-project API consistency.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p class="MsoNormal" style="margin-left: 0.25in;"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-weight: bold;"&gt;Recommendations:&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style=""&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;Overall, I would recommend watching this if you haven’t already read the MSDN site or the book and want to be a good .Net API designer and have your code “feel like” the .Net framework code. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p class="MsoNormal" style=""&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;Joshua Bloch’s “&lt;a href="http://www.infoq.com/presentations/effective-api-design"&gt;How to Design a Good API and Why it Matters&lt;/a&gt;” has more value for the time spent watching the video, and is more concentrated on non language specific OO design guidelines making Bloch’s video more universally true and probably more timeless. The .Net video has its place however; I’m glad that I finally watched it but I don’t think I’ll have a need to watch it again any time soon. Having discussed many of the .Net API Design Guidelines and consumed many .Net libraries a lot of the concepts are ingrained into my practices and expectations already.&lt;/span&gt;&lt;/p&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;I am thankful, however, that API design resources like this are published in a medium from which I may learn.&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;p class="MsoNormal" style=""&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4800899166044488588-3871465879358102969?l=www.controlstatements.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.controlstatements.com/feeds/3871465879358102969/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4800899166044488588&amp;postID=3871465879358102969' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/3871465879358102969'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/3871465879358102969'/><link rel='alternate' type='text/html' href='http://www.controlstatements.com/2007/07/i-finally-got-around-to-watching-this.html' title='Best Practices for Designing Frameworks that are Reusable Object-Oriented Libraries'/><author><name> </name><uri>http://www.blogger.com/profile/04526542006501977139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_gbqB01_VTFI/SMszDOF2x1I/AAAAAAAAACY/mlPCkvxKzQI/S220/DSC_2833.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4800899166044488588.post-7213934847058035735</id><published>2007-06-19T19:27:00.000-07:00</published><updated>2008-12-03T21:10:28.388-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='Cyclomatic Complexity'/><category scheme='http://www.blogger.com/atom/ns#' term='Code Analysis'/><category scheme='http://www.blogger.com/atom/ns#' term='FXCop'/><title type='text'>Change FXCop Cyclomatic Complexity Threshold Values</title><content type='html'>Update: &lt;a href="http://jb-brown.blogspot.com/2008/05/changing-fxcop-maintainability-and.html"&gt;Here's the 2008 Version&lt;/a&gt;, the below post is for Visual Studio 2005.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://weblogs.asp.net/pglavich/archive/2005/07/19/419872.aspx"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Glavs&lt;/span&gt; Blog&lt;/a&gt; has provided light at the end of the tunnel for those of us who have been scouring the &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_1"&gt;Internet&lt;/span&gt; for a way to change &lt;a href="http://blogs.msdn.com/codeanalysis/"&gt;Visual Studio Code &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_2"&gt;Analysis&lt;/span&gt;&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/Cyclomatic_complexity"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;Cyclomatic&lt;/span&gt; Complexity&lt;/a&gt; thresholds. The shipped thresholds are way to high for my taste and I've wanted an easy way to integrate an enforced &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;cyclomatic&lt;/span&gt; complexity ceiling within the &lt;a href="http://en.wikipedia.org/wiki/Test-driven_development#Development_style"&gt;red-green-&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;refactor&lt;/span&gt;&lt;/a&gt; process. &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;Glavs&lt;/span&gt; article about &lt;a href="http://weblogs.asp.net/pglavich/archive/2005/07/19/419872.aspx"&gt;Creating Custom &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;FXCop&lt;/span&gt; rules and altering existing ones - Part 2&lt;/a&gt; shows how to use the .Net framework utilities &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;Ildasm&lt;/span&gt;.&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;exe&lt;/span&gt; and &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;ILasm&lt;/span&gt;.&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;exe&lt;/span&gt; to pipe out the contents of the code &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_12"&gt;analysis&lt;/span&gt; rule to &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;MSIL&lt;/span&gt;, change it and then recompile with the changes. Following this procedure the shipped CC thresholds of warning at 25, critical warning at 50, error at 75 and critical error at 100 can now be whatever you desire.&lt;br /&gt;&lt;br /&gt;I suggest one alteration to &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;Glavs&lt;/span&gt; directions; &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_15"&gt;don't&lt;/span&gt;' recompile to the same assembly name. This will cause other code, such as the &lt;a href="http://msdn2.microsoft.com/en-us/library/ms182075%28VS.80%29.aspx"&gt;Code &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_16"&gt;Analysis&lt;/span&gt; Check-In Policy&lt;/a&gt;, that was compiled against the Microsoft shipped strong name version to break, and any service packs that ship a new version of the assembly will overwrite your changes. So compile it to a new name leave it in the same folder then in your VS.Net projects enable the new code &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_17"&gt;analysis&lt;/span&gt; rule and &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_18"&gt;disable&lt;/span&gt; the old.&lt;br /&gt;&lt;br /&gt;Of course, I don't know the legal or ethic responsibilities of &lt;a href="http://en.wikipedia.org/wiki/Monkey_patching"&gt;Monkey Patching&lt;/a&gt; the code &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_19"&gt;analysis&lt;/span&gt; rule under the Visual Studio license. Hopefully Microsoft will understand that this is an attempt to get the best value out of the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_20"&gt;IDE&lt;/span&gt; when other options aren't available and not an attempt to gain a competitive advantage or tarnish their product.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4800899166044488588-7213934847058035735?l=www.controlstatements.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.controlstatements.com/feeds/7213934847058035735/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4800899166044488588&amp;postID=7213934847058035735' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/7213934847058035735'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/7213934847058035735'/><link rel='alternate' type='text/html' href='http://www.controlstatements.com/2007/06/change-fxcop-cyclomatic-complexity.html' title='Change FXCop Cyclomatic Complexity Threshold Values'/><author><name> </name><uri>http://www.blogger.com/profile/04526542006501977139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_gbqB01_VTFI/SMszDOF2x1I/AAAAAAAAACY/mlPCkvxKzQI/S220/DSC_2833.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4800899166044488588.post-25825855541605702</id><published>2007-06-03T15:09:00.000-07:00</published><updated>2007-06-03T15:46:15.467-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><category scheme='http://www.blogger.com/atom/ns#' term='NDepend'/><category scheme='http://www.blogger.com/atom/ns#' term='Cyclomatic Complexity'/><title type='text'>Dining on your education</title><content type='html'>Scott &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Hanselman&lt;/span&gt; is one of my favorite &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;bloggers&lt;/span&gt;, and he recently posted &lt;a href="http://www.hanselman.com/blog/EducatingProgrammersWithPlacematsNDependStaticAnalysisPoster.aspx"&gt;a great follow up &lt;/a&gt;about one my favorite tools, &lt;a href="http://www.ndepend.com/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;NDepend&lt;/span&gt;&lt;/a&gt;. As he states, the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;nitty-&lt;/span&gt;gritty of &lt;a href="http://www.ndepend.com/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;NDepend&lt;/span&gt; &lt;/a&gt;can be overwhelming at first, but it's power is immediately obvious. Sorting out how to get a team to collectively and effectively use the vast capabilities of &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;NDepend&lt;/span&gt; can be an obstacle. Thanks to Scott's blog entry, and offer to share at Tech-Ed we can all dine on our &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;NDepend&lt;/span&gt; &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_7"&gt;education&lt;/span&gt;. I'm not going to Tech Ed, hopefully I can get a coworker to snag one of the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;placemats&lt;/span&gt; for me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4800899166044488588-25825855541605702?l=www.controlstatements.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.controlstatements.com/feeds/25825855541605702/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4800899166044488588&amp;postID=25825855541605702' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/25825855541605702'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/25825855541605702'/><link rel='alternate' type='text/html' href='http://www.controlstatements.com/2007/06/dinning-on-your-education.html' title='Dining on your education'/><author><name> </name><uri>http://www.blogger.com/profile/04526542006501977139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_gbqB01_VTFI/SMszDOF2x1I/AAAAAAAAACY/mlPCkvxKzQI/S220/DSC_2833.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4800899166044488588.post-1847961516210754829</id><published>2007-06-03T12:32:00.000-07:00</published><updated>2009-03-17T22:08:31.303-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><category scheme='http://www.blogger.com/atom/ns#' term='Team System'/><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><category scheme='http://www.blogger.com/atom/ns#' term='Code Review'/><category scheme='http://www.blogger.com/atom/ns#' term='My Code'/><title type='text'>Additions to Guy Kolbis - Code Review Add-In</title><content type='html'>&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;Update&lt;/strong&gt;: - &lt;a href="http://www.codeplex.com/TeamReview"&gt;TeamReview&lt;/a&gt;, the open-source project that I started a while after I wrote this post, is thriving as the most complete code review solution for Team System&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I just completed my first participation in an open source community by submitting a patch to &lt;a href="http://www.codeplex.com/CodeReviewAddIn"&gt;Guy Kolbis - Code Review Add-In&lt;/a&gt;. The &lt;a href="http://www.codeplex.com/CodeReviewAddIn/SourceControl/PatchList.aspx"&gt;new features&lt;/a&gt; were enjoyable to code since the Team System code api is well designed and intuitive. You don't need much time, and very little reference material to figure out how the pieces of the API work together. The additions to the &lt;a href="http://www.codeplex.com/CodeReviewAddIn"&gt;Code Review Add-In&lt;/a&gt; were much easier to accomplish than I originally expected. It's certainly not the most elegant code I've ever written, but the cost-to-value ratio has got to be pretty high. Prior to this morning I hadn't even looked at any of the Team System code API, let alone write anything useful. Ten hours later I'm writing my first blog post about my first open source work that was with my first experience with Team System API.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;New Add-In Feature - Work Item Association&lt;/strong&gt;&lt;br /&gt;The new features, by themselves, are going to be helpful to me and hopefully to you too. I think one of the biggest advantages of the update is the ability to associate Work Items being submitted with other existing work items. This may seem like a pretty basic accomplishment, but with the right work item setup you can bridge the gap between the Add In and another CodePlex project; &lt;a href="http://www.codeplex.com/TFSCodeReviewFlow"&gt;TFS Code Review Workflow&lt;/a&gt;. The Workflow project includes a check-in policy that causes code to be shelved and a work item created for someone to review the code shelf. Once the code is reviewed and the work item addressed, the code can be committed from the shelf. The work item type that the Workflow project uses is aptly named "Code Review," the definition of that type is a part of the Workflow project and is easily imported into any project you desire.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;The Code Review Request-Response Gap&lt;/strong&gt;&lt;br /&gt;Now that the &lt;a href="http://www.codeplex.com/CodeReviewAddIn"&gt;Guy Kolbis - Code Review Add-In&lt;/a&gt; can associate new Work Items to existing ones all a code reviewer needs to do is configure their Add-In settings to query for the items of the "Code Review" type created by the Workflow project. This is done by creating a new Team Query that returns only work items of the "Code Review" type in the proper state (for example "Open, In Progress"). Then as the reviewer highlights-right-clicks-and-submits their review items the existing Code Review work item created by the Workflow check-in policy is updated each time with a link to the reviewers submission. When the reviewer has completed their review they then have the single Code Review work item that catalogs their review, and can assign the Code Review work item back to the originator. Thus the "TFS gap" between code review initiation and code review feedback has been bridged and a more effective and developer friendly process created.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Work Item Type Compatibility&lt;/strong&gt;&lt;br /&gt;Included in &lt;a href="http://www.codeplex.com/CodeReviewAddIn/SourceControl/PatchList.aspx"&gt;the patch I submitted&lt;/a&gt; are two work item types, the first is a slightly modified "Code Review" type from the Workflow project that shows off some of the patch's updates. This type should still be compatible with the Workflow project, and work well as a Work Item to link to from the Add-In. The second work item type "Code Review Item" is one that I made in order to map the Add In's resolution field to an HTML formatted text field in Team System. Both of these types reference a "Code Reviewers" Team System group, this is to remain compatible with the &lt;a href="http://www.codeplex.com/TFSCodeReviewFlow"&gt;TFS Code Review Workflow&lt;/a&gt; project, which has the capability of emailing the Code Reviewers group when a new Code Review item is submitted.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Conclusion&lt;br /&gt;&lt;/strong&gt;Of course all of this excitement is tentative at the moment while the patch is being evaluated. Hopefully everything will go smoothly and the patch will be accepted. Even if it isn't I am encouraged by the well thought out Team System API and platform, the flexibility in outcomes that it supports, and the velocity at which it allows development to occur. So, thanks for that Microsoft, and thank you Guy Kolbis for letting me meddle in your code.&lt;br /&gt;&lt;br /&gt;Here's some &lt;a href="http://www.codeproject.com/csharp/CodeReviewAddIn.asp"&gt;information and screen shots &lt;/a&gt;about Guy Kolbis - Code Review Add-In before the patch.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4800899166044488588-1847961516210754829?l=www.controlstatements.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.controlstatements.com/feeds/1847961516210754829/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4800899166044488588&amp;postID=1847961516210754829' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/1847961516210754829'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4800899166044488588/posts/default/1847961516210754829'/><link rel='alternate' type='text/html' href='http://www.controlstatements.com/2007/06/additions-to-guy-kolbis-code-review-add.html' title='Additions to Guy Kolbis - Code Review Add-In'/><author><name> </name><uri>http://www.blogger.com/profile/04526542006501977139</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_gbqB01_VTFI/SMszDOF2x1I/AAAAAAAAACY/mlPCkvxKzQI/S220/DSC_2833.jpg'/></author><thr:total>1</thr:total></entry></feed>
