
You're not alone. At any given moment, somewhere in the world someone struggles with the same software design problems you have. You know you don't want to reinvent the wheel (or worse, a flat tire), so you look to Design Patterns--the lessons learned by those who've faced the same problems. With Design Patterns, you get to take advantage of the best practices and experience of others, so that you can spend your time on...something else. Something more challenging. Something more complex. Something more fun. You want to learn about the patterns that matter--why to use them, when to use them, how to use them (and when NOT to use them). But you don't just want to see how patterns look in a book, you want to know how they look "in the wild". In their native environment. In other words, in real world applications. You also want to learn how patterns are used in the Java API, and how to exploit Java's built-in pattern support in your own code. You want to learn the real OO design principles and why everything your boss told you about inheritance might be wrong (and what to do instead). You want to learn how those principles will help the next time you're up a creek without a design pattern. Most importantly, you want to learn the "secret language" of Design Patterns so that you can hold your own with your co-worker (and impress cocktail party guests) when he casually mentions his stunningly clever use of Command, Facade, Proxy, and Factory in between sips of a martini.
Even some principles aren't known. I always recommend the book Head First: Design Patterns. It's in Java, but the lessons can be applied in every language.
Unfortunately, we are in a 'post-knowledge' era... I don't know how we can keep things up at this pace.
- 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
Another book recommendation is Head First Design Patterns - the one I read used Java in the examples but I learned better with the style of that book than a textbook style. There are probably a lot of design patterns books out there including the original by the "Gang of Four".
The most important thing after reading about these patterns is learning when to use one and to do that you just need to go use them. Some caution though, I found myself putting patterns into use more frequently than was probably necessary simply because it was a new thing.
From my memory banks after close to 20 years:
SoyDecorator: CoffeeDecorator {
price: Cents { price + 90¢ } // Soy adds 90 cents to the price
}
Edit: My regret is lending it to someone and never getting it back. I believe I might get this bundle.So if you like reading and want a crash course on a bunch of frameworks, languages, etc, I'd buy the series. If you want to deep dive into something, look for the specialist author in that framework, language, etc.
That said, head first design patterns saved my bacon when I was studying for my first job out of college
I love this part of the journey for folks because it opens the door to a world of possibilities that has dramatically more structure and form. Thoughts and ideas become less "what if.." and more puzzling together the best interactions between certain design implementations.
At risk of rattling on endlessly in my excitement for you, TDD became a very interesting and enjoyable way (for me at least) to implement these patterns and gain a better understanding. I think you'll find Martin Fowler, TDD, and IoC/DI are peas in a pod.
(I realize you said Python and this was Java. I'll see if I can find something Python friendly. If you'd like to try your hand with Java....I highly highly recommend Spring Framework and more specifically Spring Boot. Spring is an IoC Container Framework where the Dependency Injection is done for you on the fly. So much to throw at someone but if you'd like to connect on it, I'd be more than happy to give you a running start.)