98
How to (finally) start doing DDD by using BDD

4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

  • Upload
    proidea

  • View
    81

  • Download
    2

Embed Size (px)

Citation preview

Page 1: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

How to (finally) start doing

DDD by using BDD

Page 2: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

Kacper Gunia @cakper

So!ware Engineer @SensioLabsUK / @Inviqa

PHPers Silesia @PHPersPL

Page 3: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

What is BDD?

Page 4: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

Bug-drivenDevelopment ;)

Page 5: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

Behaviour-driven development is about implementing an application

by describing its behaviour from the perspective of its

stakeholders.-- Dan North

Page 6: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

BDD is about establishing a shared understanding of “done”

working from the outside in until you get there

-- Dan North

Page 7: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

BDD shows you what to do nextaka Technical Discipline

Page 8: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

How do we BDD?

Page 9: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

Feature: Traveler searches for cheap itineraries In order to save money while travelling As a world traveler I want to search for the cheapest itinerary

Page 10: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

Product owner writes scenarioand developer automates it

Page 11: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

Developer writes scenarioand then automates it

Page 12: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

No!

Page 13: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

BDD is about communication!

flickr.com/photos/dvids/5638829762

Page 14: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia
Page 15: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

Scenario: Successfully find cheapest direct flight Given the flight from "WAW" to "LHR" priced $30 was scheduled And the flight from "WAW" to "LHR" priced $50 was scheduled When I open the "/search" page And I fill "WAW" in the "Departure airport" field And I fill "LHR" in the "Destination airport" field And I click "Search" Then I should be redirected to "/results" page And I should see $30 in the "#cheapest-flight-price" block

Page 16: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia
Page 17: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia
Page 18: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

Scenario: Successfully find cheapest direct flight Given the flight from "WAW" to "LHR" priced $30 was scheduled And the flight from "WAW" to "LHR" priced $50 was scheduled When I open the "/search" page And I fill "WAW" in the "Departure airport" field And I fill "LHR" in the "Destination airport" field And I click "Search" Then I should be redirected to "/results" page And I should see $30 in the "#cheapest-flight-price" block

Page 19: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia
Page 20: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

Translation

Page 21: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

Can we do better?

Page 22: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia
Page 23: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia
Page 24: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia
Page 25: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

Mission accomplished BoysWe can go home now!

flickr.com/photos/dvids/5638829762

Page 26: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia
Page 27: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia
Page 28: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

Translation again

Page 29: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

How to fix that?

Page 30: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

DDD

Page 31: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

What is DDD about?

Page 32: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

It’s about focusing on the domain and letting it affect the so"ware very

much-- Jimmy Nilsson

Page 33: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

But WHY do we need it?

Page 34: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

Everybody knows the jargonin their OWN FIELD

Page 35: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

It's about common understanding

Page 36: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

Ubiquitous language

Page 37: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia
Page 38: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia
Page 39: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia
Page 40: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

Concrete examples are rooted in the problem domain

-- Matt Wynne

Page 41: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia
Page 42: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

Domain Model

Page 43: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

A domain model (...) is not just the knowledge in a domain expert’s head;

it is a rigorously organized and selective abstraction of that knowledge

-- Eric Evans

Page 44: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

Model documentsthe knowledge

Page 45: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

Pushing for ubiquitous language hard enough makes your examples a domain

model-- Konstantin Kudryashov

Page 46: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

Scenario: Successfully find cheapest direct flight Given the flight from "WAW" to "LHR" priced $30 was scheduled And the flight from "WAW" to "LHR" priced $50 was scheduled When I open the "/search" page And I fill "WAW" in the "Departure airport" field And I fill "LHR" in the "Destination airport" field And I click "Search" Then I should be redirected to "/results" page And I should see $30 in the "#cheapest-flight-price" block

Page 47: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

Scenario: Successfully find cheapest direct itinerary Given the search for the itinerary schedule And the itinerary from "WAW" to "LHR" priced $30 was planned in the schedule And the itinerary from "WAW" to "LHR" priced $50 was planned in the schedule When I search for cheapest itinerary from "WAW" to "LHR" Then the cheapest itinerary should cost $30

Page 48: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

Modelling by example

Page 49: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia
Page 50: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia
Page 51: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

Phase 1

Page 52: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia
Page 53: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

Scenario: Successfully find cheapest direct itinerary Given the search for the itinerary schedule And the itinerary from "WAW" to "LHR" priced $30 was planned in the schedule And the itinerary from "WAW" to "LHR" priced $50 was planned in the schedule When I search for cheapest itinerary from "WAW" to "LHR" Then the cheapest itinerary should cost $30

Page 54: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia
Page 55: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

Given the search for the itinerary schedule

