Software Development Tools

A preliminary analysis of project management and development tools.
This document loosely discusses:
  • Project management software.
  • Subversion revision control.
  • Continuous build integration.
  • Documentation tools (Wiki).
  • Bug tracking.
  • Unit testing and code coverage.
Caveat Emptor
This document was written in October 2005, as consultancy for a software house in Germany. I have published it here, both for nostalgic reasons, and because it still has relevance. It may be updated at some time in the future. Some of the hyperlinks may no longer be available.
This document analyses a series of commercial and open source tools which provide one or more of the above elements. Selections have been made on the basis of functionality, price (for commercial software), and programming language (for open source software).
A short list of products is provided, and work will continue in analysing the most effective spread of products to be suit the needs of webteam.
Much of the software functionality described below is available in the Visual Studio Team System. This type of solution is both expensive, (about $2,500 per developer), and specific to Microsoft only products. Personalisation of this product will possibly have as high a learning curve as the products detailed in this document. An open source project has been started in response to Visual Studio Team system, but is still in an early stage.
Nonetheless, with company-name being a Microsoft shop, this may be a viable alternative. The most important point of concern, however, is the total lack of support for VB6 in such a product.
There remains the 'dangling' question of moving away from VB6 (no longer supported by Microsoft since 31/03/2005) to an alternative, such as VB.Net or Python or both. Further, the .Net solution is impractical for all current Windows operating systems as a client application architecture.
Table of Contents

Caveat Emptor

This is a preliminary study. Some of the information in this document may change before final release.

Trademarks

Windows is a trademark of Microsoft.
All other trademarks are the property of their respective owners.

Subversion Revision Control

The revision control system subversion is the modern heir of CVS, and is now gaining critical mass with open source projects. Other revision control systems, such as CVS, Perforce, and Visual Source Safe, will not be taken into consideration in this document.
Subversion on Windows
There is a Windows one click solution which installs Subversion, Tortoise, and the windows service wrapper, but not the Python bindings.
Download the latest version (1.2.3), Windows server platform binaries. Since the Berkeley DB can give problems (not only on Windows systems), it may be better to use the file system storage mechanism. Also download the Subversion Python bindings, these are needed by Trac.
A Windows based client is available as an Explorer plug-in.
The Windows service wrapper is also required.
Ther are also other third party plug-ins for svn. These include Visual Studio .Net, Microsoft SSC API (good for Visual Studio, I think), Eclipse, visual source safe to svn converter, and the Windows service wrapper.
There is a downloadable PDF book on subversion available.
For encryption the svn server can be tunnelled via ssh. A windows ssh server is available. Use of ssh with subversion is not discussed in this document, but will be necessary if the subversion system is to be made accessible from the Internet.
For remote developers (such as myself) the SVK decentralised revision control project, which uses subversion, may provide replication solutions.

Installation

Double click on Svn1ClickSetup-xxx.exe and follow the wizard instructions. I used all the standard default values. The APR_ICONV_PATH was set correctly by the setup program.
The installer creates a Berkeley DB repository in C:\svnrepos. This is not quite what we want, as we'll use FSFS (OS file system) for the database.
In the Windows Program files directory, move to Subversion\bin. Open a DOS prompt and close down the svn server:
SVNService -remove
Now delete the old repository with Explorer, and create the new FSFS repository:
svnadmin create –fs-type fsfs c:/svnrepos
Finally restart the svn windows service:
svnservice -install -d -r c:/svnrepos
The TortoiseSVN client (embedded in Explorer) can now be used to import (to the SVN repository) the project directories. When importing a directory, add that directory to the repository URL, for example, with a repository of C:/svnrepos, and a directory of O:/dev/VbStringLibrary, right click in Explorer and select TortoiseSVN -> Import..., and specify the repository URL as file:///C:/svnrepos/VbStringLibrary.
Now delete (or more safely rename) the imported directory, then check out the project from the svn repository. Move to the parent directory where you want the working copy of the project to be stored, then right click and select SVNCheckout... For the repository URL use file:///C:/svnrepos/VbStringLibrary, and add the project name to the output directory, O:/dev/VbStringLibrary.
Separating projects
It is advisable to prefix all company specific code in a company specific directory of the Subversion repository, so that external vendor software can also be tracked in a vendor directory of the repository, see Vendor Branches in the Subversion book, page 137.

Project Management

