I wish there was a comprehensive book (ideally) that is practical, pragmatic, doesn't advocate the use of microservices just because it is cool, etc.
Some books that are often recommended have "microservices" in their names which is a pretty bad start.
For example, I am thinking of how two services should communicate (I am unfortunately guilty of having more services that I really needed). There are multiple options and the choice depends on factors like synchronous vs asynchronous so I would like to read a detailed analysis of all tradeoffs and considerations. Ideally, from authors that really know what they're talking about.
a) Microservices are a 20+ year old concept and for the right use cases are a better choice than monoliths. Likewise the reverse is true. Being successful with your architecture is all about being pragmatic and choosing the right tool for the job.
b) Don't fall into the trap of being obsessed about what is cool or not. No one really cares other than you and it isn't going to affect your career prospects despite this being a popular myth.
c) What does affect your career is being narrow minded, acting like you're smarter than other engineers and being closed off to other ideas. You should understand micro services, monoliths, 90s style SOA etc. You should understand everything. Why they were invented and their relative strengths and weaknesses. Being able to articulartly defend your architecture is a fundamental aspect of working in IT.
I don't think there are lots of examples of the distributed systems discussion though, since most of the writing is about how to structure the source code of a single program. That's not unrelated, since most of what you're asking about is how different interfaces or modules should interact. In a distributed system, that happens over RPCs, but it can just as easily happen within a program with separate threads.
Note: they've added some other books, which show up at the top of the page, but I've only read select chapters from AOSA Volume 1.
There are still many new ways of architecture to be found. For example, making software with an extension language could result in way better systems than a system envisioned by a customer who has no clue about computers. But unfortunately, it is often a nonsensical output constraint that determines how software evolves.
Knowing how to manage these constraints is key. And this requires understanding and being able to successfully communicate with people, and keeping track of contemporary hardware and software to interface with. The actual software design seems largely irrelevant to me.
Just use good names, and subdivide complexity into modules with a lower cumulative complexity.
both predate microservices, and both are still very useful today.
So: 1) Read classic books about monolith software. 2) Read decent books about microservices approach.
Hopefully it will give you new perspectives.
https://www.oreilly.com/library/view/software-architecture-t...
One part it discusses is in fact communication patterns along the dimensions of:
- sync/async
- atomic/eventual consistent
- orechestrated/choreographed
What is your build time? How long to go from PR to deployed?
In my experience, this is usually _hours_ at least. In my microservice shop at my previous org, full end to end regression tests included, meant code was in production in 10-20 minutes.