I think that's a result of the systems getting more complex and development models changing over time. You can either design one monolithic behemoth that can do everything by itself, or you use so many abstractions that you can assemble a different kind of behemoth piece by piece.
The complexity of the modern stack is ridiculous. You run java containers inside docker containers inside virtual machines and call it optimized.