ddd reboot (english version)

Post on 07-Jan-2017

631 Views

Category:

Engineering

3 Downloads

Preview:

Click to see full reader

TRANSCRIPT

#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

top related