I second the comment (https://news.ycombinator.com/item?id=48327571) recommending How to Design Programs (HTDP) and Structure and Interpretation of Computer Programs (SICP). The former has an edX course (https://www.edx.org/learn/coding/university-of-british-colum... and https://www.edx.org/learn/coding/university-of-british-colum...) and the latter has online lectures (https://www.youtube.com/watch?v=-J_xL4IGhJA&list=PLE18841CAB...)
Head First Architecture (https://www.amazon.com/Head-First-Software-Architecture-Arch...) is good.
Reading about systems thinking would be useful.
Learning programming languages that have been well designed is helpful. I suggest Programming Erlang: Software for a Concurrent World and Elixir in Action.
- Just Enough Software Architecture
- Domain Driven Design - Tackling Complexity in the Heart of Software (Eric Evans) I recommend this one more than Vaughn Vernon's DDD.
- Clean Architecture (Robert Martin)
- Fundamentals of Software Architecture: an Engineering Approach
- Design Patterns (Gamma et al)
- Site Reliability Engineering: How Google Runs Production Systems
- Refactoring: Improving the Design of Existing Code (2nd Edition) (Addison-Wesley Signature Series (Fowler))
- Refactoring to Patterns
- Patterns of Enterprise Application Architecture
-Head First Design Patterns Building Extensible and Maintainable Object Oriented Software and I
- https://www.youtube.com/watch?v=odxOPxYJdjg
- "Architecture Modernization: Socio-technical alignment of software, strategy, and structure"
- Software Architecture in Practice
- Documenting Software Architectures: Views and Beyond
- Head first: Software Architecture