SlideShare ist ein Scribd-Unternehmen logo
1 von 98
Downloaden Sie, um offline zu lesen
Global
Design
Principles
Matthias Noback
Dutch PHP Conference, Amsterdam, June 26th, 2015
The Quest for
Stability
Change
Stability versus change
• Backwards compatibility of APIs

• Semantic versioning

• HTTP status codes

• XML schemas
For internal APIs
only!
The key is in the concept of
communication
ReceiverSender
What's being communicated?
Message
Type ("BookHotel")

Value ("Inntel Hotels", "25-06-2015", "27-06-2015")
Message flavours
Command Event
Imperative
"BookHotel"
Informational
"HotelWasBooked"
Message flavours
Query Document
Interrogatory
"GetRecentBookings"
Neutral
"BookingsCollection"
Sender
Construct the message
Message
Translate 

Construct

(Prepare for

transport)
Receiver
Deconstruct the message
(Unwrap)

Translate

Construct
Global design
principles can be
discovered
if we recognise the fact that
communication between objects and
applications are (more or less) equal
Communication between
objects
• Calling a function is like sending a message

• The function and its parameters are the message
type

• The arguments constitute the value of the message
class AccountService!
{!
! public function deposit($accountId, Money $amount)
! {!
! ! ...!
! }!
}
Opportunity for
sending a
message
Inter-object communication
$money = new Money(20000, 'EUR');!
$userId = 123;!
!
$accountService->deposit(!
! $userId, !
! $money!
);
Translation
The sender prepares the message for the receiver
Prepare the
message
Send the message
Communication between
applications
• An HTTP request is a message

• The HTTP method and URI are the type of the
message

• The HTTP request body constitutes the value of the
message
Or AMQP, Stomp, Gearman, ...
PUT /accounts/deposit/ HTTP/1.1!
Host: localhost!
!
{!
! "accountId": "123",!
! "currency": "EUR",!
! "amount": 20000!
}
Inter-application
communication
Opportunity for
sending a
message
$uri ='/accounts/deposit/';!
!
$data = json_encode([!
! 'accountId' => 123!
! 'currency' => 'EUR',!
! 'amount' => 20000!
]);!
!
$httpClient!
! ->createRequest('PUT', $uri, $data)!
! ->send();
Translation
Prepare the
message
Send the message
/** @Route("/accounts/deposit") */!
function depositAction(Request $request)!
{!
! $request = json_decode($request->getContent());!
! $money = new Money(!
! ! $request['amount'],!
! ! $request['currency']!
! );!
!
! $this->get('account_service')->deposit(!
! ! ! $request['accountId'],!
! ! ! $money!
! ! );!
!
! return new Response(null, 200);!
}!
Translation
Prepare the
message
Send the message
Global design
principles
Should be applicable to both inter-object and inter-application communication
Part I
Stability
III Implementation
II Information
Sender Receiver
Communication
Dependency
relation!
Stable Unstable
What is safer?
Unstable Stable
OR
To be stable
"Steady in position or balance;
firm"
Irresponsible
What makes something
unstable?
1. Nothing depends on it
It doesn't need to stay the same for
anyone
Dependent
What makes something
unstable?
2. It depends on many things
Any of the dependencies could change at
any time
Stability is not a
quality of one thing
It emerges from the environment
of that thing
Responsible
What makes something
stable?
1. Many things depend on it
It has to stay the same, because change would break dependents
Independent
What makes something
stable?
2. It depends on nothing
It is not affected by changes in
anything
–The Stable dependencies principle
Depend in the
direction of stability
Stable thing Unstable thing
What to do when this
happens?
Also stable
Half stable thingStable thing
Unstable thing
Depend on something
that you own
–The Dependency inversion principle
Always depend on abstractions,
not on concretions
Dependency inversion for
objects
• Depend on an interface instead of a class

• Separate a task from its implementation
Stable thing
Communication
between systems
External
application
(unstable)
Mediator
Stable thing
Slightly better
External
application
(unstable)
ConsumerApplication
Communication
between systems
Message
queue
External
application
(unstable)
Dependency inversion for
systems
• Depend on your own (messaging) system

