Several months ago, I decided that AI contributions were no longer welcome in a FOSS project I am building and maintaining - LibreWeddingPlanner. It’s not that it got a lot of contributions with AI - actually all contributions I’ve had are translations and feature requests - but I wanted to avoid future drama and have a position against AI.

However, although I was not using AI for my FOSS contributions, I kept using it at work. In my workplace, as well as in many of my developer friends’, using AI to work is very, very common. Not without a digree of shame, let me tell you about this experience, and how it was turning me dumber, lazy, and a worse developer.

The sweet start

A friend told me hey, you should try it, you feel so powerful. Once you start using it, you cannot stop. The tasks that took you days, you can have them in hours. No, we’re not talking about cocaine, although to some degree I consider the use of AI, an addiction. I started enabling the enhanced autocomplete in vscode (or was it enabled automatically?), and downloading and using other code generation models just followed. When I was a child, I remember my parents saying be careful with the bad guys who offer candies at the school gate, those are not candies, those are drugs. When I was in my twenties, I’d pull their leg saying yeah, it’s like they give away the drugs now hum? Well, in my thirties I think they may very well do.

Once you start using AI coding agents, things spiral out of control very quickly. At the start, you ask AI to implement a function for you, or to write tests for a certain piece of code. If you’ve been a TDD guy for a long time, you’re inclined to ask it to do the tests for you first, so that you can later write the code. Except you don’t write the code anymore, you just ask AI to do it, and half of the purpose of TDD (not biasing the tests by how you’ve implemented the code) is gone. But you feel you go so fast that you start not caring.

One day, I saw the agent was co-signing the commits I was making, and I ran to opt-out from that setting. Like, I wanted to pretend the code was my own. Gosh.

Losing control

It would not be so bad if things had stopped there, but that’s not how most human brains work. If you like something and you can have 2x, you’ll have it. I started pasting the whole Jira description of a ticket, and let AI implement it for me. Yay!! So powerful!! Working on a codebase that was relatively new to me, I started losing control over which changes were really needed to fulfill the task. I thought if the AI, which has read every line of code in the project says it’s needed, so be it. Control is an illusion. Other folks I’ve discussed this with agree that they don’t know 100% of what the code they are pushing to production actually does. I bet we not even 20%. Fucking scary.

But it also didn’t stop there. When I had a small task, I gave it to the AI, and in ~30 minutes I had a PR. What was I doing during those 30 minutes? Changing focus. Soon I realized I could have not one, but multiple agents working on different tasks simultaneously, in multiple git worktrees. Full power! Tokenmaxxing! I connected the agents to Jira via ACLI (command-line interface) and just asked them “work on this jira ticket in a separate worktree”. And it would start working on it. I felt ecstatic.

When the task was not so small, you’d think I was working on it myself right? Hell, no. I would of course ask AI to decompose it into smaller tasks, and work on them. AI would then give me a super convincing PR with a bunch of changes I didn’t quite understand. How on Earth was I going to ask for a code review of those changes? What would my peers say? What was I going to say when they (more experienced, specially in that codebase) ask me why I did this or that? How was I going to admit it was all AI, and I was nothing but an AI sheperd? So I forced myself to understand the code. Not that I wanted to understand the architecture of the codebase, I wanted to avoid the humilliation of not knowing what the fuck I was doing.

At some point, I had so many AI agents working, that the focus change was too much for me. There were tasks I could have done in 20 minutes easily, that took 5 minutes of an AI agent, and then 2 days for me to review. Because there were so many other things. And maybe AI and computers are good at context switching, but not me. I was exhausted. Because if it was just about approving PRs that are prefectly written, it would be good. But for each PR I had to look at the code, the tests, the style, give feedback, switch to something else, go back again, push, see if I have any PR comments, if CI passed, wait, now the linter complains. And it takes you 2 days to deliver something that could have been literally 1 hour single-focused. In my personal experience, multiplied AI performance is just an illusion. Multiplied frustration and exhaustion is guaranteed, though.

I think there was not a single task I gave to the AI that I could merge as is. Of course, I didn’t write the commits or the PR descriptionss myself (what is this, 2024??), AI was doing it for me, and it made sure there was a 7-paragraph description in the PR, explaining what it had done. I stopped reading those descriptions, like, I told it what to do, I assume it did what I said. The description is for others. Because there has to be a description, right? AI is so fucking good as sounding professional, that you relax and let it be. It’s not that I actually though the code was good, but you get convinced over time, you get lazy, you become complacient. You stop questioning, and start accepting as good some code you would have never accepted, just because you cannot tell why it’s bad. You have lost control. Most AI developers will deny it, but deep inside, they know it’s true. Just don’t want to face it.

