but you can't make good software with AI.
That's probably true if you use e.g. Claude to generate the whole lot.
I'm going to come solidly down on the "maybe" line, here. I've had some awesome success with
xtc - and I'm pushing even further on it now, I'm in the middle of a re-target to create an intermediate representation between the front-end and the back-end, so it can target more than just the 6502 and which opens up even more possibilities for optimisations.
Writing a (good) compiler is a big job, and it's taken Claude (not me, just "him") about a real-time month of effort so far, which is ... stunningly quick. It produces code within grasping-reach of hand-optimised assembly for the 6502 (benchmark runtimes of ~11 secs whereas the best hand-optimised is ~10 secs, there's also hand-optimised that's ~20 secs...), and creating a language with automatic memory management built in, classes, interfaces, inheritance etc., on such a limited CPU is quite the technological feat, IMHO.
I can imagine the wails if I'd walked into an engineering meeting and announced that I wanted the team to take that toy, demo-version piece of software and start turning it into something a lot more heavyweight - without that being the plan all along... With Claude it's just "ok, let's do this, and that, and as an optimisation we should <insert random thing I've never heard of, go google, and realise it's exactly the technique to use, "Sparse Conditional Constant Propagation", this time, if you care>
I sometimes drag it kicking-and-screaming towards what I want and not what it recommends, sometimes it suggests things I have to go look up before I agree with them, sometimes I plain say "no, that's not the direction". You still have to be in control to get the result you actually want, but it does take away a lot of the typing and leaves you free to do a lot more thinking.
It also allows for more exploration, because of the lack of that typing. My "6502" is on an FPGA... last night I was musing about how different the cost is of using the hardware stack (limited to 255 bytes in page-1) and the software stack (where all the arguments to functions actually get pushed, because otherwise your call-depth is about 6 on complicated functions). PHA is a single instruction, the software stack has to have space in zero-page, and indirect through it, takes 4-5 instructions. What about if we gave page-1 infinite depth ? Just have a public 8-bit SP but really it's 16-bit ? Well TSX/TXS would be a problem but that's about it. Okay, do the same for X. Hmmm. If it's documented and the compiler uses it, massive win for any function call...
I think there's still a lot to be said for the old adage "garbage in, garbage out". I can see it would be easy to just agree with it all the time, and ... that would not be a good path to go down ... so you still need the knowledge (or some way to verify and understand what it's telling you at least) but with that said, I'm having a surprising (to me) amount of success with it.