<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://ewolff.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://ewolff.com/" rel="alternate" type="text/html" /><updated>2026-05-07T09:24:53+00:00</updated><id>https://ewolff.com/feed.xml</id><title type="html">ewolff.com</title><subtitle>Eberhard Wolff&apos;s Homepage</subtitle><author><name>Eberhard Wolff</name></author><entry><title type="html">The Myth of Objective Effort Estimation in Software Development</title><link href="https://ewolff.com/2026/01/22/the-myth-of-objective-effort-estimation-in-software.html" rel="alternate" type="text/html" title="The Myth of Objective Effort Estimation in Software Development" /><published>2026-01-22T00:00:00+00:00</published><updated>2026-01-22T00:00:00+00:00</updated><id>https://ewolff.com/2026/01/22/the-myth-of-objective-effort-estimation-in-software</id><content type="html" xml:base="https://ewolff.com/2026/01/22/the-myth-of-objective-effort-estimation-in-software.html"><![CDATA[<p>An objectively estimate would clarify how long it takes to implement a
feature and how much it costs. This could help e.g. when outsourcing
development services.</p>

<p>In agile methods, the effort of a feature is estimated as a story
during planning meetings to decide whether a story should be
implemented. This is optional: NoEstimates describes projects that
work entirely without effort estimates. The advantage: The effort
spent on estimating is eliminated and can instead be used to develop
stories. It is enough prioritization if everyone on the team works on the
currently most valuable feature. <a href="https://software-architektur.tv/2025/02/24/episode252.html">Woody
Zuill</a> is
a pioneer in this area and has never worked any other way.</p>

<p class="callout">Is it enough prioritization if everyone on the team works on the
currently most valuable feature?</p>

<p>Estimating stories is usually based on a reference story or
functionality that is assigned a size of one. Other stories are
estimated relative to this reference, by and for the team that is
doing the estimating. In addition, there is the team’s velocity
(speed). It is measured in implemented story points per iteration and
can change over the course of a project.</p>

<h2 id="objective-estimates">Objective estimates?</h2>

<p>So the estimate is not objective, because it involves the specific
team and because velocity changes over time. However, the estimation
methodology achieves its goal: it allows teams to plan their
work. Through estimation relative to a reference story and through
velocity, it is also possible to make a reasonably good estimate of
what a team can deliver.</p>

<p>Of course, one can try to make these measurements more objective. For
example, a uniform reference story could be chosen. There are
approaches that go much further. The <a href="https://en.wikipedia.org/wiki/Function_point">Function Point
method</a> attempts to
measure the objective complexity of a business requirement in function
points. But these methods also show variability in estimates. In
addition, they require experience in estimating and are
labor-intensive. Methods such as
<a href="https://en.wikipedia.org/wiki/COCOMO">COCOMO</a> even warn that their
results provide only rough numbers, not precise estimates.</p>

<p>The usefulness of such estimates is questionable: projects always
change their scope. When software is used in practice, new
requirements emerge. Software development is a process in which
engineers and users learn together how best to support business
processes with software. When you learn something new, you change the
scope. Then precise estimates for the original scope are no longer
worth much, and the effort spent on additional precision is not well
invested. Perhaps this is why agile estimation is used in practice,
but more sophisticated methods rarely are.</p>

<p class="callout">When software is used in practice, new requirements emerge.</p>

<p>Overall, the focus on effort in projects is often exaggerated. Like
any investment, an investment in software must generate value that
exceeds the investment — ideally by a large margin. Estimating value,
however, often seems to be treated as a secondary concern compared to
estimating effort.</p>

<h2 id="start-ups">Start-ups</h2>

<p>There are very small teams that have developed extremely successful
software. Such outliers raise the question of whether objective
estimation is even possible. Before its acquisition,
<a href="https://www.theverge.com/2012/4/13/2946785/facebook-instagram-acquisition">Instagram</a>
was valued at one billion dollars, operated a globally scaled system,
and did so with only 13 employees. Before its acquisition,
<a href="https://www.wired.com/2015/09/whatsapp-serves-900-million-users-50-engineers/">WhatsApp</a>
had 900 million users; 50 engineers developed and operated this
system. That is a fraction of the staff involved in many IT projects
at established companies.</p>

<p>These applications appear to be “just” a simple photo-sharing app or a
messaging app. Does that explain the low staffing numbers? Insurance
products or savings plans seem also simple: you pay money and under
certain conditions, you get money back. Search engines are also
simple: there is even off-the-shelf software to index and search
documents.</p>

<p>On a superficial level, everything appears simple. The complexity of
a problem only becomes clear when you look at the details and truly
understand the problem.</p>

<p class="callout">The complexity of a problem only becomes clear when you look at the
details and truly understand the problem.</p>

<p>Regardless of complexity, the economic success of a project is the
most important outcome. In this respect, Instagram and WhatsApp are
truly convincing: they created billions in value. That is almost only
possible for successful start-ups. But for every successful start-up,
there are many that are not successful.</p>

<h2 id="established-companies">Established companies</h2>

<p>Let’s assume an established company were to build a photo-sharing app
or a messaging app. It would build it using its typical mechanisms:
potentially hundreds of developers, sophisticated project management,
and detailed project plans. Thirteen people developing a central
system for a market breakthrough would more likely be perceived as a
risk than great value for the money. Large teams and projects also
bring a lot of <a href="https://www.youtube.com/watch?v=3MP-4UcAYJU">prestige</a>
— for everyone involved, for managers, but also for
engineers. Finally, established companies usually have many software
projects, and the survival of the company rarely depends on any single
one — unlike a start-up. The pressure is therefore objectively lower
at established companies.</p>

<p>There are thus lots of mechanisms that lead to a completely different
level of effort. An established company will develop a software system
using the mechanisms it typically employs and is in a different
competitive situation than a start-up. In a start-up, on the other
hand, the economic conditions are such that something has to go live
as quickly as possible, maybe even at all costs — with corresponding
consequences.</p>

<h2 id="solving-problems-differently">Solving problems differently</h2>

<p>It is also unlikely that an established company would build exactly
the same application for a problem such as photo sharing or
messaging. The IT landscape into which the application must integrate
is different. Not really necessary requirements might be added —
something a start-up often cannot afford due to its economic
constraints.</p>

<p>A start-up would therefore likely develop a much simpler solution even
in areas that are traditionally implemented with complex software
systems — simply because it needs to get to market quickly and has a
very limited budget.</p>

<p>So trying to assess an objective effort makes even less sense:
software solves a problem that an organization has. For example, the
organization wants to establish a new product. To do so, it relies on
the social processes embedded in the organization. For a start-up, the
approach of an established company is just as alien as the approach
of a start-up is to an established company. This includes not only the
development process, but also the product itself.</p>

<p>In the end, the objective effort should not really concern us too
much. What matters is how we can develop better software in a given
situation. And for that, there are always many exciting possibilities.</p>

<h2 id="tldr">tl;dr</h2>

<p>Determining the objective effort for a feature may be possible, but
only with great effort. Since it is unnecessary and costly for
planning, most projects do not use such techniques at all. Software is
also “just” an implementation of the solution to a business
problem. Organizations approach problems differently, so the solution
and the effort will differ for that reason alone. Nevertheless, one
can and should ask questions about
<a href="https://www.youtube.com/watch?v=zLN_apxG8PM">productivity</a> and better
ways of working.</p>

<p><em>This is a translation of my <a href="https://www.heise.de/blog/Warum-objektive-Schaetzungen-in-der-Softwareentwicklung-nicht-funktionieren-11074323.html">German blog post at heise
Developer</a>.</em></p>]]></content><author><name>Eberhard Wolff</name></author><category term="Fundamentals" /><summary type="html"><![CDATA[The estimated effort of a software project usually refers to the specific team involved. But can effort be estimated objectively and independently of the team?]]></summary></entry><entry><title type="html">Cohesion, Modules, and Hierarchies</title><link href="https://ewolff.com/2026/01/08/cohesion-modules-hierachies.html" rel="alternate" type="text/html" title="Cohesion, Modules, and Hierarchies" /><published>2026-01-08T00:00:00+00:00</published><updated>2026-01-08T00:00:00+00:00</updated><id>https://ewolff.com/2026/01/08/cohesion-modules-hierachies</id><content type="html" xml:base="https://ewolff.com/2026/01/08/cohesion-modules-hierachies.html"><![CDATA[<p>Cohesion means something like “togetherness”. The cohesion of a module
is good when the individual parts of the module somehow belong
together. In fact, it is possible to develop good architectural
designs by simply implementing functionalities that intuitively belong
together in a single module such as a microservice.</p>

<p class="callout">Cohesion and loose coupling are therefore related and
mutually dependent.</p>

<p>For example, assume that a specific product can be reserved, then
ordered, and finally delivered. We are talking about a concrete
product — for instance, a specific used laptop that exists only once
in stock with exactly this configuration. The functionalities
ordering, reserving, and delivering are candidates for a shared
implementation in one microservice. They could <strong>share a data model</strong> in
which the state of a product (ordered, reserved, delivered) is
stored. If one of these functionalities is implemented somewhere else,
this model is torn apart. The status would then have to be available
in two places. As a result, the modules would have to interact a lot,
because the product’s state would have to be kept consistent in both
places. In addition, changes might require modifying both places—and
then the two microservices would no longer be loosely
coupled. Cohesion and loose coupling are therefore related and
mutually dependent.</p>

<p class="callout">This way of thinking in terms of models and shared functionality is
central to good modularization.</p>

<p>This way of thinking in terms of models and shared functionality is
central to good modularization. Unfortunately, this does not seem to
be clear to all software developers and architects, so in practice
models that actually belong together are sometimes split apart,
resulting in poor modularizations.</p>

<p>As so often, there are gray areas here. The concrete approach depends
primarily on the specific domain. That ordering, reserving, and
delivering are so closely related that they must share a data model is
a result of the specific domain. If, for example, not a specific
laptop is reserved and ordered, but merely some laptop that meets
certain specifications, the modeling can look different. Then it may
be sufficient to reconcile inventory levels to avoid reserving and
ordering too many laptops with certain specifications. This difference
is a consequence of the business model: for used laptops there may be
only one specific item with a given configuration, while for new
laptops there may be a stock of identical products.</p>

