We use SCRUM – an iterative process that delivers small parts of the overall functionality on a regular basis, and encourages frequent communication both over what was just built, and the next part of the project to be built. It allows informed decision making, and makes any issues clear early on – rather than at the end of the project.