/** * @Given /^the search for the itinerary schedule$/ */ public function theSearchForTheItinerarySchedule() { $this->itinerarySchedule = new ItinerarySchedule(); $this->search = new Search($this->itinerarySchedule); }

Page 56: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia
Page 57: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

Design emerges

Page 58: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

And the itinerary from "WAW" to "LHR" priced $30 was planned in the schedule

/** * @Given the itinerary from :fromAirport to :toAirport * priced $:price was planned in the schedule */ public function theItineraryFromToPricedWasPlannedInTheSchedule( $fromAirport, $toAirport, $price ) { $itinerary = new Itinerary( Airport::code($fromAirport), Airport::code($toAirport), Money::usd($price) );

$this->itinerarySchedule->plan($itinerary); }

Page 59: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia
Page 60: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

When I search for cheapest itinerary from "WAW" to "LHR"

/** * @When I search for cheapest itinerary from :fromAirport to :toAirport */ public function iSearchForCheapestItineraryFromTo($fromAirport, $toAirport) { $this->cheapestItinerary = $this->search->forCheapest( Airport::code($fromAirport), Airport::code($toAirport) ); }

Page 61: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

Then the cheapest itinerary should cost $30

/** * @Then the cheapest itinerary should cost $:price */ public function theCheapestItineraryShouldCost($price) { expect($this->cheapestItinerary->cost())->toBeLike(Money::usd($price)); }

Page 62: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia
Page 63: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia
Page 64: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

Phase 2

Page 65: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia
Page 66: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

@ui Scenario: Successfully find cheapest direct itinerary Given the search for the itinerary schedule And the itinerary from "WAW" to "LHR" priced $30 was planned in the schedule And the itinerary from "WAW" to "LHR" priced $50 was planned in the schedule When I search for cheapest itinerary from "WAW" to "LHR" Then the cheapest itinerary should cost $30

Page 67: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

Given the search for the itinerary schedule

/** * @Given the search for the itinerary schedule */ public function theSearchForTheItinerarySchedule() { $this->visit("/search"); }

Page 68: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

And the itinerary from "WAW" to "LHR" priced $30 was planned in the schedule

/** * @Given the itinerary from :fromAirport to :toAirport * priced $:price was planned in the schedule */ public function theItineraryFromToPricedWasPlannedInTheSchedule( $fromAirport, $toAirport, $price ) { $itinerary = new Itinerary( Airport::code($fromAirport), Airport::code($toAirport), Money::usd($price) );

$this->get("itinerary_schedule")->plan($itinerary); }

Page 69: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

When I search for cheapest itinerary from "WAW" to "LHR"

/** * @When I search for cheapest itinerary from :fromAirport to :toAirport */ public function iSearchForCheapestItineraryFromTo($fromAirport, $toAirport) { $this->fillIn("#from-airport", $fromAirport); $this->fillIn("#to-airport", $toAirport);

$this->clickButton("Search"); }

Page 70: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

Then the cheapest itinerary should cost $30

/** * @Then the cheapest itinerary should cost $:price */ public function theCheapestItineraryShouldCost($price) { $cheapestItinerary = $this->find("#cheapest-itinerary"); expect($cheapestItinerary)->toContainText(sprintf("From $%s", $price)); }

Page 71: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

# behat.yml default: suites: domain: contexts: [ SearchContext ] ui: contexts: [ WebSearchContext ] filters: { tags: '@ui' }

Page 72: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

Modelling by ExampleIn three (easy) steps

Page 73: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

· Have the conversation· Model your objects

· Go again through UI*

Page 74: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

*But

Page 75: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

You (really) don't have to automate

everything!

Page 76: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia
Page 77: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

But there is a problem

Page 78: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

We ignored the depth of the domain

Page 79: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

On purpose

Page 80: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

You can't model the whole system using

one feature

Page 81: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia
Page 82: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

Repeat the process and model the

planner

Page 83: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

What if model has different requirements

in this context?

Page 84: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

Bounded Context

Page 85: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

Language is limited

Page 86: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

Search Itinerary!=

Planner Itinerary!=

Booking Itinerary

Page 87: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia
Page 88: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

Do not build fragile monoliths!

Page 89: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

Build applications withBounded context in mind

Page 90: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

--- Wrap up ---

Page 91: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

Have the conversation

Page 92: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

Do not separate the concepts from the implementation

Page 93: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

You cannot build conceptual models

without considering implementation issues

Page 94: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

Push forUbiquitous language

Page 95: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

Use Behat to drive your ModelNot only the UI

Page 96: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

"BDD is about conversations you have to

produce software"

Page 97: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

"DDD is about how youexplore domain models

and how you articulate this"

Page 98: 4Developers 2015: Jak (w końcu) zacząć pracować z DDD wykorzystując BDD - Kacper Gunia

Thanks!@cakper