I don't have to slog through yet _another_ way to sort, split, combine a list, open a file, show a UI component, handle events, logging, make data flow through some type of "database", serialize and deserialize endless things, implement yet another protocol in $whateverishotnow, managing authn, authz, the list is endless.
The interesting part of programming, for me, is deciding on and capturing the domain in a tight, surprisingly simple yet powerful architecture. This is hard - for me - and actually has very little to do with "programming" per se, meaning it has nothing to do with wrangling syntax/low-level semantics of whatever platform I'm on and fighting package managers to name just two highly depressing parts of my job. I don't like typing code. I am doing it my entire life and I still don't like it.
I like coming up with invariants and ways of guarding them. To find simple decompositions that turn a hairy, ungodly blob of a problem into a manageable almost trivial network of not-so-complicated things. The not-so-complicated things themselves.. I don't care in the slightest about them. Opening files, managing database connections, forms, the mechanics of i18n, typing the word "class", you name it. I find it exceedingly boring.
Perhaps I am more of the architect type, but I find managing a bunch of AIs and making sure they don't stray from My Path is easy on the mind. Programming works on my level of abstraction finally.
The strange sorts of errors and reasoning issues LLMs have also require a vigilance that is very draining to maintain. Likewise with parsing the inhuman communication styles of these things…
For instance I'm the old world, if you wanted to change an interface, you might have to edit 5 or 6 files to add your new function in the implementations. This is pretty routine and you won't need to concentrate that much if you're used to it, so you can spend that low-effort time thinking about the bigger picture.
I figured out some patterns in the way it behaves and could put more guard-rails in place so they hopefully won't bite me in the future (spelled out decision trees with specific triggers, standing orders, etc.), but some I can't categorize right now.
You can't figure this out instantly except when you'd review everything the LLM produces, which I am not. So the round trip time is pretty long, but I can trace it back to the intent now because I commit every architecture decision in an ADRs, which I pour most of my energy into. These are part of the repo.
Using these ADRs helped a lot because most of the assumptions of the LLM get surfaced early on, and you restrict the implementation leeway.
But maybe pacing/procrastination might be relief valves?