<feed xmlns="http://www.w3.org/2005/Atom"> <id>https://ndthuan.com/</id><title>{ndt.write();}</title><subtitle>Software engineer exploring AI, software systems, and how technology changes the way we work.</subtitle> <updated>2026-10-03T01:28:17+07:00</updated> <author> <name>Thuan Nguyen</name> <uri>https://ndthuan.com/</uri> </author><link rel="self" type="application/atom+xml" href="https://ndthuan.com/feed.xml"/><link rel="alternate" type="text/html" hreflang="en" href="https://ndthuan.com/"/> <generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator> <rights> © 2026 Thuan Nguyen </rights> <icon>/assets/img/favicons/favicon.ico</icon> <logo>/assets/img/favicons/favicon-96x96.png</logo> <entry><title>The GIL Bottleneck Hiding in Self-Hosted LLM Serving</title><link href="https://ndthuan.com/gil-bottleneck-self-hosted-llm-serving/" rel="alternate" type="text/html" title="The GIL Bottleneck Hiding in Self-Hosted LLM Serving" /><published>2026-09-25T12:00:00+07:00</published> <updated>2026-09-25T12:00:00+07:00</updated> <id>https://ndthuan.com/gil-bottleneck-self-hosted-llm-serving/</id> <content type="text/html" src="https://ndthuan.com/gil-bottleneck-self-hosted-llm-serving/" /> <author> <name>Thuan Nguyen</name> </author> <category term="Artificial Intelligence" /> <summary>Why a custom logits processor that runs once per request can dominate tail latency even when the GPU batches perfectly, and the batch-level rewrite that fixes it.</summary> </entry> <entry><title>Open-weight LLMs are winning on cost, not benchmarks</title><link href="https://ndthuan.com/open-weight-models-winning-on-cost/" rel="alternate" type="text/html" title="Open-weight LLMs are winning on cost, not benchmarks" /><published>2026-09-13T10:00:00+07:00</published> <updated>2026-09-13T10:00:00+07:00</updated> <id>https://ndthuan.com/open-weight-models-winning-on-cost/</id> <content type="text/html" src="https://ndthuan.com/open-weight-models-winning-on-cost/" /> <author> <name>Thuan Nguyen</name> </author> <category term="Artificial Intelligence" /> <summary>Open-weight models are not catching up to frontier APIs on benchmarks. They are already ahead on the number that decides most production budgets: cost per request at scale.</summary> </entry> <entry><title>The Transactional Outbox Pattern: Reliable Events Without Distributed Transactions</title><link href="https://ndthuan.com/transactional-outbox-pattern/" rel="alternate" type="text/html" title="The Transactional Outbox Pattern: Reliable Events Without Distributed Transactions" /><published>2026-09-04T09:00:00+07:00</published> <updated>2026-09-04T09:00:00+07:00</updated> <id>https://ndthuan.com/transactional-outbox-pattern/</id> <content type="text/html" src="https://ndthuan.com/transactional-outbox-pattern/" /> <author> <name>Thuan Nguyen</name> </author> <category term="Software Engineering" /> <summary>Saving to the database and publishing an event are two writes to two systems that fail independently. The transactional outbox pattern makes the event part of the same database transaction, so what commits is what gets published - here is a working Go and PostgreSQL implementation, including the retry, ordering, latency and cleanup details most guides skip.</summary> </entry> <entry><title>A Weekend Ride to Vũng Tàu, and Eight Walls I Came Home With</title><link href="https://ndthuan.com/vung-tau-by-bicycle/" rel="alternate" type="text/html" title="A Weekend Ride to Vũng Tàu, and Eight Walls I Came Home With" /><published>2026-08-27T00:00:00+07:00</published> <updated>2026-08-27T00:00:00+07:00</updated> <id>https://ndthuan.com/vung-tau-by-bicycle/</id> <content type="text/html" src="https://ndthuan.com/vung-tau-by-bicycle/" /> <author> <name>Thuan Nguyen</name> </author> <category term="Photography" /> <summary>A weekend bicycle ride to Vũng Tàu, the road that made it worth doing, and eight photographs of walls. Notes on riding for the pleasure of it, and on why a town you arrive in slowly gives you different pictures.</summary> </entry> <entry><title>Bloom Filters: How Databases Skip Disk Reads They Don't Need</title><link href="https://ndthuan.com/bloom-filters-how-databases-skip-disk-reads/" rel="alternate" type="text/html" title="Bloom Filters: How Databases Skip Disk Reads They Don&amp;apos;t Need" /><published>2026-08-24T00:00:00+07:00</published> <updated>2026-08-24T00:00:00+07:00</updated> <id>https://ndthuan.com/bloom-filters-how-databases-skip-disk-reads/</id> <content type="text/html" src="https://ndthuan.com/bloom-filters-how-databases-skip-disk-reads/" /> <author> <name>Thuan Nguyen</name> </author> <category term="Computer Science" /> <summary>Bloom filters answer one narrow question - definitely not present, or maybe present - in a fixed amount of memory, and that narrow answer is enough to save databases from millions of disk reads for keys that were never there. Here is how they work, the math behind the false positive rate, and where RocksDB, Cassandra, and PostgreSQL actually use them.</summary> </entry> </feed>
