I've also seen people do a ton of up front design, only for things to fall apart quickly during the implementation. I'm still largely a proponent of writing code sooner rather than later. Iterative development. Prove out concepts in isolation along the way. Rewrite and integrate as appropriate. But obviously you've got to do some upfront work, otherwise you might write custom software for things which have off the shelf solutions.