6
/
1
8
/
2
5
C
o
d
e
w
i
t
h
A
I
t
h
e
H
a
r
d
W
a
y

How are you using AI to code?

This comes up a lot when two software developers are talking. I hear a lot of “that’s a new one” or “haven’t heard that before” when giving my answer, so I decided to share how I code with AI the Hard Way.

The Hard Way

By “the Hard Way” I mean:

  1. Using any and every AI editor, agent, autocomplete, and army of robots that serve at your pleasure to generate code*, and…
  2. …then physically typing out every character of every line of code they suggest rather than accepting their work.

* These are incredible tools from sci-fi dreams, I’m having the most fun I’ve ever had and am faster than ever.

† Yes, this means never pressing Tab to autocomplete or clicking Accept in Cursor or committing what Claude Code produces or merging the Codex pull request. It means typing every char yourself.

The Hard Way is an old learning tool

The term “the Hard Way” is borrowed from Zed Shaw, who makes a strong case for no copy-paste as a pillar of his approach to learning:

Zed Shaw's Hard Way is Easier
— Zed Shaw’s Learn Code the Hard Way

The idea isn’t novel. You see it pop up again and again in posts extolling the virtues of typing every single line yourself when learning to code. And it goes further back. I remember sitting on the floor of the programming section in a New York Barnes and Noble 20+ years ago, where I’d go night after night during my internship to read a mix of Joel on Software, Hackers and Painters, and thick How-To-Program-X tomes which were another 5+ years old and gave the same harsh no copy-paste commandment alongside CD-ROMs sticky-puttied to the back covers that had code examples restricted by crude attempts at disabling copying in case you got lazy.

Book with CD

Typing the lines myself when borrowing others’ code became habit in my upbringing. So it was natural for me to type everything myself when I started borrowing from LLMs.

The Hard Way is good for AI coding, too

After 3 decades in this line of work I should be past “Learn to Code”-type advice, but the Hard Way keeps paying off. I’ve found new benefits from applying this habit to my usage of AI coding tools:

  1. While moving faster than ever on AI’s coattails…
  2. …I know the code better than if I just read AI’s work.
  3. …I end up editing / improving most of the code.
  4. …I become stronger, even after 28+ years of coding.
  5. …I get to hear the click-clack-click of my keyboard.

I love the result, I wind up connected to the code, and I’m having fun. What sounds like friction doesn’t feel like it to me.

The Hard Way is getting harder

Coding with AI the Hard Way used to be natural when the primary tool was a talk with ChatGPT / Claude. Now agents and editors are getting even more magical, and their powers are built in ways that increasingly remove human-as-typist.

I pine for ways to embrace the brilliance of AI coding tools while still typing things myself. Tactically, that means a lot of:

  • Letting Claude Code do its thing, grabbing the diff, reverting its changes without committing, and opening the diff to use as inspiration
  • Not merging the Codex pull request / just using the diff as inspiration
  • Not pressing tab when Copilot or Avante suggests an autocompletion / just using it as a guide
  • Using Cursor in a manner in which I’m either rejecting tons of stuff to recreate myself, or accepting tons of stuff then not committing then diffing then re-typing. I don’t love either of these.
  • Still doing lots of Claude/ChatGPT discussions about my code, since they are less embedded in the flow of editing.

I dream of AI editors and agents that grant me their full powers while buffering output to some other place I consume for inspiration as I edit each file myself.

The Hard Way could be cope

You may think I’m nerfing the sand gods by insisting on a human typist. I’ll admit two things:

Coding or coping with AI?

Admission #1

Mandating that a human types the code will be a major impediment once we’re in a world where I can simultaneously command an army of agents to build high-quality works in tandem like a Starcraft player sending out waves of zealots and dragoons.

My credentials earned in Command & Conquer / Age of Empires / Warcraft / Starcraft have prepared me for this world of orchestrating the machines when it arrives on my doorstep. I will thoroughly enjoy it.

Ready to command armies
Like a flashback in which the protagonist realizes how their past has prepared them for this moment, my RTS training has me ready to command legions of AI agents.

However, the inverse is also true: I know we’re not in this world because I don’t enjoy “hands-off” delegation to agents yet, not nearly as much as I enjoy coding the Hard Way alongside them.

I believe this is because — to stretch the Starcraft metaphor — when it comes to my codebase and product and vision of what I’m up to, I’m still god-tier at micro compared to them. I end up editing the vast majority of lines they produce as I’m re-typing their output. Their macro skills are untouchable (amount of code generated, range of implementations considered, explanations of a new codebase, brainstorming solutions for a new problem domain). But generating exact lines of code that I don’t want to change? Git gud.

What's more fun than good micro?
What’s more fun than good micro?

I don’t think this comes from perfectionism or luddism. Ask my old teammates and they’d complain that I’m overly pragmatic / not exactly an artisan of fine code. And yet, I edit or completely rework most AI-generated code.

Admission #2

There is a real chance that my Hard Way tendencies are influenced by the fact that I just love typing. I didn’t fall in love with these mechanical keyboards just to press tab, tab, tab. And I’ve entered the stage in life where I unapologetically love what I love and trust there’s deeper wisdom in my sources of joy.

Tab, tab, tab

If you’re dabbling with similar flows, I’d love to hear from you. I doubt I’m alone.

If the Hard Way sounds like a pain, I haven’t had this much fun coding in my entire life. And I’ve never been this fast.

Thanks Zach Gotsch, Ben Komalo, and Charlie Marsh for draft feedback.