"I regard it a basic programmer's right that I should be able to, at any time, check out all the source code and build it."
-Caroline Foster on the Extreme Programming Yahoo Groups list, February 2003.
Being able to reliably create a version of your application that is consistent, regarless of where you are creating it is a key success factor for a project. All code starts in a developer workspace, and the more attention you pay to setting up the workspace, the better you will be in the long run. Private Workspace is one of the central patterns in the SCM Pattern Language. This article also follows up on our promise to fill in some of the details from our article The Importance of Building Earnestly.
Effective private workspaces give you the following advantages:
- Repeatability: Developers are building, testing and deploying many times a day. This gives you amble opportunity to find problems with the code and the deployment and install process before you unleash your code on customers (or Quality Assurance Teams). This repeatability leads to reproducibility
- Productivity: By providing a way for developers to control how and when they start working with new code you allow them to focus on the task at hand and minimize interruptions in thought (and enabling flow). This helps the individual. Likewise by providing build and test processes that developers run pre-commit, you catch integration issues before they make it into the repository, and improve the productivity of the team
- Progress: By enabling frequent integration and testing, you give developers more confidence in the codebase. This will enable them to feel more comfortable about integrating frequently, and moving forward in a regular fashion
- Accountability: Developing build and integration processes at the beginning of the process allows you to get the application to a point where you can demonstrate it to stakeholders earlier
While it may not be trivial to create private workspaces, the benefits allow you gain make it well worth the effort.
What Is a Workspace?
Before we go forward, let's define what a workspace is. A workspace is:
- Code and other files that you are working on
- Any locally built components, which you create from the source code (or retrieved from a repository in a controlled fashion)
- Third party components at the correct version for the project
- Resources that you need to run and test the application. For example, if your application updates a database, you should have a private database schema, or if your application uses more than one schema, a private copy of the database
- Any tools that you need. If the tools are the same for all versions of your app, they can be centrally installed, or they are be associated with a specific component
The key theme here is that you should have (in effect) a private copy of:
- Any resource that you write to. This includes both "soft" entities such as source code and database space, as well as "hard entities" such as network devices or application servers
- Any resource that might change over the course of the project so that you can control when to accept the change. This includes, among other things, code, libraries, and databases
You should be able to create a Private Workspace with a simple process not too different from:
- Install a version management client
- Check out the files for the appropriate version of the application
- Execute a script to build, configure and deploy your application
There may be some extra steps, to be sure, but you want to automate as many steps as possible to ensure that the process is reproducible. Allowing developers to create Private workspaces easily is a core element of the Agile Cycle.