I am thinking about two acronyms: YAGNI and KISS. Really important acronyms. After picking up any technique new to me, I might want to apply it everywhere. The following thoughts serve as reminder of what is important while working through competing engineering tasks.
YAGNI - You Aint Gonna Need It
Keeping things decoupled is good for your codes flexibility in the future. However, don’t waste time engineering, implementing, or optimizing for a future that may never come. Don’t write a single line of code against a back-end you have no immediate plans to put into production. Don’t force a factory pattern when you have a single implementation. Even if you have two implementations, that doesn’t mandate an abstract builder.
KISS - Keep It Simple Smarty
Writing clean, extensible, and robust code is important. However, solve the problems of today and when tomorrow reveals a limitation or enhancement, only then refactor. Within the constraints of test-first development, do the minimum implementation that gets the known problem solved. Another pitfall is over engineering. If adhering to a design principal means hundreds of lines of code, when you can keep testability with a dozen, you might be over engineering.