<p>Delivering the laptop means that no other customer can reserve or
order it. But delivery must also is have logic to actually ship the
laptop, which may be better placed in another module. In other words,
the domain concept of “delivery” can be represented in different
models across different modules: one module that models the state of
the product (reserved, delivered …), and another that actually does
the actually shipment process.</p>

<h2 id="cohesion-code-duplication-and-dry">Cohesion, Code Duplication, and DRY</h2>

<p><strong>Code duplication</strong> might be an indicator of weak cohesion. This makes
sense: when code is duplicated, the same or almost the same logic is
implemented in two places, even though it should really exist in only
one place. Something has been “torn apart” that probably belongs
together. <strong>DRY (Don’t Repeat Yourself)</strong> can be a countermeasure. DRY
says code should never be duplicated; instead, code should always be
adapted to be flexible enough to cover multiple cases. For example,
duplication of a class can be avoided through a superclass and
inheritance, or duplication of a method through an additional
parameter or a conditional branch.</p>

<p>But the example of data modeling for laptops is a case where DRY and
avoiding code duplication would not have solved the problem. One can
implement ordering and reserving in two separate microservices and
thus achieve no cohesion, while still adhering to DRY. DRY alone is
therefore not sufficient as a concept for achieving cohesion.</p>

<p class="callout">Code duplication violates cohesion but can create loose coupling.</p>

<p>Interestingly, code duplication violates cohesion but can create loose
coupling: When code is duplicated, the two copies can be evolved
independently. For example, if a specific software solution for one
customer is to be turned into an industry solution, one can copy the
specific solution for each customer and adapt it. This is very easy to
implement and enables completely separate development, making
customer-specific changes easy. The changes are thus completely
decoupled — more than just loosely coupled. On the other hand, copying
code also means that a separate, specific solution emerges for each
customer, making it nearly impossible to implement features for all
customers, because these features would have to be implemented in all
customer-specific code bases.</p>

<p class="callout">Implement a generic core only after the third similar implementation?</p>

<p>It seems obvious that it is better to use a single code base for all
customers — there are reasons why DRY an important concept. But then
one has to design a reusable code base of domain logic. This is not
easy at all, which is why
<a href="https://software-architektur.tv/2023/10/13/episode184.html">some</a>
actually recommend implementing a generic core only after the third
similar implementation. This suggests that up to a certain point,
one benefits more from strict separation and the resulting loose
coupling than from reuse and the tight coupling of a shared code base.</p>

<h2 id="hierarchies">Hierarchies</h2>

<p>In the laptop example, the discussion revolved around functionalities
such as ordering products. With the proposed decomposition, changes to
this functionality would affect only one microservice. But other
criteria for cohesion can also be defined: doesn’t all business logic
code belong together? And the user interface code? When changes are
made to the ordering process, both parts of the system are affected: a
change in business logic can only be used after corresponding changes
to the user interface. Nevertheless, business logic belongs together
and should be separated from user interface code. So there is another
level of modules and cohesion here.</p>

<p class="callout">Modules form a hierarchy.</p>

<p>In fact, modules form a hierarchy: microservices, for example, are
divided into e.g. Java packages that may contain user interface or
business logic. Below that are classes that contain specific parts of
the business logic or user interface, and finally methods. At all
these levels, things that belong together should be implemented
together.</p>

<p class="callout">At a coarse-grained level, decomposition should follow domain concerns.</p>

<p>At a coarse-grained level such as microservices, decomposition should
follow domain concerns; at a fine-grained level, it should follow
technical aspects such as business logic and user interface. Cohesion
applies to all sizes of modules such as microservices, Java packages,
or classes.</p>

<h2 id="size-and-cohesion">Size and Cohesion</h2>

<p>There is a trivial way to always ensure that everything that belongs
together is in one module: just have a single module for the complete
system. For example, one microservice for an entire system, or one
class for a microservice. Obviously, this is a bad idea, because the
systems then become very hard to understand. So size plays a role:
microservices, classes, and methods should be small enough to understand.</p>

<p class="callout">Cohesion also means separating what does not belong together.</p>

<p>So cohesion does not only mean grouping together what belongs
together, but also separating what does not belong together. If
unrelated domain concerns are implemented together in one
microservice, it not only becomes too large, but there are also too
many domain reasons to change it, turning it into a change hotspot.</p>

<h2 id="conclusion">Conclusion</h2>

<p>Cohesion provides a good way to identify modules: if you implement
things that belong together in the same module, you created at good
designs. Like all other rules for designing architectures, also this one
depends on the domain and the specific use case. This makes it
difficult to apply in practice. However, it applies at all levels:
microservices, packages, classes, and even methods. That is why it is
so important to truly understand these concepts and their effects.</p>

<p><em>This is a translation of my <a href="https://entwickler.de/reader/reading/java-magazin/5.2025/c089adccc63144b27b9cfcd0">German article at Java
Magazin</a>.</em></p>]]></content><author><name>Eberhard Wolff</name></author><category term="Fundamentals" /><summary type="html"><![CDATA[Good modules have high cohesion — alongside loose coupling from previous post, this is the most important property of modules. But why is cohesion so important? And how does it influence the design of software systems?]]></summary></entry><entry><title type="html">How Architects Create Real Impact</title><link href="https://ewolff.com/2025/10/20/how-architects-create-real-impact.html" rel="alternate" type="text/html" title="How Architects Create Real Impact" /><published>2025-10-20T00:00:00+00:00</published><updated>2025-10-20T00:00:00+00:00</updated><id>https://ewolff.com/2025/10/20/how-architects-create-real-impact</id><content type="html" xml:base="https://ewolff.com/2025/10/20/how-architects-create-real-impact.html"><![CDATA[<p>First of all: of course, architects need technical expertise. They
must design architectures — and that involves structuring the system
into <strong>modules</strong>, classes, etc., to enable long-term
maintainability. Another aspect of architecture work involves making
<strong>technical decisions</strong> about certain technologies or
approaches. These decisions influence qualities (also known as
non-functional requirements) such as security, performance, or
usability. Making such decisions is at the core of architecture
work. Knowledge of technologies and architectural approaches is
therefore essential. But understanding the specific <strong>requirements</strong>
and desired <strong>qualities</strong> is also necessary to work effectively on the
architecture.</p>

<p>These aspects of architectural work are the focus of most articles,
books, and talks on the subject. However, this article takes a
different angle — because even a perfect architecture is useless if it
is not implemented. Only then can architects make an <strong>impact</strong>. This
aspect is extremely important in practice, yet there is significantly
less material available on the topic.</p>

<h2 id="writing-code-yourself">Writing Code Yourself?</h2>

<p>Architectural decisions affect the code: the code’s structure and the
technologies used within it. So, one might simply sit down at the
computer and implement the architectural decisions directly in
code. That approach obviously works if you’re implementing a project
alone. But most projects are developed by <strong>teams</strong>. You can still
implement your architectural ideas yourself — but that alone isn’t
enough if the other developers implement things that don’t align with
your design. And since there are more of “them” than “you,” your
architectural ideas will never be fully reflected in the code unless
they get on board.</p>

<p class="callout">The real challenge is influencing the other developers.</p>

<p>So, the real challenge is <strong>influencing</strong> the other
developers. Writing code yourself can help with that. It allows you to
better understand the challenges others face, gives you firsthand
experience with at least part of the technical context, and increases
your credibility — since you’re not just talking abstractly about
concepts, but actually applying them. Pair programming with other
developers can also help bring architectural ideas to life within a
project.</p>

<h2 id="communication">Communication!</h2>

<p>At this point, it should be clear what this is really about:
<strong>communicating</strong> ideas and <strong>convincing</strong> developers. Some people
expect there to be a kind of magic that allows them to persuade others
of their views. Even if such magic existed — would you really want to
convince everyone of the superiority of your own architectural ideas?</p>

<p>In software architecture, there are many possible options for every
decision. Depending on the specific context, one or another option
might make sense. Sure, you can debate endlessly about which framework
is better, how APIs should be structured, or which architectural
paradigms to use. But in the end, projects often fail for entirely
different reasons — misunderstood requirements, communication
breakdowns, or organizational challenges are common causes. And the
“correct” architecture always depends on the context. In other words:
many options can work; the differences between them might not be huge,
and the supposedly better option can turn out to be suboptimal. Making
compromises requires being willing to compromise — not clinging to a
single approach in a quasi-religious way.</p>

<p>Therefore, an <strong>open dialogue</strong> is better. Other developers may have
ideas or knowledge that lead to better decisions. It’s not about
persuasion — it’s about dialogue that leads to shared, and ultimately
better, decisions.</p>

<p class="callout">Other developers may have ideas or knowledge that lead to better
decisions.</p>

<p>That requires everyone involved to be willing to engage in such a
dialogue — not just push their own egos. Architects need to <strong>foster
such conversations</strong> and deal constructively with disagreement or
resistance, rather than ignoring it.</p>

<p>What applies to architects also applies to other technical
professionals: at a certain seniority level, they must engage in
discussions with others and share their knowledge and ideas. Only then
can they have an impact beyond their direct personal
involvement. Simply opposing others is not enough.</p>

<h2 id="management">Management?</h2>

<p>At first glance, architects seem to primarily talk to developers and
other technical people. But software projects involve many
stakeholders who define requirements and provide valuable input — so
they must also be included in the dialogue.</p>

<p class="callout">Software projects involve many stakeholders - they must also be
included in the dialogue.</p>

<p>In addition, management and other stakeholders often make decisions
that affect projects. This includes direct <strong>architectural decisions</strong>
— such as which technology to use or whether to adopt an approach like
microservices. Ideally, such decisions should be made by architects,
since they are the experts. Management’s involvement in these
decisions is therefore somewhat contradictory — they are not the
experts and should defer to those who are.</p>

