<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Zeeshan Ali</title>
    <description>The latest articles on DEV Community by Zeeshan Ali (@zeeshan_ali_0094).</description>
    <link>https://dev.to/zeeshan_ali_0094</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2876428%2Feca53b4b-b6fa-4f21-838d-45cdd140fd3d.png</url>
      <title>DEV Community: Zeeshan Ali</title>
      <link>https://dev.to/zeeshan_ali_0094</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/zeeshan_ali_0094"/>
    <language>en</language>
    <item>
      <title>I Tried to Build a Graph in Rust. Rc and RefCell Were Waiting for Me.</title>
      <dc:creator>Zeeshan Ali</dc:creator>
      <pubDate>Tue, 14 Jul 2026 10:59:20 +0000</pubDate>
      <link>https://dev.to/zeeshan_ali_0094/i-tried-to-build-a-graph-in-rust-rc-and-refcell-were-waiting-for-me-c00</link>
      <guid>https://dev.to/zeeshan_ali_0094/i-tried-to-build-a-graph-in-rust-rc-and-refcell-were-waiting-for-me-c00</guid>
      <description>&lt;p&gt;&lt;a href="https://medium.com/zero-to-rust-go-from-beginner-to-rust-expert/i-tried-to-build-a-graph-in-rust-rc-and-refcell-were-waiting-for-me-bdcaeffa727a?source=rss-b601288787ed------2" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9wqulo9x306salppsat7.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;How Rust’s ownership model pushes you toward index-based graph design&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Part of the Data Structures in Rust series.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A dependency manager is a graph. Package A depends on B, B depends on C, and a circular dependency creates a cycle the package manager has to detect and reject. A routing table is also a graph: each location stores connections to neighbouring locations, and finding the shortest path means traversing those connections efficiently. The data structure underlying both is the same, and implementing it in Rust exposes something worth understanding about how ownership shapes design decisions.&lt;/p&gt;

&lt;p&gt;Pointer-based linked lists are one of the worst fits for Rust’s ownership model because they require nodes to hold mutable links in both directions. Graphs have the same problem, amplified. A graph node can have any number of edges pointing to any other node, including back to itself. There is no hierarchy, no single direction of ownership, no clean parent-child relationship the compiler can reason about statically. Node A might point to Node B, which points to Node C, which points back to Node A.&lt;/p&gt;

&lt;p&gt;Expressing this in Rust forces a choice: reach for Rc&amp;gt; and accept runtime borrow checking, or change the representation entirely and use integer indices into a Vec. The first works for limited cases. The second is how production Rust graph code actually works, and understanding why requires first seeing what goes wrong with the pointer approach.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Rc&amp;gt; approach and what it costs you
&lt;/h2&gt;

&lt;p&gt;A graph node needs to hold edges to other nodes. Since multiple nodes can share ownership of a single node (A points to B and C also points to B), Box is off the table: it enforces single ownership. Rc solves the sharing problem by keeping a reference count and dropping the allocation when that count reaches zero.&lt;/p&gt;

&lt;p&gt;The problem is that graph edges are usually relationships, not ownership relationships. Rc treats every edge as ownership, which is why cycles become memory leaks. After all external references disappear, each node in a cycle still owns the other through its edge list, leaving both reference counts above zero. Neither allocation ever gets cleaned up. Rc is reference counting only, not a cycle-detecting garbage collector.&lt;/p&gt;

&lt;p&gt;Rc is also immutable by default. Mutating the value inside an Rc through a shared reference requires RefCell, which moves the borrow check from compile time to runtime and panics if you violate it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;std&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;rc&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nb"&gt;Rc&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;std&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;cell&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;RefCell&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;NodeRef&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Rc&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;RefCell&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Node&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nd"&gt;#[derive(Debug)]&lt;/span&gt;
&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;Node&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;i32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;edges&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Vec&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;NodeRef&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;impl&lt;/span&gt; &lt;span class="n"&gt;Node&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;i32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;NodeRef&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nn"&gt;Rc&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;RefCell&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Node&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;edges&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nn"&gt;Vec&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="p"&gt;}))&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;Graph&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;nodes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Vec&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;NodeRef&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;impl&lt;/span&gt; &lt;span class="n"&gt;Graph&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;Self&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Graph&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;nodes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nn"&gt;Vec&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;add_node&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;i32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;NodeRef&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Node&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="py"&gt;.nodes&lt;/span&gt;&lt;span class="nf"&gt;.push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;Rc&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;clone&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
        &lt;span class="n"&gt;node&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;add_edge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;NodeRef&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;NodeRef&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;from&lt;/span&gt;&lt;span class="nf"&gt;.borrow_mut&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="py"&gt;.edges&lt;/span&gt;&lt;span class="nf"&gt;.push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;Rc&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;clone&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The memory leak from a cycle:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/zero-to-rust-go-from-beginner-to-rust-expert/i-tried-to-build-a-graph-in-rust-rc-and-refcell-were-waiting-for-me-bdcaeffa727a?source=rss-b601288787ed------2" rel="noopener noreferrer"&gt;Continue reading on Systems Engineering Notes »&lt;/a&gt;&lt;/p&gt;

