Let's Have Three Abstraction Layers
Let's have three abstraction layers: nature, middle, and human.
The Human layer is designed for humans to effortlessly engage. The buttons on a dishwasher, the knobs on a stove. A keyboard. Paper with words on it. Door knobs.
The Nature layer is designed for the laws of physics and chemistry. Plastics that don’t leach chemicals. A beam that holds a structure together and upright. Tire rubber connecting with pavement. Transparent glass. High-efficiency lightbulbs. Electrical lines and wifi routers.
The Middle layer exists between the Nature and Human layer. This is where technicians work: plumbing, knife sharpening, home cleaning, code composition, snow shoveling.
Oftentimes we aren't clear which level of abstraction we are operating on. If we knew, we might approach our immediate task differently. For example, knowing that loading the dishwasher takes place on the Human abstraction layer will encourage us to not over optimize the position of dishes, to not over-clean the dishes before they go into the dishwasher. Instead, we will simply load the dishwasher and then go sit down with our family again.
As a computer programmer, I am endlessly faced with decisions around abstraction. Generally, there are 3 sensible values to prioritize, and each of these corresponds to the three idealized layers of abstraction: make the code run with computational efficiency (Nature), make it readable to myself and my team (Middle), and make it useful and delightful (Human). With these three values and three abstraction layers in mind, I can make sound choices in the codebase.
It is tempting to solve every problem we encounter with an abstraction of the layer we are personally most comfortable with. This is a trap – we should step outside of ourselves, see the problem clearly, and define its abstraction (and thus solution) independent of our immediate preference.
A similar trap is to ignore abstraction layers with which we are uncomfortable. We might be familiar with treating the dishwasher as a Human abstraction, loading it and pressing buttons, but when it is broken it likely requires stepping into the Middle abstraction layer by calling a technician or referring to the user manual. If we try to fix the dishwasher while remaining on the Human abstraction layer, we are bound to feel frustration.
I believe there is great opportunity to simplify our processes, perhaps making fewer abstractions and certainly making better abstractions, by knowing which layer we are primarily operating upon.