<?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>Forem: Farzon Lotfi</title>
    <description>The latest articles on Forem by Farzon Lotfi (@farzon).</description>
    <link>https://forem.com/farzon</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3905500%2F257581e2-e414-41a3-84dc-12b4ba630fa3.jpeg</url>
      <title>Forem: Farzon Lotfi</title>
      <link>https://forem.com/farzon</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/farzon"/>
    <language>en</language>
    <item>
      <title>The Geometry of Dragon Ball: A Deep Dive into SDFs and Raymarching</title>
      <dc:creator>Farzon Lotfi</dc:creator>
      <pubDate>Sat, 02 May 2026 09:00:00 +0000</pubDate>
      <link>https://forem.com/farzon/the-geometry-of-dragon-ball-a-deep-dive-into-sdfs-and-raymarching-19o9</link>
      <guid>https://forem.com/farzon/the-geometry-of-dragon-ball-a-deep-dive-into-sdfs-and-raymarching-19o9</guid>
      <description>&lt;p&gt;Today we are deconstructing the 4-Star Dragon Ball shader  (available on &lt;a href="https://www.shadertoy.com/view/7c2SWc" rel="noopener noreferrer"&gt;Shadertoy here&lt;/a&gt;). This shader is a good example of using 2D math to drive 3D optical effects. To understand it, we must reference the fundamental building blocks provided by &lt;strong&gt;&lt;a href="https://iquilezles.org/" rel="noopener noreferrer"&gt;Inigo Quilez&lt;/a&gt;&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;This shader is more than just a piece of fan art. I built this &lt;a href="https://www.shadertoy.com/view/7c2SWc" rel="noopener noreferrer"&gt;4-Star Dragon Ball shader&lt;/a&gt; as a bridge between simple 2D shapes and complex 3D optics. If you’re looking for an introductory shader to study, this is a perfect playground because it moves past "drawing a box" and dives into how light behaves. What makes this unique as a case study is the Double March. We are treating the sphere as a physical lens. Once you hit the "glass," the shader calculates a bent path and starts a second march inside. It’s my attempt at playing with coordinate transformation. &lt;/p&gt;

&lt;p&gt;&lt;a href="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%2Fssjfkdaydjece2885bcx.png" class="article-body-image-wrapper"&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%2Fssjfkdaydjece2885bcx.png" alt="The 4 star ball with Caustics" width="320" height="181"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Defining the Stars (2D SDFs)
&lt;/h2&gt;

&lt;p&gt;The internal stars are defined using 2D Signed Distance Functions. an SDF is a function that takes a point in space and returns the distance to the nearest surface.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If the distance is &lt;strong&gt;positive&lt;/strong&gt; , you are outside the object.&lt;/li&gt;
&lt;li&gt;If the distance is &lt;strong&gt;negative&lt;/strong&gt; , you are inside.&lt;/li&gt;
&lt;li&gt;If it is &lt;strong&gt;zero&lt;/strong&gt; , you are exactly on the surface.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This allows us to define perfect geometric shapes without textures. The specific star logic used here, &lt;code&gt;sdStar5&lt;/code&gt;, is a direct implementation of Quilez's formulas found in his &lt;a href="https://iquilezles.org/articles/distfunctions2d/" rel="noopener noreferrer"&gt;2D Distance Functions&lt;/a&gt; article.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight glsl"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Helper to map the 4 stars in 2D&lt;/span&gt;
&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="nf"&gt;map4Stars2D&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;vec2&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;offset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;radius&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;d1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sdStar5&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="kt"&gt;vec2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;offset&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;offset&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;radius&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;d2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sdStar5&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="kt"&gt;vec2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;offset&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;offset&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;radius&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;d3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sdStar5&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="kt"&gt;vec2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;offset&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;offset&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;radius&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;d4&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sdStar5&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="kt"&gt;vec2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;offset&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;offset&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;radius&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d4&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// Union of all four stars&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. Extrusion and 3D Modeling
&lt;/h2&gt;

&lt;p&gt;To turn these flat stars into 3D geometry inside the sphere, we use &lt;strong&gt;&lt;a href="https://ansyshelp.ansys.com/public/account/secured?returnurl=/Views/Secured/corp/v251/en/poly_pftut/pf_train_3d-extru.html" rel="noopener noreferrer"&gt;Extrusion&lt;/a&gt;&lt;/strong&gt;. By combining the 2D distance with the Z-axis, we create a volumetric shape. This technique, along with the rounding (beveling) seen in the code, is detailed in Quilez’s &lt;a href="https://iquilezles.org/articles/distfunctions/" rel="noopener noreferrer"&gt;3D Distance Functions&lt;/a&gt; article.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight glsl"&gt;&lt;code&gt;&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="nf"&gt;mapStars3D&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;vec3&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;d2d&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;map4Stars2D&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xy&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kt"&gt;vec2&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;vec2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d2d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mo"&gt;04&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// abs(p.z) defines thickness&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mo"&gt;015&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;h2&gt;
  
  
  3. The Raymarching Engine
&lt;/h2&gt;

&lt;p&gt;How does the computer "see" these math functions? For a short intro think of it this way. Since we don't have triangles, we can't use standard rasterization. Instead, we use &lt;strong&gt;&lt;a href="https://en.wikipedia.org/wiki/Ray_marching" rel="noopener noreferrer"&gt;Raymarching&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Imagine firing a ray from your eye through every pixel. Instead of moving in tiny constant steps, the ray "leaps" forward by the distance returned by our SDF. Because the SDF tells us the distance to the &lt;em&gt;nearest&lt;/em&gt; object, we know it's safe to move that far without hitting anything. We repeat this until the distance is nearly zero (a hit!) or we've gone too far (a miss).&lt;/p&gt;

&lt;p&gt;For a full deep dive into the algorithm that powers almost every modern Shadertoy, read Quilez's &lt;a href="https://iquilezles.org/articles/raymarchingdf/" rel="noopener noreferrer"&gt;Raymarching Distance Fields&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;In our code, this is the loop that "steps" through space until it finds the sphere or the floor.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight glsl"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;MAX_STEPS&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ro&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;rd&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;dO&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Current position along the ray&lt;/span&gt;
    &lt;span class="n"&gt;dS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Distance to nearest object&lt;/span&gt;
    &lt;span class="n"&gt;dO&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;dS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// "Safe" jump forward&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dO&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;MAX_DIST&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;SURF_DIST&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;break&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;h2&gt;
  
  
  4. Optical Physics: Refraction &amp;amp; Reflection
&lt;/h2&gt;

&lt;p&gt;To simulate glass, we don't just "draw" it; we simulate how light behaves at the boundary of two materials.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://en.wikipedia.org/wiki/Fresnel_equations" rel="noopener noreferrer"&gt;Fresnel Effect&lt;/a&gt;&lt;/strong&gt;: We use the dot product of our view ray and the surface normal to decide if we see the interior (refraction) or the exterior (reflection).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Nested March&lt;/strong&gt;: When the ray enters the sphere, it bends. The code then starts a &lt;em&gt;new&lt;/em&gt; internal raymarch loop. This is what allows the stars to look magnified and distorted by the glass.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight glsl"&gt;&lt;code&gt;&lt;span class="kt"&gt;vec3&lt;/span&gt; &lt;span class="n"&gt;refractDir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;refract&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n&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="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;52&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Bending light into glass&lt;/span&gt;
&lt;span class="c1"&gt;// ... inside the sphere ...&lt;/span&gt;
&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;volumetricGlow&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;exp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;minStarDist&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Creates that resin-like haze&lt;/span&gt;
&lt;span class="n"&gt;refractCol&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;emissiveStar&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;volumetricGlow&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  5. Analytical Caustics &amp;amp; Chromatic Aberration
&lt;/h2&gt;

&lt;p&gt;The glowing star patterns on the floor are &lt;strong&gt;&lt;a href="https://en.wikipedia.org/wiki/Caustic_(optics)" rel="noopener noreferrer"&gt;caustics&lt;/a&gt;&lt;/strong&gt;.  &lt;strong&gt;Caustics&lt;/strong&gt; are those dancing, wavy patterns of light you see at the bottom of a swimming pool or the bright "ring" at the base of a wine glass. They happen whenever a curved, transparent surface like water or a glass ball acts as a lens, grabbing scattered light rays and bunching them together into concentrated, glowing shapes.&lt;/p&gt;

&lt;p&gt;&lt;a href="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%2Fszz5lmnqr58eqj5427q0.jpg" class="article-body-image-wrapper"&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%2Fszz5lmnqr58eqj5427q0.jpg" alt="Caustics example from Wikipedia" width="320" height="225"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I achieve this by using &lt;code&gt;iSphere&lt;/code&gt; to project the floor's coordinates back into the star field.&lt;/p&gt;

&lt;p&gt;To add realism, I implement **&lt;a href="https://en.wikipedia.org/wiki/Chromatic_aberration" rel="noopener noreferrer"&gt;Chromatic Aberration&lt;/a&gt; **splitting the light into R, G, and B components by shifting the UV samples slightly. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="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%2Fwn9xzeiqtvi5woblkyy0.png" class="article-body-image-wrapper"&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%2Fwn9xzeiqtvi5woblkyy0.png" alt="Chromatic Aberration example from Wikipedia" width="800" height="482"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Chromatic Aberration&lt;/strong&gt; is a lens effect that creates a "rainbow fringe" around sharp edges. It happens because glass doesn't bend all colors of light equally; red light bends a little less than blue light. In a shader, you mimic this by "splitting" the image into its red, green, and blue components and shifting them slightly so they don't perfectly line up, giving the scene a realistic, cinematic look.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight glsl"&gt;&lt;code&gt;&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;shift&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mo"&gt;015&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;dR&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;map4Stars2D&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;distortedUV&lt;/span&gt; &lt;span class="o"&gt;*&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="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;shift&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;dG&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;map4Stars2D&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;distortedUV&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;dB&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;map4Stars2D&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;distortedUV&lt;/span&gt; &lt;span class="o"&gt;*&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="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;shift&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="kt"&gt;vec3&lt;/span&gt; &lt;span class="n"&gt;starShadow&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;vec3&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;smoothstep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mo"&gt;03&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mo"&gt;03&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dR&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;h2&gt;
  
  
  The "Secret Sauce": Why This Works
&lt;/h2&gt;