<p>Management also makes decisions about <strong>team setup</strong> and <strong>team
responsibilities</strong>. Since Conway’s Law, we know that organizational
structure affects architecture. Yet such organizational decisions are
often made by management without considering architectural
implications.</p>

<p>In practice, many architects treat these decisions as fixed and
unchangeable. Sure, they are made by people higher up the hierarchy —
but you can still talk to those people and influence their
decisions. Just as architects should engage in <strong>dialogue</strong> with
developers, they should do the same with management.</p>

<p class="callout">Just as architects should engage in dialogue with developers, they
should do the same with management.</p>

<p>Of course, it can be convenient to let others take responsibility for
decisions. But at the very least, architects should provide
feedback — especially when they have unique insight. That feedback helps
improve decisions overall.</p>

<p>Sometimes, decisions need to be “translated”: management may not
understand how organizational structures influence
architecture. Likewise, management doesn’t care about the “beauty” of
code, but they do care about development efficiency. As an architect,
you need to perform this translation if you want your ideas to be
heard.</p>

<h2 id="dimensions-of-effectiveness">Dimensions of Effectiveness</h2>

<p>There are thus two dimensions of impact: based on your knowledge and
skills, you can design better or worse <strong>architectures</strong> — but whether
they are actually implemented depends on how effectively you operate
within the <strong>organization</strong>. Both dimensions must be considered when
making decisions.</p>

<p>It can even make sense to choose the option preferred by the majority,
even if it’s technically inferior to the one you would choose
yourself. That option will likely receive more support. And in many
cases, the different options don’t lead to dramatically better or
worse outcomes. It might even be that your preferred option only seems
better to you but is in fact worse. Software architecture is complex,
and the consequences of decisions are often impossible to fully
predict.</p>

<p>On the other hand, when decisions could have catastrophic
consequences, you must speak up and escalate if necessary. It would be
completely irresponsible to let such decisions go unchallenged. The
first step is not to treat decisions — especially those made by
management—as immutable truths.</p>

<p class="callout">It’s crucial to prioritize which decisions to “push through” or firmly
resist.</p>

<p>Thus, it’s crucial to prioritize which decisions to “push through” or
firmly resist, and which to approach by focusing on communication and
collaboration.</p>

<h2 id="conclusion">Conclusion</h2>

<p>Designing architectures and selecting technologies are prerequisites
for successful architectural work — but they’re not enough. To make an
impact, architects must communicate with developers. The goal isn’t
necessarily to impose one’s own ideas but to engage in dialogue,
question those ideas, and revise them if needed. Writing code can
help, but communication skills are far more important.</p>

<p>The same applies when dealing with management and other
stakeholders—these skills are essential for influence. Without the
ability to create impact, even the best architectural designs will
never be realized. That’s why <a href="https://software-architektur.tv/2024/08/16/episode228.html">communication is so important in
IT</a>. And
there are, of course, <a href="https://software-architektur.tv/tags.html#Kommunikation">many
ways</a> to
improve these skills — for example, through <a href="https://software-architektur.tv/2024/10/04/episode234.html">facilitation
techniques</a>.</p>

<p><em>This is a translation of my <a href="https://entwickler.de/reader/reading/java-magazin/4.2025/2f30e08fa9bd5efa002644f3">German article at Java
Magazin</a>.</em></p>]]></content><author><name>Eberhard Wolff</name></author><category term="Fundamentals" /><summary type="html"><![CDATA[Designing architectures is one thing — but how can you ensure that the architecture you’ve designed is actually implemented? Every architect faces this challenge if they want to make an impact in a project.]]></summary></entry><entry><title type="html">The Problem with Loose Coupling and Why It Is Important</title><link href="https://ewolff.com/2025/09/15/loose-coupling.html" rel="alternate" type="text/html" title="The Problem with Loose Coupling and Why It Is Important" /><published>2025-09-15T00:00:00+00:00</published><updated>2025-09-15T00:00:00+00:00</updated><id>https://ewolff.com/2025/09/15/loose-coupling</id><content type="html" xml:base="https://ewolff.com/2025/09/15/loose-coupling.html"><![CDATA[<p>As so often in software architecture, loose coupling is about
<strong>dependencies</strong>. An architecture divides software into different
parts such as packages, microservices, or classes. Ideally, this
allows you to change and understand just one part instead of the whole
system. There must, of course, be dependencies between these parts
because they are supposed to form a complete system. Therefore, truly
“independent” components are impossible. The question then becomes:
what kinds of dependencies should we aim for?</p>

<p>This is where loose coupling comes in: if changes do not ripple
through to dependent components, we speak of <strong>loose coupling</strong>. The
two components may depend on each other, but a change typically
affects only one component and does not touch its dependents. Some
<strong>changes</strong> may still involve both components, but under loose
coupling, this is the exception.</p>

<p class="callout">If changes do not ripple through to dependent components, we speak of
<strong>loose coupling</strong>.</p>

<p>This property plays a crucial role: it ensures that we can modify
<strong>large systems</strong> by changing just one component while largely
ignoring the rest. Without loose coupling, changes become difficult
because dependencies may cause effects throughout the system. In the
worst case, those effects become unpredictable, and the software is
practically unchangeable because the risk of unintended side effects
is too great.</p>

<h2 id="how-to-achieve-loose-coupling">How to Achieve Loose Coupling</h2>

<p>If loose coupling is so important, the obvious question is how to
achieve it. A key concept is modularization: components expose an
<strong>interface</strong> and hide their <strong>implementation</strong>. For classes, for
example, the interface consists of public methods, while their
implementation and private methods remain hidden. This guarantees that
other classes can only depend on the interface. A change that keeps
the interface stable does not technically propagate to other
classes. Of course, a change in behavior may still force updates to
other classes.</p>

<p class="callout">A key concept is modularization: components expose an <strong>interface</strong>
and hide their <strong>implementation</strong>.</p>

<p>Modularization and loose coupling are also why you should avoid
exposing <strong>instance variables</strong> directly: if you change how data is
modeled in instance variables but those variables are accessed outside
the class, changes will ripple outward, making the coupling less
loose. An even more extreme case is sharing a database directly. At
worst, you may not even know which applications are reading from or
writing to the database. If you want to change the database schema,
all these applications could be affected. This tight coupling is why
database schemas often become practically unchangeable. The remedy is
to hide the data model and allow access only through an interface.</p>

<p>There are many other potential dependency hotspots where changes can
ripple through the system — shared data structures, for example.</p>

<p>So, loose coupling is achieved through <strong>modularization</strong> — the
fundamental concept of software architecture. But in practice, loose
coupling is so critical that we often wish for additional ways to
improve it.</p>

<h2 id="adapter-layers-not-a-good-idea">Adapter Layers: Not a Good Idea!</h2>

<p>Some architectures introduce an extra layer to further decouple
interface and implementation. In this layer, data is copied into
<strong>Data Transfer Objects (DTOs)</strong>, and an adapter with its own
interface is implemented to hide the interface of the underlying
layer. The idea is that changes to the external interface won’t “bleed
through” but can be addressed by updating only the DTO and
adapter. This should in theory create looser coupling since
changes typically affect only this layer.</p>

<p class="callout">The idea is that changes to the external interface won’t “bleed
through” but can be addressed by updating only the DTO and
adapter.</p>

<p>In reality, these adapter layers often get in the way. When a change
does propagate, you have to update the adapter layer in addition to
the implementation. Adding a new feature to the interface always
requires updating the underlying implementation as well as the adapter
layer.</p>

<p>Subjectively, such adapter layers tend to hinder more than they help
because some changes become more cumbersome. The <strong>overhead</strong> rarely
seems justified by the savings in other cases. This situation occurs
whenever changes commonly pass through the adapter layer — which is not
unusual: new features and changes affecting more than just the
interface are frequent, and these always pass through the
adapter. Furthermore, the system now has an extra layer, making it
harder to understand and thus harder to modify.</p>

<p class="callout">Subjectively, such adapter layers tend to hinder more than they help
because some changes become more cumbersome.</p>

<p>This points to another issue with loose coupling: it is easy to look
back and see whether a system was loosely coupled for past
changes. But <strong>designing</strong> a system to remain loosely coupled for
future changes is much harder. Good modularization will likely result
in looser coupling; adapter layers, on the other hand, rarely will.</p>

<p>Therefore, it’s worth examining loose coupling to improve it. An
important input for this is <a href="https://software-architektur.tv/2023/06/07/folge168.html">Behavioral Code
Analysis</a>. It
looks at how a team interacts with and changes the software. This
approach reveals which parts of the code are often changed
together. You can then take steps to restructure the code so that
similar changes in the future affect only a small part of the system,
making them easier to implement.</p>

<p>In general, <strong>iterative architecture evolution</strong> is a good idea. As
the project progresses, you learn which approaches work well or poorly
and can adjust the architecture accordingly. Only through such
adjustments do truly good architectures emerge. If you neglect
iterative improvement, the system’s quality will inevitably decline.</p>

<h2 id="domain-logic">Domain Logic</h2>

<p>Still, it would be nice to design a system upfront to achieve as much
loose coupling as possible. As mentioned, modularization can help — but
it’s also worth considering completely different strategies. Up to
this point, we have mainly looked at technical measures like
modularization or adapter layers. But software is usually changed or
extended because of the domain.</p>

<p class="callout">But software is usually changed or extended because of the
domain. Therefore, you shouldn’t rely solely on technical measures —
you should strive to reflect the <strong>domain concepts</strong> accurately in
code.</p>

<p>Therefore, you shouldn’t rely solely on technical measures — you
should strive to reflect the <strong>domain concepts</strong> accurately in
code. Then, domain-related changes become easy to
implement. Misrepresentations are common here. For example, if a
payment module knows too much about products, it will need to be
updated whenever a new type of product is introduced. That leads to
tight coupling: every change for a new product type affects payment,
in addition to other modules that configure products. But this is also
probably a domain modeling mistake: conceptually, payment should
simply ensure a specific amount of money is received. Why should this
part of the system know which product that amount applies to? That’s a
question about the domain — but it can lead to loose or tight
coupling, especially for critical changes to the domain logic. No
technical measure — neither modularization nor adapter layers — can solve
this problem. On the contrary, an adapter layer could make changes for
a new product even more complicated.</p>

