#DDDREBOOT
LET’S REBOOT DDD!THOMAS PIERRAIN - JEREMIE GRODZISKI @TPIERRAIN - @JGRODZISKI
#DDDREBOOT
LET’S REBOOT DDD!THOMAS PIERRAIN - JEREMIE GRODZISKI @TPIERRAIN - @JGRODZISKI
#DDDREBOOT
BEFORE WE BEGIN
#DDDREBOOT#DDDREBOOT
#DDDREBOOT
DDD AROUND YOU?OK, BUT 13 YEARS AFTER…
#DDDREBOOT
#DDDREBOOT
THERE MUST BE A REASON…
#DDDREBOOT
« TACTICAL PATTERNS », « BOUNDED CONTEXTS », « UBIQUITOUS LANGUAGE », ETC.
#DDDREBOOT
DOES IT NOT MEAN ANYTHING TO YOU?
#DDDREBOOT#DDDREBOOT
#DDDREBOOT
ACTUALLY DDD…
#DDDREBOOT
DOMAIN DRIVEN DESIGN, IS…
#DDDREBOOT
TO FOCUS ON BUSINESS VALUE
#DDDREBOOT
OUR FIRST WORK AS DEVELOPER?
UNDERSTAND THE DOMAIN THAT WE’LL HAVE TO CODE
#DDDREBOOT
A SET OF CONCEPTS THAT, THROUGH USE CASES, ALLOWS US TO SOLVE PROBLEMS
DOMAIN?
#DDDREBOOT
DOMAIN: DOUBLE ENTRY ACCOUNTING
SOLVED PROBLEMS: TRACKING, ROBUSTNESS
CONCEPTS: ACCOUNT, DEBIT, CREDIT, AMOUNT, ETC.
#DDDREBOOT
DOMAIN: IDE
SOLVED PROBLEMS: PRODUCTIVITY, INTEGRATION
CONCEPTS: PROJECTS, FILES, ANALYSIS, REFACTORING, CVS, DEBUGGER, ETC.
#DDDREBOOT
BUT DDD IS MOSTLY…
#DDDREBOOT #DDDREBOOT
#DDDREBOOT
#DDDREBOOT
AS DEVELOPERS, WE FACE …
#DDDREBOOT
3 LEVELS
#DDDREBOOT
IS / COMPANY
APPLICATION / TEAM
CODE / PAIR
#DDDREBOOT
IS / COMPANY
APPLICATION / TEAM
CODE / PAIR
#DDDREBOOT
IS / COMPANY
APPLICATION / TEAM
CODE / PAIR
#DDDREBOOT
LEVEL 1 IS / COMPANY
APPLICATION / TEAM
CODE / PAIR
#DDDREBOOT
QUESTION:
WHAT’S THE FOLLOWING CODE DOES?
#DDDREBOOT
#DDDREBOOT
SO?
#DDDREBOOT
#DDDREBOOT
DID YOU SEE SOME CODE SMELLS?
#DDDREBOOT
Good code / Bad code
#DDDREBOOT
#1 MAGIC NUMBERS
#DDDREBOOT
#1 MAGIC NUMBERS #2 DUPLICATIONS
#DDDREBOOT
#1 MAGIC NUMBERS #2 DUPLICATIONS #3 PRIMITIVE OBSESSION
#DDDREBOOT
#1 MAGIC NUMBERS #2 DUPLICATIONS #3 PRIMITIVE OBSESSION #4 MIXED CONCERNS (TECH-BIZ)
#DDDREBOOT
#1 MAGIC NUMBERS #2 DUPLICATIONS #3 PRIMITIVE OBSESSION #4 MIXED CONCERNS (TECH-BIZ) #5 FUZZY TERMINOLOGY
(
#DDDREBOOT
AND NOW CONCERNING THE DOMAIN…
#DDDREBOOT
LET’S FIND THE IMPLICITS !
#DDDREBOOT
FREE SHIPPING IF GREATER THAN 100? 100 WHAT?
#DDDREBOOT
FIXED SHIPMENT COST?
FREE SHIPPING IF GREATER THAN 100? 100 WHAT?
#DDDREBOOT
FIXED SHIPMENT COST?
FREE SHIPPING IF GREATER THAN 100? 100 WHAT?
WEIGHT IN G? VARIABLE COST FOR EACH SENT KG?
#DDDREBOOT
CURRENCY IN EUROS?
FIXED SHIPMENT COST?
WEIGHT IN G? VARIABLE COST FOR EACH SENT KG?
FREE SHIPPING IF GREATER THAN 100? 100 WHAT?
#DDDREBOOT
CURRENCY IN EUROS?
FIXED SHIPMENT COST?
WEIGHT IN G? VARIABLE COST FOR EACH SENT KG?
SHIPPING OPTION?
FREE SHIPPING IF GREATER THAN 100? 100 WHAT?
#DDDREBOOT
CURRENCY IN EUROS?
FIXED SHIPMENT COST?
WEIGHT IN G? VARIABLE COST FOR EACH SENT KG?
SHIPPING OPTION?
FREE SHIPPING IF GREATER THAN 100? 100 WHAT?
VARIABLE COST PER PRODUCT CATEGORY?
#DDDREBOOT
MAKE THE IMPLICIT, EXPLICIT
#DDDREBOOT
DDD VERSION#DDDREBOOT
#DDDREBOOT
#DDDREBOOT
#DDDREBOOT
#DDDREBOOT
#DDDREBOOT
#DDDREBOOT
VALUE TYPE
#DDDREBOOT
THE VALUE TYPE EXPRESS YOUR DOMAIN AND
SWALLOW YOUR COMPLEXITY
#DDDREBOOT
-VALUE TYPES- IT'S WHAT THEY ARE THAT IS IMPORTANT;
NOT WHO THEY ARE
#DDDREBOOT
-VALUE TYPES- Σ OF ATTRIBUTES MEANING
#DDDREBOOT
-VALUE TYPES-Example
#DDDREBOOT
-VALUE TYPES-A COLOR (RGB: 255-255-0)
A SPEED OF 50 KM/H A BANK NOTE OF 10 €
Examples
#DDDREBOOT
-VALUE TYPES- IMMUTABLES BY DEFINITION RICH WITH DOMAIN LOGIC EQUALITY ON ATTRIBUTES
COMPOSABLES (OPERATORS, FONCTIONS) AUTO-VALIDATING
Characteristics
#DDDREBOOT
-VALUE TYPES- “TRANSACTIONAL” CONSTRUCTOR OR OPERATION
CONSTRAINTS ENFORCED BY THE CONSTRUCTOR, NOT BY THE OPERATIONS
FAIL FAST NO SETTERS !
IMMUTABILITY, AUTO-VALIDATING
Implementation
#DDDREBOOT
-VALUE TYPES- Implementation
RICH WITH DOMAIN LOGIC
#DDDREBOOT
-VALUE TYPES- ON ALL THE ATTRIBUTES!
Implementation
STRONG UNICITY
hashCode
STRONG EQUALITY
equals
#DDDREBOOT
-VALUE TYPES- “SIDE-EFFECT FREE” FUNCTIONS
out of the tar pit
WE COMPOSE, AND PREFER RÉ-ASSIGNING
INSTEAD OF CHANGING THE STATE LIKE BEFORE :-(
#DDDREBOOT
ESSENTIAL COMPLEXITY ACCIDENTAL COMPLEXITY
#DDDREBOOT
« VALUE OBJECT »#DDDREBOOT
IN DDD, WE NAME THAT:
#DDDREBOOT
« VALUE OBJECT »#DDDREBOOT
IN DDD, WE NAME THAT:
OXYMORON
#DDDREBOOT
-VALUE TYPE- ELECTED BEST R.O.I. OF DDD LAND
#DDDREBOOT
EXPRESS THE DOMAIN CODEBASE PROGRESSIVE INTRODUCTION / EXEMPLARY
COMPLEXITY SWALLOWER SIMPLIFY REASONING
(IMMUTABLE, THREAD-SAFE, TESTABLE)
- VALUE TYPE - AN UNBEATABLE R.O.I.
#DDDREBOOT
PLANT THE SEED OF THE DOMAIN INTO THE CODE
THE VALUE TYPE
#DDDREBOOT
MAKE THE IMPLICIT, EXPLICIT
#DDDREBOOT
SHIPPING COST DECISION TABLE
#DDDREBOOT
SHIPPING COST DECISION TABLE
DATA LITERALS!
#DDDREBOOT
AND, AS WE TALK ABOUT IMPLICIT…
#DDDREBOOT
"I CAN'T LISTEN TO THAT MUCH WAGNER. I START GETTING THE URGE TO CONQUER
POLAND" (WOODY ALLEN)
#DDDREBOOT
“I CAN’T SEE THAT MUCH MANAGERS IN CODE.
I START GETTING TO…» (JÉRÉMIE)
#DDDREBOOT
SHOOT THE MANAGERS!
;-)
#DDDREBOOT
MAKE THE IMPLICIT, EXPLICIT
#DDDREBOOT
ANOTHER PROBLEM
#DDDREBOOT#DDDREBOOT
#DDDREBOOT
LOST IN TRANSLATION#DDDREBOOT
#DDDREBOOT
"IT'S DEVELOPER'S UNDERSTANDING, NOT YOUR KNOWLEDGE THAT BECOMES SOFTWARE!"
Alberto BRANDOLINI (facing non collaborative BAs)
#DDDREBOOT
IN SOME CASES…
#DDDREBOOT
#DDDREBOOT
SOLUTION?
#DDDREBOOT
SOLUTION?
1 LANGUAGE : YOUR USERS’S ONE!
#DDDREBOOT
« THE UBIQUITOUS LANGUAGE »#DDDREBOOT
IN DDD, IT’S NAMED:
#DDDREBOOT
YES BUT, HOW DO WE DO WHEN…
#DDDREBOOT
A « CUSTOMER » IT'S…
#DDDREBOOT
SO, HOW DO WE DO?
#DDDREBOOT
CONTEXT MATTERS
#DDDREBOOT
CONTEXTA GROUP OF PERSONS SHARING THE SAME
MEANING BEHIND WORDS.
#DDDREBOOT
Context
CRM / Sales
Customer => Socio-Economic group & Center of Interest
#DDDREBOOT
Context Accounting
Customer => Method of & Payment Period
Context
CRM / Sales
Customer => Socio-Economic group & Center of Interest
#DDDREBOOT
Context
Order-Shipment
Customer => addresses, availability
Context Accounting
Customer => Method of & Payment Period
Context
CRM / Sales
Customer => Socio-Economic group & Center of Interest
#DDDREBOOT
« BOUNDED CONTEXT »#DDDREBOOT
IN DDD, WE NAME THAT:
#DDDREBOOT
CRM / Sales Context
Model and Language of Sales
Orders / Shipment
Context
Model & language of Logistics
Accounting Context
Model and Language of Accounting
#DDDREBOOT
CRM / Sales Context
Model and Language of Sales
Orders / Shipment
Context
Model & language of Logistics
Accounting Context
Model and Language of Accounting
APP UI
WEB API
DATABASES APP UI
APP UI
APP UI DATABASES
WEB API
APP UI
APP UI
DATABASES
BATCH
USERS MANUAL
USERS MANUAL
#DDDREBOOT
#DDDREBOOT
CONTEXT PRODUCTS CATALOG
CONTEXT « SEARCH »
CONTEXT CLIENT & ORDERS
ADS CONTEXTCONTEXT “RECOMMANDATIONS"
CONTEXT « PROMOTIONS »
CONTEXT « PRODUCT HIGHLIGHTING »
#DDDREBOOT
LEVEL 2 IS / COMPANY
APPLICATION / TEAM
CODE / PAIR
#DDDREBOOT
PROBLEM
#DDDREBOOT#DDDREBOOT
#DDDREBOOT#DDDREBOOT
ONE THING CHANGES AND…
#DDDREBOOT
#DDDREBOOT
WHY SO MUCH DOMAIN TECHNICAL
STUFF IN OUR CODEBASE?
#DDDREBOOT#DDDREBOOT
#DDDREBOOT
SOLUTION? HEXAGONAL
ARCHITECTURE
#DDDREBOOT
THE WORLD DIVIDES IN 2 CATEGORIES…
#DDDREBOOT
#DDDREBOOT
OUTSIDE
INSIDE
#DDDREBOOT
DOMAIN
INFRA (HTTP, Db, MoM,…)
#DDDREBOOT
DOMAIN CODE
DO NOT ENTER BUSINESS CODE
ONLY
INFRA CODE (Ports & Adapters DMZ)
#DDDREBOOT
DOMAIN CODE
DO NOT ENTER BUSINESS CODE
ONLY
INFRA CODE >> playground <<
#DDDREBOOT
OUTSIDE
INSIDE
#DDDREBOOT
HEXAGONAL ≠ LAYERS
#DDDREBOOT
LAYERS ARCHITECTURE+—————————+ | PRESENTATION | +—————————+ | DOMAIN | +—————————+ | DATABASE | +—————————+
#DDDREBOOT
+———————————————+ | PRESENTATION | DATABASE | … | +———————————————+ | DOMAIN | +———————————————+
HEXAGONAL ARCHITECTURE
#DDDREBOOT
« Hexagonal Architecture ?!?
(…) That pattern is
fucking awesome! »
#DDDREBOOT
ANOTHER PROBLEM
#DDDREBOOT
LEGACY NAM’
#DDDREBOOT
#DDDREBOOT
LEGACY NAM’
#DDDREBOOT
#DDDREBOOT
LEGACY NAM’
(WAGNER’S VERSION)
#DDDREBOOT
THE RECURRING QUESTION: DO WE REBUILD
EVERYTHING FROM SCRATCH OR NOT?
#DDDREBOOT
Legacy Application
Context
#DDDREBOOT
Legacy Application
ContextWell-crafted DDD
Bubble Context
#DDDREBOOT
Well-crafted DDD
Bubble Context
ANTI-CORRUPTION LAYER
Legacy Application
Context
#DDDREBOOT
LEVEL 3 IS / COMPANY
APPLICATION / TEAM
CODE / PAIR
#DDDREBOOT
THE PROBLEM
#DDDREBOOT#DDDREBOOT
#DDDREBOOT#DDDREBOOT
#DDDREBOOT#DDDREBOOT
#DDDREBOOT
EVEN FOR
#DDDREBOOT
RELATIONS BASED ON POWER
#DDDREBOOT
MAKE THE IMPLICIT, EXPLICIT
#DDDREBOOT#DDDREBOOT
CONTEXT MAP EXPLICITS THE RELATIONS OF “POWER”
BETWEEN TEAMS
#DDDREBOOT
UPSTREAM / DOWNSTREAM
« IF YOU ARE UPSTREAM AND YOU POLLUTE THE RIVER… … PEOPLE DOWNSTREAM
WILL BE IMPACTED. NOT THE INVERSE. »
METAPHOR OF THE RIVER FLOW
#DDDREBOOT
« Search »
Context
Upstream
downstream
Products Catalog
Context
CONTEXT MAP
#DDDREBOOT
« Search »
Context
U
d
Products Catalog
Context
CONTEXT MAP
ANTI-CORRUPTIO
N LAYER
#DDDREBOOT
UPSTREAM / DOWNSTREAM CUSTOMER - SUPPLIER
CONFORMIST
ANTI-CORRUPTION LAYER (ACL) SERVICE HOST
SHARED KERNEL …
SOME VOCABULARIES AND PATTERNS
#DDDREBOOT
« CONTEXT MAP & STRATEGIC DESIGN »
#DDDREBOOT
IN DDD, WE NAME THAT:
#DDDREBOOT
SO…
#DDDREBOOT
BEFORE LEAVING
#DDDREBOOT
DOMAIN DRIVEN DESIGN, IS…
#DDDREBOOT
A LOT MORE ACCESSIBLE & USEFUL THAN IT MIGHT SEEMS
#DDDREBOOT
STARTING MONDAY
#DDDREBOOT
Ubiquitous Language
Value types
Entities
Aggregates
Repositories
Factories
Services
Domain Events
Model Driven Design
Core Domain / Generic Subdomains
Hexagonal Architecture*
CQRS*
Event Sourcing*
Bubble Context
Bounded Contexts
Context Maps
Anti-corruption Layer
Event storming
Customer / Supplier
Distillation
Shared Kernel
Conformist
…
CODE LEVEL
APP LEVEL
ENTREPRISE LEVEL
DDD BUILDING BLOCKS
* : not DDD but friendly
#DDDREBOOT
ON THE SHOULDERS OF GIANTS
#DDDREBOOT#DDDREBOOT
THANK YOU ERIC !
#DDDREBOOT
BUT SOMETIMES…
#DDDREBOOT#DDDREBOOT
LET’S REBOOT DDD!
#DDDREBOOT#DDDREBOOT
LET’S REBOOT DDD!AN OPEN COMMUNITY OF PRACTITIONERS
#DDDREBOOT#DDDREBOOT
LET’S REBOOT DDD!AN OPEN COMMUNITY OF PRACTITIONERS
1. POPULARISING DDD BY BEING MORE ACCESSIBLE JARGON
#DDDREBOOT#DDDREBOOT
LET’S REBOOT DDD!AN OPEN COMMUNITY OF PRACTITIONERS
1. POPULARISING DDD BY BEING MORE ACCESSIBLE JARGON
2. CONTINUE TO ENRICH THE DDD TOOLBOX
#DDDREBOOT#DDDREBOOT
LET’S REBOOT DDD!1. POPULARISING DDD BY BEING MORE ACCESSIBLE JARGON
2. CONTINUE TO ENRICH THE DDD TOOLBOX
AN OPEN COMMUNITY OF PRACTITIONERS
#DDDREBOOT#DDDREBOOT
LET’S REBOOT DDD!
@DDDreboot +
ALL TOGETHER
LET’S MAKE DDD MAINSTREAM
#DDDREBOOT#DDDREBOOT
LET’S REBOOT DDD!1. POPULARISING DDD BY BEING MORE ACCESSIBLE JARGON
2. CONTINUE TO ENRICH THE DDD TOOLBOX
@DDDreboot +
AN OPEN COMMUNITY OF PRACTITIONERS