Blog by Daniel Westheide

Blog Post

Faster Is Not Better: On Experimentation Culture and What It Costs

Faster experimentation sounds like an obvious advantage. But experimentation culture is not a universal paradigm. It is a product of a very specific context. And the people who bear the heaviest cost of poor product development never appear in any experiment.

Blog Post

The Agentic Trio

The Product Trio separated discovery from delivery because delivery required a larger team. Agentic development removes this constraint. That changes what a product team can look like.

Blog Post

Using the space, not optimizing the treadmill

Why agentic development needs product discovery

Blog Post

Accidental Complexity in the Heart of Software

Domain-Driven Design went mainstream over the last ten years – in parallel with a wave of digitalization and modernization projects. That is not a coincidence. And it explains a lot about why so many of these projects fail to deliver what they promise.

Blog Post

Hail Mary: Why domain knowledge cannot be extracted from experts

AI agents promise to replace weeks of requirements workshops with hours of structured interviews. The pitch is compelling. The cognitive science is not.

Blog Post

Spec-Driven Development is Domain-Driven Design’s Impatient Cousin

Why BMAD won’t save you

Blog Post

Understanding AI Coding Patterns Through Cognitive Load Theory

AI coding assistants either severely harm learning or enhance it beyond manual coding—depending entirely on interaction patterns. A recent study reveals six distinct patterns with dramatically different outcomes. We’ll examine why through cognitive psychology and explore the study’s limitations.

Blog Post

AI and Elaboration: Which Coding Patterns Build Understanding?

AI tools let you complete coding tasks without connecting new information to your existing mental models—a cognitive process known as elaboration that is crucial for building understanding. But some AI interaction patterns preserve this elaboration while others bypass it entirely. Let’s explore what elaboration is, why it helps with learning, and how we can use AI tools in a way that helps with this process rather than circumventing it.

Blog Post

Leave It Better Than You Found It

An Unexpected Architecture Win

Blog Post

Speed vs. Skill

Every AI coding tool promises the same thing: unprecedented speed, effortless productivity, freedom from tedious work. The pitch is compelling. But what if feeling more productive and being more capable aren’t the same thing? Research shows that automation makes us feel more productive while eroding our skills. Let’s examine this tension through the lens of cognitive psychology.

Blog Post

First Agile, Then Agentic

Agentic AI is supposed to accelerate software development. But new technologies can only reach their full potential when organizations adapt their structure, processes, and culture. Most organizations today are not yet able to truly benefit from faster software development. The prerequisite for this are the capabilities shaped by the agile and DevOps movements.

Blog Post

Type-safe SQL queries in Java and Rust

The Type-Safe Web Stack, Part 3

Blog Post

Type-safe HTML templates in Java and Rust

The current fashion in our industry is to use static and strong typing wherever possible. How fashion-conscious is the Java community when it comes to HTML templating, though? Let’s have a look at what approaches at type-safe or build-time verified HTML templating are available in the Java ecosystem, how they compare to what’s available in Rust, and whether the benefits outweigh the costs.

Blog Post

Type-safe HTTP routing in Java and Rust

In recent years, the trend in our pop-culture industry has been to favour static and strong typing as well as build-time checks over dynamic typing and techniques like late binding. Where possible, you are expected to use the compiler for correctness checks instead of unit tests. Even though the Java language is statically typed, its type system is often considered to be not very helpful. Web applications written in Java are traditionally bristling with weakly typed APIs, heavy use of reflection, and lots of annotations that are interpreted at runtime. Let’s see how far the trend towards build-time checks has been adopted in the Java ecosystem when it comes to writing web applications, how it compares to what’s done in the Rust community, and what benefits and weak points these techniques have.

Blog Post

How we cut our website’s carbon emissions in half

Decarbonising innoq.com

Blog Post

What is Sustainable Software?

Environmental sustainability is a very important issue, but software is something virtual, so it doesn’t seem to have an impact, right? Wrong! As software creators, we have a significant impact and can make a difference by incorporating the principles of eco-friendly software development into our understanding and practices.

Blog Post

Remote Mob Programming at INNOQ

At INNOQ, some teams successfully use the methodology Remote Mob Programming in customer projects, some of them even for more than two years. We asked four teams what their experiences with this particular method are and have been.

Blog Post

Blockchain Mining: Embarrassingly Parallel?

Blog Post

Blockchain Mining with Rust

Recently, at one of our yearly hands-on events, we took on the challenge of implementing our own blockchain. One of the core challenges of this is the mining of new blocks. In this blog post, I want to show two different approaches we tried out for this task, using the Rust programming language.

Blog Post

The language of maths is not the language of your business

Abstractions from category theory can be powerful. But there are reasons why you may want to keep your domain model free of them.

Blog Post

The perils of shared code

Blog Post

Solving the wrong problems

Instead of rushing to an engineering solution to a problem, we would often be better off by lying back and determining the root cause of our engineering problem, which is often an architectural one.

Blog Post

Why RESTful communication between microservices can be perfectly fine

Recent debates about REST versus message passing in microservice communication have led to some confusion. What is meant with asynchronous communication in this context and why is REST a perfectly valid choice?