&lt;p&gt;The uniqueness of this shader lies in its **layered approach**. It isn't just one distance field; it’s a coordinate-space transformation. By distorting the UVs on the floor (&lt;code&gt;distortedUV&lt;/code&gt;), I simulate the way a magnifying glass bends light, creating a dynamic caustic pool that responds to the pulsing of the internal emissive stars. I was really trying my best to simulate the below image.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblogger.googleusercontent.com%2Fimg%2Fa%2FAVvXsEgq4QNxZLFMfz0_F4i7XaJqMOMdabDFmX7oO-QaIVJAJj52ID8ClM8hstPPAkEwiM9Qon8SkuyYX0lVVmG9gkxrF1tCB5T_EAIpH04IdB-kClIxT9jglYIILuGZcREmBy7JbV72EfmAdWs6BigPA4sifIlgTrZWNVWi8ktaSlsznEDpQ3yuHhwGvwS58k0" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblogger.googleusercontent.com%2Fimg%2Fa%2FAVvXsEgq4QNxZLFMfz0_F4i7XaJqMOMdabDFmX7oO-QaIVJAJj52ID8ClM8hstPPAkEwiM9Qon8SkuyYX0lVVmG9gkxrF1tCB5T_EAIpH04IdB-kClIxT9jglYIILuGZcREmBy7JbV72EfmAdWs6BigPA4sifIlgTrZWNVWi8ktaSlsznEDpQ3yuHhwGvwS58k0" alt="Toy glass dragon ball you can buy from Amazon" width="910" height="607"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Writing shaders is about translating the laws of physics into the language of mathematics. By combining Inigo Quilez’s SDFs with Raymarching, you can build complex, beautiful worlds with nothing but a few lines of GLSL. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;References &amp;amp; Further Reading:&lt;/strong&gt;&lt;br&gt;
• &lt;a href="https://www.instagram.com/noztol_shades" rel="noopener noreferrer"&gt;noztol_shades instagram&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;• &lt;a href="https://iquilezles.org/articles/raymarchingdf/" rel="noopener noreferrer"&gt;Raymarching Distance Fields (Quilez)&lt;/a&gt;&lt;br&gt;&lt;br&gt;
• &lt;a href="https://iquilezles.org/articles/distfunctions/" rel="noopener noreferrer"&gt;3D Distance Functions (Quilez)&lt;/a&gt;&lt;br&gt;&lt;br&gt;
• &lt;a href="https://iquilezles.org/articles/distfunctions2d/" rel="noopener noreferrer"&gt;2D Distance Functions (Quilez)&lt;/a&gt;&lt;br&gt;&lt;br&gt;
• &lt;a href="https://www.shadertoy.com/view/7c2SWc" rel="noopener noreferrer"&gt;4-Star Dragon Ball by Me (Noztol)&lt;/a&gt;&lt;/p&gt;

</description>
      <category>shaders</category>
      <category>caustics</category>
      <category>refraction</category>
      <category>reflection</category>
    </item>
    <item>
      <title>The Hardest Problem in Engineering Isn't Code (It’s Communication)</title>
      <dc:creator>Farzon Lotfi</dc:creator>
      <pubDate>Fri, 01 May 2026 04:00:00 +0000</pubDate>
      <link>https://forem.com/farzon/the-hardest-problem-in-engineering-isnt-code-its-communication-348f</link>
      <guid>https://forem.com/farzon/the-hardest-problem-in-engineering-isnt-code-its-communication-348f</guid>
      <description>&lt;p&gt;If you ask a room full of software engineers what the hardest part of their job is, you’ll get a variety of answers. Some will say VM orchestration or these days Agent orchestration. &lt;a href="https://martinfowler.com/bliki/TwoHardThings.html" rel="noopener noreferrer"&gt;Others will say cache invalidation or naming things&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;They’re all wrong.&lt;/p&gt;

&lt;p&gt;The hardest thing you will ever have to do in your career is communicate your ideas to other people. You can write the most elegant, highly optimized, mathematically perfect algorithm in the world, but if you can't explain why it matters to your team, your manager, or the product owner, it will sit in a repository gathering digital dust.&lt;/p&gt;

&lt;p&gt;A good engineer can solve complex technical problems in isolation. A great engineer builds bridges between those solutions and the people who need them. Collaboration is the actual 10x multiplier in tech, and it requires a completely different skill set than writing code.&lt;/p&gt;

&lt;p&gt;If you are an introverted engineer who prefers the quiet predictability of working on a ticket to the loud chaos of a planning meeting, this can feel daunting. But influence isn't about being the loudest voice in the room. It’s about being the most strategic. Here is how you can find your voice and get your great ideas the audience they deserve.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Art of Engineering "Inception"
&lt;/h3&gt;

&lt;p&gt;In a large corporation, a brilliant idea is a fragile thing. If a project only has one champion, it is constantly at risk of being deprioritized, defunded, or forgotten. To keep a project alive, you need consensus. You need multiple stakeholders who feel a sense of ownership over the work. The best engineers don’t just pitch ideas; they incept them into their colleagues. Like Leo in &lt;em&gt;Inception&lt;/em&gt;, your goal is to plant the seed of an idea so naturally that your colleagues eventually think they came up with it themselves. &lt;/p&gt;

&lt;p&gt;&lt;a href="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%2Fbmeuqdfcob7j5cr3skhk.gif" class="article-body-image-wrapper"&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%2Fbmeuqdfcob7j5cr3skhk.gif" alt="Inception meme" width="503" height="200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You do this by asking guided questions rather than making statements. Think socratic method. Instead of saying, "We need to migrate to this new compiler," you ask, "Have you noticed how slow our compile times are on CL? What do you think would happen if we looked at Clang?" When people arrive at the conclusion themselves, they become deeply invested in the outcome. They become your coalition.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mirroring: Let Them See Themselves in You
&lt;/h3&gt;

&lt;p&gt;Influence requires trust, and humans naturally trust people who feel familiar to them. When you are trying to convince a colleague of an idea, pay close attention to their energy and &lt;strong&gt;mirror it&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="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%2F36u6yw4v8xnmxqezgv5m.png" class="article-body-image-wrapper"&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%2F36u6yw4v8xnmxqezgv5m.png" alt="Mirroring" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The High-Energy Visionary:&lt;/strong&gt; If you are talking to a product manager who speaks quickly and focuses on the big picture, match that tempo. Focus on the end-user impact and the broad strokes. Skip the implementation details.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Methodical Skeptic:&lt;/strong&gt; If you are talking to a senior architect who is quiet, analytical, and risk-averse, slow down. Lower your volume. Present your idea with a focus on edge cases, security, and stability.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mirroring isn't about manipulation; it’s about translation. It’s taking your brilliant, quiet idea and translating it into a language the other person natively understands. When they see their own communication style reflected back at them, their defenses drop, and they actually &lt;em&gt;listen&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Building the Muscle: Why I Write
&lt;/h3&gt;

&lt;p&gt;If you are a quiet person, speaking up in a crowded meeting full of extroverts might feel like trying to jump onto a moving train. You don't have to start there. Communication is a muscle, and you can build it in isolation before testing it in public.&lt;/p&gt;

&lt;p&gt;&lt;a href="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%2Ftmehi4aqu6erit65m31o.png" class="article-body-image-wrapper"&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%2Ftmehi4aqu6erit65m31o.png" alt="Writing Muscle" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For me, that meant &lt;strong&gt;writing&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I started writing down my ideas whether as formal design documents, meeting notes, internal wiki pages, or just structured notes for myself because it forced me to organize the chaos in my head. Writing strips away the pressure of a real-time conversation. It allows you to anticipate counter-arguments, refine your analogies, and distill your thoughts down to their absolute essence.&lt;/p&gt;

&lt;p&gt;By the time I actually had to present an idea verbally, I had already rehearsed the logic on paper. If you struggle to find your voice in meetings, start by finding your voice on the page.&lt;/p&gt;

&lt;h3&gt;
  
  
  Finding Your Voice
&lt;/h3&gt;

&lt;p&gt;The tech industry desperately needs the ideas trapped inside the heads of quiet engineers. You don't need to change your personality or suddenly become a boisterous extrovert to be heard. You just need to learn the mechanics of influence: plant the seeds, build a coalition, speak their language, and structure your thoughts.&lt;/p&gt;

&lt;p&gt;The code is the easy part. The real engineering happens between people.&lt;/p&gt;

</description>
      <category>career</category>
      <category>communication</category>
      <category>growth</category>
    </item>
    <item>
      <title>The Architecture of Service: Reclaiming the Soul of Technology</title>
      <dc:creator>Farzon Lotfi</dc:creator>
      <pubDate>Thu, 30 Apr 2026 09:00:00 +0000</pubDate>
      <link>https://forem.com/farzon/the-architecture-of-service-reclaiming-the-soul-of-technology-2lno</link>
      <guid>https://forem.com/farzon/the-architecture-of-service-reclaiming-the-soul-of-technology-2lno</guid>
      <description>&lt;p&gt;If you trace the lineage of the personal computing revolution back to its roots in the 1970s and 80s, you won’t find corporate boardrooms or venture capital firms. You’ll find idealists. You’ll find the counterculture hippies of the &lt;a href="https://en.wikipedia.org/wiki/Whole_Earth_Catalog" rel="noopener noreferrer"&gt;&lt;em&gt;Whole Earth Catalog&lt;/em&gt;&lt;/a&gt;, &lt;a href="https://en.wikipedia.org/wiki/Homebrew_Computer_Club" rel="noopener noreferrer"&gt;&lt;em&gt;Homebrew Computer Club&lt;/em&gt;&lt;/a&gt; or the hackers of the &lt;a href="https://en.wikipedia.org/wiki/Cult_of_the_Dead_Cow" rel="noopener noreferrer"&gt;&lt;em&gt;Cult of the Dead Cow&lt;/em&gt;&lt;/a&gt; tinkerers who believed that democratizing information would emancipate humanity. For a brief, shining moment, the tech industry felt like the one place on earth where you could actually change the world for the better.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblogger.googleusercontent.com%2Fimg%2Fa%2FAVvXsEgcc60jazFOUwEjNaSNspHfwbXuKDs4ENqRkGnU9rdSkib55qpmM7a1ciFnGMkwOKd3huzRyhKaj0JQMt8fxlyy66S_Y2G5vgSfoyKnGoVqRtyVsGgTHhAdI2bQ0htngeiMWvbFwjNp0if5JwQzZVDmfwlW6LIuWVsRJqBNWjVn1bn0AHqvz89G4_q94wg" alt="A copy of the Whole Earth Catalog" width="760" height="570"&gt;&lt;/td&gt;
&lt;td&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%2F6bo2fjwuhh9mi38mfcm0.png" alt="The Homebrew Computer Club's Newsletter" width="800" height="1035"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Even as the industry corporatized, that idealism lingered. We saw it in Google’s famous foundational mandate: &lt;em&gt;"Don't be evil."&lt;/em&gt; It was a promise that tech could be immensely profitable without losing its moral compass.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblogger.googleusercontent.com%2Fimg%2Fa%2FAVvXsEi9o2vu_uMrfVVvM_NxPNLXHFOMuY1K5pdeJG9DuzFUJLzzLAT1n2fqjPHZuuh7g3UnNSEB7fJ827_n7C_dLTlZB1jHUMlWi1_ttPSjT_-g4-NHclKrHRaETkPSbXD3eEGVO-altuqRu5hNLjsb_dcFZ2ny121UDp5TBhfinaEXAG419767a0_J73pUSaI" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblogger.googleusercontent.com%2Fimg%2Fa%2FAVvXsEi9o2vu_uMrfVVvM_NxPNLXHFOMuY1K5pdeJG9DuzFUJLzzLAT1n2fqjPHZuuh7g3UnNSEB7fJ827_n7C_dLTlZB1jHUMlWi1_ttPSjT_-g4-NHclKrHRaETkPSbXD3eEGVO-altuqRu5hNLjsb_dcFZ2ny121UDp5TBhfinaEXAG419767a0_J73pUSaI" alt="Google's famous " width="1600" height="966"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But today, that promise feels like it's dying a slow, agonizing death.&lt;/p&gt;

