<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>QWAN - Quality Without a Name</title>
    <description>QWAN - Quality Without a Name: development, coaching, consulting, training. Systemic approach to developing software organizations. Experts in Agile Development, Test Driven Development, Refactoring; long time eXtreme Programmers
</description>
    <link>https://qwan.eu/</link>
    <atom:link href="https://qwan.eu/feed.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Tue, 10 Mar 2026 19:54:06 +0000</pubDate>
    <lastBuildDate>Tue, 10 Mar 2026 19:54:06 +0000</lastBuildDate>
    <generator>Jekyll v3.10.0</generator>
    
      <item>
        <title>Give your smurf a bad name</title>
        <description>&lt;p&gt;Choosing good names is one of the hardest parts of our job as software developers. It’s also a crucial part: names have a big impact on how well others (and our future selves!) will be able to understand the code and change it.&lt;/p&gt;

&lt;p&gt;“Choose a bad name to trigger better naming” is a heuristic we often use when programming, but it also works for prose, the ordinary language people use in speaking or writing.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Heuristic: &lt;strong&gt;choose a bad name to trigger better naming&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In earlier times, Willem would choose swear words for names. It lightens the mood, when working alone, but is not conducive for group work. Calling it “smurf” is another option, making it obvious it needs a better name.&lt;/p&gt;

&lt;p&gt;Any name that is obviously off will do, urging the reader to replace it with something meaningful. Calling an object a &lt;em&gt;…Manager&lt;/em&gt; would be a bad name for us, but many developers are used to Manager classes in their code. &lt;em&gt;…Smurf&lt;/em&gt; works better.&lt;/p&gt;

&lt;p&gt;Using a bad name can also help to detach ourselves from vague, misleading initial names. If our domain talks about locations, we are tempted to start out with a “Location” domain object. This becomes an attractor for anything location related: a location can be an organizational unit with employees joining and leaving over time, or a place where specific services are offered, or a unit of financial processing. While these different faces of “Location” overlap, they are not the same thing.&lt;/p&gt;

&lt;p&gt;Once we start calling something a “Location”, it becomes hard to keep our minds open for alternative perspectives. Calling it a “Smurf” can help.&lt;/p&gt;

&lt;p class=&quot;post-image post-image-30&quot;&gt;&lt;img src=&quot;/attachments/blogposts/2026/smurfs.jpg&quot; alt=&quot;Series of smurf hats&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;further-reading&quot;&gt;Further reading&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;We wrote about &lt;a href=&quot;/2021/07/27/tdd-naming-tests.html&quot;&gt;naming tests&lt;/a&gt; earlier, as part of our series on &lt;a href=&quot;/blog-by-tag#tag-test-driven-development&quot;&gt;unit testing &amp;amp; TDD heuristics&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://wiki.c2.com/?SystemOfNames&quot;&gt;System of Names on the C2 Wiki&lt;/a&gt; describes a pattern about naming: &lt;em&gt;“people often make assumptions based on the object names alone”&lt;/em&gt; and &lt;em&gt;“revise the names of your objects to reflect their ultimate roles”&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;Domain Driven Design’s &lt;a href=&quot;https://www.jamesshore.com/v2/books/aoad1/ubiquitous_language&quot;&gt;Ubiquitous Language&lt;/a&gt; is broader than good names alone, but it starts with having good, unambiguous, shared names, for events, commands, domain objects, subdomains, bounded contexts.&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Sat, 07 Feb 2026 00:00:00 +0000</pubDate>
        <link>https://qwan.eu/2026/02/07/give-your-smurf-a-bad-name.html</link>
        <guid isPermaLink="true">https://qwan.eu/2026/02/07/give-your-smurf-a-bad-name.html</guid>
        
        <category>heuristics</category>
        
        <category>design</category>
        
        <category>domain driven design</category>
        
        
      </item>
    
      <item>
        <title>Managing coupling through Hexagonal Architecture</title>
        <description>&lt;p&gt;We wrote in &lt;a href=&quot;/2026/01/23/on-coupling&quot;&gt;our previous post on coupling&lt;/a&gt;: &lt;strong&gt;without coupling there is no working software&lt;/strong&gt;, but how do we keep coupling manageable? In this post, we will look at Hexagonal Architecture from a coupling perspective. Hexagonal Architecture is about decoupling domain logic from frameworks and the outside world - but what does decoupling actually mean?&lt;/p&gt;

&lt;h2 id=&quot;hexagonal-architecture-recap&quot;&gt;Hexagonal Architecture recap&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;/2020/08/20/hexagonal-architecture&quot;&gt;Hexagonal Architecture&lt;/a&gt;, also known as Ports &amp;amp; Adapters, is a software architecture pattern that provides guidance in structuring a component or application and managing dependencies inside the component.&lt;/p&gt;

&lt;p&gt;It applies the &lt;em&gt;Dependency Inversion Principle&lt;/em&gt; at the component level: it puts the domain logic at the center, without any dependencies on databases, web, APIs. A set of interactions with the outside world with the same intent is represented by a Port. The outside world interacts with the domain logic via Adapters that map the outside world to the domain model and the other way around.&lt;/p&gt;

&lt;p&gt;Ports can be driving (incoming) or driven (outgoing). For driven ports, adapters implement interfaces that are part of the domain model, visualized by the green thick lines in the picture below. Libraries and frameworks reside on the outside.&lt;/p&gt;

&lt;p class=&quot;post-image post-image-70&quot;&gt;&lt;img src=&quot;/attachments/blogposts/2020/hex-main.jpg&quot; alt=&quot;Hexagonal Architecture overview, showing driving and driven ports, with adapters and libraries being used&quot; /&gt;&lt;/p&gt;

&lt;p&gt;See our &lt;a href=&quot;/blog-by-tag#tag-ports-and-adapters&quot;&gt;earlier posts&lt;/a&gt; to learn more (&lt;em&gt;or &lt;a href=&quot;/training/hexagonal-architecture.html&quot;&gt;book a course&lt;/a&gt;&lt;/em&gt; 😁)&lt;/p&gt;

&lt;h2 id=&quot;hexagonal-architecture-in-practice&quot;&gt;Hexagonal Architecture in practice&lt;/h2&gt;

&lt;p&gt;We have applied Hexagonal Architecture in many projects. It has also been embraced by the Domain Driven Design community as the default way of structuring services.&lt;/p&gt;

&lt;p&gt;In practice, it results in domain code that is easier to understand, because it is not cluttered with technical details like database or API mappings. We’ve decoupled different concerns in the code.&lt;/p&gt;

&lt;p&gt;We have noticed something else as well. Sometimes we need to add a new feature and we find ourselves making changes across the component, touching domain logic, the database schema, the database adapter, the API and the API adapter. If this happens, it does not really feel decoupled. It actually looks more like the &lt;a href=&quot;https://www.sammancoaching.org/code_smells/shotgun_surgery.html&quot;&gt;Shotgun Surgery code smell&lt;/a&gt; - having to make many small changes across the code base - or does it?&lt;/p&gt;

&lt;p class=&quot;post-image post-image-70&quot;&gt;&lt;img src=&quot;/attachments/blogposts/2026/hex-arch-crossed.jpg&quot; alt=&quot;Schematic picture of Hexagonal Architecture with a crossed red line indicating changes across all the parts&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The coupling &amp;amp; cohesion heuristic we tend to follow is:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;If things need to change together, put them close to each other.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So should we put parts of the API, the database mapping and the domain logic closely together because they sometimes change together? It depends…&lt;/p&gt;

&lt;h2 id=&quot;different-sources-of-change&quot;&gt;Different sources of change&lt;/h2&gt;

&lt;p&gt;It turns out there are multiple sources of change, each having a different impact and each having its own rate of change:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;APIs and database schemas tend to be more stable - especially if other services or external parties depend on our APIs or if substantial amounts of data need to be migrated when the schema changes.&lt;/li&gt;
  &lt;li&gt;Frameworks and libraries evolve at their own pace, usually at a slower pace. Once in a while we need to deal with impactful major version upgrades.&lt;/li&gt;
  &lt;li&gt;Domain logic has its own pace of changes. We want to be able to refactor and evolve the domain model as we gain new insights.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Applying Hexagonal Architecture means isolating the API, the database and the domain. The trade-off we make is accepting that some (feature) changes will cross the different parts. Hexagonal Architecture optimizes for parts that &lt;em&gt;change at different rates&lt;/em&gt;: we are organizing for &lt;em&gt;shearing layers&lt;/em&gt; of change - allowing different rates of change with limited friction.&lt;/p&gt;

