Anti-Patterns in Software Blogging — Michael Lynch
Software posts lose readers through slow openings, assumed knowledge, links that do the explaining, and broken mobile layouts.
Software posts lose readers through slow openings, assumed knowledge, links that do the explaining, and broken mobile layouts.
A hands-on tour of the kernel boundaries that make a container: namespaces, capabilities, seccomp, and resource limits.
A CHICKEN Scheme maintainer on debugging a heap corruption, learning a language runtime, and knowing when a REPL's state cannot be trusted.
Lukas Vogel runs Doom's game logic and renderer inside CedarDB, revealing which parts fit set-based processing and which fight it.
Screen Memories combines on-device vision search, sampled video scenes, OCR, and transcription; its 'every frame' pitch deserves a closer look.
A small binary-adder proof shows what formal verification adds beyond an executable implementation: explicit specifications, stronger invariants, and surfaced assumptions.
A hardware-in-the-loop regression suite tests five ESP32 Wi-Fi commissioning paths with a real Android phone, network behavior, and phase-level timings.
A benchmark loss led ParadeDB to better data locality, adaptive Blockmax pruning, and a sharper distinction between exact and approximate BM25.
Turbopuffer is demoting vector search from its primary storage layout after the original optimization began constraining every other query path.
Metrics can test a product choice, but they cannot replace the judgment and conviction needed to make one.
A unit-test technique catches Rust/WGSL field-size and offset mismatches before malformed data reaches a GPU shader.
A binary-tree exercise grows into a Lisp interpreter in C, forcing concrete choices about closures, pointer-stable allocation, and garbage collection.
Engineering is the process that lets a team produce reliable software without depending on individual brilliance.
A practical framework for finding and prioritizing platform work from system, user, organizational, and industry signals.
How a conservative CPU depth buffer, hierarchical voxel occluders, and workload reduction cut an occlusion pass from roughly 150 ms to 4 ms.
A regular account plus a crafted package was enough for root on the Lua package registry. The sandbox was solid — the LuaJIT bytecode loader underneath it was not.
Settings, plugins, modding, open source and AI coding all hit a ceiling on real customization. An Ink & Switch essay proposes three design patterns instead: gentle slopes, tools rather than apps, and communal creation.
NeoVim changed its undo file format, deleted the existing vim undo files, and left a 20-year user with nothing. The bug was forgivable. The answer — that persistence was never promised — is what lost him.
A nineteen-part interactive refresher on Go concurrency: select semantics, pipelines, sync primitives, atomics, testing and tracing — and the difference between a data race and a race condition.
A paper argues coding agents can replace human review. Allspaw's reply: decompose a human job into measurable functions and you lose the integration that mattered.
Go import paths name your git host, so moving repositories means rewriting imports everywhere. The fix is a vanity domain and a go-import meta tag.
Give the candidate your concerns live, at the end of the interview. They either correct you or confirm you — either way you know more before the debrief.
Choosing a native language isn't a performance strategy. Data layout decides whether the hardware can help you — a 2013 essay that reads like today's mechanical sympathy.
int was never meant to be 32 bits. C's platform-dependent integer sizes were the portability mechanism that let one language run on 12-, 16-, 36- and 60-bit machines.
GitHub replaced CSS-in-JS with CSS Modules across Primer and dotcom: 55% less server-side render time, 25% less component init, ~7,760 sx props migrated with no breakage.
Intel's 1980 floating-point coprocessor ran 16 CORDIC steps for the high-order bits, then handed the tiny residual to a Padé rational approximation — and deliberately never divided.
A chat overlay that rendered viewer messages as HTML, a Chromium build inside OBS running without its sandbox, and a V8 bug already exploited in the wild — enough to turn a chat message into native code on the streamer's machine.
A Debian LoongArch package hung forever because a counter incremented with #pragma omp atomic kept losing updates. Six months later the cause was a CPU erratum: atomic add is not always atomic.
Bench-poking the nRF54L key management unit by hand, a register push that looked like a no-op turned out to be a stale J-Link memory cache — the write landed, the CPU was halted, and the debugger kept serving the old value.
Denver's automated baggage system had 20 miles of track, 4,000 robotic carts and a hundred 486s running custom OS/2 control software. It never really worked. A reconstruction of the contracting, schedule and software failures behind the most-taught systems-engineering debacle.
A properly indexed SELECT DISTINCT on a partitioned queue scanned 1M rows to find 3 partition keys. Postgres has no loose index scan, so the fix is a recursive CTE that coerces the planner into a different shape.
Twelve years of Play Store income, a 15% cut worth over €1,000 a year, and a two-week review queue that makes no distinction between feature updates and security updates. Daniel Gultsch explains why his XMPP client is now free.
Brainfuck has eight instructions and one data structure. Austin Shijo built fixed-point arithmetic, division, square roots and structured control flow on top of them, and got a working ray tracer that renders one pixel per minute.
Screens were first-class OS objects on the Amiga: overlapping display areas with their own resolutions, colour depths and palettes, switched instantly and dragged to reveal each other — on a 7 MHz machine.
What separates engineers who seem to know what needs doing: ask why first, set your accumulated experience aside long enough to see the actual problem, and buy momentum with the smallest possible step.
A string length read twice in Avast's aswSnx driver turns a paged-pool overflow into arbitrary kernel read/write and SYSTEM. The chain, and the object-selection reasoning behind it, is the part worth keeping.
Rails World's opening keynote announced a flagship app leaving the framework and reframed convention over configuration as token efficiency. Jared Norman reads the productivity claims against the evidence behind them.
Ryzen 7 single-core performance grew 47% from Zen 3 to Zen 5 while clocks rose only 15% — the gains came from wider cores: more dispatch width, integer ALUs, reorder buffer entries and 512-bit SIMD.
DataHaskell's new Parquet writer and the trade-offs behind it: row-group and page sizes are best-effort targets, pinned ByteArrays cannot be grown in place, and 256 KiB write chunks dodge kernel dirty-page throttling.
Go 1.27's experimental simd package deletes fixed-size vectors from the type system, exposes only the intersection of platform operations, and fills the gaps with emulation — with front-end AST rewriting doing per-width specialization.
A technical writer's answer to 'what skills should I learn now' is philosophy, literature, linguistics and history — because once AI handles fact retrieval and trite prose, the edge is having positions you can defend.
A wiki operator's twelve-day timeline of a volumetric DDoS: provider null-routing with no ETA or override, why anti-bot gates do nothing here, one firewall mistake that exposed the origin, and a mitigation vendor that suspended the account mid-attack.
RACKCRUNCH read the HTTPS response headers of 4,688 directory-listed US local-business sites. Half met none of seven criteria — and when their CSPs were actually parsed, script-restricting policies dropped to 4 percent.
An unescaped OSC 8 hyperlink in ansi2html let a build log carry XSS into any viewer's browser. SourceHut shipped the vulnerable library for four and a half years — which is the part worth remembering.
The GitHub wiki has exactly one advantage — it is one click away from anywhere in the repo — and a long list of reasons against it. Project docs belong in a /docs folder, versioned and reviewed like code.
An impostor repo carried his product name and logo while its installer was flagged for malware. GitHub support stayed silent for 23 days — the takedown came ten minutes after the story hit Hacker News.
Geocodio went from bash scripts to full-fledged internal apps. The constraint was never building them — it was maintaining them, and that is what changed.
Vary tells a cache which request fields may affect a response, but not which differences actually matter. Cloudflare splits the decision: the origin declares what may vary, the edge decides what variation is worth caching.
VS Code's remote-SSH mode stages a bash stager and a bundled Node install onto the host, then opens a WebSocket back to your editor — with filesystem, PTY, and persistence.
Radicle's node transport was never encrypted and its handshake never authenticated peers, so anyone on the network path could read private repositories and replay an allow-listed Node ID to fetch them on demand. The team published before the fix existed, because exposure cannot be undone by a patch.