A tiny primitive that turns concurrent work into a coordinated, adaptive system. "The Ephemeral Signals Pattern" In Part 1 we built ephemeral execution - bounded, private, self-cleaning async workflows. In Part 2 we turned that into a reusable library with…
In Part 1: Fire and Don't Quite Forget, we explored the theory behind ephemeral execution - bounded, private, debuggable async workflows that remember just enough to be useful and then evaporate. This article turns that pattern into a reusable library you can…
Most async systems either remember too much (logs, queues, persisted junk you never wanted)… or they remember nothing at all (fire-and-forget black holes that vanish the moment something goes wrong). This article introduces something different: A pattern where…
Most systems degrade when overloaded. Memory fills up, queries slow down, users complain, servers crash. A few unusual ones get better. This article shows how an LRU-based behavioural memory becomes self-optimising when it hits capacity - and how this pattern…
Most software architectures assume the system is static. DiSE assumes the system is alive. Note: This is Part 4 in the "Cooking with DiSE" series. See Part 1, Part 2: Graduated Apprenticeships, and Part 3: Untrustworthy Gods for background. This article is the…
Scrapers are about to start using AI to mimic real users - so I built a bot detector that learns, adapts, and fights back. Read Part 2: How Bots Got Smarter - The New Frontier in Bot Detection 👉 See It Live: StyloBot.net - This is the real production system…
By someone who can't stop analysing patterns, even their own. As the category says, this is a far more personal essay than my usual work. I don't mind if you skip it...but if it resonates leave a comment! I read them all (and it needn't be public). <!-- [TOC]…
PostgreSQL's ltree extension gives you materialised paths with database-native superpowers: GiST indexes, specialised operators like @> and <@, and powerful pattern matching. If you're committed to PostgreSQL and want the best hierarchy query performance,…
Nested sets encode the entire tree structure into just two integers per node - Left and Right boundaries from a depth-first walk. Finding all descendants becomes a simple range query, and ORDER BY Left gives you perfect display order. The catch? Every insert…
Materialised paths store the complete ancestry as a delimited string - like /1/3/7/ - making ancestors instantly readable without any joins. Perfect for breadcrumb generation and human-readable debugging, though moving subtrees means updating every…
Closure tables precompute and store every ancestor-descendant relationship, trading storage space for blazing-fast reads. This is the approach this blog uses for its comment system - when reads vastly outnumber writes, the extra insert complexity pays off with…
The adjacency list is the simplest and most intuitive approach to storing hierarchical data - each row just points to its parent. It's what most developers reach for first, and for shallow trees with frequent moves, it's often the right choice. This article…
Hierarchical data is everywhere in software development: threaded comments, organisational charts, file systems, product categories, and forum discussions. The eternal question of "how do I store a tree in a relational database?" has haunted developers since…
Here's an uncomfortable truth that nobody in the AI hype machine wants to discuss: We still don't know what intelligence actually is. Not in humans. Not in animals. And certainly not in machines. This isn't just academic hairsplitting. It's the foundational…
The core principle: make releases fast and painless, and you'll release more often. This is critical for agile development - rapid, reliable deployments create the fast feedback loop you need. When deploying is scary or slow, teams batch up changes, increasing…
Welcome to Part 2 of our comprehensive guide to data access in .NET! In Part 1, we explored Entity Framework Core in depth, including SQL generation, common pitfalls, and that critical warning about proxies and caching. In this article, we'll explore the…
When building .NET applications, one of the most important architectural decisions you'll make is how to handle data access and object mapping. The .NET ecosystem offers a rich variety of approaches, from full-featured ORMs to bare-metal SQL execution. Each…
Ok quick piece here. You've read all about semantic search, in MANY articles here. But you may have noticed; THIS SITE AIN'T ACTUALLY USING IT YET. So where is it? Simple the way I deploy this site means I NEED downtime to change my docker-compose.yml…
Now that you understand the fundamentals of k6 and performance testing, it's time to put that knowledge into practice. This article walks you through writing real tests, integrating them into CI/CD pipelines, and using profiling tools to identify and fix…
Your application works perfectly on your laptop. Unit tests pass. Integration tests pass. You deploy to production, and suddenly everything grinds to a halt. Five hundred real users hit your homepage simultaneously, and your server starts returning 503 errors.…