149
#DDDREBOOT LET’S REBOOT DDD! THOMAS PIERRAIN - JEREMIE GRODZISKI @TPIERRAIN - @JGRODZISKI

Ddd reboot (english version)

Embed Size (px)

Citation preview

Page 1: Ddd reboot (english version)

#DDDREBOOT

LET’S REBOOT DDD!THOMAS PIERRAIN - JEREMIE GRODZISKI @TPIERRAIN - @JGRODZISKI

Page 2: Ddd reboot (english version)

#DDDREBOOT

LET’S REBOOT DDD!THOMAS PIERRAIN - JEREMIE GRODZISKI @TPIERRAIN - @JGRODZISKI

Page 3: Ddd reboot (english version)

#DDDREBOOT

BEFORE WE BEGIN

Page 4: Ddd reboot (english version)

#DDDREBOOT#DDDREBOOT

Page 5: Ddd reboot (english version)

#DDDREBOOT

DDD AROUND YOU?OK, BUT 13 YEARS AFTER…

#DDDREBOOT

Page 6: Ddd reboot (english version)

#DDDREBOOT

THERE MUST BE A REASON…

Page 7: Ddd reboot (english version)

#DDDREBOOT

« TACTICAL PATTERNS », « BOUNDED CONTEXTS », « UBIQUITOUS LANGUAGE », ETC.

#DDDREBOOT

DOES IT NOT MEAN ANYTHING TO YOU?

Page 8: Ddd reboot (english version)

#DDDREBOOT#DDDREBOOT

Page 9: Ddd reboot (english version)

#DDDREBOOT

ACTUALLY DDD…

Page 10: Ddd reboot (english version)

#DDDREBOOT

DOMAIN DRIVEN DESIGN, IS…

Page 11: Ddd reboot (english version)

#DDDREBOOT

TO FOCUS ON BUSINESS VALUE

Page 12: Ddd reboot (english version)

#DDDREBOOT

OUR FIRST WORK AS DEVELOPER?

UNDERSTAND THE DOMAIN THAT WE’LL HAVE TO CODE

Page 13: Ddd reboot (english version)

#DDDREBOOT

A SET OF CONCEPTS THAT, THROUGH USE CASES, ALLOWS US TO SOLVE PROBLEMS

DOMAIN?

Page 14: Ddd reboot (english version)

#DDDREBOOT

DOMAIN: DOUBLE ENTRY ACCOUNTING

SOLVED PROBLEMS: TRACKING, ROBUSTNESS

CONCEPTS: ACCOUNT, DEBIT, CREDIT, AMOUNT, ETC.

Page 15: Ddd reboot (english version)

#DDDREBOOT

DOMAIN: IDE

SOLVED PROBLEMS: PRODUCTIVITY, INTEGRATION

CONCEPTS: PROJECTS, FILES, ANALYSIS, REFACTORING, CVS, DEBUGGER, ETC.

Page 16: Ddd reboot (english version)

#DDDREBOOT

BUT DDD IS MOSTLY…

Page 17: Ddd reboot (english version)

#DDDREBOOT #DDDREBOOT

Page 18: Ddd reboot (english version)

#DDDREBOOT

Page 19: Ddd reboot (english version)

#DDDREBOOT

AS DEVELOPERS, WE FACE …

Page 20: Ddd reboot (english version)

#DDDREBOOT

3 LEVELS

Page 21: Ddd reboot (english version)

#DDDREBOOT

IS / COMPANY

APPLICATION / TEAM

CODE / PAIR

Page 22: Ddd reboot (english version)

#DDDREBOOT

IS / COMPANY

APPLICATION / TEAM

CODE / PAIR

Page 23: Ddd reboot (english version)

#DDDREBOOT

IS / COMPANY

APPLICATION / TEAM

CODE / PAIR

Page 24: Ddd reboot (english version)

#DDDREBOOT

LEVEL 1 IS / COMPANY

APPLICATION / TEAM

CODE / PAIR

Page 25: Ddd reboot (english version)

#DDDREBOOT

QUESTION:

WHAT’S THE FOLLOWING CODE DOES?

Page 26: Ddd reboot (english version)

#DDDREBOOT

Page 27: Ddd reboot (english version)

#DDDREBOOT

SO?

#DDDREBOOT

Page 28: Ddd reboot (english version)

#DDDREBOOT

DID YOU SEE SOME CODE SMELLS?

Page 29: Ddd reboot (english version)

#DDDREBOOT