</description>
      <category>rust</category>
      <category>softwareengineering</category>
      <category>programming</category>
      <category>computerscience</category>
    </item>
    <item>
      <title>I Stopped Reaching for Stack and Queue in Rust. Here Is What I Use Instead</title>
      <dc:creator>Zeeshan Ali</dc:creator>
      <pubDate>Mon, 06 Jul 2026 12:47:47 +0000</pubDate>
      <link>https://dev.to/zeeshan_ali_0094/i-stopped-reaching-for-stack-and-queue-in-rust-here-is-what-i-use-instead-h7h</link>
      <guid>https://dev.to/zeeshan_ali_0094/i-stopped-reaching-for-stack-and-queue-in-rust-here-is-what-i-use-instead-h7h</guid>
      <description>&lt;p&gt;&lt;a href="https://medium.com/zero-to-rust-go-from-beginner-to-rust-expert/i-built-a-stack-and-a-queue-in-rust-then-i-deleted-both-and-used-vec-567c35347650?source=rss-b601288787ed------2" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcmel854r51414cp2a4l3.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Part of the Data Structures in Rust series.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;After the linked list article, where the borrow checker fought every design decision, and the binary tree article, where ownership turned out to fit the structure naturally, I expected the stack and queue to land somewhere in the middle. They did not. The stack was almost insultingly easy. The queue started easy and then revealed a performance trap that the standard library quietly solves for you.&lt;/p&gt;

&lt;p&gt;The real lesson from both data structures is not about ownership or lifetimes. It is about what Rust’s ownership model implicitly encourages through performance characteristics, and why Vec ends up being the right answer for both unless you have a very specific reason to do otherwise.&lt;/p&gt;

&lt;p&gt;The stack&lt;br&gt;
A stack is LIFO: last in, first out. Push something on, pop it off, peek at the top without removing it. The whole thing in Rust:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;Stack&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;elements&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Vec&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;impl&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Stack&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;Self&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Stack&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;elements&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nn"&gt;Vec&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="py"&gt;.elements&lt;/span&gt;&lt;span class="nf"&gt;.push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Option&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="py"&gt;.elements&lt;/span&gt;&lt;span class="nf"&gt;.pop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;peek&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Option&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="py"&gt;.elements&lt;/span&gt;&lt;span class="nf"&gt;.last&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;is_empty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="py"&gt;.elements&lt;/span&gt;&lt;span class="nf"&gt;.is_empty&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;size&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;usize&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="py"&gt;.elements&lt;/span&gt;&lt;span class="nf"&gt;.len&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is the entire implementation. Push appends to the end of the Vec. Pop removes from the end. Both are O(1) amortised. Peek borrows the last element immutably. There is no interesting ownership story here because Vec already owns its elements, and adding or removing from the end never requires touching anything else in the allocation.&lt;/p&gt;

&lt;p&gt;The test suite to verify it behaves correctly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="nd"&gt;#[cfg(test)]&lt;/span&gt;
&lt;span class="k"&gt;mod&lt;/span&gt; &lt;span class="n"&gt;tests&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;


&lt;span class="nd"&gt;#[test]&lt;/span&gt;
    &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;push_and_pop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Stack&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="nf"&gt;.push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="nf"&gt;.push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="nf"&gt;.push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://medium.com/zero-to-rust-go-from-beginner-to-rust-expert/i-built-a-stack-and-a-queue-in-rust-then-i-deleted-both-and-used-vec-567c35347650?source=rss-b601288787ed------2" rel="noopener noreferrer"&gt;Continue reading on Systems Engineering Notes »&lt;/a&gt;&lt;/p&gt;

