Embracing Theory In Software

I recently read a thoughtful social media post about the book F# in Action, in which the author praised it for avoiding complex terms such as “referential transparency” and “category theory.” The rationale seemed to be that these terms could complicate discussions about programming unnecessarily, at least in discussions about the essentials. This stance intrigued me, and while I don’t disagree that the concepts may not need to be in introductory material (although, I also wouldn’t agree that they don’t belong either), it prompted a deeper reflection on how we engage with technical language in the field of software development. What follows are my thoughts, spurred by the post, but I would like to make it clear from the start that there was absolutely nothing wrong with the social media post promoting the book—or the book itself, which I have on pre-order and for whose author I have immense respect.

The Paradox of Simplicity in Technical Language

In our quest to make programming more accessible, there seems to be a tendency to avoid academic or highly technical terms. This approach is often notably absent when it comes to object-oriented programming (OOP), where terms like “polymorphism” or “encapsulation” are commonplace. By contrast, similar terms in functional programming or theoretical computer science are often deemed too complex for general use. If our aim is to demystify the field, why then do we use titles such as “engineer” or “architect”? These terms, borrowed from highly specialized professions, suggest a level of expertise and training that contradicts the push for simpler language. This disparity raises questions about what we value in our professional identity and the language we use to convey it.

Category Theory as a Universal Framework

Let’s consider category theory specifically. This is indeed a relevant concept to functional programming. Category theory offers a powerful framework for understanding and abstracting complex systems, not only in mathematics but across various fields. By structuring different domains into abstract concepts, category theory allows us to draw parallels and apply reasoning universally. For instance, when discussing complex socio-political theories such as critical race theory, category theory can provide a structured approach to dissect and understand the underlying frameworks and relationships. This methodological approach does not simplify the discussion but enriches it by encouraging a systematic exploration of the concepts at play, fostering a more nuanced understanding of whatever the topic, either programming or broader intellectual discussions.

The Trade-Off Between Accessibility and Depth in Education

There is a delicate balance to be maintained between making educational content accessible and maintaining its intellectual depth. Over-simplification risks diluting the essence of a subject, potentially leading to a superficial understanding. While it’s acceptable for introductory materials to omit deeper theoretical discussions, advanced studies should not shy away from them. As a learner, I even appreciate introductory content introducing me to topics at a surface level so that I know where to dig more deeply. Educators and authors should strive to scaffold learning experiences that build up to these complex theories, thereby providing learners with both foundational knowledge and in-depth expertise. Engaging with challenging materials such as category theory can significantly enhance analytical and critical thinking skills, which are invaluable across all disciplines.

Furthermore, I believe that more vocational content and everyday team discussions could benefit from maintaining a balance between accessibility and intellectual depth. While there is a real risk that the cognitive load could become overwhelming during the routine execution of daily tasks if every conversation is saturated with category theory and referential transparency, we must not forget that we are building software on top of complex systems which themselves likely apply these things. Additionally, the software we develop interacts with the intricate systems of the real world - systems where socio-political issues, which as previously mentioned, could be analyzed through category theory, come into play. We are often tasked with developing sophisticated solutions for these sophisticated problems.

A Call for a Deeper Engagement with Our Craft

The depth of knowledge in any field, including programming, is akin to exploring a vast landscape filled with intricate details and hidden connections (to be sure, an analogy that can be explored by category theory). Encouraging a deeper engagement with the theoretical underpinnings of our work can lead to greater appreciation and mastery of the craft. This approach aligns with the philosophical aspect of learning, where understanding the “why” and the “how” enriches our overall experience and expertise. Recognizing the interconnectedness of knowledge, where insights from one area can illuminate concepts in another, underscores the value of a comprehensive educational approach.

As we advocate for making programming more approachable, we must also honor the complexity that underpins it. Shunning technical terms where they are relevant undermines the potential for a deeper understanding and appreciation of the field. By embracing these complexities, we prepare ourselves not just as better programmers, but as thinkers capable of contributing meaningfully to broader discussions and innovations. Let us champion the richness of our field and foster a community that thrives on intellectual curiosity and rigorous exploration.