<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Ian Duncan</title><description>Software engineer, open source contributor, and occasional writer.</description><link>https://iankduncan.com/</link><language>en-us</language><item><title>Making Haskell Talk to PostgreSQL Without Suffering</title><link>https://iankduncan.com/engineering/2026-02-20-haskell-postgresql-without-suffering/</link><guid isPermaLink="true">https://iankduncan.com/engineering/2026-02-20-haskell-postgresql-without-suffering/</guid><description>How to eliminate the three performance taxes that make database queries slow: encoding overhead, round-trip latency, and N+1 query patterns.</description><pubDate>Fri, 20 Feb 2026 00:00:00 GMT</pubDate><author>Ian Duncan</author></item><item><title>Archive: Automatic Optimal Pipelining of Redis Commands</title><link>https://iankduncan.com/engineering/2026-02-17-archive-redis-pipelining/</link><guid isPermaLink="true">https://iankduncan.com/engineering/2026-02-17-archive-redis-pipelining/</guid><description>Archived from Informatikr (originally published January 18, 2012). Describes how the Haskell Redis client Hedis achieves automatic and optimal pipelining by combining lazy I/O with a synchronous-looking API, getting the best of both synchronous and asynchronous approaches.</description><pubDate>Tue, 17 Feb 2026 00:00:00 GMT</pubDate><author>Ian Duncan</author></item><item><title>TIL: HTTP/3 Is Not Always Faster Than HTTP/2</title><link>https://iankduncan.com/engineering/2026-02-10-http3-not-always-faster/</link><guid isPermaLink="true">https://iankduncan.com/engineering/2026-02-10-http3-not-always-faster/</guid><description>Local benchmarks revealed HTTP/3 can be 50-100x slower than HTTP/2. QUIC&apos;s userspace implementation loses to decades of kernel TCP optimizations on high-bandwidth, low-latency networks.</description><pubDate>Tue, 10 Feb 2026 00:00:00 GMT</pubDate><author>Ian Duncan</author></item><item><title>What Functional Programmers Get Wrong About Systems</title><link>https://iankduncan.com/engineering/2026-02-09-what-functional-programmers-get-wrong-about-systems/</link><guid isPermaLink="true">https://iankduncan.com/engineering/2026-02-09-what-functional-programmers-get-wrong-about-systems/</guid><description>Type systems verify properties of programs. Production correctness is a property of systems. The gap between these is where the interesting failures live.</description><pubDate>Mon, 09 Feb 2026 00:00:00 GMT</pubDate><author>Ian Duncan</author></item><item><title>In Praise of Control Planes, or: Why You Need a Place to Stand</title><link>https://iankduncan.com/engineering/2026-02-07-in-praise-of-control-planes/</link><guid isPermaLink="true">https://iankduncan.com/engineering/2026-02-07-in-praise-of-control-planes/</guid><description>The control plane pattern (a coordinator that tells workers what to do) shows up everywhere good infrastructure exists. The concept is simple. Naming it is useful.</description><pubDate>Sat, 07 Feb 2026 00:00:00 GMT</pubDate><author>Ian Duncan</author></item><item><title>Your Best Thinking Is Wasted on the Wrong Decisions</title><link>https://iankduncan.com/engineering/2026-02-07-your-best-thinking-is-wasted-on-the-wrong-decisions/</link><guid isPermaLink="true">https://iankduncan.com/engineering/2026-02-07-your-best-thinking-is-wasted-on-the-wrong-decisions/</guid><description>Some engineering decisions punish you for being wrong. Most don&apos;t. Learning to tell the difference and calibrate your deliberation accordingly might be the most valuable skill your team never explicitly develops.</description><pubDate>Sat, 07 Feb 2026 00:00:00 GMT</pubDate><author>Ian Duncan</author></item><item><title>No, Really, Bash Is Not Enough: Why Large-Scale CI Needs an Orchestrator</title><link>https://iankduncan.com/engineering/2026-02-06-bash-is-not-enough/</link><guid isPermaLink="true">https://iankduncan.com/engineering/2026-02-06-bash-is-not-enough/</guid><description>A deeper dive into why shell scripts cannot replace a proper CI control plane, drawn from years of building and operating CI systems at scale.</description><pubDate>Fri, 06 Feb 2026 00:00:00 GMT</pubDate><author>Ian Duncan</author></item><item><title>GitHub Actions Is Slowly Killing Your Engineering Team</title><link>https://iankduncan.com/engineering/2026-02-05-github-actions-killing-your-team/</link><guid isPermaLink="true">https://iankduncan.com/engineering/2026-02-05-github-actions-killing-your-team/</guid><description>Why GitHub Actions is the Internet Explorer of CI, and why Buildkite offers a better path forward for teams that care about developer experience.</description><pubDate>Thu, 05 Feb 2026 00:00:00 GMT</pubDate><author>Ian Duncan</author></item><item><title>Punycode: My New Favorite Algorithm</title><link>https://iankduncan.com/engineering/2025-12-01-punycode/</link><guid isPermaLink="true">https://iankduncan.com/engineering/2025-12-01-punycode/</guid><description>A deep dive into how Punycode works, and why I think it&apos;s so neat.</description><pubDate>Mon, 01 Dec 2025 00:00:00 GMT</pubDate><author>Ian Duncan</author></item><item><title>The CRDT Dictionary: A Field Guide to Conflict-Free Replicated Data Types</title><link>https://iankduncan.com/engineering/2025-11-27-crdt-dictionary/</link><guid isPermaLink="true">https://iankduncan.com/engineering/2025-11-27-crdt-dictionary/</guid><description>A comprehensive guide to CRDTs and their tradeoffs, from counters to sequences. Written in the spirit of the Typeclassopedia, exploring how different CRDTs solve the distributed consensus puzzle.</description><pubDate>Thu, 27 Nov 2025 00:00:00 GMT</pubDate><author>Ian Duncan</author></item><item><title>JSON Schema Demystified: Understanding Schemas, Dialects, Vocabularies, and Metaschemas</title><link>https://iankduncan.com/engineering/2025-11-24-json-schema-demystified/</link><guid isPermaLink="true">https://iankduncan.com/engineering/2025-11-24-json-schema-demystified/</guid><description>An accessible guide to understanding the confusing terminology around JSON Schema. What are schemas, dialects, vocabularies, and metaschemas, and how do they all fit together?</description><pubDate>Mon, 24 Nov 2025 00:00:00 GMT</pubDate><author>Ian Duncan</author></item><item><title>Event Design for Streaming Systems: A Primer</title><link>https://iankduncan.com/engineering/2025-11-14-event-design-for-streaming-systems/</link><guid isPermaLink="true">https://iankduncan.com/engineering/2025-11-14-event-design-for-streaming-systems/</guid><description>How to use event streams in an effective, scalable, future-proof way.</description><pubDate>Fri, 14 Nov 2025 00:00:00 GMT</pubDate><author>Ian Duncan</author></item><item><title>Accidental or Essential? Understanding Complexity in Software Design</title><link>https://iankduncan.com/engineering/2025-05-26-when-is-complexity-accidental/</link><guid isPermaLink="true">https://iankduncan.com/engineering/2025-05-26-when-is-complexity-accidental/</guid><description>Understanding the difference between essential and accidental complexity in software design.</description><pubDate>Mon, 26 May 2025 00:00:00 GMT</pubDate><author>Ian Duncan</author></item><item><title>What You Need to Know About Trump\</title><link>https://iankduncan.com/personal/2025-04-24-civil-rights-executive-order/</link><guid isPermaLink="true">https://iankduncan.com/personal/2025-04-24-civil-rights-executive-order/</guid><description>A look at the Trump administration\</description><pubDate>Thu, 24 Apr 2025 00:00:00 GMT</pubDate><author>Ian Duncan</author></item><item><title>Actuarial Murder and Other Diffuse Acts of Violence</title><link>https://iankduncan.com/personal/2025-02-21-actuarial-murder/</link><guid isPermaLink="true">https://iankduncan.com/personal/2025-02-21-actuarial-murder/</guid><description>An exploration of how institutional decisions and systemic policies can cause widespread harm with less accountability than direct violence, examining cases from healthcare to education where bureaucratic choices have life-altering consequences despite being treated as mere business decisions.</description><pubDate>Fri, 21 Feb 2025 00:00:00 GMT</pubDate><author>Ian Duncan</author></item><item><title>The Cadence of Salting</title><link>https://iankduncan.com/cooking/2025-01-13-salting-cadence/</link><guid isPermaLink="true">https://iankduncan.com/cooking/2025-01-13-salting-cadence/</guid><description>When you salt matters as much as how much you salt. Understanding the timing changes everything.</description><pubDate>Mon, 13 Jan 2025 00:00:00 GMT</pubDate><author>Ian Duncan</author></item><item><title>Welcome to Published Notes</title><link>https://iankduncan.com/notes/2025-01-13-example-note/</link><guid isPermaLink="true">https://iankduncan.com/notes/2025-01-13-example-note/</guid><description>An example note showing how Logseq notes can be published to your website</description><pubDate>Mon, 13 Jan 2025 00:00:00 GMT</pubDate><category>meta</category><category>logseq</category><category>publishing</category><author>Ian Duncan</author></item><item><title>Embracing Flexibility in Haskell Libraries: The Power of Records of Functions</title><link>https://iankduncan.com/engineering/2024-01-26-records-of-effects/</link><guid isPermaLink="true">https://iankduncan.com/engineering/2024-01-26-records-of-effects/</guid><description>Improve the robustness and flexibility of your Haskell apps by changing how you design your libraries.</description><pubDate>Fri, 26 Jan 2024 00:00:00 GMT</pubDate><author>Ian Duncan</author></item><item><title>Hi, Barbie! Higher kinded records made easy(er)</title><link>https://iankduncan.com/engineering/2024-01-11-hi-barbie-higher-kinded-records-made-easy/</link><guid isPermaLink="true">https://iankduncan.com/engineering/2024-01-11-hi-barbie-higher-kinded-records-made-easy/</guid><description>We often need to make and manipulate derived types that are similar to each other, but not quite the same. Higher-kinded records provide a way to do this in a generic way, but are clunky. We\</description><pubDate>Thu, 11 Jan 2024 00:00:00 GMT</pubDate><author>Ian Duncan</author></item><item><title>Haskell Best Practices– Wildcards aren\</title><link>https://iankduncan.com/engineering/haskell-best-practices-really-exhaustive-pattern-matching/</link><guid isPermaLink="true">https://iankduncan.com/engineering/haskell-best-practices-really-exhaustive-pattern-matching/</guid><description>An argument for using really exhaustive pattern matching.</description><pubDate>Thu, 31 Aug 2023 00:00:00 GMT</pubDate><author>Ian Duncan</author></item><item><title>There and Back Again: Turning Haskell functions into RPC calls- Part 2</title><link>https://iankduncan.com/engineering/2023-08-30-functions-into-rpc-definitions-pt2/</link><guid isPermaLink="true">https://iankduncan.com/engineering/2023-08-30-functions-into-rpc-definitions-pt2/</guid><description>In the last post, we figured out an interface for the RPC caller to invoke remote Haskell functions. In this post, we\</description><pubDate>Wed, 30 Aug 2023 00:00:00 GMT</pubDate><author>Ian Duncan</author></item><item><title>There and Back Again: Turning Haskell functions into RPC calls- Part 1</title><link>https://iankduncan.com/engineering/2023-08-30-functions-into-rpc-definitions/</link><guid isPermaLink="true">https://iankduncan.com/engineering/2023-08-30-functions-into-rpc-definitions/</guid><description>In </description><pubDate>Wed, 30 Aug 2023 00:00:00 GMT</pubDate><author>Ian Duncan</author></item><item><title>Integrating a large Tokio-based Rust library with Haskell</title><link>https://iankduncan.com/engineering/2023-08-30-integrating-haskell-and-tokio/</link><guid isPermaLink="true">https://iankduncan.com/engineering/2023-08-30-integrating-haskell-and-tokio/</guid><description>A lot of the Rust &lt;-&gt; Haskell interop examples out there are for small, synchronous libraries. They also tend to omit how to actually package the Rust library. We\</description><pubDate>Wed, 30 Aug 2023 00:00:00 GMT</pubDate><author>Ian Duncan</author></item><item><title>One Serialization Class to Rule Them All</title><link>https://iankduncan.com/engineering/2023-08-29-one-serialization-class-to-rule-them-all/</link><guid isPermaLink="true">https://iankduncan.com/engineering/2023-08-29-one-serialization-class-to-rule-them-all/</guid><description>Typical serialization libraries in the Haskell ecosystem target a single format. We explore how to provide composite serialization for data types that chooses the best format for each data type.</description><pubDate>Tue, 29 Aug 2023 00:00:00 GMT</pubDate><author>Ian Duncan</author></item><item><title>OpenTelemetry Gotchas– Phantom Spans</title><link>https://iankduncan.com/engineering/2023-08-28-opentelemetry-gotchas-phantom-spans/</link><guid isPermaLink="true">https://iankduncan.com/engineering/2023-08-28-opentelemetry-gotchas-phantom-spans/</guid><description>We struggled for several months with a mysterious tracing issue in our production environment. Unrelated web requests were being linked together in the same trace, but we could never see the root trace span. This is the story of how we found and fixed root cause.</description><pubDate>Mon, 28 Aug 2023 00:00:00 GMT</pubDate><author>Ian Duncan</author></item><item><title>The Cruel Part Is</title><link>https://iankduncan.com/personal/the-cruel-part-is/</link><guid isPermaLink="true">https://iankduncan.com/personal/the-cruel-part-is/</guid><description>A poem</description><pubDate>Sun, 01 Jan 2023 00:00:00 GMT</pubDate><author>Ian Duncan</author></item><item><title>Vignettes</title><link>https://iankduncan.com/personal/vignettes/</link><guid isPermaLink="true">https://iankduncan.com/personal/vignettes/</guid><description>A collection of memories</description><pubDate>Sun, 01 Jan 2023 00:00:00 GMT</pubDate><author>Ian Duncan</author></item><item><title>Garbage in, Never out</title><link>https://iankduncan.com/personal/2021-10-04-garbage-in-never-out/</link><guid isPermaLink="true">https://iankduncan.com/personal/2021-10-04-garbage-in-never-out/</guid><description>Adventures in streaming algorithms.</description><pubDate>Mon, 04 Oct 2021 00:00:00 GMT</pubDate><author>Ian Duncan</author></item><item><title>Using React with GHCJS</title><link>https://iankduncan.com/engineering/2014-12-16-react-js-with-ghcjs/</link><guid isPermaLink="true">https://iankduncan.com/engineering/2014-12-16-react-js-with-ghcjs/</guid><description>Early explorations in data-driven Haskell applications in the browser.</description><pubDate>Tue, 16 Dec 2014 00:00:00 GMT</pubDate><author>Ian Duncan</author></item><item><title>Introducing Growler, a simple HTTP server toolkit</title><link>https://iankduncan.com/engineering/2014-11-13-introducing-growler/</link><guid isPermaLink="true">https://iankduncan.com/engineering/2014-11-13-introducing-growler/</guid><description>Sinatra-esque Haskell web apps.</description><pubDate>Thu, 13 Nov 2014 00:00:00 GMT</pubDate><author>Ian Duncan</author></item></channel></rss>