&lt;blockquote class=&quot;post-image post-image-50&quot;&gt;
  &lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Shearing_layers&quot;&gt;Shearing Layers of change&lt;/a&gt; come from (building) architecture and provides a useful perspective on organizing code based on the stability or volatility of its parts.&lt;/p&gt;

  &lt;p&gt;The concept was coined by the architect Frank Duffy, and it was elaborated in the wonderful book &lt;a href=&quot;https://en.wikipedia.org/wiki/How_Buildings_Learn&quot;&gt;How Buildings Learn&lt;/a&gt; by Stewart Brand.&lt;/p&gt;

  &lt;p&gt;Buildings have different layers that change at different rates. The building site is quite stable and often survives a building, the structure is expensive to change so it only changes once in a while. Services like heating wear out, and change every 7-15 years, while stuff (chairs, tables, etc) moves around frequently.&lt;/p&gt;

  &lt;p&gt;Layers should allow for other layers to change at their own rate.&lt;/p&gt;

  &lt;p&gt;&lt;img src=&quot;/attachments/blogposts/2026/shearing-layers-book-image.jpg&quot; alt=&quot;image from the book illustrating shearing layers of change: site, structure, skin, services, space plan, stuff, and the caption &amp;quot;SHEARING LAYERS OF CHANGE.&amp;quot; Because of the different rates of changes of its components, a buildings is always tearing itself apart.&quot; /&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;Hexagonal Architecture optimizes for parts that have different rates of change and it allows the parts to evolve with limited friction&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;making-trade-offs&quot;&gt;Making trade-offs&lt;/h2&gt;

&lt;p&gt;Deciding what to put close together and what to separate for facilitating different rates of change involves making trade-offs. Optimizing for each part to evolve at its own pace comes at the cost of new features needing a series of (small) changes.&lt;/p&gt;

&lt;p&gt;We are usually willing to pay this price, because it enables us to be much more in control of changes:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Framework and library updates affect a much smaller part of our system, reducing risks.&lt;/li&gt;
  &lt;li&gt;We can more freely refactor domain logic to reflect our current understanding, without continuously needing to migrate data.&lt;/li&gt;
  &lt;li&gt;If a feature requires changes across the component, we can do these changes in baby steps, with working software at any point in time. If we think a bit about the ordering of the baby steps, we can even deploy each change to production without impact.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Working in baby steps while keeping the code working at all time is key here. Mechanisms like dependency inversion, domain-oriented interfaces, the ability to test different concerns independently using domain logic tests, adapter integration tests, and component end-to-end tests help a lot.&lt;/p&gt;

&lt;p class=&quot;post-image post-image-70&quot;&gt;&lt;img src=&quot;/attachments/blogposts/2026/hex-arch-incremental.jpg&quot; alt=&quot;Schematic picture of Hexagonal Architecture with multiple blue lines representing an incremental cross-cutting change&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;hexagonal-architecture-and-decoupling&quot;&gt;Hexagonal Architecture and (de)coupling&lt;/h2&gt;

&lt;p&gt;Hexagonal Architecture separates concerns that have different rates of change. APIs, adapters, databases, domain logic are still coupled, but they do not need to change all at the same time. The coupling is made explicit through interfaces and adapters.&lt;/p&gt;

&lt;p&gt;The pattern comes with trade-offs: being in control of changes and the ability to do changes in baby steps come at the cost of some changes being more work.&lt;/p&gt;

&lt;p&gt;Hexagonal Architecture was introduced over 30 years ago. There is a more recent insight that rather than creating a single big hexagon for a component or application, we’d rather split the component into smaller, more focused hexagons, to reduce complexity and impact of changes, but this is worth a post of its own.&lt;/p&gt;

&lt;h2 id=&quot;references&quot;&gt;References&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;We have written a &lt;a href=&quot;/blog-by-tag#tag-ports-and-adapters&quot;&gt;series of posts about Hexagonal Architecture&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://archive.org/details/howbuildingslear00bran&quot;&gt;How Buildings Learn - What happens after they’re built&lt;/a&gt; by Stewart Brand; there is also a &lt;a href=&quot;https://www.youtube.com/playlist?list=PLxFD-wxU4CoNb-gCM0-P9fjJchwUIfkep&quot;&gt;BBC series of 6 episodes&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Paul Dyson wrote three posts about &lt;a href=&quot;https://pauldyson.wordpress.com/2010/04/06/shearing-layers-in-software-delivery-part-1-recognising-rates-of-change/&quot;&gt;Shearing Layers in software delivery&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Mark Dalgarno explores Shearing Layers in &lt;a href=&quot;https://markdalgarno.medium.com/shearing-layers-in-organisational-transformation-half-an-idea-9ea85eff57cc&quot;&gt;Shearing layers in Organisational Transformation — half an idea&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Chad Fowler is writing a &lt;a href=&quot;https://aicoding.leaflet.pub/&quot;&gt;series of posts on regenerative software&lt;/a&gt;, using the idea of Shearing Layers (or pace layering as it is called in his posts)&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;post-image post-image-30&quot;&gt;&lt;img src=&quot;/attachments/blogposts/2026/how-buildings-learn-cover.jpg&quot; alt=&quot;Cover of the How Buildings Learn book by Stewart Brand&quot; /&gt;&lt;/p&gt;

&lt;aside&gt;
&lt;h3&gt;Want to learn more?&lt;/h3&gt;
&lt;p&gt;We offer training courses on Hexagonal Architecture and Domain Driven Design. We can also support you in applying these in your situation.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/contact&quot;&gt;Learn more about our courses&lt;/a&gt;&lt;/p&gt;
&lt;/aside&gt;
</description>
        <pubDate>Tue, 03 Feb 2026 00:00:00 +0000</pubDate>
        <link>https://qwan.eu/2026/02/03/managing-coupling-via-hexagonal-architecture.html</link>
        <guid isPermaLink="true">https://qwan.eu/2026/02/03/managing-coupling-via-hexagonal-architecture.html</guid>
        
        <category>architecture</category>
        
        <category>coupling</category>
        
        <category>design</category>
        
        <category>ports and adapters</category>
        
        
      </item>
    
      <item>
        <title>How does the human stay in the loop, while developing on their phone?</title>
        <description>&lt;p&gt;Working with LLMs to create prototype webapps from my phone can be very satisfying. There are limitations, though. Having only a tiny terminal window with a coding agent can feel like painting my living room through the letterbox. Code scrolls by quickly, and I look at a few lines at a time, which makes me lose sight of the whole. So after some prototyping, I have to find time and space to sit with a microprint, to see the forest and the trees.&lt;/p&gt;

&lt;p&gt;I decided to port the microprint library made with Stephan Eggermont to the web framework that we use - Phoenix LiveView. Now the microprints live inside the web application, as we are building it. This helps us make better decisions about where we need to refactor, where we need more tests, where we need to learn more etc. This way we can keep an eye on the code as it develops. Iterative work and short feedback cycles remain valuable, if not more so, with AI Augmented development.&lt;/p&gt;

&lt;h1 id=&quot;what-am-i-seeing-here&quot;&gt;“What am I seeing here?”&lt;/h1&gt;

&lt;p&gt;This is a &lt;a href=&quot;/2025/11/18/better-decisions.html&quot;&gt;microprint&lt;/a&gt;, a shrunken view on a source file, living right in a web application we are working on. Mobile first. It shows the ten most recently changed files, and I can tap on a microprint to see details. This not only enables me to stay close to the code, it draws me in.&lt;/p&gt;

&lt;p&gt;I can contract the source code view, to see several at once on my phone. This gives me an overview of what is going on. In this case stylesheet changes and I was working on the microprint itself.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/attachments/blogposts/2026/phoenix-microprints/syntax-highlighting.png&quot; alt=&quot;img&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.domeinmodel.nl&quot;&gt;Stephan&lt;/a&gt; and I ain’t afraid of no legacy code. But we’d rather keep our code well factored. This makes it easier for us to reason about. We don’t believe you can review quality in, if you do it line-by-line. For things we develop beyond prototypes we invest heavily in static analysis, custom visualisations like these, and automated tests.&lt;/p&gt;

&lt;h1 id=&quot;the-forest-and-the-trees&quot;&gt;The forest and the trees&lt;/h1&gt;

