Software Architect Handbook
UPDATE!: I will be updating this repository with a new structure that better supports Obsidian.
This README won’t be updated anymore and it will reference content from the /legacy
folder.
I’ll iteratively move new versions of such content (and new stuff!) to ./READMEv2.md which will eventually become the main README and can be opened with Obsidian for better navigation.
- Software Architect Handbook
- System design
- Design principles
- Design patterns
- Architectural Styles \& Patterns
- Data storage
- Software types
- Operating systems
- Refactoring \& code smells
- Programming paradigms
- Software Engineering Culture
- Testing
- General concepts
- Tooling - Language Agnostic
- Technology specifics
System design
For a complete System Design study, you should also be familiar with Databases related topics such as CAP Theorem. This section assumes prior knowledge about such topics, but you can also read about those in this very same repo.
- Introduction
- How to approach a design
- Performance Measures
- Response time
- Responsiveness
- Latency
- Throughput
- Load
- Load sensitivity
- Capacity
- Scalability
- Load Balancing
- Sustainability
- Scalability
- Caching
- RAID
- Consistency
- Availability
- Fail-over
- Replication
- Choosing a Database
- CDN: Content Delivery Network
- Stateless web tier
- Multi-data center
- Message Queue/Message Broker
- Logging, metrics, automation
- Scaling from zero to millions of users
- Back-of-the-envelope Estimation
- A Framework for System Design Interviews
- Hashing
System Design - Case Studies
Problems | Solutions |
---|---|
Instagram News Feed - Gaurav Sen | Solution |
Key-value store | Solution |
Unique ID generator in distributed systems | Solution |
URL shortener | Solution |
Web crawler | Solution |
Notification system | Solution |
News feed system | Solution |
Chat system | Solution |
Search autocomplete system | Solution |
Youtube | Solution |
Google Drive | Solution |
Design principles
- Common Architectural Principles
- OO Design Principles
- DRY
- GRASP
- Hollywood Principle
- SOLID
- KISS
- WET
- YAGNI
Design patterns
Base patterns
- Gateway
- Mapper
- Layer Supertype
- Separated Interface
- Registry
- Value Object
- Special Case
- Plugin
- Service Stub
- Record Set
System-level or architectural patterns
Gang of Four Patterns
Please check the this repository for a detailed explanation and examples of each of the following patterns.
Domain logic patterns
Data source & persistence patterns
Object relational patterns
Behavioral patterns
Structural patterns
- Identity Field
- Foreign Key Mapping
- Association Table Mapping
- Dependent Mapping
- Embedded Value / Aggregate Mapping
- Serializd LOB
- Single Table Inheritance
- Class Table Inheritance / Root-Leaf Mapping
- Concrete Table Inheritance
- Inheritance Mappers
Metadata mapping patterns
Web presentation patterns
- Application Model / Presentation Model
- Humble View / Passive View
- MVC: Model View Controller
- MVP: Model View Presenter
- MVVM: Model View View-Model
- Front Controller
- Page Controller
- Supervising Controller
- Template View
- Transform View
- Two Step View
Distribution patterns
Offline concurrency patterns
Session state patterns
Anti-Patterns
Architectural Styles & Patterns
Recommended book: https://en.wikipedia.org/wiki/Pattern-Oriented_Software_Architecture
Three-Layer System (Martin Fowler)
Service Oriented Architecture (SOA)
Ports & Adapters / Hexagonal
Clean Architecture
- MVC and Hexagonal Architectures as Precursors
- MVC Problems
- Tradeoffs
- What is Architecture
- Keeping options open
- Plugin Architecture - Model Controller Presenter (MCP)
- Request and Response Models
- Screaming Architecture
- Testable Architecture
- Humble Object Pattern
- Services and boundaries
- Test Boundaries
- The Fragile Tests Problem
- Code organization
- Target Hardware Bottleneck
- The Missing Advice
- Glossary
REST: Representational State Transfer
- Introduction
- History
- Architectural Properties
- Architectural Constraints
- Five key principles
- Semantics of HTTP APIs
Flux & Redux
Domain-Driven Design
Microservices
- Benefits and alternatives
- Coupling and Cohesion
- Own their data
- DDD - Mapping aggregates and bounded contexts
- Monolith
- Planning a Migration
- Splitting the Monolith
- Decomposing the Database
- Splitting Apart the Database
- Split the Database First
- Split the Code First
- Schema Separation
- Shared Static Data
- Dealing with Transactions
- Growing Pains
- Trade-Offs
- When to avoid
Data storage
- CAP/Brewer’s Theorem
- BASE
- Object-oriented databases
- Database Scaling
- Vertical Scaling (Scaling Up)
- Horizontal Scaling (Sharding)
- Data Replication
- Consistency Models
- Strong Consistency vs Weak Consistency
- Eventual Consistency
- Strong Eventual Consistency (SEC)
- Synchronization techniques
- Handling failures
- Failure detection
- All-to-all multicasting
- Gossip protocol
- Handling temporary failures
- Sloppy quorum
- Hinted handoff
- Handling performance failures
- Anti-entropy protocol
- Handling data center outage
- Failure detection
General concepts
Data Consistency
- Data consistency primer
- Strong consistency
- Eventual consistency
- Inconsistency resolution
Data partitioning
- Data partitionioning primer
- Horizontal partitioning (sharding)
- Vertical partitioning
- Fuctional partitioning
Types
Relational Databases
- ACID: Atomicity, Consistency, Isolation, Durability
- Isolation Levels
- Transactions
- Read Phenomena
- 2PC Protocol / XA Transactions
- Views
- Joins
- Stored Procedures
- Indexing
- ORM: Object-relational Mapping
- Object-relational impedance mismatch
Wide-column store
- Overview
- HBase
GraphQL
Software types
Although some techniques and patterns are relevant for all kinds of software, many are relevant for only one particular branch.
- Enterprise Applications
Operating systems
- Multithreading
- Parallelism & Concurrency
- Process & Thread
- Models of Computation
Linux
Refactoring & code smells
Programming paradigms
Structured programming
OOP: Object-oriented programming
- OOP Introduction
- Objects and Classes
- Class-based vs Prototype-based languages
- Foundational concepts
- 4 Pillars of OOP
- Abstraction
- Inheritance
- Encapsulation
- Polymorphism
- Abstract Class
- Mixin Class
- Traits
- Interface & Type
- 4 Pillars of OOP
- Techniques
- Advanced concepts
Functional programming
Software Engineering Culture
Laws & Theorems
- 80/20 Rule
- Beyoncé Rule: If you liked it, put a CI test
- Churn Rule: Teams should internalize deprecation
- Constantine’s law: Favor high cohesion
- Conway’s law: Systems reflect organization’s communication structure
- Hyrum’s Law: The Law of Implicit Dependencies
- Occam’s Razor: The simplest explanation
- Pareto principle: The 80/20 rule
Working Methodologies
Testing
E2E Testing
General concepts
About system-design and architecture
- What is Software Architecture?
- The Software Architect
- The First Derivative
- Evolutionary Design
- Development Overconfidence
- Is Quality Worth the Cost?
- Concurrency
- Distribution Strategies
- Layering
- Resilience vs Robustness
About software engineering
- Developer Struggle
- Mapping to Relational Databases
- Organizing Domain Logic
- Session State (stateful vs stateless sessions)
- Technical Debt
- Leaky Abstractions
Common jargon
- Abstract Syntax Tree
- CRUD
- First-class citizen
- Modularization
- Side Effect
- SPOF: Single Point of Failure
- Web API
Tooling - Language Agnostic
- Telepresence: tool that is aiming to make a hybrid local/remote developer workflow easier for Kubernetes users.
- Pact: customer-driven contracts.
Technology specifics
- Cybersecurity Handbook
- Networking
- Telecommunications
- Encryption
- etc.
- Golang Handbook
- Go In Practice
- Java Handbook
- JS Handbook
- React
- Redux
- Data Science