• Communicate with other applications via a
message queue
Part II
Information
I Stability
III Implementation
Knowledge, data, duplication
Nameplate order
system
Nameplate
machine
Business automation for
creating nameplates
<h1>You are about to order a nameplate!</h1>!
!
<p>Name on the plate: {{ name }}<br/>!
Width of the plate: {{ 12*(name|length) }} cm.</p>!
Calculating the width of a
nameplate
Knowledge
class Nameplate!
{!
! private $name;!
!
! function __construct($name) {!
! ! $this->name = $name;!
! }!
!
! function widthInCm() {!
! ! return strlen($this->name) * 12;!
! }!
}
Data object
Knowledge is close to
the subject
<h1>You are about to order a nameplate!</h1>!
!
<p>Name on the plate: {{ nameplate.name }}<br/>!
Width of the plate: {{ nameplate.widthInCm) }}
cm.</p>!
No knowledge in the template
<nameplate>!
! <name>Ibuildings</name>!
</nameplate>
Serialized Nameplate object
// calculate the width of the nameplate!
!
$nameplate = deserialize($xml);!
$name = $nameplate['name'];!
!
$width = strlen($name);!
!
$widthPerCharacterInCm = 12;!
!
$widthInCm = $width * $widthPerCharacterInCm;!
!
// configure the nameplate machine ;)
Accepting messages
Duplication of knowledge
<nameplate>!
! <name>Buildings</name>!
! <width>120</width>!
</nameplate>
Deduplication
Knowledge is in one place,
facts can be everywhere
$nameplate = deserialize($xml);!
!
$width = $nameplate['width'];
Accepting messages
No duplicate knowledge
anymore
–The Don't repeat yourself principle
“Every piece of knowledge must
have a single, unambiguous,
authoritative representation
within a system.”
Even across applications!
"Don't repeat yourself"
• Doesn't mean you can't repeat data

• It means you can't have knowledge in multiple
locations
Mutability
What's the difference
between...
class Money!
{!
! private $amount;!
! private $currency;!
!
! public function setAmount($amount) {!
! ! $this->amount = $amount;!
! }!
!
! public function getAmount() {!
! ! return $this->amount;!
! }!
!
! ...!
}
... and this
class Money!
{!
! public $amount;!
! public $currency;!
}
Inconsistent data
$savings = new Money();!
$savings->setAmount(1000);!
!
// what's the currency at this point?!
!
$savings->setCurrency('USD');!
!
// only now do we have consistent data!
!
$savings->setCurrency('EUR');!
!
// we have a lot more money now!!
!
$savings->setAmount('Amsterdam');
Making something better of this
class Money!
{!
! private $amount;!
! private $currency;!
!
! public function __construct($amount, $currency) {!
! ! $this->setAmount($amount);!
! }!
!
! private function setAmount($amount) {!
! ! if (!is_int($amount) || $amount < 0) {!
! ! ! throw new InvalidArgumentException();!
! ! }!
!
! ! $this->amount = $amount;!
! }!
}
Private
Required
Immutability
• Once created, can not be modified

• Can only be replaced
Consistent data!
$savings = new Money(1000, 'USD');!
// we already have consistent data!
!
// we can't change anything anymore
Immutable data!
Using immutable values
• Prevents bugs

• Prevents invalid state
What about API messages?
<money>!
! <amount>1000</amount>!
! <currency>USD</currency>!
</money>
PUT /savings/
<money>!
! <currency>EUR</currency>!
</money>
POST /savings/
Large object graphs
<user>!
! <first-name/>!
! <last-name/> !
! <mobile-phone-number/> !
! <email-address/> !
! <homepage/> !
! <orders>!
! ! <order/>!
! ! ...!
! </orders>!
! <tickets>!
! ! <ticket/>!
! ! ...!
! </tickets>!
! <payments>!
! ! <payment/>!
! ! ...!
! </payments>!
</user>
Forms & Doctrine ORM
$form = $this->createForm(new MoneyType());!
$form->handleRequest($request);!
!
if ($form->isValid()) {!
! $em = $this->getDoctrine()->getManager();!
! $em->persist($form->getData());!
!
! // calculates change set and executes queries!
!
! $em->flush();!
}
If you allow your users to
change every field at any time
• You end up with inconsistent data

• You loose the why of a change

• You end up with the what of only the last change

• You ignore the underlying real-world scenario
Commands and events
Register ConrmRegistration
SendMessage
RegistrationConrmed
MessageSent
UserRegistered
Application
Tomorrow!
True
• Messages should serve actual use cases instead
of patch operations

