On #3: Agreed. In my experience, every time someone comes up with some grand design before writing any code, it's built on one or more assumptions about the problem. Then work begins, and one or more of the assumptions inevitably turn out to be incorrect and the whole design gets deflated.