In Abstraction is Art: Why All Programmers are Creatives, I described the central role abstractions play in technology and technical companies. This post builds on those ideas to discuss how innovation works in the medium of abstractions.
Progression: Advancing Abstractions
The tools we use both limit and advance our thinking. If I gave you a hammer and asked you to build a birdhouse, I’d probably get something like this:
But if I gave you scissors, you might build a birdhouse like this instead:
You could have found your own hammer and built a wooden birdhouse anyway, but the scissors put you in a certain mindset. In software our tools are abstractions (a specific type of idea) and the same concept applies.
In Orwell’s classic dystopian novel 1984 society is being oppressed under the watchful eye of Big Brother. Their subjugation is so complete that even thinking about rebelling against the government is a crime. They are no longer able to articulate revolt, communicate about revolt, plot revolt, or eventually even IMAGINE revolt; they are no longer able to revolt. Over time, the very concept of rebellion is lost.
To “unlock” this ability, they would need to awkwardly describe it using combinations of existing ideas until they solidify the concept, name the concept, and finally evangelize the concept and the names to the rest of the population. Only then would revolt become possible again.
When we accurately anticipate the future, our progress accelerates because each step is built on top of a previous enabling idea instead of starting from scratch each time.
As programmers we have the opportunity to build our own tools, our own abstractions, our own language – and this gives us tremendous power and responsibility. Every decision has a cascading effect, making certain things easier and certain things harder. We make dozens of decisions every day as we write code, and those decisions move us closer and further away from any given feature we might want to build in the future. Our requirements just said “birdhouse,” but once we make a birdhouse, is the business going to ask us to expand into bird apartments (probably easier in wood) or allow customers to request custom sizes (probably easier in fabric)?
We have to solve today’s problem while simultaneously anticipating tomorrow’s needs. There’s a careful balance between thinking ahead and overengineering, giving rise to terms like YAGNI (“you ain’t gonna need it”). But thinking and building are two different things – it’s always worth thinking a couple steps ahead so you don’t paint yourself into a corner. When we accurately anticipate the future, our progress accelerates because each step is built on top of a previous enabling idea instead of starting from scratch each time.
How do we get better at predicting the future? Context.
Context as Binoculars
If we’re doing our jobs right, we’re making decisions with the full awareness of a wide variety of contexts. The more information we can bring to bear in each decision, and the more deeply we can empathize with the stakeholders providing that information, the more accurately we can imagine futures that anticipate the needs of our constituents.
So what exactly are these “contexts” that are so important? There are a few that are fundamental. You have to have a really solid grasp of the technology you’re working with, and how the technical landscape is changing. Understanding the customer is paramount; they’re the ultimate arbiter of whether you’re creating value. It’s critical to understand your company’s business model and how it fits into the broader market. Ultimately anything that helps you understand your particular problem domain and solution space is going to serve you well. Side note: this is why diversity is critical. Someone brings the context they gained in a college CS program, someone else brings the context from their artistic background, and someone else brings the context from their time in sales or customer support.
Luckily, guessing the future is only half the picture. As developers, we can have a strong influence on how the future unfolds.
Progression is Vision
A house starts with a foundation, then the scaffolding of the walls, then the plumbing/electrical, then the drywall, then the plaster, then the paint, then the furniture. In the earliest stages we can barely see it’s going to become a house, but the architect has a plan. Over time we start to get a rough idea of the finished product, but there are still many questions to be answered. Eventually, we’re living in the space and trying to figure out how to position our couch around the weird angle in our living room wall.
When our abstractions come together into a larger whole, we’ve created a framework, a conceptual model. It stands under its own weight; it has internal consistency; it has structure and shape and boundaries, strengths and weaknesses, characteristics like any physical object. Rather than starting from scratch on every new problem, we instead think about which parts of our framework are relevant and how we can refine them to apply in this new situation. Maybe we repurpose a guest room into a nursery, or build a deck so we can grill and relax outside – our options aren’t always easy, but it’s hard to justify a new house for every new need so we find a way to make it work.
Because future questions are answered inside the framework, the framework sets the direction for future conversation long in advance. It frames the discussion before the discussion even begins. As developers, this is the power we possess: to set the stage of the future. If we’re careless or oblivious about this power we’ll be continually tripping over our feet; when we wield it with intention and foresight we can achieve any future we envision.
This post originally appeared on the Ascent Tech/Culture Blog.