I hated math growing up. Except for very rare exceptions, math exercises were the worst kind of task for me. In high school, I was given the deeply unrewarding task of memorizing proofs and regurgitating them back during exams. It was a miserable experience.
Proofs can be interesting, elegant in their own way, new knowledge being created line by line. But during an exam, they’re just a cruel memory test. Each step is unique, distinct, and once you forget one, you have to reinvent math on the spot. That’s a tall order, considering that it took a lot of effort by some very bored geniuses centuries ago. My chances of getting it right during the last 20 minutes of an exam were, frankly, not great.
Physics was better. You still had a single solution for the most part, but the process was nicer. In the most enjoyable parts of physics you have to memorize a few formulas, and then you get to use them, like tools, to tinker your way toward a solution. The problems make more sense, they are grounded, and if you understand the concepts you may be able to reason your way out of trouble.
Then I discovered programming, and what can I say: it was bliss. All you needed was a very few, basic concepts, and then the floor was yours. No set paths, no truly optimal solution. A balance has to be struck every time. Do you want cleaner code, shorter code, faster code, or just code that actually makes sense tomorrow? Yes, there are some standard fórmulas, but if you don't quite remember your bubble sort you can make up your own algorithm!
for i in (5,4,6,15): sleep(i); print(i)
It's the freedom that makes it click for me. It's LEGO, minecraft, painting - whatever you want to call it, and after you are done you get to push a button and see the machine react to your instructions. And there’s something about the tools being so simple that gets to me. You build absurdly complex systems out of tiny, colored blocks, ifs, fors, and elses, and it all somehow works.
Or maybe it doesn't! Still, what a delight it is to see the machine run, even when your instructions are wrong! Unlike a math test on a static page of paper, a staring contest between an idiot and the math-that-will-not-be, looking back at you in disbelief at the horrors you've written, you get instant feedback on what you’ve done. When you make a mistake in your code it's all there, it screams back at you, highlighted in red and underlined with a funny squiggly line. You get to retrace your steps, follow the logic, and fix it in a pinch. The realization is much nicer, the mistakes, at least the basic ones, easier to correct, just a line here or a semicolon there.
What makes a puzzle enjoyable?
Have you ever played a puzzle game? My experience with puzzles (except for very few, specific cases) has mostly been as an accessory to other games, a way for the developer to switch things around from the standard looting and shooting, and they are almost always boring. Because the game is about adventuring, or climbing, or whatever, they can't make the puzzles too challenging or engaging. They’re usually just a perception check or some very basic pattern recognition.
The offending part for me is not the fact that they are easy (a win is a win), but the mind-numbing experience of entering the solution. Once the puzzle is solved in your head, walking around pushing slow moving blocks for 5 minutes to input a solution is not interesting. I get it, a small friction is needed to avoid the player from guessing their way into the password, and it can work as a victory lap of sorts, finally clicking everything into place, where you know it belongs. But the challenge is gone. During that time we are just a sad character in a very unusual room, being guided by a bored player, waiting for the real game to start again.
Which brings me, inevitably, to the new tools added in the game: the ones that think back.
I like solving the puzzle of programming, but eventually I get tired of entering the solution. The first time you implement something new is challenging, the second one is rewarding, the 10th? Pass. Today, when programming, LLMs are covering that victory lap of sorts for me. I get to solve the issue in my head, design and describe the solution, and see if I am right in seconds. I can see the LLM working through my instructions, implementing my solution the best it can. Cursor and other LLM-integrated IDEs are great in that regard. You can see the code appear at lightning speed, with a show of color and flashing lights that almost seems designed on purpose to feel like a casino machine.
However, every time I try to use the more autonomous agents, it feels off. The solutions they offer work, this very blog is proof of that (I paid a miserable half a cent for it to the Anthropic fellas, pray for all Junior developers). But the solutions were not mine, so I did not care for it. I did not get to solve the puzzle.
Soon enough, my favorite tools will still be useful, but not needed. And that’s fine. When they finally do all the important thinking for us, I’ll still be here, solving imaginary problems, having fun. Especially now that I figured out that I love solving puzzles.