<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>Alain Delon&#39;s Blog - programming</title>
    <subtitle>Place where I share my thoughts and findings</subtitle>
    <link rel="self" type="application/atom+xml" href="https://alaindelon.pages.dev/tags/programming/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://alaindelon.pages.dev"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-09-08T00:00:00+00:00</updated>
    <id>https://alaindelon.pages.dev/tags/programming/atom.xml</id>
    <entry xml:lang="en">
        <title>How Learning Rust Ruined Other Languages for Me</title>
        <published>2026-09-08T00:00:00+00:00</published>
        <updated>2026-09-08T00:00:00+00:00</updated>
        
        <author>
          <name>Alain Delon</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://alaindelon.pages.dev/blog/why-rust-ruined-other-languages/"/>
        <id>https://alaindelon.pages.dev/blog/why-rust-ruined-other-languages/</id>
        
        <content type="html" xml:base="https://alaindelon.pages.dev/blog/why-rust-ruined-other-languages/">&lt;p&gt;Every developer warns you about the borrow checker. They tell you about the steep learning curve, the hours spent wrestling with lifetimes, and the sheer frustration of a compiler that refuses to build code you &lt;em&gt;know&lt;/em&gt; should technically run.&lt;/p&gt;
&lt;p&gt;What they don’t tell you is what happens &lt;strong&gt;after&lt;/strong&gt; the concepts finally click: Rust ruins other languages for you.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;1-option-t-and-the-absence-of-null&quot;&gt;1. &lt;code&gt;Option&amp;lt;T&amp;gt;&lt;/code&gt; and the Absence of Null&lt;/h3&gt;
&lt;p&gt;Tony Hoare famously referred to null references as his “billion-dollar mistake.” In Python, TypeScript, or Go, you are constantly checking if something is &lt;code&gt;None&lt;/code&gt;, &lt;code&gt;null&lt;/code&gt;, or &lt;code&gt;nil&lt;/code&gt;. If you miss one check, your code blows up at runtime in production:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#000000, #E6EDF3); background-color: light-dark(#FFFFFF, #0D1117);&quot; &gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#008000, #8B949E);&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color: light-dark(#008000, #8B949E);&quot;&gt; Looks innocent until user is None&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;email&lt;/span&gt;&lt;span style=&quot;color: light-dark(#000000, #FF7B72);&quot;&gt; =&lt;/span&gt;&lt;span&gt; user&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;profile&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;get_email&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In Rust, null values simply don’t exist. If an operation can fail or produce an empty result, the compiler forces you to represent it as an &lt;code&gt;Option&amp;lt;T&amp;gt;&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#000000, #E6EDF3); background-color: light-dark(#FFFFFF, #0D1117);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#0000FF, #FF7B72);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#795E26, #D2A8FF);&quot;&gt; find_user&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#001080, #E6EDF3);&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color: light-dark(#000000, #FF7B72);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#267F99, #FFA657);&quot;&gt; u64&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#000000, #FF7B72);&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#267F99, #FFA657);&quot;&gt; Option&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#267F99, #FFA657);&quot;&gt;User&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#008000, #8B949E);&quot;&gt;    //&lt;/span&gt;&lt;span style=&quot;color: light-dark(#008000, #8B949E);&quot;&gt; ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#AF00DB, #FF7B72);&quot;&gt;match&lt;/span&gt;&lt;span style=&quot;color: light-dark(#795E26, #D2A8FF);&quot;&gt; find_user&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#098658, #79C0FF);&quot;&gt;42&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#267F99, #FFA657);&quot;&gt;    Some&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#001080, #E6EDF3);&quot;&gt;user&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#000000, #FF7B72);&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#795E26, #D2A8FF);&quot;&gt; println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#A31515, #A5D6FF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#A31515, #A5D6FF);&quot;&gt;Found: &lt;/span&gt;&lt;span style=&quot;color: light-dark(#A31515, #A5D6FF);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#A31515, #A5D6FF);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#A31515, #A5D6FF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#001080, #E6EDF3);&quot;&gt; user&lt;/span&gt;&lt;span style=&quot;color: light-dark(#000000, #FF7B72);&quot;&gt;.&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#267F99, #FFA657);&quot;&gt;    None&lt;/span&gt;&lt;span style=&quot;color: light-dark(#000000, #FF7B72);&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#795E26, #D2A8FF);&quot;&gt; println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#A31515, #A5D6FF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#A31515, #A5D6FF);&quot;&gt;User not found&lt;/span&gt;&lt;span style=&quot;color: light-dark(#A31515, #A5D6FF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You physically cannot forget to handle the empty state. If you try to use &lt;code&gt;user&lt;/code&gt; without unwrapping or matching it, the compiler halts the build.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;2-error-handling-as-a-first-class-citizen&quot;&gt;2. Error Handling as a First-Class Citizen&lt;/h3&gt;
&lt;p&gt;In languages that rely on &lt;code&gt;try/catch&lt;/code&gt; exceptions, any function call is an invisible landmine. Does &lt;code&gt;parse_config()&lt;/code&gt; throw a &lt;code&gt;FileNotFoundError&lt;/code&gt;? A &lt;code&gt;PermissionDeniedError&lt;/code&gt;? You often have to read the source code or trust out-of-date documentation to find out.&lt;/p&gt;
&lt;p&gt;Rust uses &lt;code&gt;Result&amp;lt;T, E&amp;gt;&lt;/code&gt;. A function’s signature declares its failure modes explicitly:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#000000, #E6EDF3); background-color: light-dark(#FFFFFF, #0D1117);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#0000FF, #FF7B72);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#795E26, #D2A8FF);&quot;&gt; read_port&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#001080, #E6EDF3);&quot;&gt;path&lt;/span&gt;&lt;span style=&quot;color: light-dark(#000000, #FF7B72);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#000000, #FF7B72);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#267F99, #FFA657);&quot;&gt;Path&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#000000, #FF7B72);&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#267F99, #FFA657);&quot;&gt; Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#267F99, #FFA657);&quot;&gt;u16&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#267F99, #FFA657);&quot;&gt; ConfigError&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;With the &lt;code&gt;?&lt;/code&gt; operator, bubbling up errors becomes clean without masking what could actually go wrong:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#000000, #E6EDF3); background-color: light-dark(#FFFFFF, #0D1117);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#0000FF, #FF7B72);&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: light-dark(#001080, #E6EDF3);&quot;&gt; config_str&lt;/span&gt;&lt;span style=&quot;color: light-dark(#000000, #FF7B72);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#267F99, #FFA657);&quot;&gt; fs&lt;/span&gt;&lt;span style=&quot;color: light-dark(#000000, #FF7B72);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#795E26, #D2A8FF);&quot;&gt;read_to_string&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#001080, #E6EDF3);&quot;&gt;path&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#000000, #FF7B72);&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#0000FF, #FF7B72);&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: light-dark(#001080, #E6EDF3);&quot;&gt; port&lt;/span&gt;&lt;span style=&quot;color: light-dark(#000000, #FF7B72);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#267F99, #FFA657);&quot;&gt; u16&lt;/span&gt;&lt;span style=&quot;color: light-dark(#000000, #FF7B72);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#001080, #E6EDF3);&quot;&gt; config_str&lt;/span&gt;&lt;span style=&quot;color: light-dark(#000000, #FF7B72);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#795E26, #D2A8FF);&quot;&gt;trim&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#000000, #FF7B72);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#795E26, #D2A8FF);&quot;&gt;parse&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#000000, #FF7B72);&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;3-fearless-concurrency&quot;&gt;3. Fearless Concurrency&lt;/h3&gt;
&lt;p&gt;Data races in concurrent code are notoriously brutal to debug. They happen sporadically under load, resist reproduction in test environments, and rarely leave a clear stack trace.&lt;/p&gt;
&lt;p&gt;In Rust, shared mutable state across threads is forbidden at compile time:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If data needs to cross threads, it must implement &lt;code&gt;Send&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;If data needs to be referenced across threads simultaneously, it must implement &lt;code&gt;Sync&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;You cannot mutate data shared between threads without a thread-safe wrapper like &lt;code&gt;Mutex&amp;lt;T&amp;gt;&lt;/code&gt; or &lt;code&gt;RwLock&amp;lt;T&amp;gt;&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The moment you attempt a data race, the compiler stops you.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;the-takeaway&quot;&gt;The Takeaway&lt;/h3&gt;
&lt;p&gt;Writing Rust can feel slower upfront because you spend your time satisfying the compiler rather than writing logic. But once a binary compiles, it rarely breaks.&lt;/p&gt;
&lt;p&gt;Returning to languages where functions return invisible nulls, throw untyped exceptions, and allow unchecked mutation suddenly feels like walking a tightrope without a net.&lt;/p&gt;
</content>
        
    </entry>
</feed>
