A notebook on backend and systems engineering.
How every piece is built
- 01Context
- 02Constraint
- 03Approach
- 04Pitfalls
- 05Expiry
Latest49
Notes, systems write-ups and journal — one stream, newest first.
- Journal5 sections
The Cost of Deferring an Upgrade
A PHP 7.1 → 8.2 upgrade was put off because "it works." The bill came later: a dependency lock, batched breaking changes, and bugs spread over months.
- Journal5 sections
Chasing 100% Coverage With Tests That Do Nothing
Test coverage is not a target, it's a byproduct. The cost of tests written to push the number up that catch no bugs at all
- SponsoreddevrazziSkip the noise, read the signalCurated tech news and synthesis for developers. The content is produced by AI agents, and every piece links back to its source.
- Journal5 sections
The Cost of Installing a Package for Everything
The security, maintenance, and supply-chain cost of adding a dependency for a small function — and when writing it yourself is cheaper
- Note6 sections
CQRS: When You Need It, When It's Dead Weight
Separating read and write models: the clarity CQRS buys in a complex domain, and the dead weight it adds to plain CRUD
- Note6 sections
An Archiving Strategy: Old Data Without the Slowdown
Separating old records that bloat the live table: partitioning, cold storage, and keeping query access while you archive
- Journal5 sections
Is Your Data Really Big, or Just Badly Modeled?
Most big-data problems are really bad modeling or a missing index; before moving to a distributed system, ask whether the data is actually big
- Note7 sections
Sizing a PostgreSQL Queue Table by Its Live Set
On a queue table, an index and an autovacuum threshold that grow with the table scale wrong; the measured case for sizing both to the pending jobs
- Journal5 sections
ORM or Native SQL?
Is the ORM making us lazy, or actually protecting us? The balance of safety, readability, and performance between the two approaches
- Note6 sections
Indexes: Too Few Slow Reads, Too Many Kill Writes
A missing index slows the query; too many indexes make every write expensive. Striking the right balance by measurement, not by guesswork
- Note4 sections
Changing Schema in Production With Zero Downtime
Running migrations without causing downtime in production: backward-compatible steps, multi-phase column changes, and avoiding table locks
- Note7 sections
Read/Write Splitting: Separating Read and Write Load
Before scaling up the database: moving read traffic to replicas, the traps replication lag creates, and when you actually need it
- Note6 sections
Before You Reach for Redis: The Right Cache Strategy
The questions to ask before adding a cache, why cache invalidation is hard, and the choice between TTL and consistency
- Journal5 sections
The NoSQL Trap: Starting Because "It Has No Schema"
The consistency and data-integrity crises that projects which moved to NoSQL for the comfort of going schemaless eventually hit
- Journal4 sections
Is PostgreSQL Enough for Everything?
Before adding a separate search engine, queue, or document DB: how far PostgreSQL gets you on its own, and where its limit begins.
- Journal4 sections
Signals That a System Has Grown Too Complex
The concrete red flags that reveal code or architecture has turned needlessly complex — and where to start simplifying
- Note6 sections
Circuit Breakers for External Service Integrations
Connecting a critical system to external APIs: using timeouts, retries, and circuit breakers to stop one service's collapse from taking the whole system down.
- Note7 sections
The Serverless Decision: Cold-Start and Vendor Lock-in
Before you move to FaaS: the real cost of cold-start latency, vendor lock-in risk, and the workloads where serverless actually pays off
- Note6 sections
BFF Pattern: A Separate API Layer for Mobile and Web
Separate API layers for mobile and web: the hidden cost of bending one API to fit every client, and when a BFF is actually warranted
- Note7 sections
Synchronous or Asynchronous? HTTP or the Queue
Should a job run inside the HTTP request or go to a queue? The decision line, drawn through response time and fault tolerance
- System10 sections
Transactional Outbox: Dual-Write, Idempotent Consumers
Closing dual-write with an outbox, suppressing the at-least-once repeats it creates, and encrypting the personal data inside the event.
Elsewhere
My main software blog
sade.dev keeps the architecture notes and the production lessons. The rest of software — languages, tools, practice, teams — lives on the main blog.