• After processing them, data should be in a valid
state
Part III
Implementation
I Stability
II Information
IV Conclusion
Implementation
Leaking implementation
details
class Person!
{!
! /**!
! * @return PhoneNumber[]!
! */!
! public function getPhoneNumbers() {!
! ! return $this->phoneNumbers;!
! }!
}
Initial implementation
class Person!
{!
! /**!
! * @return ArrayCollection!
! */!
! public function getPhoneNumbers() {!
! ! return $this->phoneNumbers;!
! }!
}
Implementation leakage
(Doctrine)
class Person!
{!
! /**!
! * @return PhoneNumber[]!
! */!
! public function getPhoneNumbers() {!
! ! return $this->phoneNumbers->toArray();!
! }!
}
Hiding implementation
class NameplateController!
{!
! function getAction($id) {!
! ! $nameplate = $this!
! ! ! ->getDoctrine()!
! ! ! ->getManager()!
! ! ! ->getRepository(Nameplate::class)!
! ! ! ->findOneBy(['id' => $id]);!
!
! ! if ($nameplate === null) {!
! ! ! throw new NotFoundHttpException();!
! ! }!
! ! ...!
! }!
}
More implementation hiding
Actual eld names!
null or false?
"nd"?
class NameplateRepository!
{!
! function fromId($id) {!
! ! $nameplate = $this!
! ! ! ->findOneBy(['id' => $id]);!
!
! ! if ($nameplate === null) {!
! ! ! throw new NameplateNotFound($id);!
! ! }!
!
! ! return $nameplate;!
! }!
}
Push it out of sight
Domain-specic exception
Hide specic return value
No "nd"
class NameplateController!
{!
! function getAction($id) {!
! ! try {!
! ! ! $nameplate = $this!
! ! ! ! ->nameplateRepository!
! ! ! ! ->fromId($id);!
! ! } catch (NameplateNotFound $exception) {!
! ! ! throw new NotFoundHttpException();!
! ! }!
!
! ! ...!
! }!
}
Respect layers
Convert domain
exception to web
specic exception
Plain old OOP
• Encapsulation

• Abstraction
Limited by implementation
details
<ticket>!
...!
<priority type="integer">1</priority>!
...
Assembla API
We do "switch ($priority)"
<ticket>!
...!
<priority key="highest">!
<label>Highest</label>!
</priority>!
...
Why not...
<ticket>!
...!
<is-story type="boolean">false</is-story>!
<total-estimate type="float">0.0</total-estimate>!
...
Assembla API
Table "tickets" has a column
"is_story"
<story>!
...!
<total-estimate type="float">0.0</total-estimate>!
...
Why not...
Design your messages in such
a way that
• You hide your implementation

• Clients won't need to reimplement your application

• Clients get the information they need
API discovery
/**!
* @param string $password!
* @param integer $algo!
* @param array $options!
*/!
function password_hash($password, $algo, array $options = array());
Undiscoverable API
What are my options here?
And here?
class Algorithm extends SplEnum!
{!
! const __default = self::BCRYPT;!
!
! const BCRYPT = 1;!
}
Allow no mistakes
[!
! 'salt' => '...'!
! 'cost' => 10!
]
Options for bcrypt hashing
class Bcrypt implements HashingStrategy!
{!
! /**!
* @param integer $cost!
* @param string|null $salt!
*/!
! public function __construct($cost, $salt = null) {!
! ! ...!
! }!
}
Inject a strategy
function password_hash(!
! $password, !
! HashingStrategy $hashingStrategy!
);
Inject a strategy
More explicit and...
discoverable!
Discoverability of an API
• Full Reflection capabilities :)

• Basic knowledge of English
// I've got this password!
$password = ...;!
// I want to hash it...!
// I found a function for this: password_hash()!
password_hash($password, HashingStrategy $hashingStrategy);!
// It requires an argument: a password (string)!
// I already got a password right here:!
password_hash($password);!
// Wait, it requires a hashing strategy (a HashingStrategy object)!
// I just found a class implementing that interface:!
$hashingStrategy = new BcryptStrategy();!
// That doesn't work, BcryptStrategy needs a cost!
$hashingStrategy = new BcryptStrategy(10);!
password_hash($password, $hashingStrategy);
Example of API discovery
Who is talking?
How stupid are they?
How do you nd out a valid range?
/**!
* @param array $options!
*/!
function some_function(array $options);!
!
/**!
* @param integer $type!
*/!
function some_other_function($type);!
!
/**!
* @param object $command!
*/!
function handle($command);
Undiscoverable APIs
Any kind of API should be
maximally discoverable
Everything should be an object
A class is a type
Define lots of interfaces
An interface denes the
public API of functions
<?xml version="1.0" encoding="UTF-8"?>!
<ticket>!
<reporter>!
<id>43</id>!
<link rel="self" href="/api/reporters/43" />!
<link rel="index" href="/api/reporters/" />!
</reporter>!
...
HATEOAS
Links are a way to explain an "object"
In summary
• Objects are just like applications

