I read a very interesting comment about complexity in software design... it was in response to the latest Vista slip, now shipping in 2007 (ugh...)
"Complexity in the design for complexity sake is the kiss of death. Complexity without a clear, or even muddy, picture of the problem you are actually trying to solve for the actual customer is the kiss of death. Not having customers involved at every step of the design and development process is just arrogance. Believing you know better than the customer is just stupid."
I can't agree with this more. Software should be designed to solve a customer's problem and nothing more... if you don't have a real use case for it then you don't need it. I've made the designing for flexibility mistake myself many times--and still do, it's a real talent to learn what to include and what not to include. I guess why TDD is so popular / successful, you write code in simple small steps to get working code ASAP.
Non-partisan software developer