Marcus Ilgner
https://marcusilgner.com/
Recent content on Marcus IlgnerHugoen-ukSun, 21 Sep 2025 12:44:00 +0200Domain-Driven Development and GenAI
https://marcusilgner.com/posts/2025-09-21-genai-ddd/
Sun, 21 Sep 2025 12:44:00 +0200https://marcusilgner.com/posts/2025-09-21-genai-ddd/<h1 id="increased-utility-of-domain-driven-development-in-the-context-of-genai">
Increased utility of Domain-Driven Development in the context of GenAI
<a class="heading-link" href="#increased-utility-of-domain-driven-development-in-the-context-of-genai">
<i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i>
<span class="sr-only">Link to heading</span>
</a>
</h1>
<p>These days it sometimes seems like “AI” is the only topic being thrown around in software development circles.
Personally I’m mostly ambivalent on the topic but tend to rarely use it: a big - if not the most important - part of software development is asking questions, which is something that LLMs are notoriously bad at. That’s largely because their modus operandi and tuning is aimed to produce good-sounding answers instead of questions. So it tends to funnel output into specific directions - something which can easily be exacerbated through imprudent prompts or subliminal tendencies in their training data.</p>Hibernate Initialisation without XML
https://marcusilgner.com/posts/2023-02-21-hibernate-init-without-xml/
Tue, 21 Feb 2023 17:16:00 +0200https://marcusilgner.com/posts/2023-02-21-hibernate-init-without-xml/<h1 id="hibernate-initialisation-without-xml">
Hibernate Initialisation without XML
<a class="heading-link" href="#hibernate-initialisation-without-xml">
<i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i>
<span class="sr-only">Link to heading</span>
</a>
</h1>
<p>While working on some R&D last weekend, I was surprised when every introduction to Hibernate started with creating a <code>persistence.xml</code> file.</p>
<p>Ultimately this is probably because many developers implicitly
assume that ones JPA persistence unit will ultimately be managed
by an application server. But for small containerised
applications without application server, having multiple
mechanisms to configure the application - i.e. <code>persistence.xml</code>
and whatever native mechanism one prefers - is extremely unwieldy.
As an example, I have seen some really convoluted approaches for referencing environment variables to pull in database credentials.</p>5 things I learned from 18 months with OPC UA
https://marcusilgner.com/posts/2022-12-04-5-things-from-18-months-opcua/
Sun, 04 Dec 2022 13:32:00 +0200https://marcusilgner.com/posts/2022-12-04-5-things-from-18-months-opcua/<h1 id="5-things-i-learned-from-18-months-with-opc-ua">
5 Things I learned from 18 months with OPC UA
<a class="heading-link" href="#5-things-i-learned-from-18-months-with-opc-ua">
<i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i>
<span class="sr-only">Link to heading</span>
</a>
</h1>
<p>Although it feels like a much longer time, it was in May 2021 that I joined <a href="https://www.re-digital.io/" class="external-link" target="_blank" rel="noopener">the team at RE:</a>. Now, 18 months later, it feels like a good time for a recap. I’ll start with one of the most prominent topics that I encountered: OPC UA. This job is my first within the context of mechanical engineering and while I have worked with many different technologies and built a large variety of systems over the past two decades, this was a novel experience (and also part of the reasons why I decided to join). Overall it is probably fair to say that software development in this industry works differently from “regular”, or “digital-only” software.</p>The Importance of Clean Code for Agile Teams
https://marcusilgner.com/posts/2022-07-07-the-importance-of-clean-code-for-agile-teams/
Thu, 07 Jul 2022 19:56:00 +0200https://marcusilgner.com/posts/2022-07-07-the-importance-of-clean-code-for-agile-teams/<h1 id="the-importance-of-clean-code-for-agile-teams">
The Importance of Clean Code for Agile Teams
<a class="heading-link" href="#the-importance-of-clean-code-for-agile-teams">
<i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i>
<span class="sr-only">Link to heading</span>
</a>
</h1>
<p>Most everyone who works in software development will know the situation
where you have written some code that manages to somehow solve a current
problem - but when looking at it the next day (or showing it to another
person), it turns out that there are a couple of design issues with it.</p>
<p>Now the question automatically arises: should we merge it or give it a
bit of love and clean it up?</p>Becoming a better developer
https://marcusilgner.com/posts/2022-06-09-becoming-a-better-developer/
Thu, 09 Jun 2022 22:05:00 +0200https://marcusilgner.com/posts/2022-06-09-becoming-a-better-developer/<h1 id="programming-isnt-software-development">
Programming isn’t software development
<a class="heading-link" href="#programming-isnt-software-development">
<i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i>
<span class="sr-only">Link to heading</span>
</a>
</h1>
<p>While it might be obvious to many or most people, it nonetheless
needs to be said sometimes. But before getting to the interesting
part about how to move from programming to software development
and how to become better at that, let’s start with an example of
what I’m talking about. To illustrate the underlying concept, let’s
use a completely ludicrous, over-the-top example 🤪</p>Let's talk about Pet Projects
https://marcusilgner.com/posts/2022-05-18-pet-projects/
Wed, 18 May 2022 21:00:00 +0200https://marcusilgner.com/posts/2022-05-18-pet-projects/<h1 id="lets-talk-about-pet-projects">
Let’s talk about pet projects
<a class="heading-link" href="#lets-talk-about-pet-projects">
<i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i>
<span class="sr-only">Link to heading</span>
</a>
</h1>
<p>In many years reviewing job applications from software developers, one
topic has come up as surprisingly controversial time and again: pet
projects, i.e. projects that developers work on on their own time.
So let’s have a look and see what the fuzz is all about.</p>
<h2 id="from-the-employers-perspective">
From the employers perspective
<a class="heading-link" href="#from-the-employers-perspective">
<i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i>
<span class="sr-only">Link to heading</span>
</a>
</h2>
<p>First, let’s look at it from the employers perspective. A colleague of
mine once succinctly put it like this: “You wouldn’t expect a slater to
tile a roof in their free time, would you?”. And there’s a lot of truth
to that.</p>Rails Value Objects
https://marcusilgner.com/posts/2022-05-04-rails-value-objects/
Wed, 04 May 2022 01:06:00 +0200https://marcusilgner.com/posts/2022-05-04-rails-value-objects/<h1 id="value-objects-in-rails">
Value Objects in Rails
<a class="heading-link" href="#value-objects-in-rails">
<i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i>
<span class="sr-only">Link to heading</span>
</a>
</h1>
<p>While writing yesterdays post about the usage of <code>Hash</code> vs <code>class</code>, I couldn’t
help but think of another powerful tool that helps us to build a well-defined
model of our problem domain in the programming language of our choice: the
<em>value object</em>.</p>
<p>To understand the value of value objects (<em>scnr</em>), let’s take an example:
<code>42</code>. “What is <code>42</code>?”, you might be tempted to ask - and rightfully so.
In Ruby it might be an instance of <code>Integer</code>, other languages may have cause
to use a more restrictive definition like <code>u8</code> or <code>i16</code>. But still - that
doesn’t help us to understand what <code>42</code> might mean.</p>Idiomatic Coding: Ruby Hash (& Python Dict)
https://marcusilgner.com/posts/2022-05-03-idiomatic-coding-ruby-hashes/
Tue, 03 May 2022 08:48:10 +0200https://marcusilgner.com/posts/2022-05-03-idiomatic-coding-ruby-hashes/<h1 id="idiomatic-ruby-hash-vs-class">
Idiomatic Ruby: <code>Hash</code> vs <code>class</code>
<a class="heading-link" href="#idiomatic-ruby-hash-vs-class">
<i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i>
<span class="sr-only">Link to heading</span>
</a>
</h1>
<p>It is no secret that I’m a big fan of typed languages. To me, an expressive type system really helps to convey the mental model of the application to the developers maintaining the code base.</p>
<p>As such, I am often dismayed when reading code from untyped interpreted languages. Sure, there are classes in Javascript, Ruby and Python. But very often I find that they’re eschewed in favour of just bundling a list of attributes together in an untyped <code>Object</code>, <code>Hash</code> or <code>Dict</code> respectively.</p>Projects
https://marcusilgner.com/projects/
Tue, 03 May 2022 08:45:35 +0200https://marcusilgner.com/projects/<p>Here’s a short excerpt from my past and current (public) projects:</p>
<ul>
<li><a href="https://sr6.illunis.net" class="external-link" target="_blank" rel="noopener">SR6 Character Sheet</a>: when our gaming group switched to online play during the COVID-19 pandemic, I built a digital character sheet for Shadowrun 6</li>
<li><a href="https://keedrop.de" class="external-link" target="_blank" rel="noopener">Keedrop</a>: easily & securely send passwords. It doesn’t replace GPG, but at least you won’t have to send them in plaintext over chat or email.</li>
<li><a href="https://github.com/milgner/k290-fnkeyctl" class="external-link" target="_blank" rel="noopener">k290-fnkeyctl</a>: when I got myself annoyed with the way that my Logitech keyboard handled its function keys, I reverse-engineered a small application to switch the behaviour on Linux.</li>
<li><a href="https://github.com/doo/SQLite3-WinRT" class="external-link" target="_blank" rel="noopener">SQLite3-WinRT</a>, <a href="https://github.com/doo/metro-driver" class="external-link" target="_blank" rel="noopener">metro-driver</a> and <a href="https://github.com/milgner/Win8-Cucumber.js" class="external-link" target="_blank" rel="noopener">Win8-Cucumber.js</a>: working at doo (nowadays called <a href="scanbot.io" >Scanbot</a>), we pioneered development on the then new Windows 8 platform and wrote a SQLite3 adapter as well as tooling for automated testing of our application.</li>
<li><a href="https://github.com/milgner/compoker" class="external-link" target="_blank" rel="noopener">Compoker</a> is a small complexity poker app which was my first project written in Rust. It was only meant to teach me a bit of Rust and learn some Svelte along the way. It’s probably going to remain a bit of a Rust learning playground for me.</li>
<li><a href="https://github.com/milgner/active_activity" class="external-link" target="_blank" rel="noopener">ActiveActivity</a> is my most recent project. When working in a Rails project at work, I noticed that there’s no built-in facility to orchestrate continuously-running activities in Rails - so I built it. Still in alpha stage.</li>
</ul>Wikis aren't meant for software documentation
https://marcusilgner.com/posts/2021-05-20-no-wikis-for-software-documentation/
Thu, 20 May 2021 20:39:10 +0200https://marcusilgner.com/posts/2021-05-20-no-wikis-for-software-documentation/<h1 id="wikis-arent-meant-for-software-documentation">
Wikis aren’t meant for software documentation
<a class="heading-link" href="#wikis-arent-meant-for-software-documentation">
<i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i>
<span class="sr-only">Link to heading</span>
</a>
</h1>
<blockquote>
<p>“Documentation is a love letter that you write to your future self.”
– <cite><a href="https://en.wikipedia.org/wiki/Damian_Conway" class="external-link" target="_blank" rel="noopener">Damian Conway</a></cite></p></blockquote>
<p>Although there are many arguments being made to rationalize our laziness and
avoid writing proper documentation, there is no doubt in my mind that good
software documentation is a great tool to improve the development lifecycle
of long-running projects.</p>
<p>If you know your project is going to be scrapped in 2 months time, feel free
to stop reading here and enjoy a good book or a walk outside. ☀️
But if it’s any more than that, you should make your live and the lives of
your co-workers easier by documenting your software. Even projects with a
originally limited lifetime have been known to live long past their best-
before date.</p>Imprint
https://marcusilgner.com/imprint/
Mon, 05 Apr 2021 14:45:59 +0200https://marcusilgner.com/imprint/<h1 id="impressum">
Impressum
<a class="heading-link" href="#impressum">
<i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i>
<span class="sr-only">Link to heading</span>
</a>
</h1>
<p><strong>Angaben gemäß § 5 TMG; verantwortlich für den Inhalt nach § 55 Abs. 2 RStV:</strong></p>
<address>
Marcus Ilgner<br/>
Kölner Str. 98<br/>
53840 Troisdorf<br/>
Deutschland
</address>
<h2 id="kontakt">
Kontakt
<a class="heading-link" href="#kontakt">
<i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i>
<span class="sr-only">Link to heading</span>
</a>
</h2>
<p>Fax: 02241 1695662<br>
E-Mail: <a href="mailto:[email protected]" >[email protected]</a></p>
<h2 id="haftungsausschluss">
Haftungsausschluss:
<a class="heading-link" href="#haftungsausschluss">
<i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i>
<span class="sr-only">Link to heading</span>
</a>
</h2>
<h3 id="haftung-für-links">
Haftung für Links
<a class="heading-link" href="#haftung-f%c3%bcr-links">
<i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i>
<span class="sr-only">Link to heading</span>
</a>
</h3>
<p>Dieses Angebot enthält Links zu externen Webseiten Dritter, auf deren Inhalte ich keinen Einfluss habe. Deshalb kann ich für diese fremden Inhalte auch keine Gewähr übernehmen. Für die Inhalte der verlinkten Seiten ist stets der jeweilige Anbieter oder Betreiber der Seiten verantwortlich. Die verlinkten Seiten wurden zum Zeitpunkt der Verlinkung auf mögliche Rechtsverstöße überprüft. Rechtswidrige Inhalte waren zum Zeitpunkt der Verlinkung nicht erkennbar. Eine permanente inhaltliche Kontrolle der verlinkten Seiten ist jedoch ohne konkrete Anhaltspunkte einer Rechtsverletzung nicht zumutbar. Bei Bekanntwerden von Rechtsverletzungen werde ich derartige Links umgehend entfernen.</p>Deploy a Vert.x app with an embedded SPA
https://marcusilgner.com/posts/2021-04-04-deploy-vertx-with-embedded-spa/
Mon, 05 Apr 2021 13:31:04 +0200https://marcusilgner.com/posts/2021-04-04-deploy-vertx-with-embedded-spa/<h1 id="deploy-a-vertx-application-with-an-embedded-spa">
Deploy a Vert.x application with an embedded SPA
<a class="heading-link" href="#deploy-a-vertx-application-with-an-embedded-spa">
<i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i>
<span class="sr-only">Link to heading</span>
</a>
</h1>
<p>As a developer I have come to enjoy the versatility and power of the <a href="https://vertx.io/" class="external-link" target="_blank" rel="noopener">Vert.x</a> platform. And although it contains many utilities for server-side rendering, called <a href="https://vertx.io/docs/vertx-web/java/" class="external-link" target="_blank" rel="noopener">Vert.x Web</a>, there are situations where you might want to use a single-page application (SPA) instead.</p>
<p>Concrete reasons for and against SPAs are best kept separate from this. One thing, however, that makes SPAs cumbersome for small teams is having to deploy them separately from the API they will talk to, so having a setup that allows for deploying everything in one go.</p>About me
https://marcusilgner.com/about/
Sat, 26 Oct 2019 16:19:45 +0200https://marcusilgner.com/about/<p>Born 1982, I spent my teenage years witnessing and exploring the rise of the
internet. Since, I have been able to gather professional experience in a
number of technologies: everything from network security and setting up
Sendmail-based mail servers 📨, doing computer games
development in C++ and DirectX 🎮, via Java business software
💼 up to web applications with Ruby On Rails 💎 and real-time data processing applications with Vert.x ✈️.</p>