Posts from 2025
Goroutines and Channels
Goroutines are cheap but leak without an exit, channels synchronise, and one goroutine owning state needs no lock. Plain counters want a mutex or atomic.
ClickHouse Basics: MergeTree and Tiered Storage with S3
How ClickHouse MergeTree stores data as sorted parts, and how a storage policy plus TTL TO VOLUME moves old data to S3 automatically, with a Docker quick start.
The Event Loop Is Not Multithreading: The Most Common Concurrency Misconception in Node.js
Node's non-blocking I/O looks like parallel execution, but it runs on a single-threaded event loop, and that difference bites hard once work turns CPU-heavy.
Interfaces and Composition
Go interfaces are satisfied implicitly: small interfaces and embedding replace inheritance, and an adapter behind an interface keeps implementations swappable.
Semantics Lost at the Boundary, and Why the Monolith Keeps Pulling
When a large system is hard to compose, the components are usually fine. What broke is the meaning, flattened into bytes as it crossed a service boundary.
"It Builds" Is Not the Same as Well-Designed
A passing build only proves the toolchain config is not contradicting itself; it says nothing about whether the design is sound.
Types Are Not Safety
TypeScript's type system is a tool for thinking through your data and your boundaries, not a way to buy a feeling of safety.