There are numerous project management software packages available, too many to be able to analyse in a brief period of time. We're specifically looking for web based products (for long distance collaboration), Agile methodology built-in, revision control interface, issue (bug) tracking, collaborative documentation, and extensibility. Fortunately this narrows the field a lot. I have further reduced the list to just four, which I will describe further below.
The other runners which I did not go beyond scanning the web pages are:

TargetProcess

Web based, Agile project management application. Written for .Net, so I presume it's in C#. $150 per user, or a hefty $8,500 enterprise version with source code. Doesn't (yet) have revision control integration.

Conclusion

Since it's Agile based and has reasonable per user costs, this is a good contender for our purposes. Wiki and subversion integration are on the roadmap for 2006, but don't hold your breath.

ExtremePlanner

Web based, Agile project management application. Windows server platform. $80 per user. No source code, no revision control, no wiki.

Conclusion

Since it's Agile based and has reasonable per user costs, this is a good contender for our purposes, but probably not as good as TargetProcess.

Xplanner

Java based open source, Agile project management application. No revision control integration.

Conclusion

Since it's Agile based this is a good contender for our purposes, but being Java doesn't help if we (all) want to do some hacking.

Trac

Python based open source. Standard (not Agile specific) project management, Subversion integration, collaboration documentation (wiki), issue tracking.

Conclusion

Has better integration features, is a smaller codebase (being Python) than xplanner. Very popular in the open source world, however xplanner is newer so doesn't yet have the following. May be easier to hack. So this is the one we'll start with.

Trac Review

Brief notes and comments on installing and using Trac.

Installing

Make sure you have installed subversion before beginning this section.
Download and install the following:
  • The Python interpreter. (I would suggest the source and windows installer package, current version 2.42)
  • wxPython (not needed for Trac, but provides a better cross platform GUI), be sure to get the unicode version that matches the python version.
  • Boa Constuctor (not needed for Trac, but a good IDE for Python) .
  • Trac (be sure to pick up the 0.9beta2 release, and not the earlier 0.8.4 stable release).
  • ClearSilver library (use the latest Windows installer for Python 2.4).
  • Python bindings for Subversion.
  • SQLite, choose the DLL without TCL bindings. Extract the contents into the DLLs subdirectory of your Python interpreter directory (for example, C:\Python24\DLLs).
  • PySQLite, choosing the Windows binaries for Python 2.4 version 1.1.6 not version 2.x.x.
  • Setup tools, download and run the ez_setup.py installer, and run it.
  • WebAdmin plugin, then follow the instructions on how to build the plugin.
For this test I will use the Trac stand alone server tracd, though for a system installation, Apache 2.0 should be used.

Building a Trac Project

Some small problems with the 0.9beta2 release (may not occur on your system, as I ended up installing much more than I have listed above):
In trac\versioncontrol\svn_fs.py changed line 27 to: (svn library version incompatibility)
#from svn import fs, repos, core, delta
from svn import fs, repos, delta
from libsvn import core
Same file line 390 changed to: (Windows CRLF problem?)
change = newer[0] == older[0] and Changeset.EDIT or Changeset.COPY
To build the Trac repository type, first create the root directory C:\tracrepos, then open a DOS prompt in the Scripts subdirectory of the Python interpreter directory (for example, C:\Python24\Scripts) and type
trac-admin C:\tracrepos\project-name initenv
For project-name, give the Subversion project name, example VbStringLibrary.
When asked for the project name at the prompt, give the Subversion project name, for example VbStringLibrary.
When asked for the path to the repository, give the Subversion repository path, for example C:\svnrepos.
For the templates directory, use the default value (just press Enter).
Next, build the user digest file, using the following script:
from optparse import OptionParser
import md5

          
# build the options
usage = "usage: %prog [options]"
parser = OptionParser(usage=usage)
parser.add_option("-u", "--username",action="store", dest="username", type = "string",
                  help="the username for whom to generate a password")
parser.add_option("-p", "--password",action="store", dest="password", type = "string",
                  help="the password to use")
(options, args) = parser.parse_args()

          
# check options
if (options.username is None) or (options.password is None):
   parser.error("You must supply both the username and password")
   
