Building a distributed system can be complex because it involves multiple units that need to communicate over a network, which introduces uncertainty and potential failures. Distributed systems have partial failures, making it difficult to reason about the state of the system and its behavior in case of failures. They also lack guarantees on data consistency, message delivery, and time, leading to trade-offs between consistency, availability, and performance. While distributed systems are necessary for certain applications like Contentful, they require a deep understanding of their complexity and limitations to make informed design choices.