Modern distributed software systems involve dynamic operating conditions that pose engineering challenges to traditional offline design. Multiagent systems engineering can solve some of these problems by offering self-adaptive features such as loose coupling, context sensitivity, and robustness to failure. The authors describe the tradeoffs in multiagent systems and lessons learned in their implementation but propose them as a critical advantage as distributed systems continue to evolve.