# Generate the string to enter into the htdigest file
realm = 'trac'
kd = lambda x: md5.md5(':'.join(x)).hexdigest()
print ':'.join((options.username, realm, kd([options.username, realm, options.password])))
which I named trac-digest and stored in the Scripts directory of the python interpreter (for example, C:\Python24\Scripts)
Next create the users, from a DOS prompt in the Scripts directory:
trac-digest -u jhl -p password > VbStringLibrary.digest
trac-digest -u client -p password > VbStringLibrary.digest
Then use trac-admin to create the permissions for three profiles (same DOS prompt):
trac-admin c:\tracrepos\VbStringLibrary permission remove anonymous TICKET_CREATE
trac-admin c:\tracrepos\VbStringLibrary permission remove anonymous TICKET_MODIFY
trac-admin c:\tracrepos\VbStringLibrary permission remove anonymous WIKI_CREATE
trac-admin c:\tracrepos\VbStringLibrary permission remove anonymous WIKI_MODIFY
trac-admin c:\tracrepos\VbStringLibrary permission remove anonymous BROWSER_VIEW
trac-admin c:\tracrepos\VbStringLibrary permission remove anonymous CHANGESET_VIEW
trac-admin c:\tracrepos\VbStringLibrary permission remove anonymous FILE_VIEW
trac-admin c:\tracrepos\VbStringLibrary permission remove anonymous LOG_VIEW
trac-admin c:\tracrepos\VbStringLibrary permission remove anonymous MILESTONE_VIEW
trac-admin c:\tracrepos\VbStringLibrary permission remove anonymous REPORT_SQL_VIEW
trac-admin c:\tracrepos\VbStringLibrary permission remove anonymous REPORT_VIEW
trac-admin c:\tracrepos\VbStringLibrary permission remove anonymous ROADMAP_VIEW
trac-admin c:\tracrepos\VbStringLibrary permission remove anonymous SEARCH_VIEW
trac-admin c:\tracrepos\VbStringLibrary permission remove anonymous TICKET_VIEW
trac-admin c:\tracrepos\VbStringLibrary permission remove anonymous TIMELINE_VIEW
trac-admin c:\tracrepos\VbStringLibrary permission remove anonymous WIKI_VIEW

          
trac-admin c:\tracrepos\VbStringLibrary permission add admin TRAC_ADMIN
trac-admin c:\tracrepos\VbStringLibrary permission add user TICKET_CREATE
trac-admin c:\tracrepos\VbStringLibrary permission add user TICKET_MODIFY
trac-admin c:\tracrepos\VbStringLibrary permission add user WIKI_CREATE
trac-admin c:\tracrepos\VbStringLibrary permission add user WIKI_MODIFY
trac-admin c:\tracrepos\VbStringLibrary permission add user MILESTONE_VIEW
trac-admin c:\tracrepos\VbStringLibrary permission add user REPORT_VIEW
trac-admin c:\tracrepos\VbStringLibrary permission add user ROADMAP_VIEW
trac-admin c:\tracrepos\VbStringLibrary permission add user SEARCH_VIEW
trac-admin c:\tracrepos\VbStringLibrary permission add user TICKET_VIEW
trac-admin c:\tracrepos\VbStringLibrary permission add user TIMELINE_VIEW
trac-admin c:\tracrepos\VbStringLibrary permission add user WIKI_VIEW
Then associate the profiles to the users:
trac-admin c:\tracrepos\VbStringLibrary permission add jhl admin
trac-admin c:\tracrepos\VbStringLibrary permission add client user
To run the trac daemon type
tracd -p 8080 -a VbStringLibrary.VbStringLibrary.digest,trac c:\tracrepos\VbStringLibrary
Finally, open a browser with the URL http://localhost:8080/VbStringLibrary. As an anonymous user, you shouldn't have any permissions at all (other than logging in). Log in either as client or jhl, and supply the passwords specified in the digest.

First Impressions