&lt;p&gt;I already had the web frontends in our development environment set up in a Virtual Machine, accessible on my phone through a private network. This meant that, after some initial setup from a laptop, I could work with a coding agent on developing this tool.&lt;/p&gt;

&lt;p&gt;Having build this, partially while out and about on my phone, I like that I can see the forest (the ten most recent files), and the trees (individual source files). Since this is in the browser, we can re-use libraries to do source code highlighting, and hook into the runtime under Phoenix LiveView to process source code, detect change files etc.&lt;/p&gt;

&lt;p&gt;A nice touch I found to be able to select a part of the microprint, and have the source view scroll to the corresponding part. It also works the other way around - I can scroll in the source, and the highlight in the microprint moves with it. Forests are fractal, after all.&lt;/p&gt;

&lt;aside&gt;
  &lt;p&gt;How do you keep an overview of your software, as it grows? We can support you in realtime and near-realtime perspectives, as well as give you tailored advice, and deliver training and mentoring based on our analysis.
  &lt;/p&gt;
  &lt;p&gt;
    &lt;a href=&quot;/contact&quot;&gt;Book a discovery call to see what we can do&lt;/a&gt;
  &lt;/p&gt;
&lt;/aside&gt;
</description>
        <pubDate>Mon, 02 Feb 2026 00:00:00 +0000</pubDate>
        <link>https://qwan.eu/2026/02/02/liveview_microprints.html</link>
        <guid isPermaLink="true">https://qwan.eu/2026/02/02/liveview_microprints.html</guid>
        
        <category>moldable development</category>
        
        <category>LLM</category>
        
        
      </item>
    
      <item>
        <title>New partner - Sensus</title>
        <description>&lt;p&gt;“You deserve to understand your software!” This is what came out as tag line for Sensus’ &lt;a href=&quot;https://domeinmodel.nl/architecture-review/&quot;&gt;Architecture Review service&lt;/a&gt;. After Stephan Eggermont’s &lt;a href=&quot;https://domeinmodel.nl/the-state-of-llm-agentic-flows/&quot;&gt;The state of LLM Agentic Flows&lt;/a&gt; went viral on LinkedIn, it was high time to describe the kind of thing they do for clients in more detail.&lt;/p&gt;

&lt;p&gt;Especially now that Sensus’ is a QWAN partner. Marc suggested to invite Sensus, as a partner, after Stephan Eggermont has done a lot of work with me on &lt;a href=&quot;https://qtracker.apps.sustainabledelivery.com/&quot;&gt;QWAN Tracker&lt;/a&gt; and more visual collaboration tools. I’ve learnt a lot about moldable development through Stephan, and his view on architecture, code and the role AI augmentation in this is very complimentary to ours.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://domeinmodel.nl/content/images/size/w2000/2026/01/Screenshot-from-2026-01-20-09-11-17-2.png&quot; alt=&quot;Tree graph of file size in Cursors&apos; fastrender browser implementation&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Having active visuals like this, where you can zoom in, zoom out, click through to see details is very valuable to determine next steps for a software system. Sensus makes these for code, as well as for data. To us they may be interchangeable, to stakeholders a picture tells more than a thousand data points.&lt;/p&gt;

&lt;aside&gt;
&lt;h3&gt;Call us for sustainable delivery&lt;/h3&gt;
&lt;p&gt;With Sensus as partner for moldable development and static analysis, and Buffadoo for Engineering Leadership and Innovation Amplifiers, we can quickly put together strong teams to move software systems forward, large and small. Book a discovery call to find out how we do this. We tend to hit the ground running with our experience and common sense, you gain insight as we go, and we can support you on an ongoing basis as well.
&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/consulting&quot;&gt;Book a discovery call.&lt;/a&gt;&lt;/p&gt;
&lt;/aside&gt;
</description>
        <pubDate>Wed, 28 Jan 2026 00:00:00 +0000</pubDate>
        <link>https://qwan.eu/2026/01/28/new-partner-sensus.html</link>
        <guid isPermaLink="true">https://qwan.eu/2026/01/28/new-partner-sensus.html</guid>
        
        <category>moldable development</category>
        
        
      </item>
    
      <item>
        <title>On coupling and cohesion</title>
        <description>&lt;p&gt;Coupling and cohesion are old ideas, but they are still relevant today - vintage concepts that have aged well. Recent posts by &lt;a href=&quot;https://www.linkedin.com/pulse/i-still-feel-urge-reuse-code-even-though-know-its-wrong-dilger-yphie/&quot;&gt;Martin Dilger&lt;/a&gt; and 
&lt;a href=&quot;https://ewolff.com/2026/01/08/cohesion-modules-hierachies.html&quot;&gt;Eberhard Wolff&lt;/a&gt; triggered us to reflect on these concepts and explore a bit based on things we have seen in practice.&lt;/p&gt;

&lt;p class=&quot;post-image post-image-50&quot;&gt;&lt;img src=&quot;/attachments/blogposts/2026/dan-dennis-9ycXTLGNMro-unsplash.jpg&quot; alt=&quot;two coloured ropes tied together in a knot&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;coupling-and-cohesion&quot;&gt;Coupling and cohesion&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Coupling_%28computer_programming%29&quot;&gt;Coupling&lt;/a&gt; and &lt;a href=&quot;https://en.wikipedia.org/wiki/Cohesion_(computer_science)&quot;&gt;cohesion&lt;/a&gt; are vintage concepts from the late 60s, introduced by Larry Constantine as part of Structured Design. These concepts are independent of programming paradigm or approach - whether it is procedural, OO, functional, low code. Different paradigms and languages do offer different constructs to manage coupling and cohesion.&lt;/p&gt;

&lt;p&gt;So what do we mean by coupling? We like the idea of &lt;a href=&quot;https://en.wikipedia.org/wiki/Connascence&quot;&gt;connascence&lt;/a&gt;, which was coined by Meilir Page-Jones in his work on object-oriented design. He introduced this term based on the insight that coupling and cohesion are highly related - you could say are two sides of the same coin.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Two software components are connascent (coupled) if:&lt;/p&gt;

  &lt;p&gt;&lt;strong&gt;a change in one would require the other to be modified to maintain the overall correctness of the system&lt;/strong&gt;&lt;/p&gt;

  &lt;p&gt;or&lt;/p&gt;

  &lt;p&gt;&lt;strong&gt;for some change, both would be required to change to maintain the overall correctness of the system&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;img src=&quot;/attachments/blogposts/2026/connascence/connascence-visualised-2.jpg&quot; alt=&quot;Schematic visualization of software components (systems, modules, functions/types) and red lines visualizing coupling between them&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Roughly speaking, we want to put things that change together close to each other in a component or module, and separate things that change independently. In this way our components/modules become highly cohesive (closely coupled) while their dependencies with other parts are loosely coupled.&lt;/p&gt;

&lt;p&gt;Coupling is not binary. There are different dimensions to coupling and it comes in degrees. The connascence model from Meilir Page-Jones introduces three dimensions, which helps to make conscious decisions on how and when to decouple. We will share more on connascence in a future blog post.&lt;/p&gt;

&lt;h2 id=&quot;coupling-in-context&quot;&gt;Coupling in context&lt;/h2&gt;

&lt;p&gt;We often suffer from existing coupling, especially if it is implicit or not-obvious. So we should try to decouple as much as possible in code we write and maintain? We cannot just “decouple everything”. Coupling is to some degree essential to make software work.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Without coupling, we don’t have working software.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The above definition of coupling mentions &lt;em&gt;change&lt;/em&gt;. Coupling can be troublesome but only for things that change. If a module is very stable, we will not be affected much by any coupling it has.&lt;/p&gt;

&lt;p&gt;So coupling is related to change and rates of change for different parts of our systems. Knowing the volatility or stability of the different parts can help to decide what to decouple. Changes come from the business domains, like changes in functionality, scale, performance, but also from technology, like major framework updates or libraries going unsupported. Although we know change will happen, anticipating specific changes is hard. Over time we usually see what parts become more stable.&lt;/p&gt;

