Embrace Events
and let CRUD die
@cakper
Goal
CRUD
Who knows what
CRUD is?
Clients
Database
DTO’s/DomainObjects
Data
Presentation
Service
Business Logic
Well known
Easy to sell
Tooling
Who never had
problems with it?
Soft Delete
Audit
Calculating
changes
Scaling
3rd Normal Form
Optimised
for write
Large & slow
queries
But that’s good!
In the WRITE
context
What is your
write:read ratio?
Some of the applications
are read heavy
Joins are expensive
Can’t we all become
join vegans?
Alberto Brandolini
Denormalisation
Read models
You have to maintain
two models now
What if we treat change
as a first class citizen?
Event Sourcing
Book added
to library
Book lent
to reader
Book
extended
Book
returned
Event
1. something that happens or is
regarded as happening; an
occurrence, especially one of
some importance.
Current state is a left-fold
over past events
Greg Young
Aggregate
Consistency
boundary
Consuming
commands
Producing
events
Reconstituting
from history
Snapshotting
Testing
State-based
testing
We test what
changed
What about things
that didn’t?
Behaviour-based
testing
Given:	
Book	“DDD”	was	added	to	library	
When:	
Reader	lends	“DDD”	book	
Then:	
Book	“DDD”	was	lent	to	reader
Given:	
Book	“DDD”	was	added	to	library	
Book	“DDD”	was	lent	to	reader	
When:	
Reader	lends	“DDD”	book	
Then:	
Exception:	Book	“DDD”	already	lent
Event Store
Append-only
Scaling
Optimistic locking
Retries
Integration
MQ
REST
2PC
Eventual
consistency
Projections
Query optimised
storage
Task-based UI
Business Value 

of Events
Insight into
past data
Business
Intelligence
Legal compliance
Debugging
How do we get
there?
Event Storming
odd-looking workshop
that has a massive consumption
of orange sticky notes
Alberto Brandolini
How does it work?
Start by capturing
Domain Events
Domain Event
Book added
to library
Book extended
Book
added to
inventory
Reader
identity
confirmed
Reader
registered
Book
reservation
placed
Book lent
to reader
Book recalled
Book returned
Behavioural
mindset
Timeline
Book added
to library
Book extended
Book
added to
inventory
Reader
identity
confirmed
Reader
registered
Book
reservation
placed
Book lent
to reader
Book recalled
Book returned
Naming
Book added
to library
Book extended
Book
added to
inventory
Reader
identity
confirmed
Reader
registered
Book
reservation
placed
Book lent
to reader
Book recalled
Book returned
Complexity
Reader
registered
Reader
identity
confirmed
Identity
Confirmed by
Carer
Deposit paid
Deposit Not
Paid
Reader
Account
Activated
Pin point risks
Risk
Reader
registered
Reader
identity
confirmed
Identity
Confirmed by
Carer
Deposit paid
Deposit Not
Paid
Reader
Account
Activated
Registration
Right People
Event sources
Users
Command
Book Lent
Lend Book
Reader
Book Already
Lent
Other events
Policy
Book
Returned
Late
Penalize Lock Account
Time
Book reserved
for the user
Release book
External systems
External System
Payment Gate
Money
Received
Grouping
commands
Aggregates
Book Lent
Book
Returned
Book
Book
Extended
Return
Lend
Extend
Making decision
Read Model
Book
Returned
Book Added
Book Lent
Available
Books
Making it work
Available
Books
Reader
Lend Book Book Lent
User
Command
Aggregate
External
System
Domain Event
Read Model
Policy
Command
UI
Picture that explains everything
by Alberto Brandolini
Want to
facilitate it?
Unlimited
modelling surface
No chairs
Loads of sticky
notes & sharpies
People with
questions
People with
answers!
Final words
Tools
Event Store
Messaging
Projections
Right problems
Make models useful
but not perfect
Explicit
Complexity
Intention-revealing
interfaces
Writing software
is about learning
Technical
excellence
Thanks!
@cakper

Embrace Events and let CRUD die