Store the sensitive payload of an event in a separate store to control access and removal.
An Event Store is an append-only chronological database of Domain Events , so ideally we never remove any event or event data. This poses a problem when data needs to be deleted, for …
Throw Away the Key
Encrypt sensistive information in an event and delete the key.
The problem is the same as for Forgettable Payloads : some attributes of an event should not be read by all consumers, and we should be able to delete them, without touching the event store.
Encrypt the …
Segregated Event Layers
Explicitly segregate a Bounded Context’s events in visibility layers, with their own language.
The problem is the same as described in Explicit Public Events . Sometimes marking some events as public is not enough. You really need to be able to evolve the internal events …
Explicit Public Events
Mark a small subset of events as public, keep the rest private by default.
Domain Events are not only useful for communicating to other Bounded Contexts , but also for organising and decoupling code inside the Bounded Context . In CQRS/Eventsourcing architectures, this is …
Add redundant information to a Domain Event to reduce complexity in the consumer.
A consumer is interested in one event type from a producer, to react to it or report information to a user. The producer’s events are designed with a Completeness Guarantee . The event only contains the …
Passage of Time Event
Replace cron jobs and scheduled commands, with an agnostic event to indicate the passage of time.
Many business processes involve some action or job or workload that needs to be performed at a future date. It can be a one-off action or a repeated action, it can be scheduled for a …
Design the set of Domain Events from a producer so that they can be used to rebuild the producer’s state.
Often, the events emitted by a producer, are designed haphazardly. New event types are added whenever a new feature requires them. A consumer needs to be aware of an event, …
Replace Free Queries with Domain Queries to decouple from knowledge of the server’s internals.
The word query is usually associated with database queries. There are however other ways we can query a system that we don’t perceive as a database. REST and GraphQL come to mind. I propose the …
Instead of emitting a stream of Domain Events, emit a single Summary.
A business process involves a number of steps that each produce domain events. A consumer depends on information in those events, and listens to all of them to make meaningful decisions. This in itself is perfectly …
Video for my DDD eXchange 2018 keynote in London
Software design principles aspire to be universal. And yet, when you create software, you sometimes intentionally violate principles.
You might not be able to explain why this “wrong” design somehow “feels” better. You’re applying your own, …
Video of my DDD eXchange 2017 talk in London
Video of my ExploreDDD 2017 talk in Denver
Modelling is more than knowledge management. It’s complexity management. To reduce cognitive load, you split things up, whether at small scale, in code, or in the large, such as Bounded Contexts. But if …
Video of my talk at Agile Testing & BDD eXchange 2016 in London
Video of my talk at the DDD London meetup
“Make the implicit explicit” must be one of the most valuable advices I ever got about software modelling and design. Gather around for some tales from the trenches: stories from …
Video & slides for my NCrafts talk on software metaphors.
When we model, we tend to do it for ourselves: gain understanding, capture the business language, and turn it into running code. But are we missing opportunities to do something more with our models? What if, instead of mirroring the …
I submitted proposals to conferences for almost two years before getting accepted. When it finally happened, I found myself in front of a 250 head audience, realising I didn’t actually know how to do proper presentations . I wish I knew then that there are better ways.
Lightning talks at meetups are ideal to …
Technical Debt is a great metaphor. It shares many analogous properties with financial debt: loans, accrued interest, token payments, bankrupty… There is a key difference however. We take financial debt with another party. This party desires to get their money back eventually, and then some. Over centuries, a system …
Gated pre-merge code reviews are bad. Always refactor on master. Always do Pair Programming. Don’t use branches. Apply Continuous Integration.
Best practices likes these are great. They encode experiences of many individuals and teams into memorable slogans, and help others to make decisions on how to run their …
Below is an attempt at illustrating a design/redesign process I went through at a client, who’s started refactoring the core systems their business depends on. Design is the part of software development that is the most messy, the hardest to fit into rules or well-defined processes. In fact, while writing this post, I …
Here’s a bunch of books that I like, that seem to have a lasting influence on me, or that I talk about a lot when giving presentations or teaching workshops. They’re somewhat grouped and ordered, but don’t read too much into that. For a more complete(-ish) list of books I’ve read, my Kindle page is likely the most …
We’re bringing you some exciting workshops in the coming months. Register today to ensure your spot!
Experiencing Domain-Driven Design
The full three day advanced workshop, with lots of hands on modelling, Event Storming, Context Mapping, CQRS/ES, heuristics, and much more.
Experiencing Domain-Driven …