<?xml version="1.0"?><?xml-stylesheet type="text/xsl" href="http://www.codeplex.com/rss.xsl"?><rss version="2.0"><channel><title>Microsoft Team Foundation Server Branching Guidance</title><link>http://www.codeplex.com/BranchingGuidance/Project/ProjectRss.aspx</link><description>Microsoft Team Foundation Server Branching Guidance</description><item><title>NEW POST: Concurrent Development with single integration line</title><link>http://www.codeplex.com/BranchingGuidance/Thread/View.aspx?ThreadId=14794</link><description>&lt;div class="wikidoc"&gt;
After reading this article, (and several others) I have a confusion that persists.&lt;br /&gt; &lt;br /&gt;Perhaps I don't understand the intended scope of the dev..main..prod line, or perhaps I don't see the big picture. I see how this idea facilitates isolating development at the dev branch, but with a single integration branch, it does not isolate concurrent releases.&lt;br /&gt; &lt;br /&gt;I see that the releases are branched under production, and this seems fine when the release has already been RELEASED.&lt;br /&gt; &lt;br /&gt;In our environment, we may have several targets (v.1 v.2 v.3) where 1 is in current development and being released in time (v.1 v.1.1 v.1.2) but continuous to evolve at the current time. During this time version 2 may have some development to get it ready for beta. Code from v1 will be rolled into v2. But with a single integration line, we can never integrate v2 into main while v1 is still being working on in the dev and main lines.&lt;br /&gt; &lt;br /&gt;It seems to me that either I've missed the scope of this line (maybe its much more micro than I think) or there needs to be several dev..main..prod lines off of some higher branch...&lt;br /&gt; &lt;br /&gt;The second part I don't follow is this...&lt;br /&gt; &lt;br /&gt;With a single production line how do you support multiple releases? I can see dev happening on the release 1 branch under production, but how does that code get back into sqa and release? Is the intent to create another dev..prod line under release 1 ?&lt;br /&gt; &lt;br /&gt;It seems that the idea of an isolated dev..main..production is the entire point and reason for code isolation, but it &amp;quot;seems&amp;quot; to fall apart once you add any complexity. Why is it so important in the beginning, but not for maint of a release, or for dev of next beta.&lt;br /&gt; &lt;br /&gt;Thank you for your time...  one day here I'll wake up in the morning and it will dawn on me I'm sure!&lt;br /&gt; &lt;br /&gt;
&lt;/div&gt;</description><author>etropic</author><pubDate>Thu, 06 Sep 2007 15:28:31 GMT</pubDate><guid isPermaLink="false">NEW POST: Concurrent Development with single integration line 20070906032831P</guid></item><item><title>NEW POST: Blocking branches</title><link>http://www.codeplex.com/BranchingGuidance/Thread/View.aspx?ThreadId=12935</link><description>&lt;div class="wikidoc"&gt;
Hi,&lt;br /&gt; &lt;br /&gt;I was wondering if there's some configuration to block certain branches during certain time of the development process. For example, my PROD branch should not be accessible for editing or merging until we reach the due date of new release. We've been having troubles with branch merging, mixing code up and having troubles when trying to fix it. I don't know if that solution could be possible. Maybe, instead of blocking, if there's some way to unable certain branches, that would be useful for me too. Thanks in advance.&lt;br /&gt; &lt;br /&gt;Greetings,&lt;br /&gt; &lt;br /&gt;C&amp;#233;sar Campos&lt;br /&gt;
&lt;/div&gt;</description><author>cesar5974314</author><pubDate>Mon, 23 Jul 2007 20:04:02 GMT</pubDate><guid isPermaLink="false">NEW POST: Blocking branches 20070723080402P</guid></item><item><title>NEW POST: Feature Branch Life Cycle</title><link>http://www.codeplex.com/BranchingGuidance/Thread/View.aspx?ThreadId=8801</link><description>&lt;div class="wikidoc"&gt;
I don't know about that.  I had assume that you delete the branch when the feature is complete.  One of the items in the anti-patterns section of the document reads that you might have a problem if you have branch that stays around for a long time, but its purpose keeps changing.  &lt;br /&gt; &lt;br /&gt;What to do probably depends upon your environment as well.  I work in a small shop, where it is very possible that one developer might work on more than one feature at the same time.  It could get a little confusing to have generically named feature branches when you are regularly changing hats (&amp;quot;Ok, today I am working on wonder-widget, is that FB1 or FB2??  Wait, wasn't FB2 the percalator feature??&amp;quot;)&lt;br /&gt;
&lt;/div&gt;</description><author>jmarsch</author><pubDate>Thu, 19 Jul 2007 17:05:23 GMT</pubDate><guid isPermaLink="false">NEW POST: Feature Branch Life Cycle 20070719050523P</guid></item><item><title>NEW POST: Bugfixing</title><link>http://www.codeplex.com/BranchingGuidance/Thread/View.aspx?ThreadId=11431</link><description>&lt;div class="wikidoc"&gt;
After reading the Branching Guidance, it's still unclear to me how to incorporate and control bugfixes. For instance, after a release is done, we have a read-only safekeeping branch for release 1.0. When a bug is discovered in 1.0, where do we go from there? Do we open up the safekeeping branch? Do we do the fix in Production and then try to isolate the dll's or exe's that needs to be distributed as a hotfix? I guess there are two paths, if the bugfix is critical it would need to end up as some sort of hotfix or patch, if not it would make its way into the next release. Any advice on how to properly manage this? A few real-life examples would be great.&lt;br /&gt;
&lt;/div&gt;</description><author>amossin</author><pubDate>Fri, 15 Jun 2007 08:21:06 GMT</pubDate><guid isPermaLink="false">NEW POST: Bugfixing 20070615082106A</guid></item><item><title>NEW POST: Real-life scenarios</title><link>http://www.codeplex.com/BranchingGuidance/Thread/View.aspx?ThreadId=11430</link><description>&lt;div class="wikidoc"&gt;
The Branching Guidance has been a tremendous help for my company, in helping us to set up branches and builds in a meaningful way. However, for inexperienced users such as myself, I would very much like to see the addition of a few real-life scenarios. Either adding to the guide, or just as a discussion, would somebody be willing to share some insight into the real-world setups they have? I'm hoping this discussion can shed some light on some of the more practical aspects of branching, especially for small and inexperienced companies.&lt;br /&gt; &lt;br /&gt;I can start off the discussion by sharing my first experience with branching in general, and this guide in particular. I will assume you have read the Guidance, and will frequently refer to concepts from it.&lt;br /&gt; &lt;br /&gt;The company I work for is a small (5 developers) software vendor (enterprise search), and two weeks ago we had no branches, no formal releases, really ad-hoc builds, some unhappy customers, big versioning troubles, dll-hell...you probably get my drift. Our biggest challenge at this point is maintaining old releases (since we don't have any formal releases...), and controlling the quality of what gets delivered to customers. Most of the people I work with have no or limited experience with a professional build environment, and nobody have really cared until now. I have been wanting to do something about the situation in order to increase the quality of our product, and make our customers more happy with what we deliver. So I stumbled upon the Branching Guidance, and started to work out a strategy for how we were gonna do branching and versioning or our source code.&lt;br /&gt; &lt;br /&gt;Being a really small company, I decided to go with a simple approach, similar to the first one described in the Guidance, consisting of three branches in addition to read-only safekeeping branches. Frankly, at this point I can't clearly understand the difference between an isolation strategy and a branching strategy. Is there a difference? To be honest, I don't see the need for a strategy at this point, because our first goal is just to have a proper release and versioning of our source code. Anyway, I believe we are using the branching strategy &amp;quot;Branch per component&amp;quot;, because we are only two or three developers working on the component, and I don't think there needs to be a feature branch or a release branch for that.&lt;br /&gt; &lt;br /&gt;I'm gonna start being a little more specific now, hopefully helping out others who are at the same stage. Our existing code base was branched into a new team project, under a folder called Development. This is now our development branch, so I setup a team build running unit tests (using the Test Tools Build Task which runs all unit tests in the solution, so that I didn't have to keep maintaining a test list). I created a new solution for the build called &amp;lt;ProductName&amp;gt;.Development.sln, the idea being to have a separate solution for each branch. In retrospect, I don't know if this is such a great idea, since I now wouldn't want to branch the dev-solution into Main. Do any others have experience or advice on how to do this? &lt;br /&gt; &lt;br /&gt;This is as far as I've gotten, keep in mind I started the whole process about a week ago... At this point, I am going to ask all our developers to check in any changes they have in our old branch, and moving everyone over to the new, official Development branch. The old branch will be locked down for a little while, and then deleted when we are completely sure everything is in order. So the next step is going to be creating the Main branch. I'll do this by branching out Development, and then doing the same from Main to Production. I will be the only one with rights to check into Main and Production, and for a while I expect there to be no or little difference between the two. When this is done, I hopefully have a basic setup that will help us to better control our source code and enable proper releases and versions of our product. Then we will start planning and working towards our first proper release, following as much of the Guidance as we can along the way. Any advice would be greatly appreciated at this point.&lt;br /&gt; &lt;br /&gt;So, please share &lt;i&gt;your&lt;/i&gt; real-life scenarios and troubles, and let's help each other out!&lt;br /&gt;
&lt;/div&gt;</description><author>amossin</author><pubDate>Fri, 15 Jun 2007 08:12:25 GMT</pubDate><guid isPermaLink="false">NEW POST: Real-life scenarios 20070615081225A</guid></item><item><title>NEW POST: Feature Branch Life Cycle</title><link>http://www.codeplex.com/BranchingGuidance/Thread/View.aspx?ThreadId=8801</link><description>&lt;div class="wikidoc"&gt;
From the naming in the whitepaper I assume the recommended practice is to use general names for FBs and re-use these after a feature has been reverse-merged into MAIN. Bugfixes from that point on must be made in MAIN (or a RELEASE-Branch), as the feature is now part of a release&lt;br /&gt;
&lt;/div&gt;</description><author>uTILLIty</author><pubDate>Mon, 07 May 2007 06:01:52 GMT</pubDate><guid isPermaLink="false">NEW POST: Feature Branch Life Cycle 20070507060152A</guid></item><item><title>NEW POST: When to start feature-branches</title><link>http://www.codeplex.com/BranchingGuidance/Thread/View.aspx?ThreadId=9937</link><description>&lt;div class="wikidoc"&gt;
For a web-application, for example, there must be a base already, for feature-branches to make sense. Or would you recommend counting the whole website as a &amp;quot;feature&amp;quot;, and only additional satellite-dlls and applications to be counted as a feature?&lt;br /&gt;
&lt;/div&gt;</description><author>uTILLIty</author><pubDate>Mon, 07 May 2007 05:58:33 GMT</pubDate><guid isPermaLink="false">NEW POST: When to start feature-branches 20070507055833A</guid></item><item><title>UPDATED WIKI: Guidance for Structuring Team Projects</title><link>http://www.codeplex.com/BranchingGuidance/Wiki/View.aspx?title=Guidance for Structuring Team Projects&amp;version=22</link><description>&lt;div class="wikidoc"&gt;
&lt;img src="http://www.codeplex.com/BranchingGuidance/Project/FileDownload.aspx?DownloadId=11243" alt="VSTSLogo.gif" /&gt;&lt;br /&gt; &lt;br /&gt;&lt;h1&gt;
Guidance for Structuring Team Projects
&lt;/h1&gt;- &lt;i&gt;Doug Neumann&lt;/i&gt; - &lt;i&gt;Microsoft Corporation&lt;/i&gt;&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Introduction
&lt;/h2&gt;One of the most important considerations when looking to deploy Team Foundation Server within your organization is how you will employ the “Team Project” concept.  It can be very tempting to jump in and immediately start creating Team Projects to satisfy every whim of the users in your organization.  However, restructuring existing team projects is difficult to accomplish, so establishing a strategy for using team projects up front is very important.  Careful forethought now can save you much pain down the road.&lt;br /&gt;This whitepaper provides details on the components of a team project and discusses how those components may impact your decision about structuring your team projects.  It also lays out a set of common strategies for employing team projects.  Understanding this base of knowledge should empower you to make the best decision on how your organization will use team projects with Team Foundation Server (TFS).&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
What is a Team Project?
&lt;/h2&gt;A TFS Team Project is a collection of artifacts that is used by a team of individuals to perform and track a related set of work.  All artifacts stored in TFS belong to one and only one Team Project, and you cannot begin working in TFS until you have created at least one Team Project.  Team Projects are created by a TFS administrator using the Team Project Creation Wizard.&lt;br /&gt;The initial settings of a team project are governed by a process template.  This template configures a new team project in accordance with a specific software development methodology that the people working on the team project will follow.  TFS ships with support for two software development methodologies, but additional process templates can be added to the system, and all process templates can be extensively customized to fit the needs of your organization. &lt;br /&gt; &lt;br /&gt;&lt;h3&gt;
Components of a Team Project
&lt;/h3&gt;Understanding artifacts being leveraged within your organization, the need for cross-organizational sharing of artifacts, and the available strategies for sharing TFS artifacts across team projects will lead you to the best decision about how to structure your team projects.  The following table outlines the list of artifacts managed by TFS and the capabilities for sharing those artifacts between team projects.&lt;br /&gt; &lt;br /&gt;&lt;table&gt;
&lt;tr&gt;
&lt;th&gt; Artifacts &amp;amp; Settings &lt;/th&gt;&lt;th&gt; Description &lt;/th&gt;&lt;th&gt; Considerations for Structuring Team Projects &lt;/th&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Source Code &lt;/td&gt;&lt;td&gt; TFS manages your source code in its version control system.  Each team project creates a top-level folder in the version control folder hierarchy and no other files or folders can be created in the root of the version control folder hierarchy.  Every item created underneath a team project folder is “owned” by that team project. &lt;/td&gt;&lt;td&gt; Source code can be shared between team projects in various ways, including branching source from one team project into another and mapping source from another team into your workspace.  TFS does not support the Visual SourceSafe style of file sharing where a single file can be manifested in multiple locations within the version control repository. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Work Items &lt;/td&gt;&lt;td&gt; Instances of work item types allow you to define and track the work being performed within your organization.  When a new team project is established, an initial set of work items is created for you as defined in the process template used for that team project. &lt;/td&gt;&lt;td&gt; A work item belongs to the team project in which it was created and cannot be moved to another team project.  Work items can, however, be copied to another team project, at which time the fields in the newly created work item are pre-populated with the value of the corresponding fields in the source work item.  Currently, there is no mechanism for bulk-copying work items between team projects in TFS. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Work Item Types &lt;/td&gt;&lt;td&gt; The fields, form, and workflow of a TFS work item is governed by an XML definition known as the work item type.  Work item types are defined in the process template used to create a team project and can be customized as necessary after the team project is created. &lt;/td&gt;&lt;td&gt; If you plan to track work across multiple projects using the reporting mechanisms in TFS, you’ll need to ensure sufficient consistency in the work items defined in those team projects.  They do not need to be identical, but they need to share the set of fields being leveraged for these reports. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Work Item Queries &lt;/td&gt;&lt;td&gt; TFS persists a set of work item queries that provide a mechanism for team members to share views of the team’s work. &lt;/td&gt;&lt;td&gt; There is no way to structure work item queries in TFS beyond declaring them as Team queries or “My” queries.  Large team projects with a lot of queries can make it difficult to find the queries users are interested in.  This may encourage a more granular team project structure to minimize the number of queries that a single team project contains. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Team Build Types &lt;/td&gt;&lt;td&gt; Automated build definitions in TFS allow you to execute a build of your application(s) in a reproducible manner.  Each team project has a collection of build “types” associated with it.  Build types are persisted as files in the version control system. &lt;/td&gt;&lt;td&gt; By default, a single build type can only compile source from the team project in which it exists, however it is possible to &lt;a href="http://blogs.msdn.com/manishagarwal/archive/2005/12/22/506635.aspx" class="externalLink"&gt; modify the build definition to enlist source from outside of the team project&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Reports &lt;/td&gt;&lt;td&gt; Each team project creates a reporting site in SQL Reporting Services and a collection of reports that report on the progress and activity within that Team Project. &lt;/td&gt;&lt;td&gt; The data for all team projects on a given TFS exists in the same data warehouse, so it is possible to create custom reports that span multiple team projects.  However, the reports included with TFS provide only a single-project view. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Team Portal &lt;/td&gt;&lt;td&gt; Each team project creates a Windows SharePoint Services portal to be used for collaborating within that team. &lt;/td&gt;&lt;td&gt; Team projects cannot share the same team portal, however if teams wish to collaborate with each other using the same portal, they can easily agree to use the portal created for one of the teams.  SharePoint portals maintain their own set of security permissions if it’s necessary to govern portal permissions differently than other TFS permissions. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Process Guidance &lt;/td&gt;&lt;td&gt; Each team project portal contains a collection of web pages to provide guidance about how to follow the software development process being utilized. &lt;/td&gt;&lt;td&gt; Only one set of guidance exists for a given team project, however this typically does not influence the decision on how to structure team projects. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Area and Iteration Classifications &lt;/td&gt;&lt;td&gt; Area and iteration classifications provide a mechanism for you to decompose your application functionality and project timeline respectively.  These classifications can then be applied to work items and other artifacts to make it easier to find the artifacts that are appropriate for a given area of the application or iteration of the timeline. &lt;/td&gt;&lt;td&gt; Area and iteration classifications are completely contained within the team project in which they are defined and cannot be shared between team projects.  It is possible to manually replicate the area and iteration classifications between team projects if necessary.  Also, the initial area and iteration hierarchy can be defined in the process template if standardization across team projects is desired. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Security Groups &lt;/td&gt;&lt;td&gt; TFS provides a mechanism for aggregating users into security groups for the purpose of controlling access to the system.  Groups are defined at the server scope as well as the team project scope.  TFS security groups can aggregate Windows user accounts, Windows groups and other TFS groups. &lt;/td&gt;&lt;td&gt; The security groups mechanism in TFS is quite flexible and is unlikely to influence your team project structure. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Check-in Policies &lt;/td&gt;&lt;td&gt; Checkin policies provide a mechanism for validating user changes to source code before they are committed to the system.  Every team project defines a set of checkin policies that will apply to checkins in that team project. &lt;/td&gt;&lt;td&gt; Checkin policies cannot span multiple team projects, however policy definitions can be manually replicated to other team projects.  Furthermore, checkin policies cannot be scoped to a subsection of the team project source, making it sometimes difficult to work with checkin policies when a team project contains a multitude of subteams.  The Team Foundation Power Tools contain a checkin policy that can be used to scope other checkin policies to specific areas of the source tree. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Exclusive Check-out &lt;/td&gt;&lt;td&gt; A team project can specify whether files in version control will be locked when checked out or remain available for additional parallel checkouts. &lt;/td&gt;&lt;td&gt; Because the exclusive checkout setting is scoped to the entire team project, sub-teams wishing to work differently will need to come to an agreement about whether or not they’ll enable this feature. &lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt; &lt;br /&gt;&lt;h3&gt;
Team Project Scalability
&lt;/h3&gt;For some customers, the most important consideration in structuring team projects is the number of team projects that can co-exist on a TFS without significantly hindering server performance.  Scalability of team projects is limited by the complexity of the work item types defined on the server.  The work item types included in MSF for Agile Software Development have been shown to scale to support 500 team projects on a server.  Similar testing with the work items in MSF for CMMI Process Improvement have been shown to support 250 team projects on a server.  For more information about team project scalability, go &lt;a href="http://msdn2.microsoft.com/en-us/library/aa974183(vs.80).aspx" class="externalLink"&gt;here&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Strategies for Employing Team Projects
&lt;/h2&gt;There is no one right way to structure your team projects, and your needs may change as your software development process evolves.  That being said, there are 3 common strategies used to structure team projects.  You may find that one of these strategies fills the needs of your organization or that you’ll choose a combination of these strategies as appropriate for the nature of your work.&lt;br /&gt; &lt;br /&gt;&lt;h3&gt;
Strategy 1: Team Project Per Application
&lt;/h3&gt;The most common strategy for creating team projects is to create one for each application under development.  This strategy can support both large and small applications, as well as multiple releases of applications being developed in parallel.  Various releases of the application are manifested in the version control system as source branches, and in other parts of TFS as different nodes in the iteration classification hierarchy.  If appropriate, documentation for each release that is stored in the SharePoint portal can be managed in different document libraries.&lt;br /&gt;Following this strategy greatly simplifies the process of moving requirements, features, scenarios, and bugs between releases.  When an item needs to be pushed out or brought it, it is signified by simply changing the iteration path to reflect the new target release.&lt;br /&gt;The biggest drawback to this strategy is that the software development process for all releases of the application are tightly bound.  For example, two releases of an application being developed in parallel would need to use the same work item types, the same checkin policies, and follow the same process guidance.&lt;br /&gt;Another potential drawback is that you may need to customize the reports included with your process template to get an appropriate view of what is happening in a given release.  Most reports included with the common process templates provide a team-project-wide view of what is happening; to get a view that is focused on a single release, you may need to add additional filtering for that release.&lt;br /&gt;Over the course of multiple releases, you may find that your team project for a given application has developed a lot of “baggage.”  This could include old work items that are no longer needed, old specs on the portal that should have been discarded, or old data in the data warehouse that could cloud your view of team progress.  Additionally, you may decide at some point that you’d like to change your software development methodology and desire to retool your team project to support that methodology.  At that time, you may find it is appropriate to create a new team project for this application, starting clean with a new process template, a new set of work items and a new project portal.  You can then branch source from the previous team project to the new one, and copy work items as appropriate to the new team project.&lt;br /&gt;Finally, an organization managing hundreds of small applications may eventually reach the scalability limits of TFS.  For more information, see the previous subject on Team Project Scalability.&lt;br /&gt; &lt;br /&gt;&lt;h3&gt;
Strategy 2: Team Project Per Release
&lt;/h3&gt;In the “Team Project Per Release” strategy, every major application release starts a new team project.  This strategy works well for very large teams who are often working on long-term projects.  For these teams, a major release is an opportunity to start clean with a new team project that doesn’t carry forward any baggage from the previous release.  By starting with a new team project they can also select a different process template that supports a different development methodology than they had previously followed.  They can also selectively move forward artifacts from the previous release to eliminate some of the baggage frequently left over from a multi-year effort.  The team project from the current release can continue to be leveraged for maintenance activities on the release, potentially with a different team that is responsible for sustaining engineering.&lt;br /&gt;The primary disadvantage with this strategy lies in the difficulty of moving data forward from one team project to the next.  It is relatively easy to move source code between team projects, typically by branching the source into the new team project.  Moving work items forward, however, is more difficult.  TFS provides the ability to copy a work item from one team project to another, but that only works on one work item at a time.  To copy a set of work items between team projects, you would need to write your own custom utility with the TFS object model.&lt;br /&gt;Server scalability can also be a concern with this model, however usually organizations engaged in these projects find they are managing a few large efforts rather than many small efforts.  The server scalability concerns related to structuring your team projects only come into play when managing hundreds of team projects on a Team Foundation Server.  For specific scalability numbers, see the previous subject on Team Project Scalability.&lt;br /&gt; &lt;br /&gt;&lt;h3&gt;
Strategy 3: Team Project Per Team
&lt;/h3&gt;For a few customers, the best way to structure team projects is to align them with the team boundaries in their organization.  This strategy closely aligns a team with the workflows defined in TFS work item types and provides a unit of reporting that spans the entire team.  For customers looking to centrally control and monitor the activities of software development teams, this may be the best approach.&lt;br /&gt;This strategy can be a necessity when encountering the team project scalability limitations discussed previously.  Organizations that manage several hundred applications may find that they need to group applications together under a fewer number of team projects.  An appropriate criteria for grouping these applications is frequently to cluster together applications developed by the same team.&lt;br /&gt;The primary disadvantage of this approach is that it precludes specialization of the software development process for a particular application or release.  If one application in an organization needs a new field on a work item type, all applications will get that new field.  Additionally, reports that show timeline details of the team project lose their value if the applications managed in the team project are not working toward the same timeline.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Providing Substructure Within a Team Project
&lt;/h2&gt;Regardless of the strategy you choose, you will need to provide some level of substructure to your team project.  If you select the team project per application model, you may need to create substructure for each release.  If you are working on a very large application and select the team project per release model, you may need to establish substructure for subcomponents of the application.  And if you select the team project per team model, you will probably need to establish substructure for the applications that the team works on.&lt;br /&gt;The mechanisms for providing substructure depend on the type of artifact being managed.  The following table discusses the substructure mechanisms for the artifacts and settings discussed previously.&lt;br /&gt; &lt;br /&gt;&lt;table&gt;
&lt;tr&gt;
&lt;th&gt; Artifacts &amp;amp; Settings &lt;/th&gt;&lt;th&gt; Substructure Mechanisms &lt;/th&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Source Code &lt;/td&gt;&lt;td&gt; The top level structure for source code within a team project is typically a “branch.”  Branches in TFS appear as copies of the files and folders they are branched from.  Frequently, the first thing you’ll do in source control for a new team project is to create a new folder with a name like “main” that constitutes the main branch for your source.  Future branches would likely be made using that folder as the source.  Within a branch, structure is typically provided with a folder hierarchy of your choosing.      If you find you have a proliferation of branches, it is possible to group related branches underneath a single folder.  For example, if you have several branches working in parallel for a given release, you may choose to create a folder for that release and then create your branches underneath that folder.  If you’ve already created your branches and wish to reorganize them, you can move the root folder of the branch to the new location with the move operation. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Work Items &lt;/td&gt;&lt;td&gt; Work items are classified according to 2 dimensions: the area path and the iteration path.  The area path classification can be used to classify work items for particular components within an application or applications within an application suite.  The iteration path can be used to classify work items for a given release or a particular iteration of development within a release. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Work Item Types &lt;/td&gt;&lt;td&gt; There is no way to provide substructure to the list of work item types in a team project, however most team projects limit themselves to a few work item types and substructure is not needed. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Team Build Types &lt;/td&gt;&lt;td&gt; There is no way to provide substructure to the list of team build types in a team project, however it is uncommon to maintain an overwhelmingly long list of team build types.  If you are building multiple applications within a given team project, it may be advisable to have several of them build with the same build type. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Reports &lt;/td&gt;&lt;td&gt; SQL Reporting Services allows for reports to be structured into folders.  This folder structure is reflected into the Team Explorer in Visual Studio. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Team Portal &lt;/td&gt;&lt;td&gt; Sharepoint provides multiple options for structuring documents stored in the team portal.  At the top level, multiple document libraries can be maintained for managing documents with different purposes (such as audiences).  Each document library can maintain a unique metadata schema allowing you to track different information about documents based on the library in which they live.  Beneath a document library, an arbitrary depth of folders can be established for further structure.  Document libraries and the folder structure underneath them are both reflected in the Team Explorer in Visual Studio.  At a higher level, sub-sites can also be created in Sharepoint for providing a customized portal for a subset of team project members.  Sub-sites are not reflected into the Team Explorer in Visual Studio. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Process Guidance &lt;/td&gt;&lt;td&gt; The process guidance that exists on the team portal is a set of web pages describing the software development methodology being followed.  If a subset of the members of a team project need customized guidance, it can be reflected on the existing process guidance pages, or a new set of pages can be created. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Area and Iteration Classifications &lt;/td&gt;&lt;td&gt; The area and iteration classifications are both hierarchies that can be structured as appropriate to represent the functional and temporal breakdown of your application respectively.  As mentioned previously, if you are managing multiple applications in a team project, you’ll likely want the top level of the area hierarchy to reflect the applications being managed.  Similarly, if you are representing multiple releases in a team project, you’ll likely want the top level of the iteration hierarchy to reflect the releases. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Security Groups &lt;/td&gt;&lt;td&gt; TFS provides a built-in security group mechanism that allows you to manage group membership in TFS rather than through Active Directory or the operating system.  These groups can contain any arbitrary set of windows users, windows groups, or other TFS groups.  As such, you can subdivide your team as necessary, define the needed groups to represent those subdivisions, and then create additional groups to aggregate those into larger lists of users. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Check-in Policies &lt;/td&gt;&lt;td&gt; Check-in policies are scoped to all source in a team project.  This can make it challenging to manage a large source base in a team project because the policies you wish to define for one part of the source tree may not apply for another part of the source tree.  The latest release of the &lt;a href="http://go.microsoft.com/?linkid=5422499" class="externalLink"&gt;Team Foundation Power Tools&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; provides a check-in policy that can be used to scope other check-in policies to a subset of the source tree for a team project. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Exclusive Check-out &lt;/td&gt;&lt;td&gt; Exclusive checkout in version control can be enabled only at the team project level and not on a subsection of the team project source. &lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt; &lt;br /&gt;&lt;h2&gt;
Other Common Questions
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;How do I structure my team projects for development that is geographically distributed?  &lt;/li&gt;
&lt;/ul&gt;Team Foundation Server is built to handle the needs of distributed development teams.  The optimized web service protocol and the TFS Proxy server provide an experience for remote users that is comparable to that of users at the site where the server is located.  As such, you need not factor geography into your decision about how to structure your team projects.&lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Where do I store shared source that is used by multiple team projects?&lt;/li&gt;
&lt;/ul&gt;Team Foundation Server enforces a practice where all top-level items in the version control system are folders for Team Projects.  It’s not possible to create a folder in version control that does not fall underneath the root folder of a given Team Project.  Consequently, all source belongs to a particular team project.&lt;br /&gt;If you have source that is leveraged by multiple team projects, you have a couple options for handling it.  First, if one team project clearly owns the source, it’s probably appropriate to manage that source under that team project.  If, however, ownership does not lie with a particular team project, you may wish to create a team project specifically for shared source code.  This also provides a convenient place to manage artifacts associated with that shared source such as design documents and bugs.&lt;br /&gt;For the teams consuming the shared source, you have a couple of options.  First, those teams can merely map the source from the shared location into their workspaces on the client machine.  This creates a configuration that unifies the source from the shared location and their own project on the client-side.  Alternatively, the consuming team can branch the source from the shared location into their own team project.  This creates a configuration that unifies the source from the shared location and their own project on the server-side.  The big difference between these two options is latency in picking up changes to the shared source.  In the first case, shared source changes are picked up every time the latest source is retrieved into the workspace.  In the second case, shared source changes are picked up as part of a merge process between the branches.  This makes the decision to pick up changes in the shared source much more explicit.&lt;br /&gt;&lt;ul&gt;
&lt;li&gt;How should I structure my branches?&lt;/li&gt;
&lt;/ul&gt;With the exception of the code sharing model discussed above, branch structure is an orthogonal question to team project structure and one that deserves its own document.  A group of engineers from the Visual Studio Team System team recently published a very comprehensive document on the topic.  Rather than reproduce that information here, let me refer you to its &lt;a href="http://www.codeplex.com/BranchingGuidance" class="externalLink"&gt; location&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;
&lt;/div&gt;</description><author>grahamba</author><pubDate>Sat, 28 Apr 2007 00:18:19 GMT</pubDate><guid isPermaLink="false">UPDATED WIKI: Guidance for Structuring Team Projects 20070428121819A</guid></item><item><title>UPDATED WIKI: Guidance for Structuring Team Projects</title><link>http://www.codeplex.com/BranchingGuidance/Wiki/View.aspx?title=Guidance for Structuring Team Projects&amp;version=21</link><description>&lt;div class="wikidoc"&gt;
&lt;img src="http://www.codeplex.com/BranchingGuidance/Project/FileDownload.aspx?DownloadId=11243" alt="VSTSLogo.gif" /&gt;&lt;br /&gt; &lt;br /&gt;&lt;h1&gt;
Guidance for Structuring Team Projects
&lt;/h1&gt;- &lt;i&gt;Doug Neumann&lt;/i&gt; - &lt;i&gt;Microsoft Corporation&lt;/i&gt;&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Introduction
&lt;/h2&gt;One of the most important considerations when looking to deploy Team Foundation Server within your organization is how you will employ the “Team Project” concept.  It can be very tempting to jump in and immediately start creating Team Projects to satisfy every whim of the users in your organization.  However, restructuring existing team projects is difficult to accomplish, so establishing a strategy for using team projects up front is very important.  Careful forethought now can save you much pain down the road.&lt;br /&gt;This whitepaper provides details on the components of a team project and discusses how those components may impact your decision about structuring your team projects.  It also lays out a set of common strategies for employing team projects.  Understanding this base of knowledge should empower you to make the best decision on how your organization will use team projects with Team Foundation Server (TFS).&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
What is a Team Project?
&lt;/h2&gt;A TFS Team Project is a collection of artifacts that is used by a team of individuals to perform and track a related set of work.  All artifacts stored in TFS belong to one and only one Team Project, and you cannot begin working in TFS until you have created at least one Team Project.  Team Projects are created by a TFS administrator using the Team Project Creation Wizard.&lt;br /&gt;The initial settings of a team project are governed by a process template.  This template configures a new team project in accordance with a specific software development methodology that the people working on the team project will follow.  TFS ships with support for two software development methodologies, but additional process templates can be added to the system, and all process templates can be extensively customized to fit the needs of your organization. &lt;br /&gt; &lt;br /&gt;&lt;h3&gt;
Components of a Team Project
&lt;/h3&gt;Understanding artifacts being leveraged within your organization, the need for cross-organizational sharing of artifacts, and the available strategies for sharing TFS artifacts across team projects will lead you to the best decision about how to structure your team projects.  The following table outlines the list of artifacts managed by TFS and the capabilities for sharing those artifacts between team projects.&lt;br /&gt;&lt;table&gt;
&lt;tr&gt;
&lt;th&gt; Artifacts &amp;amp; Settings &lt;/th&gt;&lt;th&gt; Description &lt;/th&gt;&lt;th&gt; Considerations for Structuring Team Projects &lt;/th&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Source Code &lt;/td&gt;&lt;td&gt; TFS manages your source code in its version control system.  Each team project creates a top-level folder in the version control folder hierarchy and no other files or folders can be created in the root of the version control folder hierarchy.  Every item created underneath a team project folder is “owned” by that team project. &lt;/td&gt;&lt;td&gt; Source code can be shared between team projects in various ways, including branching source from one team project into another and mapping source from another team into your workspace.  TFS does not support the Visual SourceSafe style of file sharing where a single file can be manifested in multiple locations within the version control repository. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Work Items &lt;/td&gt;&lt;td&gt; Instances of work item types allow you to define and track the work being performed within your organization.  When a new team project is established, an initial set of work items is created for you as defined in the process template used for that team project. &lt;/td&gt;&lt;td&gt; A work item belongs to the team project in which it was created and cannot be moved to another team project.  Work items can, however, be copied to another team project, at which time the fields in the newly created work item are pre-populated with the value of the corresponding fields in the source work item.  Currently, there is no mechanism for bulk-copying work items between team projects in TFS. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Work Item Types &lt;/td&gt;&lt;td&gt; The fields, form, and workflow of a TFS work item is governed by an XML definition known as the work item type.  Work item types are defined in the process template used to create a team project and can be customized as necessary after the team project is created. &lt;/td&gt;&lt;td&gt; If you plan to track work across multiple projects using the reporting mechanisms in TFS, you’ll need to ensure sufficient consistency in the work items defined in those team projects.  They do not need to be identical, but they need to share the set of fields being leveraged for these reports. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Work Item Queries &lt;/td&gt;&lt;td&gt; TFS persists a set of work item queries that provide a mechanism for team members to share views of the team’s work. &lt;/td&gt;&lt;td&gt; There is no way to structure work item queries in TFS beyond declaring them as Team queries or “My” queries.  Large team projects with a lot of queries can make it difficult to find the queries users are interested in.  This may encourage a more granular team project structure to minimize the number of queries that a single team project contains. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Team Build Types &lt;/td&gt;&lt;td&gt; Automated build definitions in TFS allow you to execute a build of your application(s) in a reproducible manner.  Each team project has a collection of build “types” associated with it.  Build types are persisted as files in the version control system. &lt;/td&gt;&lt;td&gt; By default, a single build type can only compile source from the team project in which it exists, however it is possible to &lt;a href="http://blogs.msdn.com/manishagarwal/archive/2005/12/22/506635.aspx" class="externalLink"&gt; modify the build definition to enlist source from outside of the team project&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Reports &lt;/td&gt;&lt;td&gt; Each team project creates a reporting site in SQL Reporting Services and a collection of reports that report on the progress and activity within that Team Project. &lt;/td&gt;&lt;td&gt; The data for all team projects on a given TFS exists in the same data warehouse, so it is possible to create custom reports that span multiple team projects.  However, the reports included with TFS provide only a single-project view. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Team Portal &lt;/td&gt;&lt;td&gt; Each team project creates a Windows SharePoint Services portal to be used for collaborating within that team. &lt;/td&gt;&lt;td&gt; Team projects cannot share the same team portal, however if teams wish to collaborate with each other using the same portal, they can easily agree to use the portal created for one of the teams.  SharePoint portals maintain their own set of security permissions if it’s necessary to govern portal permissions differently than other TFS permissions. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Process Guidance &lt;/td&gt;&lt;td&gt; Each team project portal contains a collection of web pages to provide guidance about how to follow the software development process being utilized. &lt;/td&gt;&lt;td&gt; Only one set of guidance exists for a given team project, however this typically does not influence the decision on how to structure team projects. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Area and Iteration Classifications &lt;/td&gt;&lt;td&gt; Area and iteration classifications provide a mechanism for you to decompose your application functionality and project timeline respectively.  These classifications can then be applied to work items and other artifacts to make it easier to find the artifacts that are appropriate for a given area of the application or iteration of the timeline. &lt;/td&gt;&lt;td&gt; Area and iteration classifications are completely contained within the team project in which they are defined and cannot be shared between team projects.  It is possible to manually replicate the area and iteration classifications between team projects if necessary.  Also, the initial area and iteration hierarchy can be defined in the process template if standardization across team projects is desired. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Security Groups &lt;/td&gt;&lt;td&gt; TFS provides a mechanism for aggregating users into security groups for the purpose of controlling access to the system.  Groups are defined at the server scope as well as the team project scope.  TFS security groups can aggregate Windows user accounts, Windows groups and other TFS groups. &lt;/td&gt;&lt;td&gt; The security groups mechanism in TFS is quite flexible and is unlikely to influence your team project structure. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Check-in Policies &lt;/td&gt;&lt;td&gt; Checkin policies provide a mechanism for validating user changes to source code before they are committed to the system.  Every team project defines a set of checkin policies that will apply to checkins in that team project. &lt;/td&gt;&lt;td&gt; Checkin policies cannot span multiple team projects, however policy definitions can be manually replicated to other team projects.  Furthermore, checkin policies cannot be scoped to a subsection of the team project source, making it sometimes difficult to work with checkin policies when a team project contains a multitude of subteams.  The Team Foundation Power Tools contain a checkin policy that can be used to scope other checkin policies to specific areas of the source tree. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Exclusive Check-out &lt;/td&gt;&lt;td&gt; A team project can specify whether files in version control will be locked when checked out or remain available for additional parallel checkouts. &lt;/td&gt;&lt;td&gt; Because the exclusive checkout setting is scoped to the entire team project, sub-teams wishing to work differently will need to come to an agreement about whether or not they’ll enable this feature. &lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt; &lt;br /&gt;&lt;h3&gt;
Team Project Scalability
&lt;/h3&gt;For some customers, the most important consideration in structuring team projects is the number of team projects that can co-exist on a TFS without significantly hindering server performance.  Scalability of team projects is limited by the complexity of the work item types defined on the server.  The work item types included in MSF for Agile Software Development have been shown to scale to support 500 team projects on a server.  Similar testing with the work items in MSF for CMMI Process Improvement have been shown to support 250 team projects on a server.  For more information about team project scalability, go &lt;a href="http://msdn2.microsoft.com/en-us/library/aa974183(vs.80).aspx" class="externalLink"&gt;here&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Strategies for Employing Team Projects
&lt;/h2&gt;There is no one right way to structure your team projects, and your needs may change as your software development process evolves.  That being said, there are 3 common strategies used to structure team projects.  You may find that one of these strategies fills the needs of your organization or that you’ll choose a combination of these strategies as appropriate for the nature of your work.&lt;br /&gt; &lt;br /&gt;&lt;h3&gt;
Strategy 1: Team Project Per Application
&lt;/h3&gt;The most common strategy for creating team projects is to create one for each application under development.  This strategy can support both large and small applications, as well as multiple releases of applications being developed in parallel.  Various releases of the application are manifested in the version control system as source branches, and in other parts of TFS as different nodes in the iteration classification hierarchy.  If appropriate, documentation for each release that is stored in the SharePoint portal can be managed in different document libraries.&lt;br /&gt;Following this strategy greatly simplifies the process of moving requirements, features, scenarios, and bugs between releases.  When an item needs to be pushed out or brought it, it is signified by simply changing the iteration path to reflect the new target release.&lt;br /&gt;The biggest drawback to this strategy is that the software development process for all releases of the application are tightly bound.  For example, two releases of an application being developed in parallel would need to use the same work item types, the same checkin policies, and follow the same process guidance.&lt;br /&gt;Another potential drawback is that you may need to customize the reports included with your process template to get an appropriate view of what is happening in a given release.  Most reports included with the common process templates provide a team-project-wide view of what is happening; to get a view that is focused on a single release, you may need to add additional filtering for that release.&lt;br /&gt;Over the course of multiple releases, you may find that your team project for a given application has developed a lot of “baggage.”  This could include old work items that are no longer needed, old specs on the portal that should have been discarded, or old data in the data warehouse that could cloud your view of team progress.  Additionally, you may decide at some point that you’d like to change your software development methodology and desire to retool your team project to support that methodology.  At that time, you may find it is appropriate to create a new team project for this application, starting clean with a new process template, a new set of work items and a new project portal.  You can then branch source from the previous team project to the new one, and copy work items as appropriate to the new team project.&lt;br /&gt;Finally, an organization managing hundreds of small applications may eventually reach the scalability limits of TFS.  For more information, see the previous subject on Team Project Scalability.&lt;br /&gt; &lt;br /&gt;&lt;h3&gt;
Strategy 2: Team Project Per Release
&lt;/h3&gt;In the “Team Project Per Release” strategy, every major application release starts a new team project.  This strategy works well for very large teams who are often working on long-term projects.  For these teams, a major release is an opportunity to start clean with a new team project that doesn’t carry forward any baggage from the previous release.  By starting with a new team project they can also select a different process template that supports a different development methodology than they had previously followed.  They can also selectively move forward artifacts from the previous release to eliminate some of the baggage frequently left over from a multi-year effort.  The team project from the current release can continue to be leveraged for maintenance activities on the release, potentially with a different team that is responsible for sustaining engineering.&lt;br /&gt;The primary disadvantage with this strategy lies in the difficulty of moving data forward from one team project to the next.  It is relatively easy to move source code between team projects, typically by branching the source into the new team project.  Moving work items forward, however, is more difficult.  TFS provides the ability to copy a work item from one team project to another, but that only works on one work item at a time.  To copy a set of work items between team projects, you would need to write your own custom utility with the TFS object model.&lt;br /&gt;Server scalability can also be a concern with this model, however usually organizations engaged in these projects find they are managing a few large efforts rather than many small efforts.  The server scalability concerns related to structuring your team projects only come into play when managing hundreds of team projects on a Team Foundation Server.  For specific scalability numbers, see the previous subject on Team Project Scalability.&lt;br /&gt; &lt;br /&gt;&lt;h3&gt;
Strategy 3: Team Project Per Team
&lt;/h3&gt;For a few customers, the best way to structure team projects is to align them with the team boundaries in their organization.  This strategy closely aligns a team with the workflows defined in TFS work item types and provides a unit of reporting that spans the entire team.  For customers looking to centrally control and monitor the activities of software development teams, this may be the best approach.&lt;br /&gt;This strategy can be a necessity when encountering the team project scalability limitations discussed previously.  Organizations that manage several hundred applications may find that they need to group applications together under a fewer number of team projects.  An appropriate criteria for grouping these applications is frequently to cluster together applications developed by the same team.&lt;br /&gt;The primary disadvantage of this approach is that it precludes specialization of the software development process for a particular application or release.  If one application in an organization needs a new field on a work item type, all applications will get that new field.  Additionally, reports that show timeline details of the team project lose their value if the applications managed in the team project are not working toward the same timeline.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Providing Substructure Within a Team Project
&lt;/h2&gt;Regardless of the strategy you choose, you will need to provide some level of substructure to your team project.  If you select the team project per application model, you may need to create substructure for each release.  If you are working on a very large application and select the team project per release model, you may need to establish substructure for subcomponents of the application.  And if you select the team project per team model, you will probably need to establish substructure for the applications that the team works on.&lt;br /&gt;The mechanisms for providing substructure depend on the type of artifact being managed.  The following table discusses the substructure mechanisms for the artifacts and settings discussed previously.&lt;br /&gt; &lt;br /&gt;&lt;table&gt;
&lt;tr&gt;
&lt;th&gt; Artifacts &amp;amp; Settings &lt;/th&gt;&lt;th&gt; Substructure Mechanisms &lt;/th&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Source Code &lt;/td&gt;&lt;td&gt; The top level structure for source code within a team project is typically a “branch.”  Branches in TFS appear as copies of the files and folders they are branched from.  Frequently, the first thing you’ll do in source control for a new team project is to create a new folder with a name like “main” that constitutes the main branch for your source.  Future branches would likely be made using that folder as the source.  Within a branch, structure is typically provided with a folder hierarchy of your choosing.      If you find you have a proliferation of branches, it is possible to group related branches underneath a single folder.  For example, if you have several branches working in parallel for a given release, you may choose to create a folder for that release and then create your branches underneath that folder.  If you’ve already created your branches and wish to reorganize them, you can move the root folder of the branch to the new location with the move operation. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Work Items &lt;/td&gt;&lt;td&gt; Work items are classified according to 2 dimensions: the area path and the iteration path.  The area path classification can be used to classify work items for particular components within an application or applications within an application suite.  The iteration path can be used to classify work items for a given release or a particular iteration of development within a release. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Work Item Types &lt;/td&gt;&lt;td&gt; There is no way to provide substructure to the list of work item types in a team project, however most team projects limit themselves to a few work item types and substructure is not needed. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Team Build Types &lt;/td&gt;&lt;td&gt; There is no way to provide substructure to the list of team build types in a team project, however it is uncommon to maintain an overwhelmingly long list of team build types.  If you are building multiple applications within a given team project, it may be advisable to have several of them build with the same build type. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Reports &lt;/td&gt;&lt;td&gt; SQL Reporting Services allows for reports to be structured into folders.  This folder structure is reflected into the Team Explorer in Visual Studio. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Team Portal &lt;/td&gt;&lt;td&gt; Sharepoint provides multiple options for structuring documents stored in the team portal.  At the top level, multiple document libraries can be maintained for managing documents with different purposes (such as audiences).  Each document library can maintain a unique metadata schema allowing you to track different information about documents based on the library in which they live.  Beneath a document library, an arbitrary depth of folders can be established for further structure.  Document libraries and the folder structure underneath them are both reflected in the Team Explorer in Visual Studio.  At a higher level, sub-sites can also be created in Sharepoint for providing a customized portal for a subset of team project members.  Sub-sites are not reflected into the Team Explorer in Visual Studio. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Process Guidance &lt;/td&gt;&lt;td&gt; The process guidance that exists on the team portal is a set of web pages describing the software development methodology being followed.  If a subset of the members of a team project need customized guidance, it can be reflected on the existing process guidance pages, or a new set of pages can be created. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Area and Iteration Classifications &lt;/td&gt;&lt;td&gt; The area and iteration classifications are both hierarchies that can be structured as appropriate to represent the functional and temporal breakdown of your application respectively.  As mentioned previously, if you are managing multiple applications in a team project, you’ll likely want the top level of the area hierarchy to reflect the applications being managed.  Similarly, if you are representing multiple releases in a team project, you’ll likely want the top level of the iteration hierarchy to reflect the releases. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Security Groups &lt;/td&gt;&lt;td&gt; TFS provides a built-in security group mechanism that allows you to manage group membership in TFS rather than through Active Directory or the operating system.  These groups can contain any arbitrary set of windows users, windows groups, or other TFS groups.  As such, you can subdivide your team as necessary, define the needed groups to represent those subdivisions, and then create additional groups to aggregate those into larger lists of users. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Check-in Policies &lt;/td&gt;&lt;td&gt; Check-in policies are scoped to all source in a team project.  This can make it challenging to manage a large source base in a team project because the policies you wish to define for one part of the source tree may not apply for another part of the source tree.  The latest release of the &lt;a href="http://go.microsoft.com/?linkid=5422499" class="externalLink"&gt;Team Foundation Power Tools&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; provides a check-in policy that can be used to scope other check-in policies to a subset of the source tree for a team project. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Exclusive Check-out &lt;/td&gt;&lt;td&gt; Exclusive checkout in version control can be enabled only at the team project level and not on a subsection of the team project source. &lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt; &lt;br /&gt;&lt;h2&gt;
Other Common Questions
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;How do I structure my team projects for development that is geographically distributed?  &lt;/li&gt;
&lt;/ul&gt;Team Foundation Server is built to handle the needs of distributed development teams.  The optimized web service protocol and the TFS Proxy server provide an experience for remote users that is comparable to that of users at the site where the server is located.  As such, you need not factor geography into your decision about how to structure your team projects.&lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Where do I store shared source that is used by multiple team projects?&lt;/li&gt;
&lt;/ul&gt;Team Foundation Server enforces a practice where all top-level items in the version control system are folders for Team Projects.  It’s not possible to create a folder in version control that does not fall underneath the root folder of a given Team Project.  Consequently, all source belongs to a particular team project.&lt;br /&gt;If you have source that is leveraged by multiple team projects, you have a couple options for handling it.  First, if one team project clearly owns the source, it’s probably appropriate to manage that source under that team project.  If, however, ownership does not lie with a particular team project, you may wish to create a team project specifically for shared source code.  This also provides a convenient place to manage artifacts associated with that shared source such as design documents and bugs.&lt;br /&gt;For the teams consuming the shared source, you have a couple of options.  First, those teams can merely map the source from the shared location into their workspaces on the client machine.  This creates a configuration that unifies the source from the shared location and their own project on the client-side.  Alternatively, the consuming team can branch the source from the shared location into their own team project.  This creates a configuration that unifies the source from the shared location and their own project on the server-side.  The big difference between these two options is latency in picking up changes to the shared source.  In the first case, shared source changes are picked up every time the latest source is retrieved into the workspace.  In the second case, shared source changes are picked up as part of a merge process between the branches.  This makes the decision to pick up changes in the shared source much more explicit.&lt;br /&gt;&lt;ul&gt;
&lt;li&gt;How should I structure my branches?&lt;/li&gt;
&lt;/ul&gt;With the exception of the code sharing model discussed above, branch structure is an orthogonal question to team project structure and one that deserves its own document.  A group of engineers from the Visual Studio Team System team recently published a very comprehensive document on the topic.  Rather than reproduce that information here, let me refer you to its &lt;a href="http://www.codeplex.com/BranchingGuidance" class="externalLink"&gt; location&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;
&lt;/div&gt;</description><author>grahamba</author><pubDate>Thu, 26 Apr 2007 21:10:04 GMT</pubDate><guid isPermaLink="false">UPDATED WIKI: Guidance for Structuring Team Projects 20070426091004P</guid></item><item><title>UPDATED WIKI: Guidance for Structuring Team Projects</title><link>http://www.codeplex.com/BranchingGuidance/Wiki/View.aspx?title=Guidance for Structuring Team Projects&amp;version=20</link><description>&lt;div class="wikidoc"&gt;
&lt;img src="http://www.codeplex.com/BranchingGuidance/Project/FileDownload.aspx?DownloadId=11243" alt="VSTSLogo.gif" /&gt;&lt;br /&gt; &lt;br /&gt;&lt;h1&gt;
Guidance for Structuring Team Projects
&lt;/h1&gt;- &lt;i&gt;Doug Neumann&lt;/i&gt; - &lt;i&gt;Microsoft Corporation&lt;/i&gt;&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Introduction
&lt;/h2&gt;One of the most important considerations when looking to deploy Team Foundation Server within your organization is how you will employ the “Team Project” concept.  It can be very tempting to jump in and immediately start creating Team Projects to satisfy every whim of the users in your organization.  However, restructuring existing team projects is difficult to accomplish, so establishing a strategy for using team projects up front is very important.  Careful forethought now can save you much pain down the road.&lt;br /&gt;This whitepaper provides details on the components of a team project and discusses how those components may impact your decision about structuring your team projects.  It also lays out a set of common strategies for employing team projects.  Understanding this base of knowledge should empower you to make the best decision on how your organization will use team projects with Team Foundation Server (TFS).&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
What is a Team Project?
&lt;/h2&gt;A TFS Team Project is a collection of artifacts that is used by a team of individuals to perform and track a related set of work.  All artifacts stored in TFS belong to one and only one Team Project, and you cannot begin working in TFS until you have created at least one Team Project.  Team Projects are created by a TFS administrator using the Team Project Creation Wizard.&lt;br /&gt;The initial settings of a team project are governed by a process template.  This template configures a new team project in accordance with a specific software development methodology that the people working on the team project will follow.  TFS ships with support for two software development methodologies, but additional process templates can be added to the system, and all process templates can be extensively customized to fit the needs of your organization. &lt;br /&gt; &lt;br /&gt;&lt;h3&gt;
Components of a Team Project
&lt;/h3&gt;Understanding artifacts being leveraged within your organization, the need for cross-organizational sharing of artifacts, and the available strategies for sharing TFS artifacts across team projects will lead you to the best decision about how to structure your team projects.  The following table outlines the list of artifacts managed by TFS and the capabilities for sharing those artifacts between team projects.&lt;br /&gt;&lt;table&gt;
&lt;tr&gt;
&lt;th&gt; Artifacts &amp;amp; Settings &lt;/th&gt;&lt;th&gt; Description &lt;/th&gt;&lt;th&gt; Considerations for Structuring Team Projects &lt;/th&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Source Code &lt;/td&gt;&lt;td&gt; TFS manages your source code in its version control system.  Each team project creates a top-level folder in the version control folder hierarchy and no other files or folders can be created in the root of the version control folder hierarchy.  Every item created underneath a team project folder is “owned” by that team project. &lt;/td&gt;&lt;td&gt; Source code can be shared between team projects in various ways, including branching source from one team project into another and mapping source from another team into your workspace.  TFS does not support the Visual SourceSafe style of file sharing where a single file can be manifested in multiple locations within the version control repository. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Work Items &lt;/td&gt;&lt;td&gt; Instances of work item types allow you to define and track the work being performed within your organization.  When a new team project is established, an initial set of work items is created for you as defined in the process template used for that team project. &lt;/td&gt;&lt;td&gt; A work item belongs to the team project in which it was created and cannot be moved to another team project.  Work items can, however, be copied to another team project, at which time the fields in the newly created work item are pre-populated with the value of the corresponding fields in the source work item.  Currently, there is no mechanism for bulk-copying work items between team projects in TFS. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Work Item Types &lt;/td&gt;&lt;td&gt; The fields, form, and workflow of a TFS work item is governed by an XML definition known as the work item type.  Work item types are defined in the process template used to create a team project and can be customized as necessary after the team project is created. &lt;/td&gt;&lt;td&gt; If you plan to track work across multiple projects using the reporting mechanisms in TFS, you’ll need to ensure sufficient consistency in the work items defined in those team projects.  They do not need to be identical, but they need to share the set of fields being leveraged for these reports. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Work Item Queries &lt;/td&gt;&lt;td&gt; TFS persists a set of work item queries that provide a mechanism for team members to share views of the team’s work. &lt;/td&gt;&lt;td&gt; There is no way to structure work item queries in TFS beyond declaring them as Team queries or “My” queries.  Large team projects with a lot of queries can make it difficult to find the queries users are interested in.  This may encourage a more granular team project structure to minimize the number of queries that a single team project contains. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Team Build Types &lt;/td&gt;&lt;td&gt; Automated build definitions in TFS allow you to execute a build of your application(s) in a reproducible manner.  Each team project has a collection of build “types” associated with it.  Build types are persisted as files in the version control system. &lt;/td&gt;&lt;td&gt; By default, a single build type can only compile source from the team project in which it exists, however it is possible to &lt;a href="http://blogs.msdn.com/manishagarwal/archive/2005/12/22/506635.aspx" class="externalLink"&gt; modify the build definition to enlist source from outside of the team project&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Reports &lt;/td&gt;&lt;td&gt; Each team project creates a reporting site in SQL Reporting Services and a collection of reports that report on the progress and activity within that Team Project. &lt;/td&gt;&lt;td&gt; The data for all team projects on a given TFS exists in the same data warehouse, so it is possible to create custom reports that span multiple team projects.  However, the reports included with TFS provide only a single-project view. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Team Portal &lt;/td&gt;&lt;td&gt; Each team project creates a Windows SharePoint Services portal to be used for collaborating within that team. &lt;/td&gt;&lt;td&gt; Team projects cannot share the same team portal, however if teams wish to collaborate with each other using the same portal, they can easily agree to use the portal created for one of the teams.  SharePoint portals maintain their own set of security permissions if it’s necessary to govern portal permissions differently than other TFS permissions. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Process Guidance &lt;/td&gt;&lt;td&gt; Each team project portal contains a collection of web pages to provide guidance about how to follow the software development process being utilized. &lt;/td&gt;&lt;td&gt; Only one set of guidance exists for a given team project, however this typically does not influence the decision on how to structure team projects. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Area and Iteration Classifications &lt;/td&gt;&lt;td&gt; Area and iteration classifications provide a mechanism for you to decompose your application functionality and project timeline respectively.  These classifications can then be applied to work items and other artifacts to make it easier to find the artifacts that are appropriate for a given area of the application or iteration of the timeline. &lt;/td&gt;&lt;td&gt; Area and iteration classifications are completely contained within the team project in which they are defined and cannot be shared between team projects.  It is possible to manually replicate the area and iteration classifications between team projects if necessary.  Also, the initial area and iteration hierarchy can be defined in the process template if standardization across team projects is desired. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Security Groups &lt;/td&gt;&lt;td&gt; TFS provides a mechanism for aggregating users into security groups for the purpose of controlling access to the system.  Groups are defined at the server scope as well as the team project scope.  TFS security groups can aggregate Windows user accounts, Windows groups and other TFS groups. &lt;/td&gt;&lt;td&gt; The security groups mechanism in TFS is quite flexible and is unlikely to influence your team project structure. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Check-in Policies &lt;/td&gt;&lt;td&gt; Checkin policies provide a mechanism for validating user changes to source code before they are committed to the system.  Every team project defines a set of checkin policies that will apply to checkins in that team project. &lt;/td&gt;&lt;td&gt; Checkin policies cannot span multiple team projects, however policy definitions can be manually replicated to other team projects.  Furthermore, checkin policies cannot be scoped to a subsection of the team project source, making it sometimes difficult to work with checkin policies when a team project contains a multitude of subteams.  The Team Foundation Power Tools contain a checkin policy that can be used to scope other checkin policies to specific areas of the source tree. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Exclusive Check-out &lt;/td&gt;&lt;td&gt; A team project can specify whether files in version control will be locked when checked out or remain available for additional parallel checkouts. &lt;/td&gt;&lt;td&gt; Because the exclusive checkout setting is scoped to the entire team project, sub-teams wishing to work differently will need to come to an agreement about whether or not they’ll enable this feature. &lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt; &lt;br /&gt;&lt;h3&gt;
Team Project Scalability
&lt;/h3&gt;For some customers, the most important consideration in structuring team projects is the number of team projects that can co-exist on a TFS without significantly hindering server performance.  Scalability of team projects is limited by the complexity of the work item types defined on the server.  The work item types included in MSF for Agile Software Development have been shown to scale to support 500 team projects on a server.  Similar testing with the work items in MSF for CMMI Process Improvement have been shown to support 250 team projects on a server.  For more information about team project scalability, go &lt;a href="http://msdn2.microsoft.com/en-us/library/aa974183(vs.80).aspx" class="externalLink"&gt;here&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Strategies for Employing Team Projects
&lt;/h2&gt;There is no one right way to structure your team projects, and your needs may change as your software development process evolves.  That being said, there are 3 common strategies used to structure team projects.  You may find that one of these strategies fills the needs of your organization or that you’ll choose a combination of these strategies as appropriate for the nature of your work.&lt;br /&gt; &lt;br /&gt;&lt;h3&gt;
Strategy 1: Team Project Per Application
&lt;/h3&gt;The most common strategy for creating team projects is to create one for each application under development.  This strategy can support both large and small applications, as well as multiple releases of applications being developed in parallel.  Various releases of the application are manifested in the version control system as source branches, and in other parts of TFS as different nodes in the iteration classification hierarchy.  If appropriate, documentation for each release that is stored in the SharePoint portal can be managed in different document libraries.&lt;br /&gt;Following this strategy greatly simplifies the process of moving requirements, features, scenarios, and bugs between releases.  When an item needs to be pushed out or brought it, it is signified by simply changing the iteration path to reflect the new target release.&lt;br /&gt;The biggest drawback to this strategy is that the software development process for all releases of the application are tightly bound.  For example, two releases of an application being developed in parallel would need to use the same work item types, the same checkin policies, and follow the same process guidance.&lt;br /&gt;Another potential drawback is that you may need to customize the reports included with your process template to get an appropriate view of what is happening in a given release.  Most reports included with the common process templates provide a team-project-wide view of what is happening; to get a view that is focused on a single release, you may need to add additional filtering for that release.&lt;br /&gt;Over the course of multiple releases, you may find that your team project for a given application has developed a lot of “baggage.”  This could include old work items that are no longer needed, old specs on the portal that should have been discarded, or old data in the data warehouse that could cloud your view of team progress.  Additionally, you may decide at some point that you’d like to change your software development methodology and desire to retool your team project to support that methodology.  At that time, you may find it is appropriate to create a new team project for this application, starting clean with a new process template, a new set of work items and a new project portal.  You can then branch source from the previous team project to the new one, and copy work items as appropriate to the new team project.&lt;br /&gt;Finally, an organization managing hundreds of small applications may eventually reach the scalability limits of TFS.  For more information, see the previous subject on Team Project Scalability.&lt;br /&gt; &lt;br /&gt;&lt;h3&gt;
Strategy 2: Team Project Per Release
&lt;/h3&gt;In the “Team Project Per Release” strategy, every major application release starts a new team project.  This strategy works well for very large teams who are often working on long-term projects.  For these teams, a major release is an opportunity to start clean with a new team project that doesn’t carry forward any baggage from the previous release.  By starting with a new team project they can also select a different process template that supports a different development methodology than they had previously followed.  They can also selectively move forward artifacts from the previous release to eliminate some of the baggage frequently left over from a multi-year effort.  The team project from the current release can continue to be leveraged for maintenance activities on the release, potentially with a different team that is responsible for sustaining engineering.&lt;br /&gt;The primary disadvantage with this strategy lies in the difficulty of moving data forward from one team project to the next.  It is relatively easy to move source code between team projects, typically by branching the source into the new team project.  Moving work items forward, however, is more difficult.  TFS provides the ability to copy a work item from one team project to another, but that only works on one work item at a time.  To copy a set of work items between team projects, you would need to write your own custom utility with the TFS object model.&lt;br /&gt;Server scalability can also be a concern with this model, however usually organizations engaged in these projects find they are managing a few large efforts rather than many small efforts.  The server scalability concerns related to structuring your team projects only come into play when managing hundreds of team projects on a Team Foundation Server.  For specific scalability numbers, see the previous subject on Team Project Scalability.&lt;br /&gt; &lt;br /&gt;&lt;h3&gt;
Strategy 3: Team Project Per Team
&lt;/h3&gt;For a few customers, the best way to structure team projects is to align them with the team boundaries in their organization.  This strategy closely aligns a team with the workflows defined in TFS work item types and provides a unit of reporting that spans the entire team.  For customers looking to centrally control and monitor the activities of software development teams, this may be the best approach.&lt;br /&gt;This strategy can be a necessity when encountering the team project scalability limitations discussed previously.  Organizations that manage several hundred applications may find that they need to group applications together under a fewer number of team projects.  An appropriate criteria for grouping these applications is frequently to cluster together applications developed by the same team.&lt;br /&gt;The primary disadvantage of this approach is that it precludes specialization of the software development process for a particular application or release.  If one application in an organization needs a new field on a work item type, all applications will get that new field.  Additionally, reports that show timeline details of the team project lose their value if the applications managed in the team project are not working toward the same timeline.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Providing Substructure Within a Team Project
&lt;/h2&gt;Regardless of the strategy you choose, you will need to provide some level of substructure to your team project.  If you select the team project per application model, you may need to create substructure for each release.  If you are working on a very large application and select the team project per release model, you may need to establish substructure for subcomponents of the application.  And if you select the team project per team model, you will probably need to establish substructure for the applications that the team works on.&lt;br /&gt;The mechanisms for providing substructure depend on the type of artifact being managed.  The following table discusses the substructure mechanisms for the artifacts and settings discussed previously.&lt;br /&gt; &lt;br /&gt;&lt;table&gt;
&lt;tr&gt;
&lt;th&gt; Artifacts &amp;amp; Settings &lt;/th&gt;&lt;th&gt; Substructure Mechanisms &lt;/th&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Source Code &lt;/td&gt;&lt;td&gt; The top level structure for source code within a team project is typically a “branch.”  Branches in TFS appear as copies of the files and folders they are branched from.  Frequently, the first thing you’ll do in source control for a new team project is to create a new folder with a name like “main” that constitutes the main branch for your source.  Future branches would likely be made using that folder as the source.  Within a branch, structure is typically provided with a folder hierarchy of your choosing.      If you find you have a proliferation of branches, it is possible to group related branches underneath a single folder.  For example, if you have several branches working in parallel for a given release, you may choose to create a folder for that release and then create your branches underneath that folder.  If you’ve already created your branches and wish to reorganize them, you can move the root folder of the branch to the new location with the move operation. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Work Items &lt;/td&gt;&lt;td&gt; Work items are classified according to 2 dimensions: the area path and the iteration path.  The area path classification can be used to classify work items for particular components within an application or applications within an application suite.  The iteration path can be used to classify work items for a given release or a particular iteration of development within a release. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Work Item Types &lt;/td&gt;&lt;td&gt; There is no way to provide substructure to the list of work item types in a team project, however most team projects limit themselves to a few work item types and substructure is not needed. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Team Build Types &lt;/td&gt;&lt;td&gt; There is no way to provide substructure to the list of team build types in a team project, however it is uncommon to maintain an overwhelmingly long list of team build types.  If you are building multiple applications within a given team project, it may be advisable to have several of them build with the same build type. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Reports &lt;/td&gt;&lt;td&gt; SQL Reporting Services allows for reports to be structured into folders.  This folder structure is reflected into the Team Explorer in Visual Studio. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Team Portal &lt;/td&gt;&lt;td&gt; Sharepoint provides multiple options for structuring documents stored in the team portal.  At the top level, multiple document libraries can be maintained for managing documents with different purposes (such as audiences).  Each document library can maintain a unique metadata schema allowing you to track different information about documents based on the library in which they live.  Beneath a document library, an arbitrary depth of folders can be established for further structure.  Document libraries and the folder structure underneath them are both reflected in the Team Explorer in Visual Studio.  At a higher level, sub-sites can also be created in Sharepoint for providing a customized portal for a subset of team project members.  Sub-sites are not reflected into the Team Explorer in Visual Studio. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Process Guidance &lt;/td&gt;&lt;td&gt; The process guidance that exists on the team portal is a set of web pages describing the software development methodology being followed.  If a subset of the members of a team project need customized guidance, it can be reflected on the existing process guidance pages, or a new set of pages can be created. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Area and Iteration Classifications &lt;/td&gt;&lt;td&gt; The area and iteration classifications are both hierarchies that can be structured as appropriate to represent the functional and temporal breakdown of your application respectively.  As mentioned previously, if you are managing multiple applications in a team project, you’ll likely want the top level of the area hierarchy to reflect the applications being managed.  Similarly, if you are representing multiple releases in a team project, you’ll likely want the top level of the iteration hierarchy to reflect the releases. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Security Groups &lt;/td&gt;&lt;td&gt; TFS provides a built-in security group mechanism that allows you to manage group membership in TFS rather than through Active Directory or the operating system.  These groups can contain any arbitrary set of windows users, windows groups, or other TFS groups.  As such, you can subdivide your team as necessary, define the needed groups to represent those subdivisions, and then create additional groups to aggregate those into larger lists of users. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Check-in Policies &lt;/td&gt;&lt;td&gt; Check-in policies are scoped to all source in a team project.  This can make it challenging to manage a large source base in a team project because the policies you wish to define for one part of the source tree may not apply for another part of the source tree.  The latest release of the &lt;a href="Team%20Foundation%20Power%20Tools:http://go.microsoft.com/?linkid=5422499" class="externalLink"&gt;Team Foundation Power Tools:http://go.microsoft.com/?linkid=5422499&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; provides a check-in policy that can be used to scope other check-in policies to a subset of the source tree for a team project. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Exclusive Check-out &lt;/td&gt;&lt;td&gt; Exclusive checkout in version control can be enabled only at the team project level and not on a subsection of the team project source. &lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt; &lt;br /&gt;&lt;h2&gt;
Other Common Questions
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;How do I structure my team projects for development that is geographically distributed?  &lt;/li&gt;
&lt;/ul&gt;Team Foundation Server is built to handle the needs of distributed development teams.  The optimized web service protocol and the TFS Proxy server provide an experience for remote users that is comparable to that of users at the site where the server is located.  As such, you need not factor geography into your decision about how to structure your team projects.&lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Where do I store shared source that is used by multiple team projects?&lt;/li&gt;
&lt;/ul&gt;Team Foundation Server enforces a practice where all top-level items in the version control system are folders for Team Projects.  It’s not possible to create a folder in version control that does not fall underneath the root folder of a given Team Project.  Consequently, all source belongs to a particular team project.&lt;br /&gt;If you have source that is leveraged by multiple team projects, you have a couple options for handling it.  First, if one team project clearly owns the source, it’s probably appropriate to manage that source under that team project.  If, however, ownership does not lie with a particular team project, you may wish to create a team project specifically for shared source code.  This also provides a convenient place to manage artifacts associated with that shared source such as design documents and bugs.&lt;br /&gt;For the teams consuming the shared source, you have a couple of options.  First, those teams can merely map the source from the shared location into their workspaces on the client machine.  This creates a configuration that unifies the source from the shared location and their own project on the client-side.  Alternatively, the consuming team can branch the source from the shared location into their own team project.  This creates a configuration that unifies the source from the shared location and their own project on the server-side.  The big difference between these two options is latency in picking up changes to the shared source.  In the first case, shared source changes are picked up every time the latest source is retrieved into the workspace.  In the second case, shared source changes are picked up as part of a merge process between the branches.  This makes the decision to pick up changes in the shared source much more explicit.&lt;br /&gt;&lt;ul&gt;
&lt;li&gt;How should I structure my branches?&lt;/li&gt;
&lt;/ul&gt;With the exception of the code sharing model discussed above, branch structure is an orthogonal question to team project structure and one that deserves its own document.  A group of engineers from the Visual Studio Team System team recently published a very comprehensive document on the topic.  Rather than reproduce that information here, let me refer you to its &lt;a href="http://www.codeplex.com/BranchingGuidance" class="externalLink"&gt; location&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;
&lt;/div&gt;</description><author>grahamba</author><pubDate>Thu, 26 Apr 2007 21:09:34 GMT</pubDate><guid isPermaLink="false">UPDATED WIKI: Guidance for Structuring Team Projects 20070426090934P</guid></item><item><title>UPDATED WIKI: Guidance for Structuring Team Projects</title><link>http://www.codeplex.com/BranchingGuidance/Wiki/View.aspx?title=Guidance for Structuring Team Projects&amp;version=19</link><description>&lt;div class="wikidoc"&gt;
&lt;img src="http://www.codeplex.com/BranchingGuidance/Project/FileDownload.aspx?DownloadId=11243" alt="VSTSLogo.gif" /&gt;&lt;br /&gt; &lt;br /&gt;&lt;h1&gt;
Guidance for Structuring Team Projects
&lt;/h1&gt;- &lt;i&gt;Doug Neumann&lt;/i&gt; - &lt;i&gt;Microsoft Corporation&lt;/i&gt;&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Introduction
&lt;/h2&gt;One of the most important considerations when looking to deploy Team Foundation Server within your organization is how you will employ the “Team Project” concept.  It can be very tempting to jump in and immediately start creating Team Projects to satisfy every whim of the users in your organization.  However, restructuring existing team projects is difficult to accomplish, so establishing a strategy for using team projects up front is very important.  Careful forethought now can save you much pain down the road.&lt;br /&gt;This whitepaper provides details on the components of a team project and discusses how those components may impact your decision about structuring your team projects.  It also lays out a set of common strategies for employing team projects.  Understanding this base of knowledge should empower you to make the best decision on how your organization will use team projects with Team Foundation Server (TFS).&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
What is a Team Project?
&lt;/h2&gt;A TFS Team Project is a collection of artifacts that is used by a team of individuals to perform and track a related set of work.  All artifacts stored in TFS belong to one and only one Team Project, and you cannot begin working in TFS until you have created at least one Team Project.  Team Projects are created by a TFS administrator using the Team Project Creation Wizard.&lt;br /&gt;The initial settings of a team project are governed by a process template.  This template configures a new team project in accordance with a specific software development methodology that the people working on the team project will follow.  TFS ships with support for two software development methodologies, but additional process templates can be added to the system, and all process templates can be extensively customized to fit the needs of your organization. &lt;br /&gt; &lt;br /&gt;&lt;h3&gt;
Components of a Team Project
&lt;/h3&gt;Understanding artifacts being leveraged within your organization, the need for cross-organizational sharing of artifacts, and the available strategies for sharing TFS artifacts across team projects will lead you to the best decision about how to structure your team projects.  The following table outlines the list of artifacts managed by TFS and the capabilities for sharing those artifacts between team projects.&lt;br /&gt;&lt;table&gt;
&lt;tr&gt;
&lt;th&gt; Artifacts &amp;amp; Settings &lt;/th&gt;&lt;th&gt; Description &lt;/th&gt;&lt;th&gt; Considerations for Structuring Team Projects &lt;/th&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Source Code &lt;/td&gt;&lt;td&gt; TFS manages your source code in its version control system.  Each team project creates a top-level folder in the version control folder hierarchy and no other files or folders can be created in the root of the version control folder hierarchy.  Every item created underneath a team project folder is “owned” by that team project. &lt;/td&gt;&lt;td&gt; Source code can be shared between team projects in various ways, including branching source from one team project into another and mapping source from another team into your workspace.  TFS does not support the Visual SourceSafe style of file sharing where a single file can be manifested in multiple locations within the version control repository. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Work Items &lt;/td&gt;&lt;td&gt; Instances of work item types allow you to define and track the work being performed within your organization.  When a new team project is established, an initial set of work items is created for you as defined in the process template used for that team project. &lt;/td&gt;&lt;td&gt; A work item belongs to the team project in which it was created and cannot be moved to another team project.  Work items can, however, be copied to another team project, at which time the fields in the newly created work item are pre-populated with the value of the corresponding fields in the source work item.  Currently, there is no mechanism for bulk-copying work items between team projects in TFS. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Work Item Types &lt;/td&gt;&lt;td&gt; The fields, form, and workflow of a TFS work item is governed by an XML definition known as the work item type.  Work item types are defined in the process template used to create a team project and can be customized as necessary after the team project is created. &lt;/td&gt;&lt;td&gt; If you plan to track work across multiple projects using the reporting mechanisms in TFS, you’ll need to ensure sufficient consistency in the work items defined in those team projects.  They do not need to be identical, but they need to share the set of fields being leveraged for these reports. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Work Item Queries &lt;/td&gt;&lt;td&gt; TFS persists a set of work item queries that provide a mechanism for team members to share views of the team’s work. &lt;/td&gt;&lt;td&gt; There is no way to structure work item queries in TFS beyond declaring them as Team queries or “My” queries.  Large team projects with a lot of queries can make it difficult to find the queries users are interested in.  This may encourage a more granular team project structure to minimize the number of queries that a single team project contains. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Team Build Types &lt;/td&gt;&lt;td&gt; Automated build definitions in TFS allow you to execute a build of your application(s) in a reproducible manner.  Each team project has a collection of build “types” associated with it.  Build types are persisted as files in the version control system. &lt;/td&gt;&lt;td&gt; By default, a single build type can only compile source from the team project in which it exists, however it is possible to &lt;a href="http://blogs.msdn.com/manishagarwal/archive/2005/12/22/506635.aspx" class="externalLink"&gt; modify the build definition to enlist source from outside of the team project&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Reports &lt;/td&gt;&lt;td&gt; Each team project creates a reporting site in SQL Reporting Services and a collection of reports that report on the progress and activity within that Team Project. &lt;/td&gt;&lt;td&gt; The data for all team projects on a given TFS exists in the same data warehouse, so it is possible to create custom reports that span multiple team projects.  However, the reports included with TFS provide only a single-project view. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Team Portal &lt;/td&gt;&lt;td&gt; Each team project creates a Windows SharePoint Services portal to be used for collaborating within that team. &lt;/td&gt;&lt;td&gt; Team projects cannot share the same team portal, however if teams wish to collaborate with each other using the same portal, they can easily agree to use the portal created for one of the teams.  SharePoint portals maintain their own set of security permissions if it’s necessary to govern portal permissions differently than other TFS permissions. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Process Guidance &lt;/td&gt;&lt;td&gt; Each team project portal contains a collection of web pages to provide guidance about how to follow the software development process being utilized. &lt;/td&gt;&lt;td&gt; Only one set of guidance exists for a given team project, however this typically does not influence the decision on how to structure team projects. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Area and Iteration Classifications &lt;/td&gt;&lt;td&gt; Area and iteration classifications provide a mechanism for you to decompose your application functionality and project timeline respectively.  These classifications can then be applied to work items and other artifacts to make it easier to find the artifacts that are appropriate for a given area of the application or iteration of the timeline. &lt;/td&gt;&lt;td&gt; Area and iteration classifications are completely contained within the team project in which they are defined and cannot be shared between team projects.  It is possible to manually replicate the area and iteration classifications between team projects if necessary.  Also, the initial area and iteration hierarchy can be defined in the process template if standardization across team projects is desired. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Security Groups &lt;/td&gt;&lt;td&gt; TFS provides a mechanism for aggregating users into security groups for the purpose of controlling access to the system.  Groups are defined at the server scope as well as the team project scope.  TFS security groups can aggregate Windows user accounts, Windows groups and other TFS groups. &lt;/td&gt;&lt;td&gt; The security groups mechanism in TFS is quite flexible and is unlikely to influence your team project structure. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Check-in Policies &lt;/td&gt;&lt;td&gt; Checkin policies provide a mechanism for validating user changes to source code before they are committed to the system.  Every team project defines a set of checkin policies that will apply to checkins in that team project. &lt;/td&gt;&lt;td&gt; Checkin policies cannot span multiple team projects, however policy definitions can be manually replicated to other team projects.  Furthermore, checkin policies cannot be scoped to a subsection of the team project source, making it sometimes difficult to work with checkin policies when a team project contains a multitude of subteams.  The Team Foundation Power Tools contain a checkin policy that can be used to scope other checkin policies to specific areas of the source tree. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Exclusive Check-out &lt;/td&gt;&lt;td&gt; A team project can specify whether files in version control will be locked when checked out or remain available for additional parallel checkouts. &lt;/td&gt;&lt;td&gt; Because the exclusive checkout setting is scoped to the entire team project, sub-teams wishing to work differently will need to come to an agreement about whether or not they’ll enable this feature. &lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt; &lt;br /&gt;&lt;h3&gt;
Team Project Scalability
&lt;/h3&gt;For some customers, the most important consideration in structuring team projects is the number of team projects that can co-exist on a TFS without significantly hindering server performance.  Scalability of team projects is limited by the complexity of the work item types defined on the server.  The work item types included in MSF for Agile Software Development have been shown to scale to support 500 team projects on a server.  Similar testing with the work items in MSF for CMMI Process Improvement have been shown to support 250 team projects on a server.  For more information about team project scalability, go &lt;a href="here:http://msdn2.microsoft.com/en-us/library/aa974183(vs.80).aspx" class="externalLink"&gt;here:http://msdn2.microsoft.com/en-us/library/aa974183(vs.80).aspx&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Strategies for Employing Team Projects
&lt;/h2&gt;There is no one right way to structure your team projects, and your needs may change as your software development process evolves.  That being said, there are 3 common strategies used to structure team projects.  You may find that one of these strategies fills the needs of your organization or that you’ll choose a combination of these strategies as appropriate for the nature of your work.&lt;br /&gt; &lt;br /&gt;&lt;h3&gt;
Strategy 1: Team Project Per Application
&lt;/h3&gt;The most common strategy for creating team projects is to create one for each application under development.  This strategy can support both large and small applications, as well as multiple releases of applications being developed in parallel.  Various releases of the application are manifested in the version control system as source branches, and in other parts of TFS as different nodes in the iteration classification hierarchy.  If appropriate, documentation for each release that is stored in the SharePoint portal can be managed in different document libraries.&lt;br /&gt;Following this strategy greatly simplifies the process of moving requirements, features, scenarios, and bugs between releases.  When an item needs to be pushed out or brought it, it is signified by simply changing the iteration path to reflect the new target release.&lt;br /&gt;The biggest drawback to this strategy is that the software development process for all releases of the application are tightly bound.  For example, two releases of an application being developed in parallel would need to use the same work item types, the same checkin policies, and follow the same process guidance.&lt;br /&gt;Another potential drawback is that you may need to customize the reports included with your process template to get an appropriate view of what is happening in a given release.  Most reports included with the common process templates provide a team-project-wide view of what is happening; to get a view that is focused on a single release, you may need to add additional filtering for that release.&lt;br /&gt;Over the course of multiple releases, you may find that your team project for a given application has developed a lot of “baggage.”  This could include old work items that are no longer needed, old specs on the portal that should have been discarded, or old data in the data warehouse that could cloud your view of team progress.  Additionally, you may decide at some point that you’d like to change your software development methodology and desire to retool your team project to support that methodology.  At that time, you may find it is appropriate to create a new team project for this application, starting clean with a new process template, a new set of work items and a new project portal.  You can then branch source from the previous team project to the new one, and copy work items as appropriate to the new team project.&lt;br /&gt;Finally, an organization managing hundreds of small applications may eventually reach the scalability limits of TFS.  For more information, see the previous subject on Team Project Scalability.&lt;br /&gt; &lt;br /&gt;&lt;h3&gt;
Strategy 2: Team Project Per Release
&lt;/h3&gt;In the “Team Project Per Release” strategy, every major application release starts a new team project.  This strategy works well for very large teams who are often working on long-term projects.  For these teams, a major release is an opportunity to start clean with a new team project that doesn’t carry forward any baggage from the previous release.  By starting with a new team project they can also select a different process template that supports a different development methodology than they had previously followed.  They can also selectively move forward artifacts from the previous release to eliminate some of the baggage frequently left over from a multi-year effort.  The team project from the current release can continue to be leveraged for maintenance activities on the release, potentially with a different team that is responsible for sustaining engineering.&lt;br /&gt;The primary disadvantage with this strategy lies in the difficulty of moving data forward from one team project to the next.  It is relatively easy to move source code between team projects, typically by branching the source into the new team project.  Moving work items forward, however, is more difficult.  TFS provides the ability to copy a work item from one team project to another, but that only works on one work item at a time.  To copy a set of work items between team projects, you would need to write your own custom utility with the TFS object model.&lt;br /&gt;Server scalability can also be a concern with this model, however usually organizations engaged in these projects find they are managing a few large efforts rather than many small efforts.  The server scalability concerns related to structuring your team projects only come into play when managing hundreds of team projects on a Team Foundation Server.  For specific scalability numbers, see the previous subject on Team Project Scalability.&lt;br /&gt; &lt;br /&gt;&lt;h3&gt;
Strategy 3: Team Project Per Team
&lt;/h3&gt;For a few customers, the best way to structure team projects is to align them with the team boundaries in their organization.  This strategy closely aligns a team with the workflows defined in TFS work item types and provides a unit of reporting that spans the entire team.  For customers looking to centrally control and monitor the activities of software development teams, this may be the best approach.&lt;br /&gt;This strategy can be a necessity when encountering the team project scalability limitations discussed previously.  Organizations that manage several hundred applications may find that they need to group applications together under a fewer number of team projects.  An appropriate criteria for grouping these applications is frequently to cluster together applications developed by the same team.&lt;br /&gt;The primary disadvantage of this approach is that it precludes specialization of the software development process for a particular application or release.  If one application in an organization needs a new field on a work item type, all applications will get that new field.  Additionally, reports that show timeline details of the team project lose their value if the applications managed in the team project are not working toward the same timeline.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Providing Substructure Within a Team Project
&lt;/h2&gt;Regardless of the strategy you choose, you will need to provide some level of substructure to your team project.  If you select the team project per application model, you may need to create substructure for each release.  If you are working on a very large application and select the team project per release model, you may need to establish substructure for subcomponents of the application.  And if you select the team project per team model, you will probably need to establish substructure for the applications that the team works on.&lt;br /&gt;The mechanisms for providing substructure depend on the type of artifact being managed.  The following table discusses the substructure mechanisms for the artifacts and settings discussed previously.&lt;br /&gt; &lt;br /&gt;&lt;table&gt;
&lt;tr&gt;
&lt;th&gt; Artifacts &amp;amp; Settings &lt;/th&gt;&lt;th&gt; Substructure Mechanisms &lt;/th&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Source Code &lt;/td&gt;&lt;td&gt; The top level structure for source code within a team project is typically a “branch.”  Branches in TFS appear as copies of the files and folders they are branched from.  Frequently, the first thing you’ll do in source control for a new team project is to create a new folder with a name like “main” that constitutes the main branch for your source.  Future branches would likely be made using that folder as the source.  Within a branch, structure is typically provided with a folder hierarchy of your choosing.      If you find you have a proliferation of branches, it is possible to group related branches underneath a single folder.  For example, if you have several branches working in parallel for a given release, you may choose to create a folder for that release and then create your branches underneath that folder.  If you’ve already created your branches and wish to reorganize them, you can move the root folder of the branch to the new location with the move operation. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Work Items &lt;/td&gt;&lt;td&gt; Work items are classified according to 2 dimensions: the area path and the iteration path.  The area path classification can be used to classify work items for particular components within an application or applications within an application suite.  The iteration path can be used to classify work items for a given release or a particular iteration of development within a release. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Work Item Types &lt;/td&gt;&lt;td&gt; There is no way to provide substructure to the list of work item types in a team project, however most team projects limit themselves to a few work item types and substructure is not needed. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Team Build Types &lt;/td&gt;&lt;td&gt; There is no way to provide substructure to the list of team build types in a team project, however it is uncommon to maintain an overwhelmingly long list of team build types.  If you are building multiple applications within a given team project, it may be advisable to have several of them build with the same build type. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Reports &lt;/td&gt;&lt;td&gt; SQL Reporting Services allows for reports to be structured into folders.  This folder structure is reflected into the Team Explorer in Visual Studio. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Team Portal &lt;/td&gt;&lt;td&gt; Sharepoint provides multiple options for structuring documents stored in the team portal.  At the top level, multiple document libraries can be maintained for managing documents with different purposes (such as audiences).  Each document library can maintain a unique metadata schema allowing you to track different information about documents based on the library in which they live.  Beneath a document library, an arbitrary depth of folders can be established for further structure.  Document libraries and the folder structure underneath them are both reflected in the Team Explorer in Visual Studio.  At a higher level, sub-sites can also be created in Sharepoint for providing a customized portal for a subset of team project members.  Sub-sites are not reflected into the Team Explorer in Visual Studio. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Process Guidance &lt;/td&gt;&lt;td&gt; The process guidance that exists on the team portal is a set of web pages describing the software development methodology being followed.  If a subset of the members of a team project need customized guidance, it can be reflected on the existing process guidance pages, or a new set of pages can be created. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Area and Iteration Classifications &lt;/td&gt;&lt;td&gt; The area and iteration classifications are both hierarchies that can be structured as appropriate to represent the functional and temporal breakdown of your application respectively.  As mentioned previously, if you are managing multiple applications in a team project, you’ll likely want the top level of the area hierarchy to reflect the applications being managed.  Similarly, if you are representing multiple releases in a team project, you’ll likely want the top level of the iteration hierarchy to reflect the releases. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Security Groups &lt;/td&gt;&lt;td&gt; TFS provides a built-in security group mechanism that allows you to manage group membership in TFS rather than through Active Directory or the operating system.  These groups can contain any arbitrary set of windows users, windows groups, or other TFS groups.  As such, you can subdivide your team as necessary, define the needed groups to represent those subdivisions, and then create additional groups to aggregate those into larger lists of users. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Check-in Policies &lt;/td&gt;&lt;td&gt; Check-in policies are scoped to all source in a team project.  This can make it challenging to manage a large source base in a team project because the policies you wish to define for one part of the source tree may not apply for another part of the source tree.  The latest release of the &lt;a href="Team%20Foundation%20Power%20Tools:http://go.microsoft.com/?linkid=5422499" class="externalLink"&gt;Team Foundation Power Tools:http://go.microsoft.com/?linkid=5422499&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; provides a check-in policy that can be used to scope other check-in policies to a subset of the source tree for a team project. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Exclusive Check-out &lt;/td&gt;&lt;td&gt; Exclusive checkout in version control can be enabled only at the team project level and not on a subsection of the team project source. &lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt; &lt;br /&gt;&lt;h2&gt;
Other Common Questions
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;How do I structure my team projects for development that is geographically distributed?  &lt;/li&gt;
&lt;/ul&gt;Team Foundation Server is built to handle the needs of distributed development teams.  The optimized web service protocol and the TFS Proxy server provide an experience for remote users that is comparable to that of users at the site where the server is located.  As such, you need not factor geography into your decision about how to structure your team projects.&lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Where do I store shared source that is used by multiple team projects?&lt;/li&gt;
&lt;/ul&gt;Team Foundation Server enforces a practice where all top-level items in the version control system are folders for Team Projects.  It’s not possible to create a folder in version control that does not fall underneath the root folder of a given Team Project.  Consequently, all source belongs to a particular team project.&lt;br /&gt;If you have source that is leveraged by multiple team projects, you have a couple options for handling it.  First, if one team project clearly owns the source, it’s probably appropriate to manage that source under that team project.  If, however, ownership does not lie with a particular team project, you may wish to create a team project specifically for shared source code.  This also provides a convenient place to manage artifacts associated with that shared source such as design documents and bugs.&lt;br /&gt;For the teams consuming the shared source, you have a couple of options.  First, those teams can merely map the source from the shared location into their workspaces on the client machine.  This creates a configuration that unifies the source from the shared location and their own project on the client-side.  Alternatively, the consuming team can branch the source from the shared location into their own team project.  This creates a configuration that unifies the source from the shared location and their own project on the server-side.  The big difference between these two options is latency in picking up changes to the shared source.  In the first case, shared source changes are picked up every time the latest source is retrieved into the workspace.  In the second case, shared source changes are picked up as part of a merge process between the branches.  This makes the decision to pick up changes in the shared source much more explicit.&lt;br /&gt;&lt;ul&gt;
&lt;li&gt;How should I structure my branches?&lt;/li&gt;
&lt;/ul&gt;With the exception of the code sharing model discussed above, branch structure is an orthogonal question to team project structure and one that deserves its own document.  A group of engineers from the Visual Studio Team System team recently published a very comprehensive document on the topic.  Rather than reproduce that information here, let me refer you to its &lt;a href="location%20:%20http://www.codeplex.com/BranchingGuidance" class="externalLink"&gt;location : http://www.codeplex.com/BranchingGuidance&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;
&lt;/div&gt;</description><author>grahamba</author><pubDate>Thu, 26 Apr 2007 21:08:28 GMT</pubDate><guid isPermaLink="false">UPDATED WIKI: Guidance for Structuring Team Projects 20070426090828P</guid></item><item><title>UPDATED WIKI: Guidance for Structuring Team Projects</title><link>http://www.codeplex.com/BranchingGuidance/Wiki/View.aspx?title=Guidance for Structuring Team Projects&amp;version=18</link><description>&lt;div class="wikidoc"&gt;
&lt;img src="http://www.codeplex.com/BranchingGuidance/Project/FileDownload.aspx?DownloadId=11243" alt="VSTSLogo.gif" /&gt;&lt;br /&gt; &lt;br /&gt;&lt;h1&gt;
Guidance for Structuring Team Projects
&lt;/h1&gt;- &lt;i&gt;Doug Neumann&lt;/i&gt; - &lt;i&gt;Microsoft Corporation&lt;/i&gt;&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Introduction
&lt;/h2&gt;One of the most important considerations when looking to deploy Team Foundation Server within your organization is how you will employ the “Team Project” concept.  It can be very tempting to jump in and immediately start creating Team Projects to satisfy every whim of the users in your organization.  However, restructuring existing team projects is difficult to accomplish, so establishing a strategy for using team projects up front is very important.  Careful forethought now can save you much pain down the road.&lt;br /&gt;This whitepaper provides details on the components of a team project and discusses how those components may impact your decision about structuring your team projects.  It also lays out a set of common strategies for employing team projects.  Understanding this base of knowledge should empower you to make the best decision on how your organization will use team projects with Team Foundation Server (TFS).&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
What is a Team Project?
&lt;/h2&gt;A TFS Team Project is a collection of artifacts that is used by a team of individuals to perform and track a related set of work.  All artifacts stored in TFS belong to one and only one Team Project, and you cannot begin working in TFS until you have created at least one Team Project.  Team Projects are created by a TFS administrator using the Team Project Creation Wizard.&lt;br /&gt;The initial settings of a team project are governed by a process template.  This template configures a new team project in accordance with a specific software development methodology that the people working on the team project will follow.  TFS ships with support for two software development methodologies, but additional process templates can be added to the system, and all process templates can be extensively customized to fit the needs of your organization. &lt;br /&gt; &lt;br /&gt;&lt;h3&gt;
Components of a Team Project
&lt;/h3&gt;Understanding artifacts being leveraged within your organization, the need for cross-organizational sharing of artifacts, and the available strategies for sharing TFS artifacts across team projects will lead you to the best decision about how to structure your team projects.  The following table outlines the list of artifacts managed by TFS and the capabilities for sharing those artifacts between team projects.&lt;br /&gt;&lt;table&gt;
&lt;tr&gt;
&lt;th&gt; Artifacts &amp;amp; Settings &lt;/th&gt;&lt;th&gt; Description &lt;/th&gt;&lt;th&gt; Considerations for Structuring Team Projects &lt;/th&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Source Code &lt;/td&gt;&lt;td&gt; TFS manages your source code in its version control system.  Each team project creates a top-level folder in the version control folder hierarchy and no other files or folders can be created in the root of the version control folder hierarchy.  Every item created underneath a team project folder is “owned” by that team project. &lt;/td&gt;&lt;td&gt; Source code can be shared between team projects in various ways, including branching source from one team project into another and mapping source from another team into your workspace.  TFS does not support the Visual SourceSafe style of file sharing where a single file can be manifested in multiple locations within the version control repository. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Work Items &lt;/td&gt;&lt;td&gt; Instances of work item types allow you to define and track the work being performed within your organization.  When a new team project is established, an initial set of work items is created for you as defined in the process template used for that team project. &lt;/td&gt;&lt;td&gt; A work item belongs to the team project in which it was created and cannot be moved to another team project.  Work items can, however, be copied to another team project, at which time the fields in the newly created work item are pre-populated with the value of the corresponding fields in the source work item.  Currently, there is no mechanism for bulk-copying work items between team projects in TFS. &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; Work Item Types &lt;/td&gt;&lt;td&gt;