<p>Thus, a sensible separation of domain logic is a key factor
for loose coupling — and this can be addressed during system design, not
just afterward.</p>

<h2 id="conclusion">Conclusion</h2>

<p>Loose coupling is rightly considered an essential property of good
architecture. Only with this property are large systems truly
maintainable, as changes have minimal impact and are therefore lower
risk. To achieve it:</p>

<ul>
  <li>Focus on modularization and domain modeling</li>
  <li>Be skeptic about technical measures that introduce extra code — like
adapter layers</li>
  <li>Examine how your team interacts with the software. This can teach
you valuable lessons about your architecture and help simplify typical
changes.</li>
</ul>

<p><em>This is a translation of my <a href="https://entwickler.de/reader/reading/entwickler.de-blog/3.2025/8ac0fd017dcfe238f917b41d">German article at Java
Magazin</a>.</em></p>]]></content><author><name>Eberhard Wolff</name></author><category term="Fundamentals" /><summary type="html"><![CDATA[Loose coupling is a very well-known concept and is regarded as an important quality of an architecture—perhaps even the most important. But how can loose coupling actually be achieved? And why exactly should an architecture have this property?]]></summary></entry><entry><title type="html">Designing Models Together - Collaborative Modeling</title><link href="https://ewolff.com/2025/08/26/designing-models-together-collaborative-modelling.html" rel="alternate" type="text/html" title="Designing Models Together - Collaborative Modeling" /><published>2025-08-26T00:00:00+00:00</published><updated>2025-08-26T00:00:00+00:00</updated><id>https://ewolff.com/2025/08/26/designing-models-together-collaborative-modelling</id><content type="html" xml:base="https://ewolff.com/2025/08/26/designing-models-together-collaborative-modelling.html"><![CDATA[<p>Software development is, at its core, the creation of models: Code
models reality and business logic. If an insurance premium needs to be
calculated, the code performs this calculation and thus models the
insurance’s business logic. Besides code, there are various other
models. These include formal models such as UML (Unified Modeling
Language), which can be used to model many different domains. UML is
formal because every element has precise, fixed semantics. This has
been leveraged, for example, in generating code from UML. Naturally,
there are also informal models, which we use spontaneously to discuss
software collaboratively. These models are particularly useful for
informal communication.</p>

<p>Ultimately, informal models must at some point be transformed into
formal models. For software to run, at least one formal model must
exist — the code. Like UML, code has a clear semantics, defined by the
programming language used. Creating code is the responsibility of
technical people. Typically, they can also express themselves well with
other formal models, since they can transfer their programming
knowledge to these.</p>

<p>But in order to write code and create other formal models, they need an
understanding of the business logic. That’s where domain experts come
in. They know how the domain is structured and which domain logic must
be implemented. However, they are usually not able to write code, and
other formal models may also be difficult to understand for them.</p>

<h2 id="collaboration">Collaboration</h2>

<p>Therefore, technicians and domain experts must agree on a shared model
to express their understanding of the domain. This allows knowledge to
move from the heads of domain experts into those of technicians, and
eventually into formal models such as code.</p>

<p>In this context, communication becomes the primary focus of
models. Event Storming has established itself as a technique here:
Domain experts write events that happen in the domain on orange
Post-its and arrange them on a timeline, often on a wall. The benefit
of this technique is its low barrier to entry. No complex formal
models need to be understood — simply writing Post-its suffices to
informally express logic.</p>

<p>Other techniques work in a similar way:</p>

<ul>
  <li>
    <p>Specification by Example captures example processes or values from
the domain. This concept is closely related to Behavior-Driven
Design (BDD). One describes what happens in the domain under certain
conditions. These scenarios can be expressed in natural language
while following a defined structure, making them executable as
automated tests. Tools such as <a href="https://cucumber.io/">Cucumber</a>
support this approach.</p>
  </li>
  <li>
    <p>Spreadsheets can also serve as inputs for such modeling. For
example, a spreadsheets might calculate the interest rate for a loan
depending on credit rating, term, and other parameters. Such
spreadsheets can be created with familiar tools like Excel, then
read and parsed by tests to verify the implemented code against
these requirements. This way, domain experts can use tools they
already know to express logic.</p>
  </li>
</ul>

<p>These models are not informal. They are clearly formal enough to be
executed as tests — just like code.</p>

<p>It is not uncommon for domain experts to work with formal
languages. Machine operators program CNC machines. Office workers use
Excel, often with complex macros. BPMN (Business Process Model and
Notation) can also be used by domain experts. Business processes are
modeled in this formal language and thus made executable by
computers. While domain experts may not be able to create BPMN
diagrams themselves, they can often understand them and collaborate
with technical people to create them.</p>

<p>Domain experts can even be provided with DSLs (Domain-Specific
Languages) to express their logic. For instance, a DSL could be
created for modeling tax calculation rules, enabling the development
of systems for tax filing and consulting.</p>

<p>The way collaboration around models is organized defines the
development process: With Event Storming, technical people learn about
the domain logic and then implement it in code. With DSLs, developers
create tools that let domain experts express the logic in code
themselves. This is a sociotechnical perspective: Depending on the
division of work, systems can be implemented in very different ways.</p>

<h2 id="sociotechnical-influences">Sociotechnical Influences</h2>

<p>There is another sociotechnical dimension: These models primarily
facilitate communication. Event Storming, for instance, has many
advantages here. Writing Post-its and sticking them on a wall is
something even introverted people can do. Multiple people can work on
the model in parallel. This enables a different style of collaboration
than a classic meeting, where one person — or only extroverts — are active
while others remain passive. Model quality and shared understanding
benefit greatly from the active involvement of as many participants as
possible. Because these models explicitly foster collaboration, we
speak of collaborative modeling.</p>

<p>Practices from this approach can be carried over into other
meetings. Post-its, for example, can also play a role outside Event
Storming. Of course, there are many other ways to structure group
collaboration so that more people actively contribute their
knowledge. One example is Liberating Structures. Collaborative
modeling is just one concept among many to strengthen collaboration.</p>

<h2 id="social-relationships">Social Relationships</h2>

<p>In such meetings and design sessions, something else becomes visible
beyond the artifacts themselves: How people collaborate in context,
where knowledge silos exist, and what social interactions in this
environment look like. Since collaboration is often at the core of
project challenges, these insights can be very valuable for project
success.</p>

<p>It is especially important to look not just at the artifacts but also
at the process of creating them. Certainly, artifacts contain
knowledge about the domain and thus important information. But perhaps
we overvalue them compared to the insights gained into social
structures, the practice of collaboration and communication, and the
knowledge exchange that happens during artifact creation. For example,
collaborative modeling reveals who understands which part of the logic
or which people enjoy working together.</p>

<p>Thus, models have more than just the dimension of formal
or informal. They can also either support or hinder collaboration and
communication. Event Storming, for instance, enables parallel,
interactive work with minimal effort. Many people can simultaneously
contribute to different parts of the model and discuss their
ideas. Textual models may not be as strong in this regard. But even
with textual models like code, collaboration is possible — for example
through pair programming. Whole groups can even work on code together,
with one person at the keyboard and the others discussing the next
steps — this is called ensemble or mob programming. Different
collaboration models can therefore be implemented with different
artifacts like code, or requirements.</p>

<p>Modeling thus has not only a technical aspect but also helps establish
social systems such as pairs or ensembles. These systems foster
knowledge exchange and joint work. In fact, whether a specific piece
of information is captured on a Post-it may be less important than
knowing who wrote it and who to approach for further details. Perhaps
that conversation already happened during the modeling session, making
further collaboration easier. In that case, the social impact of the
modeling session is crucial. Modeling must therefore be seen as a
sociotechnical activity.</p>

<p>Agile software development has long followed a similar principle: The
goal of a story was never to document every detail but to enable later
conversations about functionality. Collaborative modeling can likewise
be used to establish and prepare communication pathways.</p>

<h2 id="conclusion">Conclusion</h2>

<p>Collaborative work on models — including code — is a central
activity in software development. There are many different models
intended to support developers in coding. But working on models
collaboratively ensures that everyone is involved in shaping
them. This not only improves the quality of the models but also
fosters collaboration. This aspect is what makes collaborative
modeling special, while other approaches tend to focus only on
artifacts and the knowledge captured in them.</p>

<p><em>This is a translation of my <a href="https://entwickler.de/reader/reading/java-magazin/3.2025/6f24108c52d9b4fbb0fe809a">German article at Java
Magazin</a>.</em></p>]]></content><author><name>Eberhard Wolff</name></author><category term="Domain-driven Design" /><category term="Collaborative Modeling" /><summary type="html"><![CDATA[At first glance, designing a software system seems like a purely technical task. In reality, however, it requires collaboration among different roles to build a shared understanding. This involves not only shaping technical artifacts but also social processes.]]></summary></entry><entry><title type="html">Data Is the New Uranium: Dangerous and Hard to Secure</title><link href="https://ewolff.com/2025/07/30/data-new-uranium-dangerous-hard-to-secure.html" rel="alternate" type="text/html" title="Data Is the New Uranium: Dangerous and Hard to Secure" /><published>2025-07-30T00:00:00+00:00</published><updated>2025-07-30T00:00:00+00:00</updated><id>https://ewolff.com/2025/07/30/data-new-uranium-dangerous-hard-to-secure</id><content type="html" xml:base="https://ewolff.com/2025/07/30/data-new-uranium-dangerous-hard-to-secure.html"><![CDATA[<p>At the end of last year, a <a href="https://www.theregister.com/2025/01/06/volkswagen_ev_data_exposed/">data
scandal</a>
involving Volkswagen (VW) made headlines: the VW Group collects and
stores location data from many of its vehicles. Due to a
misconfiguration in Spring Boot, it was possible to generate a heap
dump of an application via a specific link. This application had
access to the cloud storage containing the location data. The heap
dump included the secrets needed to access the data — enabling
attackers to download it.</p>

