Mary Rose Cook

Explore, expand, exploit

A few months ago, I started sleeping badly.

I had been excited about AI since ChatGPT came out.  I’d loved using Cursor to help me program since Jay had told me about it over the phone as I walked from Eureka Heights back home to Noe Valley.

But, in January, something changed. The proximate cause was a flood of new AI releases.  o3-mini, Deep Research, Lightpage.  Every week, more intelligence dropping from heaven into my lap.

But the bigger change was that I was getting more productive, faster.

Type in a few sentences, get a hundred lines of code. A feeling of vertigo.

More than that, I could learn a new technique in an hour and become significantly more productive.

This was in stark contrast to the previous twenty years I’d spent learning to program.  That was a slow, accretive grind.  A new technique for encapsulation.  A more refined understanding of what it means to “repeat yourself”.  Learning that you could step-debug a production web app.

My friend, Sam, has this model of learning as building a graph.  Each node is a piece of information or a skill or a behavior.  They’re interconnected.  Acquiring a new node of knowledge isn’t too hard.  It’s a bit harder to elaborate it. Which is to say, to connect it to the existing nodes in your graph.

But the real fucker is when you have to unmake a part of your graph.  You get cognitive dissonance because some of the nodes contradict each other or need to be pried apart or replaced.  It’s very painful to disassemble the graph and remake it.  Learning to program was a lot of that.

Learning to build software with AI feels completely different.  It’s much closer to learning a new discipline. Certainly, the old way of programming is relevant.  But all the power comes from the new techniques in this new field that doesn’t even really have a name.

Further, a lot of the new techniques involve a new workflow. Copy code from your editor into GPT, make a request, get code back, paste it into your editor. No, don’t do that any more. Instead, start by selecting code and then pressing ⌘-L. No, wait, stop. Just press ⌘-L, make a request, get code, press the Apply button. No. New move. Press ⌘-I, make a request, scan the code as it’s added to the repo, run and check the behavior. No, wait, this is the killer. Iterate on a PRD first, then tell the LLM to write the code in one shot.

Adopting a new workflow induces cognitive strain because it requires extra supervision. And it requires willpower to not just do things the old safe way. It’s exhausting.

So the destabilization is three things. First, the pure sensation of doing something with a new, startling ease. Second, the knowledge that I can put in ten minutes or an hour or two and get significantly faster at building software. Third, my methods and working life are changing every day.

With gains like that to be had, why wouldn’t I do it all the time? Stay up later. Get up earlier. Watch AI programming game tape with lunch. Spend an hour learning rather than working, then make up the loss in the same day.

There’s also a problem. There is so much information. Every day is a deluge of new tools, techniques and streams. Which ones are worthwhile? I have a long list of stuff I’ve been meaning to try, that seems promising, that worked and I feel I should be doing more. Sometimes I’ll watch a forty-five minute YouTube video of someone vibe coding and it’ll be useless. Other times, I’ll skip forward and hit a nugget so juicy that I’ll become terrified I’m missing these sorts of things all over the place. Sometimes a technique will seem unpromising but, several hours in, will click.

For this, at least, I’ve found something of a solution. When you’re in a fast-changing environment with high uncertainty, what do you do? Well, Civilization, the video game, is a good guide. You explore, expand, exploit.

You spend a good deal of time exploring widely. Things are changing rapidly and there’s a lot to learn. Many explorations will be fruitless and that’s totally fine.

When you find something good, you expand your technique to incorporate it. Did you hear about an obviously useful tool? Install it! Have you been refactoring your code to make it easier to change? Do it!

And when something’s working, you exploit it as much as possible. It’s easy to learn a cool new technique then forget to use it. Don’t. Instead, bring it back.

I keep a list with these three categories. Explore, expand, exploit. And I spend some time on each.

It’s something to cling to.


Subscribe to my newsletter to hear about my latest work