SlideShare a Scribd company logo
EagerDesign
by @_md
♞
marcelloduarte
Introducing
marcelloduarte
@_md
#EagerDesign
agileislazy
@_md#EagerDesign
"Makethecommitmentatthelast

responsiblemoment"
Preston Smith
decide later
softwareisaboutpeople
@_md#EagerDesign
ageofexcess
@_md#EagerDesign
subtraction
@_md#EagerDesign
subtraction
@_md#EagerDesign
lawsofsubtraction
@_md
lawsofsubtraction
whatisn’ttherecanoftentrumpwhatis.thesimplest
rulescreatethemosteffectiveexperience.limiting
informationengagesimagination.creativitythrives
underintelligentconstraints.breakistheimportant
partofbreakthrough.doingsomethingisn’talways
betterthandoingnothing.
Matthew E. May
EagerDesign
how
♞
Jumptotheproblemworthsolving
Eagerlyreplaceprimitiveswithtypes
Compose[thedomainalgebra] inside-out
Avoidmutablestate
#1
#2
#3
#4
@_md#EagerDesign
outside-in
♞
outside-in
unittest code
refactor
acceptance
ui/controller/views
orm,libs,domainobjects
frameworkstuff(forms…)
model/view/controller
events
outside-in
UI
Domain
core
Application
Infrastructure
mobileUI
port/adapter
port/adapterDB
https://pbs.twimg.com/media/CHyUAukWgAA5iYS.jpg
reads
writes
therightoutside
http://bit.ly/modellingbyexample
http://bit.ly/whencucumbersgobad
@_md#EagerDesign
{
outside-in
slow
misleading
complex
restrictscomposability
when?
EagerDesign
when
done
trivial
done

nottrivial
notdone
noidea
[based on Cynefin, Snowden 03]
@_md#EagerDesign
EagerDesign
when
done
trivial
done

nottrivial
notdone
noidea
[based on Cynefin, Snowden 03]
Outside-in
@_md#EagerDesign
EagerDesign
when
done
trivial
done

nottrivial
notdone
noidea
[based on Cynefin, Snowden 03]
EagerDesign
Outside-in
@_md#EagerDesign
EagerDesign
when
done
trivial
done

nottrivial
notdone
noidea
[based on Cynefin, Snowden 03]
EagerDesign
Outside-in
¯_(ツ)_/¯
@_md#EagerDesign
Example
{
chessapp
weaddplayers
itgeneratestheschedule
wecanentertheresults
wecanseetheranking
TRIVIAL
TRIVIAL
TRIVIAL
EagerDesign
@_md
{
domainrules
playerswillplaywitheveryotherplayer
playerscan'tplaytwiceinthesameround
everyplayermustplayineveryround
playersmustplaytwicewithanotherplayer
@_md
HowdoIconvert

alistofthings

intoalistofuniquelists

ofuniquepairs?
Letmethink
a b c d e f g h
List of things
a b c d e f g h
List of things
Pairs
a b c d
h g f e
Pairs
a b c d
h g f e
Shift to the right
a b c d
h g f ee
We haz roundz! :o)
a b c d
h g f ee
r1 r2 r3 r4
r5 r6 r7
+ r1 r2 r3 r4
r5 r6 r7
inverse
( )
r1 r2 r3 r4
r5 r6 r7 r8
r9 r10 r11 r12
r13 r14
shuffle
( )
lawsofsubtraction
whatisn’ttherecanoftentrumpwhatis.thesimplest
rulescreatethemosteffectiveexperience.limiting
informationengagesimagination.creativitythrives
underintelligentconstraints.breakistheimportant
partofbreakthrough.doingsomethingisn’talways
betterthandoingnothing.
Matthew E. May
#1Jumptotheproblemworthsolving
@_md#EagerDesign
http://github.com/MarcelloDuarte/phunkie
ImmList
a b c d e f g hhead
a b c d e f g htail
a b c d e f g hinit
a b c d e f g hlast
concat(
head($players),
last($players),
init(tail($players))
function shift(ImmList $players)
{
return concat(head($players),
last($players),
init(tail($players))
);
}
function shift(ImmList $players)
{
return concat(head($players),
last($players),
init(tail($players))
);
}
function round(ImmList $players)

{
$sides = $players->splitAt($players->length/2);
return $sides->_1->zip($sides->_2->reverse());
}
function rounds(ImmList $players)

{
}
function rounds(ImmList $players, $rounds = [])

{
$rounds[] = round($players);
return count($rounds) < $players->length - 1 ?
rounds(shift($players), $rounds) :

ImmList(...$rounds);
}
function rounds(ImmList $players, $rounds = [])

{
$rounds[] = round($players);
return count($rounds) < $players->length - 1 ?
rounds(shift($players), $rounds) :

ImmList(...$rounds);
}
function rounds(ImmList $players, $rounds = [])

{
$rounds[] = round($players);
return count($rounds) < $players->length - 1 ?
rounds(shift($players), $rounds) :

ImmList(...$rounds);
}
function rounds(ImmList $players, $rounds = [])

{
$rounds[] = round($players);
return count($rounds) < $players->length - 1 ?
rounds(shift($players), $rounds) :

ImmList(...$rounds);
}
#3Compose
function rounds(ImmList $players, $rounds = [])

{
$rounds[] = round($players);
return count($rounds) < $players->length - 1 ?
rounds(shift($players), $rounds) :

ImmList(...$rounds);
}
#4Avoidmutablestate
function rounds(ImmList $players, $rounds = [])

{
$rounds[] = round($players);
return count($rounds) < $players->length - 1 ?
rounds(shift($players), $rounds) :

ImmList(...$rounds);
}
function schedule(ImmList $players)

{
return concat(rounds($players),

inverse(rounds($players));
}
#2Eagerlyreplaceprimitiveswithtypes
@_md#EagerDesign
“Mymathbackgroundmademerealise
thateachobjectcouldhaveseveral
algebrasassociatedwithit,andthere
couldbefamiliesofthese,andthatthese
wouldbeveryveryuseful...
...Imadeupaterm"genericity"for

dealingwithgenericbehavioursina

quasi-algebraicform...
...Ididn'tlikethewaySimulaIorSimula
67didinheritance.SoIdecidedtoleave
outinheritanceasabuilt-infeatureuntilI
understooditbetter.”
AlanKay
http://bit.ly/meaning-­‐of-­‐oo
type Player = string;
type Players = ImmList<Player>;

type Match = Pair<Player,Player>

type Round = ImmList<Match>;

type Rounds = ImmList<Round>;

type Schedule = Rounds;



function shift(Players $players): Players
{
return concat(head($players),
last($players),
init(tail($players))
);
}
function round(Players $players): Round

{
$sides = $players->splitAt($players->length/2);
return $sides->_1->zip($sides->_2->reverse());
}
function rounds(Players $players, $rounds = [])

: Rounds
{
$rounds[] = round($players);
return count($rounds) < $players->length - 1 ?
rounds(shift($players), $rounds) :

ImmList(...$rounds);
}
function schedule(Players $players): Rounds

{
return concat(rounds($players),

inverse(rounds($players));
}
Composethedomainalgebra
inside-out
@_md#EagerDesign
namespace MdChessScheduleGeneration;
shift(Players $players): Players

round(Players $players): Round
rounds(Players $players): Rounds
schedule(Players $players): Schedule
♞
Players => Schedule
Players => Rounds => Schedule
♞
Players => Round => Rounds => Schedule
♞
domainrulesaredefined
againsttypes
@_md#EagerDesign
{
domainrules
playerswillplaywitheveryotherplayer
playerscan'tplaytwiceinthesameround
everyplayermustplayineveryround
playersmustplaytwicewithanotherplayer
@_md
richdomainmodelvs

leandomainmodel
S
S
S
S
S
S
@_md#EagerDesign
richdomain
ImmutableState
ImmutableState
ImmutableState
B B
leandomain
Laws
InterpretingServicesAgency
Example
@_md#EagerDesign
def request

def decline

def amend

def accept

def done

def request(details:JobDetails): Job

def decline(ref:JobRef): Job

def amend(details:JobDetails): Job => Option[TimeSheet]

def accept(ref:JobRef): Job => Option[TimeSheet]

def done(ref:JobRef): TimeSheet => Remittance
trait JobService
{

def request(details:JobDetails): Job

def decline(ref:JobRef): Job

def amend(details:JobDetails):Job => Option[TimeSheet]
def accept(ref:JobRef): Job => Option[TimeSheet]

def done(ref:JobRef): TimeSheet => Remittance
}
trait JobService
{

def request(details:JobDetails): Job

def decline(ref:JobRef): Job

def amend(details:JobDetails):Job => Option[TimeSheet]
def accept(ref:JobRef): Job => Option[TimeSheet]

def done(ref:JobRef): TimeSheet => Remittance
}
f(a:A):M[B]



g(a:B):M[C]
f(a:A):M[B]

f(a) map g = M[M[C]]


g(a:B):M[C]
f(a:A):M[B]

join f(a) map g = M[C]


g(a:B):M[C]
f(a:A):M[B]

andThen


g(a:B):M[C]
request andThen
amend andThen
done
def execute(input:Input): Unit
path = input("path").getOrElse("specs")
loadSpecs(path) andThen
runSpecs andThen
presentResults
what’stheeagerpoint?
@_md#EagerDesign
merging2cells!!
@_md#EagerDesign
{
3cases
samevalue
differentvalue
righthandsideis
empty
if ($this->value == $another->value) {
return Pair(Cell(),
Cell($this->value + $another->value));
} elseif ($another->isEmpty()) {
return Pair(Cell(), Cell($this->value));
}
return Pair(Cell($this->value), Cell($another->value));
if ($this->value == $another->value) {
return Pair(Cell(),
Cell($this->value + $another->value));
} elseif ($another->isEmpty()) {
return Pair(Cell(), Cell($this->value));
}
return Pair(Cell($this->value), Cell($another->value));
if ($this->value == $another->value) {
return Pair(Cell(),
Cell($this->value + $another->value));
} elseif ($another->isEmpty()) {
return Pair(Cell(), Cell($this->value));
}
return Pair(Cell($this->value), Cell($another->value));
function swipe($lines)
{

return $lines->map(function ($line) {


$lineCopy = mergeLine($line);

while (!isLineMerged($lineCopy)) {

$lineCopy = mergeLine($lineCopy);
}

return $lineCopy;

});

}
EagerDesign
♞
Jumptotheproblemworthsolving
Eagerlyreplaceprimitiveswithtypes
Compose[thedomainalgebra] inside-out
Avoidmutablestate
#1
#2
#3
#4
@_md#EagerDesign
marcelloduarte
@_md
#EagerDesign
Thankyou!
♞
@_md
bit.ly/inviqa-contact bit.ly/inviqa-careers
#EagerDesign

More Related Content

What's hot

MongoDB presentation
MongoDB presentationMongoDB presentation
MongoDB presentation
Hyphen Call
 
An Introduction to MongoDB Compass
An Introduction to MongoDB CompassAn Introduction to MongoDB Compass
An Introduction to MongoDB Compass
MongoDB
 
AWS re:Invent 2016: Serverless IoT Back Ends (IOT401)
AWS re:Invent 2016: Serverless IoT Back Ends (IOT401)AWS re:Invent 2016: Serverless IoT Back Ends (IOT401)
AWS re:Invent 2016: Serverless IoT Back Ends (IOT401)
Amazon Web Services
 
Building .NET Microservices
Building .NET MicroservicesBuilding .NET Microservices
Building .NET Microservices
VMware Tanzu
 
A brief introduction to SQLite PPT
A brief introduction to SQLite PPTA brief introduction to SQLite PPT
A brief introduction to SQLite PPT
JavaTpoint
 
RDBMS to Graphs
RDBMS to GraphsRDBMS to Graphs
RDBMS to Graphs
Neo4j
 
Introduction to MongoDB
Introduction to MongoDBIntroduction to MongoDB
Introduction to MongoDB
MongoDB
 
Microservices in Node.js: Patterns and techniques
Microservices in Node.js: Patterns and techniquesMicroservices in Node.js: Patterns and techniques
Microservices in Node.js: Patterns and techniques
The Software House
 
Natural Language Processing with Graphs
Natural Language Processing with GraphsNatural Language Processing with Graphs
Natural Language Processing with Graphs
Neo4j
 
Microservice intro
Microservice introMicroservice intro
Microservice intro
ramesh_sharma
 
NoSQL databases
NoSQL databasesNoSQL databases
NoSQL databases
Filip Ilievski
 
CouchDB
CouchDBCouchDB
CouchDB
Rashmi Agale
 
Time Theft: How Hidden and Unplanned Work Commit the Perfect Crime
Time Theft: How Hidden and Unplanned Work Commit the Perfect CrimeTime Theft: How Hidden and Unplanned Work Commit the Perfect Crime
Time Theft: How Hidden and Unplanned Work Commit the Perfect Crime
LeanKit
 

What's hot (13)

MongoDB presentation
MongoDB presentationMongoDB presentation
MongoDB presentation
 
An Introduction to MongoDB Compass
An Introduction to MongoDB CompassAn Introduction to MongoDB Compass
An Introduction to MongoDB Compass
 
AWS re:Invent 2016: Serverless IoT Back Ends (IOT401)
AWS re:Invent 2016: Serverless IoT Back Ends (IOT401)AWS re:Invent 2016: Serverless IoT Back Ends (IOT401)
AWS re:Invent 2016: Serverless IoT Back Ends (IOT401)
 
Building .NET Microservices
Building .NET MicroservicesBuilding .NET Microservices
Building .NET Microservices
 
A brief introduction to SQLite PPT
A brief introduction to SQLite PPTA brief introduction to SQLite PPT
A brief introduction to SQLite PPT
 
RDBMS to Graphs
RDBMS to GraphsRDBMS to Graphs
RDBMS to Graphs
 
Introduction to MongoDB
Introduction to MongoDBIntroduction to MongoDB
Introduction to MongoDB
 
Microservices in Node.js: Patterns and techniques
Microservices in Node.js: Patterns and techniquesMicroservices in Node.js: Patterns and techniques
Microservices in Node.js: Patterns and techniques
 
Natural Language Processing with Graphs
Natural Language Processing with GraphsNatural Language Processing with Graphs
Natural Language Processing with Graphs
 
Microservice intro
Microservice introMicroservice intro
Microservice intro
 
NoSQL databases
NoSQL databasesNoSQL databases
NoSQL databases
 
CouchDB
CouchDBCouchDB
CouchDB
 
Time Theft: How Hidden and Unplanned Work Commit the Perfect Crime
Time Theft: How Hidden and Unplanned Work Commit the Perfect CrimeTime Theft: How Hidden and Unplanned Work Commit the Perfect Crime
Time Theft: How Hidden and Unplanned Work Commit the Perfect Crime
 

Viewers also liked

Empathy from Agility
Empathy from AgilityEmpathy from Agility
Empathy from Agility
Marcello Duarte
 
Functional Structures in PHP
Functional Structures in PHPFunctional Structures in PHP
Functional Structures in PHP
Marcello Duarte
 
Tdd is Dead, Long Live TDD
Tdd is Dead, Long Live TDDTdd is Dead, Long Live TDD
Tdd is Dead, Long Live TDD
Jonathan Acker
 
Architecting your Content for the Unknown Consumer
Architecting your Content for the Unknown ConsumerArchitecting your Content for the Unknown Consumer
Architecting your Content for the Unknown Consumer
Richard Jones
 
Deliberate practice
Deliberate practiceDeliberate practice
Deliberate practice
Marcello Duarte
 
Understanding Craftsmanship SwanseaCon2015
Understanding Craftsmanship SwanseaCon2015Understanding Craftsmanship SwanseaCon2015
Understanding Craftsmanship SwanseaCon2015
Marcello Duarte
 
Barely Enough Design
Barely Enough DesignBarely Enough Design
Barely Enough Design
Marcello Duarte
 
The framework as an implementation detail
The framework as an implementation detailThe framework as an implementation detail
The framework as an implementation detail
Marcello Duarte
 

Viewers also liked (8)

Empathy from Agility
Empathy from AgilityEmpathy from Agility
Empathy from Agility
 
Functional Structures in PHP
Functional Structures in PHPFunctional Structures in PHP
Functional Structures in PHP
 
Tdd is Dead, Long Live TDD
Tdd is Dead, Long Live TDDTdd is Dead, Long Live TDD
Tdd is Dead, Long Live TDD
 
Architecting your Content for the Unknown Consumer
Architecting your Content for the Unknown ConsumerArchitecting your Content for the Unknown Consumer
Architecting your Content for the Unknown Consumer
 
Deliberate practice
Deliberate practiceDeliberate practice
Deliberate practice
 
Understanding Craftsmanship SwanseaCon2015
Understanding Craftsmanship SwanseaCon2015Understanding Craftsmanship SwanseaCon2015
Understanding Craftsmanship SwanseaCon2015
 
Barely Enough Design
Barely Enough DesignBarely Enough Design
Barely Enough Design
 
The framework as an implementation detail
The framework as an implementation detailThe framework as an implementation detail
The framework as an implementation detail
 

Similar to Introducing Eager Design

Metaprogramming and Folly
Metaprogramming and FollyMetaprogramming and Folly
Metaprogramming and Folly
Haseeb Qureshi
 
4Developers: Norbert Wójtowicz- Data-Oriented Architecture
4Developers: Norbert Wójtowicz- Data-Oriented Architecture4Developers: Norbert Wójtowicz- Data-Oriented Architecture
4Developers: Norbert Wójtowicz- Data-Oriented Architecture
PROIDEA
 
RubyEnRails2007 - Dr Nic Williams - DIY Syntax
RubyEnRails2007 - Dr Nic Williams - DIY SyntaxRubyEnRails2007 - Dr Nic Williams - DIY Syntax
RubyEnRails2007 - Dr Nic Williams - DIY Syntax
Dr Nic Williams
 
Beyond Breakpoints: Advanced Debugging with XCode
Beyond Breakpoints: Advanced Debugging with XCodeBeyond Breakpoints: Advanced Debugging with XCode
Beyond Breakpoints: Advanced Debugging with XCode
Aijaz Ansari
 
Getfilestruct zbksh
Getfilestruct zbkshGetfilestruct zbksh
Getfilestruct zbksh
Ben Pope
 
Getfilestruct zbksh(1)
Getfilestruct zbksh(1)Getfilestruct zbksh(1)
Getfilestruct zbksh(1)
Ben Pope
 
Dart : one language to rule them all - MixIT 2013
Dart : one language to rule them all - MixIT 2013Dart : one language to rule them all - MixIT 2013
Dart : one language to rule them all - MixIT 2013
Sébastien Deleuze
 
Introduction to Domain-Driven Design
Introduction to Domain-Driven DesignIntroduction to Domain-Driven Design
Introduction to Domain-Driven Design
Yoan-Alexander Grigorov
 
Architecture in an Agile World
Architecture in an Agile WorldArchitecture in an Agile World
Architecture in an Agile World
Don McGreal
 
E-Primer Your Business Online
E-Primer Your Business OnlineE-Primer Your Business Online
E-Primer Your Business Online
guestfc9d8a
 
Malli: inside data-driven schemas
Malli: inside data-driven schemasMalli: inside data-driven schemas
Malli: inside data-driven schemas
Metosin Oy
 
optim function
optim functionoptim function
optim function
Supri Amir
 
Quality code by design
Quality code by designQuality code by design
Quality code by design
WP Developers Club
 
Php Code Audits (PHP UK 2010)
Php Code Audits (PHP UK 2010)Php Code Audits (PHP UK 2010)
Php Code Audits (PHP UK 2010)
Damien Seguy
 
R Workshop for Beginners
R Workshop for BeginnersR Workshop for Beginners
R Workshop for Beginners
Metamarkets
 
Dip Your Toes in the Sea of Security
Dip Your Toes in the Sea of SecurityDip Your Toes in the Sea of Security
Dip Your Toes in the Sea of Security
James Titcumb
 
Dip Your Toes in the Sea of Security (CoderCruise 2017)
Dip Your Toes in the Sea of Security (CoderCruise 2017)Dip Your Toes in the Sea of Security (CoderCruise 2017)
Dip Your Toes in the Sea of Security (CoderCruise 2017)
James Titcumb
 
Understanding our code with tests, schemas, and types
Understanding our code with tests, schemas, and typesUnderstanding our code with tests, schemas, and types
Understanding our code with tests, schemas, and types
Mark Godfrey
 
pa-pe-pi-po-pure Python Text Processing
pa-pe-pi-po-pure Python Text Processingpa-pe-pi-po-pure Python Text Processing
pa-pe-pi-po-pure Python Text Processing
Rodrigo Senra
 
Padrino is agnostic
Padrino is agnosticPadrino is agnostic
Padrino is agnostic
Takeshi Yabe
 

Similar to Introducing Eager Design (20)

Metaprogramming and Folly
Metaprogramming and FollyMetaprogramming and Folly
Metaprogramming and Folly
 
4Developers: Norbert Wójtowicz- Data-Oriented Architecture
4Developers: Norbert Wójtowicz- Data-Oriented Architecture4Developers: Norbert Wójtowicz- Data-Oriented Architecture
4Developers: Norbert Wójtowicz- Data-Oriented Architecture
 
RubyEnRails2007 - Dr Nic Williams - DIY Syntax
RubyEnRails2007 - Dr Nic Williams - DIY SyntaxRubyEnRails2007 - Dr Nic Williams - DIY Syntax
RubyEnRails2007 - Dr Nic Williams - DIY Syntax
 
Beyond Breakpoints: Advanced Debugging with XCode
Beyond Breakpoints: Advanced Debugging with XCodeBeyond Breakpoints: Advanced Debugging with XCode
Beyond Breakpoints: Advanced Debugging with XCode
 
Getfilestruct zbksh
Getfilestruct zbkshGetfilestruct zbksh
Getfilestruct zbksh
 
Getfilestruct zbksh(1)
Getfilestruct zbksh(1)Getfilestruct zbksh(1)
Getfilestruct zbksh(1)
 
Dart : one language to rule them all - MixIT 2013
Dart : one language to rule them all - MixIT 2013Dart : one language to rule them all - MixIT 2013
Dart : one language to rule them all - MixIT 2013
 
Introduction to Domain-Driven Design
Introduction to Domain-Driven DesignIntroduction to Domain-Driven Design
Introduction to Domain-Driven Design
 
Architecture in an Agile World
Architecture in an Agile WorldArchitecture in an Agile World
Architecture in an Agile World
 
E-Primer Your Business Online
E-Primer Your Business OnlineE-Primer Your Business Online
E-Primer Your Business Online
 
Malli: inside data-driven schemas
Malli: inside data-driven schemasMalli: inside data-driven schemas
Malli: inside data-driven schemas
 
optim function
optim functionoptim function
optim function
 
Quality code by design
Quality code by designQuality code by design
Quality code by design
 
Php Code Audits (PHP UK 2010)
Php Code Audits (PHP UK 2010)Php Code Audits (PHP UK 2010)
Php Code Audits (PHP UK 2010)
 
R Workshop for Beginners
R Workshop for BeginnersR Workshop for Beginners
R Workshop for Beginners
 
Dip Your Toes in the Sea of Security
Dip Your Toes in the Sea of SecurityDip Your Toes in the Sea of Security
Dip Your Toes in the Sea of Security
 
Dip Your Toes in the Sea of Security (CoderCruise 2017)
Dip Your Toes in the Sea of Security (CoderCruise 2017)Dip Your Toes in the Sea of Security (CoderCruise 2017)
Dip Your Toes in the Sea of Security (CoderCruise 2017)
 
Understanding our code with tests, schemas, and types
Understanding our code with tests, schemas, and typesUnderstanding our code with tests, schemas, and types
Understanding our code with tests, schemas, and types
 
pa-pe-pi-po-pure Python Text Processing
pa-pe-pi-po-pure Python Text Processingpa-pe-pi-po-pure Python Text Processing
pa-pe-pi-po-pure Python Text Processing
 
Padrino is agnostic
Padrino is agnosticPadrino is agnostic
Padrino is agnostic
 

More from Marcello Duarte

Transitioning to Agile
Transitioning to AgileTransitioning to Agile
Transitioning to Agile
Marcello Duarte
 
Understanding craftsmanship
Understanding craftsmanshipUnderstanding craftsmanship
Understanding craftsmanship
Marcello Duarte
 
Hexagonal symfony
Hexagonal symfonyHexagonal symfony
Hexagonal symfony
Marcello Duarte
 
PhpSpec 2.0 ilustrated by examples
PhpSpec 2.0 ilustrated by examplesPhpSpec 2.0 ilustrated by examples
PhpSpec 2.0 ilustrated by examples
Marcello Duarte
 
Emergent design with phpspec
Emergent design with phpspecEmergent design with phpspec
Emergent design with phpspec
Marcello Duarte
 
Mocking Demystified
Mocking DemystifiedMocking Demystified
Mocking Demystified
Marcello Duarte
 
Pair Programming, TDD and other impractical things
Pair Programming, TDD and other impractical thingsPair Programming, TDD and other impractical things
Pair Programming, TDD and other impractical things
Marcello Duarte
 
BDD For Zend Framework With PHPSpec
BDD For Zend Framework With PHPSpecBDD For Zend Framework With PHPSpec
BDD For Zend Framework With PHPSpec
Marcello Duarte
 
PHPSpec BDD for PHP
PHPSpec BDD for PHPPHPSpec BDD for PHP
PHPSpec BDD for PHP
Marcello Duarte
 
PHPSpec BDD Framework
PHPSpec BDD FrameworkPHPSpec BDD Framework
PHPSpec BDD Framework
Marcello Duarte
 

More from Marcello Duarte (10)

Transitioning to Agile
Transitioning to AgileTransitioning to Agile
Transitioning to Agile
 
Understanding craftsmanship
Understanding craftsmanshipUnderstanding craftsmanship
Understanding craftsmanship
 
Hexagonal symfony
Hexagonal symfonyHexagonal symfony
Hexagonal symfony
 
PhpSpec 2.0 ilustrated by examples
PhpSpec 2.0 ilustrated by examplesPhpSpec 2.0 ilustrated by examples
PhpSpec 2.0 ilustrated by examples
 
Emergent design with phpspec
Emergent design with phpspecEmergent design with phpspec
Emergent design with phpspec
 
Mocking Demystified
Mocking DemystifiedMocking Demystified
Mocking Demystified
 
Pair Programming, TDD and other impractical things
Pair Programming, TDD and other impractical thingsPair Programming, TDD and other impractical things
Pair Programming, TDD and other impractical things
 
BDD For Zend Framework With PHPSpec
BDD For Zend Framework With PHPSpecBDD For Zend Framework With PHPSpec
BDD For Zend Framework With PHPSpec
 
PHPSpec BDD for PHP
PHPSpec BDD for PHPPHPSpec BDD for PHP
PHPSpec BDD for PHP
 
PHPSpec BDD Framework
PHPSpec BDD FrameworkPHPSpec BDD Framework
PHPSpec BDD Framework
 

Recently uploaded

June Patch Tuesday
June Patch TuesdayJune Patch Tuesday
June Patch Tuesday
Ivanti
 
How to use Firebase Data Connect For Flutter
How to use Firebase Data Connect For FlutterHow to use Firebase Data Connect For Flutter
How to use Firebase Data Connect For Flutter
Daiki Mogmet Ito
 
Best 20 SEO Techniques To Improve Website Visibility In SERP
Best 20 SEO Techniques To Improve Website Visibility In SERPBest 20 SEO Techniques To Improve Website Visibility In SERP
Best 20 SEO Techniques To Improve Website Visibility In SERP
Pixlogix Infotech
 
Digital Marketing Trends in 2024 | Guide for Staying Ahead
Digital Marketing Trends in 2024 | Guide for Staying AheadDigital Marketing Trends in 2024 | Guide for Staying Ahead
Digital Marketing Trends in 2024 | Guide for Staying Ahead
Wask
 
Project Management Semester Long Project - Acuity
Project Management Semester Long Project - AcuityProject Management Semester Long Project - Acuity
Project Management Semester Long Project - Acuity
jpupo2018
 
Monitoring and Managing Anomaly Detection on OpenShift.pdf
Monitoring and Managing Anomaly Detection on OpenShift.pdfMonitoring and Managing Anomaly Detection on OpenShift.pdf
Monitoring and Managing Anomaly Detection on OpenShift.pdf
Tosin Akinosho
 
National Security Agency - NSA mobile device best practices
National Security Agency - NSA mobile device best practicesNational Security Agency - NSA mobile device best practices
National Security Agency - NSA mobile device best practices
Quotidiano Piemontese
 
Building Production Ready Search Pipelines with Spark and Milvus
Building Production Ready Search Pipelines with Spark and MilvusBuilding Production Ready Search Pipelines with Spark and Milvus
Building Production Ready Search Pipelines with Spark and Milvus
Zilliz
 
5th LF Energy Power Grid Model Meet-up Slides
5th LF Energy Power Grid Model Meet-up Slides5th LF Energy Power Grid Model Meet-up Slides
5th LF Energy Power Grid Model Meet-up Slides
DanBrown980551
 
Taking AI to the Next Level in Manufacturing.pdf
Taking AI to the Next Level in Manufacturing.pdfTaking AI to the Next Level in Manufacturing.pdf
Taking AI to the Next Level in Manufacturing.pdf
ssuserfac0301
 
Presentation of the OECD Artificial Intelligence Review of Germany
Presentation of the OECD Artificial Intelligence Review of GermanyPresentation of the OECD Artificial Intelligence Review of Germany
Presentation of the OECD Artificial Intelligence Review of Germany
innovationoecd
 
Columbus Data & Analytics Wednesdays - June 2024
Columbus Data & Analytics Wednesdays - June 2024Columbus Data & Analytics Wednesdays - June 2024
Columbus Data & Analytics Wednesdays - June 2024
Jason Packer
 
Ocean lotus Threat actors project by John Sitima 2024 (1).pptx
Ocean lotus Threat actors project by John Sitima 2024 (1).pptxOcean lotus Threat actors project by John Sitima 2024 (1).pptx
Ocean lotus Threat actors project by John Sitima 2024 (1).pptx
SitimaJohn
 
Programming Foundation Models with DSPy - Meetup Slides
Programming Foundation Models with DSPy - Meetup SlidesProgramming Foundation Models with DSPy - Meetup Slides
Programming Foundation Models with DSPy - Meetup Slides
Zilliz
 
Deep Dive: AI-Powered Marketing to Get More Leads and Customers with HyperGro...
Deep Dive: AI-Powered Marketing to Get More Leads and Customers with HyperGro...Deep Dive: AI-Powered Marketing to Get More Leads and Customers with HyperGro...
Deep Dive: AI-Powered Marketing to Get More Leads and Customers with HyperGro...
saastr
 
GenAI Pilot Implementation in the organizations
GenAI Pilot Implementation in the organizationsGenAI Pilot Implementation in the organizations
GenAI Pilot Implementation in the organizations
kumardaparthi1024
 
TrustArc Webinar - 2024 Global Privacy Survey
TrustArc Webinar - 2024 Global Privacy SurveyTrustArc Webinar - 2024 Global Privacy Survey
TrustArc Webinar - 2024 Global Privacy Survey
TrustArc
 
Webinar: Designing a schema for a Data Warehouse
Webinar: Designing a schema for a Data WarehouseWebinar: Designing a schema for a Data Warehouse
Webinar: Designing a schema for a Data Warehouse
Federico Razzoli
 
Your One-Stop Shop for Python Success: Top 10 US Python Development Providers
Your One-Stop Shop for Python Success: Top 10 US Python Development ProvidersYour One-Stop Shop for Python Success: Top 10 US Python Development Providers
Your One-Stop Shop for Python Success: Top 10 US Python Development Providers
akankshawande
 
Introduction of Cybersecurity with OSS at Code Europe 2024
Introduction of Cybersecurity with OSS  at Code Europe 2024Introduction of Cybersecurity with OSS  at Code Europe 2024
Introduction of Cybersecurity with OSS at Code Europe 2024
Hiroshi SHIBATA
 

Recently uploaded (20)

June Patch Tuesday
June Patch TuesdayJune Patch Tuesday
June Patch Tuesday
 
How to use Firebase Data Connect For Flutter
How to use Firebase Data Connect For FlutterHow to use Firebase Data Connect For Flutter
How to use Firebase Data Connect For Flutter
 
Best 20 SEO Techniques To Improve Website Visibility In SERP
Best 20 SEO Techniques To Improve Website Visibility In SERPBest 20 SEO Techniques To Improve Website Visibility In SERP
Best 20 SEO Techniques To Improve Website Visibility In SERP
 
Digital Marketing Trends in 2024 | Guide for Staying Ahead
Digital Marketing Trends in 2024 | Guide for Staying AheadDigital Marketing Trends in 2024 | Guide for Staying Ahead
Digital Marketing Trends in 2024 | Guide for Staying Ahead
 
Project Management Semester Long Project - Acuity
Project Management Semester Long Project - AcuityProject Management Semester Long Project - Acuity
Project Management Semester Long Project - Acuity
 
Monitoring and Managing Anomaly Detection on OpenShift.pdf
Monitoring and Managing Anomaly Detection on OpenShift.pdfMonitoring and Managing Anomaly Detection on OpenShift.pdf
Monitoring and Managing Anomaly Detection on OpenShift.pdf
 
National Security Agency - NSA mobile device best practices
National Security Agency - NSA mobile device best practicesNational Security Agency - NSA mobile device best practices
National Security Agency - NSA mobile device best practices
 
Building Production Ready Search Pipelines with Spark and Milvus
Building Production Ready Search Pipelines with Spark and MilvusBuilding Production Ready Search Pipelines with Spark and Milvus
Building Production Ready Search Pipelines with Spark and Milvus
 
5th LF Energy Power Grid Model Meet-up Slides
5th LF Energy Power Grid Model Meet-up Slides5th LF Energy Power Grid Model Meet-up Slides
5th LF Energy Power Grid Model Meet-up Slides
 
Taking AI to the Next Level in Manufacturing.pdf
Taking AI to the Next Level in Manufacturing.pdfTaking AI to the Next Level in Manufacturing.pdf
Taking AI to the Next Level in Manufacturing.pdf
 
Presentation of the OECD Artificial Intelligence Review of Germany
Presentation of the OECD Artificial Intelligence Review of GermanyPresentation of the OECD Artificial Intelligence Review of Germany
Presentation of the OECD Artificial Intelligence Review of Germany
 
Columbus Data & Analytics Wednesdays - June 2024
Columbus Data & Analytics Wednesdays - June 2024Columbus Data & Analytics Wednesdays - June 2024
Columbus Data & Analytics Wednesdays - June 2024
 
Ocean lotus Threat actors project by John Sitima 2024 (1).pptx
Ocean lotus Threat actors project by John Sitima 2024 (1).pptxOcean lotus Threat actors project by John Sitima 2024 (1).pptx
Ocean lotus Threat actors project by John Sitima 2024 (1).pptx
 
Programming Foundation Models with DSPy - Meetup Slides
Programming Foundation Models with DSPy - Meetup SlidesProgramming Foundation Models with DSPy - Meetup Slides
Programming Foundation Models with DSPy - Meetup Slides
 
Deep Dive: AI-Powered Marketing to Get More Leads and Customers with HyperGro...
Deep Dive: AI-Powered Marketing to Get More Leads and Customers with HyperGro...Deep Dive: AI-Powered Marketing to Get More Leads and Customers with HyperGro...
Deep Dive: AI-Powered Marketing to Get More Leads and Customers with HyperGro...
 
GenAI Pilot Implementation in the organizations
GenAI Pilot Implementation in the organizationsGenAI Pilot Implementation in the organizations
GenAI Pilot Implementation in the organizations
 
TrustArc Webinar - 2024 Global Privacy Survey
TrustArc Webinar - 2024 Global Privacy SurveyTrustArc Webinar - 2024 Global Privacy Survey
TrustArc Webinar - 2024 Global Privacy Survey
 
Webinar: Designing a schema for a Data Warehouse
Webinar: Designing a schema for a Data WarehouseWebinar: Designing a schema for a Data Warehouse
Webinar: Designing a schema for a Data Warehouse
 
Your One-Stop Shop for Python Success: Top 10 US Python Development Providers
Your One-Stop Shop for Python Success: Top 10 US Python Development ProvidersYour One-Stop Shop for Python Success: Top 10 US Python Development Providers
Your One-Stop Shop for Python Success: Top 10 US Python Development Providers
 
Introduction of Cybersecurity with OSS at Code Europe 2024
Introduction of Cybersecurity with OSS  at Code Europe 2024Introduction of Cybersecurity with OSS  at Code Europe 2024
Introduction of Cybersecurity with OSS at Code Europe 2024
 

Introducing Eager Design