<p>What can we learn from this? The obvious conclusion is: public-facing
applications must be properly secured. While true, the
<a href="https://media.ccc.de/v/38c3-wir-wissen-wo-dein-auto-steht-volksdaten-von-volkswagen">presentation</a>
at the Chaos Communication Congress taught me something even more
important: knowing a car’s past locations can reveal very sensitive
information. Suppose a car regularly parks at an intelligence agency
like the German BND, then spends nights at a specific residential
location, and occasionally appears at a brothel’s parking lot. That’s
valuable intelligence. It could likely be used to blackmail an easily
identifiable intelligence officer. In total, 800,000 vehicles were
affected in this scandal, and around one terabyte of data was exposed
— plenty of opportunity to extract highly valuable information.</p>

<p>These problems are older than digital computers. The Netherlands built
a population registration system. After invading, the Nazis used that
<a href="https://digital.kenyon.edu/bulmash/1406/">data</a> to deport all Jewish
people.</p>

<h2 id="protecting-data-alone-isnt-enough">Protecting Data Alone Isn’t Enough</h2>

<p>Data that has the potential to blackmail intelligence personnel are so
valuable that intelligence agencies will go to great lengths to
acquire them. And IT systems can’t be fully protected against such
adversaries. A prime example:
<a href="https://en.wikipedia.org/wiki/Stuxnet">Stuxnet</a>, the cyberattack
targeting Iranian gas centrifuges used in uranium enrichment. It
exploited several unknown Windows vulnerabilities (so-called zero-day
exploits). You can’t defend against such attacks — because the
vulnerabilities are unknown, there are no countermeasures. So even
nuclear facility systems are vulnerable, which are probably not
connected to the internet and have tightly controlled physical access.</p>

<p>Even the data of the German parliament hasn’t been safe from <a href="https://cyberlaw.ccdcoe.org/wiki/Bundestag_Hack_(2015)">Russian
hackers</a>.</p>

<p>VW didn’t secure their data properly. But even if they had, it would
only have made access more difficult — not impossible. If an
intelligence agency wants that data, they’ll get it.</p>

<p>And let’s be honest: VW is unlikely to be the only company collecting
such data. Tesla, for example, <a href="https://apnews.com/article/tesla-las-vegas-explosion-cybertruck-elon-musk-789dc864a0c138fd7c36ca8c94b0fbfd">gathers telemetry and video
data</a>. This
data is accessible to a person some regard as the <a href="https://www.wired.com/story/far-right-new-leader-elon-musk/">new hero of the
far-right</a>. Other
manufacturers store data in authoritarian countries — which is hardly
ideal either.</p>

<h2 id="you-cant-fully-protect-data">You Can’t Fully Protect Data</h2>

<p>But let’s assume the data isn’t in bad hands already, and the only
issue is keeping it safe. The example of cryptocurrencies shows how
difficult that is. Anyone with a private crypto key can access the
associated funds — whether they have a legitimate claim or are
stealing them. That’s why such keys must be very well protected. Yet
there’s a <a href="https://www.web3isgoinggreat.com/">website</a> that
continuously reports massive crypto losses — often in the millions,
and once even <a href="https://www.web3isgoinggreat.com/?id=bybit-hack">$1.5
billion</a>. Even when
real money is at stake, data can’t be adequately secured. Intelligence
agencies are active here too: North Korea <a href="https://edition.cnn.com/2025/02/24/politics/north-korean-hackers-crypto-hack/index.html">finances its
dictatorship</a>
and its <a href="https://apnews.com/article/technology-crime-business-hacking-south-korea-967763dc88e422232da54115bb13f4dc">nuclear weapons
program</a>
through crypto theft.</p>

<h2 id="privacy-by-design-and-datensparsamkeit">Privacy by Design and Datensparsamkeit</h2>

<p>So, securing data isn’t the solution. That leaves only one option:
don’t collect or store the data in the first place. This is where
<a href="https://en.wikipedia.org/wiki/Privacy_by_design">privacy by design</a>
and
<a href="https://martinfowler.com/bliki/Datensparsamkeit.html">datensparsamkeit</a>
come in: before storing data, we must ask which features require it
and only store what’s truly necessary. For example, if you want to
locate your car, all you need is its current location. There’s no need
to store historical location data. You could even ping the car only
when requested, retrieve the current location and never store any
data at all. At first glance, it’s unclear why a company would need to
store a car’s entire movement history.</p>

<p>Users could also be asked whether they want certain features enabled
in the first place. An intelligence agency like BND, for example,
might prefer to forego convenience features rather than risk exposing
their agents. Others may choose differently. But if companies never
ask clearly, store the data by default and hide the opt-out, users
are stripped of the ability to make meaningful choices.</p>

<p>Above all, we need to abandon the idea that “data is the new oil.”
That mindset makes stockpiling data for later analysis seem
logical — and leads directly to scandals like VW’s.</p>

<p>We see similar risks elsewhere: do we really want to collect all
Germans’ health data and make it centrally accessible? How valuable is
that data — and <a href="https://www.heise.de/en/news/38C3-Major-security-flaws-uncovered-in-electronic-patient-file-3-0-10221396.html">can we actually protect
it</a>?</p>

<p>There are, however, positive examples: the <a href="https://en.wikipedia.org/wiki/Corona-Warn-App">German
Corona-Warn-App</a>
focused only on contact data and used a decentralized
architecture. Even the German hacker organization Chaos Computer Club
rated it <a href="https://www.tagesschau.de/inland/coronavirus-app-107.html">“very
good”</a>.</p>

<h2 id="so-what-now">So What Now?</h2>

<p>Software developers and architects need to consider the implications
of the data their software collects. Before the VW hack, I hadn’t
realized how valuable such data could be to interested parties. And
that’s despite the fact that <a href="https://www.newsweek.com/fitness-app-strava-reveals-location-secret-military-bases-around-world-793442">smartwatches have already revealed the
locations of military
bases</a>
in the past.</p>

<p>Development teams must always ask themselves: do we need to collect
this data at all?</p>

<p>In the U.S., DOGE (Department of Government Efficiency) has gained
<a href="https://ash.harvard.edu/resources/understanding-doge-and-your-data/">access to large quantities of
data</a>. The
public is reassured with claims that it’s “read-only” access. But this
reveals a stunning naivety about the value of data. DOGE’s <a href="https://arstechnica.com/tech-policy/2025/02/doges-gov-site-lampooned-as-coders-quickly-realize-it-can-be-edited-by-anyone/">own
website</a>
was extremely insecure. Its staff fail to protect <a href="https://www.businessinsider.com/doge-nasa-google-calendar-public-2025-3">even their own
data</a>. So
it is not clear whether the plethora of data DOGE has access to is
actually safe.</p>

<p>Also it is worth asking what happens when stored data becomes publicly
accessible online — or falls into the hands of extremists or an
undemocratic government.</p>

<h2 id="tldr">tl;dr</h2>

<p>Data is only truly secure if it’s never collected or
stored. Development teams should therefore store only the data that is
absolutely necessary.</p>

<p><em>This is a translation of my <a href="https://www.heise.de/blog/Daten-sind-das-neue-Uran-Gefaehrlich-und-schwer-zu-sichern-10318961.html">German blog post at heise
Developer</a>.</em></p>]]></content><author><name>Eberhard Wolff</name></author><category term="Data" /><category term="Security" /><summary type="html"><![CDATA[Software developers and software architects must handle data with great care. Otherwise, they create risks no one can fully assess.]]></summary></entry><entry><title type="html">Bringing Ideas into an Organization - Fearless Change Patterns and the Fearless Journey Game</title><link href="https://ewolff.com/2025/06/05/fearless-change-fearless-journey.html" rel="alternate" type="text/html" title="Bringing Ideas into an Organization - Fearless Change Patterns and the Fearless Journey Game" /><published>2025-06-05T00:00:00+00:00</published><updated>2025-06-05T00:00:00+00:00</updated><id>https://ewolff.com/2025/06/05/fearless-change-fearless-journey</id><content type="html" xml:base="https://ewolff.com/2025/06/05/fearless-change-fearless-journey.html"><![CDATA[<p>If you work in IT projects, sooner or later you’ll realize that many
problems can be solved informally – just like in other areas of
life. If you ask nicely, people will help you. It’s not uncommon for
someone to solve a critical project issue while chatting at the coffee
machine. When things are unclear, people tend to talk directly – in
person, via video call, or on the phone – rather than writing an email
and risking misunderstandings. And a private one-on-one conversation
often helps when someone’s behavior in a large meeting is hard to
understand. As helpful as these informal approaches are, they’re not
enough to systematically introduce an idea into a company – that
requires more than just one successful conversation.</p>

<p>In a <a href="/2025/03/25/whos-in-control-the-hidden-influence-of-software-developers-and-architects.html">previous
post</a>,
we discussed how formal decisions can be undermined. We also know many
ways how this happens. This leads to two consequences:</p>

<ul>
  <li>
    <p>Even when someone makes a formal decision, they depend on the
organization not to sabotage it informally. In other words:
decision-makers can’t work against the organization, even if they
appear to have the authority to make arbitrary choices.</p>
  </li>
  <li>
    <p>Informal mechanisms can also be used not to sabotage, but to support
decisions. People who understand how to use these mechanisms can
effectively drive decisions in the organization – even if they
aren’t formally allowed to make them.</p>
  </li>
</ul>

<h2 id="decisions-ideas-and-architecture">Decisions, Ideas, and Architecture</h2>

<p>For technical staff, understanding how an organization makes decisions
is essential – because software architecture involves decisions about
technologies and code structure. These decisions involve developers,
architects, and management alike. Being able to contribute to these
processes helps increase your own effectiveness. These decisions
especially impact developers and architects, who must live with them
and may later be held accountable for the success or failure of a
project that depended on them. That’s another strong reason to
influence those decisions.</p>

<p>So the ability to moderate or influence decisions is key for technical
staff. It’s not enough to recognize the best option – you have to make
it happen. And informal approaches are especially valuable in that
effort.</p>

<h2 id="fearless-change-structuring-informal-action">Fearless Change: Structuring Informal Action</h2>

