> The best of both worlds, in my opinion, is a loosely coupled set of opinionated tools and libraries, but that also has a tool that provides a unifying interface into the "golden path" for using those together to provide some functionality.
This is almost it. A few more things I think one wants:
- Do most of the coupling and plumbing yourself, IoC is evil when applied to things that do too much.
- Control the application state - see above.
- Be free to substitute any major part, be able to compose them freely.
- Re-use and extracting libraries from past work to be convenient, robust and affect past / maintenance-mode projects positively too.
- Be able to defer extracting libraries and generalizing up to the time you actually need to.
- Decouple code organization from artifact deployment.
- Be absolutely free in how you design and write domain logic and information processing - this is the brain of an application.
- Be absolutely free in how you design and write the UI - this is the body of an application.
- Have the tooling/utilities around code that fit your workflows and business needs.
I've come to the conclusion that full-stack frameworks in the style of Rails/Laravel/Django get in the way of some of the above and don't provide enough to make the above possible by themselves. I think the answer is not "use this framework" or even "build this framework".
It starts with your business/domain needs and builds from there - custom and simple. It builds up slowly and steadily like a garden that reflects your team's personality. It takes a careful, comprehensive, holistic approach. There are angles from version control, to project management to deployment that are all incorporated.