</description>
      <category>coding</category>
      <category>datastructures</category>
      <category>softwareengineering</category>
      <category>programming</category>
    </item>
    <item>
      <title>Every Architectural Decision Is a Bet on Which Failure You Can Live With</title>
      <dc:creator>Zeeshan Ali</dc:creator>
      <pubDate>Mon, 29 Jun 2026 12:55:11 +0000</pubDate>
      <link>https://dev.to/zeeshan_ali_0094/every-architectural-decision-is-a-bet-on-which-failure-you-can-live-with-35eg</link>
      <guid>https://dev.to/zeeshan_ali_0094/every-architectural-decision-is-a-bet-on-which-failure-you-can-live-with-35eg</guid>
      <description>&lt;p&gt;&lt;a href="https://blog.stackademic.com/every-architectural-decision-is-a-bet-on-which-failure-you-can-live-with-b1b6e7a86560?source=rss-b601288787ed------2" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ficqd05fq8jnytj8b54zm.png" width="800" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At some point in every technical interview, someone will say “it depends on the trade-offs” and then look at you like they have just said something profound. They have not. Saying “it depends on the trade-offs” without being able to name the specific failure each choice produces is roughly equivalent to a doctor saying “medicine has side effects” and then leaving the room. Technically accurate, completely useless, and slightly insulting to everyone present.&lt;/p&gt;

&lt;p&gt;The reason trade-off thinking is hard to teach is that most resources explain it backwards. They start with the options and describe what each one is good at. Kafka is good for high throughput. PostgreSQL is good for strong consistency. MongoDB is good for flexible schemas. This is the comparison table approach, and it produces engineers who can recite characteristics but cannot reason about failure, which is the only thing that actually matters in production.&lt;/p&gt;

&lt;p&gt;The correct starting point is not the options. It is the failure modes.&lt;/p&gt;

&lt;p&gt;Every architectural decision is really a question about which failure you are willing to accept, under what conditions it will appear, and how badly it will hurt when it does. The choice between two reasonable options is always a choice between two different ways your system can break. The skill is knowing which breakage you can recover from and which one ends your evening.&lt;/p&gt;

&lt;h2&gt;
  
  
  A framework that actually works under pressure
&lt;/h2&gt;

&lt;p&gt;Before getting into specific decisions, here is the four-question framework that every trade-off analysis in this series will use. It sounds simple because it is. Simple frameworks survive contact with a whiteboard at 10am when you have not slept well.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What are we optimising for?&lt;/strong&gt; Not in the abstract, but concretely: latency, throughput, consistency, operational simplicity, cost, developer velocity. Pick the thing that actually matters for this system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What are we sacrificing?&lt;/strong&gt; The honest answer to what the first question costs you. Every optimisation trades against something else. Name it explicitly or it will name itself later, in production, at an inconvenient hour.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What breaks first?&lt;/strong&gt; The specific failure mode, the conditions under which it appears, and roughly at what scale or load it becomes a real problem rather than a theoretical one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do we recover?&lt;/strong&gt; The concrete path back to normal. Not “add more servers” but what specifically you add, what the recovery sequence looks like, and whether recovery requires a maintenance window or can happen live.&lt;/p&gt;

&lt;p&gt;The rest of this article uses that framework to walk through the tensions that run through almost every architectural decision. The subsequent pieces in this series apply it to specific choices: Kafka versus RabbitMQ, SQL versus NoSQL, the outbox pattern, saga versus 2PC, sharding, caching, event sourcing. Each one structured around failure, not features.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.stackademic.com/every-architectural-decision-is-a-bet-on-which-failure-you-can-live-with-b1b6e7a86560?source=rss-b601288787ed------2" rel="noopener noreferrer"&gt;Continue reading on Stackademic »&lt;/a&gt;&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>interview</category>
      <category>softwareengineering</category>
      <category>systemdesign</category>
    </item>
    <item>
      <title>Kafka vs RabbitMQ: Which Failure Mode Are You Buying?</title>
      <dc:creator>Zeeshan Ali</dc:creator>
      <pubDate>Sat, 27 Jun 2026 09:46:27 +0000</pubDate>
      <link>https://dev.to/zeeshan_ali_0094/kafka-vs-rabbitmq-which-failure-mode-are-you-buying-1oac</link>
      <guid>https://dev.to/zeeshan_ali_0094/kafka-vs-rabbitmq-which-failure-mode-are-you-buying-1oac</guid>
      <description>&lt;p&gt;&lt;a href="https://blog.stackademic.com/kafka-vs-rabbitmq-which-failure-mode-are-you-buying-b2fa6ae1826c?source=rss-b601288787ed------2" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnsczu38v14ib1l4e5nyy.png" width="800" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Most comparisons between Kafka and RabbitMQ read like a real estate listing. Kafka: high throughput, distributed log, great for streaming. RabbitMQ: flexible routing, low latency, great for task queues. Pick the one that sounds like your problem. The comparison table ends, you make a choice, and six months later you are in an incident call trying to explain to your team why the system is behaving in a way nobody anticipated.&lt;/p&gt;

