Software development can be an incredibly frustrating venture. Not primarily because programming is hard and we often make mistakes. Nor because there are countless tedious things like dependency management that we have to deal with. Nor because we are confronted by an overwhelming number of choices on what library or framework to use. Instead, I think the primary reason stems from something much more deeply unsettling, being forced to live in someone else’s theory.
As programmers, our primary activity is that of theory building. As we craft software we are relating parts of our programs to other parts of the system, to third-party software, and ultimately to the world. But this activity is not passive. We are not merely discovering and reporting the facts, instead, this is a creative activity where at once we are discovering the world as it is, but also changing that world. Through the act of writing software, we are making the world a different place.
But we are more than just disinterested creators. We are not assembly workers putting together predefined parts in predefined configurations. Instead, we have creative control over what we produce. Our primary activity is not the making of things, but of thinking about how the thing ought to be made. We are building up this theory as an interested party, we are crafting the world into the way we want it to be. Or at least that’s what we want to do.
Despite our best efforts, we very rarely get to live in this world we envision. Occasionally there are good reasons for this. We haven’t yet solved that problem, our code is incomplete, or we have some remaining bugs to fix. But more often than not, our inability to live in the world we want is thwarted by outside factors. We are forced to live inside someone else’s world. We are forced to inhabit a world that feels alien, uncomfortable, and inhospitable.
These uncomfortable worlds are not worlds we have created for ourselves. Nor is our discomfort in these worlds merely the product of unreasonable desires and expectations. We are not hoping to live in a high-fantasy world of magic and intrigue and yet find ourselves in the mundanity of the real world. Instead, these worlds have been crafted by others with either disregard for our well-being or a bad conception of our needs.
Most of those who force us to live unhappily in this world have little idea that they have done so. These aren’t malicious dictators or mad scientists bent on our pain. Yet, the outcome of their actions cannot be denied. These actors who have forced us into this uncomfortable situation go by various titles, architect, engineering manager, project manager, VP of , C*. Regardless of their title, they have used their title not merely to accomplish a goal, not merely to add some constraints to a problem, not merely to direct problem-solving activity, but to impose on those below them. To force them to give up on the theory they have been building. To stop striving after the very value they have been trying to bring to the company they are a part of.
This is the key connection that is missed. Theory creation, world-building, and crafting software are all one in the same activity. Removing any of these elements eliminates the very value you hired software engineers to provide. But it does more than that. It forces these software engineers to make a difficult choice: fight to create the world they believe in, or give up and live in a world they are no longer invested in.
As we face the unhappy prospect of living in a world we view as not only less than desirable but ultimately unjust, we must make a decision, should we give up? Or strive to make the world better? We know those who have taken both paths. We all know the old, zen-like engineer who gave up the fight a long time ago. Perhaps we too should take that path. Perhaps this fight isn’t worth it. Perhaps we are merely being melodramatic. How can code being wrong, or a system being bug-ridden truly be unjust? Are there not greater injustices in the world to focus on?
And yet to give up seems wrong. We are the ones who have to live in this world. We are the ones that have to fill our minds with its obscurata. We are the ones who have to spend day in and day out concerned with minutia we are powerless to change. Does ceasing our striving actually solve our problem, or is doing so merely a means of embracing bad faith?
I choose to strive. I choose to pursue the world I have in my head. To expound my theory, to apply it. To not give up on it. I choose to be constantly frustrated. To do what I believe is right. To strive for better software, better for the users, better for the company, better for the engineers. I honestly don’t know how I can do anything else.