Continued from Part 1 of 10, Part 2 of 10, Part 3 of 10, Part 4 of 10, Part 5 of 10, Part 6 of 10, Part 7 of 10, Part 8 of 10
The hypothetical Company X is a software development house, with 300 technical resources, 5 main project teams, and an average of 8 mainstream projects and 3 releases per project team per year. One of the project teams is solely responsible for common utility code and frameworks, re-used across team projects.
Each project team has its own project managers and executives, operating as independent silos within the organization. Within each team, each project manager is responsible for and able to select the area of specific methodology, unless a customer requirement dictates a predefined process.
Releases predominantly drive all teams, which also perform the ongoing maintenance with all released solutions, often with parallel releases and maintenance revisions. Although no formal process is enforced, most teams prefer an agile scrum methodology approach and project management is looking for more real-time status information on work in progress, testing and the quality thereof.
They installed a centralized Team Foundation Server, configured for use by all of the project teams and technical resources. They use ongoing boot camp style VSTS training and technology awareness sessions, to educate all technical resources to understand and use TFS and VSTS features effectively.
Environment Adoption
The environment differs from team to team. The customer of the custom solutions often dictates this. In general, the company has adopted an informal development and testing environment, allowing the introducing of a more controlled and monitored environment as documented in section Team Environment on page 3. The proposed environment integrates with TFS, allowing business analysts, end-users and other stakeholders to raise work items for new features, defects and general tasks for completion as part of the project.
The implementation of TFS and the encompassing ALM environment is limited to team projects, work items, version control and the use of basic unit testing. They will introduce other TFS features when the stakeholders are efficient with the phase 1 features and once there is bandwidth for further investigation, planning and training to implement automated builds and testing.
Team Project
To work out the recommended team project structure we should perform a simple calculation of the expected number of team projects required to support the average release schedule:
Year Buffer = 500 / ( number of teams * number of projects per team * releases per project)
= 500 / ( 5 * 8 * 3 )
= 500 / 120
= 4.167 approximate years before the 500 team project limit is breeched
Although this seems to indicate a comfortable time zone, during or after which a TFS server upgrade is required anyhow, the company structure of independent project management areas leans towards a per- team granularity. Finally, the fact that within each team a project manager (or customer) selects any methodology, we need to drop back, by one granularity, to the per-solution team project granularity. This strategy allows each solution to start based on a specific methodology, i.e. MSF Agile or CMMI, and categorizes work items and other team project artifacts on a per-solution basis. While this approach requires more effort to aggregate team-level status reports, it gives the project managers and other solution stakeholders complete control over their solution specific ALM environment.
The company “Company X” and all shown projects are hypothetical and not related to any actual company or projects. Any similarities are purely coincidental.
The recommended team project categorization is therefore as shown below:
Figure 15 – Team Project structure
Solution & Source Tree
The recommended server and client side source tree structures are outlined on page 8, as well as a partitioned solution structure is ideal and suitable for all teams across CompanyX.
The source tree strategy will introduce a common look and feel, improve maintainability and referencing, and yet still allow for team specific customization under the source node. The ability to customize within the source node will allow development teams to use their well-known structure, minimizing impact on their current development, test and build environments if necessary.
A consistent solution and source tree strategy will also ensure that a common build strategy and sharing of build scripts and other artifacts will minimize the overall automation of the build environment in phases 2, 3 or later.
Where needed it is recommended to also sub-divide the source node into functional areas, i.e. user interface, backend servers, batch services, etc. to introduce a source tree structure that can correlate with team project process areas. This would vastly improve readability and thus productivity of all stakeholders.
Branching
Based on the release, maintenance and obvious need for concurrent development, the suggested branching strategy is per-release branching.
Each team would need to assign a merge master, who defines and manages the forward integration (FI) and reverse integration (RI) within the source tree, including the definition of events that trigger a FI or RI event and the quality bar for conducting the integration. Quality branching and merging will ensure that incorrect integration will not affect the team productivity.
Figure 16 – Branching Strategy
It is important that the team defines dev, main and prod branches, or branches that suit their environment, and then agree on what is forward and what is reverse integration. This specific environment can be highly confusing if done in a non standardised manner within the organisation ... hopefully future versions of VSTS/TFS will make the world of dense forests and branches more visual and clearer to visually understand. The next generation of the tools are showing a lot of promising innovations q;-)
Dependencies
Finally the dependency strategy is recommended to be server based, not workspace mapping based, whereby the referred dependency is solution based dependencies, and using branching from common team projects, such as the mentioned common code and framework projects as shown in the following illustration:
Figure 17 – Dependency strategy
The dependency and branching strategies are both in support of the concurrent development, as well as the re-use and sharing of common code, frameworks and projects. By using the server side dependency strategy the teams can also carry the dependencies through to the IDE and the build server without any customised and maintenance intensive workspace mappings.
... to be continued.