<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-US"><title type="html">jampick&amp;#39;s WebLog</title><subtitle type="html" /><id>http://blogs.msdn.com/b/jampick/atom.aspx</id><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/jampick/" /><link rel="self" type="application/atom+xml" href="http://blogs.msdn.com/b/jampick/atom.aspx" /><generator uri="http://telligent.com" version="5.6.50428.7875">Telligent Evolution Platform Developer Build (Build: 5.6.50428.7875)</generator><updated>2009-02-02T02:01:54Z</updated><entry><title>Using productivity factor effectively to build achievable iteration plans</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/jampick/archive/2011/03/15/using-productivity-factor-effectively-to-build-achievable-iteration-plans.aspx" /><id>http://blogs.msdn.com/b/jampick/archive/2011/03/15/using-productivity-factor-effectively-to-build-achievable-iteration-plans.aspx</id><published>2011-03-15T04:49:48Z</published><updated>2011-03-15T04:49:48Z</updated><content type="html">&lt;p&gt;&lt;span style="font-size: x-small;"&gt;Folks at&amp;nbsp;Microsoft have great integrity. That is, they do what they say they are going to do and let you know early if they can&amp;rsquo;t follow through with their commitment. I hope you have the same experience at your company. Maybe we are just lucky at Microsoft to have so may people with this characteristic. However, when I&amp;rsquo;ve worked on custom application development projects there seems to be a strange &amp;ldquo;group integrity paradox&amp;rdquo; where individuals have great integrity but as a group they make commitments that can&amp;rsquo;t be delivered on. This lack of group integrity is no more obvious than in iteration planning.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: x-small;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: x-small;"&gt;Taking a page from any flavor of agile&amp;nbsp;my team uses a productivity factor to build an iteration plan that is achievable based on the historical productivity of the team. What I'm going to outline below is not new to any agile practitioner.&amp;nbsp; However, anyone can benefit from this thinking not mater what your project management style.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: x-small;"&gt;Most project managers will assume some amount of productivity, say 75%. That is fine to build the initial iteration plan. However,&amp;nbsp;&lt;strong&gt;we assert that teams must update their iteration plans based on the last iterations productivity.&lt;/strong&gt; This means after the initial iteration plan is developed some work will get pulled in or pushed out based on real team productivity.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: x-small;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: x-small;"&gt;&lt;strong&gt;What is productivity?&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/sites/campus/technical/appplat/AmericasSDC/SDC%20Journal/Lists/Posts/Attachments/25/image_4_3B2D02B5.png"&gt;&lt;/a&gt;&lt;span style="font-size: x-small;"&gt;It&amp;rsquo;s easy to get snarled in this discussion so from&amp;nbsp;our team&amp;nbsp;perspective we keep it purposely simple. Productivity is how many hours a developer work on tasks and bugs (output) per hour they bill to the project (input).&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: x-small;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: x-small;"&gt;Consider this next example layering in a few tools we know. A developer bills 40 hours&amp;nbsp;on a project for a week. During that week 30 hours are spent completing work on tasks and bugs from TFS. Why the delta between billed time and time spent on development tasks and fixing bugs? Consider some of my favorite below:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: x-small;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="font-size: x-small;"&gt;Last night's build broke. - Lose a day debugging build break, rolling back changes for dev who is not here!&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-size: x-small;"&gt;Today is a bank holiday for Customer team in Ireland. - Lose a day if you have dependencies on that team.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-size: x-small;"&gt;Customer/EM needs you to justify the time you logged in the time system last week. - Lose 1 hour.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-size: x-small;"&gt;Project PjM has been pulled into a customer meeting and needs your support in that meeting. &amp;ndash; Lose 2 hours (and your mind).&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-size: x-small;"&gt;Sales team needs your expertise to frame to propose engagement extension &amp;ndash; Lose 4 hours.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-size: x-small;"&gt;Customer architect who you work with is a sports fan and wants to talk about last night's game. - Lose 1 hour.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-size: x-small;"&gt;Project sponsor has asked for a status update on the project. - Lose 1 hour.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-size: x-small;"&gt;Customer catches you in the hallway and asks you questions for which you need to answer immediately. &amp;ndash; Lose 1 hour.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="font-size: x-small;"&gt;By know you should understand that there is a delta between time spent on the project and time at your keyboard writing code. What does this have to do with iteration planning?&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: x-small;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: x-small;"&gt;Iteration planning&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: x-small;"&gt;The starting point for an iteration plan is capacity. Capacity is usually in terms of developer hours. For an iteration consider 10 people, 3 weeks, 40 hours a week we get 1200 developer hours. The most common scenario is to apply an arbitrary productivity factor of 75% and fill this iteration with 900 hours (1200 * .75) of development work. On projects&amp;nbsp;led by my team&amp;nbsp;we assert that the team must use historical productivity instead. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: x-small;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: x-small;"&gt;Team productivity is not just specific to the solution. It also is an indirect measure of experience, training, talent and motivation. Also, some environments are less productive than others: technology, environment, morale, team culture all contribute to this.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: x-small;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: x-small;"&gt;On most&amp;nbsp;projects we see initial iteration productivity start around 50-60%. Some teams stay at this level others have ramped up to 75%. We do not plan iterations with more than 75% productivity since there will always be meetings to wick away your time working on development tasks.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: x-small;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: x-small;"&gt;&lt;strong&gt;How to I calculate the productivity of my iteration?&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: x-small;"&gt;Again, focus on simplicity so you don&amp;rsquo;t waste time debating a complex formula. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: x-small;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;span style="font-size: x-small;"&gt;For your completed iteration get the start and end dates for the iterations&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-size: x-small;"&gt;If you are using Team Foundation Server export tasks and bugs assigned to that iteration to Excel&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-size: x-small;"&gt;Sum completed work for each developer&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-size: x-small;"&gt;Divide completed work by hours billed in to the project between the start and end dates for your iteration&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-size: x-small;"&gt;Average the productivity for each developer&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;span style="font-size: x-small;"&gt;Use this number as the starting point to adjust future iterations. Incremental increases to productivity are fine but limit increases to 5% unless there is some change to the project the indicates more productivity. Ideally during your iteration retrospectives the team can identify what management can do to make them more productive. My favorite is have certain days flagged as no meeting days. If implemented the team should commit to increased productivity and the iteration plan should reflect that.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: x-small;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: x-small;"&gt;&lt;strong&gt;What if you get productivity wrong?&lt;/strong&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: x-small;"&gt;
&lt;p&gt;Don&amp;rsquo;t panic. If the team is more productive than you expect, great(!), pull in work from future iterations. Ideally work is decomposed into capabilities that are portable and have visible dependencies. If the team is less productive don&amp;rsquo;t adjust too soon as the team may need some time to ramp up. If the team continues to under produce then it may be best to take a page from the agile playbook and revisit priorities with the customer about what can be pushed out to a later iteration. The change here is that in the next iteration you will need to use that lower productivity number so you don&amp;rsquo;t repeat the same mistake again! &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Building iterations based on team productivity is not a license for folks to slack. It&amp;rsquo;s the starting point to building group integrity and trust with the customer. Early in the project there may be some adjustments to the iteration plan but the team should quickly begin a cycle of delivering what the promised to deliver instead of committing to iteration plans that are known to be a failure from the first day.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;One final thought on this. Productivity is an indirect measure of the teams skills and morale. If you put too much emphasis on hitting a &amp;ldquo;number&amp;rdquo; then the team can easily game the system if incented to do so. Do this and productivity can&amp;rsquo;t reliably be used to for iteration planning.&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10141082" width="1" height="1"&gt;</content><author><name>jampick</name><uri>http://blogs.msdn.com/jampick/ProfileUrlRedirect.ashx</uri></author><category term="Project Management" scheme="http://blogs.msdn.com/b/jampick/archive/tags/Project+Management/" /></entry><entry><title>Checklists… not just for weekend chores.</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/jampick/archive/2010/07/17/checklists-not-just-for-weekend-chores.aspx" /><id>http://blogs.msdn.com/b/jampick/archive/2010/07/17/checklists-not-just-for-weekend-chores.aspx</id><published>2010-07-17T05:04:15Z</published><updated>2010-07-17T05:04:15Z</updated><content type="html">&lt;p&gt;I wanted to pass on a book that I’ll be wrapping up shortly.&amp;#160; I’m getting some good ideas that may support creating repeatable processes to around delivering complex software projects.&amp;#160; Here is part of the introduction as a teaser…&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;Here, then, is our situation at the start of the twenty-first century: We have accumulated stupendous know-how. We have put it in the hands of some of the most highly trained, highly skilled, and hardworking people in our society. And, with it, they have indeed accomplished extraordinary things. Nonetheless, that know-how is often unmanageable. Avoidable failures are common and persistent, not to mention demoralizing and frustrating, across many fields—from medicine to finance, business to government. And the reason is increasingly evident: the volume and complexity of what we know has exceeded our individual ability to deliver its benefits correctly, safely, or reliably. Knowledge has both saved us and burdened us. &lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;That means we need a different strategy for overcoming failure, one that builds on experience and takes advantage of the knowledge people have but somehow also makes up for our inevitable human inadequacies. And there is such a strategy—though it will seem almost ridiculous in its simplicity, maybe even crazy to those of us who have spent years carefully developing ever more advanced skills and technologies. &lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;It is a checklist.&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;From the The Checklist Manifesto: How to Get Things Right (Kindle Edition)&lt;/p&gt;  &lt;p&gt;by &lt;a href="http://www.amazon.com/s?_encoding=UTF8&amp;amp;search-alias=digital-text&amp;amp;field-author=Atul%20Gawande"&gt;Atul Gawande&lt;/a&gt; (Author) &lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.amazon.com/checklist-manifesto-things-right-ebook/dp/B0030V0PEW?tag=t0e7-20"&gt;http://www.amazon.com/checklist-manifesto-things-right-ebook/dp/B0030V0PEW?tag=t0e7-20&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Great to be reminded not to overlook the simple solutions even for managing complex work!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10039397" width="1" height="1"&gt;</content><author><name>jampick</name><uri>http://blogs.msdn.com/jampick/ProfileUrlRedirect.ashx</uri></author></entry><entry><title>TFS 2010 Code Churn Report – Getting Additional Detail</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/jampick/archive/2010/07/06/tfs-2010-code-churn-report-getting-additional-detail.aspx" /><id>http://blogs.msdn.com/b/jampick/archive/2010/07/06/tfs-2010-code-churn-report-getting-additional-detail.aspx</id><published>2010-07-06T06:21:30Z</published><updated>2010-07-06T06:21:30Z</updated><content type="html">&lt;p&gt;It’s great to see more TFS users use a tool they know, Excel, in conjunction with a tool they may not know so well, Analysis Services to answer questions about their software project.&amp;#160; The default TFS reports provide a great first level of detail but you will frequently need to get to the next (and next-next) levels of detail to answer questions about your project.&amp;#160; No matter what your role in the project the more you can visit the “self serve business intelligence counter” via Excel connected to the TFS data warehouse the more productive conversations you can have with your team.&amp;#160; &lt;/p&gt;  &lt;p&gt;Turning “hmmm… we had a bunch of code churn yesterday” to “I see most of the code churn yesterday were added class files in our queuing component… is that related to the bug fix we approved yesterday?&amp;#160; I wouldn’t expect new files to be added for a bug fix”&amp;#160; Now that is real world and just one example how data can turn a conversation productive!&lt;/p&gt;  &lt;p&gt;I’ll use the code churn as an example on how the default TFS reports are a great starting point for project information and how you will need to get some additional detail.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-06-08-metablogapi/5584.Reserved_5F00_ReportViewerWebControlCAR9PS1K_5F00_09102457.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" class="wlDisabledImage" title="Reserved_ReportViewerWebControlCAR9PS1K" border="0" alt="Reserved_ReportViewerWebControlCAR9PS1K" align="right" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-06-08-metablogapi/4024.Reserved_5F00_ReportViewerWebControlCAR9PS1K_5F00_thumb_5F00_234067AE.jpg" width="396" height="308" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;On a project I’m involved with they use the TFS 2010 &lt;a href="http://msdn.microsoft.com/en-us/library/dd380683(VS.100).aspx" target="_blank"&gt;Build Quality Indicators Report&lt;/a&gt;, a default report in the Agile process template, to make sure most tests are passing and increasing in number, code coverage is at the target level and code churn is trending down as we close an iteration.&lt;/p&gt;  &lt;p&gt;They hit a couple builds with high code coverage (see to the right, circled) and wanted to confirm if this was expected or not.&amp;#160; Here is how you can get more detail on code churn.&lt;/p&gt;  &lt;p&gt;You can modify the existing default code churn report that comes in the Agile process template.&amp;#160; The example below I start with a new Excel workbook.&lt;/p&gt;  &lt;p&gt;1. Follow the excellent instructions here, &lt;a title="http://www.woodwardweb.com/vsts/getting_started.html" href="http://www.woodwardweb.com/vsts/getting_started.html"&gt;http://www.woodwardweb.com/vsts/getting_started.html&lt;/a&gt;, to connect Excel to your TFS Warehouse.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-06-08-metablogapi/2870.churnPivot2_5F00_5B12ABD1.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" class="wlDisabledImage" title="churnPivot2" border="0" alt="churnPivot2" align="left" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-06-08-metablogapi/3060.churnPivot2_5F00_thumb_5F00_3DDCDDFA.jpg" width="162" height="244" /&gt;&lt;/a&gt;2. Add filters – Since the question I’m trying to answer is related to a particular build I’m going to drag the following dimensions from the pivot table field list to the report filter&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Team Project Hierarchy &lt;/li&gt;    &lt;li&gt;Build Definition Name &lt;/li&gt;    &lt;li&gt;Build Platform &lt;/li&gt;    &lt;li&gt;Build Flavor &lt;/li&gt;    &lt;li&gt;Build Name &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;3. Add Rows – I’m interested in what files have changes so I’m going to drag the Version Control File.File Hierarchy dimension from the pivot table filed list to the row label.&amp;#160; If I wanted to know who was churning code I could drag the “Version Control change set checked in by” dimension in to the row label instead.&amp;#160; Bonus – have both the checked in and File Hierarchy dimensions in your row label! &lt;/p&gt;  &lt;p&gt;4. Add values – This is the “show me the money” moment!&amp;#160; Drag in the following calculated fields from the pivot table filed list into the values area.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Code Churn Count &lt;/li&gt;    &lt;li&gt;Total Churn &lt;/li&gt;    &lt;li&gt;Lines Modified &lt;/li&gt;    &lt;li&gt;Lines Deleted &lt;/li&gt;    &lt;li&gt;Lines Added &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Below is what your finished product should look like.&amp;#160; This will give you the “next” level of detail on what code churned and what type of change it was.&amp;#160; Since we are working with a pivot table connected to the Version control file file hierarchy dimension you can drill down to see churn down to the file level. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-06-08-metablogapi/0654.churnPivot3_5F00_4423B488.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" class="wlDisabledImage" title="churnPivot3" border="0" alt="churnPivot3" align="left" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-06-08-metablogapi/5543.churnPivot3_5F00_thumb_5F00_71E15780.jpg" width="571" height="259" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;My preference is to have these more detailed reports answer 1-2 questions really well instead of trying to create a “shock and awe” report that is flashy but difficult to take action on.&amp;#160; I save these in the TFS project SharePoint for other folks to use.&lt;/p&gt;  &lt;p&gt;Once you have this basic report down you can begin spelunking into the other dimensions available to you in the data warehouse.&amp;#160; &lt;/p&gt;  &lt;p&gt;Data can be used for good and for evil so be sure to supplement this information with your own experience and expertise.&amp;#160; Enjoy!    &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10034788" width="1" height="1"&gt;</content><author><name>jampick</name><uri>http://blogs.msdn.com/jampick/ProfileUrlRedirect.ashx</uri></author><category term="TFS Reporting" scheme="http://blogs.msdn.com/b/jampick/archive/tags/TFS+Reporting/" /></entry><entry><title>Automation to relate TFS work items</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/jampick/archive/2009/09/21/automation-to-relate-tfs-work-items.aspx" /><id>http://blogs.msdn.com/b/jampick/archive/2009/09/21/automation-to-relate-tfs-work-items.aspx</id><published>2009-09-21T08:30:51Z</published><updated>2009-09-21T08:30:51Z</updated><content type="html">&lt;p&gt;If you are using TFS 2008 for work item tracking be sure to get most out of the tool by relating work items.&amp;#160; Depending on the process template you are using the work item types may be different.&amp;#160; In general terms consider linking your requirement/scenario/use cases with tasks.&lt;/p&gt;  &lt;p&gt;If you are using the MSF for Agile template this would translate to linking scenario work item with one or more tasks required to implement than scenario.&lt;/p&gt;  &lt;p&gt;While there is no actual work item parent/child relationship in TFS 2008 you can still construct meaningful work progress reports from a peer scenario and task work item relationship.&amp;#160;&amp;#160; I’ll go into more detail on how to get this project status info in a later post.&lt;/p&gt;  &lt;p&gt;Here I want to focus on how to link work items in bulk.&amp;#160; TFS 2008 does not have a way to bulk link work items; not through Team Explorer, not through Excel and not through Project.&amp;#160; Darn, darn, darn.&lt;/p&gt;  &lt;p&gt;This means if you have imported scores of work items, say via Excel, you would have to open each scenario work item in Team Explorer and manually link the associated tasks with that scenario (instructions to do this manually are &lt;a href="http://msdn.microsoft.com/en-us/library/bb822118.aspx" target="_blank"&gt;here&lt;/a&gt;).&lt;/p&gt;  &lt;p&gt;For most folks all this manual work would be a reasonable barrier to entry and they would just abandon linking work items and the associated project reporting benefits.&lt;/p&gt;  &lt;p&gt;Bulk linking of work items may be better in TFS 2010.&amp;#160; Until then I offer you the code below for a command line utility that will link a work item with one or more other work items.&amp;#160; &lt;/p&gt;  &lt;p&gt;Example syntax looks like this:&lt;/p&gt;  &lt;p&gt;linkWorkItems.exe &lt;a href="http://tfsrtm08:8080"&gt;http://tfsrtm08:8080&lt;/a&gt; sandbox 659 &amp;quot;660,661,662,663”&lt;/p&gt;  &lt;p&gt;This would link work item 659 to work items 660, 661, 662 and 663.&lt;/p&gt;  &lt;p&gt;One great reference I used was this link below to Shai Raiten’s blog.&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;Reference Link&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="http://blogs.microsoft.co.il/blogs/shair/archive/2008/10/06/more-about-creating-work-item-using-tfs-api.aspx" href="http://blogs.microsoft.co.il/blogs/shair/archive/2008/10/06/more-about-creating-work-item-using-tfs-api.aspx"&gt;http://blogs.microsoft.co.il/blogs/shair/archive/2008/10/06/more-about-creating-work-item-using-tfs-api.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;Code&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;pre&gt;using System;
using Microsoft.TeamFoundation.Client;
using Microsoft.TeamFoundation.WorkItemTracking.Client;

