If you're like me, you got into programming because of a spark of joy you felt when writing your first program. As simple as hello world, or a loop was, something was intriguing, pulling you in. Now, what did you feel at first when you utilized an LLM? The same joy? I did. Then after a few weeks, what did you feel. I felt as though the spark was gone. It doesn't have to be like this. Utilizing the current technology and keeping the same enjoyment is possible through a curated toolkit and usage guidelines (That won't slow you down compared to your peers.)
Step 1: The Agent
I've recently begun to use OpenCode as my agentic coding companion. I'm sure using a tool like this isn't news to you, considering the hype surrounding claude code. However, the way you use a tool like it can impact how you feel and the quality of your output. As silly as this may seem, reading the code that is generated before allowing it to be implemented, or as its being implemented, will both increase quality and your enjoyment. By understanding the output you begin to take ownership of the code, you might change something you disagree with, or decide to go a different route after seeing the generated code. This also increases the quality of your output, since you will understand on a deeper level. It will foster an ownership of the generated code, even if it isn't yours per se, but it becomes yours as you modify or begin to understand it.
This is a standard I try and hold myself to
If you can't explain a generated code snippet simply and concisely then you shouldn't include it in your codebase
Now, this isn't to say that the generated code must be simple, just that your understanding of it should be deep, such that if something went wrong in the codebase, you could fix it quickly without the use of an LLM. No extra time spent figuring out what any of the code is doing.
Step 2: The Chatbot
This section is a little more up to your personal preference. Since the chatbot doesn't have direct access to your codebase a different approach can be used. Use it to clarify gaps of knowledge. The LLM was trained on billions of lines of code, StackOverflow questions and answers, and possibly every single programming textbook ever written. Use it as a supplement to a google search. Blindly copy-pasting will yield the same results as using an agents code without understanding it. A chatbot can also be a good way to introduce LLMs into your workflow, since it's harder to just have it write code for you. That's not to rag on agents, but poor practices with them compound fast across a whole codebase in a way a copy-pasted snippet doesn't.
Step 3: Clean Code
Given the chance, an agent or chatbot will create repeated code, a disorganized file structure, and possibly components of your software that expect differing data. For example, I've since replaced "Add X feature," with a more nuanced "This component does X well, lets expand it by doing Y, I noticed that this other component also does Y, lets consolidate this into its own function." Here the second prompt will likely result in refactoring and a cleaner codebase that makes more sense to read, whereas, the first prompt will probably result in duplicated code that won't be maintained well in the long run. With proper guidance and planning bad design choices will not happen, or at the least be greatly reduced. Whether by an LLM or a human. Sure a small project an LLM will handle fine, but once things start getting bigger it all crumbles without a knowledgeable human guiding it.
Overview
To recap, most of the issues stemming from "Vibe Coded" apps or unchecked LLMs are a result of a developer being out of control of their own code. Keeping that control is key to keeping the sense of enjoyment in your work and increasing the quality of your LLMs output. The upfront cost of reading and understanding pays for itself the first time something breaks, you won't need the LLM to explain your own codebase back to you. This itself can sometimes save time in the long run, even if it can seem slower or cumbersome in the beginning.
Also, try and write a few functions here and there by yourself to remind yourself why you choose to do what you do.