Brownfield Domain Driven Design

Post on 13-Aug-2015

606 views 7 download

Transcript of Brownfield Domain Driven Design

Brownfield Domain Driven

DesignBring your project to the next level

without breaking things (nor people)

About me

@nicolopigna- PHP developer- Team leader / Software engineer at Rocket Labs, Berlin

We proudly run Seller Center, the largest Rocket Internet Marketplace solution.

Popular clients: Zalando (Europe), Lazada (south Asia), Linio (south America), Global Fashion Group

Why “Brownfield”?

More challenging and fun than greenfield!Majority of cases.

Open knowledge harder to find.Examples start from the assumption of a greenfield.

“Greenfield is exciting at first, but taking a brownfield project and giving it new life, well, is just priceless!”

Me on Twitter

Why Domain Driven Design?

● Non-trivial domain model

● Linguistic boundaries applied to the code

● Design and code reflect the same concepts 1:1

● Iterative knowledge distillation

● Both tactical and strategic tools

No, let’s notCRUDish applicationsGeneric subdomains

Yes, we can● In your core domain● In heavy business-logic

parts of your application● In strategic supporting

domains

Where should I apply it?

i.e. where you make most of your money.

Can we outsource or buy it? Then it’s one of those.

Is it difficult? How do we change?

Team

● learn new concepts● mindshift is not immediate● eradicate CRUD design● design business first, then data

structures

Management

● handle the change● manage adaptation time● active part of design process

Organisation

● involve business experts● face potential change● introspect processes

Your brownfield

Monolithic

High-coupling

Single-data-store

We-tried-to-build-some-unit-tests-but-it’s-impossible-to-mock-everything-or-refactor-let’s-use-integration-tests-instead.

*all the bad things in this slide are written with Comic Sans and poor contrast on purpose.

HugeChange-here-break-there

BIG BALL OF “MUD”

BIG BALL OF “MUD”

Hey, at least it works...Don’t know exactly how, but it does!

Where to start from?

Ok, we need some Repositores, then a Domain/Model directory which will contain AggregateRoots, Entity, ValueObjects, etc.

Yes! Oh, don’t forget about Domain Services, the Application layer and a new event system which we’ll definitely need.

What about a new structure for controllers and UI? They’re definitely part of our Bounded Context! Let’s reuse our DB connection class, so we also need a Shared Kernel.

Instead...

Context mapping

● Define your core domain, supporting and generic subdomains

● Define the relations between them and with other external systems

● Define behavior at boundaries and grey areas

Event storming

➔ Describe your business through events, what/who caused them, what is the “subject” of your events.

➔ Invite the “right people”, brainstorm, discuss, reach a first representation of your business model. Just let it happen.

DON’T JUST SKIP IT!

Ubiquitous Language

The UL is what takes all things (and people) together.- It dramatically lowers communication and cognitive load, providing

a common ground, understandable by anyone.- It defines and explains what domain objects are, how they behave

and the relations between them.

How can you even start coding something that you haven’t defined in terms of concept and behavior!?

Ok. Finally...

Yeah! We’re finally writing some code now!

Markers and sticky notes were making me feel so uncomfortable...

The evil facilitator shouted at me when I said “cronjob” :’(

We were always talking about “Product”, but I think I will call this class “Article”. Buhahaha!

product.name is varchar(50) or varchar(255)?

Where should we start applying DDD from?

Are we confident with DDD, SOLID

and refactoring strategies?

Let’s start with our Core Domain

yes

Did someone at least read the Blue and Red

books?

no

yes

no

Let’s start with a Supporting Subdomain

Read them...

now again...

Keep your UI away

CONTROLLERS

FORMS

TEMPLATES

YOUR FAVORITEMVC FRAMEWORK

Services(Endpoint / Private)

Model

Repositories

Commands

Events

✗✓

CQRS? Yes, please!

Your database

Command

“Write” Model● Expresses your business

behavior● Changes the state of the

system● Doesn’t expose internal

state

Query

● Shapes information based on representation type

● Never changes the state of the system

● Exposes internal state

“Read” Model

Haiku of the code duplication

CQRS is applied,duplication comes in.Everything is quiet.

Change your state through events

DoSomethingCommand

ServiceUnit Of Work

load($aggregateRootId)

AggregateRoot

doSomething()

AggregateRootAggregateRoot● Something

Done

RepositoryAggregateRootcommit()

flushEvents()

Events persist($events)

EventBus

post($events)

Event sourcing? Read storage?

IT’S A TRAP!

Event sourcing? Read storage?

1 - Added architectural complexityEvent applicationEvent replayingSnapshots

Event sourcing? Read storage?

1 - Added architectural complexityEvent applicationEvent replayingSnapshots 2 - Infrastructure and costs

Dedicated data storage (forget MySQL!)Remote communication (via message

broker, REST interface, etc.)

Event sourcing? Read storage?

1 - Added architectural complexityEvent applicationEvent replayingSnapshots 2 - Infrastructure and costs

Dedicated data storage (forget MySQL!)Remote communication (via message

broker, REST interface, etc.)

3 - Eventual consistencyThink about consequencesImplement resilient behaviorAdvanced UI techniques

Oh! Think twice!

Protect your new code!

STRICT RULE: Code from the Big Ball of Mud must not leak into the new BCs nor vice-versa.

THEN HOW DO THEY INTERACT?

BY MAGIC?

MEET THE

ANTI-CORRUPTION LAYER

MEET THE

ANTI-CORRUPTION LAYER

YOU SHALL NOT PASS!!!

MEET THE

ANTI-CORRUPTION LAYER

YOU SHALL NOT PASS!!! At least, not before I can convert you to something meaningful for your destination context...

Anti-corruption layer

Legacy context

Database

ACL

Adapters

Converters

Identity Maps

Bounded Context

Anti-corruption layer

Legacy context

Database

ACL

Adapters

Converters

Identity Maps

I’m here to stay!!!

Bounded Context

Anti-corruption layer

Legacy context

Database

ACL

Bounded Context

Adapters

Converters

Identity Maps

place interfaces here

I’m here to stay!!!

Anti-corruption layer

Legacy context

Database

ACL

Adapters

Converters

Identity Maps

I can fly away, now!

Bounded Context

place interfaces here

What happens next?

My new shiny BC

Our soon-to-be-shrunk BBoM

Anti-corruption layer

What happens next?

My new shiny BC

Our shrinking BBoM

Anti-corruption layer

My second shiny BC

What happens next?

My new shiny BC

Our shrinking BBoM

Anti-corruption layer

My second shiny BC

What happens next?

My new shiny BC

Our shrinking BBoM

Anti-corruption layer

My second shiny BC

But of course it’s easier now!

From distributed Bounded Contexts to μServices

μS = lim Bc(nuc)nuc→ 1

Thank youfor listening!

Time for muddy questions!