Months passed by, and one day I realized I had not written a single line of code myself in several months. I didn’t even commit myself. Countless times I’ve written in the AI agent chat “commit and push”. What. The. Hell. If that is not laziness, I don’t know what it is. AI was also not able to solve all the tasks that I gave it. Not even half of them. Once and again, I had to babysit the AI agent saying “now, apply this pattern” or “in the specs, separate the test setup in a before block, and add the assertions in a different block”. Like I was mentoring a junior. Don’t get me wrong, I love mentoring, I’ve done it for years, and I think it was good for the mentor and the mentee. But I’m not going to fucking babysit a machine, sorry.

Often times, I would see that the quality of the code written by AI had decreased significantly. Not that it was brilliant at the start, but I got the feeling of “dude, you’ve done this before, why are you uncapable of doing this again?”. So I had to prompt it again to re-explain how to do it. Or link it to a file with my preferences. Alright, I know what you mean now, sorry about the confusion. Let me redo it for you. And again it would do a fucking mess that is not what I was requesting. It started reminding me of the strategy where Google lowered the quality of the search results, forcing users to serach several times, and see several times as many ads. And if that worked for Google, how is it not going to work for AI? Specially in the uncertain financial times the AI companies are going through, do you really think they would not do it? Come on. They will do this and more.

Other days, I would see that an agent had been stalled for 30 minutes without giving me an answer. What to do about it? Do you think I took the task and worked on it myself? Absolutely not. I took the verbal whip and, sounding authoritarian, demanded my actual code! The AI agent profusely apologized, and gave me in 20 seconds what it had not given me in 30 minutes. I looked at the token expenses, and it had spent $30 in tokens for absolutely nothing. If I was the one paying the bill, I would feel completely raged.

Regaining control

One month ago, in a code review of one of my PRs, a coworker said something like “this test you’ve written doesn’t actually test the scenario that you’re changing in the application code”. I reviewed it, and he was right. But… it was so convincing… And I felt shameful. Because for me, a developer who had been using TDD for 10+ years, failing on something so basic was a bit of a humilliation. I realized I had lost control, and it was not going to get any better. I think its worthless to just try harder, be more picky with the AI, demand the quality you’re paying for! Because despite your efforts, the AI ends up convincing you, and making you complacent again.

So I decided I would stop using AI. Even if that costs me my job.

When you take a draft PR written by AI and have to work on it yourself, you realize to what degree you didn’t know what it was doing. You start questioning if you need this and that, and ultimately discard everything and start over. I felt rusty, like I had not coded myself in ages. Fortunately, I had been programming here and there in my side project, so the effort was noticeable but not that bad.

I went back to TDD, to my PRs with just 5 files changed. To my 2-line PR descriptions that were straight to the point. I went back to understanding what I was doing, to deploying with confidence, to being ready for a detailed code review, because I knew what the changes were doing, and I could justify every line of code. I went back to enjoying human code reviews (not AI-ones, I still hate those. Even more humans that paste AI reviews pretending they are their own), to learning from them. I started asking about architectural decisions, why things were a certain way. I could have asked AI, but I preferred to ask my peers.

I recovered the joy of programming. And I didn’t look back. I won’t pretend that number of lines of code or PRs is a valid metric, especially when AI can be as verbose as it wants to win on every metric. But I can say that I am pushing significant changes every day, getting PRs merged, and at the end of the day, getting the work done. And for that reason, I’m not scared of being fired. Plus, I’m keeping my brain functions intact.

A piece of advice

Say no to drugs. Kind of a metaphore, but not quite. The first step is to realize how dependent we you are on AI. A piece of technology that you don’t control, and which costs your employer (if not you) a fortune. You’ll say but my manager expects a high performance from me, how am I going to underperform now? I cannot speak for you, but that didn’t happen to me. I don’t think I underperform compared to 2 months ago. If anything, I am now more aware of what I’m doing, more capable of responding to an incident if there is one (because hey, I wrote the code that fucked up), and the more I (literally, me) work on the codebase, the better developer I become. That is what your manager should want from you.

And you will save them some bucks when the AI budget cutoffs start - because they will, if they haven’t already.

If you’re a developer like me, it was your experience as a developer what got you that job. If you’ve been some years in the market, you know you are as good as difficult were the problems you had to face during your career. If you turn off your brain, and relax babysitting AIs, you’re not getting any better. You’re losing value, because what you can deliver, your actual value as an engineer (not an AI sheperd) decreases as your brain becomes complacent and yields control to the AI.

Wake up. Be brave. Regain control.