Good code / Bad code

Page 30: Ddd reboot (english version)

#DDDREBOOT

#1 MAGIC NUMBERS

Page 31: Ddd reboot (english version)

#DDDREBOOT

#1 MAGIC NUMBERS #2 DUPLICATIONS

Page 32: Ddd reboot (english version)

#DDDREBOOT

#1 MAGIC NUMBERS #2 DUPLICATIONS #3 PRIMITIVE OBSESSION

Page 33: Ddd reboot (english version)

#DDDREBOOT

#1 MAGIC NUMBERS #2 DUPLICATIONS #3 PRIMITIVE OBSESSION #4 MIXED CONCERNS (TECH-BIZ)

Page 34: Ddd reboot (english version)

#DDDREBOOT

#1 MAGIC NUMBERS #2 DUPLICATIONS #3 PRIMITIVE OBSESSION #4 MIXED CONCERNS (TECH-BIZ) #5 FUZZY TERMINOLOGY

(

Page 35: Ddd reboot (english version)

#DDDREBOOT

AND NOW CONCERNING THE DOMAIN…

Page 36: Ddd reboot (english version)

#DDDREBOOT

LET’S FIND THE IMPLICITS !

Page 37: Ddd reboot (english version)

#DDDREBOOT

FREE SHIPPING IF GREATER THAN 100? 100 WHAT?

Page 38: Ddd reboot (english version)

#DDDREBOOT

FIXED SHIPMENT COST?

FREE SHIPPING IF GREATER THAN 100? 100 WHAT?

Page 39: Ddd reboot (english version)

#DDDREBOOT

FIXED SHIPMENT COST?

FREE SHIPPING IF GREATER THAN 100? 100 WHAT?

WEIGHT IN G? VARIABLE COST FOR EACH SENT KG?

Page 40: Ddd reboot (english version)

#DDDREBOOT

CURRENCY IN EUROS?

FIXED SHIPMENT COST?

WEIGHT IN G? VARIABLE COST FOR EACH SENT KG?

FREE SHIPPING IF GREATER THAN 100? 100 WHAT?

Page 41: Ddd reboot (english version)

#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?

Page 42: Ddd reboot (english version)

#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?

Page 43: Ddd reboot (english version)

#DDDREBOOT

MAKE THE IMPLICIT, EXPLICIT

Page 44: Ddd reboot (english version)

#DDDREBOOT

DDD VERSION#DDDREBOOT

Page 45: Ddd reboot (english version)

#DDDREBOOT

Page 46: Ddd reboot (english version)

#DDDREBOOT

Page 47: Ddd reboot (english version)

#DDDREBOOT

Page 48: Ddd reboot (english version)

#DDDREBOOT

Page 49: Ddd reboot (english version)

#DDDREBOOT

Page 50: Ddd reboot (english version)

#DDDREBOOT

VALUE TYPE

Page 51: Ddd reboot (english version)

#DDDREBOOT

THE VALUE TYPE EXPRESS YOUR DOMAIN AND

SWALLOW YOUR COMPLEXITY

Page 52: Ddd reboot (english version)

#DDDREBOOT

-VALUE TYPES- IT'S WHAT THEY ARE THAT IS IMPORTANT;

NOT WHO THEY ARE

Page 53: Ddd reboot (english version)

#DDDREBOOT

-VALUE TYPES- Σ OF ATTRIBUTES MEANING

Page 54: Ddd reboot (english version)

#DDDREBOOT

-VALUE TYPES-Example

Page 55: Ddd reboot (english version)

#DDDREBOOT

-VALUE TYPES-A COLOR (RGB: 255-255-0)

A SPEED OF 50 KM/H A BANK NOTE OF 10 €

Examples

Page 56: Ddd reboot (english version)

#DDDREBOOT

-VALUE TYPES- IMMUTABLES BY DEFINITION RICH WITH DOMAIN LOGIC EQUALITY ON ATTRIBUTES

COMPOSABLES (OPERATORS, FONCTIONS) AUTO-VALIDATING

Characteristics

Page 57: Ddd reboot (english version)

#DDDREBOOT

-VALUE TYPES- “TRANSACTIONAL” CONSTRUCTOR OR OPERATION

CONSTRAINTS ENFORCED BY THE CONSTRUCTOR, NOT BY THE OPERATIONS

FAIL FAST NO SETTERS !

IMMUTABILITY, AUTO-VALIDATING

Implementation

Page 58: Ddd reboot (english version)

#DDDREBOOT

-VALUE TYPES- Implementation

RICH WITH DOMAIN LOGIC

Page 59: Ddd reboot (english version)

#DDDREBOOT

-VALUE TYPES- ON ALL THE ATTRIBUTES!

Implementation

STRONG UNICITY

hashCode

STRONG EQUALITY

equals

Page 60: Ddd reboot (english version)

#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 :-(

Page 61: Ddd reboot (english version)

#DDDREBOOT

ESSENTIAL COMPLEXITY ACCIDENTAL COMPLEXITY

Page 62: Ddd reboot (english version)

#DDDREBOOT

« VALUE OBJECT »#DDDREBOOT

IN DDD, WE NAME THAT:

Page 63: Ddd reboot (english version)

#DDDREBOOT

« VALUE OBJECT »#DDDREBOOT

IN DDD, WE NAME THAT:

OXYMORON

Page 64: Ddd reboot (english version)

#DDDREBOOT

-VALUE TYPE- ELECTED BEST R.O.I. OF DDD LAND

Page 65: Ddd reboot (english version)

#DDDREBOOT

EXPRESS THE DOMAIN CODEBASE PROGRESSIVE INTRODUCTION / EXEMPLARY

COMPLEXITY SWALLOWER SIMPLIFY REASONING

(IMMUTABLE, THREAD-SAFE, TESTABLE)

- VALUE TYPE - AN UNBEATABLE R.O.I.

Page 66: Ddd reboot (english version)

#DDDREBOOT

PLANT THE SEED OF THE DOMAIN INTO THE CODE

THE VALUE TYPE

Page 67: Ddd reboot (english version)

#DDDREBOOT

MAKE THE IMPLICIT, EXPLICIT

Page 68: Ddd reboot (english version)

#DDDREBOOT

SHIPPING COST DECISION TABLE

Page 69: Ddd reboot (english version)

#DDDREBOOT

SHIPPING COST DECISION TABLE

DATA LITERALS!

Page 70: Ddd reboot (english version)

#DDDREBOOT

AND, AS WE TALK ABOUT IMPLICIT…

Page 71: Ddd reboot (english version)

#DDDREBOOT

"I CAN'T LISTEN TO THAT MUCH WAGNER. I START GETTING THE URGE TO CONQUER

POLAND" (WOODY ALLEN)

Page 72: Ddd reboot (english version)

#DDDREBOOT

“I CAN’T SEE THAT MUCH MANAGERS IN CODE.

I START GETTING TO…» (JÉRÉMIE)

Page 73: Ddd reboot (english version)

#DDDREBOOT

SHOOT THE MANAGERS!

;-)

