<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Frank on Software</title><description>Frank de Jonge writes about software design, architecture, domain-driven design and distributed systems.</description><link>https://frankdejonge.nl</link><item><title>New language, new direction, new content</title><link>https://frankdejonge.nl/blog/new-content-direction</link><guid isPermaLink="true">https://frankdejonge.nl/blog/new-content-direction</guid><description>Over the last couple of years, this blog has gone stale. I intend to change that and produce more content when I learn something new. This new content will still cover a lot of the things you&apos;re used to: software design, architecture, domain-driven design, and distributed…</description><pubDate>Wed, 08 Jul 2026 18:36:01 GMT</pubDate></item><item><title>Encapsulating interactions with the outside world in your domain model.</title><link>https://frankdejonge.nl/blog/encapsulating-interactions-with-the-outside-world</link><guid isPermaLink="true">https://frankdejonge.nl/blog/encapsulating-interactions-with-the-outside-world</guid><description>In my ever-lasting battle against anemic domain models I&apos;ve developed a preference on how to integrate with the external concerns. In this post I&apos;d like to show an alternative, a strategy on how to keep encapsulating behaviour wile interacting with the outside world.</description><pubDate>Mon, 01 Aug 2022 12:33:57 GMT</pubDate><category>Software Design</category></item><item><title>Use a message envelope</title><link>https://frankdejonge.nl/blog/use-a-message-envelope</link><guid isPermaLink="true">https://frankdejonge.nl/blog/use-a-message-envelope</guid><description>Event-driven architectures have various styles of communication. In my previous post I described a couple of event types you may see in these kinds of architectures.</description><pubDate>Mon, 07 Mar 2022 16:22:31 GMT</pubDate><category>Event-Driven Architecture</category><category>event sourcing</category><category>Messaging</category><category>Software Design</category></item><item><title>The different types of events in event-driven systems</title><link>https://frankdejonge.nl/blog/the-different-types-of-events-in-event-driven-systems</link><guid isPermaLink="true">https://frankdejonge.nl/blog/the-different-types-of-events-in-event-driven-systems</guid><description>Event-driven systems come in all sorts of shapes and sizes. The obvious commonality is; they all use events to communicate information. These events come in many shapes and sizes, and determining what goes into an event has an immense impact on the design of your system.</description><pubDate>Sat, 19 Feb 2022 12:52:27 GMT</pubDate><category>Software Design</category><category>Event-Driven Architecture</category><category>Messaging</category></item><item><title>Reliable event dispatching using a transactional outbox</title><link>https://frankdejonge.nl/blog/reliable-event-dispatching-using-a-transactional-outbox</link><guid isPermaLink="true">https://frankdejonge.nl/blog/reliable-event-dispatching-using-a-transactional-outbox</guid><description>Using events in a system is great, but how do you know for sure if you&apos;ve reliably dispatched your events? The transportation of events needs to be done reliably while maintaining overall system consistency, be it eventual or immediately.</description><pubDate>Thu, 20 Jan 2022 18:23:41 GMT</pubDate></item><item><title>Flysystem 3.0.0 is released</title><link>https://frankdejonge.nl/blog/flysystem-3-0-0-is-released</link><guid isPermaLink="true">https://frankdejonge.nl/blog/flysystem-3-0-0-is-released</guid><description>On the 13th of January 2022, version 3.0.0 of Flysystem was released. The library ships a couple new methods on the main filesystem and adapter interfaces, making it a breaking change that cause a major version increase.</description><pubDate>Fri, 14 Jan 2022 18:51:49 GMT</pubDate><category>Flysystem</category></item><item><title>Where does my validation live?</title><link>https://frankdejonge.nl/blog/where-does-validation-live</link><guid isPermaLink="true">https://frankdejonge.nl/blog/where-does-validation-live</guid><description>This is a question I&apos;ve received over and over again, a question that does not have a single answer. Sometimes when I explain how I approach this I get surprised reactions, so I figure I might as well share it in a blog post and see what other people think.</description><pubDate>Mon, 20 Dec 2021 20:32:18 GMT</pubDate><category>validation</category><category>Software Design</category></item><item><title>Ensuring data(base) consistency during concurrent requests</title><link>https://frankdejonge.nl/blog/ensuring-consistency-during-concurrent-requests</link><guid isPermaLink="true">https://frankdejonge.nl/blog/ensuring-consistency-during-concurrent-requests</guid><description>Bugs caused by race conditions can be a huge source of frustration. They are difficult to identify and often difficult to remedy. As part of my day to day job at Mollie, guarding against data inconsistencies is always top of mind.</description><pubDate>Mon, 01 Nov 2021 22:04:43 GMT</pubDate><category>Concurrency</category><category>Parallelism</category></item><item><title>Setting up a TypeScript multi-package mono-repo for @scoped/packages.</title><link>https://frankdejonge.nl/blog/setting-up-a-typescript-mono-repo-for-scoped-packages</link><guid isPermaLink="true">https://frankdejonge.nl/blog/setting-up-a-typescript-mono-repo-for-scoped-packages</guid><description>How to use NPM workspaces for scoped packages.</description><pubDate>Sun, 08 Aug 2021 20:56:09 GMT</pubDate><category>typescript</category></item><item><title>Back the func off, this is my abstraction!</title><link>https://frankdejonge.nl/blog/back-the-func-off</link><guid isPermaLink="true">https://frankdejonge.nl/blog/back-the-func-off</guid><description>Integrating services over API&apos;s exposes your application to a range of possible failures. At scale, any network interaction can and will fail. Implementing a retry mechanism is a common approach to increase fault tolerance.</description><pubDate>Sat, 01 May 2021 15:46:17 GMT</pubDate><category>Software Design</category></item><item><title>A new major version of Flysystem</title><link>https://frankdejonge.nl/blog/a-new-major-version-of-flysystem</link><guid isPermaLink="true">https://frankdejonge.nl/blog/a-new-major-version-of-flysystem</guid><description>For those who missed it, a new major version of Flysystem was released on the 24th of November. A new major version allows you break with the past for the sake of the future, which is exactly what I&apos;ve done. For the second version of Flysystem I went back to the drawing board.</description><pubDate>Mon, 21 Dec 2020 13:13:50 GMT</pubDate></item><item><title>Testing without mocking frameworks.</title><link>https://frankdejonge.nl/blog/testing-without-mocking-frameworks</link><guid isPermaLink="true">https://frankdejonge.nl/blog/testing-without-mocking-frameworks</guid><description>Over the years, my coding practices have changed a lot. From hacking away until it works to TDD/BDD/DDD and everything in between. One of the biggest changes in my developer career has been when, why, and how I test my code.</description><pubDate>Mon, 23 Mar 2020 16:12:37 GMT</pubDate><category>Testing</category></item><item><title>Setting up docs with Tailwind CSS &amp; GitHub Pages.</title><link>https://frankdejonge.nl/blog/setting-up-docs-with-tailwind-css-and-github-pages</link><guid isPermaLink="true">https://frankdejonge.nl/blog/setting-up-docs-with-tailwind-css-and-github-pages</guid><description>To me, Tailwind CSS is one of the the most enjoyable tools to build documentation websites. It&apos;s quick, it&apos;s easy, and it gets the job done well. The library has taken the world by storm, and that doesn&apos;t surprise me one bit.</description><pubDate>Mon, 12 Aug 2019 20:28:00 GMT</pubDate></item><item><title>Type-safe stream processing in TypeScript</title><link>https://frankdejonge.nl/blog/type-safe-stream-processing-in-typescript</link><guid isPermaLink="true">https://frankdejonge.nl/blog/type-safe-stream-processing-in-typescript</guid><description>&gt; This post contains a lot of back-story about how this all came about, you can skip ahead if you only care about the code. In case you haven&apos;t worked with TypeScript before: TypeScript is a superset of JavaScript that enhances the language by providing optional static typing.</description><pubDate>Thu, 02 May 2019 18:07:14 GMT</pubDate><category>typescript</category></item><item><title>Array destructuring in PHP</title><link>https://frankdejonge.nl/blog/array-destructuring-in-php</link><guid isPermaLink="true">https://frankdejonge.nl/blog/array-destructuring-in-php</guid><description>In my day to day job I write in a number of programming languages. The majority of my time is spent writing PHP but I very much enjoy writing other languages, such as Go and Javascript, too! One of the things I like the most about JavaScript, and PHP also to some extent, is how…</description><pubDate>Mon, 30 Apr 2018 20:32:39 GMT</pubDate><category>Syntax</category><category>JavaScript</category></item><item><title>Being in control of time in PHP</title><link>https://frankdejonge.nl/blog/being-in-control-of-time-in-php</link><guid isPermaLink="true">https://frankdejonge.nl/blog/being-in-control-of-time-in-php</guid><description>When developers talk about the infrastructural boundaries or external dependencies they often talk about databases and third-party integration. They&apos;re the first thing we&apos;ll put behind an interface so we can stub them out during our tests. This gives us some control over them.</description><pubDate>Thu, 08 Mar 2018 10:30:38 GMT</pubDate><category>Testing</category></item><item><title>Regaining trust in your test suite with Docker.</title><link>https://frankdejonge.nl/blog/regaining-trust-in-your-tests-with-docker</link><guid isPermaLink="true">https://frankdejonge.nl/blog/regaining-trust-in-your-tests-with-docker</guid><description>Docker, and containerised services in general, have brought a lot to the world of software development. While not everybody is (or ever should be) using docker as their deployment method, it&apos;s usefulness far exceeds being just a platform to run services on in production.</description><pubDate>Fri, 19 Jan 2018 15:13:46 GMT</pubDate><category>Testing</category><category>Flysystem</category></item><item><title>Partitioning for concurrency in synchronous business processes.</title><link>https://frankdejonge.nl/blog/parallelise-synchronous-business-processes</link><guid isPermaLink="true">https://frankdejonge.nl/blog/parallelise-synchronous-business-processes</guid><description>The PHP landscape is getting more and more diverse. The typical PHP + MySQL combination is no longer the only way of doing things. Applications in PHP are not just fancy database wrappers anymore.</description><pubDate>Sun, 01 Oct 2017 11:54:16 GMT</pubDate><category>Data Engineering</category><category>Parallelism</category><category>Concurrency</category><category>Processing</category><category>Race Conditions</category></item><item><title>Battle Log: Symfony Routing performance considerations.</title><link>https://frankdejonge.nl/blog/symfony-routing-performance-considerations</link><guid isPermaLink="true">https://frankdejonge.nl/blog/symfony-routing-performance-considerations</guid><description>Last week I took a deep dive into Symfony&apos;s Routing Component. A project I worked on suffered from a huge performance penalty caused by a routing mistake. This lead me on the path to discovering some interesting performance considerations.</description><pubDate>Tue, 28 Feb 2017 10:36:08 GMT</pubDate><category>Symfony</category></item><item><title>How a 20mb data-set brought down a 14gb ElasticSearch cluster.</title><link>https://frankdejonge.nl/blog/how-a-20mb-data-set-brought-down-a-14gb-elasticsearch-cluster</link><guid isPermaLink="true">https://frankdejonge.nl/blog/how-a-20mb-data-set-brought-down-a-14gb-elasticsearch-cluster</guid><description>For a client project we are using ElasticSearch (ES) as one of our read-models. The use-case was pretty straight forward and the amount of data was super small. However, our problems were pretty big.</description><pubDate>Fri, 15 Jul 2016 17:29:56 GMT</pubDate><category>DevOps</category><category>ElasticSearch</category><category>Data Engineering</category></item><item><title>Finally, file streams, and deferred execution in PHP.</title><link>https://frankdejonge.nl/blog/finally-file-streams-and-deferred-execution-in-php</link><guid isPermaLink="true">https://frankdejonge.nl/blog/finally-file-streams-and-deferred-execution-in-php</guid><description>Cleaning up after yourself can be a tedious task. For example, closing file handlers after using them needs to be done. A programmer&apos;s life isn&apos;t all about the happy path. When things go pear-shaped you might end up duplicating cleanup code throughout your code.</description><pubDate>Mon, 30 May 2016 22:07:13 GMT</pubDate></item><item><title>&quot;Scaling&quot; Vagrant with NGINX Load Balancing</title><link>https://frankdejonge.nl/blog/nginx-vagrant-load-balancing</link><guid isPermaLink="true">https://frankdejonge.nl/blog/nginx-vagrant-load-balancing</guid><description>A load-balanced vagrant setup, because why the hell not! Not all projects require more that one instance of your application to handle the demand. When you do, you want to be prepared. You&apos;ll want to know which steps you have to take and which limitations you&apos;ll encounter.</description><pubDate>Fri, 04 Mar 2016 18:14:42 GMT</pubDate></item><item><title>Pipelines, immutability and privates.</title><link>https://frankdejonge.nl/blog/pipelines-immutability-and-privates</link><guid isPermaLink="true">https://frankdejonge.nl/blog/pipelines-immutability-and-privates</guid><description>A recent addition to the PHP League was the pipeline package, which allows you to compose sequential operations. One of the key aspects of the pipeline is that it&apos;s immutable. During the development of Pipeline, I learned a few lessons that I&apos;d like to share with you.</description><pubDate>Fri, 04 Dec 2015 16:22:31 GMT</pubDate></item><item><title>Onboarding and Ansible Galaxy.</title><link>https://frankdejonge.nl/blog/onboarding-ansible-galaxy</link><guid isPermaLink="true">https://frankdejonge.nl/blog/onboarding-ansible-galaxy</guid><description>When you start working on a new project, there are usually a couple of steps you&apos;ll need to follow to get up and running. This process is called on-boarding. One of the steps in this process is getting your local development environment setup.</description><pubDate>Sun, 27 Sep 2015 12:59:38 GMT</pubDate><category>Ansible</category><category>DevOps</category></item><item><title>Packages vs. Components: The Dependency Problem.</title><link>https://frankdejonge.nl/blog/packages-vs-components</link><guid isPermaLink="true">https://frankdejonge.nl/blog/packages-vs-components</guid><description>The PHP landscape has fully transitioned into its Package Age™. Packagist is the main resource for retrieving new PHP packages: most frameworks split out packages from their main distribution to allow re-use outside of the framework. The world is a happy place.</description><pubDate>Fri, 26 Jun 2015 12:49:45 GMT</pubDate></item><item><title>Rendering ReactJS templates server-side.</title><link>https://frankdejonge.nl/blog/rendering-reactjs-templates-server-side</link><guid isPermaLink="true">https://frankdejonge.nl/blog/rendering-reactjs-templates-server-side</guid><description>The last couple of months I&apos;ve been working with ReactJS quite extensively. It&apos;s been a very rewarding and insightful journey. There is, however, one part that kept coming back to me: server-side rendering.</description><pubDate>Mon, 18 May 2015 12:31:39 GMT</pubDate><category>ReactJS</category></item></channel></rss>