• Try to apply the same rules to them
Think about
• Stable dependencies

• Duplication of facts, not knowledge

• Immutability over mutability

• No leakage of implementation details

• Everything should be maximally discoverable
Questions? Feedback?
joind.in/14217 Thanks!

Weitere ähnliche Inhalte

Andere mochten auch

Programming with Cmdr. Chris Hadfield
Programming with Cmdr. Chris HadfieldProgramming with Cmdr. Chris Hadfield
Programming with Cmdr. Chris HadfieldMatthias Noback
 
Integrating Bounded Contexts - Mini-workshop
Integrating Bounded Contexts - Mini-workshopIntegrating Bounded Contexts - Mini-workshop
Integrating Bounded Contexts - Mini-workshopMatthias Noback
 
Hexagonal architecture - message-oriented software design
Hexagonal architecture  - message-oriented software designHexagonal architecture  - message-oriented software design
Hexagonal architecture - message-oriented software designMatthias Noback
 
The quest for global design principles (SymfonyLive Berlin 2015)
The quest for global design principles (SymfonyLive Berlin 2015)The quest for global design principles (SymfonyLive Berlin 2015)
The quest for global design principles (SymfonyLive Berlin 2015)Matthias Noback
 
Beyond Design Patterns and Principles - PHPBenelux 2017
Beyond Design Patterns and Principles - PHPBenelux 2017Beyond Design Patterns and Principles - PHPBenelux 2017
Beyond Design Patterns and Principles - PHPBenelux 2017Matthias Noback
 
Tactical DDD (just better OOP?) - PHPBenelux 2017
Tactical DDD (just better OOP?) - PHPBenelux 2017Tactical DDD (just better OOP?) - PHPBenelux 2017
Tactical DDD (just better OOP?) - PHPBenelux 2017Matthias Noback
 
High Quality Symfony Bundles tutorial - Dutch PHP Conference 2014
High Quality Symfony Bundles tutorial - Dutch PHP Conference 2014High Quality Symfony Bundles tutorial - Dutch PHP Conference 2014
High Quality Symfony Bundles tutorial - Dutch PHP Conference 2014Matthias Noback
 

Andere mochten auch (7)

Programming with Cmdr. Chris Hadfield
Programming with Cmdr. Chris HadfieldProgramming with Cmdr. Chris Hadfield
Programming with Cmdr. Chris Hadfield
 
Integrating Bounded Contexts - Mini-workshop
Integrating Bounded Contexts - Mini-workshopIntegrating Bounded Contexts - Mini-workshop
Integrating Bounded Contexts - Mini-workshop
 
Hexagonal architecture - message-oriented software design
Hexagonal architecture  - message-oriented software designHexagonal architecture  - message-oriented software design
Hexagonal architecture - message-oriented software design
 
The quest for global design principles (SymfonyLive Berlin 2015)
The quest for global design principles (SymfonyLive Berlin 2015)The quest for global design principles (SymfonyLive Berlin 2015)
The quest for global design principles (SymfonyLive Berlin 2015)
 
Beyond Design Patterns and Principles - PHPBenelux 2017
Beyond Design Patterns and Principles - PHPBenelux 2017Beyond Design Patterns and Principles - PHPBenelux 2017
Beyond Design Patterns and Principles - PHPBenelux 2017
 
Tactical DDD (just better OOP?) - PHPBenelux 2017
Tactical DDD (just better OOP?) - PHPBenelux 2017Tactical DDD (just better OOP?) - PHPBenelux 2017
Tactical DDD (just better OOP?) - PHPBenelux 2017
 
High Quality Symfony Bundles tutorial - Dutch PHP Conference 2014
High Quality Symfony Bundles tutorial - Dutch PHP Conference 2014High Quality Symfony Bundles tutorial - Dutch PHP Conference 2014
High Quality Symfony Bundles tutorial - Dutch PHP Conference 2014
 

Ähnlich wie Global design principles for stable APIs

