I don't think there's much as project architecture is domain specific.
There's some tricks that's good to know that mostly emerge from language limitations so for novice it's good to learn some language specific patterns:
* Ruby [0]
* Node.js [1]
Then from more stable software except DBs is OS, Compilers and Games:
* Games [2]
* Interpeters [3]
* Computation: [4]
* OS: don't really know.
Generally if you understand computation, computers/language and your domain you will come with good architecture. I haven't found any shortcuts yet. Fast iteration wins, so optimise mostly for that and ability to swap stuff that doesn't work, so contain crap as much as you can. Pure functions are by definition swappable and easy to test so abuse that. Use domain commands to mutate stuff and not updateEntity(X) and you will be good. Use turnOnEngine(car) instead of updateCar({ engine: true }). Also learn to use Facade[5] pattern -> this one makes gluing things much safer against abuse (limits API surface).
It's also good to know about all the things one can optimise for to take decisions more consciously. So like maintainability, reusability, iteration speed, speed of delivery, observability, security etc.
Generally search for "How to design programs book/course" for more abstract stuff and "$MyLang patters/architecture book" or check blogs of some high profile software or their devs
[0] https://www.goodreads.com/en/book/show/13507787-practical-ob...
[1] https://www.goodreads.com/en/book/show/24514193-node-js-desi...
[2] https://gameprogrammingpatterns.com/contents.html
[3] https://craftinginterpreters.com/
[4] https://computationbook.com/
[5] https://refactoring.guru/design-patterns/facade