Distributed systems promise scalability and flexibility, but they come with a cost. Once you cross that boundary, everything gets harder.
Most architectural problems are boundary problems. Knowing where to draw the line, and when to redraw it, is one of the hardest parts of building software systems.
Synchronous and asynchronous communication are not opposing choices, they are complementary tools. Understanding when to use each is key to building scalable systems.