(This article was originally written in June 2005.)
Recently we've been helping some of our clients manage the work of some third-party vendors; we provide high-level project management or quality assurance/testing work rather than develop the software itself. In both cases, the clients brought us in after they realized that the vendors weren't living up to expectations. As we've dug in, we've discovered that we have to educate the vendors on the meaning of the word done. It's an exercise that I remember from earlier days, but we so rarely have to go through it with our own staff that it's something of a shock to do it again.
Done is a simple little word. It shouldn't be so difficult. Nevertheless, here are the different ways in which I hear it used:
- End users: The software is finished, tested, stable, and I can use it.
- Vendor management: My developers tell me the software is finished.
- Skilled, experienced vendor developer: I've completed the software, unit tested it, and checked it in. (Sadly, we don't find too many of these at these third party vendors.)
- Typical vendor developer: I did my first pass at the code and it seemed to work.
You can see the disconnect and the problems that will arise. Each developer considers something done when there's a piece of code that should implement the defined function; that developer may or may not have unit tested it well, and on these projects they never seem to integration test with other developers' code. Entire chunks of functionality will be shown on the project plan as complete, but when we ask to see the working software we're told that it isn't included in the current build.
Done is a simple word. In software development, a piece of software is done when:
- The software implements the required functions.
- The software has passed unit testing.
- The software source code has been checked into the repository.
- The software has been compiled into the current build (for compiled systems) and deployed into the appropriate test environment.
- The team has developed appropriate test scripts that exercise the software's capabilities.
- The software has passed integration and system testing, and been deployed into the user acceptance test environment.
- The users have had an opportunity to use and respond to the software, and their change requests have been acknowledged and implemented where appropriate.
- The software has been documented in accordance with whatever standards your project follows.
Any other use of the word done in the context of software development is incorrect at best and dishonest at worst.
Is your software done?