<?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:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Aafaq Zahid]]></title><description><![CDATA[Building infrastructure where correctness isn't optional. Protocol design, Go systems, and AI architecture — written from production experience.]]></description><link>https://aafaqzahid.substack.com</link><image><url>https://substackcdn.com/image/fetch/$s_!wG3j!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0f8b1ff-fdb2-4e8d-9943-4a666c287795_608x608.png</url><title>Aafaq Zahid</title><link>https://aafaqzahid.substack.com</link></image><generator>Substack</generator><lastBuildDate>Wed, 10 Jun 2026 03:04:32 GMT</lastBuildDate><atom:link href="https://aafaqzahid.substack.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Aafaq Zahid]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[aafaqzahid@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[aafaqzahid@substack.com]]></itunes:email><itunes:name><![CDATA[Aafaq Zahid]]></itunes:name></itunes:owner><itunes:author><![CDATA[Aafaq Zahid]]></itunes:author><googleplay:owner><![CDATA[aafaqzahid@substack.com]]></googleplay:owner><googleplay:email><![CDATA[aafaqzahid@substack.com]]></googleplay:email><googleplay:author><![CDATA[Aafaq Zahid]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[I built a Go microservices framework in 2017. ]]></title><description><![CDATA[Here's what 8 years of production taught it.]]></description><link>https://aafaqzahid.substack.com/p/i-built-a-go-microservices-framework</link><guid isPermaLink="false">https://aafaqzahid.substack.com/p/i-built-a-go-microservices-framework</guid><dc:creator><![CDATA[Aafaq Zahid]]></dc:creator><pubDate>Sat, 06 Jun 2026 00:11:41 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!wG3j!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0f8b1ff-fdb2-4e8d-9943-4a666c287795_608x608.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In 2017 I was maintaining a Node.js ecommerce server when a new project landed on my desk &#8212; an IoT platform for vehicle tracking devices. Thousands of devices, transmitting data continuously, with clients expecting real-time visibility into what the devices were reporting.</p><p>The Node.js server started showing its limits almost immediately.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://aafaqzahid.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>Too many devices, too much real-time data, not enough throughput. Clients were seeing delays. Data was arriving late. The storage layer was struggling so badly the team was deleting the previous month&#8217;s data every 30 days just to keep things running. And underneath all of it was a monolith &#8212; one large server doing everything, with no clean way to scale the parts that were struggling without scaling everything.</p><p>We needed microservices. We needed speed. We needed something built for this.</p><div><hr></div><h2><strong>Why Go</strong></h2><p>I came to Go from C++ &#8212; not from Python or Ruby or JavaScript. I had spent years in structured, compiled languages where you thought carefully about types, memory, and concurrency before you wrote a line. Node.js had been a detour. Java had been a year. Go felt like coming home.</p><p>Go was young in 2017. The community was smaller. The ecosystem was thinner. But Google was behind it, the community was growing fast, and the performance characteristics were exactly what the IoT platform needed &#8212; compiled, concurrent, fast.</p><p>The decision was straightforward. The harder question was: how do you structure a Go microservices system from scratch?</p><div><hr></div><h2><strong>The go-micro problem</strong></h2><p>The obvious answer was go-micro &#8212; the most complete Go microservices framework available at the time. I tried it. It worked. But it felt like too much.</p><p>go-micro has service discovery, plugins, a full RPC system, and abstractions for everything. For a team that needed to move fast on a real-time IoT system, it felt like learning a new language on top of a new language. The cognitive overhead was real.</p><p>What I actually needed was simpler. Some services needed to process messages from a queue. Some needed to respond without a queue at all &#8212; pure fire and forget. Some needed HTTP. Some needed raw socket connections for the devices. The system needed to be modular but not complicated.</p><p>go-micro could do all of this. But I kept feeling like I was fighting the framework instead of building the product.</p><p>So I stopped fighting it and started building my own.</p><div><hr></div><h2><strong>The first version</strong></h2><p>The first version of Keel was almost embarrassingly simple. One main file. One config file. A way to define multiple services and run them inside a single Docker container.</p><p>The core idea: every service registers itself, the framework boots the right one based on a flag, and each service gets access to whatever it needs &#8212; HTTP, sockets, database, messaging &#8212; through a shared configuration and lifecycle system.</p><pre><code><code>
one binary

one config

multiple services

boot the one you need

