Are you looking for practical knowledge
about software architecture?
Check out my content - from articles to videos
My name is Oskar Dudycz. From over 14 years, I'm creating software close to the business.
I run workshops and training about Event Sourcing, CQRS and event-driven architectures.
I'm co-maintainer of Marten OSS library that allows implementing Event Sourcing.
On the blog, I share my knowledge of how to create good, modular applications pragmatically.
A few tricks on how to set up related Docker images with docker-compose
In the last few days, I have been working on guidance on piping EventStoreDB logs into Elasticsearch. ELK stack (so Elasticsearch, Logstash…
Persistent vs catch-up, EventStoreDB subscriptions in action
Events can be a great facilitator and glue for business workflows. Subscriptions are an essential block of the event-driven system. They…
How to build a simple event pipeline
Today we will deal with event consumption. I’ll also explain how I wrote the new version of the MediatR library. Curious? We’ll get to that…
Are Temporal Tables an alternative to Event Sourcing?
I’ve been asked recently at least a few times about Temporal Tables and how they relate to Event Sourcing. Beware, and don’t confuse it with…
Agile vs Introverts
I had this thought: most of the “Agile” methodologies and tools are invented by extroverts. Perhaps this is also why, although they are…
The risk of ignoring risks
Do you like playing poker? I used to play Texas Holdem with my friends regularly. We took it easy; each person put 5 PLN into the pool, and…
Twelve things I learned about Java during my last code review
As I have mentioned to you many times, I like to test different approaches, technologies and solutions. I may not have told you yet that I…
Small rant about the Software Design
Some time ago, I listened to an enlightening episode of Scott Hanselman’s podcast on how to teach computer science. The guest was Maria…
Introduction to Event Sourcing - Self Paced Kit
For many developers, Event Sourcing is like a Nessie, most of them have heard of it, but not many saw it. I was one of them. I started my…
How to ensure uniqueness in Event Sourcing
“How do I ensure uniqueness? For example, a unique username or an invoice number.” That’s usually one of the first questions I hear from…
“I'm not interested in politics” is not actual anymore
War. War never changes… In IT, we’re living in a bubble. Compared to others we have good working conditions. We learned to complain about…
15 tips on how to run meetings effectively
It’s always worth talking things through! But is it worth meeting? During my career, I have seen many projects and companies where the…
Immutable Value Objects are simpler and more useful than you think!
I love proper typing. But what does that even mean? I could say that this is a types’ structure defined in a self-explanatory way. But that…
How to quickly scale a legacy monolith?
Working with a legacy monolith is not easy. For years we learned how to tame that beast gently. We nurtured it and tried not to break it. We…
I tested it on production and I'm not ashamed of it
Testing on production usually appears in ridiculous stories. They may be only annoyances like getting questions from customers why they see…
A simple trick for idempotency handling in the Elastic Search read model
Idempotency is a word worth watching out for. It’s easy to miss a few letters and bang, and we have a problem. It is also a general problem…
Using strongly-typed identifiers with Marten
Let’s say that you have the following class definition: Now you can create instance using: So far, so good. What if we accidentally mixed…
Should a programmer's creativity be shown in code formatting?
Each of us has at least a dose of creativity. I have always liked drawing. I wanted to make effective plays in football. Today, I play the…
No, it can never happen!
“No, it can never happen!”. Have you heard this sentence before? For example, a user with the same e-mail address may not register, or the…
Integrating Marten with other systems
In Event Sourcing, events are the source of truth. We save them in the event store to have a permanent history of facts about business…
How to do snapshots in Marten?
Getting the state from events is a basic but controversial topic in Event Sourcing. I wrote on it longer in other article. To recap…
CQRS is simpler than you think with .NET 6 and C# 10
.NET and CQRS are well known for the high ceremony and enterprise feeling. You should treat that as superstition. Let me tell you why. CQRS…
Simple patterns for events schema versioning
Events (schema) versioning is a boogeyman for people learning Event Sourcing. They’re a spooky tale told at the campfire. There’s a truth in…
Event Streaming is not Event Sourcing!
I’m not a HackerNews or Reddit type of guy. I don’t have enough time to waste on them. That said, I cannot deny that they’re powerful…
How to register all CQRS handlers by convention
In CQRS, it’s common to define interfaces for the handlers to enforce the unified code structure. Such an approach is used, e.g. by MediatR…
Long-polling, how to make our async API synchronous
I’ll continue today a topic of handling eventual consistency that I started in the previous article. This time let’s learn the trick called…
Dealing with Eventual Consistency and Idempotency in MongoDB projections
Auditability, diagnostics, time travelling are usually the first mentioned features when speaking about Event Sourcing. All of them are…
How to use ETag header for optimistic concurrency
In my article “Optimistic concurrency for the pesimistic times”, I described the premises for optimistic concurrency handling. As a reminder…
Tell, don't ask! Or, how to keep an eye on boiling milk
Some time ago, I thought about writing a cookbook for guys, a set of essential tips on surviving in the kitchen. I thought of starting with…
What does Mr Bean opening the car have to do with programming?
Before reading the article, please watch the video below: Mr Bean wants to add a new business feature to the project. First, the entity…
What does a construction failure have to do with our authorities?
Through my window, I see the result of good plans but poor execution. Opposite my flat, there is a partially completed construction place…
Let's talk about positions in event stores
Discussions about positions can be awkward, to say the least… It is also the case with positions in Event Sourcing. Each event store…
How to build event-driven projections with Entity Framework
Let’s assume that you’re building an Event-Driven system. You may be using Event Sourcing or microservices integrated with message bus or…
10 notes on the 10th blogging anniversary
Yesterday, precisely ten years passed since I released my first blog post. It’s still available in the original place (in Polish) at…
Anti-patterns in event modelling - State Obsession
Some time ago, I tackled the first event modelling anti-pattern: “Property Sourcing”. Today I’d like to tackle the next one: “State…
How to slice the codebase effectively?
The structure of projects is as sensitive as the discussions of spaces versus tabs or indentation size. When we enter someone’s apartment…
Will it scale... down?
Some time ago, I wrote that there aren’t many more annoying questions than “…but will this scale?!”. We usually think prematurely about…
Computer says no! Why we might have an issue with Artificial Intelligence soon
Some time ago, I was doing a pilot project for two well-known American fast-food brands. It was about using image processing and artificial…
Anti-patterns in event modelling - Property Sourcing
The first time I got down to work at Event Sourcing, I was very energized. Book knowledge almost fell out of me. However, when I sat down to…
How to build and push Docker image with GitHub actions?
In the previous post, I explained that with a few simple tricks, you can make your Docker image less cluttered and build faster. I explained…
How to build an optimal Docker image for your application?
Some time ago, I realised that my posts from 2011 about configuration and operation in SCRUM using TFS are still hanging on the Internet…
Notes about C# records and Nullable Reference Types
In the last months, I spent quite some time playing with C# records and Nullable Reference Types. I was hoping that thanks to them, I would…
In what language are programmers writing?
Wikipedia states that there are around 700 programming languages. Some are more popular. Some are less. But what language do programmers…
Form a wall! And other concerns about security
There were 0.3 seconds left till the end of the NBA match. Detroit Pistons were leading by a single point against San Antonio Spurs. The…
Let's take care of ourselves! Thoughts on compatibility
In the last year, the word responsibility is used in all possible ways. Responsibility for us, for others. We can be heroes wearing masks…
How to get the current entity state from events?
Today I’d like to go back a bit to the basics of Event Sourcing. I recently realised that I often cover more advanced topics. So sometimes…
When not to use Event Sourcing?
Event Sourcing is perceived as a complex pattern that’s challenging to learn. Typically it’s matched with the financial industry or big…
Generic does not mean Simple
As you know, I am a fan and practitioner of CQRS.. I believe that it is falsely considered as complicated. In my opinion, it can help even…
Structural Typing in TypeScript
When we talk about typing in programming languages, we usually divide it into static and dynamic. Static typing is checked at the compile…
When Agile is not enough
Today I want to invert the classical pro-agile drawing. Let’s talk about the devaluation of functionality that occurs in Agile projects. In…
How to scale projections in the event-driven systems?
People want to scale up everything. In the past, the recipe for everything was to buy a larger server. Today, the answer is to add another…
Why are senior devs afraid to code?
The job interview is a stressful situation, usually for both parties. Some time ago, I had to recruit senior developers. I had the idea to…
How to create a custom GitHub Action?
As you may know, I’m a fan of documentation. I wrote a few practical tips on this topic on the blog: “How to create projections of events…
Memoization, a useful pattern for quick optimization
Today I would like to show you a simple programming pattern that can be useful for quick code optimization. This pattern is called…
How using events helps in a teams' autonomy
Autonomy is the Holy Grail for the management of multiple teams. At least that’s how it’s perceived; it’s not easy to get the right balance…
How to enhance and configure your site search with Algolia?
Some time ago, I wrote on how to create documentation without the pain (read it here). Documentation is something that has been one of the…
Events should be as small as possible, right?
TV size? The bigger, the better. Debt amount? Opposite. It’s hard to find the right size that suits all. How big should the event be? What…
How to create projections of events for nested object structures?
Did you ever feel so encouraged so much that you immediately thought, “This is great, let’s do it!“. I’m sure you did. I’m also sure that…
How to get started with Open Source?
As you may know, I’m an active Open Source contributor. Since December 2020, I’m working full-time on the Open Source project EventStoreDB…
How to successfully do documentation without a maintenance burden?
Developers like to complain about the lack of documentation. They complain even more when they have to write it. No programmer wants to do…
How money in Cloud impacts Architectural decisions?
It’s intriguing how our perspective on software development changed in the last few years. We transformed from the on-premise age to the…
Can command return a value?
Last week I busted common myths and explained facts about CQRS. Today I’ll continue my effort. I tackle one of the most common questions…
CQRS facts and myths explained
I’m sure that you know a lot of Urban Legends. They usually start with “hey, my friend’s cousin saw that…” or “you know, I’ve read such…
Why Partial<Type> is an extremely useful TypeScript feature?
If TypeScript were a friend of mine on Facebook, then I’d mark our relation as complicated. It’s a history of love & hate, or rather hate…
How to set up a test matrix in XUnit?
Each country has the go-to place for hiding from daily struggles. In Poland, we have Bieszczady. It’s a mountain range that’s also the…
What's the difference between a command and an event?
What’s the difference between a command and an event? The answer seems apparent, but let’s see if it’s straightforward. The command…
Saga and Process Manager - distributed processes in practice
What can go wrong with distributed systems? Everything! I like to compare distributed systems to Rocky Balboa fighting the last round with…
What if I told you that Relational Databases are in fact Event Stores?
Are you one of those people saying that Event Sourcing is detached from reality? Do you think that you don’t need such extravagance, as you…
What texting your Ex has to do with Event-Driven Design?
We sometimes feel melancholic, blue and a bit messy. When we enhance those feelings with “gummy berry juice” then various dubious ideas come…
Sociological aspects of Microservices
Last week, I started writing about the topic of cutting systems into microservices (read more here). I was sceptical about the frequent…
How (not) to cut microservices
Today, I’m holding a keyboard in one hand and scissors in the other. What do I need these scissors for? According to the post title, I would…
Bring me problems, not solutions!
“Bring me solutions, not problems!” I’ve heard this sentence multiple times from Business and management. You’ve heard it too, haven’t you…
Outbox, Inbox patterns and delivery guarantees explained
Yesterday I was asked by Cezary about the transactional outbox pattern sample implementation. My answer was: The question was short - answer…
How to (not) do the events versioning?
Developers that are not running a system in production might call themselves lucky. They can live in their perfect world. It is a world…
Optimistic concurrency for pessimistic times
Apparently, one of the worst things you can wish someone is “may you live in interesting times”. In these interesting times of ours, I…
Why a bank account is not the best example of Event Sourcing?
While explaining the Event Sourcing, bank account balance calculation is a common starting point. I claim that even though it sounds right…
Revolution now!
Did you ever get an offer that someone will pay you for what you are currently doing as a hobby? What would be your decision if that would…
Architect Manifesto
“Architects are not needed anymore. Those days are gone!” “We’re agile - we’re not doing waterfall, so we’re not designing upfront.” “We…