How to Accept Over-Engineering for What It Really Is
Ultimately, software design is a prediction of the future. You make those parts flexible where you will need it. You make other parts simple and opinionated where you need no flexibility. Like all predictions we are often wrong, which leads to either over-engineering or lack of features.