Spot on. The ease of generating code has completely shifted the bottleneck. Writing code is cheap now, but defining the architecture, setting the API contracts, and ensuring long-term maintainability (like managing Docker layers) is where the real engineering happens. AI is an amazing accelerator, but it can't design the boundaries for you.
One pattern I've noticed with AI-generated code is that the first version often looks productive because it ships quickly, but the real test comes during the third or fourth feature request. That's usually when hidden coupling starts showing up.
The most effective teams seem to treat AI as an implementation accelerator, not an architecture decision-maker. If the boundaries, contracts, and ownership are defined first, AI can generate a lot of code safely. If those boundaries are unclear, it tends to compress everything into the same layer because that's the shortest path to a working result.
What's interesting is that maintainability has become a bigger competitive advantage in the AI era. Generating code is cheap now. Understanding, modifying, and safely evolving that code months later is still expensive.