Are you looking for practical knowledge
about software architecture?
Check out my content - from articles to videos
My name is Oskar Dudycz. From over 15 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.
Bootstrapping CRUD with Pongo
The leitmotif of this blog is the event-driven approach. I truly believe that it’s a way to keep our applications closer to business. By…
Running a regular SQL on Pongo documents
Have you heard someone say: “We’ll use this tool because it requires a long onboarding and lots of memorisation?” You could have seen the…
Pongo behind the scenes
If you want to make God laugh, tell him about your plans. My plans were simple: recharge during summer, take a break in July, and then…
Pongo gets strongly-typed client, migrations, and command line tooling
When you think upfront and want to make things right, there’s an interesting feedback loop. Quite often, things start to click, often in a…
My Architecture Drivers
I don’t feel like an authority or an expert. I prefer to think about myself as a practitioner. Our industry is filled with self-proclaimed…
Using event metadata in event-driven projections
Some time ago, I wrote about the dangers that come from the I’ll just add one more field” attitude. Have you heard about the Broken Window…
Writing and testing event-driven projections with Emmett, Pongo and PostgreSQL
In the previous article, I told what happened when Emmett and Pongo walked into a bar. In other words, I announced that you can now do Event…
Event Sourcing on PostgreSQL in Node.js just became possible with Emmett
Last week, I announced Pongo - Mongo, but it was on PostgreSQL. So, the Node.js library allows using PostgreSQL as a document database…
Pongo - Mongo but on Postgres and with strong consistency benefits
Flexibility or Consistency? Why not have both? Wouldn’t it be great to have MongoDB flexible schema and PostgreSQL consistency? MongoDB is a…
Filtering EventStoreDB subscriptions by event types
Regular expressions are one of the classic examples of hate and hate relationships. Yes, it’s not a typo; hate and hate. Do you know anyone…
How to automatically setup pgAdmin with a Docker database
Developer experience is a phrase repeated in multiple ways. In our industry, we finally realised how important it is to reduce the cognitive…
Setting up NGINX load balancer for .NET WebApi
“Just put the load balancer in front of it, and call it a day”. But is it really that simple? Was it ever “just do XYZ?“. I was preparing a…
Combining the To-Do List and the Passage Of Time patterns for resilient business workflows
Managing processes is non-trivial. I have written about it in multiple posts and told you the horror story of the case that should have…
Let's build the worst Event Sourcing system!
Everyone likes to talk about best practices. I went the other way around and gathered all the worst practices on how to build the worst…
Why you should batch message processing and how to do it with .NET AsyncEnumerable
AsyncEnumerable is a sneaky abstraction. It allows simplified and performant usage for iterating on pull-based and push-based sources. “Pull…
Docker Compose Profiles, one the most useful and underrated features
Erik Shafer asked me on the Emmett Discord if I could provide a sample of how to run the WebApi application using Emmett. Of course, I said…
How to write a left-fold streams collector in Java
Last week, we covered the latest improvements to Java 22 around pattern matching and records. They enable explicit business logic modelling…
This is not your uncle's Java! Modelling with Java 22 records pattern matching in practice
I like learning new things. It stimulates my creativity, helps me gain diverse perspectives, and helps me be humble. When you’re a notorious…
How to configure a custom Test Container on the EventStoreDB example
Testcontainers became a popular way of setting up dependencies for integration testing. They’re not ideal, as configuring them to run your…
Mocking the native Node.js Test Runner
Last week, we discussed an overused but applicable pattern: in-memory bus. This time, we’ll continue with the leitmotif and talk about…
How to build an in-memory Message Bus in TypeScript
I’m writing this article on Friday, and it’s about time to have some fun. As this is a programming blog, let’s have some fun coding. Let’s…
Event modelling anti-patterns explained
Have you heard about Passive Aggressive Events or CRUD sourcing? Or maybe about the Clickbait event? If you don’t, you better check the talk…
I'm no longer Marten maintainer
Folks, I’d like to inform you that I’m no longer a Marten maintainer. As you know, sometimes in the project’s lifetime, there’s a moment…
Testing Event Sourcing, Emmett edition
I’ve been going pretty down the rabbit hole in the last few years. What am I searching for? A way to deliver better software. And that’s, of…
Join my Event Sourcing workshops at Techorama and DDD Europe and speed up your journey!
Event Sourcing is a pattern that is quickly gaining popularity. Many companies see the advantages it brings, e.g. business focus and keeping…
How to tackle compatibility issues in ECMA Script modules (and in general)
Do you recall moments when you’re sitting and closing dozens or more browser tabs? Most of them are Google, GitHub, Blogs, and others. You…
Keeping our overachieving freak on a leash
Being busy is not something we strive for; it’s an axiom. Social media are not helping; our whole lives are on the plate. And we’re chefs…
Should you always keep streams short in Event Sourcing?
In the last article and others I did my best explaining why keeping streams short is important in Event Sourcing. I also showed you how…
Implementing Closing the Books pattern
No one knows who invented Event Sourcing. I overheard that Hammurabi did. Why? Because he standardised the first set of rules of accounting…
Announcing Emmett! Take your event-driven applications back to the future!
Simple is not easy. Each person has its definition of it. For me, it means that when I look at the solution, I think: “So simple. Why didn’t…
Production-Grade Event Sourcing Workshop - Modelling, DevOps, Process
Putting the career bets is not easy; I made boring and pragmatic choices for most of my career. They took me far. Yet, I always felt that…
How TypeScript can help in modelling business workflows
TypeScript is an intriguing language. Some say that its type system, by itself, is Turing Complete. Some take it to the extreme and even…
Stream ids, event types prefixes and other event data you might not want to slice off
You’re reading much more code than you’re writing. Readability is a highly subjective term. That’s probably why some call what we’re doing…
Should you record multiple events from business logic?
Asking people for feedback is an intriguing story. I like to get constructive criticism for my work, as that allows me to learn something…
Not all issues are complex, some are complicated. Here's how to deal with them
Cynefin’s framework states that we have four types of decision-making contexts (or domains): clear, complicated, complex, and chaotic. They…
What Dune can tell us about setting our goals
Dune series has a lot of great thoughts. They’re more than just sci-fi books. Let me share one with you: Moneo: For what do you hunger, Lord…
Why I won't use .NET Aspire for now
When you’re angry, take a breath, take your time and then talk. So I did after I tested .NET Aspire yesteday. I hoped it could be a decent…
Hitchhiker's Guide To Moving From Relational Data To Events
Knock knock? Who’s there? It’s me, Oskar, the end is near, did you know that? Ah, you know it but don’t know how to proceed? Let’s talk…
A few notes on migrating storage library
I’m feeling like a surgeon in recent days. Who knew that changing the connection management in storage library would be a delicate thing to…
Are you Marten or Wolverine user? Tell us more!
I’m always saying that the Marten community is one of the things that keeps me doing Open Source and staying in the .NET community. It’s…
How to deal with privacy and GDPR in Event-Driven systems
The law to be forgotten and immutable data sounds like fire and water. How to remove data if you’re building an event-driven system based on…
We introduced support plans for Marten
We just introduced support plans for Marten, and here’s why. We’re really committed to providing tools that are accessible, safe and bug…
GDPR for busy developers
This year, we had the fifth anniversary of the Developers’ Doomsday. In 2018, on the 25th of May, the European General Data Protection…
Anti-patterns in event modelling - Clickbait event
Doctors Hate Her! Discover the Simple Trick to Lose Weight Overnight! This One Weird Trick Can Save You Hundreds on Your Energy Bills! The…
Women in IT
I used to play football. I wasn’t talented, but still, I loved it. Football is a team sport, and playing is not the only essential part of…
In the defence of Object-Relational Mappers
I’m happy I didn’t have to use Object-Relational Mapping tools in the last few years. They’re solutions to some set of problems, but those…
Internal and external events, or how to design event-driven API
One of the things that we’re learning too late in the Event-Driven approach is that we should have been splitting events into internal and…
How to design software architecture pragmatically
I’ve run numerous workshops in recent years. It’s intriguing to see different ways people solve the same problem. Some start from general…
Is the Strategy Pattern an ultimate solution for low coupling?
Having a single source of truth and data point is a sweet spot for running business logic. We check the data from one place and update it…
Oops I did it again, or how to update past data in Event Sourcing
One team win is a loss for the other. For some people, money loss is a gain for others. In the same way, the challenging parts of Event…
Architecture Weekly became the Substack Bestseller!
Boom, I got this week such a nice picture from the Substack. My Architecture Weekly newsletter appears to have become the Substack…
My journey from Aggregates to Functional Composition
I was recently asked what drove me to mostly use immutable data and methods rather than the Aggregate Pattern in my samples and videos. I…
Event transformations, a tool to keep our processes loosely coupled
One of the biggest pains in traditional software design is accidental complexity. We want to understand and reflect on the business process…
Prototyping, an underestimated design skill
Coding is an underestimated part of the design. When we think about the design, we immediately fall to whiteboard diagrams, sticky notes, or…
Behaviour-Driven Design is more than tests
Why did I name the testing library Ogooreck? Between my friends, I’m well known for my lame jokes. Ogooreck is one of them. Ogooreck is a…
Could you help me by filling a short survey about an online course?
I realised that I could do more to help you and other folks. I’ve been sharing online content for free in the last few years on this blog…
A simple way to configure integration tests pipeline
Continuing an effort to explain DevOps scenarios, today I’d like to show you a simple way to set up integration tests that I’m using in my…
How to scale out Marten
If you are already a reader of this blog, you probably know already that I’m not so fond of the Will it scale? question. I believe that, too…
How to set global setting for XUnit tests
XUnit is not my favourite testing tool; I already mentioned that in How to set up a test matrix in XUnit?. To be fair, none of the .NET test…
How to create a Docker image for the Marten application
Containerisation is something that pushed our industry much further. Generating immutable artefacts is a foundational aspect of the DevOps…
Vertical Slices in practice
I’m a preacher for the CQRS, Vertical Slices, and Feature Folders. I won’t hide that, and I won’t even try. I believe that structuring code…
Follow the money to get a better design
I noticed that we, developers, struggle to follow the money. And that’s impacting our design in the wrong way. Of course, we’re pretty good…
Removability over Maintainability
A diverse system with multiple pathways and redundancies is more stable and less vulnerable to external shock than a uniform system with…
Recap of Event Sourcing Live 2023
InfoQ claims that Event Sourcing is in the late majority adoption phase. That means that if you haven’t started to use it, you better start…
A few words on communication
I got a surprising question during my workshop this week: It seems that communication with the business is critical to make Event Sourcing…
The Holy Grail syndrome
Our industry is harmed by the disease of “There has to be something more!” also called “The Holy Grail syndrome”. Instead of trying to…
Anti-patterns in event modelling - I'll just add one more field
Programming origins are in mathematics. Scientists like John Von Neumann and Alan Turing built the foundations for today’s computers. That…
Is the audit log a proper architecture driver for Event Sourcing?
Usually, one of the main drivers for Event Sourcing is the audit log capability. Indeed event stores are append-only logs, theoretically, we…
A few notes on running open source project after Marten v6 release
Last week we released the next major Marten release, and I’d like to share some of my lessons learned and insights with you. And by “you”, I…
General strategy for migrating relational data to document-based
I was recently asked how to migrate a project using relational data to a document-based approach (e.g. from .NET ORM Entity Framework into…
How to test event-driven projections
Projections in an event-driven world are a way to interpret registered events. We can take a sequence of events and build from them read…
Publishing read model changes from Marten
Integrations have different names, shades and colours, but only one adjective: challenging. Trying to glue systems together requires…
Postgres Superpowers in Practice
Look! Up in the sky! It’s a bird! It’s a plane! It’s Superman! I have such a thought quite often while working with Postgres. Why? Let’s say…
Event stores are key-value databases, and why that matters
Event stores are the foundational building block of Event Sourcing. They’re also one of the biggest sources of confusion. They are databases…
ChatGPT, revolution or not?
I started my career when StackOverflow didn’t exist. That’s how I quite often introduce myself. I’m that old. That’s, of course, nothing…
Ensuring uniqueness in Marten event store
Unique constraint validation is one of those things that looks simple but is not always easy. I explained already that, in Event Sourcing…
Projecting Marten events to Elasticsearch
I told you already that Projections are an Event Sourcing killer feature, and today I’d like to repeat that. In Marten, we embraced that and…
How to handle multiple commands in the same transaction
Let’s say that we’re starting a new project. It’s a small tool for internal needs, maybe even some sort of shadow IT project. It may also be…
Fun with serial JSON
JSON serialisation is so much fun. We can make jokes and curse, but we must live with it. Surprisingly, that’s not getting simpler if we use…
Don't let Event-Driven Architecture buzzwords fool you
I see a lot of new terms like Command-Event, Event-Based Compute, etc., presented around Event-Driven Architecture. Let me clear that up…
Set up OpenTelemetry with Event Sourcing and Marten
If I had to select the Distributed Systems Song, I’d choose Land of Confusion. This is the world we live in. And these are the hands we’re…
Event-driven projections in Marten explained
Projections are a neverending story. One does not simply write a single guide. One needs to write more examples of more advanced cases. That…
Explicit validation in C# just got simpler!
Validation is a thriving concept. It enables incredible creativity in developers implementing it in various ways. I explained my general…
Stacking the bricks in the software development process
We, developers, are searching for Holy Grail, one pattern to rule them all. There’s no such. In his excellent book “Atomic Habits”, James…
Guide to Projections and Read Models in Event-Driven Architecture
If I had to choose the killer feature of Event Sourcing, I’d select projections. Why? I’ll explain that in detail in this article. Events…
How to validate business logic
Fox Mulder got advice: “trust no one”. I’m claiming that each software developer should define their level of paranoia. The thing that we…
Let's build event store in one hour!
Last year, I completed two items from my speaker bucket list NDC Oslo and Domain-Driven Design Europe. I’m proud and happy, as those…
Don't be like Ebenezer Scrooge. A few words about workaholism
There is a cult of workaholism in our industry. Just like the guys from the gym brag about how much they pulled on the chest or did in the…
Explicit events serialisation in Event Sourcing
Events serialisation is an intriguing topic. On the one hand, it’s part of the campfire spooky tales, so (in)famous events versioning. On…
The magic is that there is no magic. Or how to understand design patterns.
The magic is that there is no magic. Many patterns perceived as complicated appear to be simple or even simplistic under the cover. Take…
Share your story on Event Sourcing Live 2023
Event Sourcing is a concept that helps to build the bridge between business and technical implementation. It’s a storage pattern that takes…
Testing asynchronous processes with a little help from .NET Channels
Let’s say that you have an event-driven application. It has an event bus that listens for events from asynchronous processes (e.g. Kafka…
Mapping event type by convention
Events are an essential block of Event-Driven Architecture. They represent business facts that happened in our system. We can use them to…
How to get all messages through Postgres logical replication
In an earlier article, I described Push-based Outbox Pattern with Postgres Logical Replication. The idea is to store the outgoing message (e…
How events can help in making the state-based approach efficient
In my last few articles, I showed the power of functional composition. That’s a foundation for effective modelling of your business logic…
Never Lose Data Again - Event Sourcing to the Rescue!
Relational databases are not losing data. They’re robust, consistent and secure! Are they? Too often, we mix technical and logical concepts…
How Postgres sequences issues can impact your messaging guarantees
Big picture descriptions and overall explanations are great. They help us to understand the foundations of new ideas and then find the place…
Writing and testing business logic in F#
My road to functional programming was pretty long. I started with structural programming in C++ and then rebranded into an Object-Oriented…
Push-based Outbox Pattern with Postgres Logical Replication
There are only a few patterns that I’m comfortable saying: “You should use it always if you want to build mature system”. One of them is the…
Testing business logic in Event Sourcing, and beyond!
I’ve heard a few times that Event Sourcing is hard to test. I’m not sure where this myth comes from; maybe from mixing it with event…
Dive a bit deeper, look a bit wider
We live in a time of information overload. We are constantly stimulated. Our focus skills are similar to a goldfish. Seemingly our life is…
On the importance of setting boundaries in team management
Paweł Janas is a significant figure in Polish football history. He was a decent defender on his own, then coaching our best clubs and…
It doesn't have to be toxic at work
We work in an industry that’s full of passionate people. Doing what you like and getting paid for it is a privilege and a curse. We’re…
Event Versioning with Marten
War never changes; migrations are always complex. It’s always a mind gymnastics and searching for risks and what may go wrong. Sometimes we…
Slim your aggregates with Event Sourcing!
In the traditional approach, what we get is what we store. Our write model is too often used directly as our read model, because the typical…
How playing on guitar can help you to be a better developer?
The first time I did not become a musician was when my grandma tried to sign me to music school. During rehearsal, I stubbornly said I would…
What do the British writer and his fence have to do with Software Architecture?
Gilbert Keith Chesterton was a British writer from the turn of the 19th and 20th centuries. As for his times, we would call him an…
Why are we afraid of our decisions?
I don’t know if it will work well in production! Will it scale? What if we get too many users during Black Friday? Do you know those…
Straightforward Event Sourcing with TypeScript and NodeJS
In the last two articles, I explained how to organise your business logic effectively, showing how proper typing and composition can help to…
Union types in C#
In the article “How to effectively compose your business logic”, I explained how explicit types definition can help in making our codebase…
How to effectively compose your business logic
Let’s say that we’d like to implement Shopping Cart. We have the following requirements: The customer may only add a product to the shopping…
Event-driven distributed processes by example
Some time ago, I wrote the general rules on processing the event-driven services. check my article Saga and Process Manager - distributed…
Is keeping dates in UTC really the best solution?
In many projects, the approach to dates is quite nonchalant. People do as they want. When on-premise systems were king, the common problem…
Should you generate the client code from the API?
I’m often told that dull, repetitive tasks should be automated. However, there are times when it is better not to do this. I regularly see…
Unobvious things you need to know about key-value stores
Today I wanted to talk a bit about Key-Value databases. It is a seemingly obvious subject, but it is easy to overlook the basic assumptions…
Ogooreck, a sneaky testing library in BDD style
Some time ago, I saw an excellent presentation of Dylan’s Beattie presentation - The Art of Code. It reminds us of what we are here for. By…
Should you throw an exception when rebuilding the state from events?
Event Sourcing is not a difficult pattern to understand. Event stores are not conceptually complicated databases (although implementation…
Why I'm leaving Event Store and getting ready for the next episode
I’ve got some news today. Here comes the boom: I’m leaving the Event Store, which means I just became unemployed! How come? I am a pragmatic…
Power of ignorance, or how to write simple code
I was asked to compile various statistics from our Event Store GitHub community some time ago. We wanted to analyze our public repositories…
What onion has to do with Clean Code?
I quite often make fun of Clean Code and Clean Architecture. I’m calling it an Onion Architecture. Not least because it has layers but also…
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 have seen it. I was one of them. I started…
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 usually don’t try to fight the HackerNews or Reddit opinions. That said, I cannot deny that they’re powerful platforms. The heated rants…
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…