LLM is very good at programming when there are huge number of guardrails against them. For example, exploit testing is a great use because getting a shell is getting a shell.
They kind of acts as a smarter version of infinite monkey that can try and iterate much more efficiently than human does.
On the other hand, in tasks that requires creativity, architecture, and projects without guard rail, they tend to do a terrible job, and often yielding solution that is more convoluted than it needs to be.
I find it is yet another replacement for "pure labor", where the most unintelligent part of programming, i.e. writing the code, is automated away. While I will still write code from scratch when I am trying to learn, I likely will be able automate some code writing, if I know how to implement it in my head.