Splitting a monolith into services gives you the vocabulary for free: independent, decoupled, autonomous. The architecture has to earn those words — and most don’t.
There’s a fast way to tell whether yours did. Don’t look at the deployment diagram. Look at where the contracts live.
The setup almost everyone starts with
In a gRPC system, the contracts are the .proto files: the message shapes and service definitions every service agrees to speak. They have to live somewhere, and somewhere usually means "inside whichever service was built first."
So the orders service owns the protos. The users service needs them, so it imports them straight from the orders repo. Payments needs the same messages, and rather than set up the import, someone copy-pastes the files and moves on.
orders-service/ ← .proto files live here ├── users-service imports them from orders └── payments-service copy-pasted them
Enter fullscreen mode
Exit fullscreen mode
It works. It ships.…