In particular separating the build and config aspect of the application from the runtime logic.
It is common to see these tasks done together, which has some benefits but it breaks our single responsibility principle and makes the function most likely impure.
Allow us to separate our concerns by inverting dependencies.
We can have our build code create an implementation and then on the runtime side of the boundary we can have an interface which allows runtime parts of the application to interact with with what they need via the interface.
Dependency Inversion allows us to not mix dependencies across a boundary.
Systems need to be able to evolve over time as requirements change.
"Software systems are unique compared to physical systems. Their architectures can grow incrementally, if we maintain the proper separation of concerns."
AOP: a programming paradigm that aims to increase modularity by allowing the separation of cross-cutting concerns.cross-cutting concerns like logging or security are separated from the core logic of the program, allowing them to be modularized and applied uniformly across different parts of the codebase without cluttering the main business logic.
We know it is best to give responsibilities to the most qualified person.
It is also best to postpone decisions until the last possible moment.
"The agility provided by a POJO system with modularized concerns allows us to make optimal, just-in-time decisions, based on the most recent knowledge. The complexity of these decisions is also reduced".
Use Standards Wisely, When They Add Demonstrable Value​
"Standards make it easier to reuse ideas and components, recruit people with relevant experience, encapsulate good ideas, and wire components together. However, the process of creating standards can sometimes take too long for industry to wait, and some standards lost touch with the real needs of the adopters they are intended to serve".