Books that come into my mind that might be useful to you:
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).