The Quest for Global Design Principles
The Quest for Global Design PrinciplesThe Quest for Global Design Principles
The Quest for Global Design PrinciplesMatthias Noback
 
Beyond MVC: from Model to Domain
Beyond MVC: from Model to DomainBeyond MVC: from Model to Domain
Beyond MVC: from Model to DomainJeremy Cook
 
Writing Testable Code
Writing Testable CodeWriting Testable Code
Writing Testable Codejameshalsall
 
Code decoupling from Symfony (and others frameworks) - PHP Conference Brasil ...
Code decoupling from Symfony (and others frameworks) - PHP Conference Brasil ...Code decoupling from Symfony (and others frameworks) - PHP Conference Brasil ...
Code decoupling from Symfony (and others frameworks) - PHP Conference Brasil ...Miguel Gallardo
 
How I Learned to Stop Worrying and Love Legacy Code - Ox:Agile 2018
How I Learned to Stop Worrying and Love Legacy Code - Ox:Agile 2018How I Learned to Stop Worrying and Love Legacy Code - Ox:Agile 2018
How I Learned to Stop Worrying and Love Legacy Code - Ox:Agile 2018Mike Harris
 
Django è pronto per l'Enterprise
Django è pronto per l'EnterpriseDjango è pronto per l'Enterprise
Django è pronto per l'EnterprisePyCon Italia
 
Domain oriented development
Domain oriented developmentDomain oriented development
Domain oriented developmentrajmundr
 
Pragmatic Event Driven Microservices
Pragmatic Event Driven MicroservicesPragmatic Event Driven Microservices
Pragmatic Event Driven MicroservicesAllard Buijze
 
Microservices Practitioner Summit Jan '15 - Don't Build a Distributed Monolit...
Microservices Practitioner Summit Jan '15 - Don't Build a Distributed Monolit...Microservices Practitioner Summit Jan '15 - Don't Build a Distributed Monolit...
Microservices Practitioner Summit Jan '15 - Don't Build a Distributed Monolit...Ambassador Labs
 
Software Patterns
Software PatternsSoftware Patterns
Software PatternsArtem Tabalin
 
Rethink Smalltalk
Rethink SmalltalkRethink Smalltalk
Rethink SmalltalkESUG
 
Advanced web application architecture Way2Web
Advanced web application architecture Way2WebAdvanced web application architecture Way2Web
Advanced web application architecture Way2WebMatthias Noback
 
Microservices with .Net - NDC Sydney, 2016
Microservices with .Net - NDC Sydney, 2016Microservices with .Net - NDC Sydney, 2016
Microservices with .Net - NDC Sydney, 2016Richard Banks
 
Software Architectures, Week 4 - Message-based Architectures, Message Bus
Software Architectures, Week 4 - Message-based Architectures, Message BusSoftware Architectures, Week 4 - Message-based Architectures, Message Bus
Software Architectures, Week 4 - Message-based Architectures, Message BusAngelos Kapsimanis
 
Nelson: Rigorous Deployment for a Functional World
Nelson: Rigorous Deployment for a Functional WorldNelson: Rigorous Deployment for a Functional World
Nelson: Rigorous Deployment for a Functional WorldTimothy Perrett
 
Advanced web application architecture - Talk
Advanced web application architecture - TalkAdvanced web application architecture - Talk
Advanced web application architecture - TalkMatthias Noback
 
Beyond MVC: from Model to Domain
Beyond MVC: from Model to DomainBeyond MVC: from Model to Domain
Beyond MVC: from Model to DomainJeremy Cook
 
Graphel: A Purely Functional Approach to Digital Interaction
Graphel: A Purely Functional Approach to Digital InteractionGraphel: A Purely Functional Approach to Digital Interaction
Graphel: A Purely Functional Approach to Digital Interactionmtrimpe
 
Apiworld
ApiworldApiworld
ApiworldOwen Rubel
 

Ähnlich wie Global design principles for stable APIs (20)

The Quest for Global Design Principles
The Quest for Global Design PrinciplesThe Quest for Global Design Principles
The Quest for Global Design Principles
 
Beyond MVC: from Model to Domain
Beyond MVC: from Model to DomainBeyond MVC: from Model to Domain
Beyond MVC: from Model to Domain
 
Writing Testable Code
Writing Testable CodeWriting Testable Code
Writing Testable Code
 
Code decoupling from Symfony (and others frameworks) - PHP Conference Brasil ...
Code decoupling from Symfony (and others frameworks) - PHP Conference Brasil ...Code decoupling from Symfony (and others frameworks) - PHP Conference Brasil ...
Code decoupling from Symfony (and others frameworks) - PHP Conference Brasil ...
 
