This is an oldie that I found way back when I was still in school...
There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.
C. A. R. Hoare
It is often our tendency as developers to make things more complicated than they need to be. To counter that tendency, one of the Agile mantras is YAGNI (Ya Ain't Gonna Need It). This is often hard to do because instead of designing and building huge frameworks up front, it means that as things are needed they have to be implemented or possibly current functionality has to be refactored to fit new features. Very difficult for management, and often very difficult for developers! "Just do it right the first time" is often the counter to this, but one of the difficulties is that "the right way" is often not clear until you've journeyed down the path a little bit. And if you guessed wrong at the start and did not leave flexibility to choose a different path, it is harder to change then if you had waited.
Lean Software Development gurus, Tom and Mary Poppendieck, refer to this as "deferring commitment" until the "last responsible moment". This doesn't mean that you hem and haw about things forever since usually that results in the "last responsible moment" passing you by which is as worrisome as making a decision too early. (Mary gave an excellent Google Tech Talk on this principle called "Competing on the Basis of Speed" which I highly recommend.)
Like Goldilocks, we need to be in constant search of the approach, complexity and timing that are "just right".