Complexity, abstraction, and generalization are powerful:
- Complexity lets us explain a wider range of phenomena
- Abstraction allows us to reason more easily by filtering unnecessary noise or details
- Generalization lets us reason over larger domains.
And yet, complexity, abstraction, and generality have costs, which creates a tradeoff between these benefits that they bring and the costs we incur.
Adding complexity makes our models more expressive by adding more details to the models. The extra detail added to the model makes it harder to understand, potentially making interventions harder to perform or the effects of interventions harder to understand. At times, we need our models to capture more of reality, but if we only care about narrower descriptions, the tradeoff may not be worth it.
For example, when programming, adding code to handle lots of different cases can increase the scope of your program but also makes it harder to understand. More complex code also increases the difficulty of making changes and the odds a change will break something elsewhere. Laws and contracts are another good example of highly complex systems that both have high costs and situationally provide large benefits. By adding complexity to laws by specifying potential legal outcomes in many different circumstances, the law can better protect against arbitrary interpretation and increase confidence in its judgments. The complexity of law comes at a cost, though: it can be quite difficult for people without training or time to learn to understand all the intricacies.
Abstraction moves our models from concrete details to abstract concepts. Abstracting trades contact with reality for ideas that can be much easier to work with. Reality can be too detailed, too messy to handle well, which demands that we abstract. But if we abstract too much, we risk losing contact with reality. This can lead to our abstractions no longer tracking reality and to our abstractions no longer capturing important details about reality.
An example of this is how we use and model technology in our daily lives. Often, we don’t need to understand the underlying tech to use it, but abstraction can obfuscate important details. People who have a very abstract model of technology can struggle to use it in practice. Still, depending on their needs, the ease of modeling objects they interact with may outweigh the inability to access certain specific features.
Generalization extends the range of our models at the cost of specific details. Generalization is, at times, necessary when we have to go off our model's distribution, especially if we do it a lot. Generality comes at a cost as well, though: it’s easy to overgeneralize from your evidence. Once you generalize, it is often not apparent what parts of the generalization are supported and which are not, effectively creating black boxes.
One example of trade-offs of generalization can be seen in the field of economics. Economists often use the concept of supply and demand to explain the behavior of markets. This generalization allows them to reason about the behavior of a wide range of markets and circumstances, from the stock market to the housing market, without having to delve into the specific details of each individual market. However, this generalization can also lead to over-simplification and the neglect of important details. In response to this, economists have pushed various concrete models, from behavioral economics to experimental economics, using randomized control trials or synthetic control methods to quantify how people actually behave. The results from these studies can lack the generalizability of earlier studies but are closer to how people actually behave.
How do we know when to use abstraction, generality, and complexity? One possible approach is to start simple, specific, and concrete. Then add complexity, abstraction, and generality as circumstances demand. This lets us create understandable models that keep contact with reality yet focus on the minimal aspects necessary for our purposes.