Discover more from CodeCraftr
Simple, Complicated, Simple
A Transitional Journey in Code
A few years ago, I took up the hobby of making slow coffee. The art of manually brewing coffee is involved and complicated but potentially offers a fantastic reward: an experience in a porcelain cup.
The start was simple: just me, a stovetop coffee maker, and some ground coffee. The results? Pretty good! But I hungered for more, and so I dove head-first into the rabbit hole.
As I progressed, I amassed knowledge and gear, and my results improved tremendously. However, my brewing methods became increasingly intricate. From pre-heating the brewer and weighing the beans to even using chopsticks to shape the bed of coffee grinds almost like a tiny zen garden. As you can imagine, this made brewing coffee quite an ordeal.
However, that's not where my journey ends. I now find myself circling back to my simple beginnings, seeking out the essentials. My routines have simplified, and my gear has been brought back to the basics. I know what I'm doing, why I am doing it, and what I don't have to. And the results?
Outstanding cups of coffee.
Simple. Complicated. Simple.
The same holds true for our code.
Can you remember the code you wrote starting out?
I do. It was horrible. Ghastly by my current standards.
But, it was simple. No frills. No fancy stuff. Just the bare amount of necessary moving pieces (or even a little less). I just didn't know any better. I was blissfully ignorant - shielded from the complexities by not knowing.
But then I started broadening my horizons, moving from unknown unknowns into the territory of known unknowns and known knowns.
The code I wrote changed. It improved, but it also became more intricate. More and more moving parts, patterns, abstractions, and clever bits. I applied everything I learned because that leads to the best results, right?
It turns out that's not the case. I was unknowingly indulgent. I applied and incorporated things for the sake of it. I knew it existed; therefore, I had to use it. The problem was that I could not see the harmful effects of doing so. My indulgence drove up the complexity of the solution.
Years passed, skills and intuition got refined, and now I once again find myself in a different place.
I've come full circle, and my code is once again simple: back to the fewest elements we need. Note this is no easy thing to achieve. Even though it sounds like I'm back at the same place where I started, that couldn't be farther from the truth.
Unlike my humble beginnings, I can make deliberate trade-offs. I can shift and adapt according to the context I find myself in and move between simple and complex based on necessity. At this point, I'm being deliberately essential. This is where the truly elegant solutions arise, striking the perfect balance between value and economics, short- and long-term.
This story probably also applies to you, though you might find yourself in a different place on the curve (ignorant/indulgent/deliberate). You might not have thought about this yet, but where would you place yourself on the curve regarding coding?
It doesn't matter where you find yourself on this curve as long as you cultivate awareness. Try to get a sense of where you are on the curve regarding a topic, and realize each stage has pros and cons.
Being Blissfully Ignorant sounds negative, but it doesn't have to be. You're unencumbered by existing knowledge and receptive to ideas, ready to explore. Everything is possible! Just realize there is a world of knowledge you cannot see yet.
As an Unknowingly Indulgent, you can see this knowledge laid out before you. You've started exploring and are synthesizing your own mental models out of it. You probably can't get enough information, embracing it eagerly. The downside is that every piece of information gives you a hammer; therefore, everything becomes a nail.
Finally, there is being Deliberately Essential. For an outsider, what you're doing here might look almost magical. Effortless creation. But with that comes the downside: all that internalized knowledge entrenches your thinking.
We all have to progress through each of the stages - there are no shortcuts. All that is left is to enjoy each part of the journey for what it is. I’ll leave you with this incredible image and quote.
Thanks for reading CodeCraftr! Subscribe for free to receive new posts and support my work.
- Dreyfus Model of Skill Acquisition. A mental model on how learners acquire skills in which the learner progresses through multiple stages.
- Pragmatic Thinking and Learning: Refactor Your Wetware by Andy Hunt. A great book that explores our brain's ability to think and learn. Touches on different ways to maximize this process and explores skill acquisition.
- Peak: Secrets from the New Science of Expertise by K. Anders Ericsson, Robert Pool. This book demystified peak performance for me. It also explains the dangers of forming patterns as we amass experience, which was an eye-opener.