About:

Ian Duncan is a Stability Engineer and full-stack developer specializing in functional programming and building reliable, maintainable software.

Website:

Specializations:

Interests:

Functional programming Software reliability Software maintainability Correct by construction code Resilient software
Subscribe to RSS:
Optimizing database queries in Haskell involves addressing encoding overhead, round-trip latency, and N+1 query patterns through libraries like persistent-postgresql-ng and sofetch.
The blog post provides an in-depth exploration of Conflict-free Replicated Data Types (CRDTs), detailing their principles, types, and applications in distributed systems. It discusses the challenges of achieving eventual consisten...
This post details Redis pipelining techniques, contrasting synchronous and asynchronous methods, and presents Hedis, a Haskell library that optimally integrates both approaches.
HTTP/3 may not be faster than HTTP/2 on stable networks, as its userspace QUIC implementation introduces significant overhead compared to optimized kernel TCP.
The article discusses the author's implementation of a pure Haskell version of Punycode for the idn package, highlighting the algorithm's cleverness in encoding Unicode within the constraints of DNS's ASCII-only infrastructure. It...
The blog post discusses the principles and practices of event streaming architectures, contrasting them with traditional request-response systems. It emphasizes the importance of schema registries and structured event design to ma...
The blog post discusses the advantages of using records of functions in Haskell library design over traditional methods like top-level functions or type classes. It highlights how this approach enhances mocking, fault injection, a...
This article explores the automation of defining and registering Haskell functions for an RPC system using higher-kinded records and the barbies library. It discusses the challenges of boilerplate code when defining multiple simil...
The post discusses the development of a client library for Temporal, focusing on how to serialize and deserialize Haskell functions for remote procedure calls (RPC). It explains the need for a stable reference to functions, introd...
The blog post discusses the challenges and solutions for integrating a Tokio-based Rust library with Haskell, particularly focusing on the interoperability between the two languages. It highlights the limitations of Haskell's curr...
Functional programmers often confuse program correctness with system correctness, overlooking the complexities of managing multiple deployments and version compatibility in distributed systems.
A control plane is essential for managing complexity in systems by separating decision-making from execution, providing oversight, and enforcing policies.
Bash is insufficient for large-scale CI needs, necessitating the use of dedicated orchestrators to manage complexity and ensure reliability in engineering teams.
This blog post demystifies JSON Schema by breaking down its complex terminology, including schemas, metaschemas, dialects, and vocabularies. It explains how schemas describe the structure and constraints of JSON data, while metasc...
The post explores the importance of making technical decisions visible to teams and proposes a framework for categorizing decisions based on their impact and required deliberation.
The article discusses the distinction between essential and accidental complexity in software design, emphasizing that not all complexity is unnecessary. Essential complexity arises from real-world requirements, while accidental c...
President Trump's recent executive order aims to eliminate 'disparate impact' analysis, a key civil rights enforcement tool that has identified hidden discrimination for over 50 years. The order frames this analysis as a harmful m...
GitHub Actions, despite its popularity, is criticized for its inefficiencies and poor user experience, with Buildkite recommended as a better CI alternative.
The text explores the concept of systemic violence, emphasizing how policy decisions and institutional practices can cause harm without direct accountability. The author reflects on their personal journey from political disengagem...
This post continues the exploration of creating a Remote Procedure Call (RPC) system in Haskell, focusing on server-side handling. It discusses the design of the server mechanism, encapsulating differing type information, and impl...
The article discusses the importance of timing when salting food, explaining how salt affects the texture and flavor of various ingredients through osmosis. It details different salting techniques for vegetables and meats, emphasi...
The blog post discusses the pitfalls of using wildcards in pattern matching within Haskell codebases, highlighting the potential issues that arise when the underlying data types change. It emphasizes the importance of using exhaus...
This post explains how to publish notes from Logseq to a website, highlighting key features such as rich markdown formatting, tags for organization, update tracking, and mobile responsiveness. It outlines the simple publishing wor...