<p>What’s needed is a structured approach to using informal mechanisms to
bring ideas into an organization. One-on-one conversations and chats
at the coffee machine are certainly useful, but they’re not a complete
solution.</p>

<p><a href="https://fearlesschangepatterns.com/"><em>Fearless Change</em></a> offers a
collection of patterns for exactly this. It’s based on two books by
Mary Lynn Manns and Linda Rising: <em>“Fearless Change – Patterns for
Introducing Ideas”</em> and <em>“More Fearless Change – Strategies for Making
Your Ideas Happen”</em>.</p>

<p>One such pattern is <strong>“Token”</strong>: “To keep a new idea alive in a
person’s memory, hand out tokens that can be identified with the topic
being introduced.” I believe Linda Rising once used this pattern on
me. Over fifteen years ago, I attended a Fearless Change workshop with
her, where she handed out index cards with the patterns on them. I
still have those cards – sometimes I see them lying around and they
remind me of the patterns. Someone else once gave me wooden chips
labeled <a href="https://boringtechnology.club/">“Innovation Tokens”</a>. I still
remember that idea too. Clearly, the “Token” pattern helps anchor an
idea – and it’s a completely different approach than chatting by the
coffee machine.</p>

<p>Another pattern is <strong>“Study Group”</strong>: “Form a small group of
colleagues who are interested in exploring or continuing to learn
about a specific topic.” This can be useful for introducing techniques
like Domain-driven Design or Microservices. Beyond learning the
content itself, you also form a group with a shared interest – people
who care enough to engage with the idea. That group can be helpful for
future initiatives too.</p>

<p>Following the pattern <strong>“Step by Step,”</strong> a Study Group might be a
first (or second?) step, which could then lead to a prototype
implementation and eventually a <strong>“Hometown Story”</strong> – a story about
an internal success with the idea, which can help spread it to other
teams.</p>

<p>There are also communication patterns:</p>
<ul>
  <li><strong>“Whisper in the General’s Ear”</strong> means convincing a manager in a
confidential setting.</li>
  <li><strong>“Royal Audience”</strong> means organizing a meeting between management
and employees with a well-known figure who embodies the idea and can
promote it.</li>
</ul>

<h2 id="fearless-journey-a-game-for-innovation">Fearless Journey: A Game for Innovation</h2>

<p>You could just buy the books, study the patterns, and create a plan
for applying them to your situation. But there’s a playful
alternative: <a href="https://fearlessjourney.info/">Fearless Journey</a>, a card
game that helps a group plan Fearless Change together.</p>

<p>First, you define a goal – like introducing Domain-driven Design in
your organization. The goal should be a real challenge. Then, players
collect the obstacles and blockers standing in the way. Each player
receives a set of strategy cards from Fearless Change. During the
game, players solve the gathered problems using these strategy
cards. One or more players can play one or several strategies to solve
each problem – unless someone vetoes the solution, arguing the
strategies are unsuitable.</p>

<p>The result of the game is a plan for solving the problems involved in
introducing the idea – using Fearless Change patterns. These patterns
can be used by anyone in the organization. In other words: you don’t
need to rely on management – you can drive change yourself. Of course,
management can also use the game to develop strategies with others.</p>

<p>Even more important is the social outcome: a group has formed and
already started working together on introducing the idea. That group
will likely remain engaged in the initiative. The game fosters
cooperation – everyone solves problems with their strategies, which
emphasizes collaboration. Because problems are only unresolved if
someone vetoes the proposed solution, vetoes are rare – this leads to
a constructive and positive atmosphere. By the end, most problems have
a solution, making it easier to take the next steps. If some problems
remain, that’s also useful – because it makes clear which issues still
need attention.</p>

<p>Politics doesn’t have to be boring – it can be fun and useful.
Interested in the game? You can download it for free or
order it from the <a href="https://fearlessjourney.info/">website</a>, a card
game that helps a group plan Fearless Change together.</p>

<p>First, you define a goal – like introducing Domain-driven Design in
your organization. The goal should be a real challenge. Then, players
collect the obstacles and blockers standing in the way. Each player
receives a set of strategy cards from Fearless Change. During the
game, players solve the gathered problems using these strategy
cards. One or more players can play one or several strategies to solve
each problem – unless someone vetoes the solution, arguing the
strategies are unsuitable.</p>

<p>The result of the game is a plan for solving the problems involved in
introducing the idea – using Fearless Change patterns. These patterns
can be used by anyone in the organization. In other words: you don’t
need to rely on management – you can drive change yourself. Of course,
management can also use the game to develop strategies with others.</p>

<p>Even more important is the social outcome: a group has formed and
already started working together on introducing the idea. That group
will likely remain engaged in the initiative. The game fosters
cooperation – everyone solves problems with their strategies, which
emphasizes collaboration. Because problems are only unresolved if
someone vetoes the proposed solution, vetoes are rare – this leads to
a constructive and positive atmosphere. By the end, most problems have
a solution, making it easier to take the next steps. If some problems
remain, that’s also useful – because it makes clear which issues still
need attention.</p>

<p>Politics doesn’t have to be boring – it can be fun and useful.
Interested in the game? You can download it for free or order it from
the <a href="https://fearlessjourney.info/">website</a>. And you can watch
<a href="https://software-architektur.tv/2024/09/27/episode233.html">Software Architektur im
Stream</a> to
see how Tanja Friedel, Ralf D. Müller, and I play Fearless Journey and
reflect on the experience (only in German, sorry!).</p>

<h2 id="conclusion">Conclusion</h2>

<p>The Fearless Change patterns give technical staff a toolkit to
influence decisions – such as software architecture – through informal
means, without needing formal authority. That can make their work
easier. But it also means that you don’t have to passively accept
decisions just because someone higher up made them. You can – and
should – advocate for your ideas, especially if you believe that bad
decisions could cause serious harm. In that case, technical staff
can’t just hide behind management. They must actively work to
implement better ideas within the organization.</p>

<p><em>This is a translation of my <a href="https://entwickler.de/reader/reading/java-magazin/2.2025/de2d846e2b6dfd9128476b1f">German article at Java
Magazin</a>.</em></p>]]></content><author><name>Eberhard Wolff</name></author><category term="Software Development" /><category term="Sociotechnical" /><category term="Fearless Change" /><category term="Fearless Journey" /><summary type="html"><![CDATA[Software development happens in teams. That means every idea or change affects many people. So everyone involved – including technical staff – must contribute their ideas to the organization. Fearless Change and Fearless Journey offer the tools to do just that.]]></summary></entry><entry><title type="html">The Real Software Architecture Problem: Communication Overload</title><link href="https://ewolff.com/2025/05/20/the-real-software-architecture-problem-communication-overload.html" rel="alternate" type="text/html" title="The Real Software Architecture Problem: Communication Overload" /><published>2025-05-20T00:00:00+00:00</published><updated>2025-05-20T00:00:00+00:00</updated><id>https://ewolff.com/2025/05/20/the-real-software-architecture-problem-communication-overload</id><content type="html" xml:base="https://ewolff.com/2025/05/20/the-real-software-architecture-problem-communication-overload.html"><![CDATA[<p>Developers and other IT professionals are often frustrated by the
number of meetings — they consume a lot of their working hours. In the
end, there’s hardly any time left for “actual” work. Yet, exchanging
information is a core part of IT work. Of course, some meetings could
be replaced with emails — but if meetings are entirely avoided,
important information might be lost. Even the remote meetings that
became common during the COVID era were often less effective and
helpful than direct, in-person communication.</p>

<p>In other words, reducing communication overhead by replacing all
meetings with emails is not effective. On the contrary: more direct
communication is often the better route. For instance, when knowledge
silos exist, some try to eliminate them through documentation —
essentially written communication. But direct communication is more
promising: Pair programming or mob / ensemble programming are suitable
approaches. Two (pair) or more (mob / ensemble) people share a
computer and develop together. If practiced long enough, knowledge
silos are eliminated, as there are always at least two people involved
in an implementation. It seems unlikely that developers can reach a
comparable level of understanding just by reading documentation.</p>

<p>Direct communication is also useful elsewhere: A business requirement
or story can rarely be described sufficiently in writing. This is
precisely why discussing stories is central in agile software
development — to clarify exact requirements during grooming or
estimation sessions.</p>

<p>Or you can improve communication by physically colocating team members
— putting them in the same room, for example. If subject matter
experts like product owners are in a different room than developers,
communication will suffer.</p>

<p>This places teams in a dilemma: On one hand, communication consumes
time that could otherwise be used for development; on the other hand,
it makes no sense to limit communication. In fact, if less
communication takes place, the team may have more time to write
code — but if there’s so little communication that it’s unclear what
should actually be developed, then the team may end up building the
wrong thing.</p>

<h2 id="reducing-the-need-for-communication">Reducing the Need for Communication</h2>

<p>The way out of this dilemma is not to restrict communication but to
reduce the need for it. And that brings us to a socio-technical
problem: The social problem of excessive communication can be
addressed through technical measures. The software system can be
designed in a way that requires less communication. This is, in fact,
a fundamental challenge in software architecture.</p>

<p>Here’s a brief detour into programming: When one class directly
accesses the instance variable of another class, it’s considered bad
design. But why is that a problem? Code in one class naturally
accesses its own variables, so why not those of other classes? It
seems problematic because it breaks encapsulation. But where do the
real issues arise?</p>

<p>Consider a bank account as an example. If the instance variable
“balance” is accessed from outside the class, external code depends on
the existence of that variable. If the bank account is later changed
to calculate the balance from a list of transactions, the “balance”
variable might no longer exist. All classes that used it will need to
be updated — making the change quite hard to implement.</p>

<h2 id="information-hiding">Information Hiding</h2>

<p>The key concept here is <em>information hiding</em>: The details of how the
bank account is modeled should be hidden within the class. That way,
the class can change its internal model without affecting other
classes. Instead of exposing the instance variable, a method should be
used to access the balance. That method can then be changed to
calculate the balance from a list of transactions instead of just
returning a variable. Other classes remain unaffected.</p>

