<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Benjamin Cane on Medium]]></title>
        <description><![CDATA[Stories by Benjamin Cane on Medium]]></description>
        <link>https://medium.com/@madflojo?source=rss-96013faddf78------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*mu9eLLugJ68QrlRwLPBmwA@2x.jpeg</url>
            <title>Stories by Benjamin Cane on Medium</title>
            <link>https://medium.com/@madflojo?source=rss-96013faddf78------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Mon, 03 Aug 2026 20:11:35 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@madflojo/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[The closer to the edge, the more stable a platform must be]]></title>
            <link>https://madflojo.medium.com/the-closer-to-the-edge-the-more-stable-a-platform-must-be-008f5682c301?source=rss-96013faddf78------2</link>
            <guid isPermaLink="false">https://medium.com/p/008f5682c301</guid>
            <category><![CDATA[coding]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[devops]]></category>
            <dc:creator><![CDATA[Benjamin Cane]]></dc:creator>
            <pubDate>Fri, 31 Jul 2026 17:06:01 GMT</pubDate>
            <atom:updated>2026-07-31T17:06:01.394Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*doa9_wh5ADS-Itir" /></figure><p>The closer a component is to the customer, the greater its responsibility for keeping the entire platform available, even when everything behind it is having a bad day.</p><h3>Not All Services Carry the Same Reliability Burden</h3><p>Let’s consider a typical platform.</p><p>Customer -&gt; Load Balancer -&gt; API Gateway -&gt; Orchestrator -&gt; Microservices -&gt; Database</p><p>Every layer has a different job. But every layer also has a different level of responsibility for resiliency.</p><p>As you move toward the customer, that responsibility increases.</p><h3>Deep Services Focus on Business Logic</h3><p>At the deepest layers of the platform, services are usually focused on business capabilities.</p><p>They process orders, transfer money, manage inventory, and store data.</p><p>These services often have databases, business rules, stateful operations, and multiple dependencies.</p><p>Resiliency matters, but it’s often focused on correctness.</p><p>If a database call fails:</p><ul><li>Should the transaction roll back?</li><li>Should the service fail over?</li><li>Should a compensating transaction occur?</li></ul><p>These services are primarily concerned with business outcomes.</p><h3>The Middle Layers Absorb Failures</h3><p>Move up a layer, and you often find orchestrators and workflow services. These components coordinate work across multiple services.</p><p>If one service fails, the orchestrator may retry, execute fallback logic, trigger compensating actions, or roll back a workflow. Their job is not just executing business logic, it’s ensuring execution succeeds despite failures.</p><h3>The Edge Exists to Protect Everything Behind It</h3><p>At the edge, things change.</p><p>Load balancers and API gateways are often stateless, dependency-light, highly available, and extremely fast.</p><p>Why?</p><p>Because their primary responsibility is availability. Everything behind them is allowed to fail, and they absorb as much of that failure as possible.</p><p>They:</p><ul><li>Route around failures</li><li>Shed load</li><li>Fail over traffic</li><li>Enforce timeouts</li><li>Apply retries</li><li>Protect backend systems</li></ul><p>The edge isn’t just resilient for itself. It’s resilient on behalf of everything behind it.</p><h3>Final Thoughts</h3><p>The deepest services in a platform should be focused on business logic. The edge should be focused on availability.</p><p>The more failures your edge can absorb, the less every downstream service needs to care. That’s why the closer you get to the customer, the more stable the platform must become.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=008f5682c301" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Sometimes, the most resilient thing a system can do isn’t retry]]></title>
            <link>https://itnext.io/sometimes-the-most-resilient-thing-a-system-can-do-isnt-retry-ae1e63b8be32?source=rss-96013faddf78------2</link>
            <guid isPermaLink="false">https://medium.com/p/ae1e63b8be32</guid>
            <category><![CDATA[devops]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[technology]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[software-engineering]]></category>
            <dc:creator><![CDATA[Benjamin Cane]]></dc:creator>
            <pubDate>Fri, 24 Jul 2026 17:06:01 GMT</pubDate>
            <atom:updated>2026-07-25T20:15:12.833Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*Cz0_w69OlIuw5Jqx" /></figure><p>Most resiliency discussions focus on retries, timeouts, and circuit breakers. But some of the most important resiliency patterns happen after the failure.</p><p>That’s where compensating transactions come in.</p><h3>Resiliency Is About Recovery</h3><p>A common mistake is thinking resiliency means preventing failures.</p><p>Failures are inevitable.</p><p>Networks fail. Services crash. Messages get lost. Requests time out.</p><p>True resiliency is accepting that failures will occur and having a plan to recover when they do.</p><p>Sometimes recovery means correcting actions that may already have occurred.</p><h3>A Real-World Example</h3><p>Have you ever swiped your card at a store, received a charge notification, only to have the terminal report an error and later discover that the charge was nowhere to be found?</p><p>What happened?</p><p>The point-of-sale terminal sent an authorization request.</p><p>But before it received a response, something failed: a network issue, a timeout, or a problem somewhere in the payment flow.</p><p>Now the terminal doesn’t know whether the transaction succeeded or failed.</p><p>The authorization request may have reached the card issuer and been processed, or it may not have.</p><p>Rather than risk leaving the customer incorrectly charged, the terminal sends a second transaction: a reversal.</p><h3>The Compensating Transaction</h3><p>That reversal is a real-world example of a compensating transaction.</p><p>Its purpose is simple:</p><p>Undo the effects of a previous action if that action completed successfully. If the original authorization never happened, nothing changes.</p><p>If it did happen, the reversal corrects it. Instead of determining exactly what happened, the system performs a corrective action.</p><h3>Beyond Payments</h3><p>Compensating transactions show up in many real-world distributed systems:</p><ul><li>Releasing inventory after a failed order</li><li>Refunding a payment after a fulfillment failure</li><li>Canceling a reservation when verification times out</li></ul><p>The pattern is always the same: something failed, and the system takes a corrective action.</p><h3>Final Thoughts</h3><p>When engineers think about resiliency, they often focus on preventing failures. But distributed systems fail in unexpected ways.</p><p>Sometimes the most resilient thing a system can do isn’t retry. It’s correct the mistake and move forward.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=ae1e63b8be32" width="1" height="1" alt=""><hr><p><a href="https://itnext.io/sometimes-the-most-resilient-thing-a-system-can-do-isnt-retry-ae1e63b8be32">Sometimes, the most resilient thing a system can do isn’t retry</a> was originally published in <a href="https://itnext.io">ITNEXT</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Should retries and timeouts live in your application or your service mesh?]]></title>
            <link>https://itnext.io/should-retries-and-timeouts-live-in-your-application-or-your-service-mesh-e591a28efd7d?source=rss-96013faddf78------2</link>
            <guid isPermaLink="false">https://medium.com/p/e591a28efd7d</guid>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[coding]]></category>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[technology]]></category>
            <dc:creator><![CDATA[Benjamin Cane]]></dc:creator>
            <pubDate>Fri, 17 Jul 2026 16:46:01 GMT</pubDate>
            <atom:updated>2026-07-18T12:05:11.139Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*vbSBKfRDZiXc9VGm" /></figure><p>This debate comes up constantly. Should resiliency live in the platform components, or should the application own it?</p><p>Like most things in distributed systems, the answer is: It depends.</p><h3>Infrastructure Understands Traffic</h3><p>Service meshes, API gateways, and load balancers are great at handling generic resiliency concerns.</p><p>Things like:</p><ul><li>Connection timeouts</li><li>Automatic retries</li><li>Circuit breakers</li><li>Request-level failover</li></ul><p>The advantage is obvious. You remove complexity from the application and apply resiliency consistently across services.</p><p>For many scenarios, this is the right answer.</p><h3>Infrastructure Doesn’t Understand Intent</h3><p>The challenge is that platform services only understand traffic. They don’t understand why the request is made.</p><p>They don’t know whether a request is reading customer profile data, reserving inventory, transferring money, or uploading cat videos.</p><p>To the service mesh, they’re all just requests. Some requests might even have custom timeouts and retries configured. Most of the time, that’s fine.</p><p>Sometimes, it’s not.</p><h3>Context-Aware Resiliency</h3><p>Some resiliency decisions require application context.</p><p>Consider a financial transaction. Should a timeout trigger a retry? Maybe.</p><p>Does the request have an idempotency key? If yes, blindly retrying might be safe. If not, things become more complicated.</p><p>Did the request reach the downstream system? Was it partially processed?</p><p>Do you need a compensating transaction before retrying?</p><p>At this point, the retry is no longer a networking decision. It’s a business decision. And business decisions belong in the application.</p><h3>The Real Answer</h3><p>The best architectures usually use both approaches.</p><p>Use platform resiliency whenever the decision can be made without application context. But when correctness depends on understanding the request itself, move that logic into the application.</p><p>There should be a strong preference toward offloading complexity when possible. Just don’t offload decisions that require business context.</p><h3>Final Thoughts</h3><p>I often see teams over-index on platform-level resiliency. And while reducing application complexity is valuable, it isn’t free.</p><p>Infrastructure understands traffic and request characteristics. Applications understand business intent.</p><p>When resiliency decisions depend on business intent, they belong in the application.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e591a28efd7d" width="1" height="1" alt=""><hr><p><a href="https://itnext.io/should-retries-and-timeouts-live-in-your-application-or-your-service-mesh-e591a28efd7d">Should retries and timeouts live in your application or your service mesh?</a> was originally published in <a href="https://itnext.io">ITNEXT</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Need to migrate from one database to another without downtime?]]></title>
            <link>https://itnext.io/need-to-migrate-from-one-database-to-another-without-downtime-9bc15bb21397?source=rss-96013faddf78------2</link>
            <guid isPermaLink="false">https://medium.com/p/9bc15bb21397</guid>
            <category><![CDATA[technology]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[devops]]></category>
            <category><![CDATA[software-engineering]]></category>
            <dc:creator><![CDATA[Benjamin Cane]]></dc:creator>
            <pubDate>Fri, 10 Jul 2026 16:41:00 GMT</pubDate>
            <atom:updated>2026-07-11T07:50:03.467Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*yh-vhm8-idb6EY89" /></figure><p>Dual writes are one approach that deserves more attention.</p><p>Most database migrations fall into one of a few buckets:</p><ul><li>Export and import</li><li>Replication between two databases</li><li>Services specifically built to synchronize data</li></ul><p>All of those approaches can work well. But sometimes you need both databases active while gradually migrating traffic from one to the other.</p><p>That’s where dual writes become interesting.</p><h3>What Are Dual Writes?</h3><p>The idea is exactly what it sounds like. Every write is sent to both databases.</p><p>Insert a row? Write it twice.</p><p>Update a record? Update it twice.</p><p>Delete something? Yup, delete it twice.</p><p>The goal is to keep the old and new databases synchronized while both are active.</p><h3>How It Works</h3><p>The most common approach is implementing dual writes directly in the application.</p><p>Instead of maintaining one database connection pool, the application maintains two and executes write operations against both systems.</p><p>In some cases, infrastructure can help as well.</p><p>For example, Envoy supports request mirroring patterns that can be useful when migrating certain technologies, such as Redis.</p><p>The implementation will vary, but the concept remains the same: each write is performed twice.</p><h3>The Hard Part: Failure Handling</h3><p>The hard part is not writing twice, but rather handling partial success.</p><p>What happens when Database A succeeds, but Database B fails?</p><p>Now the two databases disagree.</p><p>Do you retry? Can the operation be safely retried?</p><p>Can you roll back the successful write?</p><p>Do you have locking or reconciliation mechanisms?</p><p>This is where dual writes become significantly more complex than they initially sound.</p><p>Writing twice is easy. Maintaining correctness is the hard part.</p><h3>Where Dual Writes Work Best</h3><p>Dual writes tend to work best when:</p><ul><li>Updates occur frequently</li><li>Eventual consistency is acceptable</li><li>Reconciliation processes exist</li><li>Future updates naturally correct drift</li></ul><p>They become much harder in systems that require strict consistency guarantees for every operation.</p><h3>Why Teams Use Them</h3><p>Despite the complexity, dual writes enable a powerful migration approach.</p><p>You can:</p><ul><li>Introduce a new database platform or table</li><li>Keep it synchronized with the old platform</li><li>Gradually migrate read traffic</li><li>Eventually retire the old database</li></ul><p>All without requiring a large downtime window.</p><h3>Final Thoughts</h3><p>Like most migration strategies, dual writes are a tradeoff.</p><p>They add complexity.</p><p>But they also enable something extremely valuable: migrating between database platforms while the system remains live.</p><p>When downtime is not an option, dual writes can be one of the most powerful migration techniques available.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=9bc15bb21397" width="1" height="1" alt=""><hr><p><a href="https://itnext.io/need-to-migrate-from-one-database-to-another-without-downtime-9bc15bb21397">Need to migrate from one database to another without downtime?</a> was originally published in <a href="https://itnext.io">ITNEXT</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Glue Services: Part Two — Data Synchronization]]></title>
            <link>https://itnext.io/glue-services-part-two-data-synchronization-7330d2f6e868?source=rss-96013faddf78------2</link>
            <guid isPermaLink="false">https://medium.com/p/7330d2f6e868</guid>
            <category><![CDATA[coding]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[technology]]></category>
            <dc:creator><![CDATA[Benjamin Cane]]></dc:creator>
            <pubDate>Fri, 03 Jul 2026 16:41:00 GMT</pubDate>
            <atom:updated>2026-07-05T09:45:42.293Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*b0KZmk1skaHzYvG_.jpg" /></figure><p>I recently talked about using glue services (Anti-Corruption Layers) to isolate modern platforms from legacy integrations.</p><p>Today I want to talk about another type of glue service: data synchronization services.</p><h3>🗃️ The Real Modernization Problem</h3><p>One of the hardest parts of replacing a legacy platform is usually not the application itself.</p><p>It’s the data.</p><p>In a perfect world, you could: take downtime, export the database, import it into the new platform, and switch traffic.</p><p>Simple.</p><p>But large downtime windows are increasingly rare. And big-bang migrations are risky enough that many organizations actively avoid them.</p><p>That means old and new systems often need to run side-by-side for a while.</p><p>Both platforms stay active.</p><p>Both serve customers.</p><p>Both need access to the same data. This is where modernization becomes difficult.</p><h3>🔄 Keeping Two Systems in Sync</h3><p>When you are changing both the application and the underlying database, keeping data synchronized becomes difficult very quickly.</p><p>Especially when the two systems use different schemas, database technologies, data models, and update patterns.</p><p>You can’t simply export/import anymore. You need continuous synchronization.</p><h3>👨🏻‍🤝‍👨🏾 Enter the Synchronization Service</h3><p>One useful pattern is to build a dedicated synchronization service whose sole responsibility is to keep data aligned across systems.</p><p>How synchronization works depends entirely on the platform.</p><p>I’ve used several approaches over the years.</p><h3>⚙️ Database Triggers</h3><p>One approach is to use database triggers or change-capture mechanisms in the legacy system.</p><p>When data changes, it’s detected, the synchronization service processes it, and the new platform is updated.</p><h3>📩 Event-Based Synchronization</h3><p>Another approach is to have the legacy platform emit events via a message broker.</p><p>The synchronization service consumes those events and updates the new database/platform accordingly. This tends to work especially well when modernizing toward event-driven systems.</p><h3>⏳ Temporary Infrastructure</h3><p>The important thing to remember is that these synchronization services are usually temporary. Their job is not to become a permanent platform.</p><p>Their purpose is to enable safe migration while reducing downtime and risk.</p><p>Once the migration is complete, the glue service disappears.</p><h3>⚠️ One Important Warning</h3><p>Bi-directional synchronization becomes extremely difficult very quickly.</p><p>With bi-directional synchronization, you have to solve:</p><ul><li>Conflict resolution</li><li>Consistency problems</li><li>Update ordering</li><li>Partial failures</li></ul><p>Whenever possible, avoid bi-directional synchronization.</p><p>In many cases, it is simpler to migrate the application layer first, then the database layer.</p><h3>🧐 Final Thought</h3><p>Modernization is rarely just replacing code. A major challenge is safely bridging old and new systems during transition periods.</p><p>Synchronization glue services are often what make zero-downtime migrations possible.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=7330d2f6e868" width="1" height="1" alt=""><hr><p><a href="https://itnext.io/glue-services-part-two-data-synchronization-7330d2f6e868">Glue Services: Part Two — Data Synchronization</a> was originally published in <a href="https://itnext.io">ITNEXT</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[When modernizing legacy systems, don’t be afraid to build glue services]]></title>
            <link>https://itnext.io/when-modernizing-legacy-systems-dont-be-afraid-to-build-glue-services-6222d58b8f7f?source=rss-96013faddf78------2</link>
            <guid isPermaLink="false">https://medium.com/p/6222d58b8f7f</guid>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[technology]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[devops]]></category>
            <dc:creator><![CDATA[Benjamin Cane]]></dc:creator>
            <pubDate>Fri, 26 Jun 2026 16:36:01 GMT</pubDate>
            <atom:updated>2026-06-27T13:23:50.446Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*o3DalVjQEa6nDWXx.jpg" /></figure><p>When modernizing legacy systems, don’t be afraid to build glue services.</p><p>One of the biggest mistakes I see during modernization efforts is letting legacy integrations dictate the design of the new platform.</p><p>That usually leads to putting fresh paint on the same old house. Rebuilding the same architecture with a newer tech stack.</p><h3>😴 The Dream vs. Reality</h3><p>The dream project is building a brand-new platform with no existing users, integrations, or constraints.</p><p>You can design everything “the right way” from day one. But most real-world projects are not like that.</p><p>Most projects are modernization efforts. And most modernization efforts are weighed down by existing integrations, legacy protocols, and operational dependencies.</p><p>Changing customer behavior and expectations is often harder than rebuilding the platform itself.</p><h3>🥲 The Common Mistake</h3><p>Many teams respond to this by centering their new platform on the old integration model.</p><p>If customers use XML over Message Brokers, the new platform may speak JSON, but it still inherits the event-driven constraints — even when they no longer make sense.</p><p>If the legacy system exchanges files, the new platform is usually heavily batch-based.</p><p>The problem is:</p><p>Your modernization effort becomes constrained by the past.</p><h3>🤯 A Better Approach: Glue Services</h3><p>The formal term for this pattern is an <em>Anti-Corruption Layer</em>.</p><p>Personally, I think “glue service” explains it better. It makes the concept easier to understand.</p><p>Build the internal platform the way you actually want it designed.</p><p>Then build lightweight edge services that translate between legacy integrations and your modern platform.</p><ul><li>XML over Message Brokers? Use gRPC internally.</li><li>Files? Break them into APIs.</li><li>Long-lived ISO8583 TCP connections? Terminate them at the edge and use gRPC + microservices behind them.</li></ul><p>The glue service has one responsibility: to translate between old and new worlds.</p><h3>🤔 Why This Matters</h3><p>These glue services give you two major advantages.</p><p>First, your internal architecture stays modern and optimized for current engineering practices. Second, your customers and integrations do not need to migrate immediately.</p><p>That dramatically reduces modernization risk. Temporary glue services can be huge modernization enablers.</p><p>But sometimes these glue services live forever, which is ok.</p><p>The important thing is that legacy integrations no longer constrain your modern platform.</p><h3>🔁 It Works at Both Ends</h3><p>This pattern applies both to inbound (clients calling your platform) and outbound (your platform calling legacy systems) integrations.</p><p>In many large systems, you’ll find glue services on both sides of the platform.</p><p>At the edge entering the system, and again leaving it.</p><h3>🧐 Final Thoughts</h3><p>Modernization is rarely just rewriting code. A major challenge is safely bridging old and new systems during transition periods.</p><p>I’ve used this pattern many times.</p><ul><li>Breaking files into APIs</li><li>Translating ISO8583 and ISO20022 messages into Protobuf</li><li>Terminating long-lived TCP sessions at the edge of a gRPC-based microservices platform</li></ul><p>Glue services may not be glamorous, but they are one of the safest ways to modernize systems without dragging the past into the future.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=6222d58b8f7f" width="1" height="1" alt=""><hr><p><a href="https://itnext.io/when-modernizing-legacy-systems-dont-be-afraid-to-build-glue-services-6222d58b8f7f">When modernizing legacy systems, don’t be afraid to build glue services</a> was originally published in <a href="https://itnext.io">ITNEXT</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Coding agents can’t see your architecture diagrams — fix that]]></title>
            <link>https://itnext.io/coding-agents-cant-see-your-architecture-diagrams-fix-that-e47ea2cfa763?source=rss-96013faddf78------2</link>
            <guid isPermaLink="false">https://medium.com/p/e47ea2cfa763</guid>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[ai-agent]]></category>
            <category><![CDATA[coding]]></category>
            <category><![CDATA[technology]]></category>
            <category><![CDATA[software-development]]></category>
            <dc:creator><![CDATA[Benjamin Cane]]></dc:creator>
            <pubDate>Fri, 19 Jun 2026 16:31:00 GMT</pubDate>
            <atom:updated>2026-06-20T13:52:41.604Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*MYKetwMfDgV_67Tt" /><figcaption>Photo by <a href="https://unsplash.com/@wocintechchat?utm_source=medium&amp;utm_medium=referral">Christina @ wocintechchat.com M</a> on <a href="https://unsplash.com?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>Coding agents can’t see your architecture diagrams — fix that.</p><p>I’ve been talking a lot about architecture documentation and how it helps both humans and agents.</p><p>From my experience, most teams spend 90% of their effort on diagrams and 10% on text.</p><p>Why? Because they are the fastest way to communicate a system:</p><p>Diagrams show how components interact, how data flows, and what depends on what. They help humans understand complex systems quickly.</p><p>That’s why most architecture documentation leans heavily on diagrams.</p><h3>🤔 The Problem</h3><p>Most diagrams are images. Images are great for humans, but not for agents.</p><p>Some agents can interpret images, but not reliably or consistently. And even when an agent can interpret an image, it can’t reliably reason about it or keep it up to date.</p><h3>🧠 Make Diagrams Understandable</h3><p>You don’t need to move away from diagrams to embrace agents. Just make them understandable to agents.</p><p>If diagrams are the most valuable part of your architecture documentation, make them readable as code.</p><h3>📝 Use Code-Based Diagrams</h3><p>Tools like Mermaid turn text into diagrams.</p><p>That means agents can read them, reason about them, and even keep them up to date.</p><p>A Mermaid diagram isn’t just documentation — it’s structured context.</p><h3>💡 Why This Matters</h3><p>When your diagrams are code:</p><ul><li>They live with your system</li><li>They evolve with changes (as long as you update them)</li><li>They can be versioned</li><li>They can be generated or modified by agents</li></ul><p>And most importantly, they become a living, usable context.</p><h3>🔄 Keep Them Up to Date</h3><p>Keeping architecture documentation up to date is always a pain. Images make that even harder.</p><p>Code-based diagrams are much easier to keep up to date. Especially when you use agents and the architecture sits next to your code.</p><p>When you make a change, direct the agent to update the architecture documentation as well. Even if you don’t fully trust agents with code changes, architecture documentation is low risk.</p><p>Instead of letting it drift over time, let agents keep it up to date.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e47ea2cfa763" width="1" height="1" alt=""><hr><p><a href="https://itnext.io/coding-agents-cant-see-your-architecture-diagrams-fix-that-e47ea2cfa763">Coding agents can’t see your architecture diagrams — fix that</a> was originally published in <a href="https://itnext.io">ITNEXT</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Most teams put low-level architecture in the wrong place]]></title>
            <link>https://itnext.io/most-teams-put-low-level-architecture-in-the-wrong-place-891b0e75a567?source=rss-96013faddf78------2</link>
            <guid isPermaLink="false">https://medium.com/p/891b0e75a567</guid>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[agentic-ai]]></category>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[technology]]></category>
            <dc:creator><![CDATA[Benjamin Cane]]></dc:creator>
            <pubDate>Thu, 04 Jun 2026 00:00:44 GMT</pubDate>
            <atom:updated>2026-06-13T07:59:27.959Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*iVgdUJ3piGtZBjS7.jpg" /></figure><p>Most teams put low-level architecture in the wrong place, if they document it at all.</p><p>I recently wrote about keeping architecture documentation in Git and making it available to coding agents.</p><p>A common pattern I see is teams maintaining a central architecture repository that spans multiple services and platforms. It’s an approach I use as well, but there’s a nuance.</p><h3>🏯 Architecture Has Layers</h3><p>Good architecture documentation spans multiple levels.</p><p>At a high level, you have:</p><p><strong>Business Architecture</strong> 👨‍💼</p><p>Capabilities, domains, and high-level concepts.</p><p><strong>Solution Architecture</strong> 👩‍🎨</p><p>Mapping capabilities to systems.</p><p>Defining which systems own what.</p><p>What gets replaced.</p><p>What gets invested in.</p><p><strong>System Architecture</strong> 👷</p><p>Services, databases, jobs, infrastructure, and how they interact.</p><p>These three layers belong in a central architecture repository.</p><p>But there is one more layer that many teams forget.</p><h3>🔍 The Missing Layer</h3><p><strong>Component Architecture</strong> 🧱</p><p>This is where architecture stops being abstract and starts becoming actionable.</p><p>Things like:</p><ul><li>Why middleware X was chosen over Y</li><li>How a request flows through a handler</li><li>What interfaces exist and why</li><li>What metrics and tracing are required</li><li>How a feature is expected to behave</li></ul><p>These decisions are too detailed for a central architecture repo-and too important to leave undocumented.</p><h3>📦 Put It in the Codebase</h3><p>Component-level architecture belongs with the code.</p><p>Not in a separate repo, not in a wiki, and certainly not only in tribal knowledge.</p><p>Why does this matter? Because this is where architecture stops being abstract and becomes a specification.</p><p>A specification for engineers, reviewers, and now, coding agents.</p><h3>🤖 Why This Matters for Agents</h3><p>Agents don’t understand your system by osmosis the way human engineers do.</p><p>They only know what you give them. If your architecture decisions live far away from your code, your agent:</p><ul><li>Misses constraints: Uses technologies that aren’t allowed in your environment</li><li>Guesses at design: Assumes REST when you expect event-driven messaging</li><li>Makes inconsistent choices: Pulls in the wrong libraries or dependencies</li></ul><p>But when that context lives in the repo, architecture:</p><ul><li>Evolves with the code</li><li>Is versioned</li><li>Is available at the moment it’s needed</li></ul><h3>🧠 Final Thought</h3><p>I’ve always believed the best engineers don’t just understand one codebase; they learn the end-to-end system.</p><p>The same applies to agents.</p><p>If you want better output from an agent, give it the same level of detail you’d give a senior engineer.</p><p><em>Originally published at </em><a href="https://bencane.com/posts/2026-06-04/"><em>https://bencane.com</em></a><em> on June 4, 2026.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=891b0e75a567" width="1" height="1" alt=""><hr><p><a href="https://itnext.io/most-teams-put-low-level-architecture-in-the-wrong-place-891b0e75a567">Most teams put low-level architecture in the wrong place</a> was originally published in <a href="https://itnext.io">ITNEXT</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Your coding agent is missing one thing: architectural context]]></title>
            <link>https://itnext.io/your-coding-agent-is-missing-one-thing-architectural-context-4d5d33d2110a?source=rss-96013faddf78------2</link>
            <guid isPermaLink="false">https://medium.com/p/4d5d33d2110a</guid>
            <category><![CDATA[artificial-intelligence]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[technology]]></category>
            <dc:creator><![CDATA[Benjamin Cane]]></dc:creator>
            <pubDate>Thu, 28 May 2026 00:00:14 GMT</pubDate>
            <atom:updated>2026-06-06T16:45:48.610Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*o71fQkzE6hVGFsGh" /><figcaption>Photo by <a href="https://unsplash.com/@sxoxm?utm_source=medium&amp;utm_medium=referral">Sven Mieke</a> on <a href="https://unsplash.com?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>Your coding agent is missing one thing: architectural context.</p><p>I’ve been a big believer in Architecture Decision Records ( ADRs) long before coding agents came along.</p><p>Documenting decisions gives engineers context:</p><p>Why is the system designed a certain way? What constraints existed at the time? What tradeoffs were made?</p><p>That context matters. It also matters for agents.</p><h3>🤖 Agents Need Context Too</h3><p>Unlike human engineers, agents don’t get context from hallway conversations, shadowing others, or tribal knowledge.</p><p>They only know what you capture. The best way to capture architectural context? Write it down as a decision record-and make it accessible to agents.</p><p>The only question is, what’s the best way to make decision records accessible?</p><h3>🏗️ Option 1: MCP Server</h3><p>If your ADRs live in a wiki or documentation system, you can expose them through an MCP server.</p><p>This works well when documentation is spread across teams or multiple systems that need to be aggregated.</p><p>You want a unified interface for agents. MCP is a good approach, but it comes with some infrastructure overhead.</p><h3>🧱 Option 2: Keep ADRs in Git</h3><p>I’ve long preferred storing ADRs in Git.</p><p>It provides versioning, review workflows, automated validation, and is where engineering work happens. Storing ADRs in Git, ideally alongside your code, is the fastest way to give agents usable context.</p><p>The challenge is that architecture often spans multiple services and repositories. So many centralize their architecture into a single repository, which is not where your code lives.</p><h3>🌉 Bridging the Gap</h3><p>Most modern coding agents let you include additional directories or sources at runtime, either through slash commands or CLI options.</p><p>That means you can: open your codebase, include your architecture repository, and run the agent with context.</p><p>Just adding another directory gives your agent an understanding of system constraints, architecture decisions, technology choices, and surrounding systems. These are not things an agent can reliably infer from code alone.</p><h3>💡 Final Thought: Why Context Matters</h3><p>With architectural context, agents produce code that aligns with your system.</p><p>When engineers understand the system end to end, they make better decisions. The same applies to agents.</p><p>If you want better results, give better context.</p><p><em>Originally published at </em><a href="https://bencane.com/posts/2026-05-28/"><em>https://bencane.com</em></a><em> on May 28, 2026.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=4d5d33d2110a" width="1" height="1" alt=""><hr><p><a href="https://itnext.io/your-coding-agent-is-missing-one-thing-architectural-context-4d5d33d2110a">Your coding agent is missing one thing: architectural context</a> was originally published in <a href="https://itnext.io">ITNEXT</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Health-check the listener your gRPC traffic actually uses]]></title>
            <link>https://madflojo.medium.com/health-check-the-listener-your-grpc-traffic-actually-uses-60ef491ffd7f?source=rss-96013faddf78------2</link>
            <guid isPermaLink="false">https://medium.com/p/60ef491ffd7f</guid>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[devops]]></category>
            <category><![CDATA[technology]]></category>
            <dc:creator><![CDATA[Benjamin Cane]]></dc:creator>
            <pubDate>Thu, 21 May 2026 00:00:30 GMT</pubDate>
            <atom:updated>2026-06-01T17:31:00.692Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*DJBFlzB4uHGqHIy9" /><figcaption>Photo by <a href="https://unsplash.com/@joshua_chehov?utm_source=medium&amp;utm_medium=referral">Joshua Chehov</a> on <a href="https://unsplash.com?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>One of the easiest ways to break a gRPC service in production is health-checking the wrong listener.</p><p>A common issue I see teams run into when adopting gRPC is leaving readiness checks pointed at their HTTP listener while production traffic actually flows through gRPC.</p><p>Everything looks fine until it suddenly doesn’t.</p><h3>🤔 The Problem</h3><p>Many gRPC services run two listeners: one for HTTP and one for gRPC.</p><p>The HTTP listener often exists for metrics, liveness checks, and management APIs. Teams moving to gRPC often reuse the HTTP health checks they set up for their REST-based services.</p><p>It’s generally a good idea to reuse what you already have, but in this case, it can be misleading.</p><h3>⚠️ Health-Check What Serves Traffic</h3><p>If customers connect through gRPC, your first readiness check should too.</p><p>Your HTTP listener can be perfectly healthy while the gRPC listener is misconfigured, hung, or otherwise failing.</p><p>Meanwhile, Kubernetes, load balancers, and dashboards might all show green. ✅</p><p>This happens more often than people think.</p><h3>🩺 Better Ways to Monitor gRPC</h3><p>There are better ways to monitor your gRPC service.</p><h3>gRPC Health Probe ✅</h3><p>Use a real gRPC health check request against the listener.</p><p>This validates the actual serving path and confirms the service can respond over gRPC.</p><p>A strong default option.</p><h3>Build a Status gRPC Service 📋</h3><p>Expose an internal status method in your gRPC API.</p><p>This gives you flexibility to check deeper dependencies, such as database readiness, downstream systems, internal state, and maintenance toggles.</p><p>It’s more work, but more control.</p><h3>Use a Single Shared Listener ☝️</h3><p>Because gRPC runs on top of HTTP/2, many languages and frameworks can serve HTTP and gRPC traffic on the same listener.</p><p>That means an HTTP health endpoint may be acceptable because it checks the same network path. It still does not fully validate gRPC behavior, but it is better than checking an entirely separate listener.</p><h3>🧠 Final Thoughts</h3><p>gRPC is awesome.</p><p>But making a service production-ready means revisiting configurations inherited from REST services.</p><ul><li>Health checks</li><li>Load balancing behavior</li><li>Connection management</li><li>Contracts</li><li>Operational tooling</li></ul><p>None of these changes are difficult. They’re just easy to miss.</p><p><em>Originally published at </em><a href="https://bencane.com/posts/2026-05-21/"><em>https://bencane.com</em></a><em> on May 21, 2026.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=60ef491ffd7f" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>