Software Engineering Belongs with the Humanities
In the minds of many, software engineering has the ethos of a hard science. For decades now, media depictions of software engineers have mirrored that of computers itself; cold and calculating. But, what if I told you that we had got it all wrong? What If I told you that the modern software engineer is closer to a novelist than a mathematician? What if I told you that software engineering might belong with the humanities?
Contrary to popular media portrayals, software engineering is less about frantically writing code and more about meticulously reading and comprehending existing codebases. Professionally written software has two audiences: consumers and software engineers. The vast majority of people today interact with software indirectly through systems like Healthcare.gov, Amazon, and Netflix as consumers. For consumers software is as good as it is reliable, but that’s not the case for engineers. For us, code quality is not just about reliability, but also about maintainability, scalability, and performance. We strive to create systems that are not only functional, but also easy to understand, modify, and extend. This requires a level of craftsmanship and attention to detail that is more akin to the art of storytelling than an objective representation of mathematical principles. In my experience as a computer science student, most of software engineering is actually about reading code and documentation. It’s an innately social experience and creative endeavor that involves problem-solving, critical thinking, and the ability to convey ideas effectively through the language of code. In this way, software engineers are like authors, weaving together lines of code to create a cohesive and functional narrative that brings technology to life.
Some might say, “Ok, but even if both traditional and programming languages are used for communication in this way, it doesn’t make it writing. You can’t write a sonnet in code. Code won’t ever make me cry. Code won’t ever change the way that I raise my child or see the world.” This is true. Software engineering has a strong technical foundation that sets it apart from prue creative writing in how it communicates ideas making it unsuitable for expressing emotion. However, both professions utilize universal patterns to communicate ideas and concepts to readers. Even though software is a much more simple form of communication it still demonstrates part of what it is to be human just as much as painting or architecture through the use of these patterns.
In The Seven Basic Plots by Christopher Booker, Booker proposes the idea that all stories in human history converge on only seven paths hardwired into our collective psyche: Overcoming the Monster, Rags to Riches, The Quest, Voyage and Return, the Comedy, the Tragedy, and Rebirth. In the two decades since the release of The Seven Basic Plots, there’s been a lot of debate on the actual number of categories literature can be divided into depending on the level of granularity or reductionism authors prefer; some say there’s, 3 others say 36. But tentatively, there is broad consensus on the idea that many, if not all, stories can be categorized into a finite number of basic plots.
A similar phenomenon to The Seven Basic Plots occurs in software engineering with Design Patterns: Elements of Reusable Object-Oriented Software by Erich Gamma, John Vlissides, Richard Helm and Ralph Johnson. It defines the three broad categories that almost all modern software operate within: creational patterns, structural patterns, and behavioral patterns. Just like novelists, software engineers leverage design patterns to efficiently communicate ideas. For a writer, the "Overcoming the Monster" plot provides a framework for building tension and a satisfying resolution where the protagonist must defeat an antagonist that threatens them and the wider world. Examples of the Overcoming the Monster plot are scattered across modern media like King Kong, and Jaws as well as ancient myths like Odysseus and the Cyclops. Similarly, a software engineer might use the "Factory Method" creational pattern to ensure objects are created within a consistent polymorphic hierarchy. Which sounds really scary to all of the non-technical people out there that were enjoying this up until now, but bear with me, I promise this doesn't require a technical background to understand.
Imagine you're opening a furniture store, but instead of crafting each piece from scratch, you want to standardize the process. You create templates for various items like chairs and tables to define a basic structure for mass production. When a customer orders a dining chair, the factory uses the "chair blueprint" to build the basic structure then they add the customer’s specific requirements. This way, you can take advantage of economies of scale while still allowing customers to customize. This is how the factory pattern works. It creates objects with a predefined structure while still allowing space for variations in the implementation.
While both professions utilize established patterns, there is so much space for individuality and artistry within them. A novelist can subvert classic plot tropes to craft a compelling story, and a software engineer can combine design patterns with algorithms in compelling ways to solve problems specific to their codebase. This common artistry showcases a deeper connection between software engineering and the humanities than one might initially expect.
Software engineering might not churn out sonnets or evoke tears, but it shares a fundamental human impulse with its humanities counterpart: the desire to create, communicate, and solve problems. By leveraging patterns and fostering human ingenuity, software engineering builds bridges between the technical and the creative. Perhaps, then, it occupies a unique space that transcends the traditional STEM/Humanities divide. This "gray area," like psychology, showcases the multifaceted nature of human experience, where logic and creativity intertwine to shape our world.