We programmers think of complexity as our enemy, and we train ourselves to avoid it. When algorithms are too complex, we know we've sacrificed performance; when code is too complex, the code is brittle and fragile. But sometimes, complexity is unavoidable, especially in the real world filled with people, laws, complex systems, and things we don't fully understand. And if we try to adopt a simple view of a complex situation, that makes things worse. But there are techniques for making sense of that kind of complexity, and for making smart decisions in complex situations.