&lt;p&gt;It is not about just decoupling everything, but about making architecture and design decisions that help us manage coupling &lt;em&gt;in our context&lt;/em&gt;. Some examples:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;make more volatile modules depend on more stable modules and not the other way around;&lt;/li&gt;
  &lt;li&gt;make interfaces between modules small and focused, so that consuming modules are not sensitive to changes they don’t care about;&lt;/li&gt;
  &lt;li&gt;wrap external dependencies, including frameworks and libraries, in (thin) adapters with your desired interface, to stop framework changes rippling through your systems;&lt;/li&gt;
  &lt;li&gt;apply &lt;a href=&quot;/2020/08/20/hexagonal-architecture.html&quot;&gt;Hexagonal Architecture&lt;/a&gt;, to manage coupling between domain models, data models and interfaces to other modules and parties in a highly controlled way;&lt;/li&gt;
  &lt;li&gt;apply &lt;a href=&quot;https://en.wikipedia.org/wiki/Shearing_layers&quot;&gt;shearing layers of change&lt;/a&gt; (or pace layering) - something worth a blog post of its own.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;look-ma-no-coupling&quot;&gt;Look ma no coupling!&lt;/h2&gt;

&lt;p&gt;We see developers often claiming that they have decoupled two parts. We already mentioned coupling is not binary. So there is some nuance to claims like that.&lt;/p&gt;

&lt;p&gt;Martin Dilger recently wrote a post &lt;a href=&quot;https://www.linkedin.com/pulse/i-still-feel-urge-reuse-code-even-though-know-its-wrong-dilger-yphie/&quot;&gt;I Still Feel the Urge to Reuse Code (Even Though I Know It’s Wrong)&lt;/a&gt;, which is a good read on managing coupling.&lt;/p&gt;

&lt;p&gt;Let’s take a look at the example in Martin’s post: he describes that a module needs data from another module. Instead of sharing the table (which would introduce strong coupling between the modules), he decided to let the module have its own copy of the data. The copy only contains the attributes that are used by the module: id and title.&lt;/p&gt;

&lt;p&gt;This reduces the ‘exposure’ of one module to the other and makes the interface between them small and explicit - only the id and title attributes. This reduces accidental coupling.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Why would accidental coupling be a problem? The module is not actually using the other data right?&lt;/p&gt;

  &lt;p&gt;Well, when we change the source module, it is often not obvious how much coupling there is. We need to inspect other modules to find out if and how these are coupled, which increases the effort and risk of the change.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Giving a dependent module its own copy of the data also makes the module less dependent on the availability of the source module.&lt;/p&gt;

&lt;p&gt;The example also shows that such a decoupling move involves making trade-offs. To keeping a separate copy of the data, you needs a synchronisation mechanism and the data is eventually consistent. This is not good or bad, but it is important to keep these trade-offs in mind and make deliberate decisions about them.&lt;/p&gt;

&lt;p&gt;If we’re nitpicky, we could say the example does not &lt;em&gt;remove&lt;/em&gt; coupling, but &lt;em&gt;reduces&lt;/em&gt; it. The dependent module still depends on the id and title attributes. If these would change, the module should be updated as well. However, we expect id and title to be pretty stable, so this is low-impact coupling we don’t need to worry about.&lt;/p&gt;

&lt;h2 id=&quot;decouple-by-duplicating-code&quot;&gt;Decouple by duplicating code?&lt;/h2&gt;

&lt;p&gt;We sometimes notice some backlash against heuristics like &lt;a href=&quot;/2025/12/12/four-plus-one-rules-of-simple-design.html&quot;&gt;Once and Only Once&lt;/a&gt; and Don’t Repeat Yourself (DRY), which focus on removing duplication. Removing duplication by introducing some abstraction would create inconvenient coupling - an entangled abstraction that has multiple reasons to change. The counter-proposal is to keep code duplicated so that the ‘duplicates’ can change independently.&lt;/p&gt;

&lt;p&gt;This looks like a misinterpretation of the heuristics (or maybe seeing them as hard rules rather than heuristics) combined with prematurely introducing abstractions.&lt;/p&gt;

&lt;p&gt;Duplicate code is often a hint there might be an abstraction missing. If we create an abstraction but it turns out we need to change it for different reasons, we probably have entangled different concerns that should not be together. Think of the Single Responsibility Principle - &lt;em&gt;a class or module should have only one reason to change&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;If we decide to keep the duplicates and it turns out they change independently, then they are by definition not coupled (using the definition above).&lt;/p&gt;

&lt;p&gt;We think considering “what changes together” is more helpful here than focusing on removing literal duplication.&lt;/p&gt;

&lt;h2 id=&quot;event-based-architecture--decoupling&quot;&gt;Event based architecture = decoupling?&lt;/h2&gt;

&lt;p&gt;Another form of decoupling of services we often hear mentioned, is replacing a direct, synchronous call between services by an asynchronous event bus, making them “decoupled”. This does not come for free, but is a trade-off (as always).&lt;/p&gt;

&lt;p&gt;Again, decoupling is not binary, but a multi-dimensional scale. Some aspects of coupling are indeed reduced or removed:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;coupling in time;&lt;/li&gt;
  &lt;li&gt;the availability of the dependent service does not depend on the other’s availability.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are still other forms of coupling that remain:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Dependence on the event format&lt;/strong&gt; - events are in fact a public API of the producing service, just like a REST API. This form of coupling is well-manageable, e.g. through contact testing, API versioning, API deprecation agreements.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Dependence on event semantics&lt;/strong&gt; - how should the events be interpreted? This coupling is more subtle and can lead to duplicated, coupled logic in both services. If the producing logic source changes, you will probably need to update the consuming service as well.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Can we reduce the semantics coupling, e.g. by sending thick events that contain full objects? This increases the interface surface and makes the consuming service dependent on a broader set of data. This can introduce accidental coupling if not all the data is used.&lt;/p&gt;

&lt;h2 id=&quot;deliberate-decoupling&quot;&gt;Deliberate (de)coupling&lt;/h2&gt;

&lt;p&gt;We might sound somewhat critical of decoupling attempts, but we’re not saying decoupling does not work or using events is a bad idea. We find it important to realize what forms of coupling we try to reduce, what coupling remains, how are we going to manage that coupling, and what trade-offs are we willing to make in the process.&lt;/p&gt;

&lt;h2 id=&quot;further-reading&quot;&gt;Further reading&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.linkedin.com/pulse/i-still-feel-urge-reuse-code-even-though-know-its-wrong-dilger-yphie/&quot;&gt;I Still Feel the Urge to Reuse Code (Even Though I Know It’s Wrong)&lt;/a&gt; by Martin Dilger&lt;/li&gt;
  &lt;li&gt;Another good read from this year is &lt;a href=&quot;https://ewolff.com/2026/01/08/cohesion-modules-hierachies.html&quot;&gt;Cohesion, Modules, and Hierarchies&lt;/a&gt; by Eberhard Wolff&lt;/li&gt;
  &lt;li&gt;Meilir Page-Jones, Fundamentals of OO Design in UML (1999)&lt;/li&gt;
  &lt;li&gt;Meilir Page-Jones, &lt;a href=&quot;https://www.researchgate.net/publication/220424550_Comparing_Techniques_by_Means_of_Encapsulation_and_Connascence&quot;&gt;Comparing Techniques by Means of Encapsulation and Connascence&lt;/a&gt;, in Communications of the ACM Sept 1992&lt;/li&gt;
  &lt;li&gt;Jim Weirich, &lt;a href=&quot;https://www.youtube.com/watch?v=NLT7Qcn_PmI&quot;&gt;The Grand Unified Theory of Software Design&lt;/a&gt;, at the Acts as Conference 2009&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://connascence.io&quot;&gt;Connascence.io&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Vlad Khononov wrote a book on &lt;a href=&quot;https://vladikk.com/page/books/&quot;&gt;Balancing Coupling in Software Design&lt;/a&gt;. We haven’t read it yet, but it’s on our list.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Photo “brown rope on blue wooden table” © 2020 by &lt;a href=&quot;https://unsplash.com/@cameramandan83?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText&quot;&gt;Dan Dennis&lt;/a&gt; on &lt;a href=&quot;https://unsplash.com/photos/brown-rope-on-blue-wooden-table-9ycXTLGNMro?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText&quot;&gt;Unsplash&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;aside&gt;
