Recently, Shopify’s CEO Tobi Lütke shared his thoughts on AI’s role in coding, stating that “reflexive AI usage is now a baseline expectation at Shopify.” The gist of his message was that AI is revolutionizing how we work, and everybody should jump on board this train or risk being left behind. I’m paraphrasing a bit, but not much – check out the post for complete context and content.
This struck a chord with me, but not in the way he intended. In a Slack conversation with fellow Elm engineers, I found myself typing:
Interesting timing. I just switched back to
vim
to get further away from AI interference in my coding. My last talk about AI had the subtitle “automate the boring parts” (inspired by that classic Python book), and that’s what it’s for for me.Coding, however, is not the boring part, it’s my craft and I want to enjoy it and stay sharp. Sure, asking questions and discussing topics with an LLM if that’s all you’ve got at hand is fine. But “reflexive AI usage” sounds like a diagnosis I don’t want next to my name.
If people stop the occasional deadlock of grinding teeth, looking at a problem, crying, going for a walk, praying and screaming until suddenly it makes sense (and you learn something!), I’d call it severe regression, not progress.
The more I reflected on this exchange, as well as other comments from my betters, the more I realized it connects to something deeper about our relationship with technology and craft. It’s time to talk about going back to the old gym.
The Rocky Balboa Principle Link to heading
In Rocky III, there’s a pivotal moment when Mickey confronts Rocky about how he’s lost his edge: “You used to be like supernatural, but the worst thing happened that can happen to any fighter: you got civilized!”
Mickey’s solution? “Let’s get outta here, back to the old gym!”
This scene has stayed with me because it captures something profound about mastery and skill development. The “old gym” represents the raw, essential conditions where real growth happens. It’s not comfortable. It’s not luxurious. But it’s where the authentic work gets done.
In the context of coding, our “old gym” is the mental space where we wrestle directly with problems, algorithms, and architectures without the cushion of AI generating solutions for us.
AI as a Tool, Not a Replacement Link to heading
Let me be clear: I’m not anti-AI. In fact, I find it incredibly useful – for the boring parts.
AI excels at:
- Generating boilerplate code
- Summarizing documentation
- Explaining complex concepts
- Helping debug tricky error messages
- Drafting unit tests
- Formatting data
But the core of programming – the thinking, the designing, the architectural decisions – these are the parts I want to preserve as my craft. These are the muscles I want to keep strong by training in the old gym.
The Value of Cognitive Struggle Link to heading
There’s something irreplaceable about the process of wrestling with a difficult problem. That moment when you’re stuck, completely stuck, and you:
- Grind your teeth in frustration
- Step away from the computer
- Take a walk
- Pray to Jesus and/or cry your heart out
- Come back and try a different approach
- Repeat until… suddenly, it clicks
That “aha!” moment rewires your brain. It creates neural pathways that make you permanently better at what you do. It’s the coding equivalent of muscle memory, and it’s how we grow as engineers.
When we outsource this struggle to AI, we rob ourselves of these growth opportunities. We get solutions without understanding. We get code without craftsmanship.
AI can generate code, but it doesn’t (yet) understand the nuanced decisions that make systems truly maintainable and adaptable over time. It won’t design your domain layer with the care and consideration that comes from deep experience and hard-won knowledge. And again: whether it succeeds in the particular task at hand or not should not be your only concern if you care about your craft – whether you learn something should matter too!
To be clear, people have been Avoiding The Struggle™ long before LLMs took center stage. StackOverflow, Google, or even fellow engineers sitting at a desk nearby can be excellent tools robbing you of proper learning if abused. But the in-your-face constant availability and enormous scope of AI tools are just so much more vast and immense—that’s why I’m bringing it up specifically.
Reflexive Usage vs. Intentional Collaboration Link to heading
The phrase “reflexive AI usage” is what triggered my strongest reaction. “Reflexive” suggests unthinking, automatic reliance. It implies delegating not just tasks but judgment itself.
What I advocate instead is intentional collaboration with AI:
- Use AI when/if it makes sense, not by default
- Maintain critical thinking about its outputs
- Understand what you’re integrating before you integrate it
- Challenge its assumptions and review its code
This approach preserves your agency as a craftsperson while still leveraging the efficiency AI can bring.
The Old Gym Workout Plan Link to heading
So what does “going back to the old gym” look like for coding in 2025? Here’s my approach:
Set boundaries for AI usage: Define when you’ll use it and when you won’t. I use it for documentation, explanations, and occasional boilerplate – rarely for core algorithms or architecture. And I’m not using AI powered auto-complete!
Practice manual coding: Regularly tackle problems without any AI assistance. Sites like Advent of Code, LeetCode, or even implementing small utilities from scratch keep those muscles strong. (AI is not the only issue – I’m specifically looking at you “just use an existing npm package for everything” junkies, and you poor “I’m lost without my fancy IDE” souls!).
Understand everything you use: If AI generates code for you, don’t just paste it in. Study it. Understand it. Refactor it. Make it yours. Never, ever just accept copilot / cursor tab suggestions and carry on!
Embrace the struggle: When stuck, resist the urge to immediately ask AI. Give yourself time to work through problems. The struggle is where growth happens.
Learn fundamentals deeply: Strong knowledge of algorithms, data structures, and design patterns gives you the ability to evaluate AI-generated solutions critically. Rather than having the AI come up with the answers, discuss with it (if anything) and ask for relevant (human made!) resources to go deeper.
Finding the Balance Link to heading
This isn’t about rejecting progress or being a coding purist. It’s about maintaining the human element in a craft that’s increasingly automated.
Just as a chef might use a food processor for tedious prep work but would never dream of automating the creative aspects of recipe development and flavor balancing, we should use AI for what it’s good at while preserving the parts of coding that bring us joy and growth.
Conclusion Link to heading
In a world pushing for “reflexive AI usage,” I’m advocating for something different: thoughtful, intentional collaboration with AI that preserves the essence of coding as a craft.
Like Rocky, we sometimes need to step away from the comfortable, civilized environment and return to the old gym – the place where real growth happens through struggle, persistence, and focused practice.
Because coding isn’t just about output. It’s about the journey of becoming better problem solvers, better thinkers, and better engineers. And some journeys can’t be outsourced, even to the most advanced AI.
Let’s use AI to automate the boring parts, but keep the craft in our own hands.
“It ain’t about how hard you can hit. It’s about how hard you can get hit and keep moving forward.” – Rocky Balboa