LLMs Are Ruining My Craft
This post was inspired by Alex Tatiyants' 2012 classic "DevOps is Ruining My Craft". Fourteen years later, a new crisis demands the same treatment.
Below is an excerpt from an interview with a disenfranchised Python developer. All identities have been kept anonymous to protect the innocent.
"I come from a long line of developers. My father wrote COBOL. His father before him wrote assembly. I have apprenticed at the feet of some of the greatest Java engineers Initech Financial Services has ever seen.
Some say that I just write code. Well, I respectfully disagree. Did Stradivarius just make violins? Did Michelangelo just paint ceilings? Did the craftsmen of the Renaissance just mix paint? Nay, these men made art, first and foremost.
I too consider myself an artist. With each keystroke I create a work of art. With every design pattern I select, every interface I abstract, every factory I instantiate to produce a factory that produces another factory, I create something unique. Something mine.
I have spent years developing and refining my craft, culminating in what I consider my greatest achievement: the AbstractSingletonProxyFactoryBean pattern I authored for our payment processing module in 2019. Seven layers of abstraction. No two code paths exactly alike. My colleagues called it unmaintainable. I called it jazz.
But I have not come here today to talk about my code. I have come to talk about a grave threat to something far more sacred: my commit messages.
Yes. My commit messages.
For years I have poured my heart into the git log. It was a diary. A confessional. A real-time stream of consciousness from a developer in the arena, struggling, failing, occasionally succeeding, always honest.
Behold my life's work:
"ops" "added more stuff" "fixed stuff" "this is a big commit, working on changing stuff" "added mikes js code still not working" "renamed deploy_four_node to five node because well its a five node not four node" "forgot to add a file for haproxy deployment" "kinda ugly but works for now" "I just learning how to do this btw" "ok I decided, yes its been 30 seconds, to make the default behavior..." "Changed Amazin to Amazon due to posible typo" "fixed a bug where an insance wtih no name causes the web interface to error" "...Probably not the most graceful Python but it still works" "well setup.py is working but its a hack..."
This is the soul of a developer. You can feel me in those messages. The exhaustion. The regret. The quiet dignity of a man who has forgotten to add the haproxy file and has stopped pretending otherwise.
"ops..." — do you know what that ellipsis cost me? That is not punctuation. That is a man staring at his screen at 11pm understanding, in real time, exactly what he did wrong. The ellipsis is the craft.
And now.
NOW.
The LLMs have arrived. And my repository looks like this:
feat: rebrand pentest auth as third-party access with DynamoDB credentials Replace SSM-based single pentest user with DynamoDB-backed multi-user third-party access system. Supports security testers, app store reviewers, and partners. Changes: - Move credentials from SSM to DynamoDB with SHA-256 password hashing and per-user status (active/disabled) - Rebrand login page: dark theme matching app, warning banner, branded as "Authorized Access" instead of "Security Test Login" - Add third_party_access_enabled Terraform variable to enable/disable the endpoint without removing credentials (returns 404 when disabled) - Dev: enabled by default. Prod: disabled by default. - Update documentation Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6.
There it is. Credited. Formal. In the git log forever.
Where is the typo? Where is the "posible" misspelling that survived four years of commit history? Where is the haunting reminder that I once spent an entire afternoon renaming a four-node MongoDB replica set to five nodes because, and I quote, "well its a five node not four node rs"?
Gone. Replaced by bullet points. Scoped types. A description of intent, implementation, and consequences, formatted to the Conventional Commits specification, authored by a model that has never once forgotten to add the haproxy file.
Not even once.
I ask you: what good is software without evidence of the suffering required to build it? What good is a commit log that does not double as a confession? What good is fix(terraform): add missing GetVectors permission to MCP server Lambda when you could have had ops forgot the permission again?
Sure, you might get your precious 'reviewable, auditable change history.' But at what cost?
The new commits are perfect. They are clear. They are consistent. They describe not just what changed but why, and they do it every single time without once accidentally typing 'insance wtih' or narrating their own decision-making process in real time.
I hate them.
I did not choose this. I am not even using the LLM. My colleagues are using it. My repository is being contaminated by their competence. I open the git log looking for myself and I find only scoped conventional commits and co-author attributions, stretching back for months, a wall of professional clarity where my chaotic humanity used to live.
Something must be done before the noble tradition of the honest, poorly-spelled, emotionally raw commit message vanishes forever into a haze of feat(auth): and fix(ci): and chore: update dependencies.
The git log is a historical document. And history, I tell you, was never this readable."
I passed Tatiyants' original post around my office in 2012. We quoted it every time someone wanted to build a snowflake. I have been thinking about it a lot lately while reading my own git log.