Back to Ousterhout though,
you might dig his “Philosophy of Software Design” book, or talks associated with it.
Lots to like in this space...
These books are the usual suspects that show up :) I'm not a fan of TDD but if you are, Growing Object Oriented Software Guided by Tests is pretty good.
I wanted to add A Philosophy of Software Design to this list. Its pretty modern and concise, I'd read it before Code Complete.
Another good newcomer is Java by Comparison
This is a really solid list. Specific resources to look at:
A good free intro to python if you’re just starting out programming: https://greenteapress.com/wp/think-python-2e/
A good free intro to SQL. Do this before doing sqlalthemy or cx_oracle. Skip xml but not linear algebra: https://lagunita.stanford.edu/courses/DB/SQL/SelfPaced/about
A good free intro to backend web programming and to unit testing in python: https://www.obeythetestinggoat.com/
A really good guide to thinking about code structure design, not specific to python: https://www.amazon.co.uk/Philosophy-Software-Design-John-Ousterhout/dp/1732102201
For learning about kubernetes, the book Kubernetes Up and Running is well written and concise. Kelsey Hightower is excellent.
I wouldn’t worry about AWS to start out with. It is a bonus. I would focus on finding a well-written tutorial for one backend app framework and work through that to start out. Be sure the tutorial includes help with setting up automated testing. Working through the django tutorial is a good idea.
Next, get good at working with the data store. This SQL course is great. Skip the xml bit but not relational algebra. https://lagunita.stanford.edu/courses/DB/SQL/SelfPaced/about
A lot of what a skilled backend developer does is model business logic well in a way that is extensible. There is a great book about this here: https://www.amazon.co.uk/Philosophy-Software-Design-John-Ousterhout/dp/1732102201
A Philosophy of Software Engineering:
This is mentioned as one of the symptoms/appearance of bad code: Shallow/Passthrough methods, which results deep call chains, adding up cognitive overload. The author in this book recommends deep module over shallow module, which tends to end up with more cohesive code.
This applies to the microservice/monolith debate as well. And it basically boils down to the observation that having lots of shallow services doesn't really reduce complexity. Each service may be simple unto itself, but the proliferation of many such services creates complexity at the next level of abstraction. Having well designed services with a simple API, but hide large amounts of complexity beneath, really reduces cognitive load for the system as a whole. And by "simple API" I think it's important to realize that this includes capturing as much of the complexity of error handling and exceptional cases as much as possible, so the user of the services has less to worry about when calling it.
Use as explanation of intent.
Use as clarification of code.
Use as warning of consequences.
Robert C. Martin, Clean code: https://www.amazon.com/Clean-Code-Handbook-Software-Craftsma...
Vaughn Vernon, various: https://www.amazon.com/Code-Complete-Practical-Handbook-Cons... 2
Clean coder: https://www.amazon.com/Pragmatic-Programmer-Journeyman-Maste...
Hitchhiker's Guide to Python: https://www.amazon.com/Art-Readable-Code-Practical-Technique...
John Ousterhout, A Philosophy of Software Design: https://www.amazon.com/Philosophy-Software-Design-John-Ouste... This one looks particularly interesting, thanks AlexCoventry!
Kent Beck, Test Driven Development: https://www.amazon.com/Test-Driven-Development-Kent-Beck/dp/...
Dan Bader, Python Tricks: The Book: https://www.amazon.com/Software-Engineering-10th-Ian-Sommerv...
Svilen Dobrev, various: http://www.svilendobrev.com/rabota/
Looks like it was just released!