Creating an effective infrastructure for the software development process can make a huge difference in the productivity of any team. In today’s environment of distributed and global development, it is even more important that the right tools for the creation, capture and preservation of knowledge and intellectual property are put in place from the outset.
We have found the following tools to be help teams of software developers.
Source Control System (SCS)
The product of a software development process is source code. All the investment and effort of the process ultimately goes towards producing this asset. Therefore, it is important that the source code is protected on an ongoing basis. However, a source control system is more than just a backup. It needs to aid in the development process by providing features such version management, roll-back, and support for branching.
A set of desirable features for a source control system are:
- Maintenance of version history: The SCS should be able to maintain the version of each check-in to the code so that the state of the code as it existed at an earlier time can be recreated as necessary.
- Atomic commits: The SCS should support atomic commit so that a commit failure does not leave the SCS in an inconsistent state.
- Support secure Internet access: The SCS should support access in a secure manner over the Internet so that distributed teams can collaborate.
- Efficient Branching and Tagging: The development team should be able to tag any revision as a significant revision. During the development process, it will be necessary to branch the code for operations such as development of a new version and bug fixing. The SCS should provide support for creating and new branches and for merging. In particular, good SCSs will create a lazy copy for a branch so that multiple identical copies of files are not created.
There are a number of commercial SCS (Perforce, Clear Case, Microsoft Source Safe) as well open source SCSs (Subversion, CVS).
We have used Subversion with success in co-located as well as distributed teams.
Bug or Issue Tracker
Where there is code, there are bugs!
An effective bug and issue tracking system is critical to build and maintain quality of code. It is important to be able to log issues and defects as they arise so that decisions as to the priority and scheduling of the issue can be made.
A good bug/defect/issue tracker system should support:
- Simple user interface
- Search and filtering capability
- Notification system
- Support for work flows
- Access control
- Integration with source control system
- Custom Fields
- Monitoring capability
There are a number of commercial (ClearQuest, BMC Desk Express, JIRA) and open-source issue tracking (e.g., Bugzilla, Mantis) systems
We have found Mantis, an open-source tracking system to be an effective system providing all of the above features.
Continuous Integration
The traditional model of breaking your development into modules, developing the modules independently and then, late in the development cycle, integrating them into one whole system is fraught with finding incompatibilities and system-level issues late in the process when everyone is in a crunch. Most often, it leads to schedule slippages, buggy software and unhappy customers.
Continuous Integration (CI) is a means of reducing the chances of finding surprises late in the development cycle. CI involves building the latest code into a package to make sure that the code at least compiles and any recent changes have not caused compile failures. In addition, a good CI process should deploy the code as well as run automated tests to catch regression failures due to new changes in the code.
CruiseControl is a popular continuous integration tool that supports automated builds and test integration. It also supports a web-based console for the tool.
Wiki
A wiki is a collaborative communication tool. Simply put, it is a website that can be edited by authorized users using the web interface itself. Most wikis support versioning so that any old version of the edited page can be viewed or recovered. Wikis provide a simplified mark up language so that an editor can created a formatted page with different formatting elements such font styles, indentations, and tables.
A wiki provides a mechanism for the team to create areas of discussion. The informal nature of content creation on a Wiki encourages team members to create content more rapidly and keep them more current than in more formal documents. In addition, the web nature of the tool make the wiki available to every member of the team irrespective of location and time. In addition, a wiki always provides the latest version of the document as opposed to documents created as MS Word files or in some such desktop tool.
There are a variety of commercial (Confluence, SocialText) as well as open-source (e.g., MediaWiki) wikis.
Automated Testing System
For any project of significant value, the number of tests to perform feature, acceptance and regression testing will grow in to the thousands. In many cases, the ability of the QA team to run these tests becomes a gating factor for how quickly and how often new features can be released. I speak from experience!
The good news is that a large percentage of these test can be automated resulting in significant savings in human effort. And since it is much cheaper and easier to put additional computers into service than hiring new QA personnel, automating tests has a great return on investment.
There are a number of test automation levels (unit testing, acceptance testing) and tools (Junit, Winrunner, WATIR).
Test Tracking System
A test tracking system is an important tool for a Quality Assurance (QA) team. This tool lets the QA team keep track of the test cases to test a product in a systematic manner. These tools let the team organize the test cases in test scripts and test plans. Good test tracking systems also integrate with the bug tracking system This way failed tests can be linked to bugs when when fixed get reflected in the test case. Also, integration into a test automation system enables the running of the test cases and updating the pass/fail status of the system.
In summary, installing a set of collaboration tools and using them in a disciplined manner can increase the productivity of a software development team significantly. And, most tools are now available in open source form, there by reducing the investment into these tools.