How I Learned to Stop Worrying and Love Legacy Code - Ox:Agile 2018
How I Learned to Stop Worrying and Love Legacy Code - Ox:Agile 2018How I Learned to Stop Worrying and Love Legacy Code - Ox:Agile 2018
How I Learned to Stop Worrying and Love Legacy Code - Ox:Agile 2018
 
Django è pronto per l'Enterprise
Django è pronto per l'EnterpriseDjango è pronto per l'Enterprise
Django è pronto per l'Enterprise
 
Domain oriented development
Domain oriented developmentDomain oriented development
Domain oriented development
 
Pragmatic Event Driven Microservices
Pragmatic Event Driven MicroservicesPragmatic Event Driven Microservices
Pragmatic Event Driven Microservices
 
Microservices Practitioner Summit Jan '15 - Don't Build a Distributed Monolit...
Microservices Practitioner Summit Jan '15 - Don't Build a Distributed Monolit...Microservices Practitioner Summit Jan '15 - Don't Build a Distributed Monolit...
Microservices Practitioner Summit Jan '15 - Don't Build a Distributed Monolit...
 
Software Patterns
Software PatternsSoftware Patterns
Software Patterns
 
Domain Event - The Hidden Gem of DDD
Domain Event - The Hidden Gem of DDDDomain Event - The Hidden Gem of DDD
Domain Event - The Hidden Gem of DDD
 
Rethink Smalltalk
Rethink SmalltalkRethink Smalltalk
Rethink Smalltalk
 
Advanced web application architecture Way2Web
Advanced web application architecture Way2WebAdvanced web application architecture Way2Web
Advanced web application architecture Way2Web
 
Microservices with .Net - NDC Sydney, 2016
Microservices with .Net - NDC Sydney, 2016Microservices with .Net - NDC Sydney, 2016
Microservices with .Net - NDC Sydney, 2016
 
Software Architectures, Week 4 - Message-based Architectures, Message Bus
Software Architectures, Week 4 - Message-based Architectures, Message BusSoftware Architectures, Week 4 - Message-based Architectures, Message Bus
Software Architectures, Week 4 - Message-based Architectures, Message Bus
 
Nelson: Rigorous Deployment for a Functional World
Nelson: Rigorous Deployment for a Functional WorldNelson: Rigorous Deployment for a Functional World
Nelson: Rigorous Deployment for a Functional World
 
Advanced web application architecture - Talk
Advanced web application architecture - TalkAdvanced web application architecture - Talk
Advanced web application architecture - Talk
 
Beyond MVC: from Model to Domain
Beyond MVC: from Model to DomainBeyond MVC: from Model to Domain
Beyond MVC: from Model to Domain
 
Graphel: A Purely Functional Approach to Digital Interaction
Graphel: A Purely Functional Approach to Digital InteractionGraphel: A Purely Functional Approach to Digital Interaction
Graphel: A Purely Functional Approach to Digital Interaction
 
Apiworld
ApiworldApiworld
Apiworld
 

Mehr von Matthias Noback

Rector fireside chat - PHPMiNDS meetup
Rector fireside chat - PHPMiNDS meetupRector fireside chat - PHPMiNDS meetup
Rector fireside chat - PHPMiNDS meetupMatthias Noback
 
Service abstractions - Part 1: Queries
Service abstractions - Part 1: QueriesService abstractions - Part 1: Queries
Service abstractions - Part 1: QueriesMatthias Noback
 
Hexagonal Symfony - SymfonyCon Amsterdam 2019
Hexagonal Symfony - SymfonyCon Amsterdam 2019Hexagonal Symfony - SymfonyCon Amsterdam 2019
Hexagonal Symfony - SymfonyCon Amsterdam 2019Matthias Noback
 
Advanced web application architecture - PHP Barcelona
Advanced web application architecture  - PHP BarcelonaAdvanced web application architecture  - PHP Barcelona
Advanced web application architecture - PHP BarcelonaMatthias Noback
 
A testing strategy for hexagonal applications
A testing strategy for hexagonal applicationsA testing strategy for hexagonal applications
A testing strategy for hexagonal applicationsMatthias Noback
 