</code></code></pre><p>That was it. No magic. No service discovery. No plugins. Just a clean way to structure a Go microservices project so you didn&#8217;t have to rebuild the foundation every time you added a service.</p><p>The first services I built with it handled socket connections for the IoT devices. Raw TCP and <a href="http://socket.io/">Socket.IO</a>, managed through the same lifecycle system, sharing the same configuration and database connections.</p><p>It worked. So I kept building on top of it.</p><div><hr></div><h2><strong>Kafka to NATS</strong></h2><p>The first messaging system I wired into Keel was Kafka. It made sense at the time &#8212; Kafka was the standard for high-volume event streaming and the IoT platform was generating significant data volumes.</p><p>But Kafka was heavy. The operational overhead was real. And then I found NATS &#8212; a Go-native messaging system, lightweight, fast, and surprisingly simple to adopt.</p><p>The switch was straightforward. NATS gave me everything I needed &#8212; Pub/Sub for fire-and-forget event distribution, RPC for request/reply between services &#8212; without the operational weight of Kafka. I&#8217;ve used NATS in every project since.</p><div><hr></div><h2><strong>Eight years of production problems, codified</strong></h2><p>The first version of Keel solved one problem. Every project after that added another layer.</p><p>The ecommerce project needed pagination &#8212; three different kinds of it, as it turned out: standard pagination, SQL pagination, and aggregate pagination for complex MongoDB queries. So I built all three into Keel.</p><p>A healthcare project needed FHIR compliance and soft deletes &#8212; records that were logically removed but never physically deleted from the database. So I built soft delete into the database layer, routing deleted records to <code>_deleted</code> collections automatically with <code>deletedAt</code> and <code>deletedBy</code> fields.</p><p>A social platform needed real-time features &#8212; <a href="http://socket.io/">Socket.IO</a> rooms, broadcast to users, broadcast to rooms, custom events. So I built the <a href="http://socket.io/">Socket.IO</a> server into Keel&#8217;s lifecycle system alongside HTTP.</p><p>A fintech project needed reliability guarantees &#8212; circuit breakers, health checks, readiness probes. So those went in too.</p><p>Every production problem that appeared in one project became a solved problem in the next one. Eight years of this, across multiple companies and industries, and Keel became something I no longer thought of as a framework. It was just how I built Go services.</p><div><hr></div><h2><strong>What Keel is today</strong></h2><p>Register a service. Implement two methods. Boot.</p><pre><code><code>
func init() {

    servicehandler.Register(&#8221;myservice&#8221;, func() servicehandler.ServiceBase {

        return &amp;MyService{}

    })

}

func (s *MyService) Run() error {

    // your service logic here

    return nil

}

func (s *MyService) Stop() {

    // graceful shutdown

}

