<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.3.4">Jekyll</generator><link href="https://horiajurcut.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://horiajurcut.github.io/" rel="alternate" type="text/html" /><updated>2026-05-12T00:11:11+02:00</updated><id>https://horiajurcut.github.io/feed.xml</id><title type="html">The Impostor Engineer</title><subtitle>Notes on programming, math, hardware and AI.</subtitle><author><name>Horia Jurcut</name><email>horia.dragos@gmail.com</email></author><entry><title type="html">Hello, world.</title><link href="https://horiajurcut.github.io/2026/05/09/hello-world/" rel="alternate" type="text/html" title="Hello, world." /><published>2026-05-09T09:00:00+02:00</published><updated>2026-05-09T09:00:00+02:00</updated><id>https://horiajurcut.github.io/2026/05/09/hello-world</id><content type="html" xml:base="https://horiajurcut.github.io/2026/05/09/hello-world/"><![CDATA[<p>I am starting this notebook the way every program does: with a small,
declarative “hello.” A low-stakes thing that says <em>I am here, I intend to
learn, and I am going to leave a trail.</em></p>

<p>For the last decade I’ve shipped software for a living. Now I want to climb
underneath it. The plan is old-fashioned: start at the math, work up through
the silicon, and only then, slowly, through the systems that train and serve
modern models.</p>

<aside class="aside">
This notebook is built with Jekyll, deployed automatically to GitHub Pages on
every push. New post, new commit, new page on the internet.
</aside>

<h2 id="a-small-map-of-where-im-going">A small map of where I’m going</h2>

<p>There are roughly four directions I want to push at, and they will take turns
being interesting:</p>

<ul>
  <li><strong>Math.</strong> Linear algebra first, then multivariable calculus, then
probability. Not a survey; I want to be able to <em>derive</em>, not just
recognize.</li>
  <li><strong>Software.</strong> Python by day, C and Rust on the weekends, with detours
into CUDA when I am brave.</li>
  <li><strong>Hardware.</strong> What an SM is, what an HBM stack costs you, why
bandwidth and not flops is the budget that matters.</li>
  <li><strong>Models.</strong> Eventually. First as a reader, then a re-implementer,
then, hopefully, as someone who can have an opinion.</li>
</ul>

<h2 id="a-taste-of-what-posts-will-look-like">A taste of what posts will look like</h2>

<p>To shake the site out, here is one math idea, one diagram, and one snippet
of code. The three things I expect to lean on most.</p>

<h3 id="math">Math</h3>

<p>The gradient of a scalar field $f : \mathbb{R}^n \to \mathbb{R}$ is the vector
of its partial derivatives. It points in the direction of steepest ascent, and
its negation is the workhorse of every optimizer I will write this year:</p>

<div class="kdmath">$$
\nabla f(\mathbf{x}) \;=\; \left[
\frac{\partial f}{\partial x_1},\;
\frac{\partial f}{\partial x_2},\;
\ldots,\;
\frac{\partial f}{\partial x_n}
\right]^{\top}.
$$</div>

<p>Gradient descent is then nothing more than the rule
$\mathbf{x}_{t+1} = \mathbf{x}_t - \eta \nabla f(\mathbf{x}_t)$, and most of
training is a discussion about how to be clever with $\eta$.</p>

<h3 id="diagrams">Diagrams</h3>

<p>Here is the mental model I keep returning to: the loop a learning system
runs forever.</p>

<figure class="diagram" data-napkin="">
  <script type="application/json">
  {
    "type": "flow",
    "nodes": [
      { "id": "d", "label": "data", "shape": "ellipse" },
      { "id": "m", "label": "model\nfθ" },
      { "id": "p", "label": "ŷ" },
      { "id": "l", "label": "loss" }
    ],
    "edges": [
      { "from": "d", "to": "m" },
      { "from": "m", "to": "p" },
      { "from": "p", "to": "l" },
      { "from": "l", "to": "m", "label": "∂ℓ/∂θ", "back": true }
    ]
  }
  </script>
  <figcaption>The training loop: forward pass left-to-right, gradient flowing back.</figcaption>
</figure>

<p>Everything else (Adam, batch norm, attention, scaling laws) is commentary
on this picture.</p>

