Just read starch's Jul 2003 diary post (yeah we post seldomly here, hehe) about the problems of project management.
An interesting observation: If estimating the time it takes to complete a feature or prioritizing the right features to create is so important, why is it usually the coders that have trouble abstracting and designing things that ends up getting those positions? At least so it seems to me.
Part of the answer to the above problem is that there are generally two types of coders in this world: those good at it, and those not good at it. :) Those less good at thinking abstract and handling complex things, they often tend to try instead reach to management positions. Yes, there are probably exceptions, and yes I'm probably over generalizing here, but I seem to notice a pattern. :)
But anyways, thats not really what I wanted to write about. :)
The trick to good professional project management, avoiding feature-creep and keeping deadlines is having the right tools. And its probably the thing that is most tricky to get people to use. And the list of tools you could choose between is long.
Three things you need:
1. Good quality version control system.
By this I don't mean just installing your favorite version control system (ie CVS). No I'm talking about using these tools as they are intended to be used: do version control.
Version control doesnt mean "we can share files, I change things and commit, my coworkers change things and commit". No it means having a standardized structured system to keep track of all your different projects that involve changing the code base.
Lets say you got 4 bug reports and 7 feature requests. You should be able to individually develop on all those 11 issues at the same time. And not until a test has confirmed that the issue indeed is resolved should it be allowed into the main trunk.
The version control system should also keep track of all previously released versions, so you at any given time is able to go back and work or test from that version forward. This means tagging and keeping built executables around for each release.
The point of all this is to allow management to change their idea when they figure out that a cookie is sour, that they would rather prioritize another issue over the current one you are working, and punt issues to later scheduled releases.
Featurecreep can only be solved by making it obvious to the management what the time is spent on in the development department.
2. Issue (feature/bug) database.
This is a tool very important for the management. To be able to prioritize things correctly, it must be appearent and clearly visible what things are pending to be addressed. A issue database will do this for you.
Ideally the issue database and the version control system should be linked together, so that the versions available in the VCS is illustrating what issues there are open and closed in the issue database.
3. Automated build system.
There exist many tools for doing this; one I can recommend is Visual Build. Basically this is a way to setup scripts to hit the "F7" button or whatever is needed to build your product.
Automating this process is important to make it more easy for project managers, testers and coders to work on all the different issues in the system. Most version control systems are a bitch to use if you insist on doing it all manually, so its really a nice thing to have things just working nicely using a few scripts on an intranet server; or doing nightly builds or whatever.
Ok think I've written enough for now. :)