A strategy I try and use, is constant communication. When I hit a road block, I will communicate that I hit a road block, what caused it why its significant and how it will impact the schedule, and if needed how I can make up the schedule in other places.
I also have been sticking to quick releases with smaller feature sets that are not as polished as they could be (the UI is not as preety, or advanced features are not implemented). Quick small releases has a huge benefit from a user perspective in that they get to see and use the system at various checkpoints and then can provide feedback which can result in the project going new directions.
It also helps in estimating since we are dealing with much smaller feature sets and timeframes. Earlier this year I was on a two week cycle; however, we have been takling bigger features recently and added more process around the deployment that we are around 3-4 weeks.
The other thing that I have seen a lot is people who artifically inflate the sense of dire when hitting a roadblock in the name of Architechure Purity or the System Design. Don't let the art of engineering prevent you from releasing, because at the end of the day no matter how preety the code or system is, it won't immediatley impact the bottom line, and sometimes you have to make the sacrifice to not spend the additional resources today knowing you'll be paying twice that in the future (but hopefuly in the future your organiztion can afford the cost). Being in a startup company this is critical for me to keep in mind.
Josh