Mother of all Software Design Principles
Design is the art of making constant trade-off decisions; Good Design has balanced Trade-offs!
The problem with design, as with life is that …… You can’t have it all!
Its easy to stick with extremes (complete upfront design v/s code & fix style design), but its really hard to strike a balance (just enough or just in time design). Just enough is relative and means different things to different people. Also varies from context to context. Just enough design in one context can mean over-engineeing in another context.
Also, there is no ONE way of doing things. There are always options when it comes to designing software and one has to choose a approach that makes most sense. Is that the best design? Do you really need the best design? Its always easy to find a better design in retrospect.
Hence I say, the only Universal truth is that there are no Universal truths. Even law of gravity does not apply universally.