Messy Problems
When we create software, we're dealing with a problem that is
-
Complicated, but not able to be formulated or solved in the way we're used to
-
Dynamic
-
Unpredictable
We loathe these kinds of problems. They're ugly, and they keep us up at night.3 When we see a problem like this, we do what comes naturally, and what we've been taught to do. We simplify it. Doing that can make things worse.
We cause ourselves trouble when we try to declare a messy problem to be a simple one, just because we like that kind better. As human beings, we're all subject to the same desire to find rationality, predictability, regularity. This makes us feel more comfortable. University of Maryland researcher James Yorke believed many scientists in many disciplines had learned to ignore the messy reality around them. He said,
They're running a physical experiment, and the experiment behaves in an erratic manner. They try to fix it or they give up. They explain the erratic behavior by saying there's noise, or just that the experiment is bad.4
People in all walks of life make the same mistake. Why do investors assume cycles in gold and silver prices? Yorke suggested it's because that is the most complicated orderly behavior they can imagine. This is the kind of problem we see in textbooks. Problems like that are solvable. They behave.5
When we're faced with extremely complex problems, we often try to make simplifying assumptions, to reduce them to problems that we're more comfortable with. The story goes that a chemist, a physicist, and an economist were stranded on a remote island. Food was running low and they were getting worried. One day, to their great joy, a crate of canned vegetables washed up on the beach. Their problem was stark in its simplicity: How do we open the cans? The chemist attacked the problem with the rigors of his discipline, but got nowhere. The physicist gave it a shot, thinking he was smarter than the chemist, but he came up empty too. Then the economist almost gleefully said, "I've got it! Assume a can opener".
Simplifying assumptions can make things easier to think about for a while. When you start believing the simplified version is the real problem, you get stuck with perpetually closed cans. The manufacturing mindset is the grand simplifying assumption of modern software development. It tries to make something messy seem neat and tidy.