# Awesome Software Architecture[](https://awesome.re) [Software architecture](https://en.wikipedia.org/wiki/Software_architecture) aims to describe the high level structures of software as well as the discipline of creating them. As this topic is pretty broad, it might contain some resources that are also present in more niche lists. If you like this list, consider showing your support by following @0x12b on Twitter.
Contents
- Principles
- Design Patterns
- Scalability and Resilience
- Methodology
- Documentation
- Workshop formats
- Modeling
- Tools
- Frameworks
- Agile
- Lean software development
- Extreme programming
- DevOps
- Bonus
Principles
- Flexibility - Able to adapt to changes in both environment and usability requirements without encompassing structural changes.
- SOLID - Lend to developing software with considerations for maintaining and extending as the project grows
Design Patterns
- Ports and adapters pattern - Decouple the application core logic from the services it uses.
- Observer pattern - One-to-many state change notification.
- Design Patterns: Elements of Reusable Object-Oriented Software, by Gamma et al - The one that started it all :orange_book:.
- Software Design Patterns: A Guide - Introduction to common software design patterns.
- Software Design Patterns and Principes (quick overview) - Reasons about common design patterns as well as their upsides and downsides 🎥.
- CQRS - Segregate operations that read data from operations that update data by using separate interfaces.
- Event Sourcing - Instead of storing just the current state of the data in a domain, use an append-only store to record the full series of actions taken on that data.
- Feature Toggles - Feature Toggles (often also refered to as Feature Flags) are a powerful technique, allowing teams to modify system behavior without changing code.
- Behavior Driven Development (BDD) and Functional Testing - BDD uses human-readable descriptions of software user requirements as the basis for software tests.
- N-tier architecture style - Layers are a way to separate responsibilities and manage dependencies.
Scalability and Resilience
- Circuit Breaker - Protecting failing resources to prevent cascading failures.
- Bulkhead - Partition resources to isolate failures.
- Leader Election - Coordinate distributed workloads by electing a leader.
Methodology
- No silver bullet, by Brooks - Making a case for growing software in small increments :orange_book:.
- Clean Architecture, by Martin - Key principles and concepts for building sustainable and maintainable software :orange_book:.
- Technical Debt, by Fowler - Cost and impact of accumulating technical debt.
- The Magic Tricks of Testing, by Metz - Minimalistic ideals as a practical and pragmatic approach to software testing 🎥.
- TDD, Where did it all go wrong?, by Cooper - Suggestion on TDD practices and boundaries to reduce coupling 🎥.
Documentation
- arc42 - Template for documentation and communication of software and system architectures.
- Architectural Decision Records - Version and document architectural decisions the same way you do with code.