&lt;p&gt;Instead of a unified global village, we are left with a balkanized internet of walled gardens. The products we rely on are actively undergoing what author Cory Doctorow so aptly named &lt;em&gt;"&lt;a href="https://en.wikipedia.org/wiki/Enshittification" rel="noopener noreferrer"&gt;enshittification&lt;/a&gt;."&lt;/em&gt; Platforms that once served users are now decaying into extraction machines. They get more expensive while degrading in quality. They are bloated with intrusive spyware and saturated with features absolutely no one asked for. Like forcing AI copilots into every corner of our digital lives just to appease shareholders. We are no longer the users; we are the product, the data points, the marks.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblogger.googleusercontent.com%2Fimg%2Fa%2FAVvXsEjSD_qyVTh19VxE-6qok0Nz3EluC4nGo2NT6k535BlB59O5ewDv77dj-pO1f0sXosm2U7KVIb5ZEE0BsmmTsG0-cVAIpXfOWEdHfjlMgM1zZfzdIgSlw50Jit_35eZIG5l4-Gyxw55nxvqQL6lYLcYmX0GvDv5_a8EuzPE32iZQ_DFER1fXEFT99J_eXOg%3Dw390-h400" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblogger.googleusercontent.com%2Fimg%2Fa%2FAVvXsEjSD_qyVTh19VxE-6qok0Nz3EluC4nGo2NT6k535BlB59O5ewDv77dj-pO1f0sXosm2U7KVIb5ZEE0BsmmTsG0-cVAIpXfOWEdHfjlMgM1zZfzdIgSlw50Jit_35eZIG5l4-Gyxw55nxvqQL6lYLcYmX0GvDv5_a8EuzPE32iZQ_DFER1fXEFT99J_eXOg%3Dw390-h400" alt="Enshitification's toll" width="389" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I hope for a new ethic in tech and I have ideas on what it should look like.&lt;/p&gt;

&lt;p&gt;I know exactly how that sounds. I am acutely aware of the mockery that awaits anyone who talks about "ethics" in Silicon Valley. If you’ve seen the HBO show &lt;em&gt;Silicon Valley&lt;/em&gt;, you remember the parody of "Tethics" (Tech Ethics) a hollow, performative corporate branding exercise used by narcissistic founders to dodge accountability. Proposing "tech ethics" today sounds like a punchline because we’ve seen too many ethics boards dissolved the moment they stand in the way of quarterly growth.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblogger.googleusercontent.com%2Fimg%2Fa%2FAVvXsEjjAlwB1BuvvWWH6CrO1Y6H8kxshcPo2VrutpIhcgZ29nPflVYsaerqqx9OE7CjDTJ7pIvvv5y4kXIM3Ri02GrVmAQYBArSeQKjBMPm4veTcLZbKc5tpBj4DarNeyCW1H6FZv-DU4Lz1K4VXuu-78zNR9YJcKDb5nWtOOjfPbWXNupo918ldIbHSnVOVRI" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblogger.googleusercontent.com%2Fimg%2Fa%2FAVvXsEjjAlwB1BuvvWWH6CrO1Y6H8kxshcPo2VrutpIhcgZ29nPflVYsaerqqx9OE7CjDTJ7pIvvv5y4kXIM3Ri02GrVmAQYBArSeQKjBMPm4veTcLZbKc5tpBj4DarNeyCW1H6FZv-DU4Lz1K4VXuu-78zNR9YJcKDb5nWtOOjfPbWXNupo918ldIbHSnVOVRI" alt="Tethics what we all want to avoid" width="497" height="280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We don't need a new corporate compliance framework. We need a fundamental shift in how we view the people who use our tools.&lt;/p&gt;

&lt;p&gt;I look at this through the lens of my faith, but the underlying moral framework requires no theology to understand. It is a framework that appeals just as much to the staunch atheist as it does to the believer, because it is rooted in pure, unglamorous action.&lt;/p&gt;

&lt;p&gt;In Baha'i history, there is a story of an early American adherent named &lt;a href="https://en.wikipedia.org/wiki/Lua_Getsinger" rel="noopener noreferrer"&gt;Lua Getsinger&lt;/a&gt;. She deeply wanted to serve God and asked the head of the Faith how to do it. He didn't tell her to pray more or something equally abstract. Instead, he sent her to the home of a destitute, chronically ill man.&lt;/p&gt;

&lt;p&gt;When Lua arrived, the conditions were so filthy and the smell so overwhelming that she fled. But her excuse was rejected. She was told that if she truly wanted to serve the divine, she had to serve her fellow man. She was sent right back with strict instructions: clean his house, bathe his body, and feed him. She was told not to return until the work was done.&lt;/p&gt;

&lt;p&gt;You don't need a religion to understand the weight of that lesson. The translation is simple: Lofty ideals mean absolutely nothing if you aren't willing to do the messy, tangible work of improving the reality of the person right in front of you.&lt;/p&gt;

&lt;p&gt;This is the standard of service. It is not an abstract mission statement on an "About Us" page. It is recognizing the inherent dignity of another human being.&lt;/p&gt;

&lt;p&gt;What would the technology sector look like if it were governed by this principle?&lt;/p&gt;

&lt;p&gt;If we truly respected the dignity of our users, we could never justify injecting spyware into their devices to harvest their private lives. We could never justify trapping them in addictive algorithmic loops to sell their attention.&lt;/p&gt;

&lt;p&gt;To "clean the house and feed the hungry" in the digital age means building technology that acts as a genuine public good. It means designing software that respects human autonomy, protects privacy, and solves actual problems rather than fabricating new ones to monetize. It means teaching our engineers, our designers, and our algorithms how to serve humanity, rather than exploit it.&lt;/p&gt;

&lt;p&gt;Tech &lt;em&gt;can&lt;/em&gt; still be a place where people go to change the world. The tools we are building today have more potential to uplift humanity than the 1970s idealists could have ever dreamed. But the internet will not be saved by a new feature, more LLMS, or a faster computer. It will only be saved when the people building it decide to roll up their sleeves, look at the people they are building for, and remember what it actually means to serve.&lt;/p&gt;

</description>
      <category>enshittification</category>
      <category>faith</category>
      <category>service</category>
    </item>
    <item>
      <title>An Android Fuzzing Retrospective Part II: The "Single-VM" Theory and the Bionic Wall</title>
      <dc:creator>Farzon Lotfi</dc:creator>
      <pubDate>Wed, 29 Apr 2026 12:00:00 +0000</pubDate>
      <link>https://forem.com/farzon/an-android-fuzzing-retrospective-part-ii-the-single-vm-theory-and-the-bionic-wall-4h80</link>
      <guid>https://forem.com/farzon/an-android-fuzzing-retrospective-part-ii-the-single-vm-theory-and-the-bionic-wall-4h80</guid>
      <description>&lt;p&gt;In my &lt;a href="https://blog.farzon.org/2026/04/a-retrospective-on-fuzzing-edge-for.html" rel="noopener noreferrer"&gt;previous post&lt;/a&gt;, I detailed how our move from the Android Emulator to standalone Android-x86 VHDX images gave us impressive cost saving wins for our fuzzing budget. With any infrastructure pivot, the moment we finished it, we started looking for ways to optimize it further. The plan would have been to collapse our two-VM Producer/Consumer model into a &lt;strong&gt;single-VM footprint.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Our next major architectural pivot would have been using &lt;a href="https://wiki.debian.org/ChrootOnAndroid" rel="noopener noreferrer"&gt;ChrootOnAndroid&lt;/a&gt; to host both the web server based fuzzer and Edge on one kernel. However, our prototypes hit three massive walls: &lt;strong&gt;Bionic libc&lt;/strong&gt; , &lt;strong&gt;Filesystem Permissions&lt;/strong&gt; , and the &lt;strong&gt;Bootloader Logic&lt;/strong&gt; of Android itself.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Theoretical Efficiency: Debian via Chroot
&lt;/h3&gt;

&lt;p&gt;The logic was simple: If we could run our Linux-based test-case generators (the Producer) inside a &lt;strong&gt;Debian Chroot&lt;/strong&gt; on the same Android-x86 VM running Edge (the Consumer), we could effectively double our scale again.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblogger.googleusercontent.com%2Fimg%2Fa%2FAVvXsEhOKd6G7FG-isSrlBVgGxJ5XSxsOwL-60bQdfgENmNrLXY0sINj6FvRUMfu017SJjLlt8mt_qJEdLRQgnqv1H_lQiefIon5Xef_STEiZM3RdV1e64C_3dsN3rSUV9jhmny381jnuY-WxgnNT07_0CXfv6HEwfrtuVDdzGV_zgLrq41VXMWXFJVd-I0GWFU" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblogger.googleusercontent.com%2Fimg%2Fa%2FAVvXsEhOKd6G7FG-isSrlBVgGxJ5XSxsOwL-60bQdfgENmNrLXY0sINj6FvRUMfu017SJjLlt8mt_qJEdLRQgnqv1H_lQiefIon5Xef_STEiZM3RdV1e64C_3dsN3rSUV9jhmny381jnuY-WxgnNT07_0CXfv6HEwfrtuVDdzGV_zgLrq41VXMWXFJVd-I0GWFU" alt="ChrootOnAndroid logo" width="800" height="552"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By utilizing &lt;strong&gt;ChrootOnAndroid&lt;/strong&gt; , we would have gained zero-latency fuzzing and unified compute, but we ran into deep-level technical hurdles that made it unfeasible for a production security pipeline.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Technical Blockers: Why We Didn't Ship
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. The Bionic vs. glibc Divide
&lt;/h4&gt;

&lt;p&gt;Android uses &lt;strong&gt;Bionic libc&lt;/strong&gt; , while Debian relies on &lt;strong&gt;glibc&lt;/strong&gt;. This is a recipe for hitting "Linker Hell." Debian looks for &lt;code&gt;/lib/ld-linux.so&lt;/code&gt;, while Android looks for &lt;code&gt;/system/bin/linker&lt;/code&gt;. Getting them to coexist requires more effort than I had the resources to devote to this problem.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Filesystem Permission Paradigms
&lt;/h4&gt;

&lt;p&gt;Debian follows a traditional Linux user model (Root=0), but Android uses a &lt;strong&gt;Sandbox model&lt;/strong&gt; where every app has a unique UID. We found that the Debian fuzzer would try to  write test cases to a shared folder, but Android would hit an &lt;code&gt;EACCES&lt;/code&gt; (Permission Denied) error because the Android filesystem didn't recognize the Debian "user."&lt;/p&gt;

&lt;h4&gt;
  
  
  3. The Bootloader and the &lt;code&gt;mmcblk0p3&lt;/code&gt; Trap
&lt;/h4&gt;

&lt;p&gt;Perhaps the most significant hurdle for our automation was the hardware's boot logic. To get a clean Debian environment, we often had to mess with kernel boot arguments via &lt;code&gt;fastboot&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;We spent days debugging errors related to &lt;code&gt;/dev/mmcblk0p3&lt;/code&gt;. In Linux/Android, storage is represented as files. By passing &lt;code&gt;root=/dev/mmcblk0p3&lt;/code&gt;, we were telling the kernel: &lt;em&gt;"Ignore the standard Android system partition; look at Partition 3 of the internal eMMC for the Debian rootfs."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This failed for two reasons:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Partition Drift&lt;/strong&gt;: On modern devices, &lt;code&gt;p3&lt;/code&gt; is often metadata or info, not the actual rootfs. We had to use &lt;code&gt;cat /proc/partitions&lt;/code&gt; just to find where we were.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The "Live" Limitation&lt;/strong&gt;: Using &lt;code&gt;fastboot boot&lt;/code&gt; only loads the kernel into RAM. It doesn't persist. For a cloud-scale fuzzing fleet, we couldn't manually inject &lt;code&gt;fastboot -c&lt;/code&gt; arguments every time a VM rebooted. Flashing the kernel permanently was too risky; if the Debian build wasn't perfect, the VM would enter a boot loop, killing our uptime.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Areas for Potential Research
&lt;/h3&gt;

