I have found that the #1 slowdown, across all of product development, is waiting too long to provide something to your “client”.
If you really want to speed up development put something, anything, in the hands of your client as quick and often as possible.
Of course the client in this case is whomever is down stream from you:
|Developer||Integrating Developer, QA, Support, and/or End User|
|QA||Support, End User|
When you take too long to get it to your client, for whatever reason, your goals and your clients goals will diverge further and further, until what you deliver is not even close what they want or, more precisely, what they want now.
If you integrate every few days you will discover the flaws in design before they have become too ingrained. If the product gets into testing every week you will discover when it does not support the perceived needs of the end user. If it goes from testing to support (and ultimately the end user) every month you will more quickly hear where the perceived needs were wrong and maybe get a better picture of what the user wants, which gets fed back into the system.
What this points out is that, like it or not, you don’t “know what the user wants”. Embrace reality; you can’t “know” what the user wants, you can only have a guess (or maybe a hypothesis). Test it with quick delivery and you will get closer and closer to being correct, this will save you large amounts of time correcting your mistakes.
Deliver “early and often” (to borrow a phrase from the Open Source community) and you will spend far less time re-factoring (or re-writing) your code, writing the wrong test cases or supporting irate end users, and far more time delivering product.