&lt;p&gt;The comparison table approach fails because it describes what each system does well and leaves out what each system does when things go wrong. That is the only part that matters in production. The previous piece in this series introduced a four-question framework for trade-off thinking: what are we optimising for, what are we sacrificing, what breaks first, and how do we recover. This piece applies that framework to Kafka and RabbitMQ specifically, because the failure modes of these two systems are not just different in degree, they are different in kind, and choosing the wrong one means you inherit a class of problems your architecture was not designed to handle.&lt;/p&gt;

&lt;h2&gt;
  
  
  The thing each system is actually optimising for
&lt;/h2&gt;

&lt;p&gt;Kafka is optimised for retaining events and serving them to multiple independent consumers at high throughput. The core data structure is an append-only log. Producers write to the end of the log. Consumers read from whatever offset they last committed. The log persists based on a retention policy you configure. Nothing gets deleted on consumption. Multiple consumer groups can read the same log independently, each maintaining its own position, completely unaware of each other.&lt;/p&gt;

&lt;p&gt;RabbitMQ is optimised for routing work to the right consumer and confirming that the work was done. The core data structure is a queue. Producers publish to an exchange. The exchange applies routing rules and pushes messages to one or more queues. Consumers pull from queues and send acknowledgements. When a consumer acknowledges a message, the broker deletes it. The queue exists to be emptied.&lt;/p&gt;

&lt;p&gt;These are not different implementations of the same idea. They are different ideas. Kafka is a log that happens to support consumption. RabbitMQ is a work dispatcher that happens to buffer messages while workers are busy. Conflating them because both involve producers and consumers sending data is roughly like conflating a database with a cache because both store data and respond to queries.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.stackademic.com/kafka-vs-rabbitmq-which-failure-mode-are-you-buying-b2fa6ae1826c?source=rss-b601288787ed------2" rel="noopener noreferrer"&gt;Continue reading on Stackademic »&lt;/a&gt;&lt;/p&gt;

</description>
      <category>softwareengineering</category>
      <category>distributedsystems</category>
      <category>systemdesignintervie</category>
      <category>programming</category>
    </item>
    <item>
      <title>Let’s Learn Rust 004: Structs, Enums, and Pattern Matching</title>
      <dc:creator>Zeeshan Ali</dc:creator>
      <pubDate>Mon, 17 Feb 2025 18:53:37 +0000</pubDate>
      <link>https://dev.to/zeeshan_ali_0094/lets-learn-rust-004-structs-enums-and-pattern-matching-8gg</link>
      <guid>https://dev.to/zeeshan_ali_0094/lets-learn-rust-004-structs-enums-and-pattern-matching-8gg</guid>
      <description>&lt;p&gt;&lt;a href="https://medium.com/zero-to-rust-go-from-beginner-to-rust-expert/lets-learn-rust-004-structs-enums-and-pattern-matching-f3d62de69816?source=rss-b601288787ed------2" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1ne1b6nvodd1d4g8o2qq.png" width="800" height="296"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Not a Medium member? Read it here for free&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/zero-to-rust-go-from-beginner-to-rust-expert/lets-learn-rust-004-structs-enums-and-pattern-matching-f3d62de69816?source=rss-b601288787ed------2" rel="noopener noreferrer"&gt;Continue reading on Rust Roadmap: Rust Rookie to Pro! »&lt;/a&gt;&lt;/p&gt;