&lt;h3&gt;Decouple more deliberately!&lt;/h3&gt;
&lt;p&gt;We offer workshops in this area, e.g. explore coupling and cohesion through a hands-on workshop, based on connascence, or a hands-on workshop about the SOLID design principles.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/contact&quot;&gt;Let&apos;s have a chat&lt;/a&gt;&lt;/p&gt;
&lt;/aside&gt;
</description>
        <pubDate>Fri, 23 Jan 2026 00:00:00 +0000</pubDate>
        <link>https://qwan.eu/2026/01/23/on-coupling.html</link>
        <guid isPermaLink="true">https://qwan.eu/2026/01/23/on-coupling.html</guid>
        
        <category>architecture</category>
        
        <category>coupling</category>
        
        <category>design</category>
        
        
      </item>
    
      <item>
        <title>Step away from the prompt to sustain your pace</title>
        <description>&lt;p&gt;Stepping away from the keyboard (or your phone) is one of those practices that work regardless of how you produce software. Sustainable pace is solidly in the category of &lt;em&gt;things we should do, regardless of how we produce work&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Sustainable pace was on my list of practices to re-evaluate last year. In a sense, now more than when I read the eXtreme Programming book, it is more a pattern than a practice. It very much depends on the context - who am I working with, what is fluent for me, what needs practice? What is fluent for others? Is the work that comes out of my flow state making their life more difficult?&lt;/p&gt;

&lt;p&gt;Whenever we increase the amount of new information we process, we need breaks. I’m learning to play the guitar. The first time I practised, I was exhausted after five minutes. Now I can play a bit longer. And still, practising in smaller intervals works better for me than practising all day. After a while, things fall in to place, magically, without thinking about them consciously.&lt;/p&gt;

&lt;p&gt;You need that fresh perspective. Stepping away from your software, letting it rest for a couple of days. Going out for walks. Singing in a pub choir. Connecting with other people. My desk remains one of my favourite places in the world. As does the sofa, for writing. But going out and not doing “one more thing” is important. Not only for the quality of the work, but also for the quality of your life.&lt;/p&gt;

&lt;p&gt;Deciding to move forward with a prototype or scrap it is better mulled over away from the keyboard. That code that didn’t look quite right? Let it rest for a couple of days, write it again. Use TDD as if you meant it while waiting for your pair to show up. Bask in the glow of focused, well tested code. And then merge it with the parts that came out of the coding agent that were good enough. Spike and Stabilise goes great when you’ve got a fresh perspective.&lt;/p&gt;

&lt;p&gt;Step away from the prompt, and come back while your subconscious does work. Especially with iterative tools like Claude Code, you can make good progress if you know what you are doing, and pressing ‘Yes’ on the next question and waiting for the result is addictive. It will also lead you into trouble when you are not paying attention.&lt;/p&gt;

&lt;h2 id=&quot;further-reading&quot;&gt;Further reading&lt;/h2&gt;

&lt;p&gt;I have better, incremental and iterative tooling, but still, having an opinion and making up your mind as to where to go with the product takes time. As Chris Parsons wrote last summer: &lt;a href=&quot;https://www.chrismdp.com/ai-swarms-failed-toyota-vs-ford-development/&quot;&gt;Product work can not be parallelized&lt;/a&gt;. Taste does not come cheap.&lt;/p&gt;

&lt;p&gt;While wrapping up editing for this post, I found &lt;a href=&quot;https://lucumr.pocoo.org/2026/1/18/agent-psychosis/&quot;&gt;Armin Ronacher on a similar note&lt;/a&gt;. Armin Ronacher writes: “Maybe the answer is that we need better tools — better ways to signal quality, better ways to share context, better ways to make the AI’s involvement visible and reviewable”. This is what we are working on through &lt;a href=&quot;/blog-by-tag#tag-moldable-development&quot;&gt;Moldable development&lt;/a&gt;. Armin also mentions stepping away.&lt;/p&gt;

&lt;p&gt;I want to post more about recent experiments, and getting to what I feel is a good place with what Kent Beck calls ‘whishcraft’ - AI augmented development. I need a few more of what I call ‘anchor posts’ like this to not come across unmoored. Rob Bowley’s post on 
&lt;a href=&quot;https://blog.robbowley.net/2025/05/12/we-need-a-rise-in-the-voices-of-techno-realists/&quot;&gt;techno realists&lt;/a&gt; is good reading while I write the other ones. Working with coding assistants can accelerate. Accelerate positively &lt;em&gt;and&lt;/em&gt; negatively.&lt;/p&gt;

&lt;h2 id=&quot;afterword&quot;&gt;Afterword&lt;/h2&gt;

&lt;p&gt;This post has been a long time coming. I saw people in spring last year complaining of informational overload, and a kind of mental whiplash. “What just happened?”. And not being able to stop was a common theme on the Claude Code Reddit. (I am not on there at the moment, I cut back on social media). And I wrote this post, because I need to remind myself of this. I got hooked on programming early, and burnt out early, in secondary school. I have occasionally learnt how to manage my energy better.&lt;/p&gt;

&lt;p&gt;We need better tools, certainly. But as they say on Reddit: Touch grass. A clear head will get you the situational awareness you need.&lt;/p&gt;

&lt;aside&gt;
  &lt;h3&gt;Deliver sustainably&lt;/h3&gt;
  &lt;p&gt;Do you find it hard to stop developing software? Take some time to have a coffee with us, and talk about the good and bad things&lt;/p&gt;
  &lt;p&gt;
    &lt;a href=&quot;/contact&quot;&gt;Let&apos;s chat&lt;/a&gt;
  &lt;/p&gt;
&lt;/aside&gt;
</description>
        <pubDate>Sun, 18 Jan 2026 00:00:00 +0000</pubDate>
        <link>https://qwan.eu/2026/01/18/step_away_from_the_prompt.html</link>
        <guid isPermaLink="true">https://qwan.eu/2026/01/18/step_away_from_the_prompt.html</guid>
        
        <category>LLM</category>
        
        <category>Heuristics</category>
        
        
      </item>
    
      <item>
        <title>There is no neutral position</title>
        <description>&lt;p&gt;In any complex systems, there is no neutral position. We cannot take a neutral stance in a complex system like a team, group, organisation, or with a partner.When I am
part of a system, I will have influence on this system, whether I intend it or
not. Even if I try to place myself ‘outside’ the system, or stand on the sidelines, or “just watch”, I’m still part of the system. “Standing on the sideline” will influence the others, usually with &lt;a href=&quot;/2025/11/08/unintended-consequences&quot;&gt;unintended consequences&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;doing-nothing-is-doing-something&quot;&gt;Doing nothing is doing something&lt;/h2&gt;

&lt;p&gt;As I wrote in &lt;a href=&quot;/2025/12/08/art-of-non-intervention&quot;&gt;The subtle art of non-intervention&lt;/a&gt;, not acting can also be an intervention. So deciding to do nothing will have consequences, whether we intend it or not.&lt;/p&gt;

&lt;p&gt;As a consultant or facilitator, I might think I’m standing on the sidelines, observing the team, now and then prodding them to bring about change. In practice I become part of this system. I need to be part of a system to have influence. So I’m in, even if I’m pretending to be standing on the outside. So when I think I’m “just observing”, I am already changing the system dynamics.&lt;/p&gt;

&lt;p&gt;We have impact on a (complex) system by engaging with it, and only by engaging. We will become a part of that whole, for some time. Being too much on the sideline means we will not have lasting impact.&lt;/p&gt;

&lt;p class=&quot;post-image post-image-30&quot;&gt;&lt;img src=&quot;/attachments/blogposts/2026/ananth-pai-rUlbvGtJLj8-unsplash.jpg&quot; alt=&quot;Close-up of pickled sliced cucumbers in a jar&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;influence-is-reciprocal&quot;&gt;Influence is reciprocal&lt;/h2&gt;

&lt;p&gt;The system will also influence me! The influencing is mutual. Gerald M. Weinberg wrote about this in &lt;a href=&quot;https://geraldmweinberg.com/Site/Consulting_Secrets.html&quot;&gt;Secrets of Consulting&lt;/a&gt;, as &lt;em&gt;“Prescott’s Pickle Principle”&lt;/em&gt; - consultants are like cucumbers in a jar of organizational brine ;)&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Cucumbers get more pickled than brine gets cucumbered. A small system that tries to change a big system through long and continued contact is more likely to be changed itself.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;“Change is for other people” we sometimes joke as consultants, pretending we’re independent and it’s just the organization that needs to change. But we know that change is as much for us consultants as well.&lt;/p&gt;

&lt;p&gt;The system touches us. Whatever is happening, it will affect us. We will feel this. It can be exhausting (drowning in other people’s problems), but if you learn to regulate this, it can provide a lot of information.&lt;/p&gt;