Page 74: Ddd reboot (english version)

#DDDREBOOT

MAKE THE IMPLICIT, EXPLICIT

Page 75: Ddd reboot (english version)

#DDDREBOOT

ANOTHER PROBLEM

Page 76: Ddd reboot (english version)

#DDDREBOOT#DDDREBOOT

Page 77: Ddd reboot (english version)

#DDDREBOOT

LOST IN TRANSLATION#DDDREBOOT

Page 78: Ddd reboot (english version)

#DDDREBOOT

"IT'S DEVELOPER'S UNDERSTANDING, NOT YOUR KNOWLEDGE THAT BECOMES SOFTWARE!"

Alberto BRANDOLINI (facing non collaborative BAs)

Page 79: Ddd reboot (english version)

#DDDREBOOT

IN SOME CASES…

#DDDREBOOT

Page 80: Ddd reboot (english version)

#DDDREBOOT

SOLUTION?

Page 81: Ddd reboot (english version)

#DDDREBOOT

SOLUTION?

1 LANGUAGE : YOUR USERS’S ONE!

Page 82: Ddd reboot (english version)

#DDDREBOOT

« THE UBIQUITOUS LANGUAGE »#DDDREBOOT

IN DDD, IT’S NAMED:

Page 83: Ddd reboot (english version)

#DDDREBOOT

YES BUT, HOW DO WE DO WHEN…

Page 84: Ddd reboot (english version)

#DDDREBOOT

A « CUSTOMER » IT'S…

Page 85: Ddd reboot (english version)

#DDDREBOOT

SO, HOW DO WE DO?

Page 86: Ddd reboot (english version)

#DDDREBOOT

CONTEXT MATTERS

Page 87: Ddd reboot (english version)

#DDDREBOOT

CONTEXTA GROUP OF PERSONS SHARING THE SAME

