From a birds-eye-view programming can seem almost infinitely complex. There are so many paradigms, languages, design patterns and abstractions that it's difficult to see how they could all be related. What's more, we are inundated with wave after wave of fresh frameworks and technologies, never quite having time to master then before the next hot shit comes around.
We are constantly re-discovering the same patterns without ever seeing the broad commonality underlying them. This layer of commonality is made up of fundamental concepts. These are powerful mental models that can be used in almost any programming problem, regardless of language or paradigm.
It's tempting to think that what we want is to translate our thoughts directly into code. It's true that a "good" solution often resembles the way we might explain a problem out loud to a fellow developer, however, we tend to ignore the importance of how we're thinking about the problem.
I have come to believe that producing clear code is impossible without first mastering clear thinking. As programmers we should take seriously that when we write code we are designing systems of thought. What's more, those systems will be used not just by ourselves but by our teammates and future custodians of the codebase.
Compared with other engineering disciplines, software is relatively unencumbered by external constraints. Yes, compute resources are finite (and often expensive) but we have almost complete freedom to decide how to think about the problem space. And yet, we often dive in with no consideration at all.
I am not promoting some lofty, academic understanding of programming; I'm merely suggesting that programming is yet another space where slow is smooth and smooth is fast.
I have seen codebases that take thousands lines of code to implement features that can be described in a few sentences. This mismatch is alarming but more alarming still is that we accept this as the norm.
But, programming can actually be pretty easy, we make it difficult. I do not claim to know all the right way to write code, nor do I think it's a competition. Our role as programmers is to collect tools, hone them and select the appropriate tool for the job at hand. This means constantly examining our thought process and improving it, we never finish learning to program.
I've written code across many languages, paradigms, frameworks and platforms and through that process I've found that none of them are fundamentally very different. The actual appearance of code and syntax may change but the same mental models work whether I'm writing a performance intensive video game, an elaborate user interface or a realtime webserver.
It took me years of deliberate practice to find my current perspective, but it's simple to understand. It's possible to dive into a totally foreign domain and find yourself surrounded by old friends, the right tools really do work just about anywhere.
This website is an exploration of how I think about programming. I write about what I'm currently researching and aim to teach my style of code via practical examples.about me