&lt;p&gt;While we didn't implement the "Single-VM" model, it remains a high-value optimization for mobile security research. Future efforts should focus on:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Namespace Isolation&lt;/strong&gt;: Using Linux Namespaces rather than just a simple chroot to provide better isolation while maintaining a single kernel.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Permission Mapping&lt;/strong&gt;: Implementing a custom FUSE mount to translate Android app UIDs to Debian-compatible permissions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Bootloader Orchestration&lt;/strong&gt;: Building automation that can handle persistent kernel argument injection without requiring a manual &lt;code&gt;fastboot&lt;/code&gt; session every reboot.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Final Thoughts
&lt;/h3&gt;

&lt;p&gt;Our pivot to Android-x86 was about cost constraints; the move to chroot would have been a nice to have optimization, but wasn't necessary. Fighting with fastboot for MultiMediaCard Block devies and Bionic linker errors just wasn't worth it for our team size, but that doesn't mean it couldn't be worth it for you.&lt;/p&gt;

</description>
      <category>android</category>
      <category>androidx86</category>
      <category>bionic</category>
      <category>chroot</category>
    </item>
    <item>
      <title>The Exhausted Overachiever's Guide to Burnout</title>
      <dc:creator>Farzon Lotfi</dc:creator>
      <pubDate>Tue, 28 Apr 2026 12:00:00 +0000</pubDate>
      <link>https://forem.com/farzon/the-exhausted-overachievers-guide-to-burnout-190p</link>
      <guid>https://forem.com/farzon/the-exhausted-overachievers-guide-to-burnout-190p</guid>
      <description>&lt;p&gt;For an overachiever, the hardest thing to admit isn't that you're exhausted. It's admitting that you have absolutely no idea what to do next. I spent years playing a very specific character: the one who could out-think, out-work, and out-maneuver any problem. My self-worth wasn't just tied to my output; it &lt;em&gt;was&lt;/em&gt; my output. So when burnout hit sure it drained my energy, but worse it entirely stripped away my identity. If your relentless drive that got you here has suddenly gone quiet, I need you to hear this: you have reached a necessary end of a version of yourself that was never sustainable.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Story You’re Stuck in
&lt;/h3&gt;

&lt;p&gt;In In this industry, we’re taught to define ourselves by what we can do. You’re the "DevOps guy" or the "UI specialist." That’s a narrative trap. You start to believe that if you aren't that one specific thing, you’re nothing. Your "self-narrative" is a cage you build for yourself. One based in fear where you are terrified that if you stopped being the "person with all the answers," you would lose your seat at the table. It takes self reflection to realize this story is a lie. You have to be willing to look at your professional identity and admit, "This isn't me anymore." That’s not a failure; it’s an update.&lt;/p&gt;

&lt;h3&gt;
  
  
  Rewrite the Story You Tell Yourself (The Power of Self-Narrative)
&lt;/h3&gt;

&lt;p&gt;Your professional identity is not an unchangeable fact. You are not just "The Fixer" or the person who saves the project at the eleventh hour. Those are just roles you played. Write down the story you’ve been telling yourself. If it’s full of harsh demands and impossible standards, realize that you are the author. You have permission to write a new chapter where your value comes from your presence, your empathy, and your perspective not just your output.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblogger.googleusercontent.com%2Fimg%2Fa%2FAVvXsEjB4zRrrxYlCm3-E7PqOoEsClFxzlMGVUMPVfsFPfLvx0p1O5KVIjVFga7uAGiiIS8V0LtTDZrjum2DWIia6zwH0WhEYNqaPlW_jXYwI7uQBaGxVR0a1DsmwdVE0pD1s6l_PzXx9P3Lyv5B8d_elJJ_WF1YppfeqCrXSneUf9MRFNYK58mT1bAmcKkFQvM" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblogger.googleusercontent.com%2Fimg%2Fa%2FAVvXsEjB4zRrrxYlCm3-E7PqOoEsClFxzlMGVUMPVfsFPfLvx0p1O5KVIjVFga7uAGiiIS8V0LtTDZrjum2DWIia6zwH0WhEYNqaPlW_jXYwI7uQBaGxVR0a1DsmwdVE0pD1s6l_PzXx9P3Lyv5B8d_elJJ_WF1YppfeqCrXSneUf9MRFNYK58mT1bAmcKkFQvM" alt="A quote about shaping reality with your mind" width="720" height="417"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Listen to the Warning Signs (The Role of Awareness)
&lt;/h3&gt;

&lt;p&gt;We often ignore our own physical and emotional limits until our bodies force us to stop. We treat anxiety as an inconvenience to power through rather than a warning sign to respect.&lt;/p&gt;

&lt;p&gt;Transformation starts with simply observing yourself without judgment. When a crisis happens at work and you feel that familiar, urgent pull to jump in and prove you’re still "smart," just pause. You don't become more valuable by making yourself more available. Notice the physical tension in your chest or your tightened jaw. That’s your ego trying to defend its territory. Awareness is finding that brief gap between a problem arising and your desperate need to fix it. Just sit in that gap and observe for now. &lt;/p&gt;

&lt;h3&gt;
  
  
  Lean Into the Reinvention (Embracing Discomfort)
&lt;/h3&gt;

&lt;p&gt;We hate the space between who we used to be and who we are becoming. When you stop being the "Answer Guy," there is an uncomfortable void. We usually try to fill it by taking on more work, chasing a new goal, or distracting ourselves.&lt;/p&gt;

&lt;p&gt;Don't. That discomfort is the friction of actual growth. If you feel like an imposter or a novice again, you’re exactly where you need to be. Stop trying to hustle your way out of burnout. Intentionally spend time in the awkwardness of &lt;em&gt;not knowing&lt;/em&gt;. Go to a meeting and don't lead it. Ask a basic question. Prove to your nervous system that you don't have to be perfect to be safe.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Pain of Tearing it Down
&lt;/h3&gt;

&lt;p&gt;Reinvention sounds like a shiny, positive thing. It’s not. It’s messy and it hurts. It’s the feeling of realizing who you are doesn't fit who you’re trying to become. There’s a specific kind of vulnerability in tech when you stop pretending you’re a machine. But that’s where the "scabs" come from. You do it, you survive the transition, and you realize you didn't die. &lt;/p&gt;

&lt;h3&gt;
  
  
  Build Something Better with Intention (Conscious Reinvention)
&lt;/h3&gt;

&lt;p&gt;Real reinvention requires letting go. You cannot just plaster over a burnt-out ego and hope for the best. You have to let the need to be the smartest person in the room die so a well-rounded human can take their place. You must pursue ego death.&lt;/p&gt;

&lt;p&gt;This is a deliberate choice. You are deciding which parts of your old identity are worth keeping and which are just weighing you down. Identify one sharp edge of your ego maybe your defensiveness when challenged, or your need for total control and consciously choose to leave it behind. Reinvention isn't about becoming someone else; it’s about stripping away the armor to reveal someone who is approachable, resilient, and real.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;I'm reminded of the line from &lt;em&gt;Batman Begins&lt;/em&gt; where Thomas Wayne tells his son "Why do we fall Bruce?" Strength doesn't come from succeeding; it comes from the moments you feel completely lost. Where you don't have trust that you are still enough. Like Bruce we fall "so we can learn to pick ourselves back up again." So if you are trying to navigate through your burnout, know you will pick yourself back up. You’re in the middle of a necessary transition. Don't rush it.&lt;/p&gt;

</description>
      <category>burnout</category>
    </item>
    <item>
      <title>The Quiet Grind: Why Talent is the Least Interesting Thing About You</title>
      <dc:creator>Farzon Lotfi</dc:creator>
      <pubDate>Mon, 27 Apr 2026 12:00:00 +0000</pubDate>
      <link>https://forem.com/farzon/the-quiet-grind-why-talent-is-the-least-interesting-thing-about-you-527p</link>
      <guid>https://forem.com/farzon/the-quiet-grind-why-talent-is-the-least-interesting-thing-about-you-527p</guid>
      <description>&lt;p&gt;There is a persistent myth in software engineering that we all quietly worship: the myth of the "natural."&lt;/p&gt;

&lt;p&gt;We love the stories of the savant who can architect a billion-dollar app in their dorm room. It makes for great headlines. But if you spend enough time in this industry, staring at a terminal at 2:00 AM trying to figure out why your code keeps failing, you realize something sobering.&lt;/p&gt;

&lt;p&gt;Talent will only get you so far. In fact, relying on talent is usually a trap.&lt;/p&gt;

&lt;p&gt;Talent gets you through the first few years. It makes the introductory computer science classes easy. But eventually, everyone hits the wall. You encounter a bug that defies logic, a product launch that lands to total silence, or a market shift that renders your codebase obsolete.&lt;/p&gt;

&lt;p&gt;When you hit that wall, talent is useless. The only thing that matters is resilience.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Speed of Recovery
&lt;/h2&gt;

&lt;p&gt;If you look closely at the people whose names we actually remember. The engineers who shaped the tools we use, the founders who built lasting companies; they aren't necessarily the smartest people in the room. But they are the most resilient.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblogger.googleusercontent.com%2Fimg%2Fa%2FAVvXsEiOfKMoH_5p_M7JO5VZRzkiD0y7hNrwLGT9vfwf2SJzekSDvtDFQCbuxUgqcV1JyWHrNupHX9meeNy4NzVB_QLv5lFuxmYeW6L-J2PWBH7dYCBkwgICYdmaSJq0SdJ3jegOZu1NWeoQszha_3pM175Q8NvcHhIn08pUPGKVYJU1yNErKhBJlFjvGDnOdUQ" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblogger.googleusercontent.com%2Fimg%2Fa%2FAVvXsEiOfKMoH_5p_M7JO5VZRzkiD0y7hNrwLGT9vfwf2SJzekSDvtDFQCbuxUgqcV1JyWHrNupHX9meeNy4NzVB_QLv5lFuxmYeW6L-J2PWBH7dYCBkwgICYdmaSJq0SdJ3jegOZu1NWeoQszha_3pM175Q8NvcHhIn08pUPGKVYJU1yNErKhBJlFjvGDnOdUQ" alt="Meme about recovering quickly stronger than before" width="760" height="546"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Their defining trait isn't that they never fail; it's that their recovery time from adversity is vanishingly short. When a deployment goes sideways, they don't spiral into imposter syndrome. They don't spend days mourning the architecture that didn't work. They feel the sting, roll back the deploy, open the logs, and start writing the fix.&lt;/p&gt;

&lt;p&gt;They are the people who don't spend hours on Hacker News debating the theoretical merits of a new framework. They just go build with it. Talk is cheap; execution is lonely. The most successful people have made peace with that loneliness.&lt;/p&gt;

&lt;h2&gt;
  
  
  Encoded in the DNA
&lt;/h2&gt;

