Victor Rentea
Workshop topic:
Software Architecture
Time & Date:
April 20th & 21st, online | 9am-5pm CEST

This workshop explores the key design decisions in the architecture of a backend system and studies their pros/cons. With a pragmatic attitude, we learn how to progressively introduce boundaries in our design to reduce the code complexity despite accumulating features. Along our journey we discover fundamental design principles, and we brainstorm the mainstream backend architecture styles: Layers, Hexagonal, Onion and Modulith. The concepts are put in practice by refactoring 2 sample Java applications while keeping the Java/framework specifics to a minimum.
After this workshop you will be able to:
- Develop a firm understanding of the core architectural principles.
- Learn to analyze tradeoffs of design decisions.
- Master the state-of-the-art backend architectural styles.
- Implement architectural changes incrementally, without large, risky rewrites.
This workshop is for you if:
- You are a developer (in any programming language) looking to grow into an architect.
- You are an architect / technical coach that wants an update on current trends in architectures.
- You are looking to debate design decisions in your codebase.
Agenda:
Fundamentals
- The 3 Laws of Architecture
- Architectural Decision Records (ADR)
- Architecture Fitness Functions
- Diagrams best practices, C4 Model, tools
Domain Modeling (from Domain-Driven Design)
- Domain-Driven Design (DDD): Ubiquitous Language/Bounded Context, Collaboration, Exploration, Distillation
- Deep Domain Model with Value Objects
- Rich Domain Model with behavior and domain constraints
- Axis of Code Complexity: Cyclomatic, Orchestration, and Data Semantics
- Exercise: refactoring to a Rich Domain Model
Agnostic Domain protecting core logic
- Adapter Pattern, Anti-Corruption Layer and Dependency Inversion
- Enforce design boundaries with ArchUnit tests and/or compiler
- Exercise: extract infrastructure from core logic
Layered Architecture
- Open vs Closed Layer
- Ways to Split Complexity: SRP(Horizontal or Vertical), or for Reuse (DRY)
- Separation by Layers of Abstraction (SLAb)
Hexagonal Architecture aka Ports-and-Adapters
- Dogmatic Version (*hexagonal arch talk in the prep)
- Rules of a Clean Architecture by Robert C. Martin (aka Uncle Bob)
- Lock-in to Libraries
- Common Simplifications- when to relax the rules?
- Hexagonal vs Layers- comparison
- Hexagonal Failures- when not to use it?
- (optional) Onion Architecture- brief comparison with Hexagonal
- Vertical-Slice Architecture ("Anti-Layers") by Jimmy Bogard
REST API Design
- Breaking changes & API Versioning
- Contract Tests
- Contract- vs Code-first development
- Performance: Batch APIs, aggregator service
- CQRS - 3 levels
- Automatic Mappers (like MapStruct)
- Task-Based APIs & UIs
- Error Handling
Modular Monolith Architecture
- From Technical to Functional Partitioning
- Module internal/external API
- Options for Cross-module Query
- Event-based Module Integration: sync-transacted, async, durable, external
- Product Customization: feature toggles, Plugin Mechanism / SPI
- 6 Module integration patterns
- From packages to build modules (eg. Maven/Gradle)
- Levels of data decoupling (optional)
- Exercises refactoring a Spring Modulith application
Towards Microservices
- Non-Functional Requirements (NFRs)
- Weaknesses of Modulith
- Why and How to extract a Module as a Microservice
- Architectural Quantums: options between Monolith and Microservices
Side Topics usually covered along the way:
- Coupling & Cohesion
- Split by Volatility
- Design Principles: SOLID, DRY, KISS, Beck's Rules of Simple Design
- Evolutionary Architecture: when to invest more in design?
- Dogmatic vs Pragmatic Architecture?
- Domain Model vs ORM Model - unify or segregate?
- DDD Aggregate Design - boundaries of consistency
* If you're interested in this program, please contact us at info@itkonekt.com to find out more about availability and prices.