In previous projects I defined systems in a single code base, and parts could be deployed separately by providing different configuration files.
It was a very productive approach: one could run the whole system in a single process during development, which made writing integration tests a lot easier than spinning up dozens of docker images.
It still required some manual work, and deployments were still to static for my liking. Ideally it should be possible to split off and scale subparts dynamically.
In the Clojure world there are several projects now that explore splitting up services in a transparent way.
For example Electric Clojure splits up your code into frontend and backend parts, making the frontend-backend split transparent. Another project is Rama, which does something similar but for distributed steam processing and partitioning.
I'd love to explore something like this but for enterprisey service meshes: the programmer just defines services, and a compiler decides how to split these over different machines, and all the RPC/serialization/deserialization is done for you.