For the best part of the last two years, like many, if not almost all, developers, I’ve been relying more and more on AI to speed up my work.
At first, I approached it slowly, enabling tab suggestions in VS Code. Then came Cursor, although the AI chat was already available in VS Code. I started experimenting with it, taking another step away from writing code by hand.
The next step came with the release of ‘Plan mode’ for Cursor, which led me to experience spec-driven development, or at least something closely related to it, for the first time. I was no longer deciding what the code should look like. I was working at a higher level of abstraction, defining what needed to be done and caring less about the how.
That was nothing, though, compared to what more adventurous people were already doing with Claude Code, which was the inevitable next step in my approach to AI.
For the longest time, it felt to me like embracing Claude Code would lead me to vibe coding and lose touch with the code altogether, getting rusty in the process.
For the last two months, I’ve depended heavily on Claude Code to achieve the speed I was asked to maintain, and in doing that, I realized how easy it is to lose control and find yourself in the driving seat of a self-driving car going full speed on the highway. Hoping whoever wrote the code for that car got everything right, and I’ll get to the destination without crashing.
I’m an engineer at heart, though, although hope is a wonderful thing, I know I cannot rely on that alone.
I was getting things done faster than I ever did, and I knew I could even go faster, but at what cost? To go faster, I would’ve had to put my full trust in the tool. Let go of the steering wheel. Stop checking the road. Stop hovering my foot on the brake pedal, ready to press it if things go sideways.
Was I ready to do that? Was it worth it? To put it bluntly, at least from my perspective: no.
You see, together with the speed at which you deliver outcomes, AI can increase just as much, if not even more, the speed at which you accrue technical debt. That scary monster that lures in your codebase, that any experienced developer has learned to coexist with, when it’s the right call to feed it, and when it’s time to give it a little trim.
Technical debt isn’t going anywhere. No real project can exist without accumulating it, even a perfectly executed one. You might do everything right on your side (if you do, congrats! You’re way better than me), but even if you do, you more likely than not have external dependencies, and those might not be 100% right, or they might update in breaking ways in the future.
What you can (and should) do, though, is be fully aware of the debt you have accumulated. Monitor it and keep it at bay.
But what happens when you lose touch with the code? What happens if you blindly trust that the AI will get it right? At that point, you also lose control of the status of your technical debt and, sooner or later, the collector will come knocking with an unresolvable big, a scaling issue, or who knows what problem future-you (and his future AI) will go mad trying to solve.
To make matters worse, we keep shifting left the point where AI comes into play. At first, it was simple edits, then you started from prompts, then came spec-driven development, and now, with plugins like superpowers, Claude Code can start from a simple prompt and write the spec and the execution plan itself before executing it.
This puts the human 3 steps away from the code (prompt -> spec -> plan -> code) and, at the same time, lures you into this false sense of security. You brainstormed everything before Claude wrote the spec, so you might think you got everything right. Correct?
I can’t tell you the times I’ve read the spec generated by Claude and found mistakes, missing or scarce details, or detected shortcomings in my thinking.
You might say: “Ok, so I check the spec. and then I’m good to go”. To that I say: “Good luck!” I’m sorry, but you should put as much effort into scrutinizing the plan as you did for the spec.
You never know when AI will hallucinate. Execution plans usually go into as much detail as to have the code written inside them. Checking them thoroughly can help you spot mistakes, anti-patterns, or unoptimized solutions before they even enter your codebase!
“But, Sir”, you might say. “After I’ve done all this, the code will definitely look great! I don’t need to review the final output!” And you might (emphasis on might) be right, but guess what? You need to check the code just as much as you needed to check the spec and the plan, if not more, since that code is what future-you or your colleagues will have to tangle with sooner or later.
While you do so, do not just limit yourself to checking for bugs or mistakes, though. AI can help us bridge gaps in our knowledge and find novel solutions to problems. Take advantage of this to grow your knowledge! If you see something you don’t fully understand, don’t shrug it off and be satisfied it works. Take advantage of the AI and learn why that is the best solution, or, if it could happen, discover why it’s not and come up with something better!
“But this will make me slower! I wanna go fast!” Yes, it will, but you’ll still be way faster than what you could do if left with no support at all from AI, and, hopefully, it will leave you with a way more manageable technical debt (no, you can’t really get rid of it).
You want to know the best part about this? You can use AI to help you analyze and be critical of all the artifacts above.
There are many techniques to do so, and new ones are discovered almost daily. The latest I’ve heard of is asking your AI assistant to do a pre-mortem of what you’re working on. Tell it what you did fail, ask what caused the failure, and work backwards from there to address the flaws.
I think the best way to close this article is by recalling an ad from Pirelli in 1994: “Power is nothing without control”.
The AI can be your superpower, but to get the most out of it, you need to master it and never let go of your control over it.
As Uncle Ben said, “With great power comes great responsibility”. Your responsibility is to make sure what you do today will be maintainable tomorrow when (not if) it breaks.
PS: shameless plug corner. If you want to improve your use of Claude code with some engineering guardrails, check out the commands I use in this repo!



Top comments (0)