The easiest mistake to make with AI is confusing generated code with progress.

The problem is that a lot of generated code exists only because it was easy to generate. Not because the product needed it. Not because the user asked for it. Not because the problem became clearer. Just because the cost of producing code collapsed, and our discipline did not improve at the same speed.
Every line of code adds surface area. It is another place for a bug to live, another thing to maintain, another door that can become a security problem later. In the past, writing code was expensive enough that it forced you to think. Using AI to build software is like aiming a powerful weapon: if your direction is wrong, it will still accelerate and build momentum around the mistake.
So I am not very impressed when big tech companies say a huge percentage of their code is now generated by AI. That number sounds powerful, but it hides the most important part: the people directing the model are usually very strong engineers. They know what to ask for, what to reject, what to simplify, what to test, and when the generated code is secretly making the system worse. The impressive part is not that AI produced code. The impressive part is the judgment around it.
People do not pay for code as text. They pay for a problem solved, a workflow improved, a decision made easier, a pain removed, and someone taking responsibility for the outcomes. So adding more code is not automatically adding more value. Sometimes it is just adding more weight. Dijkstra made a version of this point decades ago: lines of code belong on the cost side of the ledger.
Ask for less. Delete more. Sometimes the model really goes too far in the wrong direction, and I just discard all changes and start again with a clearer request. Prefer boring code you understand over clever code that only exists because generation was cheap.
So yes, build with AI. Use the leverage. Move faster when you are pointed in the right direction. But do not confuse motion with progress.