Easy to use, very simple layout. Tickets can have custom fields, so some form of time estimate and tracking could possibly be added.
Trac is now moving towards a plug-in model using Python eggs which will probably help increase features and development. The Trac Hacks site seems to list some of these.
The major problems are that Trac seems to be open source project oriented, so it is difficult to create multiple projects that share the same Wiki. Nor is there any time tracking functionality.
Trac and Tutos
Trac'd provides a web application which 'glues' Trac to Tutos. So Tutos can provide the time tracking. Probably worth investigating.
Trac uses a milestone / ticket model. A milestone defines a series of tickets, which can be associated with components. The milestone can be dated, and a report of completed tickets is displayed to give project progress feedback. See Trac's own Trac milestone report. See also the more detailed report for the 0.9 milestone.
Rather than a major effort to rework Trac for multi projects, we should define milestones by project-name (or client.project-name), together with a version number. Similarly components can have a similar naming mechanism; client.component-name.task. If client is comapny-name, then it refers to a reusable in house component, otherwise it's a project specific component. Information can be reported by project or component, so we can see the current state of a specific project, or the history of a component.
Tickets represent a work requirement, enhancement, or bug fix. Tickets are issued by users and associated to a user, who has to do the implementation, or bug fix. Tickets can be given a priority, can be changed, and even moved to other milestones. See the tickets for the current Trac milestone. See also an example ticket.
Finally, the Wiki can be used to add information about a ticket, component, or milestone, and any general programming information, which can be used by the in house developer community. This would practically constitute an in house knowledge base. See the article that explains the Wiki formatting of text (we're going to have to get used to it).

Conclusions

This is a good enough piece of software for our needs. Eventually, once the new plug-in model settles, we can always add our own plug-ins. Or possibly someone will provide the type of plug-ins we're looking for.
The SQLite database may be a little weak, there is a PostgreSQL alternative, but since the SQL code is spread around the Trac codebase, I don't see how we could easily move to say MSSQL. As this system will (eventually) contain the in house 'sum of knowledge' then at least we should know how to make backupson a regular basis. Note, however, that this doesn't provide database backup for PostgreSQL.
An alternative might be to pay the Trac developers to provide MSSQL support.

Continuous Build Integration

Continuous build integration lets you build (and rebuild) any or all projects from the revision control repository. It is used together with unit testing to keep all software releases up to date and functional. A report (XML which can be converted into XHTML) is generated explaining what went right, and what went wrong. This article gives a sufficiently brief overview.
Unit testing is part of the test driven development methodology. It provides a (better) safety net to ensure that software works, and continues to work, even after modifications or refactoring.
There is a list of unit test frameworks for different programming languages.
There are several critical mass open source tools for continuous build integration. They mostly began as Java projects, with later .Net spin-offs, but since this is a tool we are unlikely to want to make any changes.

Ant and NAnt

Ant is the Java heir to the unix make utility, and NAnt is a loose port of Ant to the .Net platform. It uses a fairly clean XML file format, which defines tasks, and task dependencies.
Looking at the tasks available, and given the decided Microsoft flavour of NAnt, this is probably the better choice. The following links provide a list of available NAnt tasks:
See Nant tasks, and latest tasks.
This choice will also influence the choice of CruiseControl.

Conclusion

The XML is relatively simple, and the environment provides plenty of tasks. NAnt build scripts can be developed using Visual Studio .Net, though this is not required to run them (the .Net framework is, of course). Diverse from Ant, there does not seem to be a standalone editor for NAnt, though there is some support in the open source .Net IDE, SharpDevelop, which is somewhat loosely described on this Wiki page.

CruiseControl and CruiseControl.Net

The Java and .Net continuous build integration tool. It automatically handles the building and testing of projects.
This article provides a reasonably brief explanation of the whys and wherefores of using continuous integration.
Again, for obvious reasons, the CruiseControl.Net project has tight integration into Visual Studio.Net.
For both there's a Firefox plugin.

Unit Testing and Code Coverage

Unit or regression testing is a main part of the Agile methodology, known as Test Driven Development. See this essay for a brief description.
Code coverage is used to define the amount of production code covered by unit tests. See this article which describes the process in detail. The introduction is probably enough to give an insight.
Of course, some code coverage software can also evidence dead code and bottlenecks.

Unit Testing

List of unit testing tools: http://www.testingfaqs.org/t-unit.html
VB: (not open source) http://www.vbunit.com/
.Net Unit test: http://www.nunit.org/

Code Coverage

DevPartner for Visual Studio 6 seems to be a very complete analysis system, though it has a hefty €2,750 price tag.
Aivosto provides a suite of code analysis tools. The most interesting seems to be Project Analyser, and interestingly provides a VB.Net compatibility analyzer, which may be useful as company-name will eventually have to make the move to .Net, especially with the release of Vista in late 2006. A 5 user Enterpise edition costs about €750. No code coverage support.
Visual Code Scan is a simple code analyser with a very low cost $30. No code coverage support.
AxTools CodeSMART. Provides some analysis tools, but somwhat expensive - $200 per user. No code coverage support.
WhippleWare VB Compress Pro, a code analyser for about $200 (not sure if that's per site, or per user). No code coverage support.
NCover open source .Net code coverage tool.
Coverage open source Python code coverage tool.

Odds and Ends

VB Advantage $299 with source code.
VBDOX: integrate Document! X comment styles.

Document History

Release
Date
Description
1.0.0
7 October 2005
Initial release
This document was written by John Leach, Chief Technical Officer for Syger.

Valid CSS

Valid XHTML 1.0

Valid Atom 1.0