Let's not throw the baby out with the bathwater. Distributed horizontal scaling is a necessity at any non-trivial scale. Yes, mindless cargo cult excessiveness of anything is bad. The real crime here is forgetting how to organize large codebases effectively. We used to have beautiful software frameworks that allowed things to be developed in neat little modules with interface bindings that can be turned into in-proc method invocation, or IPC invocations or RPC invocations through compile time switches to create one or more deployable binaries with neat little infrastructure for service discovery and routing, end to end tracing and profiling etc. The modules were independently verifiable for correctness and performance. Modules had semantic contracts clearly defined and their implementations could be changed transparently. We had sophisticated distributed persistence layers with MVCC, zero-cost snapshots etc. with remote addressable storage 20 years ago. Instead of scaling these patterns for web-scale with the necessary engineering discipline, we took a lot of cheap shortcuts only to pay for them 10 times over in the form of wasted dev time and hardware.