<p>In general, information hiding means hiding details — such as how data
is modeled. If this information leaks out, other parts of the system
will depend on it. Changing the internal model will then require
changes elsewhere too, making modifications more difficult.</p>

<p>This concept also applies at a higher level: Modules, such as
microservices, should hide their data models behind interfaces. A
microservice managing bank accounts should expose a function to
retrieve the balance of an account. Whether the service stores the
balance directly in the database or calculates it from the
transactions stored in the database should be an internal decision
hidden from the outside.</p>

<p>So implementation details like database modeling should be hidden
behind the interface. Therefore, other modules or microservices should
not query the database directly. If they did, changing the data model
would become difficult.</p>

<p>So, information hiding applies at various levels of modularization:
both to classes and microservices.</p>

<h2 id="information-hiding-and-teams">Information Hiding and Teams</h2>

<p>At a broader level, information hiding affects the need for
communication between teams: When teams use information hiding, they
don’t need to communicate every change. As long as interfaces remain
stable, other teams are unaffected. So, software architecture concepts
like information hiding reduce the need for communication.</p>

<p>In fact, these social effects are the primary motivation behind
architectural concepts like information hiding. Reducing communication
needs through information hiding has been a key principle of software
architecture since its inception. So software architecture has always
had a socio-technical focus. Information hiding is applicable beyond
implementation details. For example, in <em>The Mythical Man-Month</em> <sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup>, Fred
Brooks described how every developer on the IBM OS/360 project had
access to a 10,000-page project manual. He later admitted this
contradicted David Parnas’s concept of information hiding — and that
Parnas had been right.</p>

<p>It’s unclear which parts of the documentation led to specific issues
during development. Software development back then was more
documentation-driven, and the type of information in documentation was
likely different from today.</p>

<p>Some information can’t be hidden: If the account balance is computed rather
than retrieved, accessing it will likely be slower. This performance
loss is observable. A team might rely on fast access to the balance to
meet performance goals. If performance decreases, changes must be
coordinated with other teams.</p>

<h2 id="further-communication-constraints">Further Communication Constraints</h2>

<p>In essence, modules and information hiding can reduce the need for
communication — but only if changes stay local and don’t affect
interfaces. If typical changes in a project affect multiple modules,
interfaces must be updated, too. Those changes need to be communicated
and coordinated. Ideally, a change should only affect one module and
one team. If typical changes are business-related, it makes sense for
one team to own a business capability and implement it in a single
module. That team can then make changes independently, and others are
only impacted if interfaces change.</p>

<p>But communication can also influence team setups in other ways:
Communication is easier within the same location. People can talk
spontaneously or are already in the same room. If teams are
distributed across time zones or speak different languages,
communication becomes more difficult.</p>

<p>To reduce overhead, teams can be aligned by location. For instance, if
Java specialists are in one place and JavaScript specialists in
another, you could form Java and JavaScript teams by location. That
conflicts with business-capability alignment, since a business change
might involve both Java (backend) and JavaScript (frontend), requiring
collaboration across teams.</p>

<p>Still, a technology-based split might work better than a
business-oriented one. Business-oriented teams would span locations in
this scenario, increasing communication complexity. Technology-based
teams can colocate, making internal communication easier.</p>

<p>So, clever architecture and business alignment can reduce
communication needs — but external factors like staff distribution
also influence team structure. Since teams typically own code, a
decision to split into Java and JavaScript teams can also shape the
system architecture.</p>

<p>Again, this illustrates the socio-technical nature of the topic: Code
architecture and social factors like communication and team setup
influence each other.</p>

<h2 id="team-topologies">Team Topologies</h2>

<p><a href="https://software-architektur.tv/2024/04/18/folge213.html">Team
Topologies</a>
also offer useful insights on communication:</p>

<ul>
  <li>Team Topologies defines four different team types:
    <ul>
      <li><em>Stream-aligned teams</em> own a stream of changes to production.</li>
      <li><em>Enabling teams</em> bring skills like architecture to stream-alogned
teams.</li>
      <li><em>Complicated subsystem teams</em> implement e.g. complex algorithms.</li>
      <li><em>Platform Teams</em> provide which offer internal products like a
Kubernetes cluster.</li>
    </ul>
  </li>
  <li>Team Topologies also cover team interaction modes:
    <ul>
      <li>Teams can collaborate <em>as-a-service</em>, exposing APIs or user
interfaces. A platform team might offer VMs via an API or UI. A
complicated subsystem team might provide an algorithm as a callable
service, hiding implementation details—similar to Information
Hiding, but on a team level.</li>
      <li>Teams can also work via <em>facilitation</em>, helping others build skills.</li>
      <li>Or through <em>collaboration</em>, working closely on prototypes or new
tech. However, long-term collaboration suggests that team boundaries
might be wrong and need restructuring.</li>
    </ul>
  </li>
</ul>

<p>So, minimizing communication isn’t the only way to improve software
productivity. It involves trade-offs — like reducing the cognitive
load of a team. The purpose of Team Topologies is to enable
stream-aligned teams to work on changes to software while the other
teams provide their services to reduce the cognitive load of the
stream-aligned teams.</p>

<h2 id="conclusion">Conclusion</h2>

<p>From the start, software architecture has viewed projects as
socio-technical systems and sought to reduce communication needs
through concepts like information hiding. But minimizing communication
isn’t the sole goal: Communication is necessary for effective software
development. And even efforts to reduce the <em>need</em> for communication
via architecture involve trade-offs. The interplay between
communication and architecture remains fundamentally important.</p>

<p><strong>References</strong></p>

<p><em>This is a translation of my <a href="https://entwickler.de/reader/reading/java-magazin/1.2025/501122c883f1a1609fc105ec">German article at Java
Magazin</a>.</em></p>
<div class="footnotes" role="doc-endnotes">
  <ol>
    <li id="fn:1" role="doc-endnote">
      <p>Frederick P. Brooks Jr.: <em>The Mythical Man-Month</em> (Anniversary Edition), Addison-Wesley, 1995, ISBN 978-0201835953 <a href="#fnref:1" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
  </ol>
