<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>HFT Engineer's Roadmap</title><link>https://hftengineer.com/</link><description>Recent content on HFT Engineer's Roadmap</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Sat, 20 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://hftengineer.com/index.xml" rel="self" type="application/rss+xml"/><item><title>Lock-free SPSC ring buffer: the queue under every trading system</title><link>https://hftengineer.com/posts/spsc-ring-buffer/</link><pubDate>Sat, 20 Jun 2026 00:00:00 +0000</pubDate><guid>https://hftengineer.com/posts/spsc-ring-buffer/</guid><description>A single-producer/single-consumer ring buffer is the fastest way to move data between two threads — and the canonical low-latency interview question. We build one in C++, prove it correct with acquire/release ordering, and then watch a textbook false-sharing &amp;lsquo;fix&amp;rsquo; make it slower before the real optimisation takes it 14× faster. All numbers measured and ThreadSanitizer-clean.</description></item><item><title>Multi-producer lock-free queues: CAS, sequence numbers, and why they don't scale</title><link>https://hftengineer.com/posts/mpsc-lock-free-queue/</link><pubDate>Sat, 20 Jun 2026 00:00:00 +0000</pubDate><guid>https://hftengineer.com/posts/mpsc-lock-free-queue/</guid><description>The SPSC ring buffer was easy because each cursor had exactly one writer. Add a second producer and that assumption — and the whole design — breaks. We fix it with Vyukov&amp;rsquo;s per-cell sequence-number queue, prove it correct under ThreadSanitizer, and then measure something every low-latency engineer should internalise: making it &amp;rsquo;lock-free&amp;rsquo; does not make it scale.</description></item><item><title>Mechanical sympathy: cache, branches, false sharing</title><link>https://hftengineer.com/posts/mechanical-sympathy/</link><pubDate>Sun, 03 May 2026 00:00:00 +0000</pubDate><guid>https://hftengineer.com/posts/mechanical-sympathy/</guid><description>Three hardware ideas that decide whether your low-latency code is fast or pretending to be: how the cache hierarchy works, why branch prediction can change runtime by 5×, and how false sharing makes lock-free code slower than mutexes.</description></item><item><title>The single-writer principle</title><link>https://hftengineer.com/posts/single-writer-principle/</link><pubDate>Sun, 03 May 2026 00:00:00 +0000</pubDate><guid>https://hftengineer.com/posts/single-writer-principle/</guid><description>A short walk through the single-writer principle: why exactly one thread should mutate a piece of state, why this is faster than &amp;lsquo;real&amp;rsquo; lock-free code in most cases, and how the Disruptor pattern operationalises it.</description></item><item><title>About</title><link>https://hftengineer.com/about/</link><pubDate>Sat, 25 Apr 2026 00:00:00 +0000</pubDate><guid>https://hftengineer.com/about/</guid><description>&lt;h2 id="whos-writing"&gt;Who&amp;rsquo;s writing&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;m a software engineer at a high-frequency trading firm. I&amp;rsquo;m still learning constantly, and I write these posts to summarise what I pick up: partly to cement it for myself, partly because I&amp;rsquo;m happy if they help someone break into the industry.&lt;/p&gt;
&lt;h2 id="what-this-blog-is"&gt;What this blog is&lt;/h2&gt;
&lt;p&gt;Deep dives on the systems, languages, and tools that make latency-sensitive software work, and the broader ecosystem they sit in. Some of it is JVM-internal (ZGC, JIT, Loom), some of it is data-shaped (DuckDB, ClickHouse, Iceberg), some of it is networking and OS (kernel-bypass, eBPF), some of it is the trading-domain mental models I wish I&amp;rsquo;d had on day one (order books, single-writer designs, market microstructure).&lt;/p&gt;</description></item><item><title>Generational ZGC, end to end</title><link>https://hftengineer.com/posts/generational-zgc/</link><pubDate>Sat, 25 Apr 2026 00:00:00 +0000</pubDate><guid>https://hftengineer.com/posts/generational-zgc/</guid><description>A walk through Generational ZGC: coloured pointers, load and store barriers, the generational split landed in JDK 21, and how it hits sub-millisecond pauses on multi-TB heaps.</description></item><item><title>Order-book data structures: the ADT, the array ladder, and the tradeoffs</title><link>https://hftengineer.com/posts/order-book-data-structures/</link><pubDate>Sat, 25 Apr 2026 00:00:00 +0000</pubDate><guid>https://hftengineer.com/posts/order-book-data-structures/</guid><description>How matching engines store and update the limit order book — sorted maps, array+bitmap ladders, hash+list, and the production tradeoffs — with a reference Java implementation.</description></item></channel></rss>