The last four weeks have been tumultuous, as I crossed a particularly important chasm.
I came to accept that software development as we know it is gone.
Not yet for all, but eventually for almost everybody.
As somebody who took pride in fundamentally understanding the tools I use every day, getting proficient and effective at using Emacs, and Vim, and the whole array of low-level UNIX tools like Make, this was a bitter pill to swallow.
LLMs have become so good at writing code – if you just “hold them right” – that none of the things I valued are relevant for the creation of end-user products, to any significant degree.
This requires an identity shift – mastery of the craft is not relevant, when the craft itself becomes irrelevant.
Sharp knives not a kitchen make
Why get really good at forging and smithing kitchen knives when you can just buy one and move on with the task of making food?
Sometimes it is fun to create objects for yourself.
The process sure is enjoyable.
You learn a lot.
But when starting a restaurant, you wouldn’t hire someone to forge bespoke knives for your restaurant.
You wouldn’t burden your chefs with that.
No, ideally your chefs are free to focus on what matters:
picking high quality ingredients,
establishing processes that enable effective collaboration in the kitchen,
devising new signature dishes that set your restaurant apart from others.
While the restaurant business has solved this problem over a century ago, programming is going through a similar transition only now.
The programming world up until recently was a world of knife-forging.
Your business needs a website that’s tightly integrated with your business processes?
Time to hire a team of software-smiths, creating bespoke software for you.
Every single time, for every single business.
None of this matters anymore to the degree of economic relevance.
Old questions, new answers
What programming language should you use?
Old me: it’d be amazing to write more code in Common Lisp – live-reloading everything! Performant, but also dynamic! I’ll settle with Ruby (an acceptable substitute), or Go for now (when performance matters). JavaScript – I’ll write it begrudgingly, because it’s needed.
New me: The one that allows you to do what you need, and can be easily written by LLMs.
What editor/IDE should I use?
Old me: let’s learn Emacs – I can program it exactly to my liking! Vim has such an interesting approach to text editing, let me learn that too. Finally, with LSPs I can bring IDE-like features to any editor!
New me: The one that allows you to monitor, instruct, and manage coding agents the easiest. Today this is Cursor, but it really doesn’t matter.
This code “feels bad” – I need to rewrite it
Old me: what even makes code “good”? Can I list the traits? Let me rewrite this piece of code five times until I arrive at something that “feels right”. Now I only need to convince my team that this is better.
New me: The LLM does not have feelings – if it passes the tests and you can understand what’s going on, then probably the code is good enough.
What’s next
I feel like I’m constrained by time – I want to drive Cursor harder, faster, more, further.
When it works, the experience is magical: the machine writes working code and while it does that, I plan out the next step.
The challenge is getting good enough at instructing the machine so that it’ll get it right 99% of the time and doesn’t require baby-sitting anymore.
That’s called Prompt Engineering.