Abstractions aren't a burden though, they are more like a support. A good abstraction let's you write 10 programs in the time it would have taken to write one. Also, we now have "production" languages with generics and monomorphization so abstraction is easier than ever.
Djikstra has a great article as to why English language programming will always be second to a programming language. A "formal system" (edited from regular language) is the most precise way to specify things. An "abstraction" is basically a domain specific language.
The way I like to use LLMs is to build abstractions. I like to build mathematical code and ask the LLM to use it. I think that LLMs are very mathematical thinkers and they like it when they see Semigroup<T>. And it's not hifalutin either, I'm processing calculations along DAGs with a million+ nodes in milliseconds, thanks to abstractions
LLMs have been trained on a lot of data and have built representations of various concepts and links between them from that training data. This is why they are good when seeing names of things like `Semigroup` as they can draw on all the information about that concept from multiple sources (mathematics papers and discussions, programming articles and code, etc.).
There was an article or comment somewhere that said that when an LLM was prompted in comments/variable names about a complex algorithm or something like that in a very specific domain it was very knowledgeable. However, when given different names/terminology for the same thing it didn't understand the problem it was prompted to solve.
This is also why LLMs are good at generating code using Bootstrap, Tailwind or any other technologies as they can relate terms like `flex` and `grid` to various layout patterns. So using sensible names from the literature/specifications/etc. helps both developers and LLMs.