<p>For diagrams that need annotated cells with pointers, like “what’s on the
stack right now,” I use a tiny declarative DSL that renders to a real
hand-drawn SVG. rough.js under the hood, same engine as Excalidraw:</p>

<figure class="diagram" data-napkin="">
  <script type="application/json">
  {
    "type": "array",
    "cells": ["x₀", "x₁", "x₂", "x₃", "x₄", "x₅", "", ""],
    "indices": true,
    "pointers": [
      { "label": "start",    "at": 0 },
      { "label": "current",  "at": 4 },
      { "label": "stackTop", "at": 6 }
    ],
    "bracket": { "label": "iterations of gradient descent", "from": 0, "to": 5 }
  }
  </script>
  <figcaption>An iterate buffer: each cell is a step along the descent path.</figcaption>
</figure>

<p>Just write the schema in JSON inside the figure; the page renders the
picture on load. For one-off illustrations I’ll also reach for
<strong>Excalidraw</strong>: draw it, <em>Export → SVG</em>, paste the SVG into a
<code class="language-plaintext highlighter-rouge">&lt;figure class="diagram"&gt;</code>. The two together cover most of what
<em>Crafting Interpreters</em> and <em>Game Programming Patterns</em> do by hand.</p>

<h3 id="code">Code</h3>

<p>A tiny gradient descent in Python that I will reuse and abuse for months:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">numpy</span> <span class="k">as</span> <span class="n">np</span>

<span class="k">def</span> <span class="nf">gradient_descent</span><span class="p">(</span><span class="n">grad</span><span class="p">,</span> <span class="n">x0</span><span class="p">,</span> <span class="n">lr</span><span class="o">=</span><span class="mf">1e-2</span><span class="p">,</span> <span class="n">steps</span><span class="o">=</span><span class="mi">1_000</span><span class="p">):</span>
    <span class="sh">"""</span><span class="s">Take `steps` along -∇f starting from x0.</span><span class="sh">"""</span>
    <span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">asarray</span><span class="p">(</span><span class="n">x0</span><span class="p">,</span> <span class="n">dtype</span><span class="o">=</span><span class="nb">float</span><span class="p">)</span>
    <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="n">steps</span><span class="p">):</span>
        <span class="n">x</span> <span class="o">-=</span> <span class="n">lr</span> <span class="o">*</span> <span class="nf">grad</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">x</span>

<span class="c1"># Minimize f(x, y) = (x - 3)^2 + (y + 1)^2
</span><span class="n">grad_f</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">v</span><span class="p">:</span> <span class="n">np</span><span class="p">.</span><span class="nf">array</span><span class="p">([</span><span class="mi">2</span> <span class="o">*</span> <span class="p">(</span><span class="n">v</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">-</span> <span class="mi">3</span><span class="p">),</span> <span class="mi">2</span> <span class="o">*</span> <span class="p">(</span><span class="n">v</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)])</span>
<span class="nf">print</span><span class="p">(</span><span class="nf">gradient_descent</span><span class="p">(</span><span class="n">grad_f</span><span class="p">,</span> <span class="p">[</span><span class="mf">0.0</span><span class="p">,</span> <span class="mf">0.0</span><span class="p">]))</span>   <span class="c1"># → ~[3, -1]
</span></code></pre></div></div>

<div class="callout callout--note">
  <span class="callout__label">Note</span>
  This is a notebook, not a textbook. Posts will be short, opinionated, and
  occasionally wrong. I will edit shamelessly and date the corrections.
</div>

<h2 id="whats-next">What’s next</h2>

<p>Three posts queued in my head:</p>

<ol>
  <li><em>Why a matrix is a function</em>, and what changes when you start believing it.</li>
  <li><em>A from-scratch autograd in 90 lines</em>, with no magic.</li>
  <li><em>What an H100 actually does in a microsecond</em>, a budget post.</li>
</ol>

<p>If any of that sounds like fun, <a href="/feed.xml">subscribe to the feed</a> or just
check back. The site is small and the writing will be slow, but consistent.</p>

<p>Onward.</p>]]></content><author><name>Horia Jurcut</name><email>horia.dragos@gmail.com</email></author><category term="journal" /><category term="intro" /><category term="plan" /><summary type="html"><![CDATA[Why I'm starting this notebook, and what's on the horizon.]]></summary></entry></feed>