All blogs / Distributed systems / cloud
Christopher Meiklejohn
Distributed systems researcher and technical lead. Staff Engineer at DoorDash, adjunct faculty at CMU. From award-winning research to Azure, AWS, and production Erlang systems.
- Posts
- 134 from 3 Jun 2013 to 2 Oct 2026
- Posting
- weekly (45 in the last year)
- Kind
- personal blog
- Feed
- https://christophermeiklejohn.com/feed.xml
2026 45
- The Things I Wanted to Make
- Becoming, Pending Review
- Fiction:
- The Shortcut Became the System · A pipe disappeared. The rectangle around the door remained.
- My Front of House of Cards · The show ended at 10:12. The fix merged at 10:17.
- Software for One
- The Quickest Path to a Diff · The app died at Red Rocks while its health checks stayed green. Every line of code was fine. The sum was nobody's job.
- Every Card Will Show · The earlier implementation, tests, audits, and accepted proofs said the algorithm was correct. None of them stated the whole problem.
- The Safeguards Have to Run · Two abandoned notebooks showed me the difference between a research rule and a working control.
- The Machine in the Lab:
- The Whole Night
- Science at LLM Speed · Research-like output is cheap. A valid claim still needs evidence that can show it is wrong.
- One Writer · Our tools assume one writer, and assume that writer is a human. Nothing computes what a change reads and writes at runtime, so the only known fix is brute force priced for organizations.
- The Hard Call Is the Whole Job · A cancelled flight, three confident machines, and the woman on the Hilton Diamond line who refused to stop.
- The App That Lives Between Shows
- The Test Suite Was the Incident · A night of brittle fixtures, 49 failed CI runs, and an expensive lesson about what happens when AI agents write the test suite and nobody owns the test data.
- Rift · For thirty years I programmed with Phish on, every day. In 2026, the music is out of phase with the work.
- Babysitting the Agent · Two weeks in, even with all the hooks I've built, working with the agent has become a chore. Every shipped feature ends with me clicking through it to find out what didn't actually work.
- Getting Up to Speed on Multi-Agent Systems, Part 8: Open Questions
- Getting Up to Speed on Multi-Agent Systems, Part 7: Benchmarks and What They Miss
- Getting Up to Speed on Multi-Agent Systems, Part 6: Verification Patterns
- Getting Up to Speed on Multi-Agent Systems, Part 5: Debate, State, and Coordination
- Getting Up to Speed on Multi-Agent Systems, Part 4: Wave 2 (Why It Breaks)
- Spring Tour Recap: A Month of Shipping on Zabriskie
- Getting Up to Speed on Multi-Agent Systems, Part 3: Wave 1 (Can Agents Coordinate At All?)
- Getting Up to Speed on Multi-Agent Systems, Part 2: The Vocabulary
- Getting Up to Speed on Multi-Agent Systems, Part 1: The Landscape
- Getting Up to Speed on Multi-Agent Systems
- The Tribe Has to Outlive the Model · Five model swaps in three weeks taught me the project's continuity lives in the humans and conventions around the agents, not the agents themselves.
- The Tax on the Happy Path · What I learned by removing the elaborate CI gate I'd built to slow my AI agents down — after realizing it had never actually caught anything.
- Opt-In Isn't a Guardrail · A CI gate I built to slow AI agents down passed every paperwork check, missed every real bug, and blocked the rollback during a production outage.
- The Structural Engineer's Other Job · AI-generated code increasingly passes review and tests but ships half-working features. What humans have to check for instead.
- Caucus V1: Cursor Background Agents and a Multi-Agent Workflow That Actually Loops
- The Feature That Has Never Worked · A broken auto-live poller, and what perceived urgency does to Claude Code
- Software Engineering Is Becoming Civil Engineering
- Multi-Agent Systems Have a Distributed Systems Problem
- The Show Is Happening Right Now and Nothing Works
- Memory Isn't Learning
- Finding Safe Food on the Road
- Teaching Claude to QA a Mobile App
- What Building With Claude Actually Looks Like
- Why I'm Building Zabriskie
- Claude Tested Everything Except the One Thing That Mattered
- Ten Years of Lasp
- I Built a Social App in a Week with Claude Code
2023 19
- Filibuster 2.0: Byzantine Fault Injection with Hardcoded Fault Values
- Filibuster 2.0: Coaching UI
- Filibuster 2.0: Byzantine Fault Injection with Arbitrary Faults
- Filibuster 2.0: Computing API coverage of a Microservice Application
- Filibuster 2.0: Microservice Linter, Multiple Invocations to the Same RPC Method
- Filibuster 2.0: Microservice Linter, Requests become part of a Response
- Filibuster 2.0: Microservice Linter, Redundant RPCs
- Filibuster 2.0: Improved UI
- Filibuster 2.0: Healthcheck your Functional Test Suite with API Coverage
- Filibuster 2.0: Redis Fault Injection
- Filibuster 2.0: Introducing the new version of Filibuster
- Filibuster 2.0: Developer Tooling as a Childhood Dream
- Reflecting on 10 years of Blogging, Research, and a (very) long Ph.D.
- Testing Applications Resilience in the Presence of Service Tiers
- Nested RPCs with Filibuster's UX
- Testing Applications for Resilience Bugs vs Testing Applications for Resilience
- Revisiting: Chaos Engineering or Software Testing?
- Building Tech-Transferrable Research Software
- Chaos Engineering or Software Testing?
2022 5
2021 6
- Dynamic Reduction: Optimizing Service-level Fault Injection Testing With Service Encapsulation
- Finding Resilience Issues with Filibuster: A Tutorial
- What is Service-level Fault Injection Testing?
- Researching Microservice Resilience: Lack of Corpora
- Food: A Bittersweet Affair
- Erlang's Process Identifiers and My Weekend Bug Hunting
2020 2
2019 7
- Mixed-Cluster Versioning: A Story of Capabilities, Erlang and Riak
- Implementing Coordination Free Convergence of Data for Edge Computing
- Motivating CRDTs for the Edge
- Stateful Serverless: Critical Sections with Azure Durable Functions
- Introduction to Stateful Serverless: key-value database with Azure Durable Entities
- Using Fault-Injection to Evolve a Reliable Broadcast Protocol
- Applied Monotonicity: A Brief History of CRDTs in Riak
2018 6
- High performance, exactly-once, failure oblivious distributed programming with AMBROSIA
- Guesstimate: A Programming Model for Collaborative Distributed Systems
- A CAPable Distributed Programming Model
- Inconsistent, Performance-bound, Approximate (IPA)
- Anatomy of a Glutening
- Celiac Disease: Debugging Your Own Research Life With Blameful Postmortems
2016 8
2015 11
- Thesis Proposal, Draft
- A Certain Tendency Of The Database Community
- Programming Models, Part 6: Leaderboard
- Meiklejohn's Razor
- Moving On, Part 2: Ph.D.
- Moving On
- Orleans, Distributed Virtual Actors for Programming and Scalability Comparison
- Seminars on Lasp in March, 2015
- Highly Distributed Computations Without Synchronization
- Programming Models, Part 5: Ad Counter, Part 2
- 2014: A Year in Review
2014 6
2013 19
- Verified Vector Clocks: An Experience Report, Part 3
- Verified Vector Clocks: An Experience Report, Part 2
- Announcing Proceedings: Distributed Reading Groups
- Verified Vector Clocks: An Experience Report, Part 1
- Bloom at Wicked Good Ruby 2013
- Erlang/OTP R16B02 on SmartOS
- From Ruby To Erlang: An Experience Report
- Readings in distributed systems
- LambdaJam 2013: Webmachine Tutorial
- Guest on the Food Fight show podcast
- Riak PG: Pruning terminated processes
- Modified Flume HDFS sink for one to one files
- Introducing Riak PG: Distributed process groups for Erlang
- Distributed data structures with Coq: PN-Counters
- Flume-ng configuration with an HDFS sink
- Functional reactive programming in JavaScript
- Distributed data structures with Coq
- Erlang gproc Failure Semantics
- Erlang pg2 Failure Semantics