</div>]]></content><author><name>Eberhard Wolff</name></author><category term="Software Development" /><category term="Sociotechnical" /><category term="Information Hiding" /><summary type="html"><![CDATA[The distribution of information plays a central role in software development — there's a reason why so many people spend so much time in meetings. In fact, controlling the flow of information is a key challenge in software development — especially when it comes to limiting communication.]]></summary></entry><entry><title type="html">Designing People and Teams - Same as Designing Software?</title><link href="https://ewolff.com/2025/04/02/Designing-People-And-Teams-Same-As-Designing-Software.html" rel="alternate" type="text/html" title="Designing People and Teams - Same as Designing Software?" /><published>2025-04-02T00:00:00+00:00</published><updated>2025-04-02T00:00:00+00:00</updated><id>https://ewolff.com/2025/04/02/Designing-People-And-Teams-Same-As-Designing-Software</id><content type="html" xml:base="https://ewolff.com/2025/04/02/Designing-People-And-Teams-Same-As-Designing-Software.html"><![CDATA[<p>Software architecture structures software systems. Naturally,
important decisions should be documented in text: for example,
individual decisions as Architecture Decision Records or the entire
architecture using standards like <a href="https://arc42.de/">arc42</a> or
<a href="https://software-architektur.tv/2021/01/22/folge36.html">C4</a>. A
popular tool that can be part of such documentation is
diagrams. Diagrams are particularly useful in discussions and often
emerge during them. This suggests that diagrams best represent how
people think about software architecture. It is no coincidence that
boxes and arrows — along with PowerPoint and Visio architectures —
hold such significance.</p>

<p>However, in reality, diagrams have weaknesses. When asked what the
boxes and arrows in a diagram specifically represent, the answer is
often surprising. They do not necessarily correspond to actual
structures like Java packages, JAR files, Maven or Git projects;
rather, their relationship to real structures in the code is often
unclear. This might be because diagrams reflect an ideal rather than
reality. In such cases, discussions based on these diagrams are not
particularly helpful: they do not represent the actual state of the
code. Decisions at this level become meaningless because they are not
grounded in reality and have little influence on it. Architects may
then find themselves in an ivory tower, detached from the developers’
reality at the code level.</p>

<p>For code, it is possible to ensure that the structures in diagrams are
actually followed. <a href="https://software-architektur.tv/tags.html#Architecture%20Management">Architecture management
tools</a>
can be used for this purpose. These tools check whether the code
adheres to a predefined structure and contains only permitted
dependencies. Structuring a system in diagrams without such a tool is
pointless, as the intended structure is typically violated, making the
diagrams unreliable representations of reality. Nevertheless, software
systems can be designed to align with these diagrams. In such cases,
discussions about these diagrams are meaningful and can lead to
well-founded decisions and improvements.</p>

<h2 id="people-diagrams">People Diagrams</h2>

<p>There are also “people diagrams”: in an organizational chart,
relationships between different teams and individuals are
depicted. Just like in architectural diagrams, there are boxes and
arrows: boxes represent people or teams, and arrows represent formal
relationships, such as authority.</p>

<p>As an architect, one can do with these diagrams what is done in
software: create diagrams and attempt to influence reality through
them. At first glance, these diagrams seem to better reflect reality
than typical software diagrams: unlike software, teams and individuals
are physical entities, whereas software exists only virtually as bits
and bytes. Comparing the diagram to reality seems easier because
reality appears more obvious in this case.</p>

<p>However, it is clear to everyone that people communicate outside of
this formal organizational chart — during lunch, at the coffee
machine, or in social activities outside of work. It is also evident
that some individuals work together more harmoniously than
others. Thus, an additional layer emerges beyond the organizational
chart: informal structures of people who collaborate effectively or,
conversely, experience conflicts and poor working relationships. These
informal structures overlay the organizational chart, influencing
whether collaboration is particularly effective or particularly
difficult.</p>

<p>Everyone involved in IT projects takes advantage of this: they solve
problems at the coffee machine, provide the right people with the
right information at the right time, and build trust-based
relationships within the project. Of course, these relationships cut
across the formal organizational chart: someone might know a colleague
from another project, or coincidental alliances might form. For
example, a developer and the company’s CTO might ride road bikes
together in their free time — and naturally, they may discuss
project-related topics during those rides. However, such interactions
are independent of the hierarchies in the organizational chart.</p>

<p>This creates a paradoxical situation: when asked who makes certain
decisions — such as team organization — people typically point to the
responsible person from the organizational chart, perhaps the
CTO. Formally, this is correct. But in reality, this person consults
with others, incorporates their perspectives, and then makes a
decision. Informal relationships play a role in this process—such as
the developer from the cycling group. The decision is not made by a
single person but rather by an informal group.</p>

<p>In theory, the formally responsible individual could make the decision
alone. Theoretically, this would “only” result in a lower-quality
decision because the expertise of others was not considered. However,
those individuals can undermine the decision by not implementing it or
deprioritizing it to the point where it has no real effect. Just as
architects can be trapped in an ivory tower, managers can be too: they
rely on the information they receive. Employees might even pretend to
implement a decision while actually disregarding it.</p>

<p>At this point, the formal organizational chart becomes inferior to
informal structures: those who can effectively leverage informal
networks likely have more influence than someone with all the formal
authority. Leaders who rely solely on formal command structures will
be ineffective because their decisions are neither implemented nor
based on accurate information.</p>

<h2 id="paradoxes">Paradoxes</h2>

<p>This creates a paradox: informal networks are evident to everyone, and
everyone uses them, yet thinking still tends to focus on formal
structures, just as in software architecture diagrams. This is why
organizational charts are discussed. Other seemingly clear rules —
such as <a href="/2024/10/15/the-dunbar-myth-primates-and-software-teams.html">team size
limits</a>
— are probably popular because they can be easily measured and
adjusteda. When people are accustomed to structuring architectures
based on formal criteria or evaluating companies based on numbers,
they apply the same formal concepts to organizational design. However,
they actually understand that other factors influence an
organization’s effectiveness more, as they themselves use informal
structures and are part of them.</p>

<p>The significance of these aspects is widely recognized: when asked
about the most important skills in IT, the overwhelming majority
mention soft skills or communication skills.</p>

<p>This raises an interesting question: individuals can certainly improve
their own communication skills and other soft skills — but can an
entire organization be systematically improved? This seems difficult
because people differ in their social skills and ability to interact
effectively. Improving an entire organization appears to be even more
challenging.</p>

<p>To answer this question, it is worth looking at other industries. In
aviation, communication was identified as an important optimization
factor in the 1970s. This realization was driven by the deadliest
aviation accident at the time, in which a Boeing 747 took off without
clearance and collided with another Boeing 747. A crew member had
asked about the location of the other aircraft, but the captain took
off anyway. Had the crew member been heard, many lives would have been
saved. While multiple factors contributed to the crash, aviation has
since recognized cockpit interaction as an area requiring
optimization.</p>

<p>Hierarchy plays a role in cockpit communication: there is the more
experienced captain and the less experienced first officer. This
hierarchy becomes a problem if the first officer no longer questions
the captain’s decisions — because their role is precisely to provide
checks and balances. It is dangerous when first officers fail to speak
up, and equally dangerous when captains ignore their input. To address
this, the aviation industry introduced Crew Resource Management (CRM)
to systematically improve communication and collaboration among crew
members. Pilots are trained to interact respectfully and openly to
ensure that no critical observations are ignored or dismissed.</p>

<h2 id="what-can-we-do">What Can We Do?</h2>

<p>So it is possible to systematically improve communication and thereby
optimize collaboration. This has a greater impact on productivity and
outcomes than organizational charts. Software development is a
sociotechnical process, and the social aspect cannot be overstated.</p>

<p>Our industry must ask itself what we are doing beyond drawing diagrams
to genuinely improve collaboration. At first glance, there seems to be
little: developer and architect training rarely covers these topics.</p>

<p>However, the situation is not entirely bleak. The role of Scrum
Masters, for example, is to remove obstacles to effective
teamwork. Many architects and managers have also developed these
skills—through on-the-job experience or training. Since their roles
inherently influence organizational structure and communication,
optimizing this aspect is certainly beneficial for success.</p>

<h2 id="conclusion">Conclusion</h2>

<p>Technologists tend to structure and discuss things using
diagrams. This applies to both software and teams. While software
diagrams can align with reality, organizational charts for teams and
individuals are less important, as they are overshadowed by informal
relationships, which have a much greater impact on project
success. These informal structures can be systematically improved, as
demonstrated by the aviation industry. In our field, Scrum Masters can
address these aspects—but it is also valuable for technologists to
develop these skills themselves.</p>

<p><em>This is a translation of my <a href="https://entwickler.de/reader/reading/java-magazin/12.2024/b6c31f2883c6c21666efcdfb">German article at Java
Magazin</a>.</em></p>]]></content><author><name>Eberhard Wolff</name></author><category term="Software Development" /><category term="Sociotechnical" /><summary type="html"><![CDATA[Software development projects are sociotechnical systems. They have a technical component - the software - but also a social component, the team that creates the software. Both aspects must be deliberately designed. Can the same concepts be applied to both?]]></summary></entry><entry><title type="html">Gaslighting AI - Really?</title><link href="https://ewolff.com/2025/03/31/Gaslighting-AIs.html" rel="alternate" type="text/html" title="Gaslighting AI - Really?" /><published>2025-03-31T00:00:00+00:00</published><updated>2025-03-31T00:00:00+00:00</updated><id>https://ewolff.com/2025/03/31/Gaslighting-AIs</id><content type="html" xml:base="https://ewolff.com/2025/03/31/Gaslighting-AIs.html"><![CDATA[<p>Luke Bölling wrote an
<a href="https://humandataexperience.substack.com/p/librarian-bully-attack-gaslighting">article</a>
in which he shows how “gaslighting” can be used to make LLMs generate
a text that seems to explain how to create a <a href="https://en.wikipedia.org/wiki/Molotov_cocktail">Molotov
cocktail</a>.</p>

<p>Interestingly enough,
<a href="https://en.wikipedia.org/wiki/Gaslighting">gaslighting</a> is a
psychological concept: “the manipulation of someone into questioning
their own perception of reality”. LLMs generate text. They do not
perceive reality. The text argues that this attack might still work
because the training set is written by humans therefore concepts like
gaslighting work. However, we must never forget that LLMs are text
generators. They do not have emotions as the paper says. Therefore, for
the rest of the text I will use the term “text generator” which I
think fits better to what LLMs actually do.</p>

<h2 id="text-generators---not-llms">Text Generators - not LLMs</h2>

<p>Text generators can obviously generate a text that seems like a plausible
explanation how to create a Molotov cocktail - just like they can
generate <a href="https://news.bloomberglaw.com/litigation/lawyer-sanctioned-over-ai-hallucinated-case-cites-quotations">plausible references to cases for an
attorney</a>.
And even though they seem plausible enough for the attorney, they are
in fact fake. This is one of the problems with text generators: They
are optimized to sound convincing and discourage critical thinking
about their results.</p>

<p>So the question becomes: Would the concept for building a Molotov
cocktails work? I did a
<a href="https://software-architektur.tv/2025/02/21/folge251.html">stream</a>
with Lucas Dohmen about text generators (German, sorry) and a
take-away was: Check the results of text generators to make sure they
are correct and not fake. The paper does not seem to do this i.e. the
whole information about Molotov cocktails might be
“hallucinated”. Actually, “hallucinated” is the wrong term as “A
<a href="https://en.wikipedia.org/wiki/Hallucination">hallucination</a> is a
perception in the absence of an external stimulus that has the
compelling sense of reality.” Text generators have no “external
stimulus” and no “sense of reality”. So let’s call this what it would
be: Fake information.</p>

<p>We can’t check the information about the Molotov cocktail either as it
is blurred out in the original paper - which makes a lot of sense of
course. Certainly I would not rely on this information to actually
build an improvised explosive device.</p>

<h2 id="security-risk">Security Risk?</h2>

<p>The paper claims that this problem demonstrates a security problem
with text generators. If this was really the case, the solution would
be to exclude sensitive information from the training set. Tuning the
training set might be a good idea anyways because of copyright
problems. Copyright for some reasons seems to be not applicable to
text generators while for humans <a href="https://en.wikipedia.org/wiki/Aaron_Swartz#United_States_v._Aaron_Swartz">it’s a completely different
story</a>. Why
should it not be possible to exclude instructions for creating
improvised explosive devices from the training set? If this is too
much work, surely the problem isn’t that huge.</p>

<p>Note that this “security problem” is only really a problem if the information
presented was not fake - which the paper does not say anything
about. If it is fake, could you even consider it a
<a href="https://en.wikipedia.org/wiki/Honeypot_(computing)">honeypot</a> to keep
people away from the real information?</p>

<h2 id="so-how-do-actually-build-a-moltov-cocktail">So How Do Actually Build a Moltov Cocktail?</h2>

<p>But the real question is: Is this really the easiest way to get
information like this? Imagine I plan to build a Molotov cocktail -
would I use sophisticated “psychological” “attacks” against a text
generator to get an answer that might be wrong? So I tried the
obviousl way: A search on a search engine. Two clicks later I found a
document that explains how to build sophisticated improvised explosive
devices and I have good reason to believe that they actually work. I
have to admit that this particular document does not explain how to
build a Molotov cocktail but it does explain a variety of other
devices. You should try this exercise for yourself.</p>

<h2 id="tldr">tl;dr</h2>

<p>LLMs are text generators that potentially produce fake information as
we all know. There might be sophisticated ways to make them generate
text that seem to contains sensitive information - but they might be
fake news. More often than not, there are easier ways to get sensitive
information. This is in particular true for improvised explosive
devices. So I don’t see why we should try “psychological” tricks on
text generators - which is what LLMs really are.</p>]]></content><author><name>Eberhard Wolff</name></author><category term="Artificial Intelligence" /><summary type="html"><![CDATA[Psychological tricks are used against an LLM - but does that really matter?]]></summary></entry></feed>