<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/addition-by-subtraction-in-software-design-ki80p0ho3" -->

---
title: Addition by subtraction in Software Design | daily.dev
description: A reflection on over-engineering through a real example: building Strictland, a contract testing library for detecting message schema drift. The author...
canonical: https://daily.dev/posts/addition-by-subtraction-in-software-design-ki80p0ho3
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: Addition by subtraction in Software Design | daily.dev
og:description: A reflection on over-engineering through a real example: building Strictland, a contract testing library for detecting message schema drift. The author...
og:url: https://daily.dev/posts/addition-by-subtraction-in-software-design-ki80p0ho3
og:image: https://api.daily.dev/og/posts/ki80P0Ho3.png
og:image:alt: Addition by subtraction in Software Design
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Addition by subtraction in Software Design

**[Event-Driven by Oskar Dudycz](https://daily.dev/sources/event-driven-io)** · 9 min read · 0 upvotes · 0 comments

## Summary

A reflection on over-engineering through a real example: building Strictland, a contract testing library for detecting message schema drift. The author describes how he planned multiple configurable storage and grouping strategies, only to realize the permutations created complexity without value. By applying a 'subtraction' mindset — removing imaginary features — he arrived at a single opinionated layout that also unlocked a useful Contract Registry pattern. The post distills two rules: adding imaginary features subtracts real value, and subtracting imaginary features adds real value. A practical framework is offered: generate ideas, evaluate tradeoffs, then deliberately cut what isn't needed before shipping.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://event-driven.io/en/addition-by-subtraction-in-software-design>

## Questions this post answers

### What does the Strictland contract testing library do for detecting message schema drift?

Strictland serializes a message and stores the resulting payload as a snapshot file inside the same git repository as the test, so schema changes become visible as diffs during code review. A test calls MessageContract.specification with a JSON serializer, given a sample message, and asserts the contract is unchanged, catching accidental schema drift before it reaches production.

_Developers evaluating contract testing approaches can track library updates like this one on daily.dev._

### What folder and naming layout does Strictland 0.4.0 use for storing message contract snapshots?

Strictland 0.4.0 nests snapshots by full class path under a contract-registry folder and groups files by message type name, using the format {messageTypeName}.{version}.{variant}.snap.approved.{extension}. For example, OrderPlaced.1.default.snap.approved.json sits under com/acme/orders/OrderPlaced/, effectively forming a contract registry rather than offering multiple selectable layout strategies.

_Engineers deciding how to structure test snapshots can follow real-world library design choices on daily.dev._

## Similar posts on daily.dev

- [The Subtraction Instinct](https://daily.dev/posts/the-subtraction-instinct-csuvifyvh) · Fish Food for Thought · 0 upvotes · 0 comments
- [On sabotaging projects by overthinking, scope creep, and structural diffing](https://daily.dev/posts/on-sabotaging-projects-by-overthinking-scope-creep-and-structural-diffing-29nhbo9oj) · Hacker News · 4 upvotes · 0 comments
- [The Cost of Change in Software](https://daily.dev/posts/the-cost-of-change-in-software-zgqnzhu9w) · Ruby Flow · 0 upvotes · 0 comments
- [I follow an architecture principle I call The Law of Collective Amnesia](https://daily.dev/posts/i-follow-an-architecture-principle-i-call-the-law-of-collective-amnesia-8kstqv5ka) · ITNEXT · 78 upvotes · 8 comments
- [Adding and Subtracting: The Only UX Lesson That Stuck With Me](https://daily.dev/posts/adding-and-subtracting-the-only-ux-lesson-that-stuck-with-me-rwyyi9j19) · Medium · 0 upvotes · 0 comments

---

Tags: [#general-programming](https://daily.dev/tags/general-programming), [#open-source](https://daily.dev/tags/open-source), [#architecture](https://daily.dev/tags/architecture)

[View this post on daily.dev](https://daily.dev/posts/addition-by-subtraction-in-software-design-ki80p0ho3)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"Addition by subtraction in Software Design","url":"https://daily.dev/posts/addition-by-subtraction-in-software-design-ki80p0ho3","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/addition-by-subtraction-in-software-design-ki80p0ho3"},"datePublished":"2026-07-07T12:46:57.704Z","dateModified":"2026-09-14T08:30:33.081Z","description":"A reflection on over-engineering through a real example: building Strictland, a contract testing library for detecting message schema drift. The author...","image":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/8063ebdef07540b325a5febc7846d7d8?_a=AQAEuop","thumbnailUrl":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/8063ebdef07540b325a5febc7846d7d8?_a=AQAEuop","isAccessibleForFree":true,"articleSection":"Event-Driven by Oskar Dudycz","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":"Event-Driven by Oskar Dudycz","logo":"https://media.daily.dev/image/upload/s--unDKCFQ0--/f_auto,q_auto/v1781695550/logos/event-driven-io?_a=BAMAMiWQ0","url":"https://daily.dev/sources/event-driven-io"},"commentCount":0,"discussionUrl":"https://daily.dev/posts/addition-by-subtraction-in-software-design-ki80p0ho3","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":0},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":0}],"keywords":"general-programming,open-source,architecture","timeRequired":"PT9M"}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"Event-Driven by Oskar Dudycz","item":"https://daily.dev/sources/event-driven-io"},{"@type":"ListItem","position":3,"name":"Addition by subtraction in Software Design"}]}
{"@context":"https://schema.org","@type":"FAQPage","@id":"https://daily.dev/posts/addition-by-subtraction-in-software-design-ki80p0ho3#faq","mainEntity":[{"@type":"Question","name":"What does the Strictland contract testing library do for detecting message schema drift?","acceptedAnswer":{"@type":"Answer","text":"Strictland serializes a message and stores the resulting payload as a snapshot file inside the same git repository as the test, so schema changes become visible as diffs during code review. A test calls MessageContract.specification with a JSON serializer, given a sample message, and asserts the contract is unchanged, catching accidental schema drift before it reaches production. Developers evaluating contract testing approaches can track library updates like this one on daily.dev."}},{"@type":"Question","name":"What folder and naming layout does Strictland 0.4.0 use for storing message contract snapshots?","acceptedAnswer":{"@type":"Answer","text":"Strictland 0.4.0 nests snapshots by full class path under a contract-registry folder and groups files by message type name, using the format {messageTypeName}.{version}.{variant}.snap.approved.{extension}. For example, OrderPlaced.1.default.snap.approved.json sits under com/acme/orders/OrderPlaced/, effectively forming a contract registry rather than offering multiple selectable layout strategies. Engineers deciding how to structure test snapshots can follow real-world library design choices on daily.dev."}}]}
```

