If you have read my blogs before, you probably know about my passion for sports, and for Michael Jordan in particular.
But there is a second passion I rarely write about, and that is music.
Not just any music, but the kind that truly makes an impact, at least on me.
And the more I think about it, the more I suspect these two passions are not so far apart after all.
Continue reading →
In our projects we have been using ArchUnit for years to write unit tests that fail when the code no longer follows the architecture we chose.
Over the last year, we’ve written more and more of these tests.
What changed? Our audience grew.
These tests no longer just help fellow developers stick to the architecture; they help our coding agents too.
Coding agents are getting quite good at making larger changes to existing codebases.
Give an agent a task, some context and a test suite, and it often finds its way surprisingly well.
But one type of context is much harder to provide: the architecture we intended.
That is exactly the gap ArchUnit fills.
In this blog post I explain why ArchUnit becomes more valuable when working with coding agents, and I show some rules that actually help to guide them.
The list is far from complete, but I hope it inspires you to capture your own architecture in rules, whether you write them yourself or let your agent do it.
Continue reading →
Long story short: I’ve switched to using Actalis , the Italian Certification Authority and eIDAS -qualified Trust Service Provider owned by the Aruba Group.
Continue reading →
In the first part of this series, I described the most important lesson I learned while building a local AI storyteller:
A good LLM application is not a clever prompt.
It is software architecture around a probabilistic component.
That sounds reassuringly architectural.
It also leaves one small question:
What exactly are we building around?
Continue reading →
As software engineers, we are constantly challenged to explain what we do and how we do it.
This communication challenge becomes even more pronounced when we talk to non-technical stakeholders.
Now that AI is enabling us to produce more than ever before, this problem has become even greater.
But how do we effectively convey complex technical concepts to a non-technical audience?
Continue reading →
It was two o’clock in the morning before I noticed the time.
Earlier that evening I had been building an application.
I had written all the work in a backlog.md, a neat list of stories, and I let the AI pick them up one by one.
It would finish a story, ask me to verify everything, and then close with a simple question: shall I pick up the next task?
And every single time, that question was the trigger.
It would be a shame to stop now.
Just this one more, and then I’ll go to bed.
Continue reading →
I wanted to understand what happens when you stop treating an LLM as a chatbot and start treating it as a component in a software system.
So I built a local AI storyteller using a local LLM through an OpenAI-compatible API.
Continue reading →
People need not only to obtain things; they need above all the freedom to make things among which they can live, to give shape to them according to their own tastes.
— Ivan Illich
Tools for Conviviality
Continue reading →
The world is changed.
I feel it in the water.
I feel it in the earth.
I smell it in the air.
Much that once was is lost, for none now live who remember it.
— Galadriel (The Fellowship of the Ring)
Continue reading →
Kotlin adds the substringBefore, substringBeforeLast, substringAfter and substringAfterLast extension functions to the String class. Instead of using indices to get a substring you can use a string or character value. The functions without Last use the first occurrence of the delimiter and the methods with Last use the last occurrence. If the delimiter is not found the original string is returned. You can supply a value that should be returned when the delimiter is not found.
Continue reading →