&lt;p&gt;For these people, the "grind" isn't a temporary phase you endure to get a promotion. It becomes their default state. It gets encoded in their DNA.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblogger.googleusercontent.com%2Fimg%2Fa%2FAVvXsEj7XDPbN3w5gaXQoel_HGM5RWBqrdfDNnl6plYNlBO8_2kcQRzRWd4fNT7jmNyQE2tDY8n4Y4OOyDHT5FWYS0Lyuxd-chErWH5-GhxVlVCYxwhqDd6kPhi16EW6p3DYjwSmJj-BsXSsLtQdTnx4nmuyeiaEB015oF7IFKQRxcc8Z-922ttkC1-JqHdPl4Y" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblogger.googleusercontent.com%2Fimg%2Fa%2FAVvXsEj7XDPbN3w5gaXQoel_HGM5RWBqrdfDNnl6plYNlBO8_2kcQRzRWd4fNT7jmNyQE2tDY8n4Y4OOyDHT5FWYS0Lyuxd-chErWH5-GhxVlVCYxwhqDd6kPhi16EW6p3DYjwSmJj-BsXSsLtQdTnx4nmuyeiaEB015oF7IFKQRxcc8Z-922ttkC1-JqHdPl4Y" alt="Meme about Grit encoded in DNA" width="760" height="504"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;They show up every single day because they operate on a fundamental, unshakeable belief: &lt;em&gt;if I just put in the work, better days are ahead.&lt;/em&gt; They don't doubt their potential. Not because they are arrogant, but because they have redefined what potential means. Potential isn't a measure of your raw intellect; it's a measure of your capacity to endure the struggle until the problem is solved.&lt;/p&gt;

&lt;p&gt;When you realize that your ability to learn and adapt is infinite, you start to believe you are limitless. And that is why they stay winning. They outlast everyone else who quits when the novelty wears off and the real work begins.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Long Game: Why Success is a Game of Attrition
&lt;/h2&gt;

&lt;p&gt;Ultimately, the industry and life is a giant filter. It’s designed to weed out anyone who is only here for the "easy" days.&lt;/p&gt;

&lt;p&gt;Most people are looking for a baseline of comfort. They want a career where they can rely on their initial talent, coast on what they already know, and avoid the friction of being a beginner again. But the people who stay winning, the ones who seem limitless are the ones who have made the grind their home.&lt;/p&gt;

&lt;p&gt;They don't see adversity as a signal to stop; they see it as a diagnostic. To them, a failed project or a brutal market shift isn't a personality flaw it's just a bug that needs a patch. They don't have a special biological gift. They've just spent so much time in the trenches that their work ethic is no longer a choice. It’s encoded.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Limitless Script
&lt;/h2&gt;

&lt;p&gt;If you’re feeling like you’re hitting a wall, or like your "talent" has run dry, good. That’s where the real work begins.&lt;/p&gt;

&lt;p&gt;Stop talking about what you’re going to build. Stop waiting for the moment where you finally feel "ready" or "talented enough" to compete. That moment doesn't exist. There is only the daily build, the recovery from the inevitable crashes, and the quiet, persistent belief that better days are a mathematical certainty if you refuse to exit the chair.&lt;/p&gt;

&lt;p&gt;Success isn't about being the smartest person in the room. It’s about being the one who is still there when everyone else has gone home.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Show up. Ship. Repeat.&lt;/strong&gt; That’s how you stay in the league.&lt;/p&gt;

</description>
      <category>grind</category>
      <category>grit</category>
      <category>limitless</category>
      <category>recovery</category>
    </item>
    <item>
      <title>The Big Tech Pivot: Why a Buyout Isn't an End, It's an Opening</title>
      <dc:creator>Farzon Lotfi</dc:creator>
      <pubDate>Sun, 26 Apr 2026 12:00:00 +0000</pubDate>
      <link>https://forem.com/farzon/the-big-tech-pivot-why-a-buyout-isnt-an-end-its-an-opening-eop</link>
      <guid>https://forem.com/farzon/the-big-tech-pivot-why-a-buyout-isnt-an-end-its-an-opening-eop</guid>
      <description>&lt;p&gt;Right now, a palpable sense of anxious terror is vibrating through our engineering floors. Microsoft is offering thousands of voluntary buyouts. Meta is axing jobs to fund a staggering $135 billion pivot into AI infrastructure.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblogger.googleusercontent.com%2Fimg%2Fa%2FAVvXsEghqRIsda-z0bPeyq-dixbRI3fXXNErEvqpumdH3aWNy0kyi92-xE3Ekw1c-oP3g3LqbqTLPqhAhKgaDBABR7_DJUSb9djwPegLyeOqcLWSCuRer-vAW5H9x_tXVQR3J1hejWgQFobWSgM1tWEGtV_IulD74Fwr1NEq6_R3p96iv_DQwBbF5b_TlMtM6po" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblogger.googleusercontent.com%2Fimg%2Fa%2FAVvXsEghqRIsda-z0bPeyq-dixbRI3fXXNErEvqpumdH3aWNy0kyi92-xE3Ekw1c-oP3g3LqbqTLPqhAhKgaDBABR7_DJUSb9djwPegLyeOqcLWSCuRer-vAW5H9x_tXVQR3J1hejWgQFobWSgM1tWEGtV_IulD74Fwr1NEq6_R3p96iv_DQwBbF5b_TlMtM6po" alt="Meme about layoffs" width="720" height="524"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When you are staring at a buyout package on your own desk, you have a choice to make about how you frame your reality. You can view yourself as a victim of a collapsing market, and if you do, that will become your reality. You will see a tragedy, a corporate betrayal, and a door closing.&lt;/p&gt;

&lt;p&gt;But there is a second option. You can choose to view this not as a funeral, but as a strategic opening. Your reality is dictated by how you frame this moment. If you are sitting in an existential waiting room right now, stomach in knots, let me offer the frame of the opportunist: Your career isn't over. In fact, if you play this right, you might be stepping into the most powerful strategic position of your life.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Brutal Math: Software is Going to Zero
&lt;/h2&gt;

&lt;p&gt;To understand the opportunity, you have to look at the undeniable economic reality driving these buyouts: The marginal cost of standard software engineering is rapidly dropping to zero. &lt;/p&gt;

&lt;p&gt;For 50 years, code was a premium, scarce asset. We built our compensation models around being the highly paid gatekeepers of this complex resource. But now, we are staring down the barrel of swarms of specialized AI agents collaborating autonomously to write, test, and deploy entire architectures. Within the next 24 months, it is highly probable that autonomous systems will generate more code than all of humanity has in the history of computing.&lt;/p&gt;

&lt;p&gt;You cannot out-work, out-hustle, or out-code a &lt;a href="https://www.gartner.com/en/newsroom/press-releases/2026-1-15-gartner-says-worldwide-ai-spending-will-total-2-point-5-trillion-dollars-in-2026" rel="noopener noreferrer"&gt;$2.52 trillion&lt;/a&gt; capital rotation into silicon. When a market is intentionally flooded with artificially cheap, AI-generated code, the premium value of raw human output collapses. This is the brutal math driving the layoffs and the buyout packages.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Great Headcount Migration
&lt;/h2&gt;

&lt;p&gt;For those that remain you need to understand Big Tech isn't "running out of money" they are aggressively migrating their human capital.&lt;/p&gt;

&lt;p&gt;Companies like Google and Microsoft are moving their best minds out of teams like Gmail and Office and onto teams like Gemini and Azure AI. As they chase the AI infrastructure crown, they are leaving their core, "solved" products the platforms that fund this CapEx in maintenance mode.&lt;/p&gt;

&lt;h2&gt;
  
  
  IP Without Architects
&lt;/h2&gt;

&lt;p&gt;The migration of human capital to new projects means Big Tech is currently sitting on mountains of intellectual property they no longer have the organizational focus to evolve. They have the IP, but they are losing the architects.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Big Tech Pivot (And Their Strategic Gap)
&lt;/h2&gt;

&lt;p&gt;This brings us to the most important strategic shift of our generation. Big Tech is no longer fighting to be the best pure-software provider; they are pivoting to become the foundational AI infrastructure layer for the globe. They want to sell the compute, the agents, and the LLMs. &lt;/p&gt;

&lt;p&gt;But the pivoting into AI infrastructure also exposes a massive flank. As they pour hundreds of billions into server farms, the historical revenue drivers also become increasingly easier to replicate. This creates a strategic gap, leaving their core software products vulnerable to more agile competition.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Silver Lining: The Great Equalizer
&lt;/h2&gt;

&lt;p&gt;This is where you come in. Here is the beautiful, unintended consequence of Big Tech's pivot: By subsidizing the cost of AI infrastructure to capture the market, they have dropped your barrier to entry to zero. You don't need an army of 500 engineers to build a leaner, faster alternative to a Microsoft or Google product anymore. &lt;/p&gt;

&lt;p&gt;You just need the exact same AI agents that your former employer spent billions to build and subsidize. You are not leaving your domain expertise behind. You built these systems. You know the architectural constraints and the underlying tech debt. &lt;/p&gt;

&lt;p&gt;You know exactly where the friction points are for end-users. You can use Big Tech's own subsidized AI infrastructure to build focused, pure-software products that compete directly in the spaces they are currently deprioritizing. In a way it is kind like malicious compliance.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Seed Funding Reframe
&lt;/h2&gt;

&lt;p&gt;Let’s be honest: a buyout package isn’t life-changing money. It isn’t a VC war chest that will last you long. But calling it &lt;strong&gt;"seed funding"&lt;/strong&gt; is a necessary psychological hack.&lt;/p&gt;

&lt;p&gt;When you label it "severance," your brain chemistry defaults to fear and preservation. When you label it "seed funding," you move into optimism. It forces you to stop thinking like a discarded employee and start thinking like the builder you’ve always been. It is a grant that buys you the time to return to the craft on your own terms.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion: Choose Your Reality
&lt;/h2&gt;

&lt;p&gt;Your reality is how you frame this moment. A buyout isn't a winning lottery ticket, but it is a release from the "existential waiting room." You are an insider armed with domain expertise, a laptop, and a subsidized AI toolkit that levels the playing field in ways that were impossible five years ago.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>layoffs</category>
      <category>retirement</category>
    </item>
    <item>
      <title>A Retrospective on Fuzzing Edge for Android: Looking beyond the Emulator</title>
      <dc:creator>Farzon Lotfi</dc:creator>
      <pubDate>Sat, 25 Apr 2026 12:00:00 +0000</pubDate>
      <link>https://forem.com/farzon/a-retrospective-on-fuzzing-edge-for-android-looking-beyond-the-emulator-24p9</link>
      <guid>https://forem.com/farzon/a-retrospective-on-fuzzing-edge-for-android-looking-beyond-the-emulator-24p9</guid>
      <description>&lt;p&gt;When I was the head of Microsoft's Edge security for the US market, we ran into an infrastructure challenge that forced us to completely rethink how we fuzzed Android.&lt;/p&gt;

&lt;p&gt;The project we built no longer exists at Microsoft, and the &lt;a href="https://www.android-x86.org/" rel="noopener noreferrer"&gt;Android-x86 project&lt;/a&gt; we relied on is now officially dead and unsupported. However, the architectural pivot we made to get around cloud compute constraints remains a novel approach to Android fuzzing—one that solved a myriad of technical headaches while drastically cutting costs.&lt;/p&gt;