</code></code></pre><p>That&#8217;s three methods. Everything else is configuration.</p><p>From that starting point, your service has access to:</p><p>HTTP routing through Gin with middleware tiers. Auto-generated OpenAPI/Swagger documentation. Built-in <code>/health</code> and version endpoints. API validation with human-readable error messages.</p><p>Three database drivers &#8212; MongoDB, MySQL, PostgreSQL &#8212; with a rich operation set including soft delete, index management, migrations, and three flavors of pagination. Redis caching and distributed locking. Meilisearch full-text search.</p><p>NATS messaging &#8212; Pub/Sub, RPC, topic registry, batched event publishing. <a href="http://socket.io/">Socket.IO</a> with rooms, broadcasts, and custom events.</p><p>Circuit breakers. Health checks with readiness/liveness/startup probes. OpenTelemetry distributed tracing. Structured logging with zap. Structured errors with trace IDs.</p><p>FCM push notifications. Email via gomail. WhatsApp notifications. All behind a common interface with concurrency limits.</p><p>Panic recovery on every goroutine. Graceful shutdown on SIGINT/SIGTERM. Multi-service single binary with no shared global state.</p><p>A new service, from zero, in under five minutes. Independently verified by Claude Sonnet in Cursor.</p><div><hr></div><h2><strong>Why I&#8217;m open sourcing it now</strong></h2><p>Keel has lived inside private repositories for eight years. Every company I&#8217;ve worked with has used it. Every system I&#8217;ve built has run on it. It has handled millions of daily requests across IoT platforms, fintech systems, healthcare infrastructure, and social platforms.</p><p>I kept it private not out of secrecy but out of inertia. It was an internal tool. It worked. There was always something more urgent to build.</p><p>But an internal tool that solves real problems is more useful as a public one. If you&#8217;re building Go microservices and you&#8217;re tired of wiring the same fifteen things from scratch every time &#8212; Keel exists because I was tired of that too.</p><p>&#128073; <a href="https://github.com/glodb/keel">github.com/glodb/keel</a></p><p>&#128073; <a href="https://github.com/glodb/keel-code">keel-code</a> &#8212; a complete working example</p><div><hr></div><p><em>Aafaq Zahid is a software architect and founding engineer who has been building distributed systems and production infrastructure for 17 years. Creator of Keel and DBFusion. Previously wrote about designing a custom UDP protocol for 18,000 IoT devices.</em></p><p><em>LinkedIn: <a href="http://linkedin.com/in/aafaqzahid">linkedin.com/in/aafaqzahid</a></em></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://aafaqzahid.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[When TCP failed for IoT, I wrote a new protocol]]></title><description><![CDATA[We were losing time.]]></description><link>https://aafaqzahid.substack.com/p/when-tcp-failed-for-iot-i-wrote-a</link><guid isPermaLink="false">https://aafaqzahid.substack.com/p/when-tcp-failed-for-iot-i-wrote-a</guid><dc:creator><![CDATA[Aafaq Zahid]]></dc:creator><pubDate>Wed, 03 Jun 2026 09:36:31 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!pxa_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e0cc4cc-e24b-4ec9-badb-772cdc383d30_1266x754.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://aafaqzahid.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://aafaqzahid.substack.com/subscribe?"><span>Subscribe now</span></a></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!pxa_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e0cc4cc-e24b-4ec9-badb-772cdc383d30_1266x754.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pxa_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e0cc4cc-e24b-4ec9-badb-772cdc383d30_1266x754.png 424w, https://substackcdn.com/image/fetch/$s_!pxa_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e0cc4cc-e24b-4ec9-badb-772cdc383d30_1266x754.png 848w, https://substackcdn.com/image/fetch/$s_!pxa_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e0cc4cc-e24b-4ec9-badb-772cdc383d30_1266x754.png 1272w, https://substackcdn.com/image/fetch/$s_!pxa_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e0cc4cc-e24b-4ec9-badb-772cdc383d30_1266x754.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pxa_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e0cc4cc-e24b-4ec9-badb-772cdc383d30_1266x754.png" width="1266" height="754" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5e0cc4cc-e24b-4ec9-badb-772cdc383d30_1266x754.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:754,&quot;width&quot;:1266,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:47112,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://aafaqzahid.substack.com/i/200417623?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95ab650a-88b0-4507-a60f-8243a5c5b900_1266x907.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!pxa_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e0cc4cc-e24b-4ec9-badb-772cdc383d30_1266x754.png 424w, https://substackcdn.com/image/fetch/$s_!pxa_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e0cc4cc-e24b-4ec9-badb-772cdc383d30_1266x754.png 848w, https://substackcdn.com/image/fetch/$s_!pxa_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e0cc4cc-e24b-4ec9-badb-772cdc383d30_1266x754.png 1272w, https://substackcdn.com/image/fetch/$s_!pxa_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e0cc4cc-e24b-4ec9-badb-772cdc383d30_1266x754.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>We were losing time.</p><p>Not seconds. Not packets. <strong>Minutes.</strong> Sometimes 20 minutes of data. Sometimes 40. Vanishing completely, with no way to recover it.</p><p>We were building an IoT telemetry framework for a fleet of vehicles. Cars moving through cities, highways, tunnels, rural areas &#8212; transmitting a continuous stream of sensor data back to our servers. The kind of system where every data point matters. Where gaps in the record are not acceptable.</p><p>The culprit, after thorough debugging, was TCP.</p><p>Not a bug in our code. Not a misconfiguration. TCP itself &#8212; the protocol that powers the entire internet &#8212; was simply not designed for what we were asking it to do.</p><h3>1. The problem with TCP at the edge</h3><p>TCP was built for reliable, persistent connections. When a connection drops, TCP doesn&#8217;t gracefully degrade &#8212; it crashes. And when it crashes on a constrained IoT device, it loses its entire in-memory buffer. Every packet that was queued and waiting to be sent: gone. Unrecoverable.</p><p>In urban areas with consistent coverage, this wasn&#8217;t a problem. But IoT devices don't operate in ideal conditions. They go through dead zones. They operate in basements, tunnels, remote areas &#8212; anywhere connectivity is intermittent or completely absent for extended periods.</p><p>Every time a device lost signal and TCP crashed, we lost everything buffered since the last successful transmission. That&#8217;s how you lose 40 minutes of data. Not one catastrophic failure &#8212; dozens of small ones, each silently swallowing its buffer.</p><p>The standard engineering answer would have been to patch around it. Add retry logic. Increase buffer sizes. Hope for better coverage.</p><p>I went a level deeper.</p><h3>2. Designing from first principles</h3><p> The question I asked was: what would a transport protocol look like if it was designed specifically for intermittent connectivity on constrained hardware?</p><p>At the time, Google was developing QUIC &#8212; a UDP-based protocol designed to address TCP&#8217;s limitations. It was still in early development. I was arriving at similar problems from a completely different direction, on completely different hardware, for a completely different use case.</p><p>The principles I arrived at independently:</p><ul><li><p><strong>One session per device &#8212; like QUIC</strong></p><p>Rather than re-establishing connections on every reconnect, the protocol maintains a single persistent logical session per device. The session survives network interruptions. The transport layer going down does not mean the application layer loses state.</p></li><li><p><strong>The queue lives on hardware, not in the transport layer</strong> This was the core insight. TCP&#8217;s vulnerability is that its buffer lives in the transport layer &#8212; when TCP crashes, the buffer goes with it. In RUDP, every outgoing message is written to a persistent queue in device hardware memory before transmission. The queue is the source of truth. The network is just the delivery mechanism.</p><p>If the network goes down for 4 hours, the queue holds. When connectivity returns, transmission resumes from exactly where it left off. Nothing is lost because nothing was ever only in memory.</p></li><li><p><strong>Packet numbering with NACK/SYN acknowledgment</strong> Every packet carries a sequence number. The server tracks receipt and sends two types of signals back to the client:</p><ul><li><p><strong>SYN</strong> &#8212; &#8220;I have received and persisted everything up to packet N.&#8221; The client receives this and safely removes all packets up to N from its hardware queue, freeing space.</p></li><li><p><strong>NACK</strong> &#8212; &#8220;I received packets 1&#8211;10 and 15, but packets 11&#8211;14 are missing.&#8221; The client retransmits only the missing range.</p></li></ul></li></ul><p>This two-signal system gives you guaranteed delivery without unbounded queue growth. The device knows exactly what has been safely received and can reclaim hardware memory accordingly.</p><h3>3. BitPacking for communication efficiency </h3><p>Every byte matters on constrained hardware transmitting continuously. The protocol uses BitPacking &#8212; encoding data at the bit level rather than the byte level &#8212; to minimise payload size before transmission. Less data on the wire means less to retransmit, lower latency, and lower power consumption. </p><h3>Building it</h3><p>The protocol was designed and implemented in Go. The full implementation &#8212; client-side queue management, packet numbering, NACK/SYN handling, BitPacking, and server-side receipt tracking &#8212; was built and then tested and hardened across the full fleet over two to three months.</p><p>I built it alone.</p><h3>The result</h3><p>40 minutes of data loss: <strong>zero.</strong></p><p>The system became faster than it had been before &#8212; not just more reliable. BitPacking reduced payload sizes enough that transmission throughput improved even as reliability guarantees increased.</p><p>IoT devices. Continuous operation. Hostile network conditions. Zero data loss.</p><h3>What this taught me</h3><p>The lesson is not specific to IoT or transport protocols. It generalises.</p><p><strong>Never trust the layer beneath you.</strong> Design for failure as the default, not the exception. If your system&#8217;s correctness depends on a layer it doesn&#8217;t control behaving correctly, your system is fragile. Build the guarantee into your own layer.</p><p>This principle has shaped how I think about every system since &#8212; from transport protocols to AI infrastructure, from IoT telemetry to protocol-level policy enforcement. The question is always the same: what happens when the thing beneath me fails, and have I designed for that case explicitly?</p><p>TCP wasn&#8217;t wrong. It was designed for a different world. The right response wasn&#8217;t to blame TCP &#8212; it was to understand the problem deeply enough to design something better suited to the actual conditions.</p><p>That&#8217;s the only kind of engineering that lasts.<br><br>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br><em>Aafaq Zahid is a software architect and founding engineer specialising in protocol-level systems, custom transport protocols, and AI infrastructure. He has founded and led engineering at multiple technology companies. This protocol was designed and built in 2017.</em></p><p><em>LinkedIn: linkedin.com/in/aafaqzahid</em></p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://aafaqzahid.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Aafaq Zahid! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item></channel></rss>