Sep 28, 2026
Data-oriented programming in Java 21: modelling domains with records, sealed interfaces and pattern matching 1. Overview For years I modelled domain states in Java with one of two tools: an enum plus a lot of nullable fields, or a class hierarchy plus the Visitor pattern. Both work, but both hide mistakes. The compiler cannot tell me that a CAPTURED payment has no capture date, or that I forgot to handle a new state in one of twenty if chains.
Read more →Sep 18, 2026
A Simple Spring Integration Example 1. Overview Spring Integration is a framework that helps you connect systems inside a Spring application. It uses the same ideas as Enterprise Integration Patterns: messages, channels, and endpoints. If you already know Spring Boot, it feels familiar after a few minutes.
In this post I will show a minimal “hello world” example. We will send a name through a gateway, pass it over a channel, and get a greeting back.
Read more →Sep 17, 2026
Building a Fluent Java API with Consumer and BiConsumer 1. Overview When I build small internal libraries I try to keep the public API easy to read. Lately I have been using Consumer and BiConsumer a lot to let callers configure objects without writing long anonymous classes. The result looks like a builder, but each step is just a lambda that sets something up.
In this post I will show a made-up example: a small MenuBuilder that lets you add menu items.
Read more →Aug 24, 2026
Observability for virtual threads: tracing a Spring Boot 3 request with Micrometer and OpenTelemetry 1. Overview One property moves a Spring Boot service to virtual threads:
spring.threads.virtual.enabled=true After this change, throughput can improve. Observability can also lose important information. Traces can lose child spans, logs can lose their trace ids, and thread-pool metrics no longer show the real limit.
In this post I will show how to fix these three problems.
Read more →Aug 22, 2026
Structured concurrency and scoped values in Java 25: replacing ThreadLocal in request pipelines 1. Overview Virtual threads make it cheap to run many tasks. Two older patterns still cause problems in request pipelines: starting fan-out tasks without a shared scope, and storing request context in ThreadLocal.
In this post I will show how StructuredTaskScope and ScopedValue solve these problems in Java 25. I will also show how to move from the Java 21 preview API and which problems still need attention.
Read more →Jul 24, 2026
Virtual threads in Java 21: a practical guide for backend platforms 1. Overview Backend applications often use bounded thread pools. A request that waits for a database or another HTTP service keeps a platform thread busy. When the pool is full, latency grows.
In this post I will show how virtual threads work, how to enable them, how to check them, and which problems to avoid. Java 21 makes virtual threads a stable feature, but they are not a general performance switch.
Read more →Jul 21, 2026
ADR-01: Static site generator for my engineering portfolio 1. Overview I needed a personal site that I can maintain while my career grows. It must be easy to update, stored in Git, fast to load, and simple to deploy to GitHub Pages.
In this post I will show the options I considered and why I chose Hugo for this site.
2. Context The site needs to support portfolio pages and blog posts.
Read more →Jul 21, 2026
From ‘Hello world’ to an engineering portfolio 1. Overview I rebuilt giro-dev.github.io from a placeholder page into an engineering portfolio. The goal was to make my work and experience easy to find.
In this post I will show what changed and why I made these changes.
2. Goal I wanted to move from a placeholder page to an online profile for applications to Staff Engineer, Principal Engineer, and Software Architect roles in product-led companies.
Read more →Jul 21, 2026
Matriarch: test data generation for Java 1. Overview Java tests often need many objects before they can test the real behaviour. Creating those objects by hand takes time and makes the tests harder to read.
In this post I will show the idea behind Matriarch, a small Java library that creates test data with the Object Mother pattern.
2. Problem Writing test fixtures for Java POJOs and Records is repetitive and can introduce mistakes.
Read more →