MEANING BEHIND WORDS.

Page 88: Ddd reboot (english version)

#DDDREBOOT

Context

CRM / Sales

Customer => Socio-Economic group & Center of Interest

Page 89: Ddd reboot (english version)

#DDDREBOOT

Context Accounting

Customer  => Method of & Payment Period

Context

CRM / Sales

Customer => Socio-Economic group & Center of Interest

Page 90: Ddd reboot (english version)

#DDDREBOOT

Context

Order-Shipment

Customer  => addresses, availability

Context Accounting

Customer  => Method of & Payment Period

Context

CRM / Sales

Customer => Socio-Economic group & Center of Interest

Page 91: Ddd reboot (english version)

#DDDREBOOT

« BOUNDED CONTEXT »#DDDREBOOT

IN DDD, WE NAME THAT:

Page 92: Ddd reboot (english version)

#DDDREBOOT

CRM / Sales Context

Model and Language of Sales

Orders / Shipment

Context

Model & language of Logistics

Accounting Context

Model and Language of Accounting

Page 93: Ddd reboot (english version)

#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

Page 94: Ddd reboot (english version)

#DDDREBOOT

Page 95: Ddd reboot (english version)

#DDDREBOOT

CONTEXT PRODUCTS CATALOG

CONTEXT « SEARCH »

CONTEXT CLIENT & ORDERS

ADS CONTEXTCONTEXT “RECOMMANDATIONS"

CONTEXT « PROMOTIONS »

CONTEXT « PRODUCT HIGHLIGHTING »

Page 96: Ddd reboot (english version)

#DDDREBOOT

LEVEL 2 IS / COMPANY

APPLICATION / TEAM

CODE / PAIR

Page 97: Ddd reboot (english version)

#DDDREBOOT

PROBLEM

Page 98: Ddd reboot (english version)

#DDDREBOOT#DDDREBOOT

Page 99: Ddd reboot (english version)

#DDDREBOOT#DDDREBOOT

ONE THING CHANGES AND…

#DDDREBOOT

Page 100: Ddd reboot (english version)

#DDDREBOOT

WHY SO MUCH DOMAIN TECHNICAL

STUFF IN OUR CODEBASE?

Page 101: Ddd reboot (english version)

#DDDREBOOT#DDDREBOOT

Page 102: Ddd reboot (english version)

#DDDREBOOT

SOLUTION? HEXAGONAL

ARCHITECTURE

Page 103: Ddd reboot (english version)

#DDDREBOOT

THE WORLD DIVIDES IN 2 CATEGORIES…

#DDDREBOOT

Page 104: Ddd reboot (english version)

#DDDREBOOT

OUTSIDE

INSIDE

Page 105: Ddd reboot (english version)

#DDDREBOOT

DOMAIN

INFRA (HTTP, Db, MoM,…)

Page 106: Ddd reboot (english version)

#DDDREBOOT

DOMAIN CODE

DO NOT ENTER BUSINESS CODE

ONLY

INFRA CODE (Ports & Adapters DMZ)

Page 107: Ddd reboot (english version)

#DDDREBOOT

DOMAIN CODE

DO NOT ENTER BUSINESS CODE

ONLY

INFRA CODE >> playground <<

Page 108: Ddd reboot (english version)

#DDDREBOOT

OUTSIDE

INSIDE

Page 109: Ddd reboot (english version)

#DDDREBOOT

HEXAGONAL ≠ LAYERS

Page 110: Ddd reboot (english version)

#DDDREBOOT

LAYERS ARCHITECTURE+—————————+ | PRESENTATION | +—————————+ | DOMAIN | +—————————+ | DATABASE | +—————————+

Page 111: Ddd reboot (english version)

#DDDREBOOT

+———————————————+ | PRESENTATION | DATABASE | … | +———————————————+ | DOMAIN | +———————————————+

HEXAGONAL ARCHITECTURE

Page 112: Ddd reboot (english version)

#DDDREBOOT

« Hexagonal Architecture ?!?

(…) That pattern is

fucking awesome! »

Page 113: Ddd reboot (english version)

#DDDREBOOT

ANOTHER PROBLEM

Page 114: Ddd reboot (english version)

#DDDREBOOT

LEGACY NAM’

#DDDREBOOT

Page 115: Ddd reboot (english version)

#DDDREBOOT

LEGACY NAM’

#DDDREBOOT

Page 116: Ddd reboot (english version)

#DDDREBOOT

LEGACY NAM’

