
"This book addresses the topic of software design: how to decompose complex software systems into modules (such as classes and methods) that can be implemented relatively independently. The book first introduces the fundamental problem in software design, which is managing complexity. It then discusses philosophical issues about how to approach the software design process, and it presents a collection of design principles to apply during software design. The book also introduces a set of red flags that identify design problems. You can apply the ideas in this book to minimize the complexity of large software systems, so that you can write software more quickly and cheaply."
Given that, I'd recommend the mainstays on good general software design. One of my favorites is "A Philosophy of Software Design" by John Ousterhout. Good general design practices.
Other than that, I think a lot of books generally stay relevant. If it's topic specific, it'll give you a good background on understanding of that topic so you can make sure you or an agent are making sound decisions. Architecture of course is more valuable than ever.
Here's another plug for his book:
A Philosophy of Software Design/2e
I'm also trying to transition into software development and have been watching John Ousterhout's talks and just yesterday started reading "A Philosophy of Software Design" - enjoying it so far.
A Philosophy of Software Design — John Ousterhout
Designing Data-Intensive Applications — Martin Kleppmann
Domain-Driven Design — Eric Evans
There might be some courses as well, but I never looked into them.
This also works quite well:
Write down the problem. Think real hard. Write down the solution. (Thank you, Feynman).
Still, I like better when we actually do try to name what we're talking about. We've probably all read the motorcycle guys take on quality and things like that right? I guess the theme some are going with is that quality can't be objectively quantified and to define it is futile but I've never liked that take. If we think LLM generated code is low quality then it certainly makes sense to start our attempts to define or at least describe what makes the quality needle move, because language is how we encode lots of information and information is what feeds LLMs.
People also like to rag on uncle Bobs takes, clean code, etc but I like how at least he tried. I've been a fan of his for awhile but I'm not big on objects so don't care about his pushes on that sort of thing. The best take that offered hints that I would call quality is "A Philosophy of Software Design" by John Ousterhout, there is plenty of stuff in this short little book that was very satisfying to me, like for instance where Bob wants short/small functions, Mr Ousterhout was much more flexible on this, like for instance maybe some functions can be bigger if the need arises, things like that.
I'm happy that I got to experience this and I learned from it. Gotta choose your battles or something.
As for Go's html/template: I think it has one of the weirdest / most unnatural interfaces. I recently reread "A Philosophy of Software Design" and one of its key points is to keep interfaces simple and push complexity downwards, making it easier for others to use. Now why do I have to care about "cloning templates" every time I render some html template? Love the Go stdlib, but this thing feels unnecessary complex to me.