namespace linkWorkItems
{
    class Program
    {
        static int Main(string[] args)
        {
            //show syntax if no arguments are passed in or user asks for help
            if (args.Length &amp;lt; 4 ||
                args[0].ToLower() == &amp;quot;/h&amp;quot; ||
                args[0].ToLower() == &amp;quot;-h&amp;quot; ||
                args[0].ToLower() == &amp;quot;/?&amp;quot; ||
                args[0].ToLower() == &amp;quot;-?&amp;quot;
                )
            {
                showSyntax();
                return 1;
            }
            string serverName = args[0].ToString();
            string projectName = args[1].ToString();
            string parentWorkItemID = args[2].ToString();
            string [] childWorkItemIDs = args[3].Split(',');

            //connect to TFS
            TeamFoundationServer tfs = null;
            WorkItemStore store = null ;
            Project project = null ;
            try
            {
                tfs = new TeamFoundationServer(serverName);
                store = (WorkItemStore)tfs.GetService(typeof(WorkItemStore));
                project = store.Projects[projectName];
            }
            catch (Exception e)
            {
                Console.WriteLine(&amp;quot;Error:&amp;quot; + e.Message);
                return 2;
            }

            //get parent work item
            WorkItem parentWorkItem = null;
            try
            {
                parentWorkItem = project.Store.GetWorkItem(int.Parse(parentWorkItemID));
            }
            catch (Exception e) 
            {
                Console.WriteLine(&amp;quot;Error:&amp;quot; + e.Message );
                return 3;
            }

            //iterate through child work items that we want to link to parent work item
            foreach (string childWorkItemID in childWorkItemIDs)
            {
                //create related work item link
                RelatedLink rl = new RelatedLink(int.Parse(childWorkItemID));
                Console.WriteLine(&amp;quot;Linking work item ID &amp;quot; + childWorkItemID + &amp;quot; to &amp;quot; + parentWorkItemID) ; 
                try
                {
                    parentWorkItem.Links.Add(rl);
                }
                catch (Exception e)
                {
                    Console.WriteLine(&amp;quot;Warning:&amp;quot; + e.Message);
                }

            }
            //save new links to parent work item
            try
            {
                parentWorkItem.Save();
            }
            catch (Exception e)
            {
                Console.WriteLine(&amp;quot;Error:&amp;quot; + e.Message) ;
                return 4;
            }
            //complete
            return 0;
        }
        private static void showSyntax()
        {
            string thisFileName = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name;
            Console.WriteLine(&amp;quot;Utility to link one or more work items to another work item.&amp;quot;);
            Console.WriteLine();
            Console.WriteLine(&amp;quot;Usage: &amp;quot; + thisFileName + &amp;quot; [Team Server] [Project] [parent work item ID] [\&amp;quot;child ID1,ID2,ID3\&amp;quot;]&amp;quot;);
            Console.WriteLine();
            Console.WriteLine(&amp;quot;Example: &amp;quot; + thisFileName + &amp;quot; http://MYTFS:8080 sandbox 559 \&amp;quot;560,561,562\&amp;quot; &amp;quot;);

        }
        
    }
}&lt;/pre&gt;

&lt;p&gt;If you have other ways bulk link work items let me know in the comments.&amp;#160; Be sure to leave a comment and link to other tools that solve this same problem too.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9897403" width="1" height="1"&gt;</content><author><name>jampick</name><uri>http://blogs.msdn.com/jampick/ProfileUrlRedirect.ashx</uri></author><category term="TFS" scheme="http://blogs.msdn.com/b/jampick/archive/tags/TFS/" /></entry><entry><title>New Team Foundation Server case study is available</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/jampick/archive/2009/07/02/new-team-foundation-server-case-study-is-available.aspx" /><id>http://blogs.msdn.com/b/jampick/archive/2009/07/02/new-team-foundation-server-case-study-is-available.aspx</id><published>2009-07-02T07:41:45Z</published><updated>2009-07-02T07:41:45Z</updated><content type="html">&lt;p&gt;I was lucky enough to have some I’d been a part of captured in a case study.&amp;#160; The engagement was focused on Application Lifecycle Management improvements focused on people, process and tools (TFS).&lt;/p&gt;  &lt;p&gt;The study is available at &lt;a title="http://www.microsoft.com/casestudies/Case_Study_Detail.aspx?CaseStudyID=4000004473" href="http://www.microsoft.com/casestudies/Case_Study_Detail.aspx?CaseStudyID=4000004473"&gt;http://www.microsoft.com/casestudies/Case_Study_Detail.aspx?CaseStudyID=4000004473&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;When I work with a customer I’m most successful when I embed myself in their org.&amp;#160; This helps me understand the nuances of the problem but also craft a solution that is appropriate to the organization.&amp;#160; With a deep understanding of the organization an engineering solution can be developed that persist people and organizational changes.&amp;#160; &lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9812914" width="1" height="1"&gt;</content><author><name>jampick</name><uri>http://blogs.msdn.com/jampick/ProfileUrlRedirect.ashx</uri></author><category term="TFS" scheme="http://blogs.msdn.com/b/jampick/archive/tags/TFS/" /></entry><entry><title>Source Access by Branch and Role using Team Foundation Server</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/jampick/archive/2009/06/20/source-access-by-branch-and-role-using-team-foundation-server.aspx" /><id>http://blogs.msdn.com/b/jampick/archive/2009/06/20/source-access-by-branch-and-role-using-team-foundation-server.aspx</id><published>2009-06-20T05:47:53Z</published><updated>2009-06-20T05:47:53Z</updated><content type="html">&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;It’s great to see the latest version of &lt;a href="http://tfsbranchingguideii.codeplex.com/" target="_blank"&gt;Team Foundation Server branching guide&lt;/a&gt; just passed 30,000 downloads.&amp;#160; Even if you are using another source control system I think you will find plenty of the information in the guide is version control system agnostic and hopefully useful to you.&lt;/p&gt;  &lt;p&gt;We are planning to update the guide to align the with the release Team System 2010.&amp;#160; The revised guide will have the same content plus focus on some of the new features around branching and merging.&lt;/p&gt;  &lt;p&gt;One area I’ve been wanting to expand on is how to secure the basic, standard and advanced branch plans presented in the guide.&amp;#160; I’m not sure if this will make it into the revised doc so I thought I would post it here just in case. &lt;/p&gt;  &lt;p&gt;Regardless of which branch pattern you are using from the branching guide you should have some form of dev/main/release.&amp;#160; Below some tips you can use to secure these branches that balance security and developer productivity and also cover vendor access scenarios too.&amp;#160; Feel free to adjust as needed depending on your needs.&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h3&gt;&lt;a name="_Toc233202101"&gt;Source Level Access Type by Group&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;Unless otherwise specified TFS Application groups should have the access type listed below.&amp;#160; Note, FOO (how unoriginal of me) represents your TFS project.&amp;#160; &lt;table border="1" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td valign="top" width="319"&gt;           &lt;p&gt;&lt;b&gt;TFS Application Group&lt;/b&gt;&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="319"&gt;           &lt;p&gt;&lt;b&gt;Access Type&lt;/b&gt;&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="319"&gt;           &lt;p&gt;[FOO]\Readers             &lt;br /&gt;[SERVER]\Team Foundation valid users&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="319"&gt;           &lt;p&gt;Read&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="319"&gt;           &lt;p&gt;[FOO]\Build Services              &lt;br /&gt;[FOO]\Contributors              &lt;br /&gt;[FOO]\Core_Contributors              &lt;br /&gt;[FOO]\Release_[xxx]_Contributors              &lt;br /&gt;[FOO]\Vendor_[xxx]_Contributors&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="319"&gt;           &lt;p&gt;Read, PendChange, Checkin, Label, Lock&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="319"&gt;           &lt;p&gt;[FOO]\SCM Admin              &lt;br /&gt;[FOO]\Project Administrators              &lt;br /&gt;[SERVER]\Service Accounts              &lt;br /&gt;[SERVER]\Team Foundation Administrators&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="319"&gt;           &lt;p&gt;Read, PendChange, Checkin, Label, Lock, ReviseOther,UnlockOther, UndoOther, LabelOther, AdminProjectRights,CheckinOther&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;  &lt;h4&gt;Start at the &lt;a name="_Toc233202103"&gt;TFS project level&lt;/a&gt;&lt;/h4&gt;  &lt;p&gt;In Source Control Explorer start at the root TFS project level (e.g. $/FOO). Check in policy and check-in notes are stored as version control annotations at the TFS project level (I just found this out too so don’t feel bad). If users are granted access to the sources further down the source tree but not, at least read access, to the project level, then they will get errors when trying to check in. Note, users granted access to check in deeper in the source tree but not the root level, will ultimately be able to check in. However, the experience is bad due to error popup and check in policies will not be evaluated.    &lt;table border="1" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td valign="top" width="319"&gt;           &lt;p&gt;&lt;b&gt;TFS Application Group&lt;/b&gt;&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="319"&gt;           &lt;p&gt;&lt;b&gt;Inherit Permissions&lt;/b&gt;&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="319"&gt;           &lt;p&gt;[SERVER]\Team Foundation Valid Users&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="319"&gt;           &lt;p&gt;No&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;  &lt;h4&gt;&lt;a name="_Toc233202104"&gt;Development Branch Container&lt;/a&gt;&lt;/h4&gt;  &lt;p&gt;Apply to $/FOO/Dev . Use the access types for each TFS application group listed in the section above. Since we do not want the [SERVER]\team foundation server valid users group to have access anywhere in the source tree we remove inheritance at this level.&lt;/p&gt;  &lt;p&gt;Since “dev” is really a container for child development branches we only grant access at this level to the build in server groups listed below.    &lt;table border="1" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td valign="top" width="319"&gt;           &lt;p&gt;&lt;b&gt;TFS Application Group&lt;/b&gt;&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="319"&gt;           &lt;p&gt;&lt;b&gt;Inherit Permissions&lt;/b&gt;&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="319"&gt;           &lt;p&gt;[SERVER]\Service Accounts              &lt;br /&gt;[SERVER]\Team Foundation Administrators               &lt;br /&gt;&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="319"&gt;           &lt;p&gt;No&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;  &lt;h4&gt;&lt;a name="_Toc233202105"&gt;Development Branches&lt;/a&gt;&lt;/h4&gt;  &lt;p&gt;Applies to $/FOO/Dev/dev_xx. Permissions are set at the dev_xx level (i.e. development branches and inherits to all levels below.    &lt;table border="1" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td valign="top" width="319"&gt;           &lt;p&gt;&lt;b&gt;TFS Application Group&lt;/b&gt;&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="319"&gt;           &lt;p&gt;&lt;b&gt;Inherit Permissions&lt;/b&gt;&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="319"&gt;           &lt;p&gt;[SERVER]\Service Accounts              &lt;br /&gt;[SERVER]\Team Foundation Administrators               &lt;br /&gt;[FOO]\Build Services              &lt;br /&gt;[FOO]\Project Administrators              &lt;br /&gt;[FOO]\Contributors              &lt;br /&gt;[FOO]\Readers&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="319"&gt;           &lt;p&gt;Yes&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;  &lt;h4&gt;&lt;a name="_Toc233202106"&gt;Main Branch&lt;/a&gt;&lt;/h4&gt;  &lt;p&gt;Applies to $/FOO/main – access to main is set at this level and is inherited through main. In general, only members of the Project Admin groups will be checking fixes into main.    &lt;table border="1" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td valign="top" width="319"&gt;           &lt;p&gt;&lt;b&gt;TFS Application Group&lt;/b&gt;&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="319"&gt;           &lt;p&gt;&lt;b&gt;Inherit Permissions&lt;/b&gt;&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="319"&gt;           &lt;p&gt;[SERVER]\Service Accounts              &lt;br /&gt;[SERVER]\Team Foundation Administrators               &lt;br /&gt;[FOO]\Project Administrators&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="319"&gt;           &lt;p&gt;Yes&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;  &lt;h4&gt;&lt;a name="_Toc233202107"&gt;Release Branch Containers&lt;/a&gt;&lt;/h4&gt;  &lt;p&gt;Applies to $/FOO/release and $/FOO/release/[release name] (e.g. product 1.0). Similar to the development branch container we want to make sure the [SERVER]\Team Foundation Valid Users do not get read access at this level or below from the parent so we do not inherit permissions.    &lt;table border="1" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td valign="top" width="319"&gt;           &lt;p&gt;&lt;b&gt;TFS Application Group&lt;/b&gt;&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="319"&gt;           &lt;p&gt;&lt;b&gt;Inherit Permissions&lt;/b&gt;&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="319"&gt;           &lt;p&gt;[SERVER]\Service Accounts              &lt;br /&gt;[SERVER]\Team Foundation Administrators &lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="319"&gt;           &lt;p&gt;No&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;  &lt;h4&gt;&lt;a name="_Toc233202108"&gt;Release Branches&lt;/a&gt;&lt;/h4&gt;  &lt;p&gt;Applies to all release branches under $/FOO/Release/[release]/dev_sp, SP0, SP1, etc. Only members of the [FOO]\Release_[xxx]_Contributors should have access to check into the release branches. In practice, membership to Release_[xxx]_Contributors should be controlled via membership in a local group on the TFS AT (i.e. Release_[xxx]_Contributors is a local group on the TFS AT and is the sole member of the [FOO]\Release_[xxx]_Contributors TFS application group. This will assure that this is no downtime waiting for new membership to be applied via active directory.    &lt;table border="1" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td valign="top" width="319"&gt;           &lt;p&gt;&lt;b&gt;TFS Application Group&lt;/b&gt;&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="319"&gt;           &lt;p&gt;&lt;b&gt;Inherit Permissions&lt;/b&gt;&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="319"&gt;           &lt;p&gt;[SERVER]\Service Accounts              &lt;br /&gt;[SERVER]\Team Foundation Administrators               &lt;br /&gt;[FOO]\Release_[xxx]_Contributors&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="319"&gt;           &lt;p&gt;Yes&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;  &lt;h3&gt;&lt;a name="_Toc233202109"&gt;Targeted Access&lt;/a&gt;&lt;/h3&gt;  &lt;h5&gt;&lt;a name="_Toc233202110"&gt;Vendor or contract worker&lt;/a&gt;&lt;/h5&gt;  &lt;p&gt;Members of the [FOO]\Vendor_[xxx]_Contributors group (where xxx is a “friendly” name for their project) should have access to only the directories that they need to do their work. This group is added to the specific directories as needed using the same access type as contributors.&lt;/p&gt;  &lt;p&gt;The change here is that vendor permissions are not usually set at the development branch level. You have the flexibility to set these permissions in a very targeted, directory by directly way if needed.&lt;/p&gt;  &lt;h5&gt;&lt;a name="_Toc233202111"&gt;Core contributors&lt;/a&gt;&lt;/h5&gt;  &lt;p&gt;You may want to restrict access to higher value intellectual property or core libraries. In this case you can isolate the folders where this content is in your development branch and add [FOO]\Core_Contributors and deny [FOO]\Contributors and deny [FOO]\Project Administrators. If additional security is needed for sources you may want to consider putting the sources in an offline TFS and only check in a library.&lt;/p&gt;  &lt;h3&gt;Conclusion&lt;/h3&gt;  &lt;p&gt;The presented security plan strikes a balance between security and developer productivity. It allows for all development branch activity to be controlled and the branch level. You also have the ability to restrict access to vendors or allow access to more secure sources to core contributors.&lt;/p&gt;  &lt;p&gt;When locking down for release you control access through release specific local groups reducing any latency caused by going through a separate or waiting for active directory to reflect the security group change. &lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9792688" width="1" height="1"&gt;</content><author><name>jampick</name><uri>http://blogs.msdn.com/jampick/ProfileUrlRedirect.ashx</uri></author><category term="branching" scheme="http://blogs.msdn.com/b/jampick/archive/tags/branching/" /><category term="source control" scheme="http://blogs.msdn.com/b/jampick/archive/tags/source+control/" /><category term="security" scheme="http://blogs.msdn.com/b/jampick/archive/tags/security/" /></entry><entry><title>Bulk update of TFS Areas with ICommonStructureService</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/jampick/archive/2009/06/06/bulk-update-of-tfs-areas-with-icommonstructureservice.aspx" /><id>http://blogs.msdn.com/b/jampick/archive/2009/06/06/bulk-update-of-tfs-areas-with-icommonstructureservice.aspx</id><published>2009-06-07T00:48:45Z</published><updated>2009-06-07T00:48:45Z</updated><content type="html">&lt;p&gt;I recently had to create an area tree, in a TFS project, with&amp;#160; large number (500+) of nodes.&amp;#160; I was not looking forward to doing this manually.&amp;#160; I had the area tree that I needed to create in a comma delimited (CSV) file so I looked around online to see if someone had a utility I could use to import the areas paths in a csv file and add these as new TFS areas in a project.&amp;#160; &lt;/p&gt;  &lt;p&gt;The TFS community online is so great.&amp;#160; But this time I could not find anything really close to what I was looking for.&amp;#160; I list some good blog posts at the end of this post that got me started using&amp;#160; ICommonStructureService.&amp;#160; &lt;/p&gt;  &lt;p&gt;With these leads I created the below command line utility that will consume a file with your areas and add them as areas in your particular TFS project.&lt;/p&gt;  &lt;p&gt;You should be able to cut and paste the code below being sure to reference the following assemblies as well.&lt;/p&gt;  &lt;p&gt;Microsoft.TeamFoundation.dll   &lt;br /&gt;Microsoft.TeamFoundation.Client.dll    &lt;br /&gt;Microsoft.TeamFoundation.Common.dll    &lt;br /&gt;Microsoft.TeamFoundation.Server.dll    &lt;br /&gt;Microsoft.TeamFoundation.WorkItemTracking.Client.dll&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;Input CSV format example&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Parent,Area1,SubArea1   &lt;br /&gt;Parent,Area1,SubArea2    &lt;br /&gt;Parent,Area2,SubArea1&lt;/p&gt;  &lt;p&gt;&lt;u&gt;&lt;strong&gt;Sample syntax&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;TFSAreaTool.exe [TFS Server] [TFS Project] [input csv file]&lt;/p&gt;  &lt;p&gt;example: TFSAreaTool.exe &lt;a href="http://TFSRTM08:8080"&gt;http://TFSRTM08:8080&lt;/a&gt; sandbox &amp;quot;Feature Areas.csv&amp;quot;&lt;/p&gt;  &lt;p&gt;&lt;u&gt;&lt;strong&gt;Code&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;using System;     &lt;br /&gt;using System.IO;      &lt;br /&gt;using System.Text.RegularExpressions;      &lt;br /&gt;using Microsoft.TeamFoundation.Client;      &lt;br /&gt;using Microsoft.TeamFoundation.Server; &lt;/p&gt;    &lt;p&gt;namespace TFSAreaTool     &lt;br /&gt;{      &lt;br /&gt;&amp;#160; class Program      &lt;br /&gt;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; static int Main(string[] args)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //check and set required parameters      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (args.Length &amp;lt; 3)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; showSyntax();      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return 1;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; string tfsServer = args[0].Trim();      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; string tfsProject = args[1].Trim();      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; string inputFile = args[2].Trim();      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; string line; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //connect to TFS     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; TeamFoundationServer tfs = null;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; try      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Console.WriteLine(&amp;quot;Connecting to &amp;quot; + tfsServer);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; tfs = TeamFoundationServerFactory.GetServer(tfsServer);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; catch (Exception e)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Console.WriteLine(&amp;quot;Error: &amp;quot; + e.Message);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return 2;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //use ICommonStructureService to access area nodes     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ICommonStructureService m_css = null;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; try      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Console.WriteLine(&amp;quot;Connecting to structure service&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; m_css = (ICommonStructureService)tfs.GetService(typeof(ICommonStructureService));      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; catch (Exception e)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Console.WriteLine(&amp;quot;Error: &amp;quot; + e.Message);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return 3;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //iterate through input file with list of areas      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; StreamReader sr = null ;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; try      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Console.WriteLine(&amp;quot;Reading input file &amp;quot; + inputFile);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sr = new StreamReader(inputFile);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; catch (Exception e)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Console.WriteLine(&amp;quot;Error: &amp;quot; + e.Message);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return 4;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; while (!sr.EndOfStream)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; line = sr.ReadLine();      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; string[] areas&amp;#160; = Regex.Split(line, &amp;quot;,&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //start with top level area path as parent      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; string parentPath = tfsProject + &amp;quot;\\area&amp;quot; ; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //iterate through areas listed in input file     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; foreach (string area in areas)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; createArea(area, parentPath, m_css); &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //parent path for next iteration is the node that we just created     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; parentPath = parentPath + &amp;quot;\\&amp;quot; + area;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; parentPath = null; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sr.Close();      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; m_css = null;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; tfs = null;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return 0;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; static void createArea(string areaNode, string parentPath, ICommonStructureService m_css)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; String node = null;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; try      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Console.WriteLine(&amp;quot;Create Area:&amp;#160;&amp;#160; &amp;quot; + parentPath + &amp;quot;\\&amp;quot; + areaNode) ;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; node = m_css.CreateNode(areaNode, m_css.GetNodeFromPath(parentPath).Uri);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; catch      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //any duplicate area paths will catch here.&amp;#160; May be good to post a warning      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; static void showSyntax()      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Console.WriteLine(&amp;quot;TFSAreaTool creates TFS Area tree based on CSV formatted input file.&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Console.WriteLine();      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Console.WriteLine(&amp;quot;Input file example:&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Console.WriteLine(&amp;quot;Parent,area1.0,area1.1,area1.11&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Console.WriteLine(&amp;quot;Parent,area1.0,area1.1,area1.12&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Console.WriteLine(&amp;quot;Parent,area2.0,area2.1,area2.11&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Console.WriteLine();      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Console.WriteLine(&amp;quot;Syntax: -[TFS Server] [project] [areas list file]&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Console.WriteLine();      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Console.WriteLine(&amp;quot;Example: tfsareatool.exe &lt;a href="http://myTFSServer:8080"&gt;http://myTFSServer:8080&lt;/a&gt; SANDBOX areas.csv&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160; }      &lt;br /&gt;} &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;Caveats&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;The catch block in the createArea method catches attempts to create areas that have already been created or fail to be created.&amp;#160; Some additional handling here would be helpful.&lt;/p&gt;  &lt;p&gt;Also note, if an area is created already this catch block with activate and your existing area will persist.&amp;#160; This means you can run this script multiple times if needed to add on to your area tree without losing any existing area information.&lt;/p&gt;  &lt;p&gt;&lt;u&gt;&lt;strong&gt;Links to related blog posts&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="http://blog.benday.com/archive/2007/07/24/23153.aspx" href="http://blog.benday.com/archive/2007/07/24/23153.aspx"&gt;http://blog.benday.com/archive/2007/07/24/23153.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="http://blogs.microsoft.co.il/blogs/shair/archive/2009/01/30/tfs-api-part-10-add-area-iteration-programmatically.aspx" href="http://blogs.microsoft.co.il/blogs/shair/archive/2009/01/30/tfs-api-part-10-add-area-iteration-programmatically.aspx"&gt;http://blogs.microsoft.co.il/blogs/shair/archive/2009/01/30/tfs-api-part-10-add-area-iteration-programmatically.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="http://blogs.msdn.com/bharry/archive/2006/08/28/728333.aspx" href="http://blogs.msdn.com/bharry/archive/2006/08/28/728333.aspx"&gt;http://blogs.msdn.com/bharry/archive/2006/08/28/728333.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;Conclusion&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;I hope you find this saved you a bit of time when doing a bulk import of TFS project areas.&amp;#160; Enjoy!&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9703096" width="1" height="1"&gt;</content><author><name>jampick</name><uri>http://blogs.msdn.com/jampick/ProfileUrlRedirect.ashx</uri></author><category term="TFS" scheme="http://blogs.msdn.com/b/jampick/archive/tags/TFS/" /><category term="Project Management" scheme="http://blogs.msdn.com/b/jampick/archive/tags/Project+Management/" /></entry><entry><title>Windows Server 2008 Hyper-V + TFS Build</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/jampick/archive/2009/04/28/windows-server-2008-hyper-v-tfs-build.aspx" /><id>http://blogs.msdn.com/b/jampick/archive/2009/04/28/windows-server-2008-hyper-v-tfs-build.aspx</id><published>2009-04-28T17:56:34Z</published><updated>2009-04-28T17:56:34Z</updated><content type="html">&lt;p&gt;My colleague, Ian Ceicys (&lt;a title="http://blogs.msdn.com/iceicys/" href="http://blogs.msdn.com/iceicys/"&gt;http://blogs.msdn.com/iceicys/&lt;/a&gt;) just pointed me to a great book on Windows Server Hyper-V.&amp;#160; I’ve been a been late ramping up on this server role so I’m excited to get caught up.&amp;#160; I’m reading this now &lt;a href="http://www.amazon.com/gp/product/0470440961"&gt;Windows Server 2008 Hyper-V: Insiders Guide to Microsoft's Hypervisor: John Kelbley, Mike Sterling, Allen Stewart: Books&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;My first thought is how useful Hyper-V running on a build machine could be to enable isolated testing on the build machine.&amp;#160; I’ve always been bothered by how little utilization most build machines have.&amp;#160; With Hyper-V running on a build machine it would be interesting to spin up virtual machines to test the product of the build.&amp;#160; On a test failure we could save off the VM for debugging later.&amp;#160; All this without tainting the build machine.&lt;/p&gt;  &lt;p&gt;Something to think about.&amp;#160; I’ll be installing Windows Server Hyper-V in the next few weeks to explore this more.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9573668" width="1" height="1"&gt;</content><author><name>jampick</name><uri>http://blogs.msdn.com/jampick/ProfileUrlRedirect.ashx</uri></author><category term="TFS" scheme="http://blogs.msdn.com/b/jampick/archive/tags/TFS/" /></entry><entry><title>Team Explorer cache cleaning</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/jampick/archive/2009/02/26/team-explorer-cache-cleaning.aspx" /><id>http://blogs.msdn.com/b/jampick/archive/2009/02/26/team-explorer-cache-cleaning.aspx</id><published>2009-02-26T21:51:09Z</published><updated>2009-02-26T21:51:09Z</updated><content type="html">&lt;p&gt;When switching between TFS servers (i.e. different servers not TFS projects) there can be data that is cached between projects on the 2 servers leading to some confusion in the Team Explorer UI that makes is appear you have not really changes servers.&amp;#160; &lt;/p&gt;  &lt;p&gt;This information applies to both TFS 2005/2008.&amp;#160; I’m not sure how this behavior will change in the 2010 release and beyond.&lt;/p&gt;  &lt;p&gt;To preempt any problems related to caching you may want to follow steps below when changing between TFS servers.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;u&gt;Changing between TFS Servers&lt;/u&gt;&lt;/b&gt;    &lt;table border="0" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td valign="top" width="319"&gt;           &lt;p&gt;In Team Explorer disconnect from the existing TFS server.&amp;#160; In Team Explorer -&amp;gt;Right click server-&amp;gt;select disconnect &lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="319"&gt;           &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/jampick/WindowsLiveWriter/TeamExplorercachecleaning_9888/clip_image002_2.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image002" border="0" hspace="12" alt="clip_image002" src="http://blogs.msdn.com/blogfiles/jampick/WindowsLiveWriter/TeamExplorercachecleaning_9888/clip_image002_thumb.jpg" width="244" height="196" /&gt;&lt;/a&gt;&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="319"&gt;           &lt;p&gt;Close Team Explorer/Visual Studio&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="319"&gt;&amp;#160;&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="319"&gt;           &lt;p&gt;Remove the Team Foundation local cache&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="319"&gt;           &lt;p&gt;1. cd &amp;quot;%userprofile%\local settings\application data\Microsoft\team foundation\2.0&amp;quot;&lt;/p&gt;            &lt;p&gt;2. rd /s /q cache&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="319"&gt;           &lt;p&gt;Restart Team Explorer/Visual Studio&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="319"&gt;&amp;#160;&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="319"&gt;           &lt;p&gt;Connect to new TFS server&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="319"&gt;           &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/jampick/WindowsLiveWriter/TeamExplorercachecleaning_9888/clip_image003_2.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image003" border="0" alt="clip_image003" src="http://blogs.msdn.com/blogfiles/jampick/WindowsLiveWriter/TeamExplorercachecleaning_9888/clip_image003_thumb.jpg" width="227" height="133" /&gt;&lt;/a&gt;&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;  &lt;p&gt;This can be especially important if you are switching between a production and test Team Foundation Servers that have similar data.&amp;#160; &lt;/p&gt;  &lt;p&gt;There is no worse feeling that realizing that destructive change you thought you made in the test environment was made in production.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9447089" width="1" height="1"&gt;</content><author><name>jampick</name><uri>http://blogs.msdn.com/jampick/ProfileUrlRedirect.ashx</uri></author><category term="Team Explorer" scheme="http://blogs.msdn.com/b/jampick/archive/tags/Team+Explorer/" /></entry><entry><title>TechReady 8 in Seattle</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/jampick/archive/2009/02/02/techready-8-in-seattle.aspx" /><id>http://blogs.msdn.com/b/jampick/archive/2009/02/02/techready-8-in-seattle.aspx</id><published>2009-02-02T05:01:54Z</published><updated>2009-02-02T05:01:54Z</updated><content type="html">&lt;p&gt;If you are attending the Microsoft technical readiness (TechReady) conference this week in Seattle please drop by one of my sessions below.&amp;#160; I’ll be speaking with Mario Rodriguez, from the Visual Studio team, about source code branch requirements, strategies and execution in TFS.&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;DEVCT311-R1&amp;#160; VSTS Rangers TFS Branching howto&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Thursday, February 5, 12:45 - 14:00, (WSCTC) 206&amp;#160; &lt;br /&gt;Friday, February 6, 13:00 - 14:15, (WSCTC) 206 &lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Primary Track: Development Tools &amp;amp; Technologies   &lt;br /&gt;Session Type: Chalk Talk    &lt;br /&gt;Speaker(s): James Pickell, Mario Rodriguez    &lt;br /&gt;&lt;b&gt;Abstract:&lt;/b&gt; Learn how to use TFS branching structures from basic to advanced in this educational and hands on session    &lt;br /&gt;&lt;b&gt;Objectives:&lt;/b&gt; 1. identify branching requirements. 2. describe the most frequently used TFS branching strategy. 3. execute common branching scenarios.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9389063" width="1" height="1"&gt;</content><author><name>jampick</name><uri>http://blogs.msdn.com/jampick/ProfileUrlRedirect.ashx</uri></author><category term="branching" scheme="http://blogs.msdn.com/b/jampick/archive/tags/branching/" /><category term="TechReady 8" scheme="http://blogs.msdn.com/b/jampick/archive/tags/TechReady+8/" /></entry></feed>