&lt;p&gt;Here is a look back at how we bypassed the Android Emulator entirely to find better, real-world bugs.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Catalyst: Losing Nested Virtualization
&lt;/h2&gt;

&lt;p&gt;Fuzzing has always been a core focus of the Edge security posture. Using our own tooling alongside open-source frameworks, we achieved millions of fuzz hours per month across desktop environments. But doing this at scale for Android always presented unique friction.&lt;/p&gt;

&lt;p&gt;In 2022, that friction hit a boiling point. Due to cost-cutting measures, our fuzzing budgets were reduced. We had to migrate off of public Azure to the Microsoft 365 substrate for both security and cost reasons. The unintended side effect of this migration was a severe reduction in our quota for CPU cores that supported &lt;strong&gt;nested virtualization&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="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%2Fdw1y2trruvwn0lzkwp73.png" class="article-body-image-wrapper"&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%2Fdw1y2trruvwn0lzkwp73.png" alt="The Android Emulator works best with nested virtualization." width="468" height="483"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Without nested virtualization, running the standard Android Emulator in the cloud was impossible. We needed a workaround.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the Android Emulator Was Failing Us Anyway
&lt;/h2&gt;

&lt;p&gt;Losing the ability to run the emulator initially felt like a massive blow, but in retrospect, the emulator was already polluting our fuzzing efforts. When we fuzzed on the emulator, we spent a massive amount of time triaging crashes that had nothing to do with Edge.&lt;/p&gt;

&lt;p&gt;The emulator suffered from several fatal flaws for our use case:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;QEMU-Specific Code Paths&lt;/strong&gt;: Many bugs we found hit &lt;code&gt;qemu&lt;/code&gt;-specific emulation paths that a real-world mobile user would never actually experience.
&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%2Fnkcb2kovplg2e5u0nz5n.png" alt="Emulator bug not browser." width="800" height="530"&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Driver Crashes&lt;/strong&gt;: The emulator frequently hit &lt;code&gt;nvoglv64.dll&lt;/code&gt;, an Nvidia driver bug that would simply crash the emulator outright.
&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%2Fdr176vucx69ml9j2blwy.png" alt="nvoglv64.dll driver bugs" width="410" height="235"&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Swiftshader Timesink&lt;/strong&gt;: The only way to stop the Nvidia crashes was to enable Swiftshader for the emulator. However, Google had already deprecated Swiftshader, meaning any bugs we found there were a complete waste of time to report or investigate.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We needed a solution that tested real Android code paths, avoided emulation artifact bugs, and didn't require nested virtualization SKUs.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Solution: Direct-to-Azure Android-x86 VHDX Images
&lt;/h2&gt;

