keep all the details in our minds: We can easily miss some detail and create bugs … which further slows us down. It becomes harder to add new features … it slows us down.
designer is to realize that working code isn’t enough. It’s not acceptable to introduce unnecessary complexities in order to finish your current task faster. The most important thing is the long-term structure of the system. Our primary goal must be to produce a great design, which also happens to work. This is strategic programming. – John Ousterhout. A Philosophy of Software Design
Both should depend on abstractions (e.g. interfaces). Abstractions should not depend on details. Details (concrete implementations) should depend on abstractions..