</description>
      <category>crashcourse</category>
      <category>rustprogramminglangu</category>
      <category>coding</category>
      <category>programming</category>
    </item>
    <item>
      <title>Let’s Learn Rust 003: Ownership, Borrowing, and Lifetimes</title>
      <dc:creator>Zeeshan Ali</dc:creator>
      <pubDate>Mon, 17 Feb 2025 16:24:35 +0000</pubDate>
      <link>https://dev.to/zeeshan_ali_0094/lets-learn-rust-003-ownership-borrowing-and-lifetimes-4i5n</link>
      <guid>https://dev.to/zeeshan_ali_0094/lets-learn-rust-003-ownership-borrowing-and-lifetimes-4i5n</guid>
      <description>&lt;p&gt;&lt;a href="https://medium.com/zero-to-rust-go-from-beginner-to-rust-expert/lets-learn-rust-003-ownership-borrowing-and-lifetimes-aacb2ebc89e9?source=rss-b601288787ed------2" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdy3fleghk1km1pk8cei8.png" width="800" height="619"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Not a medium member yet? Read it here for free&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/zero-to-rust-go-from-beginner-to-rust-expert/lets-learn-rust-003-ownership-borrowing-and-lifetimes-aacb2ebc89e9?source=rss-b601288787ed------2" rel="noopener noreferrer"&gt;Continue reading on Rust Roadmap: Rust Rookie to Pro! »&lt;/a&gt;&lt;/p&gt;

</description>
      <category>crashcourse</category>
      <category>coding</category>
      <category>programming</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>Let’s Learn Rust 002: Setting Up Rust and Writing Your First Program</title>
      <dc:creator>Zeeshan Ali</dc:creator>
      <pubDate>Sat, 15 Feb 2025 15:08:28 +0000</pubDate>
      <link>https://dev.to/zeeshan_ali_0094/lets-learn-rust-002-setting-up-rust-and-writing-your-first-program-5fac</link>
      <guid>https://dev.to/zeeshan_ali_0094/lets-learn-rust-002-setting-up-rust-and-writing-your-first-program-5fac</guid>
      <description>&lt;p&gt;&lt;a href="https://medium.com/zero-to-rust-go-from-beginner-to-rust-expert/lesson-002-setting-up-rust-and-writing-your-first-program-05d83b8f0834?source=rss-b601288787ed------2" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9yzilcdeolf7mqjyurcl.png" width="709" height="438"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Not aMedium Member ? Read it here&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/zero-to-rust-go-from-beginner-to-rust-expert/lesson-002-setting-up-rust-and-writing-your-first-program-05d83b8f0834?source=rss-b601288787ed------2" rel="noopener noreferrer"&gt;Continue reading on Rust Roadmap: Rust Rookie to Pro! »&lt;/a&gt;&lt;/p&gt;

</description>
      <category>coding</category>
      <category>softwaredevelopment</category>
      <category>crashcourse</category>
      <category>rustprogramminglangu</category>
    </item>
    <item>
      <title>Let’s Learn Rust 001 : Safe and Efficient Systems Programming</title>
      <dc:creator>Zeeshan Ali</dc:creator>
      <pubDate>Sat, 15 Feb 2025 13:47:07 +0000</pubDate>
      <link>https://dev.to/zeeshan_ali_0094/lets-learn-rust-001-safe-and-efficient-systems-programming-4i4k</link>
      <guid>https://dev.to/zeeshan_ali_0094/lets-learn-rust-001-safe-and-efficient-systems-programming-4i4k</guid>
      <description>&lt;p&gt;&lt;a href="https://medium.com/zero-to-rust-go-from-beginner-to-rust-expert/lets-learn-rust-001-safe-and-efficient-systems-programming-f9292f119ff9?source=rss-b601288787ed------2" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe1amfbuym2ytauindugm.png" width="545" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Not a Medium member yet? Read it here&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/zero-to-rust-go-from-beginner-to-rust-expert/lets-learn-rust-001-safe-and-efficient-systems-programming-f9292f119ff9?source=rss-b601288787ed------2" rel="noopener noreferrer"&gt;Continue reading on Rust Roadmap: Rust Rookie to Pro! »&lt;/a&gt;&lt;/p&gt;

</description>
      <category>coding</category>
      <category>crashcourse</category>
      <category>rustprogramminglangu</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>How To Build a Sentiment Analysis Model from Scratch Using Python</title>
      <dc:creator>Zeeshan Ali</dc:creator>
      <pubDate>Tue, 11 Feb 2025 17:25:33 +0000</pubDate>
      <link>https://dev.to/zeeshan_ali_0094/how-to-build-a-sentiment-analysis-model-from-scratch-using-python-d54</link>
      <guid>https://dev.to/zeeshan_ali_0094/how-to-build-a-sentiment-analysis-model-from-scratch-using-python-d54</guid>
      <description>&lt;p&gt;&lt;a href="https://medium.com/@zeeshankhan0094/how-to-make-sentiment-analysis-model-with-python-a-practical-guide-4c633880e295?source=rss-b601288787ed------2" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw1vooivva18tn0wnv63k.png" width="800" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Not a Medium member yet? Please read it here&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/@zeeshankhan0094/how-to-make-sentiment-analysis-model-with-python-a-practical-guide-4c633880e295?source=rss-b601288787ed------2" rel="noopener noreferrer"&gt;Continue reading on Medium »&lt;/a&gt;&lt;/p&gt;