DPC 2019, Amsterdam: Beyond design patterns and principles - writing good OO ...
DPC 2019, Amsterdam: Beyond design patterns and principles - writing good OO ...DPC 2019, Amsterdam: Beyond design patterns and principles - writing good OO ...
DPC 2019, Amsterdam: Beyond design patterns and principles - writing good OO ...Matthias Noback
 
Layers, ports and adapters
Layers, ports and adaptersLayers, ports and adapters
Layers, ports and adaptersMatthias Noback
 
Beyond design principles and patterns (muCon 2019 edition)
Beyond design principles and patterns (muCon 2019 edition)Beyond design principles and patterns (muCon 2019 edition)
Beyond design principles and patterns (muCon 2019 edition)Matthias Noback
 
Brutal refactoring, lying code, the Churn, and other emotional stories from L...
Brutal refactoring, lying code, the Churn, and other emotional stories from L...Brutal refactoring, lying code, the Churn, and other emotional stories from L...
Brutal refactoring, lying code, the Churn, and other emotional stories from L...Matthias Noback
 
Brutal refactoring, lying code, the Churn, and other emotional stories from L...
Brutal refactoring, lying code, the Churn, and other emotional stories from L...Brutal refactoring, lying code, the Churn, and other emotional stories from L...
Brutal refactoring, lying code, the Churn, and other emotional stories from L...Matthias Noback
 
Beyond Design Principles and Patterns
Beyond Design Principles and PatternsBeyond Design Principles and Patterns
Beyond Design Principles and PatternsMatthias Noback
 
Building Autonomous Services
Building Autonomous ServicesBuilding Autonomous Services
Building Autonomous ServicesMatthias Noback
 
Advanced Application Architecture Symfony Live Berlin 2018
Advanced Application Architecture Symfony Live Berlin 2018Advanced Application Architecture Symfony Live Berlin 2018
Advanced Application Architecture Symfony Live Berlin 2018Matthias Noback
 
Designing for Autonomy
Designing for AutonomyDesigning for Autonomy
Designing for AutonomyMatthias Noback
 
Docker swarm workshop
Docker swarm workshopDocker swarm workshop
Docker swarm workshopMatthias Noback
 
Docker compose workshop
Docker compose workshopDocker compose workshop
Docker compose workshopMatthias Noback
 
Building autonomous services
Building autonomous servicesBuilding autonomous services
Building autonomous servicesMatthias Noback
 
Designing for autonomy
Designing for autonomyDesigning for autonomy
Designing for autonomyMatthias Noback
 
Advanced application architecture
Advanced application architectureAdvanced application architecture
Advanced application architectureMatthias Noback
 

Mehr von Matthias Noback (20)

Rector fireside chat - PHPMiNDS meetup
Rector fireside chat - PHPMiNDS meetupRector fireside chat - PHPMiNDS meetup
Rector fireside chat - PHPMiNDS meetup
 
Service abstractions - Part 1: Queries
Service abstractions - Part 1: QueriesService abstractions - Part 1: Queries
Service abstractions - Part 1: Queries
 
Hexagonal Symfony - SymfonyCon Amsterdam 2019
Hexagonal Symfony - SymfonyCon Amsterdam 2019Hexagonal Symfony - SymfonyCon Amsterdam 2019
Hexagonal Symfony - SymfonyCon Amsterdam 2019
 
Advanced web application architecture - PHP Barcelona
Advanced web application architecture  - PHP BarcelonaAdvanced web application architecture  - PHP Barcelona
Advanced web application architecture - PHP Barcelona
 
A testing strategy for hexagonal applications
A testing strategy for hexagonal applicationsA testing strategy for hexagonal applications
A testing strategy for hexagonal applications
 
DPC 2019, Amsterdam: Beyond design patterns and principles - writing good OO ...
DPC 2019, Amsterdam: Beyond design patterns and principles - writing good OO ...DPC 2019, Amsterdam: Beyond design patterns and principles - writing good OO ...
DPC 2019, Amsterdam: Beyond design patterns and principles - writing good OO ...
 
Layers, ports and adapters
Layers, ports and adaptersLayers, ports and adapters
Layers, ports and adapters
 
Beyond design principles and patterns (muCon 2019 edition)
Beyond design principles and patterns (muCon 2019 edition)Beyond design principles and patterns (muCon 2019 edition)
Beyond design principles and patterns (muCon 2019 edition)
 
Brutal refactoring, lying code, the Churn, and other emotional stories from L...
Brutal refactoring, lying code, the Churn, and other emotional stories from L...Brutal refactoring, lying code, the Churn, and other emotional stories from L...
Brutal refactoring, lying code, the Churn, and other emotional stories from L...
 
