This post originally appeared on the Ascent Tech/Culture Blog
Mind The Gap
Humans have always built on top of the work of those who came before us. Karl Benz was able to invent cars because he had the wheel and the combustion engine. Orville and Wilbur Wright were able to invent planes because they had gliders and bicycle chains. They were successful because they looked at the world around them and brought existing ideas together in a new way.
The technological acceleration we've seen in the last 50 years is driven by the same principle of building on previous work, with one important difference: our production costs have fallen to zero. Henry Ford had to build factories to realize his ideas. General Motors and Rolls Royce had to build concrete bunkers to test their jet engines in case they exploded. Programmers need only open their laptop and get to work. Without production costs, the cycle of innovation now happens at the speed of thought.
There's still some friction in the cycle, and it's basically because computers are not smart. Fast? Yes: we can tell them "do x, do y, do z" and they'll do it in milliseconds - but they have no idea WHY. But we have our reasons, right? We ask them to add the numbers in a spreadsheet because those numbers represent our income and expenses, so the sum represents our profit. We ask them to send a paragraph of text to our friends because that paragraph represents a funny thing that happened at work.
WE know the whys, because the whys are part of our world. The computers don't know the whys, because the world of the computer is incredibly limited. Computers are still literally dealing with ones and zeroes, and could not be further away from our messy experience of hugs and giraffes and hot chocolate.
In order for computers to be useful in our rich and meaningful world, we need to bridge the gap somehow. As programmers, we need a way to keep our feet in both worlds at once. That bridge is abstraction.
What Is Abstraction?
Think of a car. Got one? I bet it has four wheels and an engine. "Car" is an abstraction, a generalized idea. As a society, we've communally decided that wheels and engines are important parts of all cars. Is it blue or red or black? Who cares. Color doesn't fundamentally change the thing we're talking about, whereas something with wheels and no engine might be a bicycle rather than a car. Since color is not important when we're talking about cars, it hasn't become part of the abstraction.
For a computer to handle our complex world, we have to simplify — and we simplify by just leaving stuff out. It's much easier to tell a computer about our Platonic ideal of a "car" - four wheels and an engine - instead of every single minor detail and variation in the actual cars in the actual world. As programmers we also know which properties of a car are useful for our particular task, and that’s how we choose what to include and what to leave out. If we’re running a race track, we might want our computers to know about top speeds and RPMs. If we’re running a rideshare company, our biggest concern is the number of seats.
We give the computer a limited view, but we ourselves still have a full world of knowledge. This duality is what makes programming possible; the same abstraction can be simple and "machine-readable" while also being emotional, subjective, and yes - artistic.
Art Is Abstraction Is Art
Artists are trying to represent a particular slice of the world through a specific perspective. In holding a mirror to society, they selectively include or exclude certain details and ideas to present an opinionated view. Even a photograph - an "exact replication" of the world - has an opinion by way of subject matter, framing, editing, and the context of its display. Art, then, is an abstraction. It's an idea, stripped of all its nonconsequential details to highlight its core.
Creating and experiencing art helps us understand ourselves. It allows us to experiment, to learn, to fail, to try another way. This boundless exploration extends beyond the physical world as well: we can delve into love, loss, or any aspect of the human experience without going through those events directly.
The same way a novel, poem, dance, or painting captures the world, so do abstractions. Perhaps the closest comparison is to storytelling. Stories are full of complex devices for manipulating ideas. Metaphor, allegory, fantasy. A story allows us to construct new realities through imagination. Stories are powerful because they connect with our deepest selves, and through the details we choose to include or omit, they have a point of view. Abstractions similarly afford us limitless opportunity to explore, build, learn, and communicate.
So What Is Programming?
Artists create sketches, drafts, studies, and yet the final work is not always as imagined. Artistic ideals are sometimes subverted for a paid commission. Programming is not always joyful or meaningful either, but programming is always an artistic endeavor. It's fully subjective, it's based in the realm of ideas, it's an act of creation, and it involves the creator holding an opinionated mirror up to the world.
Thinking of programming as a technical endeavor is correct but woefully insufficient. This is why so many of the best programmers I've worked with have significant artistic backgrounds, and why I always say anyone can learn to code.
As in any discipline, programmers stand on the shoulders of those who have come before us. In programming, those previous works are works of abstraction. The earliest programmers were truly writing programs with ones and zeroes. But someone abstracted those ones and zeroes into english characters, and abstracted those english characters into software instructions. Over the decades, countless thousands of developers have slowly advanced programming languages to the point where many programs do read somewhat like prose. They have created networking libraries, databases, web browsers, apps. Each of these abstractions is built on the abstractions before it, and the work of every programmer is to use existing abstractions and their own ingenuity to create new works.
Programming classes/books/blogs/etc usually focus directly on code, which isn’t entirely surprising - a group of potters would probably focus on clay, too. The code is what's sitting in front of us; it's obvious. Abstraction is less obvious, yet far more important. I will go so far as to say that abstraction, not code, is the fundamental medium of programming. And thus, while computers themselves might be governed by math and equations, programming computers is primarily a creative, subjective, artistic activity.
Read Part 2 — Time Travel: The True Power of Developers