This makes me work by leaving all extensibility points open, (ab) using all kinds of extenisibilty patterns all the time. This is truly the "dark side": the complexity of the entire system. I do not know in advance if any part of my code needs further development.
Should we use the simplest way, allowed and only if necessary, expand it?
I think that at least part of the puzzle can be solved by customizing your definitions of simplicity and complexity.
JAA "recipes", SOLID principles, etc. - All these are shortcuts for managing connectivity and connectivity in design. If you define the โsimplicityโ of a design as the degree to which you achieve maximum cohesion and minimal connectivity, you can say that these principles and patterns are designed to keep your design simple .
Therefore, according to this definition, what you call "extensibility points" is actually the result of simplified design and therefore not complicated. In addition, whether they will be used in the future with the aim of extending passes, since the purpose of the simple design is to facilitate future changes .
The phrase "the simplest thing that could work" refers more to the choice of what needs to be built and to the smaller code design. For example, if you need to display an HTML page, create an HTML page, not a web application.
So, if you adhere to the definition of simplicity above, how you maintain your design, and you build a minimum to solve any problem, your code base will be smaller, your design will be less complicated and your application will suggest the changes necessary for the future addition of functions.
One final note: Pay attention to what your tests have to say about your design. Grip and grip problems often manifest as bulky testing instruments. When you see this, it indicates that you have skipped some of the necessary refactoring steps.