(WAGNER’S VERSION)

Page 117: Ddd reboot (english version)

#DDDREBOOT

THE RECURRING QUESTION: DO WE REBUILD

EVERYTHING FROM SCRATCH OR NOT?

Page 118: Ddd reboot (english version)

#DDDREBOOT

Legacy Application

Context

Page 119: Ddd reboot (english version)

#DDDREBOOT

Legacy Application

ContextWell-crafted DDD

Bubble Context

Page 120: Ddd reboot (english version)

#DDDREBOOT

Well-crafted DDD

Bubble Context

ANTI-CORRUPTION LAYER

Legacy Application

Context

Page 121: Ddd reboot (english version)

#DDDREBOOT

LEVEL 3 IS / COMPANY

APPLICATION / TEAM

CODE / PAIR

Page 122: Ddd reboot (english version)

#DDDREBOOT

THE PROBLEM

Page 123: Ddd reboot (english version)

#DDDREBOOT#DDDREBOOT

Page 124: Ddd reboot (english version)

#DDDREBOOT#DDDREBOOT

Page 125: Ddd reboot (english version)

#DDDREBOOT#DDDREBOOT

Page 126: Ddd reboot (english version)

#DDDREBOOT

EVEN FOR

#DDDREBOOT

RELATIONS BASED ON POWER

Page 127: Ddd reboot (english version)

#DDDREBOOT

MAKE THE IMPLICIT, EXPLICIT

Page 128: Ddd reboot (english version)

#DDDREBOOT#DDDREBOOT

CONTEXT MAP EXPLICITS THE RELATIONS OF “POWER”

BETWEEN TEAMS

Page 129: Ddd reboot (english version)

#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

Page 130: Ddd reboot (english version)

#DDDREBOOT

« Search »

Context

Upstream

downstream

Products Catalog

Context

CONTEXT MAP

Page 131: Ddd reboot (english version)

#DDDREBOOT

« Search »

Context

U

d

Products Catalog

Context

CONTEXT MAP

ANTI-CORRUPTIO

N LAYER

Page 132: Ddd reboot (english version)

#DDDREBOOT

UPSTREAM / DOWNSTREAM CUSTOMER - SUPPLIER

CONFORMIST

ANTI-CORRUPTION LAYER (ACL) SERVICE HOST

SHARED KERNEL …

SOME VOCABULARIES AND PATTERNS

Page 133: Ddd reboot (english version)

#DDDREBOOT

« CONTEXT MAP & STRATEGIC DESIGN »

#DDDREBOOT

IN DDD, WE NAME THAT:

Page 134: Ddd reboot (english version)

#DDDREBOOT

SO…

Page 135: Ddd reboot (english version)

#DDDREBOOT

BEFORE LEAVING

Page 136: Ddd reboot (english version)

#DDDREBOOT

DOMAIN DRIVEN DESIGN, IS…

Page 137: Ddd reboot (english version)

#DDDREBOOT

A LOT MORE ACCESSIBLE & USEFUL THAN IT MIGHT SEEMS

Page 138: Ddd reboot (english version)

#DDDREBOOT

STARTING MONDAY

Page 139: Ddd reboot (english version)

#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

Page 140: Ddd reboot (english version)

#DDDREBOOT

ON THE SHOULDERS OF GIANTS

Page 141: Ddd reboot (english version)

#DDDREBOOT#DDDREBOOT

THANK YOU ERIC !

Page 142: Ddd reboot (english version)

#DDDREBOOT

BUT SOMETIMES…

Page 143: Ddd reboot (english version)

#DDDREBOOT#DDDREBOOT

LET’S REBOOT DDD!

Page 144: Ddd reboot (english version)

#DDDREBOOT#DDDREBOOT

LET’S REBOOT DDD!AN OPEN COMMUNITY OF PRACTITIONERS

Page 145: Ddd reboot (english version)

#DDDREBOOT#DDDREBOOT

LET’S REBOOT DDD!AN OPEN COMMUNITY OF PRACTITIONERS

1. POPULARISING DDD BY BEING MORE ACCESSIBLE JARGON

Page 146: Ddd reboot (english version)

#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

Page 147: Ddd reboot (english version)

#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

Page 148: Ddd reboot (english version)

#DDDREBOOT#DDDREBOOT

LET’S REBOOT DDD!

@DDDreboot +

ALL TOGETHER

LET’S MAKE DDD MAINSTREAM

Page 149: Ddd reboot (english version)

#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