&lt;p&gt;To close, two more quotes (cited by Abeba Birhane in her &lt;a href=&quot;https://www.youtube.com/watch?v=YAkPbjx-gNc&quot;&gt;In defence of uncertainty&lt;/a&gt; presentation):&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Objectivity is a subject’s delusion that observing can be done without him. Invoking objectivity is abrogating responsibility — hence its popularity.&lt;br /&gt;
– &lt;em&gt;Heinz von Foerster&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;Without the observer, there is nothing.&lt;br /&gt;
– &lt;em&gt;Humberto Maturana&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;Credits: Photo © 2017 Ananth Pai - &lt;a href=&quot;https://unsplash.com/photos/sliced-cucumber-and-green-leafy-vegetables-in-container-with-moist-rUlbvGtJLj8&quot;&gt;sliced cucumber and green leafy vegetables in container with moist&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;aside&gt;
&lt;h3&gt;We&apos;re in it together&lt;/h3&gt;
&lt;p&gt;We don&apos;t inflict change on others, but we collaborate, focusing on outcomes that fit your situation.
&lt;/p&gt;
&lt;p&gt;
&lt;a href=&quot;/contact&quot;&gt;Let&apos;s have a chat&lt;/a&gt;
&lt;/p&gt;
&lt;/aside&gt;
</description>
        <pubDate>Tue, 06 Jan 2026 00:00:00 +0000</pubDate>
        <link>https://qwan.eu/2026/01/06/no-neutral-stance.html</link>
        <guid isPermaLink="true">https://qwan.eu/2026/01/06/no-neutral-stance.html</guid>
        
        <category>complexity</category>
        
        <category>systems thinking</category>
        
        <category>facilitation</category>
        
        
      </item>
    
      <item>
        <title>Can an &quot;agent&quot; document your development process?</title>
        <description>&lt;p&gt;One of the questions on my &lt;a href=&quot;/2025/12/11/stochastic-to-deterministic.html&quot;&gt;Stochastic to Deterministic post&lt;/a&gt;, and the &lt;a href=&quot;https://www.linkedin.com/feed/update/urn:li:activity:7404850582819348480&quot;&gt;meta post on LinkedIn&lt;/a&gt; about what was left out, boiled down to: “can’t you ask the coding agent to document the process”? (The actual question was more detailed, read on to find out).&lt;/p&gt;

&lt;p&gt;Yes, that is possible. I didn’t publish it immediately, because the order of the writing and the graphics suggests a much more up-front documentation process than how it works. For instance, the size and order of the images suggests a flow that is not as it feels like when working on QWAN Tracker.&lt;/p&gt;

&lt;h2 id=&quot;legibility&quot;&gt;Legibility&lt;/h2&gt;

&lt;p&gt;One reason for this, is that the process is not entirely legible for the agent. Admittedly, more of my process is now in written form, or can be derived from it, but what precedes the prompts in the agent, and what happens around it, is invisible to the agent. That means that you get documentation for the part of the process that is in writing.&lt;/p&gt;

&lt;p&gt;Some examples of things that are not (yet) legible: The walking, the day dreams (hammock driven development), the chats with Claude desktop sketching ideas and code without running it, and iterating on that before committing to actually generating and running code, adding tests, copying and modifying stored prompts from other projects, generating more stored prompts.&lt;/p&gt;

&lt;p&gt;Some of that can be retrieved from the chat history, but it is less explicit than the process encoded in the ‘plan iterations’, ‘prepare iteration’, ‘start iteration’ and ‘check iteration’ stored prompts.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;The agent documents the &lt;em&gt;written&lt;/em&gt; process, not the thinking, so &lt;em&gt;context&lt;/em&gt; must be explicitly added.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;(quoted, as suggested by qwen3-thinking, see bonus content below)&lt;/p&gt;

&lt;h2 id=&quot;my-actual-process-as-i-see-it-at-the-moment&quot;&gt;My actual process, as I see it at the moment&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;/attachments/blogposts/2025/hammock-driven-development.svg&quot; alt=&quot;Stick figure, lying horizontally. A thinking bubble saying: &amp;quot;Hammock Driven Development&amp;quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;So the average process, as I perceive it, is mull over a problem, than at some point have a chat with a model on my phone to sketch out an idea. Sometimes that leads to a scaffold with code, other times a text file with a rough description of what it should do. Then I go over to a coding agent (Claude code in my case). I think if I need more stored prompts. Sometimes I ‘just’ scaffold a new site using the Phoenix LiveView scaffolding tools, and then let the coding agent do a small bit of work to merge the files I had generated, or quickly generate code based on the initial description. This is very much like the ‘spike solution’ of eXtreme Programming. I want to see the idea running, and play around with it.&lt;/p&gt;

&lt;p&gt;Then I decide if I want to continue. At that point I might pull in stored prompts from another project that is close enough. I will tell the coding agent that I added stored prompts from another project, and how I think they should be adapted to this prototype. This is also often the point I will add tests for what is there, and then work test-first from then on. Or, occasionally, if the code is too messy, start over test-first, with the stored prompts I have to work in iterations. The iterations process is more accurate, but relatively slow.&lt;/p&gt;

&lt;p&gt;I am learning to sometimes stop shortly after that, for personal tools. Having gotten the 80% of the value that is 20% of the time, it is not always valuable to do the remaining 900% of work for the remaining 20% of the value.&lt;/p&gt;

&lt;h2 id=&quot;reasons-to-be-careful&quot;&gt;Reasons to be careful&lt;/h2&gt;

&lt;p&gt;Another reason to be careful is, that as Simon Wardley indicated, the agent is probably about 60% right, and 40% wrong, and it is up to you to figure out what are the right and the wrong bits. I think maybe with the recent versions of Claude Code and the Opus 4.5 model, it is more, but you can never be sure.&lt;/p&gt;

&lt;p&gt;I probably should have published it with these caveats, suggestion of more structured process and possible errors, and let the readers decide for themselves. As a colleague pointed out, practices are still evolving. It is worth sharing what works, what doesn’t, and what results come out.&lt;/p&gt;

&lt;h2 id=&quot;generated-diagrams&quot;&gt;Generated diagrams&lt;/h2&gt;

&lt;p&gt;Looking back, I asked Claude Code for diagrams of the process. The stored prompts are plenty of text, and a picture tells a thousand words. So &lt;a href=&quot;/attachments/blogposts/2025/iteration-workflow/iteration-workflow.pdf&quot;&gt;browse the pdf of the iteration workflow&lt;/a&gt; or &lt;a href=&quot;/attachments/blogposts/2025/iteration-workflow/iteration-workflow.md&quot;&gt;read the markdown&lt;/a&gt;, with the diagrams in text.&lt;/p&gt;

&lt;p&gt;On LinkedIn, I intentionally posted the last image, containing the json files and the markdown generated from it. The data is saying a lot about the process, and I could quickly see that it was accurate.&lt;/p&gt;

&lt;h2 id=&quot;original-question-for-this-post&quot;&gt;Original question for this post&lt;/h2&gt;

&lt;p&gt;The original question was from Hugh Greene:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Can you get the LLMs to generate “blog post fodder” commentary on what they’re doing, and what did/didn’t work, as you go?!?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;my response, three weeks ago:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;I should try that again. I have used that in the past to improve stored prompts, or create new ones. I did start this morning with having Claude Code generate a document explaining ‘our’ process. But you’d have to read that bottom to top, otherwise the reader might think we execute precise specifications from the beginning. It had strong vibes’ of Royce’s paper, with feedback loops that readers would ignore, because of how the document flows. That is where the image in the post comes from.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;What do you think?&lt;/p&gt;

&lt;aside&gt;
  &lt;p&gt;
Practices are evolving. We are figuring things out, as are you. We are considering rebooting our newsletter, if there is interest. If you&apos;d like to subscribe, drop us a line, and we will add you to the list, so that we can figure things out together. We&apos;re also up for free 30 mins chats.
  &lt;/p&gt;
  &lt;p&gt;
    &lt;a href=&quot;/contact&quot;&gt;Fill in the contact form to subscribe!&lt;/a&gt;
  &lt;/p&gt;
&lt;/aside&gt;

&lt;h1 id=&quot;bonus-content---the-prompt-and-response-used-to-improve-this-post&quot;&gt;Bonus content - the prompt and response used to improve this post&lt;/h1&gt;

&lt;p&gt;There was a TODO at the bottom of the post, to add an image, plus Hugh Greene’s question and my initial response on LinkedIn. I run qwen3-thinking transparently in my writing environment, locally. it will take the last part of the text as a prompt, and write it’s answer, by default, in the text below the question.&lt;/p&gt;

&lt;p&gt;I haven’t done much with language models to support my writing yet, so I though you might find this interesting.&lt;/p&gt;

&lt;p&gt;The text above is now different of course, as I incorporated some of the recommendations. Not all. Notice in the bold text that qwen got the order of Pareto wrong. That was because I wrote it down in the wrong order. In that sense this is a bit like some cases of TDD or double entry bookkeeping: seeing the same mistake twice, but worded differently makes it obvious.&lt;/p&gt;

&lt;p&gt;I was thinking of making a YouTube short about this process, but as Matteo Vaccari said, posts only have value when they are in front of the reader. Same goes for videos, and I don’t have time for that now.&lt;/p&gt;

&lt;h2 id=&quot;question-and-answer&quot;&gt;Question and answer&lt;/h2&gt;
&lt;p&gt;Does the text above the TODO answer the question in the first begin_quote? Is this text clear to an audience of senior developers and engineering managers? What can be added, removed or reworded to improve quality?&lt;/p&gt;

&lt;p&gt;Yes, the text answers the question. It clearly states:&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;“I should try that again… I have used that in the past to improve stored prompts… had Claude Code generate a document explaining ‘our’ process.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Clarity for senior devs/engineering managers&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;✅ Strong on &lt;em&gt;practicality&lt;/em&gt; (agent’s 60% accuracy, “spike solutions”, value/effort trade-offs).&lt;/li&gt;
  &lt;li&gt;✅ Uses relevant terms (&lt;em&gt;spike solution&lt;/em&gt;, &lt;em&gt;Wardley mapping&lt;/em&gt;, &lt;em&gt;stored prompts&lt;/em&gt;).&lt;/li&gt;
  &lt;li&gt;❌ &lt;strong&gt;“80% of work that is 20% of time”&lt;/strong&gt; is confusing → &lt;em&gt;rewrite as&lt;/em&gt;: &lt;strong&gt;“80% of the work delivers 20% of the value”&lt;/strong&gt; (classic Pareto).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;(I have fixed this now, so won’t work for YouTube)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key fixes&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;Replace:
    &lt;blockquote&gt;
      &lt;p&gt;&lt;em&gt;“Having done the 80% of work that is 20% of the time…”&lt;/em&gt;&lt;br /&gt;
With:&lt;br /&gt;
&lt;em&gt;“I often stop at 80% of the work—which delivers 20% of the value—since the final 20% consumes 900% of effort.”&lt;/em&gt;&lt;/p&gt;
    &lt;/blockquote&gt;
  &lt;/li&gt;
  &lt;li&gt;Remove &lt;strong&gt;“TODO add meta image”&lt;/strong&gt; (out of scope for audience).&lt;/li&gt;
  &lt;li&gt;Tighten:
    &lt;blockquote&gt;
      &lt;p&gt;&lt;em&gt;“mull over a problem”&lt;/em&gt; → &lt;em&gt;“refine problem statements”&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;“fledgling micro-product”&lt;/em&gt; → &lt;em&gt;“prototype”&lt;/em&gt;&lt;/p&gt;
    &lt;/blockquote&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Why this works&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Addresses &lt;em&gt;their pain points&lt;/em&gt;: agent limitations, documentation friction, value-focused delivery.&lt;/li&gt;
  &lt;li&gt;Shows &lt;em&gt;operational maturity&lt;/em&gt; (self-critique, caveats, process refinement).&lt;/li&gt;
  &lt;li&gt;No fluff; every sentence ties to a concrete practice (stored prompts, test-first, Wardley’s 60% rule).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Final tweak&lt;/strong&gt;: Add one line to crystallize the core insight:&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;&lt;em&gt;“The agent documents the *written&lt;/em&gt; process, not the thinking—so context must be explicitly added.”*&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;(This directly answers the “how” and “why” behind the meta-post.)&lt;/em&gt;&lt;/p&gt;
</description>
        <pubDate>Mon, 05 Jan 2026 00:00:00 +0000</pubDate>
        <link>https://qwan.eu/2026/01/05/agent-documents-process.html</link>
        <guid isPermaLink="true">https://qwan.eu/2026/01/05/agent-documents-process.html</guid>
        
        <category>LLM</category>
        
        
      </item>
    
      <item>
        <title>Announcing QWAN Tracker</title>
        <description>&lt;p&gt;&lt;a href=&quot;https://qtracker.apps.sustainabledelivery.com&quot;&gt;QWAN Tracker&lt;/a&gt; is task tracker for small, fast moving teams. For people who do the work, by people who do the work.
It lets you quickly jot down things you think need doing as you are working, so you can stay focused on the task at hand. Keyboard navigation, and live sync so your partners stay in the loop.&lt;/p&gt;

&lt;p&gt;I don’t build web applications for myself usually. But QWAN tracker is both fun and useful - for me, and then for me and Stephan Eggermont. I like tools to be responsive, and get out of the way. This doesn’t have to be for everyone. If it works for me, there might be more people who like it. Who knows.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/attachments/blogposts/2025/only-release-when-you-are-able-to-iterate.png&quot; alt=&quot;Overview of QWAN tracker. 4 lanes with cards, a pop up for editing a card, titled release qtracker in to the wild. Description: X: If you aren&apos;t embarrassed to by your first release, you left it too late. Me: Only do this when you are able to iterate. &amp;quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This is an early release, see below for details. Stephan and I have been using this for two weeks, to steer our work, and we are enjoying it. We hope you might too.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;X: If you aren’t embarrassed to by your first release, you left it too late. 
Me: Only do this when you are able to iterate.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;target-audience&quot;&gt;Target audience&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;individuals who have moved their todos back to a text file, because all the online trackers got enshittified or disappeared&lt;/li&gt;
  &lt;li&gt;small teams who move fast and faster, and care about getting the details right, but don’t want to describe the details in detail ;-)&lt;/li&gt;
  &lt;li&gt;12 people who want to give us feedback and influence direction.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is an early release.&lt;/p&gt;

