Note, this is for .Net development...
We use XML comments in our code. The GhostDoc plug-in is very useful for this because it can quickly generate reasonable guesses at descriptions and documents parameters with a click or two. Sometimes you don't even need to edit it (although it's a good idea for more complex routines).
We use Subversion and require descriptive comments (particularly links/references to issues and bugs) for each commit. We're looking into scripting a bridge between SVN and our SharePoint issues and tasks list so that we can automatically document and cross-reference code changes. We used to do this with CVS and Mantis and SVN and Mantis.
Our primary project documentation is stored in a project/department SharePoint site where we also host our issue tracking lists, requirements list, discussions and archived e-mails, and a project Wiki where we maintain background details and "how-to" snippets.
We use a different SharePoint site for our software engineering standards, coding standards, and links to useful resources.
We have a few dedicated people who write our integration and acceptance tests and the user documentation.
That being said, our design and implementation documentation is never as complete or accessible as we would like it to be. SharePoint is a nice project documentation home, though. Particularly when we moved our requirements into a SharePoint list then wrote a mail-merge type "report" to format them back into a document to give to, and review with, the customer. You can do a lot with just Windows SharePoint services instead of a full SharePoint license.
At a previous job we used a Wiki (I can't remember which one) with a Wiki-To-Doc XSLT script that would build our user manual, our help file, and our context sensitive help directly from the Wiki (this was for a thick client project). That way, theoretically, we could easily maintain the documentation as we went and not have to reformat it and rewrite it into a help file/manual at the end.
Oh yeah, the one cardinal rule (which is just as hard as "document as you go") is "try to document things only once." If you try to document your design, the document your code with comments, then document your implementation, then write your user and maintenance documentation, there is little to no chance they will stay in sync. That doesn't mean there needs to be a single document or a single way to document things, just that you need to have a plan to bring it all together or make the documentation "discoverable" throughout the life of the project. Hence what I was saying above about building documents from SharePoint lists, creating documents from XML comments, tying your SVN commits to your issue and task system, etc.