Brutal refactoring, lying code, the Churn, and other emotional stories from L...
Brutal refactoring, lying code, the Churn, and other emotional stories from L...Brutal refactoring, lying code, the Churn, and other emotional stories from L...
Brutal refactoring, lying code, the Churn, and other emotional stories from L...
 
Beyond Design Principles and Patterns
Beyond Design Principles and PatternsBeyond Design Principles and Patterns
Beyond Design Principles and Patterns
 
Building Autonomous Services
Building Autonomous ServicesBuilding Autonomous Services
Building Autonomous Services
 
Advanced Application Architecture Symfony Live Berlin 2018
Advanced Application Architecture Symfony Live Berlin 2018Advanced Application Architecture Symfony Live Berlin 2018
Advanced Application Architecture Symfony Live Berlin 2018
 
Designing for Autonomy
Designing for AutonomyDesigning for Autonomy
Designing for Autonomy
 
Docker workshop
Docker workshopDocker workshop
Docker workshop
 
Docker swarm workshop
Docker swarm workshopDocker swarm workshop
Docker swarm workshop
 
Docker compose workshop
Docker compose workshopDocker compose workshop
Docker compose workshop
 
Building autonomous services
Building autonomous servicesBuilding autonomous services
Building autonomous services
 
Designing for autonomy
Designing for autonomyDesigning for autonomy
Designing for autonomy
 
Advanced application architecture
Advanced application architectureAdvanced application architecture
Advanced application architecture
 

KĂźrzlich hochgeladen

A Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docxA Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docxComplianceQuest1
 
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfLearn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfkalichargn70th171
 
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICECHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE9953056974 Low Rate Call Girls In Saket, Delhi NCR
 
Diamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with PrecisionDiamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with PrecisionSolGuruz
 
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsUnveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsAlberto GonzĂĄlez Trastoy
 
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...kellynguyen01
 
Test Automation Strategy for Frontend and Backend
Test Automation Strategy for Frontend and BackendTest Automation Strategy for Frontend and Backend
Test Automation Strategy for Frontend and BackendArshad QA
 
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AI
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AISyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AI
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AIABDERRAOUF MEHENNI
 
Salesforce Certified Field Service Consultant
Salesforce Certified Field Service ConsultantSalesforce Certified Field Service Consultant
Salesforce Certified Field Service ConsultantAxelRicardoTrocheRiq
 
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...gurkirankumar98700
 
Microsoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdfMicrosoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdfWilly Marroquin (WillyDevNET)
 
5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdf5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdfWave PLM
 
TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providermohitmore19
 
Software Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsSoftware Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsArshad QA
 
why an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdfwhy an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdfjoe51371421
 
HR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comHR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comFatema Valibhai
 
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...MyIntelliSource, Inc.
 
Active Directory Penetration Testing, cionsystems.com.pdf
Active Directory Penetration Testing, cionsystems.com.pdfActive Directory Penetration Testing, cionsystems.com.pdf
Active Directory Penetration Testing, cionsystems.com.pdfCionsystems
 
Optimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTVOptimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTVshikhaohhpro
 
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...ICS
 

KĂźrzlich hochgeladen (20)

A Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docxA Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docx
 
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfLearn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
 
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICECHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
 
Diamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with PrecisionDiamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with Precision
 
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsUnveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
 
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
 
Test Automation Strategy for Frontend and Backend
Test Automation Strategy for Frontend and BackendTest Automation Strategy for Frontend and Backend
Test Automation Strategy for Frontend and Backend
 
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AI
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AISyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AI
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AI
 
Salesforce Certified Field Service Consultant
Salesforce Certified Field Service ConsultantSalesforce Certified Field Service Consultant
Salesforce Certified Field Service Consultant
 
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
 
Microsoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdfMicrosoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdf
 
5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdf5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdf
 
TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service provider
 
Software Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsSoftware Quality Assurance Interview Questions
Software Quality Assurance Interview Questions
 
why an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdfwhy an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdf
 
HR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comHR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.com
 
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
 
Active Directory Penetration Testing, cionsystems.com.pdf
Active Directory Penetration Testing, cionsystems.com.pdfActive Directory Penetration Testing, cionsystems.com.pdf
Active Directory Penetration Testing, cionsystems.com.pdf
 
Optimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTVOptimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTV
 
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
 

Global design principles for stable APIs