Learn
Architecture
Patterns, tradeoffs, and system design decisions.
Make workflow state additive before making it authoritative
When migrating a system to a new state model, the instinct is to replace the old state immediately. The safer path is additive rollout: the new state coexists with the old, falls back to it when absent, and only becomes authoritative once it is proven in production.
2026-04-25
Preventing a single channel from becoming the accidental default in multi-channel systems
In multi-platform publishing and notification systems, whichever channel was implemented first tends to become the silent default. Other channels get skipped without error. The fix is making required outputs explicit from the start, not implicit from what exists.
2026-04-25
Lazy backfill: roll out new data shapes without a migration script
When you add a new required field to stored records, the instinct is to write a migration script that processes everything upfront. A better approach normalizes on read, detect missing fields, fill them lazily, write once, then stable.
2026-04-25
Catch data conflicts before code review, not after
Two features touching the same database table is a conflict waiting to happen. A feature registry and a mandatory conflict check forces the conversation before the code is written.
2026-04-18
Soft deletes aren't just for audit trails, they're your sales pipeline
When you hard-delete a record, you lose the sales lead. Inactive records in a marketplace platform are your best prospects, enforce soft delete at the database role level, not in application code.
2026-04-18
When the bug isn't a bug: diagnosing runtime barriers before debugging
Some failures aren't bugs in your code, they're structural mismatches between your runtime and the capability you're trying to use. Recognising this distinction saves days of misdirected debugging.
2026-04-18
Sequential vs Parallel Execution: when faster is the wrong answer
The instinct is always to run things in parallel. Here's why that instinct can get you banned, blocked, or with corrupted data.
2026-04-13