&lt;h2 id=&quot;non-goals&quot;&gt;Non Goals&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Estimation. Tasks move one at a time, if they are too big, break them down or use another medium for the conversation.&lt;/li&gt;
  &lt;li&gt;Enterprise management reporting (this is necessary sometimes, but not in the context of small teams of indie developers for instance, there are other tools for that).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;options&quot;&gt;Options&lt;/h2&gt;

&lt;p&gt;Things that we might build, but don’t commit to&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;API so that you can hook up your favorite language model to brainstorm with, or your coding agent to pick up tasks.&lt;/li&gt;
  &lt;li&gt;Renaming boards&lt;/li&gt;
  &lt;li&gt;Renaming, adding and removing columns&lt;/li&gt;
  &lt;li&gt;Change categories - code smells and refactorings don’t work for everything ;-)&lt;/li&gt;
  &lt;li&gt;Board dashboard, so you can collect all your boards (this will probably be a paid option, we are thinking of ways to sell boards in an affordable way and with as little commitment as possible)&lt;/li&gt;
  &lt;li&gt;Ways to link to and from other mediums (e.g. opportunity solution trees, event storms, user story maps ).&lt;/li&gt;
  &lt;li&gt;Digital Sovereignty Edition. Self hosting for data privacy, formerly known as Enterprise Edition. Probably comes with some kind of DevOps capability assessment beforehand. Only latest version supported.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;you-cant-always-build-what-you-want&quot;&gt;You can’t always build what you want,&lt;/h2&gt;

&lt;p&gt;So sometimes, you build what you need. I didn’t plan to build yet another task tracker. But once it was there, before I knew it, I had four boards live. So maybe you find this something useful. Main reason for building this is that we want a multi player version of Refactoring Cards (contact us if you want early access for the single player / co-located pair version).&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://qtracker.apps.sustainabledelivery.com/&quot;&gt;QWAN tracker&lt;/a&gt; helps me and Stephan Eggermont stay on track - thanks for helping me get this out of the door. We have many ideas, and every time we finish something, we have even more. Initially, as you will see in this version, you will be greeted by draft code smells and refactoring cards. Press ‘d’ to delete cards. Press ‘?’ to see the help and what keyboard commands you can use.&lt;/p&gt;

&lt;aside&gt;
  &lt;p&gt;
Try a board. Become an early adopter. Have fun. Get things done.
  &lt;/p&gt;
  &lt;p&gt;
    &lt;a href=&quot;https://qtracker.apps.sustainabledelivery.com/&quot;&gt;Explore QWAN tracker&lt;/a&gt;
  &lt;/p&gt;
