<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>James Carr</title><link>https://james-carr.org/</link><description>Recent content on James Carr</description><generator>Hugo -- gohugo.io</generator><lastBuildDate>Wed, 29 Jul 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://james-carr.org/index.xml" rel="self" type="application/rss+xml"/><item><title>The Route Table Is the Contract: Claim Checks Behind a Gateway</title><link>https://james-carr.org/posts/2026-07-29-stop-treating-your-object-store-like-a-shared-database/</link><pubDate>Wed, 29 Jul 2026 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/2026-07-29-stop-treating-your-object-store-like-a-shared-database/</guid><description>Recently I helped a team where several services all needed to read documents that another service wrote to an S3 bucket. We wanted to keep the object store, the bucket layout, and the IAM permissions independent from the consumers, so the owning team could change any of them without asking anyone else&amp;rsquo;s permission. The first pass was the obvious one: a shared library that wrapped the details of fetching a document, encapsulating the bucket layout and replicating the IAM read permissions out to every consuming service.</description></item><item><title>Oban for Python: PostgreSQL-Backed Job Processing Without the Baggage</title><link>https://james-carr.org/posts/2026-04-06-oban-python-job-processing/</link><pubDate>Mon, 06 Apr 2026 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/2026-04-06-oban-python-job-processing/</guid><description>I have been a fan of Oban in the Elixir ecosystem for a while now. It is one of those libraries that does exactly what it says and gets out of your way. So when the team announced an official Python port earlier this year, I wanted to take it for a spin and see how the experience translates.
The pitch is simple: PostgreSQL-backed job processing with no message broker. No Redis, no RabbitMQ, no separate infrastructure to manage.</description></item><item><title>Seven Hosting Patterns for AI Agents</title><link>https://james-carr.org/posts/2026-03-01-agent-hosting-patterns/</link><pubDate>Sun, 01 Mar 2026 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/2026-03-01-agent-hosting-patterns/</guid><description>I&amp;rsquo;ve been thinking a lot about how to actually run AI agents in production lately. Not the model selection part or the prompt engineering&amp;hellip; the simple infrastructure question of how does this thing get hosted and triggered? Recently I have been neck deep into exploring this, as well as some of the emerging frameworks for hosting and deploying agents.
When you strip away the hype, an agent is just a program that calls an LLM and takes actions.</description></item><item><title>Your Next Power User Is an Agent: Identifying Non-Human API Consumers</title><link>https://james-carr.org/posts/2026-03-01-identifying-agents-using-your-api/</link><pubDate>Sun, 01 Mar 2026 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/2026-03-01-identifying-agents-using-your-api/</guid><description>Something has been bugging me about how we think about API traffic. We spend a lot of time building dashboards around DAU, WAU, MAU, all built on the assumption that a human is on the other end of each session. But increasingly, the thing calling your API is an agent. Not a person clicking buttons, but a program running an LLM that decided it needed data from your service.
This isn&amp;rsquo;t hypothetical.</description></item><item><title>Temporal Patterns: Durable AI Agents with Multi-Model Scatter/Gather</title><link>https://james-carr.org/posts/2026-02-05-temporal-durable-ai-agents/</link><pubDate>Thu, 05 Feb 2026 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/2026-02-05-temporal-durable-ai-agents/</guid><description>When AI agents fail mid-execution, they often lose their entire context and any work completed up to that point. API rate limits, network timeouts, and infrastructure failures can turn a sophisticated multi-step agent into an expensive waste of tokens. What if your agent could survive these failures and resume exactly where it left off?
This post walks through how I built a multi-model AI intelligence system using Temporal&amp;rsquo;s AI SDK integration for TypeScript.</description></item><item><title>Temporal Patterns: Process Manager with Signals</title><link>https://james-carr.org/posts/2026-02-03-temporal-process-manager/</link><pubDate>Tue, 03 Feb 2026 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/2026-02-03-temporal-process-manager/</guid><description>In my previous posts, we covered the Saga pattern for distributed transactions and Scatter-Gather for parallel queries. Now let&amp;rsquo;s tackle the Process Manager pattern, a state machine that can respond to external events in real-time.
The Pattern A Process Manager maintains state across a long-running process and can react to external signals. Unlike a simple workflow that runs start-to-finish, a process manager can:
Wait for external confirmation before proceeding React to signals that change the workflow&amp;rsquo;s behavior Expose its current state via queries Perfect for coordinating a shadowrun against Arasaka Tower.</description></item><item><title>Temporal Patterns: Scatter-Gather for Parallel Queries</title><link>https://james-carr.org/posts/2026-02-03-temporal-scatter-gather/</link><pubDate>Tue, 03 Feb 2026 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/2026-02-03-temporal-scatter-gather/</guid><description>In my previous post on Temporal, we explored the Saga pattern for distributed transactions with compensating actions. Now let&amp;rsquo;s look at another classic from Enterprise Integration Patterns: Scatter-Gather.
The Pattern When you need to query multiple sources and aggregate results, the Scatter-Gather pattern is your friend. Send requests to multiple services in parallel (scatter), wait for responses, then combine them (gather).
In Night City, we query data brokers to find the best deal for moving sensitive information.</description></item><item><title>Temporal: Durable Execution That Survives the Apocalypse</title><link>https://james-carr.org/posts/2026-01-29-temporal-workflow-orchestration/</link><pubDate>Thu, 29 Jan 2026 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/2026-01-29-temporal-workflow-orchestration/</guid><description>After spending time with enterprise integration patterns, one thing keeps coming up: distributed transactions are hard. When your process spans multiple services, each with its own database, you can&amp;rsquo;t just wrap everything in a BEGIN/COMMIT. What happens when step 3 of 5 fails? The first two services already committed their changes. You&amp;rsquo;re stuck in an inconsistent state.
The Saga pattern addresses this with compensating transactions: every step has an &amp;ldquo;undo&amp;rdquo; action.</description></item><item><title>Event-Driven Systems with NATS and Jetstream</title><link>https://james-carr.org/posts/2026-01-21-nats-jetstream-building-reliable-messaging/</link><pubDate>Tue, 20 Jan 2026 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/2026-01-21-nats-jetstream-building-reliable-messaging/</guid><description>I first encountered NATS a couple years back while experimenting with OpenFaaS. If you&amp;rsquo;re not familiar, OpenFaaS is a serverless functions framework that uses NATS as its default message queue for async function invocations. At the time, I noted NATS as &amp;ldquo;that fast pub/sub thing&amp;rdquo; and moved on. It seemed like a lightweight messaging broker, but not something I needed to dig into.
What brought NATS back onto my radar was the Jepsen analysis published late last year.</description></item><item><title>From AsyncAPI to Service Catalog: Tracing Event Flows with Backstage</title><link>https://james-carr.org/posts/2026-01-20-asyncapi-backstage-service-catalog/</link><pubDate>Tue, 20 Jan 2026 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/2026-01-20-asyncapi-backstage-service-catalog/</guid><description>&lt;p>In my &lt;a href="https://james-carr.org/posts/2026-01-16-asyncapi-event-driven-documentation/">previous post&lt;/a>, I explored AsyncAPI as a way to document event-driven services. But documentation sitting in YAML files only gets you so far. The real power comes when you can answer questions like:&lt;/p>
&lt;ul>
&lt;li>&lt;em>&amp;ldquo;Which services consume the &lt;code>OrderCreated&lt;/code> event?&amp;rdquo;&lt;/em>&lt;/li>
&lt;li>&lt;em>&amp;ldquo;What happens if I change this Avro schema?&amp;rdquo;&lt;/em>&lt;/li>
&lt;li>&lt;em>&amp;ldquo;Who owns the service that publishes to this Kafka topic?&amp;rdquo;&lt;/em>&lt;/li>
&lt;/ul>
&lt;p>This is where &lt;a href="https://backstage.io">Backstage&lt;/a> enters the picture—Spotify&amp;rsquo;s open-source developer portal that lets you catalog &lt;em>everything&lt;/em>: services, APIs, resources, teams, and the relationships between them.&lt;/p>
&lt;p>In this post, I&amp;rsquo;ll show how to combine AsyncAPI specs with Backstage to create a living service catalog for event-driven architectures.&lt;/p></description></item><item><title>AsyncAPI: Bringing OpenAPI to Event-Driven Systems</title><link>https://james-carr.org/posts/2026-01-16-asyncapi-event-driven-documentation/</link><pubDate>Fri, 16 Jan 2026 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/2026-01-16-asyncapi-event-driven-documentation/</guid><description>Something that has been on my mind lately is the lack of visibility around messaging architectures. For example, if you&amp;rsquo;ve built REST APIs, you likely have OpenAPI specs that define your endpoints, schemas, and operations in YAML, and you get documentation, client generation, and contract testing for free. It&amp;rsquo;s become table stakes for HTTP APIs.
But what about event-driven systems? When services communicate through Kafka topics and SQS queues, how do you answer:</description></item><item><title>The Transactional Outbox Pattern: Reliable Event Publishing</title><link>https://james-carr.org/posts/2026-01-15-transactional-outbox-pattern/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/2026-01-15-transactional-outbox-pattern/</guid><description>You&amp;rsquo;ve built a microservice that saves orders to a database and publishes events to Kafka. Everything works great—until Kafka goes down for five minutes. Now you have orders in your database but no events published. Your downstream services never learn about these orders. You have inconsistent state.
This is the dual-write problem, and the Transactional Outbox pattern solves it elegantly. Chris Richardson documented this pattern in his Microservices.io pattern catalog, and it&amp;rsquo;s become a foundational technique for reliable event-driven systems.</description></item><item><title>🎄 Advent of EIP Day 11: Wire Tap &amp; Control Bus</title><link>https://james-carr.org/posts/2026-01-13-advent-of-eip-day-11-wire-tap-control-bus/</link><pubDate>Tue, 13 Jan 2026 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/2026-01-13-advent-of-eip-day-11-wire-tap-control-bus/</guid><description>In Day 10, we built a Process Manager with a live visualization that subscribed to events and updated the UI in real time. That visualization was a Wire Tap: passively observing messages without affecting the primary flow.
Today we explore Wire Tap in depth and pair it with Control Bus for active management of distributed services. We&amp;rsquo;ll see how both patterns work in Kafka using Elixir.
Wire Tap: Passive Observation The Wire Tap pattern inserts a listener into a message channel that receives a copy of each message without affecting the primary flow.</description></item><item><title>🎄 Advent of EIP Day 12: Frameworks</title><link>https://james-carr.org/posts/2026-01-13-advent-of-eip-day-12-frameworks/</link><pubDate>Tue, 13 Jan 2026 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/2026-01-13-advent-of-eip-day-12-frameworks/</guid><description>Over the past eleven posts, we&amp;rsquo;ve explored Enterprise Integration Patterns from the ground up: building message channels, routing messages with Content-Based Routers and Recipient Lists, transforming data, managing workflows with Process Managers, and observing systems with Wire Taps. We wrote a lot of code. While I lost track of my original intent to build an open source audit logging system as part of this series, I feel pretty happy about what did get built.</description></item><item><title>🎄 Advent of EIP Day 11: Saga</title><link>https://james-carr.org/posts/2026-01-07-advent-of-eip-day-11-saga/</link><pubDate>Sun, 04 Jan 2026 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/2026-01-07-advent-of-eip-day-11-saga/</guid><description>In Day 10, we explored the Process Manager pattern for tracking workflow state over time. But what happens when things go wrong? How do you undo distributed work that&amp;rsquo;s already been committed?
Today we dive into the Saga pattern: distributed transactions with compensation.
Saga: When &amp;ldquo;Undo&amp;rdquo; Actually Works This pattern kept coming up in my research, and I&amp;rsquo;ll admit: I initially thought &amp;ldquo;Saga&amp;rdquo; was just a fancy name for &amp;ldquo;try/catch with cleanup.</description></item><item><title>🎄Advent of EIP Day 10: Process Manager</title><link>https://james-carr.org/posts/2026-01-05-advent-of-eip-day-10-process-manager/</link><pubDate>Sun, 04 Jan 2026 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/2026-01-05-advent-of-eip-day-10-process-manager/</guid><description>Apologies for the long delay between posts, the new year kicked off extremely busy! Previously in Day 9, we explored the Routing Slip pattern, where messages carry their own itinerary. Each node was designed to route the message to the next destination based on the content of the routing slip and we had a small discussion about whether or not this was a form of choreography or orchestration since the route was computed up front.</description></item><item><title>🎄 Advent of EIP Day 9: Routing Slip</title><link>https://james-carr.org/posts/2026-01-02-advent-of-eip-day-9-routing-slip/</link><pubDate>Thu, 01 Jan 2026 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/2026-01-02-advent-of-eip-day-9-routing-slip/</guid><description>After building a webhook delivery platform in Day 8, I found myself asking questions that led me down a rabbit hole. After looking at Recipient List, I realized I overlooked &amp;ldquo;Routing Slip&amp;rdquo; and, really, what the heck is a &amp;ldquo;routing slip&amp;rdquo; anyway? While I had planned to cover Process Manager and Saga, digging into Routing Slip gave me a really interesting insight into how one can structure their messaging topology differently and in a way that naturally introduces a kind of Process Manager on its own, so lets save the in-depth exploration of it and Saga for another day and dig in to Routing Slip!</description></item><item><title>🎄 Advent of EIP Day 8: Building a Production Webhook Delivery Platform</title><link>https://james-carr.org/posts/2025-12-31-advent-of-eip-day-8-webhook-delivery-platform/</link><pubDate>Wed, 31 Dec 2025 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/2025-12-31-advent-of-eip-day-8-webhook-delivery-platform/</guid><description>Happy New Years for my APAC friends! In my previous post we traced the evolution from synchronous request-reply to enterprise event delivery platforms. We built recipient lists, webhook registrations, and bundled integrations. But we glossed over a critical question: what happens when delivery fails?
In production, failure isn&amp;rsquo;t exceptional. It&amp;rsquo;s constant. Endpoints go down. Networks partition. Rate limits trigger. Servers restart. A webhook platform that doesn&amp;rsquo;t handle failure gracefully isn&amp;rsquo;t a platform at all.</description></item><item><title>🎄 Advent of EIP Day 7: Switchboards, Webhooks, and Everything In Between</title><link>https://james-carr.org/posts/2025-12-30-advent-of-eip-day-7-request-reply-correlation/</link><pubDate>Tue, 30 Dec 2025 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/2025-12-30-advent-of-eip-day-7-request-reply-correlation/</guid><description>Before computers, we had switchboards. An operator would receive your call, ask who you wanted to reach, physically connect your line to theirs with a patch cable, and you&amp;rsquo;d talk. When you hung up, the connection was torn down. Request-reply in its purest form: synchronous, blocking, one conversation at a time.
The telephone system evolved. Direct dialing replaced operators. Trunk lines multiplexed thousands of calls. Voicemail let you leave a message with a return address (your number) so someone could call you back later.</description></item><item><title>🎄 Advent of EIP Day 9: Bulkhead Pattern for Multi-Tenancy</title><link>https://james-carr.org/posts/2025-12-26-advent-of-eip-day-9-bulkhead-pattern/</link><pubDate>Fri, 26 Dec 2025 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/2025-12-26-advent-of-eip-day-9-bulkhead-pattern/</guid><description>In Day 7 we built a webhook delivery platform with retry logic, dead letter queues, and circuit breakers. But we glossed over a critical question: what happens when one customer&amp;rsquo;s misbehaving endpoint starts affecting everyone else?
Today we&amp;rsquo;re diving into the Bulkhead pattern: isolating workloads so failures in one area don&amp;rsquo;t cascade into others. We&amp;rsquo;ll apply it to webhook delivery, then extend it to audit log storage and full multi-tenant architecture.</description></item><item><title>🎄 Advent of EIP Day 6: Canonical Data Model &amp; Message Transformation</title><link>https://james-carr.org/posts/2025-12-23-advent-of-eip-day-6-canonical-data-model/</link><pubDate>Tue, 23 Dec 2025 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/2025-12-23-advent-of-eip-day-6-canonical-data-model/</guid><description>Message Translation, Content Enricher, Content Filter, Canonical Data Model - these patterns don&amp;rsquo;t get as much attention as the flashier routing patterns, but they&amp;rsquo;re where the real work happens. Every integration I&amp;rsquo;ve built has needed at least one of them.
When systems talk to each other, they rarely agree on data formats. Your e-commerce platform calls it a &amp;ldquo;customer,&amp;rdquo; your CRM calls it a &amp;ldquo;contact,&amp;rdquo; and your billing system calls it an &amp;ldquo;account holder.</description></item><item><title>🎄 Advent of EIP Day 5: Message Types &amp; Event Payload Strategies</title><link>https://james-carr.org/posts/2025-12-22-advent-of-eip-day-5-message-types-and-event-strategies/</link><pubDate>Mon, 22 Dec 2025 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/2025-12-22-advent-of-eip-day-5-message-types-and-event-strategies/</guid><description>Today we&amp;rsquo;re answering the question, &amp;ldquo;Should I name my event OrderPlaced or PlaceOrder?&amp;rdquo; We&amp;rsquo;re going to be getting more precise about something we&amp;rsquo;ve been pretty casual about: what exactly is a message?
We&amp;rsquo;ve been tossing events around without much ceremony. But not all messages are alike. Some carry data. Some request actions. Some announce facts. Understanding these distinctions (and how much data events should carry) shapes how your systems communicate.</description></item><item><title>🎄 Advent of EIP Day 4: Message Routing Patterns</title><link>https://james-carr.org/posts/2025-12-21-advent-of-eip-day-4-message-routing/</link><pubDate>Sun, 21 Dec 2025 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/2025-12-21-advent-of-eip-day-4-message-routing/</guid><description>Previously on Advent of Enterprise Integration Patterns: in Day 3, we explored message channels: Point-to-Point, Publish-Subscribe, Datatype, and Invalid Message channels. We built them first in pure code, then mapped them to RabbitMQ and Kafka as examples.
Today we&amp;rsquo;re stepping away from Chronicle to focus purely on patterns. Chronicle needs some housekeeping (the boring-but-essential work of making it a proper audit logging system), and frankly, that&amp;rsquo;s a good thing. Don&amp;rsquo;t set out to implement every pattern in a system.</description></item><item><title>🎄 Advent of EIP Day 3: Message Channels</title><link>https://james-carr.org/posts/2025-12-20-advent-of-eip-day-3-message-channels/</link><pubDate>Sat, 20 Dec 2025 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/2025-12-20-advent-of-eip-day-3-message-channels/</guid><description>Welcome back to the Advent of Enterprise Integration Patterns! In Day 2, we introduced Message Endpoints and the Messaging Gateway pattern to decouple our application from the transport layer, plus Pipes and Filters for composable event processing. We ended with a bit of a cliffhanger: running producers and consumers as separate processes worked great for distribution, but left us with fragmented data across isolated ETS stores.
Today we&amp;rsquo;re going to tackle that problem head-on—and then explore the different types of message channels available to us.</description></item><item><title>🎄 Advent of EIP Day 2: Message Endpoints &amp; Pipes and Filters</title><link>https://james-carr.org/posts/2025-12-17-advent-of-eip-day-2-message-abstractions/</link><pubDate>Wed, 17 Dec 2025 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/2025-12-17-advent-of-eip-day-2-message-abstractions/</guid><description>Welcome back to the Advent of Enterprise Integration Patterns! Yesterday we got our hands dirty with Point-to-Point Channels and Competing Consumers, building the bones of Chronicle using OTP actors. We can send audit events and have them processed reliably by multiple consumers racing to grab work. Pretty cool!
But here&amp;rsquo;s the thing: that implementation is tightly coupled to OTP. What happens when we want to deploy Chronicle across multiple machines? Or swap in RabbitMQ for a proper message broker?</description></item><item><title>🎄 Advent of EIP Day 1: Integration Styles &amp; Point-to-Point Channels</title><link>https://james-carr.org/posts/2025-12-16-advent-of-eip-day-1-integration-styles/</link><pubDate>Tue, 16 Dec 2025 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/2025-12-16-advent-of-eip-day-1-integration-styles/</guid><description>Welcome to Day 1 of the Advent of Enterprise Integration Patterns! Today we tackle the foundational question every distributed system must answer: how do systems share information? Can someone just call me!?
Chapter 2 of Enterprise Integration Patterns lays out four fundamental integration styles. Understanding these options and their trade-offs is essential before diving into the patterns themselves. Let&amp;rsquo;s examine each one, drawing from real-world experience, and then bootstrap Chronicle with our first pattern implementation.</description></item><item><title>🎄 Advent of Enterprise Integration Patterns</title><link>https://james-carr.org/posts/2025-12-15-advent-of-enterprise-integration-patterns/</link><pubDate>Mon, 15 Dec 2025 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/2025-12-15-advent-of-enterprise-integration-patterns/</guid><description>Since returning to Zapier, I&amp;rsquo;ve been building the features enterprise customers crave for managing automation at scale. Event-driven architectures, message routing, guaranteed delivery, audit trails. The stuff that enterprise buyers expect as table stakes. It&amp;rsquo;s reminded me how much this foundational knowledge matters.
One thing keeps coming up: audit logging. Every enterprise customer wants to know what happened, when, and by whom. It sounds simple until you&amp;rsquo;re building it for the fifth time, wiring up the same patterns to yet another data store.</description></item><item><title>🎬 90s Movies Were Always About Reality Control—Now We Really Get It</title><link>https://james-carr.org/posts/90s-movies-algorithmic-reality/</link><pubDate>Sun, 23 Nov 2025 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/90s-movies-algorithmic-reality/</guid><description>My kids have been deep into a 90s-movie phase lately — which is surreal because these were my high-school movies and now apparently they’re “vintage.”
So we&amp;rsquo;ve been watching The Truman Show, Dark City, and The Matrix together. The themes in these movies always felt familiar — identity, perception, reality, control. None of that is new.
But watching them again today, after decades of living inside social media algorithms, and with a head full of Jung from a college philosophy class I once took (plus a recent binge of Jungian podcasts), those same themes land differently now.</description></item><item><title>🐰 Elixir Basics: Working with AMQP</title><link>https://james-carr.org/posts/2024-10-15-elixir-basics-working-with-amqp/</link><pubDate>Tue, 15 Oct 2024 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/2024-10-15-elixir-basics-working-with-amqp/</guid><description>Previously on Elixir Basics, we explored using GenServer to set up multiple workers that would print a message out at a random interval. Today, I&amp;rsquo;m going to expand on it by adding AMQP to the mix, having our workers publish messages on an interval and add a solitary consumer process to consume the messages.
Overview If you recall from last time, we had a simple setup of an application, a supervisor, and N workers.</description></item><item><title>⏱️ Elixir Basics: Multi-Process Interval Timer</title><link>https://james-carr.org/posts/2024-10-09-elixir-basics-multiprocess-interval-timer/</link><pubDate>Wed, 09 Oct 2024 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/2024-10-09-elixir-basics-multiprocess-interval-timer/</guid><description>A common code sample I like to write when learning a new language is to have multiple threads or processes &amp;ldquo;do something&amp;rdquo; on an interval. For example, publishing to Kafka or RabbitMQ, invoking a REST API, etc., as a way of simulating a multi-process worker system. As a starting point, I like to build these to simply output a string to the console and then build my way up from there.</description></item><item><title>💻 Building Beautiful Admin Dashboards in Phoenix with Backpex</title><link>https://james-carr.org/posts/2024-08-27-phoenix-admin-with-backpex/</link><pubDate>Tue, 27 Aug 2024 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/2024-08-27-phoenix-admin-with-backpex/</guid><description>Something that I noticed as I have begun building out applications in Phoenix is the complete lack of any kind of &amp;ldquo;Admin View.&amp;rdquo; Most frameworks like this don&amp;rsquo;t come with one included, but I guess I have just been spoiled by Django&amp;rsquo;s inclusion of these by default. I searched around and found several do exist and will maybe spend some time looking at them in the future, but today I&amp;rsquo;ll share my experience integrating Backpex.</description></item><item><title>🧠 Dynamic Key/Value Pair Inputs in Phoenix LiveView Forms</title><link>https://james-carr.org/posts/2024-08-19-dynamic-keyvalue-pair-inputs-in-phoenix-liveview-forms/</link><pubDate>Mon, 19 Aug 2024 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/2024-08-19-dynamic-keyvalue-pair-inputs-in-phoenix-liveview-forms/</guid><description>While working on a new project recently, I needed to allow application users to enter a dynamic list of key-value pairs. Not knowing better, I reached for what I knew and built out a React component to dynamically add and remove inputs while also inserting into the websocket to sync the changeset with the server. Then on the server-side, I had to write some additional handlers to process those values. It worked, but it didn&amp;rsquo;t feel great.</description></item><item><title>🛠️ Managing Development Environments with Mise</title><link>https://james-carr.org/posts/2024-08-14-managing-development-environments-with-mise/</link><pubDate>Wed, 14 Aug 2024 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/2024-08-14-managing-development-environments-with-mise/</guid><description>As I&amp;rsquo;ve started down the Indie Hacker road, one thing that has come up as I work on various projects is I need something to manage multiple versions of different binaries. I had used nvm and pyenv in the past (and rvm before that) so I started down the path of looking for the same type of tool in the elixir world. Thankfully, this led me down the path of more generic solutions to versioning these tools.</description></item><item><title>💡 The Pivot</title><link>https://james-carr.org/posts/2024-07-29-the-pivot/</link><pubDate>Mon, 05 Aug 2024 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/2024-07-29-the-pivot/</guid><description>I just got back from a month-long break in Cambodia, traveling with my family. I took advantage of the wide-open space with zero work expectations to give me some time to truly reflect on my career so far and what comes next. I&amp;rsquo;ve had a pretty successful career in tech spanning twenty years that, for the most part, paid off quite well. It&amp;rsquo;s afforded me a life that I never would have imagined when I was running around barefoot in a trailer park in Warrenton, Missouri, and for that, I&amp;rsquo;ll always be immensely thankful.</description></item><item><title>🏰 A Day Exploring Berlin</title><link>https://james-carr.org/posts/a-day-in-berlin/</link><pubDate>Mon, 27 Nov 2023 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/a-day-in-berlin/</guid><description>Previously I wrote about setting out on my solo journey across Germany and how I prepared. Today I’m going to break down everything about my time in Berlin: places to visit and tons of photos to share. Along the way, I hope to share a few tips and tricks to make your visit enjoyable.
Arrival In Berlin After a 12 hour flight I landed in Berlin at 8:20am. Thanks to the sleeping gummies I took, I was wide awake and my legs weren’t sore or stiff thanks to the compression socks I wore.</description></item><item><title>📷 A Photo That Means the World to Me</title><link>https://james-carr.org/posts/a-photo-that-means-the-world-to-me/</link><pubDate>Wed, 15 Nov 2023 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/a-photo-that-means-the-world-to-me/</guid><description>10 years ago, as I was getting ready to take kids somewhere I heard them both laughing wildly in the backseat. I snapped this photo as quick as I could and to me, it just completely captures the companionship these two siblings have shared since the very beginning. The big grins on both of their faces is something I always hope to see every single day.</description></item><item><title>🇩🇪 My Solo Journey Through Germany</title><link>https://james-carr.org/posts/2023-solo-trip-germany/</link><pubDate>Wed, 08 Nov 2023 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/2023-solo-trip-germany/</guid><description>I recently returned from a week-long solo adventure in Germany, a trip that came about quite unexpectedly. Earlier in 2023, in my eagerness to reengage with speaking at conferences, I submitted a series of talk proposals to various events and one of my submissions was accepted at RabbitMQ Summit. However, it was only after this exciting acceptance that I realized the conference was in Berlin, not in the United States.</description></item><item><title>📈💰☁️ The Rise of FinOps: How Cloud Financial Operations Are Transforming Business</title><link>https://james-carr.org/posts/the-rise-of-finops/</link><pubDate>Sun, 02 Apr 2023 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/the-rise-of-finops/</guid><description>“Hey really quick, can you put together some cost forecasts for the coming year for our AWS and GCP costs?”
At some point in your career, you may receive this kind of request from your manager, VP of Engineering, CTO, CFO, or CEO. You might explore Cost Explorer, put together some fancy graphs and breakdowns, and send them over, thinking you&amp;rsquo;re done. Not even close. This request will predictably be followed up with requests to find ways to reduce costs.</description></item><item><title>📘 The Ideal Team Player: A Book Review and Practical Application</title><link>https://james-carr.org/posts/ideal-team-player-review/</link><pubDate>Wed, 29 Mar 2023 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/ideal-team-player-review/</guid><description>Reflecting on my professional journey and the various teams I&amp;rsquo;ve been a part of, I recently picked up a book that resonated with my experiences and offered some invaluable insights into building a truly cohesive and high-performing team. The book, &amp;ldquo;The Ideal Team Player&amp;rdquo; by Patrick Lencioni, delves into the characteristics that make someone an ideal team player and provides practical guidance on how to cultivate these traits in the workplace.</description></item><item><title>💪 The Value of Hard Work: Lessons Learned from Working-Class Jobs</title><link>https://james-carr.org/posts/the-value-of-hard-work/</link><pubDate>Thu, 16 Mar 2023 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/the-value-of-hard-work/</guid><description>Looking back on the years of my life this morning, I was thinking it would be an interesting exercise to review my work experience from earlier in my life, before college graduation and before the true start of my professional career, and examine one thing I am grateful for from each experience. I think it is important to look back to humble beginnings and the lessons learned through hard work and sweat.</description></item><item><title>🏋️ Syncing Hevy Workouts to Notion Using Zapier</title><link>https://james-carr.org/posts/sync-hevy-to-notion-using-zapier/</link><pubDate>Sat, 11 Mar 2023 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/sync-hevy-to-notion-using-zapier/</guid><description>Recently, I&amp;rsquo;ve been using Notion for a variety of purposes, including tracking my workouts. While there are many fitness tracking templates available, some of which are quite complex, I chose to rely on existing popular apps like Hevy, Strava, and Concept2 Logbook for detailed tracking, and use Notion as a central place for logging my activities.
Initially, I was tracking my workouts manually, which wasn&amp;rsquo;t very enjoyable. In this post, I&amp;rsquo;ll provide a brief overview of my fitness tracker and explain how I used Zapier to automatically sync my workouts from Hevy.</description></item><item><title>🎧 Revolutionize Your Podcast Consumption with Snipd, Notion, and AI</title><link>https://james-carr.org/posts/revolutionize-your-podcast-consumption-with-snipd-notion-and-ai/</link><pubDate>Fri, 03 Mar 2023 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/revolutionize-your-podcast-consumption-with-snipd-notion-and-ai/</guid><description>For over a decade, I have enjoyed listening to podcasts. I subscribe to many and listen to them during long drives, while working out at the gym, or doing yard work. However, one downside is that I often hear many great ideas that I don&amp;rsquo;t capture in the moment. Taking my phone out and fiddling with a notes app normally detracts from my current engagement. Nine times out of ten, I won&amp;rsquo;t remember to go back and look up show notes after the activity is finished.</description></item><item><title>Contact Me</title><link>https://james-carr.org/schedule/</link><pubDate>Fri, 24 Feb 2023 14:53:04 -0600</pubDate><guid>https://james-carr.org/schedule/</guid><description>
Let&amp;rsquo;s chat. Tell me about your project. Let&amp;rsquo;s create something incredible together.💡
Feel free to ✉️ email me or 📆 book a time for us to chat! Upcoming Speaking Engagements I&amp;rsquo;ve been on sabatical for 2024, new talks for 2025 coming soon!
Past Speaking Engagements RabbitMQ Summit Supermanagers Episode Datadog Dash</description></item><item><title>James Carr</title><link>https://james-carr.org/readme/personal/</link><pubDate>Fri, 24 Feb 2023 14:53:04 -0600</pubDate><guid>https://james-carr.org/readme/personal/</guid><description>I build systems that make other systems talk to each other. Twenty years in, that&amp;rsquo;s still the part I find most interesting: not the services themselves, but the seams between them, and everything that has to go right for a message to survive the trip.
Two things drive the work. The first is efficiency. Distributed systems burn a startling share of their budget on coordination alone: latency, dollars, and the attention of whoever is on call for it.</description></item><item><title>James Carr: An Operator's Guide [WIP]</title><link>https://james-carr.org/readme/manager/</link><pubDate>Fri, 24 Feb 2023 14:53:04 -0600</pubDate><guid>https://james-carr.org/readme/manager/</guid><description>👋 I am so glad you are here at $COMPANY and I am looking forward to us working together. I like to provide this manager readme ahead of time as kind of an operating manual so you can understand how I operate and what to expect. This isn&amp;rsquo;t exhaustive, but hopefully we&amp;rsquo;ll fill in the gaps as we work together.
My Values Be Transparent - Unless there is a need for confidentiality I am completely open and transparent.</description></item><item><title>💡 The Power of Intentionality</title><link>https://james-carr.org/posts/the-power-of-intentionality/</link><pubDate>Thu, 23 Feb 2023 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/the-power-of-intentionality/</guid><description>Life is a journey with endless possibilities, each one presenting an opportunity to grow and evolve. However, without intentionality, these opportunities can easily slip away, leaving us feeling unfulfilled and stuck. In today’s fast-paced world, it’s easy to get caught up in the hustle and bustle of everyday life, leaving little time for reflection and intentionality. Being intentional with everything you do is the key to unlocking your full potential and living a fulfilling life.</description></item><item><title>📘 Book Review: Dynamic Reteaming</title><link>https://james-carr.org/posts/dynamic-reteaming/</link><pubDate>Sun, 01 Jan 2023 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/dynamic-reteaming/</guid><description>While taking my career break I have been doing some reading around organization structures and building high performing teams. One of the books that came up in my list was Dynamic Reteaming by Heidi Helfand. I picked this book up because in my career I had seen a several examples of how team structures evolve and change over time and figured it would be great to really dig into some of the patterns that have been identified across many organizations.</description></item><item><title>Strange Loop 2022 Recap</title><link>https://james-carr.org/posts/strange-loop-2022/</link><pubDate>Sat, 01 Oct 2022 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/strange-loop-2022/</guid><description>Yep, that&amp;rsquo;s me over in the top right, with my kiddos meeting the legendary John Romero at Strange Loop 2022.</description></item><item><title> Effective Communication Best Practices</title><link>https://james-carr.org/posts/effective-communication/</link><pubDate>Sat, 18 Jun 2022 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/effective-communication/</guid><description>Recently a member of the Rands Leadership slack went through and took some very detailed notes of the #engineering-effectiveness channel dating all the way back to 2017 to the present day and shared their notes with the rest of the group. I was floored by how much good information was in the document and plan to go over it in detail, but here are some of the key points I highlighted when it came to effective communication.</description></item><item><title>Thoughts on Managing Managers</title><link>https://james-carr.org/posts/manager-of-managers/</link><pubDate>Wed, 08 Dec 2021 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/manager-of-managers/</guid><description>In any organization, the role of a manager is crucial to ensure that the team performs to its full potential. As teams grow larger and more complex, managing them effectively becomes increasingly challenging. At a certain point, you need to subdivide the team into several teams and make the decision to either promote or hire additional managers. This is where a director takes on the role of a “manager of managers.</description></item><item><title>Book Review: Turn the Ship Around</title><link>https://james-carr.org/posts/turn-the-ship-around/</link><pubDate>Sun, 01 Aug 2021 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/turn-the-ship-around/</guid><description>Turn the Ship Around!: A True Story of Turning Followers into Leaders is a book written by David Marquet, a retired submarine commander in the United States Navy. The book details Marquet&amp;rsquo;s experience of turning a failing submarine crew into a highly effective team by implementing a leader-leader model instead of the traditional leader-follower model. My spouse, Than, picked this book up a few years back as part of a large collection of management books to help the shift from engineer to engineering management and I finally got around to ready it.</description></item><item><title>Measuring the Impact of Unplanned Work</title><link>https://james-carr.org/posts/unplanned-work/</link><pubDate>Thu, 18 Feb 2021 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/unplanned-work/</guid><description>One of the immense difficulties I have faced while running production engineering-type teams is how much-unplanned work can drop into their daily workload. I am still trying to solve the root problem of why we get so much unplanned work but the first item on my list is to find a way to measure it first. Measure, then tackle is my go-to operating mode.
Many engineering teams face the challenge of balancing planned development work with unplanned operational tasks.</description></item><item><title>Book Review: The First 90 Days</title><link>https://james-carr.org/posts/first-90-days-review/</link><pubDate>Tue, 12 Jan 2021 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/first-90-days-review/</guid><description>&amp;ldquo;The First 90 Days&amp;rdquo; by Michael D. Watkins is a book on leadership transition that I had delivered to me from my new manager at the role I just took on at a new company. I read the book ahead of starting last month but finally got around to sitting down and writing out my summary. The book provides a comprehensive framework for making a successful transition, with practical advice and tips that are applicable to any industry or organization.</description></item><item><title>My Five Favorite Management Books</title><link>https://james-carr.org/posts/five-favorite-management-books/</link><pubDate>Sun, 22 Dec 2019 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/five-favorite-management-books/</guid><description>I was chatting with a team member of mine about their career growth plans a few weeks ago and while we were on the topic he mentioned he&amp;rsquo;d always appreciate book recommendations for growing into engineering management. I thought over it a bit and decided this would be a great topic to share with everyone else. So without further delay, here are my favorite books I&amp;rsquo;ve read to grow in my engineering management career in no particular order.</description></item><item><title>152 Days of the Majjhima Nikāya</title><link>https://james-carr.org/posts/152-days-of-majjhima-nikaya/</link><pubDate>Mon, 22 Apr 2019 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/152-days-of-majjhima-nikaya/</guid><description>“What should be done for his disciples out of compassion by a Teacher who seeks their welfare and has compassion for them, that I have done for you, Ānanda. There are these roots of trees, these empty huts. Meditate, Ānanda, do not delay, or else you regret it later. This is our instruction to you.”
Thus ends the Indriyabhāvanā Sutta (The Development of the Faculties), number 152 in the Majjhima Nikāya collection and in my opinion there really couldn’t be any better way to conclude the Middle Length Discourses with a very blunt call to action.</description></item><item><title>Engineering Team Metrics to Drive Performance</title><link>https://james-carr.org/posts/engineering-team-metrics-to-drive-performance/</link><pubDate>Fri, 03 Mar 2017 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/engineering-team-metrics-to-drive-performance/</guid><description>As a newly promoted engineering manager, I am still learning about the various ways to improve my team&amp;rsquo;s performance. One of the most important aspects of this task is understanding and measuring the metrics that will drive success. Here are some of the books and articles that I have found to be valuable resources in understanding and implementing engineering team metrics.
Key Metrics The first book that I found to be extremely helpful is &amp;ldquo;Managing the Unmanageable: Rules, Tools, and Insights for Managing Software People and Teams&amp;rdquo; by Mickey W.</description></item><item><title>How We Run Infrastructure at Zapier</title><link>https://james-carr.org/posts/how-we-run-infrastructure-at-zapier/</link><pubDate>Sat, 12 Nov 2016 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/how-we-run-infrastructure-at-zapier/</guid><description>I think I am long overdue for writing a post about how we run infrastructure at Zapier. While I admit our setup might be far from perfect, I feel it works well and has served us as we scale the business out. I am also proud of how much we have been able to do with such a small team!
Philosophy Since the beginning, we’ve been big on maintaining a philosophy of “Immutable Infrastructure” and treating our instances as cattle, not pets.</description></item><item><title>Installing Elasticsearch Plugins on Graylog2</title><link>https://james-carr.org/posts/graylog-plugins/</link><pubDate>Tue, 17 Jun 2014 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/graylog-plugins/</guid><description>I thought I’d share this since it was something I unfortunately, spent a good portion of my afternoon wrestling with. So you want to use an elasticsearch plugin within graylog2-server? I don’t care about your reasons, but this will help you do it. I’m going to go out on a limb and assume you’re wanting to use the kopf plugin to view cluster state, but this will work for any plugin.</description></item><item><title>On BDD From Acceptance Tests to Story Level Specifications</title><link>https://james-carr.org/posts/on-bdd-from-acceptance-tests-to-story-level-specs/</link><pubDate>Mon, 17 Mar 2014 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/on-bdd-from-acceptance-tests-to-story-level-specs/</guid><description>Behavior Driven Development is best described as taking an “Outside-In” approach, meaning you define your feature from the outset and describe business value, and work your way in a small piece at a time. That being the case, I thought it’d be best to cover one stage of evolution that I’ve had over the years… from Developer Facing Acceptance Tests to Customer Facing Story Level Specifications.
The Start: Developer Facing Acceptance Tests These were the starting point… where I started 5 years ago.</description></item><item><title>Dynamic Vagrant Nodes</title><link>https://james-carr.org/posts/dynamic-vagrant-nodes/</link><pubDate>Sun, 17 Mar 2013 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/dynamic-vagrant-nodes/</guid><description>I use vagrant a lot and at Zapier I use a setup where one Vagrantfile can be used to launch any instance in our infrastructure locally for testing. This is really quite useful as I can boot up a two node rabbitmq cluster with haproxy by simply typing vagrant up rabbitproxy01 rabbit01 rabbit02.
In the beginning this was a little messy as I just kept adding new node definitions and incrementing the ip address.</description></item><item><title>HackComo Inaugural Meetup 2/28/2012</title><link>https://james-carr.org/posts/hack-como/</link><pubDate>Tue, 28 Feb 2012 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/hack-como/</guid><description>Last night I had the pleasure of attending the very first HackCoMo meetup at Bambinos and thought I’d share the experience. For those of you who don’t know, HackCoMo is a weekly meetup to get together and just hack at various projects or ideas. All in the company of really cool geeks local to Columbia, MO while enjoying some beer and appetizers.
First, it was pretty awesome to be exposed to what others were working on.</description></item><item><title>An Epiphany About Coaching</title><link>https://james-carr.org/posts/an-epiphany-about-coaching/</link><pubDate>Mon, 01 Nov 2010 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/an-epiphany-about-coaching/</guid><description>True knowledge exists in knowing that you know nothing. - Socrates
As those of you who read my blog often know, I recently made a career jump to a contracting firm to consult at different large-scale organizations. To my dismay, my first assignment has been more as a developer than as a coach/scrum master, but I felt this would also be a good opportunity to observe and understand how to coach effectively.</description></item><item><title>Lessons Learned With My Recent Node.js Application</title><link>https://james-carr.org/posts/lessons-learned-nodejs-strangeloop-2010/</link><pubDate>Fri, 24 Sep 2010 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/lessons-learned-nodejs-strangeloop-2010/</guid><description>Recently, I developed a web application for my friend Alex Miller&amp;rsquo;s conference, Strange Loop. The app accepted talk submissions and gathered votes on those submissions to rank the top ones. I hosted the application on Heroku&amp;rsquo;s node.js beta preview and used a free CouchOne instance for the data store. Although I encountered some difficulties, I learned some important lessons that I thought I&amp;rsquo;d share.
Tag your last successful Heroku deployment. While adding one additional feature to the site, the app worked fine on my laptop but failed on Heroku for reasons I couldn&amp;rsquo;t figure out for quite some time.</description></item><item><title>Life in the Fast Lane</title><link>https://james-carr.org/posts/life-in-the-fastlane/</link><pubDate>Mon, 12 Jul 2010 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/life-in-the-fastlane/</guid><description>When I was growing up I always thought that my life would hit some kind of point where everything will start moving very quickly and that I’d have to keep up with the current before I get swept away.
And today I finally feel like I’ve dipped my toe into that point in my life.
Our baby girl was born yesterday (a month ahead of schedule) and I’ve been kind of in a rush to get everything put into place.</description></item><item><title>⭐️ Retrospective Rules</title><link>https://james-carr.org/posts/retrospective-rules/</link><pubDate>Sun, 28 Feb 2010 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/retrospective-rules/</guid><description>I am preparing to conduct a retrospective for my team at my current client site. To guide me, I have been reviewing notes from previous retrospectives I have either attended or led. In doing so, I have noticed an emerging pattern of behavior that can significantly impact the success of a retrospective. Here are a few key factors that I believe are most important:
Retrospective Belongs to the Team
Possibly the most important observation I&amp;rsquo;ve made is that retrospectives are only effective if they truly belong to the team.</description></item><item><title>RabbitMQ, Node.js and Java Goodness</title><link>https://james-carr.org/posts/rabbitmq-nodejs-and-java-goodness/</link><pubDate>Sun, 28 Feb 2010 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/rabbitmq-nodejs-and-java-goodness/</guid><description>Tuesday night I gave a talk at a local Java User Group (that’s four JUG appearances this year, hoorah!) on RabbitMQ and demonstrated not just using it communicate between two java processes, but also as a way of communicating asynchronously between a node.js application and a java application… I have to say it was pretty awesome and I really think it opens the doors for integrating node.js applications seemlessly into an existing java infrastructure.</description></item><item><title>The Importance of Maintaining a Sustainable Pace</title><link>https://james-carr.org/posts/the-importance-of-maintaining-a-sustainable-pace/</link><pubDate>Thu, 18 Feb 2010 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/the-importance-of-maintaining-a-sustainable-pace/</guid><description>When it comes to working in the software industry, I believe I can best summarize what the majority of developers and teams do by quoting Pink Floyd&amp;rsquo;s song &amp;ldquo;Breathe&amp;rdquo;:
Run, rabbit run Dig that hole, forget the sun And when at last the work is done Don’t sit downIt’s time to dig another one
I think that the verse goes quite well with the default behavior of developers when faced with an overwhelming amount of work on a project.</description></item><item><title>CoMO Twestival</title><link>https://james-carr.org/posts/twestival/</link><pubDate>Sun, 15 Feb 2009 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/twestival/</guid><description>This Thursday I attended a Twestival organized by jenleereeves and finally got to meet up with a ton of local “tweeters” I’ve followed for quite a while as well as meet several for the first time. In addition to finally meeting face to face, we also bid on auction items for charity:water. Good times plus helping support a good cause.
I have to say it was a really awesome experience… an interesting mix of local tech heads, photographers, journalists, and new media enthusiasts.</description></item><item><title>OSCommerce: A Lesson in Unmaintainable Code?</title><link>https://james-carr.org/posts/oscommerce/</link><pubDate>Sun, 30 Nov 2008 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/oscommerce/</guid><description>I’ll let you in on a dirty secret: my first paid programming task was to make custom modifications to an oscommerce shopping cart. I cut my teeth on PHP that weekend and learned through trial by fire how much good, clean code (with no global variables!) matters, and how much it really SUCKS when everything is in the global scope. I always died a little inside each time I had to make a modification… I once started refactoring the code on the side but gave up after a month.</description></item><item><title/><link>https://james-carr.org/posts/diagrams/adaptive-throughput-learning/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/diagrams/adaptive-throughput-learning/</guid><description>Adaptive Throughput Learning - Mermaid Diagram Preview this diagram to see how the throughput tracking and baseline adaptation system works.
flowchart TB subgraph Delivery[&amp;#34;📤 Delivery Pipeline&amp;#34;] D1[Webhook Delivery] --&amp;gt; D2[Record Result] D2 --&amp;gt; D3{Success?} D3 --&amp;gt;|Yes| D4[Log: timestamp, latency] D3 --&amp;gt;|No| D5[Log: error, status code] end subgraph Metrics[&amp;#34;📊 Rolling Metrics Engine&amp;#34;] M1[(Time-Series Store)] M2[1-min Counter] M3[1-hour Rolling Avg] M4[24-hour Rolling Avg] M5[P95 Response Time] M6[Error Rate %] D4 --&amp;gt; M1 D5 --&amp;gt; M1 M1 --&amp;gt; M2 --&amp;gt; M3 --&amp;gt; M4 M1 --&amp;gt; M5 M1 --&amp;gt; M6 end subgraph Detection[&amp;#34;🔍 Capacity Change Detection&amp;#34;] C1{Current vs Historical&amp;lt;br/&amp;gt;Deviation &amp;gt; 10%?</description></item><item><title/><link>https://james-carr.org/posts/diagrams/circuit-breaker/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/diagrams/circuit-breaker/</guid><description>Circuit Breaker Pattern - Mermaid Diagrams State Machine stateDiagram-v2 [*] --&amp;gt; CLOSED: Initialize CLOSED --&amp;gt; CLOSED: Success\n(reset failure count) CLOSED --&amp;gt; OPEN: Failure threshold\nexceeded (5 failures) OPEN --&amp;gt; OPEN: Reject requests\n(fail fast) OPEN --&amp;gt; HALF_OPEN: Timeout expires\n(30s) HALF_OPEN --&amp;gt; CLOSED: Health check\npasses (3 successes) HALF_OPEN --&amp;gt; OPEN: Health check\nfails note right of CLOSED Normal operation Track failure count Reset on success end note note right of OPEN Circuit tripped Reject all requests Start recovery timer end note note right of HALF_OPEN Testing recovery Allow limited traffic Probe endpoint health end note Sequence Diagram - Normal Flow to Trip to Recovery sequenceDiagram participant Client participant CB as Circuit Breaker participant Endpoint Note over CB: State: CLOSED rect rgb(30, 60, 30) Note right of Client: Normal Operation Client-&amp;gt;&amp;gt;CB: Request 1 CB-&amp;gt;&amp;gt;Endpoint: Forward Endpoint--&amp;gt;&amp;gt;CB: 200 OK CB--&amp;gt;&amp;gt;Client: Success Note over CB: failures = 0 end rect rgb(60, 30, 30) Note right of Client: Failures Accumulate Client-&amp;gt;&amp;gt;CB: Request 2 CB-&amp;gt;&amp;gt;Endpoint: Forward Endpoint--&amp;gt;&amp;gt;CB: 500 Error CB--&amp;gt;&amp;gt;Client: Error Note over CB: failures = 1 Client-&amp;gt;&amp;gt;CB: Request 3 CB-&amp;gt;&amp;gt;Endpoint: Forward Endpoint--&amp;gt;&amp;gt;CB: Timeout CB--&amp;gt;&amp;gt;Client: Error Note over CB: failures = 2 Client-&amp;gt;&amp;gt;CB: Request 4-6 CB-&amp;gt;&amp;gt;Endpoint: Forward (x3) Endpoint--&amp;gt;&amp;gt;CB: 503 (x3) CB--&amp;gt;&amp;gt;Client: Error (x3) Note over CB: failures = 5 → TRIP!</description></item><item><title/><link>https://james-carr.org/posts/diagrams/day-10-process-manager-diagrams/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://james-carr.org/posts/diagrams/day-10-process-manager-diagrams/</guid><description>Day 10: Process Manager Diagrams 1. Choreography - Emergent Coordination sequenceDiagram participant Customer participant Order as Order Service participant Inventory as Inventory Service participant Shipping as Shipping Service Customer-&amp;gt;&amp;gt;Order: Place order activate Order Order--&amp;gt;&amp;gt;Inventory: OrderCreated (event) Order--&amp;gt;&amp;gt;Shipping: OrderCreated (event) deactivate Order activate Inventory Inventory--&amp;gt;&amp;gt;Order: ItemsReserved (event) Inventory--&amp;gt;&amp;gt;Shipping: ItemsReserved (event) deactivate Inventory activate Shipping Shipping--&amp;gt;&amp;gt;Order: ShipmentScheduled (event) Shipping--&amp;gt;&amp;gt;Customer: Order shipped! deactivate Shipping Each service reacts to events independently. No one &amp;ldquo;owns&amp;rdquo; the workflow.</description></item></channel></rss>