&lt;p&gt;To solve the compute constraint, we turned to the Android-x86 project. Instead of emulating Android hardware, we built Android-x86 &lt;code&gt;.vhdx&lt;/code&gt; images and uploaded them directly to Azure to run as standalone VMs. (For a look at the mechanics of this, there is a great breakdown on &lt;a href="https://mahsa-hanifi.medium.com/running-android-inside-azure-68977c687ff5" rel="noopener noreferrer"&gt;running Android inside Azure here&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;a href="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%2Fkg0um7p3s0lzk51m5nn0.png" class="article-body-image-wrapper"&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%2Fkg0um7p3s0lzk51m5nn0.png" alt="A run of AndroidX86 in Azure" width="468" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Because we were running standard VMs instead of nested virtualization SKUs, our compute costs plummeted. We could suddenly run &lt;strong&gt;two Android-x86 VMs for every one Android Emulator VM&lt;/strong&gt; we previously ran.&lt;/p&gt;

&lt;p&gt;In the short term, the development time required to create the images and establish communication protocols was slightly higher than just spinning up an emulator. But the image creation and communication processes ended up being a massive success. The long-term Azure cost reductions eventually set a model for the rest of Edge.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decoupling the Architecture
&lt;/h2&gt;

&lt;p&gt;Running standalone Android-x86 instances meant we could no longer run our test case generators, HTTP servers, and browser automation on the same VM as the target—something we took for granted on Windows and Linux.&lt;/p&gt;

&lt;p&gt;To adapt, we decoupled the architecture. We built a new producer-consumer model where a robust Linux server handled the heavy lifting of generating test cases. The Android-x86 VMs acted purely as headless consumers, utilizing Mozilla's &lt;a href="https://github.com/MozillaSecurity/grizzly/tree/android-rebase" rel="noopener noreferrer"&gt;Grizzly framework&lt;/a&gt; to handle the browser automation.&lt;/p&gt;

&lt;p&gt;Use of android adb tools worked really smoothly after all of this&lt;/p&gt;

&lt;p&gt;&lt;a href="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%2Ft6ku7c4jn55sr6x0kyj6.png" class="article-body-image-wrapper"&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%2Ft6ku7c4jn55sr6x0kyj6.png" alt="Android adb with Androidx86 vm on Hyper-V" width="650" height="475"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By pushing our ASAN (AddressSanitizer) builds of the full Edge browser to these VMs, we maximized our chances of finding both security and reliability issues.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Takeaway
&lt;/h2&gt;

&lt;p&gt;Even though Android-x86 was an older version of Android than what was available via the emulator, the net result was surprising: we found more &lt;em&gt;real-world&lt;/em&gt; bugs in the browser.&lt;/p&gt;

&lt;p&gt;&lt;a href="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%2F1fku4wpspzzxu23l9tkk.jpeg" class="article-body-image-wrapper"&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%2F1fku4wpspzzxu23l9tkk.jpeg" alt="Bugs found on Androidx86" width="800" height="258"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I even found one that someone beat me to fixing.&lt;/p&gt;

&lt;p&gt;&lt;a href="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%2Fj2fw98mdsl7mnvridszg.jpeg" class="article-body-image-wrapper"&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%2Fj2fw98mdsl7mnvridszg.jpeg" alt="Bug I had a fix for" width="800" height="395"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By being forced off of nested virtualization, we accidentally cured our emulator-noise problem. The project may be sunsetted today, but it stands as a great example of how strict budget and infrastructure constraints can force security teams to build leaner, smarter, and ultimately more effective testing environments.&lt;/p&gt;

</description>
      <category>androidx86</category>
      <category>azure</category>
      <category>edge</category>
      <category>fuzzing</category>
    </item>
    <item>
      <title>MemGC: A Retrospective on a Bygone Frontline of Browser Security</title>
      <dc:creator>Farzon Lotfi</dc:creator>
      <pubDate>Fri, 24 Apr 2026 11:00:00 +0000</pubDate>
      <link>https://forem.com/farzon/memgc-a-retrospective-on-a-bygone-frontline-of-browser-security-3754</link>
      <guid>https://forem.com/farzon/memgc-a-retrospective-on-a-bygone-frontline-of-browser-security-3754</guid>
      <description>&lt;p&gt;Looking back at my time on the Chakra and the OG Edge team, few projects I had the opportunity to work on feel as consequential to my development as an engineer as my opportunity to work on &lt;strong&gt;&lt;a href="https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-10/security/threat-protection/overview-of-threat-mitigations-in-windows-10" rel="noopener noreferrer"&gt;MemGC (Memory Garbage Collection)&lt;/a&gt;&lt;/strong&gt;. In the 2014-16 time period the largest amount of security bugs filed against Internet Explorer were &lt;a href="https://chs.us/2026/03/use-after-free-understanding-a-classic-memory-corruption-bug/" rel="noopener noreferrer"&gt;Use-After-Frees (UAFs)&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblogger.googleusercontent.com%2Fimg%2Fa%2FAVvXsEieXh5Zzzrn79okLg410mTkJIxN7MHFxQwbu2O7EaW0nWzDMayh4RJ9mHbj6yqF78hTr7W-D9_7ix9SyXcVm_NNNMSUd3E4trxQBAFrMj5GwTqkC0yQnT362pmHA6YnLsOlmMGElcTqG5pbHHqvW87KqAgCAQv78C6stgnNFdGTgjewhxTiWfCxoHhk2uk" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblogger.googleusercontent.com%2Fimg%2Fa%2FAVvXsEieXh5Zzzrn79okLg410mTkJIxN7MHFxQwbu2O7EaW0nWzDMayh4RJ9mHbj6yqF78hTr7W-D9_7ix9SyXcVm_NNNMSUd3E4trxQBAFrMj5GwTqkC0yQnT362pmHA6YnLsOlmMGElcTqG5pbHHqvW87KqAgCAQv78C6stgnNFdGTgjewhxTiWfCxoHhk2uk" alt="UaF infographic" width="760" height="424"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;MemGC was our architectural response: a garbage collector designed not just for performance, but as a hard security boundary. It was good enough that it recieved praise from &lt;a href="https://projectzero.google/2017/09/the-great-dom-fuzz-off-of-2017.html" rel="noopener noreferrer"&gt;Google project zero&lt;/a&gt;: "&lt;em&gt;MemGC is an example of a useful mitigation that results in a clear positive real-world impact"&lt;/em&gt;. I do love quoting this 😂.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Core Idea: Turning UAF into a GC Problem
&lt;/h2&gt;

&lt;p&gt;Before MemGC, we tried mitigations like &lt;em&gt;&lt;a href="https://web.archive.org/web/20150524172425/http://labs.bromium.com/2015/01/17/use-after-free-new-protections-and-how-to-defeat-them/" rel="noopener noreferrer"&gt;Isolated Heap&lt;/a&gt;&lt;/em&gt; and &lt;em&gt;&lt;a href="https://www.securityweek.com/microsofts-use-after-free-mitigations-can-be-bypassed-researcher/" rel="noopener noreferrer"&gt;Delay Free&lt;/a&gt;&lt;/em&gt;. They were clever "band-aids" that made exploitation harder but didn't solve the root cause. If a developer forgot to null a pointer after a &lt;code&gt;free()&lt;/code&gt;, the door remained open.&lt;/p&gt;

&lt;p&gt;MemGC changed the game by bringing the &lt;strong&gt;&lt;a href="https://en.wikipedia.org/wiki/Concurrent_mark_sweep_collector" rel="noopener noreferrer"&gt;Concurrent Mark-Sweep (CMS)&lt;/a&gt;&lt;/strong&gt; algorithm from the JavaScript engine (Chakra) into the heart of the DOM. We essentially built a safety net:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reference-based Lifetime&lt;/strong&gt;: Instead of manual &lt;code&gt;free()&lt;/code&gt; calls, objects were only reclaimed when the GC could prove no references to them remained.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Conservative Scan&lt;/strong&gt;: We treated the stack and registers conservatively. If a value looked like a pointer to a MemGC object, we kept that object alive. This effectively killed "immediate" UAF exploits.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What it Was Good At: Structural Defenses
&lt;/h2&gt;

&lt;p&gt;From a developer’s perspective, MemGC was incredibly successful at &lt;strong&gt;"Vulnerability Class Elimination."&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Automation of Safety&lt;/strong&gt;: It removed the cognitive load from DOM developers. The GC handled the cleanup of complex DOM nodes automatically.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance Balance&lt;/strong&gt;: By using a concurrent mark-sweep, we kept the UI thread responsive while the GC did the heavy lifting on a background thread.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Heap Integrity&lt;/strong&gt;: The data structures we used, like the &lt;code&gt;HeapBlock32Map&lt;/code&gt;, allowed us to quickly determine if an address was a valid object start, preventing many "middle-of-object" pointer tricks.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Where it Failed: The "Blind Spots"
&lt;/h2&gt;

&lt;p&gt;No mitigation is perfect. As developers, we had to confront the reality that hackers are just as creative as we are. One of the most interesting "failures" was a limitation in visibility between different engine components.&lt;/p&gt;

&lt;p&gt;As detailed in the &lt;em&gt;"Seeing Double"&lt;/em&gt; research, we discovered that having separate "Chakra" and "DOM" heaps created a blind spot. The Chakra recycler didn't always have visibility into allocations on the DOM heap, and vice versa. If a pointer to a Chakra object was stored in a buffer on the DOM heap, the Chakra GC might not "see" it, leading to a UAF despite the protection.&lt;/p&gt;

&lt;p&gt;Furthermore, killing UAF simply pushed attackers toward &lt;strong&gt;Type Confusion&lt;/strong&gt;. MemGC ensured the memory was &lt;em&gt;there&lt;/em&gt;, but it couldn't ensure the memory was being interpreted as the correct &lt;em&gt;type&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lessons for Today’s Developers
&lt;/h2&gt;

&lt;p&gt;If I were building a new engine today, what would I take from the MemGC era?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Defense in Depth&lt;/strong&gt;: MemGC works best when paired with modern mitigations like &lt;strong&gt;&lt;a href="https://learn.microsoft.com/en-us/windows/win32/secbp/control-flow-guard" rel="noopener noreferrer"&gt;Control Flow Guard (CFG)&lt;/a&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Precision Problem&lt;/strong&gt;: Conservative scanning prevents UAF but can cause memory leaks. Precise GC is the gold standard for modern systems.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Language Safety&lt;/strong&gt;: MemGC was a heroic effort to make C++ safe. Today, we should look toward &lt;strong&gt;Rust&lt;/strong&gt; for compile-time safety guarantees.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;MemGC was a milestone in browser security. It forced attackers to abandon their favorite exploits and move into much more difficult territory. For those of us who built it, it remains a proud example of weaponizing computer science for defense.&lt;/p&gt;

&lt;h3&gt;
  
  
  References:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.microsoft.com/en-us/msrc/blog/2016/01/triaging-the-exploitability-of-ieedge-crashes" rel="noopener noreferrer"&gt;MSRC: Triaging Exploitability in the MemGC Era&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.zerodayinitiative.com/blog/2018/12/17/seeing-double-exploiting-a-blind-spot-in-memgc" rel="noopener noreferrer"&gt;ZDI: Seeing Double - Exploiting a Blind Spot in MemGC&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>chakra</category>
      <category>memgc</category>
      <category>security</category>
    </item>
    <item>
      <title>The ROI of Irrationality: What Grad School Actually Taught Me</title>
      <dc:creator>Farzon Lotfi</dc:creator>
      <pubDate>Thu, 23 Apr 2026 15:00:00 +0000</pubDate>
      <link>https://forem.com/farzon/the-roi-of-irrationality-what-grad-school-actually-taught-me-jba</link>
      <guid>https://forem.com/farzon/the-roi-of-irrationality-what-grad-school-actually-taught-me-jba</guid>
      <description>&lt;p&gt;I went to graduate school to specialize in computer graphics. I came out of it to find a job market that had practically vanished.&lt;/p&gt;

&lt;p&gt;If I had listened to the conventional wisdom of the time, I would have pivoted. I would have cut my losses, updated my resume to reflect a safer trajectory, and moved on. For a time I did do just that and pivoted to computer security. But I realized it would be better to dig my heels in and commit to the career I wanted. Today, I have that career. But let’s be entirely clear: it wasn’t the institution or the degree that got me here. It was sheer, unadulterated stubbornness.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblogger.googleusercontent.com%2Fimg%2Fa%2FAVvXsEjQPA76HEN2lZ1AlSPQvBn0V2CVOuzy-N-evVLzBXINPDzZHPBlNQc-YXNpFtDPATK88loQ4K2VliP624jEN7pWOvuoisGlhE5dUmYSNo7LPFMT7_BOH0b1wNZHkVjzIvqBN4hrTdKaDnpFm35Qx1xbCzq9poXwq4DGlpxCQ-XlyPUs-umm8mN9K8PCWJw" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblogger.googleusercontent.com%2Fimg%2Fa%2FAVvXsEjQPA76HEN2lZ1AlSPQvBn0V2CVOuzy-N-evVLzBXINPDzZHPBlNQc-YXNpFtDPATK88loQ4K2VliP624jEN7pWOvuoisGlhE5dUmYSNo7LPFMT7_BOH0b1wNZHkVjzIvqBN4hrTdKaDnpFm35Qx1xbCzq9poXwq4DGlpxCQ-XlyPUs-umm8mN9K8PCWJw" alt="ROI graphic" width="960" height="640"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Looking back on that journey, there are a few hard truths about goals, higher education, and the absolute necessity of refusing to compromise.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The Danger of Being "Rational"&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Throughout my life, I have developed a deep resentment for the advice to "be rational." We are constantly told to temper our expectations, play the percentages, and have a pragmatic fallback plan.&lt;/p&gt;

&lt;p&gt;Here is the reality: in a world of eight billion people, rationality is just a mathematical formula for settling. To truly believe that you deserve to occupy a highly specific, fiercely competitive niche, you cannot be rational. You have to be deeply irrational. You need to possess a healthy streak of delusion to look at the impossible odds, the closed doors, and the saturated markets and decide, &lt;em&gt;“Yes, that spot still belongs to me.”&lt;/em&gt; Rationality protects you from disappointment, but it also completely insulates you from your own potential.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The Illusion of the Academic Pipeline&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;We also need to have an honest conversation about the current state of higher education. It is time to acknowledge that much of academia has evolved into a heavily institutionalized enterprise that frequently extracts far more financial and temporal value from its students than it returns. It has become a systemic sinkhole, operating on a timeline fundamentally disconnected from the velocity of modern industry.&lt;/p&gt;

&lt;p&gt;If you are relying on a core curriculum to prepare you for the cutting edge, you are already years behind. Too much of the standard coursework is a parade of outdated concepts and irrelevant syllabi that no longer apply to the real-world demands of tech or art. Ironically, the only classes reflecting the true, current state of the field are the "Special Topics", the seminars, and the elective. The very courses that the university administration rarely allows to count toward your actual degree requirements. &lt;/p&gt;

&lt;p&gt;Learning is still essential, but we must recognize it for what it truly is: the continuous act of self-creation. Today, LLMs and Youtube can deliver raw information far more efficiently than a lecture hall, which means your intellectual evolution must be self-authored. A syllabus offers no armor against the future. The only real measure of a course's worth is whether it permanently alters the architecture of your thinking.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The Saving Grace: Research&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;There is one major caveat to this critique. The beating heart that keeps the academic body alive and the only reason it is still worth navigating is the research.&lt;/p&gt;

&lt;p&gt;My saving grace in graduate school was securing a Graduate Research Assistantship (GRA). That was where the real education happened. Away from the archaic lectures and standardized rubrics, research is where you actually touch the boundary of what is possible. It is the one space left in the university ecosystem where discovery and innovation are prioritized over bureaucracy. If you are going to go to grad school, go for the research. Everything else is just noise.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Stubbornness as a Strategy&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;I didn't get my career because a piece of paper guaranteed me a spot in computer graphics. I got it because I refused to let an empty job market dictate my trajectory. The system is not designed to hand you your dream; it is designed to process you.&lt;/p&gt;

&lt;p&gt;If you have a vision for your life, guard it fiercely against the "rational" advice of the masses. Take the research experience, absorb the uncredited special topics, and leave the bureaucratic friction behind. At the end of the day, your success won't be a product of the institution. It will be a testament to your refusal to quit.&lt;/p&gt;

</description>
      <category>academia</category>
      <category>career</category>
      <category>goals</category>
      <category>gradschool</category>
    </item>
    <item>
      <title>The Benchmarks of a Ghost Ship: On Knowing When to Walk Away</title>
      <dc:creator>Farzon Lotfi</dc:creator>
      <pubDate>Wed, 22 Apr 2026 12:00:00 +0000</pubDate>
      <link>https://forem.com/farzon/the-benchmarks-of-a-ghost-ship-on-knowing-when-to-walk-away-46fo</link>
      <guid>https://forem.com/farzon/the-benchmarks-of-a-ghost-ship-on-knowing-when-to-walk-away-46fo</guid>
      <description>&lt;p&gt;In the world of software engineering, we are raised on a diet of pure meritocracy. We believe that if our algorithms are faster, our latency lower, and our architecture more elegant, we win. We treat the codebase like a sanctuary where logic is the only law.&lt;/p&gt;

&lt;p&gt;But I’ve spent my career building cathedrals in sinking cities, and if there is one thing I’ve learned, it’s that the most brilliant code in the world cannot save a product whose time has passed or one that never found its timing at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Chakra Paradox: Winning the Wrong Race
&lt;/h2&gt;

&lt;p&gt;During my tenure on the &lt;strong&gt;&lt;a href="https://github.com/chakra-core/ChakraCore" rel="noopener noreferrer"&gt;Chakra JavaScript compiler&lt;/a&gt;&lt;/strong&gt; team at Microsoft, we did the "impossible." We went toe-to-toe with Google’s V8 and, &lt;a href="https://microsoftedge.github.io/videotest/2017-04/BenchmarkMethodology.html" rel="noopener noreferrer"&gt;by the metrics of the Octane, jetstream, &amp;amp; sunspider benchmarks, we won.&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblogger.googleusercontent.com%2Fimg%2Fa%2FAVvXsEg69j113NMYKp1qD1pduMrMV2_X_Ge2kXccVUe5oMuxsiPetZoiwbvqxr1qaLbrTBH54OtLLFh_8Z6Os5hrfffetvyu5zBuH29OVUowQbIPZuTdRqiqdJI_vr285ix46zAvCMTzbh_2Kl9KHGjxsyvu_diLK8xgRZ39JwmWV4OQ1vs2EQ5D17p6bibbDUE" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblogger.googleusercontent.com%2Fimg%2Fa%2FAVvXsEg69j113NMYKp1qD1pduMrMV2_X_Ge2kXccVUe5oMuxsiPetZoiwbvqxr1qaLbrTBH54OtLLFh_8Z6Os5hrfffetvyu5zBuH29OVUowQbIPZuTdRqiqdJI_vr285ix46zAvCMTzbh_2Kl9KHGjxsyvu_diLK8xgRZ39JwmWV4OQ1vs2EQ5D17p6bibbDUE" alt="Chakra beating V8 in Google's Own Benchmark (Octan 2.0)" width="752" height="452"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We built a world-class engine a feat of JIT optimization and memory management that could have defined the next decade of the web. Chakra was ahead in ES6 conformance and had elegant security mitigations like MemGC that even got the praise of &lt;a href="https://projectzero.google/2017/09/the-great-dom-fuzz-off-of-2017.html" rel="noopener noreferrer"&gt;Google project zero &lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"It is also interesting to observe the effect of MemGC, a use-after-free mitigation in Internet Explorer and Microsoft Edge. When this mitigation is disabled using the registry flag OverrideMemoryProtectionSetting, a lot more bugs appear. However, Microsoft considers these bugs strongly mitigated by MemGC and I agree with that assessment. Given that IE used to be plagued with use-after-free issues, MemGC is an example of a useful mitigation that results in a clear positive real-world impact. Kudos to Microsoft’s team behind it!"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But while we were winning the technical battle, the war was already over. Microsoft had split the browser’s soul in two, drifting between the legacy of Internet Explorer and the fresh start of Edge. We were optimizing a masterpiece while the gallery was being demolished. It didn’t matter that our tech was superior; the market had moved, the trust had eroded, and the remaining market share was evaporating.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The Lesson&lt;/strong&gt;: You can be the best in the world at something that no longer matters.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The Patent Trap: Groundbreaking vs. Market-Ready
&lt;/h2&gt;

&lt;p&gt;I saw the same ghost appear again at &lt;strong&gt;Ionic Security&lt;/strong&gt;. We weren’t just building another app; we were creating groundbreaking security infrastructure. I have the patents to prove it. I have tangible evidence of innovation in its purest form. We solved problems others hadn't even identified.&lt;/p&gt;

&lt;p&gt;Yet, a startup is a race between discovery and exhaustion. We had the breakthrough, but we couldn't find the "problem-shaped hole" in the market to fit it into. We had a solution in search of a customer base that wasn't ready to change. Again, I found myself holding a piece of "superior" technology that was destined to sit on a shelf.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Philosophy of the "Clean Exit"
&lt;/h2&gt;

&lt;p&gt;When you pour your life into a compiler or a startup, "giving up" feels like a betrayal of your own craft.  We fall into the &lt;em&gt;&lt;a href="https://en.wikipedia.org/wiki/Sunk_cost" rel="noopener noreferrer"&gt;Sunk Cost Fallacy&lt;/a&gt;&lt;/em&gt;, believing that if we just optimize one more path or secure one more patent, the world will finally wake up and see the merit.&lt;/p&gt;

&lt;p&gt;But there is a profound difference between &lt;strong&gt;failing&lt;/strong&gt; and &lt;strong&gt;being a failure&lt;/strong&gt;. Here is the framework I've adopted:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Code is Ephemeral, the Engineer is Permanent&lt;/strong&gt;: Chakra and Ionic were just containers for my growth. The containers leaked, and eventually, they broke. But the liquid, the expertise, the resilience, the ability to solve the "unsolvable" is still mine. I'm reminded of Bruce Lee "Be like water my friend."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context is King&lt;/strong&gt;: You can write the most efficient loop in history, but if the power is cut to the building, the loop doesn't run. Moving on isn't an admission of poor quality; it’s an admission of changing context.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Meaning vs. Utility&lt;/strong&gt;: Just because a project didn't achieve market dominance doesn't mean it wasn't meaningful. The patents exist. The benchmarks were hit. The bridge was built perfectly; it’s not the engineer’s fault if the river changed course.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Knowing the Hour
&lt;/h2&gt;

&lt;p&gt;The hardest skill to learn in tech isn't a new language especially with LLMs these days; it’s the ability to look at a "perfect" piece of work and realize it’s time to walk away. We often stay too long because we want the world to validate our effort. We want the market share to reflect our IQ.&lt;/p&gt;

&lt;p&gt;The world doesn't owe our code a living. When you realize the ship is split in two, or the customers aren't coming, the most logical thing you can do is take your tools and find a new shore.&lt;/p&gt;

&lt;p&gt;You aren't abandoning your work. You are preserving your talent for a place where the wind is actually blowing. I have suffered from sticking around too long in the past. My rule for the last few years is give everything 18 months. If its still fun and you are seeing success stick with it. If you feel stuck move on.&lt;/p&gt;

</description>
      <category>chakra</category>
      <category>growth</category>
      <category>ionicsecurity</category>
      <category>memgc</category>
    </item>
    <item>
      <title>The "Certainty Tax": Why Big Tech Will Never Use Wine or Darling for CI</title>
      <dc:creator>Farzon Lotfi</dc:creator>
      <pubDate>Tue, 21 Apr 2026 23:30:00 +0000</pubDate>
      <link>https://forem.com/farzon/the-certainty-tax-why-big-tech-will-never-use-wine-or-darling-for-ci-cfn</link>
      <guid>https://forem.com/farzon/the-certainty-tax-why-big-tech-will-never-use-wine-or-darling-for-ci-cfn</guid>
      <description>&lt;p&gt;In the world of DevOps, there is an obvious, glaring financial inefficiency: macOS and Windows VMs are a rip-off. If you’re running GitHub Actions or CircleCI, a macOS runner can cost you &lt;strong&gt;10x more per minute&lt;/strong&gt; than a standard Linux runner. For a Fortune 500 company running thousands of builds a day, that bill is staggering.&lt;/p&gt;

&lt;p&gt;Theoretically, tools like &lt;strong&gt;&lt;a href="https://www.winehq.org/" rel="noopener noreferrer"&gt;Wine&lt;/a&gt;&lt;/strong&gt; (for Windows apps) and &lt;strong&gt;&lt;a href="https://www.darlinghq.org/" rel="noopener noreferrer"&gt;Darling&lt;/a&gt;&lt;/strong&gt; (for macOS apps) offer a "cheat code". They allow you to run native apps on dirt-cheap Linux hardware.&lt;/p&gt;

&lt;p&gt;Yet, big corporations won't touch them. They’d rather set piles of cash on fire paying for native VMs. Why? Because in the modern era of software, &lt;em&gt;predictability is more valuable than capital&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblogger.googleusercontent.com%2Fimg%2Fa%2FAVvXsEiT9NaaGodXo1LueKbKymJiu4RvmhrVdMoLVKgQrRDQ81t3IThr4juH8elYctH_18j6VIyc1MA-nuA54X4zv52sNB6YS9_lVKjDpIa9wUdnX3UScsnmaRCqp3Jg00CyxEc5ucnB1WiTf91XYl7Z7uWwyIMCo_0MoM_m4HbwP8old0AkfX9-CmEdRrIc5go%3Dw397-h400" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblogger.googleusercontent.com%2Fimg%2Fa%2FAVvXsEiT9NaaGodXo1LueKbKymJiu4RvmhrVdMoLVKgQrRDQ81t3IThr4juH8elYctH_18j6VIyc1MA-nuA54X4zv52sNB6YS9_lVKjDpIa9wUdnX3UScsnmaRCqp3Jg00CyxEc5ucnB1WiTf91XYl7Z7uWwyIMCo_0MoM_m4HbwP8old0AkfX9-CmEdRrIc5go%3Dw397-h400" alt="Meme showing Big Techs need for Certainty" width="396" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you read my last two (&lt;a href="https://blog.farzon.org/2026/04/the-warf-way-seamless-windows-testing.html" rel="noopener noreferrer"&gt;one&lt;/a&gt; &amp;amp; &lt;a href="https://blog.farzon.org/2026/04/the-warf-way-part-ii-tackling-macos.html" rel="noopener noreferrer"&gt;two&lt;/a&gt;) blog posts on using Wine and Darling for testing the conclusion of this post will surprise you. I know I left you with the impression that I am recommending putting these tools into your CI workflows. That is far from the truth. I think they help speed up development but should not be relied on up for behavioral correctness if you have the resources of big tech and I will explain why.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The Death of the 80/20 Rule
&lt;/h2&gt;

&lt;p&gt;We used to live by the &lt;a href="https://en.wikipedia.org/wiki/Pareto_principle" rel="noopener noreferrer"&gt;Pareto Principle&lt;/a&gt;: focus on the 20% of code that handles 80% of the use cases. In the "99% Era," that logic is professional negligence.&lt;/p&gt;

&lt;p&gt;When you have 100 million users, a "1-in-a-million" edge case happens 100 times a day. As scale increases, the "Long Tail" of software becomes the "Main Body."&lt;/p&gt;

&lt;p&gt;If Wine has a slight discrepancy in how it handles a specific Windows GDI+ drawing call, and that discrepancy leads to a crash on actual Windows 11 hardware, you haven't saved money. You’ve just created the enviornment for a catastrophe.&lt;/p&gt;

&lt;p&gt;For a giant like Adobe or Microsoft, an app that is "99% compatible" with its host OS is effectively broken.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. The Law of Leaky Abstractions
&lt;/h2&gt;

&lt;p&gt;In one of my favorite essay, &lt;em&gt;&lt;a href="https://www.joelonsoftware.com/2002/11/11/the-law-of-leaky-abstractions/" rel="noopener noreferrer"&gt;The Law of Leaky Abstractions&lt;/a&gt;&lt;/em&gt;, Joel Spolsky noted that all non-trivial abstractions are, to some degree, leaky.&lt;/p&gt;

&lt;p&gt;Wine and Darling are masterpieces of engineering, but they are cleanroom abstractions. They mimic how an OS &lt;em&gt;should&lt;/em&gt; behave, not necessarily how it &lt;em&gt;does&lt;/em&gt; behave under the stress of weird drivers, specific kernel patches, or proprietary Apple silicon quirks.&lt;/p&gt;

&lt;p&gt;Corporations aren't just paying for a runner; they are paying for &lt;strong&gt;&lt;a href="https://ubuntu.com/blog/how-environmental-parity-accelerates-automotive-software-development" rel="noopener noreferrer"&gt;Environmental Parity&lt;/a&gt;&lt;/strong&gt;. They need to know that if the code passes in CI, it will pass on a customer’s laptop.&lt;/p&gt;

&lt;p&gt;The moment you introduce a translation layer, you introduce a "parity gap." If a test fails, your engineers now have two problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is the app broken?&lt;/li&gt;
&lt;li&gt;Or is the abstraction (Wine/Darling) broken?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Big Tech hates "fixing the test infrastructure" more than it hates high compute bills.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. The Math of Risk: Why 99.9% is a Failure
&lt;/h2&gt;

&lt;p&gt;To a startup, 99.9% uptime (three nines) sounds like a dream. To Amazon, it’s a nightmare.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;99.9% Uptime = 8.77 hours of downtime/year.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The Cost: With Amazon’s revenue, an hour of downtime can cost upwards of $65 million.&lt;/p&gt;

&lt;p&gt;If using a native Windows VM instead of Wine reduces the risk of a "blind spot" bug by even 0.01%, the VM has already paid for itself a thousand times over.&lt;/p&gt;

&lt;p&gt;Corporations have a low-risk tolerance because their blast radius is massive. A botched release doesn't just annoy a few users; it triggers thousands of support tickets, legal SLA credits, and a permanent stain on brand equity.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. The "Certainty Tax"
&lt;/h2&gt;

&lt;p&gt;Ultimately, big corporations view expensive CI costs as a &lt;strong&gt;Certainty Tax&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;They aren't looking for the most "clever" way to run a test; they are looking for the most "boring" way. A native macOS VM is boring. It is predictable. It is supported by a multi-billion dollar vendor you can escalate to if it breaks.&lt;/p&gt;

&lt;p&gt;Wine and Darling are for the tinkers, the innovators, and the budget-conscious indies. But for the giants, the goal isn't to save a few pennies on compute. The goal is to ensure that when they hit "Deploy," the world doesn't break.&lt;/p&gt;

</description>
      <category>bigtech</category>
      <category>darling</category>
      <category>vms</category>
      <category>wine</category>
    </item>
  </channel>
</rss>
