A Software Architect’s Philosophical Notes #3
The Model Is Not Reality Imagine attending a meeting to design a new software system. Around the table are developers, analysts, domain experts, and someone responsible for making architectural decisions. At some point, someone says a word. Customer. Everyone nods. We know what a customer is. It doesn’t seem like a particularly difficult concept to […]
A Software Architect’s Philosophical Notes #1
When Software Stops Representing Reality Open the database of almost any business application. It could be an ERP, an e-commerce platform, a banking system, or the software used to manage hotel reservations. We will probably find something familiar. Customers. Products. Orders. Invoices. Payments. Shipments. We observed a part of the world, identified some things, gave […]
A Software Architect’s Philosophical Notes #1
The Problem Was Never the Code Lately, I’ve found myself questioning something I took for granted for many years. That my job was to build software. It sounds perfectly reasonable. After all, I’m a software architect. I spend my days discussing distributed systems, Domain-Driven Design, cloud platforms, event-driven architectures, AI, and microservices. It’s only natural […]
Living Documentation, Spec-Driven Development and DDD
In development teams, documentation is often perceived as a necessary evil: something produced after the work is done, under pressure, and therefore destined to quickly become obsolete. Diagrams describing systems that no longer exist, documents no one reads, decisions lost in the memory of individuals. In recent years, however, the increasingly widespread adoption of AI […]
Specification-Driven Development: Taking Back Control in the Age of LLMs
Large Language Models are now widely used in software development. They generate code, tests, documentation, and even architectural sketches. The problem, however, is not their capability—it is their lack of durable context. Even when guided by well-crafted prompts, LLM outputs are often inconsistent, unpredictable, and subtly misaligned with domain intent. This is not a failure—it […]
The Philosophy of Architecture
At first glance, the idea that philosophy and software architecture might be connected can sound a little strange. Yet a few months ago, I had the opportunity to attend a truly transformative course on software architecture—one that opened up an entirely new perspective for me, and a new way of understanding software as a means […]
Don’t Share Your Domain Events!
Designing for Evolution The first step to designing an evolutionary architecture is to design our software so that it can evolve easily. Yes, it’s easier said than done. What does it mean to design a system that can easily evolve with the continuous requests from the client? Let’s start with the classic legacy code. Often, […]
Problem Space vs Solution Space
Understanding Problems and/or Finding Solutions Among the many quotes falsely attributed to Albert Einstein, there is one that says: “If I had an hour to save the world, I would spend 55 minutes defining the problem and only 5 minutes finding the solution.” To briefly “translate” this statement, we could say that the problem space […]