</description>
      <category>deeplearning</category>
      <category>python</category>
      <category>artificialintelligen</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>AI Has Already Taken Over: We Have Surrendered Without Even Reaching AGI</title>
      <dc:creator>Zeeshan Ali</dc:creator>
      <pubDate>Mon, 10 Feb 2025 17:12:05 +0000</pubDate>
      <link>https://dev.to/zeeshan_ali_0094/ai-has-already-taken-over-we-have-surrendered-without-even-reaching-agi-1jk1</link>
      <guid>https://dev.to/zeeshan_ali_0094/ai-has-already-taken-over-we-have-surrendered-without-even-reaching-agi-1jk1</guid>
      <description>&lt;p&gt;&lt;a href="https://medium.com/@zeeshankhan0094/ai-has-already-taken-over-we-have-surrendered-without-even-reaching-agi-27e4f89968cc?source=rss-b601288787ed------2" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fip1844hs09wyhx84x0db.jpeg" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We once painted with words, danced with ideas, and found meaning in chaos, now, we ask machines to think for us. Have we surrendered?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/@zeeshankhan0094/ai-has-already-taken-over-we-have-surrendered-without-even-reaching-agi-27e4f89968cc?source=rss-b601288787ed------2" rel="noopener noreferrer"&gt;Continue reading on Medium »&lt;/a&gt;&lt;/p&gt;

</description>
      <category>writing</category>
      <category>culture</category>
      <category>artificialintelligen</category>
      <category>philosophy</category>
    </item>
    <item>
      <title>Artificial General Intelligence: Hype, Reality, and the Road Ahead</title>
      <dc:creator>Zeeshan Ali</dc:creator>
      <pubDate>Sat, 08 Feb 2025 18:45:23 +0000</pubDate>
      <link>https://dev.to/zeeshan_ali_0094/artificial-general-intelligence-hype-reality-and-the-road-ahead-18cn</link>
      <guid>https://dev.to/zeeshan_ali_0094/artificial-general-intelligence-hype-reality-and-the-road-ahead-18cn</guid>
      <description>&lt;p&gt;&lt;a href="https://medium.com/@zeeshankhan0094/artificial-general-intelligence-hype-reality-and-the-road-ahead-4c8b4517fafe?source=rss-b601288787ed------2" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg5mq2819j25wcd77eswe.jpeg" width="800" height="546"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;AGI has long been the holy grail of AI, but how close are we really? This article explores the evolution of AI and why its AGI is a myth.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/@zeeshankhan0094/artificial-general-intelligence-hype-reality-and-the-road-ahead-4c8b4517fafe?source=rss-b601288787ed------2" rel="noopener noreferrer"&gt;Continue reading on Medium »&lt;/a&gt;&lt;/p&gt;

</description>
      <category>technology</category>
      <category>artificialintelligen</category>
      <category>machinelearning</category>
      <category>deeplearning</category>
    </item>
    <item>
      <title>Building a Face Recognition System with TensorFlow and Keras: A Complete Guide</title>
      <dc:creator>Zeeshan Ali</dc:creator>
      <pubDate>Thu, 06 Feb 2025 21:33:38 +0000</pubDate>
      <link>https://dev.to/zeeshan_ali_0094/building-a-face-recognition-system-with-tensorflow-and-keras-a-complete-guide-4128</link>
      <guid>https://dev.to/zeeshan_ali_0094/building-a-face-recognition-system-with-tensorflow-and-keras-a-complete-guide-4128</guid>
      <description>&lt;p&gt;&lt;a href="https://medium.com/@zeeshankhan0094/building-a-face-recognition-system-with-tensorflow-and-keras-a-complete-guide-51a76d2f75fc?source=rss-b601288787ed------2" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkpomfd5n0a6dvfms49iq.jpeg" width="600" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Introduction&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/@zeeshankhan0094/building-a-face-recognition-system-with-tensorflow-and-keras-a-complete-guide-51a76d2f75fc?source=rss-b601288787ed------2" rel="noopener noreferrer"&gt;Continue reading on Medium »&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>python</category>
      <category>machinelearning</category>
      <category>tensorflow</category>
    </item>
  </channel>
</rss>
