Skip to main content

Software Architecture Patterns

General

Diagramming Software

Small vs Large Scale Architecture Patterns

Distributed systems

Messaging / event streaming / pub-sub

State machines

Domain-Driven Design

  • What Is Event Storming? | Lucidchart Blog
  • Really enjoying Scott Wlaschin’s approach to implementing DDD using a functional paradigm (instead of the traditional OOP one):
    • The software is implemented as a pipeline composed of smaller pipelines, built by composing small functions
    • I/O is kept separate from domain logic and ideally pushed to the start/end of each use case
    • The domain is modeled using the type system by avoiding primitive types and preferring types named using ubiquitous domain language that compose smaller types and eventually model the entire system in terms of inputs and outputs at every level
    • Encourages ensuring every function takes inputs and returns a result making explicit what it accomplished, even if that was just a decision (which can be represented by an enum expressed in domain-specific terms)
    • Beware any function that takes no inputs or returns no result! That makes the domain modeling less explicit.
    • Resources:

Microservices

  • Stop Creating Microservices | Prime Reacts • To avoid network latency and deployment complexity, you probably want modules in a monolith instead • The Primeagen 📺
  • Death By A Thousand MicroService | Prime Reacts • A monolith is almost always a simpler and more performant architecture than microservices, which sounds like a great way to break down a problem into smaller pieces but end up adding maintenance complexity and network/serialization lag • The Primeagen 📺

Hexagonal Architecture

Clean Architecture

Folder Structure

  • The BIGGEST Folder Structure MISTAKE on .NET • Regardless of your application architecture, organizing folders by feature rather than by technical concepts will always make your codebase more understandable to new teammates • Gui Ferreira 📺

Inbox