&lt;/aside&gt;
</description>
        <pubDate>Fri, 19 Dec 2025 00:00:00 +0000</pubDate>
        <link>https://qwan.eu/2025/12/19/announcing-qwan-tracker.html</link>
        <guid isPermaLink="true">https://qwan.eu/2025/12/19/announcing-qwan-tracker.html</guid>
        
        <category>moldable development</category>
        
        <category>dimensional planning</category>
        
        
      </item>
    
      <item>
        <title>The 4 plus 1 Rules of Simple Design</title>
        <description>&lt;p&gt;We strive for simple code. It is something we pay attention to in the Refactoring step of the Test Driven Development cycle. But what is “simple”? How do we stay away from discussions about taste or “simplicity is in the eye of the beholder?”.&lt;/p&gt;

&lt;p&gt;In his original eXtreme Programming Explained book, Kent Beck introduced the &lt;strong&gt;Rules of Simple design&lt;/strong&gt;, a heuristic consisting of a set of 4 ordered rules that focus on what “simple” means for the design of code.&lt;/p&gt;

&lt;p&gt;Based on our experience, we have added a fifth rule to make the heuristic more context-aware. Willem came up with the fifth one a while back, and posted it on a social media platform. This lead to a lively discussion. One could consider that rule 5 is a special case, or an acceptance criterion of rule 2. What do you make of that? We’d appreciate your feedback.&lt;/p&gt;

&lt;p&gt;We’ve found the added emphasis on the readers and later editors of the code useful over the years.&lt;/p&gt;

&lt;h2 id=&quot;the-four-rules-of-simple-design&quot;&gt;The four rules of Simple Design&lt;/h2&gt;

&lt;p&gt;The Rules of Simple design state that the design of our code should satisfy these rules, in order of priority:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;1. passes all tests
2. reveals intention
3. contains no duplication 
4. has fewest elements
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Passes all tests&lt;/strong&gt; — we only refactor on green tests, so if a test is failing, we first fix it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reveals intention&lt;/strong&gt; — our code is not just a solution for now, but also a means of communication with other developers (including future you). Being understandable is key to sustainable delivery. We want our code to express all intentions explicitly, by using the constructs that our programming languages offers us (classes, methods, functions, types, variables). Often, we only really understand our problem once we have written the solution, so refactoring is essential for putting everything we learned in the code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Contains no duplication&lt;/strong&gt; —duplication means that the same concept is expressed in multiple places. This introduces coupling between these parts - if we change one, the others should be changed as well. Especially if the coupling is implicit, it will introduce defects sooner or later. This rule is not about literal duplication, but about (implicit, hidden) coupling. Make sure that every relevant concept has a single place in the code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Has fewest elements&lt;/strong&gt; — once the tests are passing, we have expressed all relevant intentions and there is no duplication, we try to minimize the elements — classes, functions, methods, types.&lt;/p&gt;

&lt;h2 id=&quot;something-special-about-rule-2--3&quot;&gt;Something special about rule 2 &amp;amp; 3&lt;/h2&gt;

&lt;p&gt;At first sight, revealing intention and no duplication look like two different things, but they are actually two sides of the same coin. This is captured by the &lt;strong&gt;Once And Only Once (OAOO)&lt;/strong&gt; principle from Extreme Programming.&lt;/p&gt;

&lt;p&gt;Once And Only Once means that every relevant concept needs to have its place in the code (&lt;em&gt;at least once&lt;/em&gt;) and that the concept should not be duplicated; it should be expressed in a single place (&lt;em&gt;only once&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;This not only helps make code explicitly communicate its intent, but also makes it predictable.,Everyone knows where to find things and we can be sure that this is the only place where to look. It helps in deciding &lt;a href=&quot;/2020/12/23/what-to-put-where&quot;&gt;what to put where&lt;/a&gt; and what to find where.&lt;/p&gt;

&lt;h2 id=&quot;the-fifth-rule&quot;&gt;The fifth rule&lt;/h2&gt;

&lt;p&gt;Having worked with many different teams and developers of different background and experience levels, we have added a fifth rule:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;5. the code should be at an abstraction level the whole team can understand
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We have worked in multiple teams where a few highly experienced developers wrote dense, highly abstract code. This is not a bad thing per se, but in those cases the more junior developers did not have the experience level to work with the resulting code. This is particularly relevant when external developers join the team for a limited time period. The code they leave behind should be manageable by the rest of the team.&lt;/p&gt;

&lt;p&gt;Willem was confronted with this, when working in a team, where in order to ship, the code had to be significantly less abstract than what he was used to. Getting an appreciation from a teammate on a tiny abstraction with documentation was great, and also a bit confusing. Somebody noticed, and it was just the right abstraction, revealing intent to everyone.&lt;/p&gt;

&lt;p&gt;There is a strong relation here with Richard Gabriel’s notion of &lt;strong&gt;habitable software&lt;/strong&gt;, from his book &lt;a href=&quot;https://www.dreamsongs.com/Files/PatternsOfSoftware.pdf&quot;&gt;Patterns of Software&lt;/a&gt; (PDF):&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;What are some of the things that contribute to uninhabitable programs? Over-use of abstraction and inappropriate compression come to mind.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The discourse that follows this quote is worth (re-)reading. As sense of ownership of a program’s code and design can be directly correlated to how comfortable everyone involved finds it to work with.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;So what do you think. 5th rule, or rule 2a?&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;further-reading&quot;&gt;Further reading&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Martin Fowler has a &lt;a href=&quot;https://martinfowler.com/bliki/BeckDesignRules.html&quot;&gt;good description of the Beck Design Rules&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;The source of these rules is the Simple Design practice as described in &lt;em&gt;eXtreme Programming Explained 1st edition&lt;/em&gt; (p. 57): “Every piece of design in the system must be able to justify its existence on these terms.”&lt;/li&gt;
  &lt;li&gt;A &lt;a href=&quot;https://c2.com/xp/OnceAndOnlyOnce.html&quot;&gt;discussion about Once And Only Once on the C2 Wiki&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Debasish Ghosh, &lt;a href=&quot;https://debasishg.blogspot.com/2006/02/habitability-and-piecemeal-growth.html&quot;&gt;Habitability and Piecemeal Growth&lt;/a&gt;, ruminations on Richard Gabriel’s concept of habitability of software&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://bluefruit.co.uk/quality/care-about-habitable-code-how-achieve/&quot;&gt;Care about habitable code, and how to achieve it&lt;/a&gt; in embedded software, by Emily. No reference to Richard Gabriel, but does include some specific suggestions.&lt;/li&gt;
  &lt;li&gt;Mathias Verraes wrote a post about duplication and the “Don’t Repeat Yourself” (DRY) principle: &lt;a href=&quot;https://verraes.net/2014/08/dry-is-about-knowledge/&quot;&gt;DRY is about Knowledge. Code duplication is not the issue&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.deconstructconf.com/2019/dan-abramov-the-wet-codebase&quot;&gt;The wet codebase&lt;/a&gt; by Dan Abramov (of React); he talks about the benefits and costs of abstraction: &lt;em&gt;“It is hard to explain all the trade-offs to then next generation, they don’t have the context to decide when it is a bad idea. (…) When we teach something to the next generation we should explain what are the benefits, and what we are trading away.”&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Updated on 5 January 2026:&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;em&gt;added references, a link to Mathias Verraes’s post on DRY and a link to Dan Abramov’s post on Wet codebase&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;aside&gt;
&lt;h3&gt;Let&apos;s keep things simple&lt;/h3&gt;
&lt;p&gt;Let&apos;s explore together how you can apply Simple Design in your code base, for instance through a coding dojo, hands-on course or us working with you on your system.
&lt;/p&gt;
&lt;p&gt;
&lt;a href=&quot;/contact&quot;&gt;Talk to us&lt;/a&gt;
&lt;/p&gt;
&lt;/aside&gt;
</description>
        <pubDate>Fri, 12 Dec 2025 00:00:00 +0000</pubDate>
        <link>https://qwan.eu/2025/12/12/four-plus-one-rules-of-simple-design.html</link>
        <guid isPermaLink="true">https://qwan.eu/2025/12/12/four-plus-one-rules-of-simple-design.html</guid>
        
        <category>productivity</category>
        
        <category>feedback</category>
        
        <category>refactoring</category>
        
        <category>test driven development</category>
        
        <category>systems thinking</category>
        
        
      </item>
    
  </channel>
</rss>
