<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Henry Lucco</title>
        <link>https://hlucco.dev</link>
        <description>Personal blog and portfolio</description>
        <lastBuildDate>Mon, 25 May 2026 04:15:09 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <copyright>All rights reserved 2026, Henry Lucco</copyright>
        <item>
            <title><![CDATA[Everyone Should Program]]></title>
            <link>https://hlucco.dev/posts/everyone-should-program.html</link>
            <guid>https://hlucco.dev/posts/everyone-should-program.html</guid>
            <pubDate>Tue, 14 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[If everyone is reading and writing documents, who understands the code?]]></description>
            <content:encoded><![CDATA[<p>I currently work for a heavily bureaucratic software company. One of the most common requests I get when trying to make progress towards shipping is &quot;send me the doc&quot; or &quot;is there a doc?&quot; or the most offensive: &quot;we need to see a doc for this before we can move forward&quot;. Everyone wants to read the doc, everyone is involved with the doc and adding comments to it, and there is a vibrant and thriving market of documents be shared throughout the organization.</p>
<p>This one of the biggest blockers to the company making progress in any meaningful way.</p>
<p>Now, I should clarify that I am not blindly anti-doc. For the majority of non-technical employees, a document is the appropriate format for communication. The product managers I have worked with communicate largely through specification documents and various tickets, epics, and other project abstractions. The human resources specialists I have collaborated with maintain sets of documents with policies and other relevant information. This is appropriate as these people, for the most part, do not possess the necessary training or skills to create any other type of artifact. As a contrast, designers are producing and consuming mocks or flows of some sort, the same way that engineers and other technical employees (engineering managers, engineering directors, VP of engineering, CTO, etc.) should be producing and consuming code.</p>
<p>Documents on their own do not create problems, and have a wide range of use cases for which they are appropriate. The problem arises when an organization&#39;s culture shifts to encourage technical discussion through documents rather than code.</p>
<p>Programming languages were invented to allow human beings who predominantly communicate in natural language to express intent in a clear and specific enough manor to avoid ambiguity. Without programming languages, it is impossible to specify technical details in a way that isn&#39;t subject to misinterpretation. As a result, in order to contribute positively, a computer scientist must become fluent in these languages, so that they can express themselves to both the computer and other human contributors in a way that is both understandable and does not leave details to the imagination.</p>
<p>This is not to say that abstract conversations about computer science are not productive. These conversations are generally required for education and the building of a shared understanding, but they are never the definitive source of truth. That honor is reserved for the software artifact created as a result of the discussion, rather than the discussion itself.</p>
<p>Unsuccessful engineering orgs lose sight of this principal in favor of the &quot;design document&quot;.</p>
<p>What is the design document?</p>
<p>This can vary from org to org, but for most a design document is typically supposed to describe the following:</p>
<ol>
<li>The top down architecture of the system being built and it&#39;s components (the classic boxes with arrows).</li>
<li>The interfaces for which the system will interact with it&#39;s dependencies and customers.</li>
<li>The structure of the code that will be written and how it will be organized.</li>
<li>How the system will be tested.</li>
<li>How the code will be deployed.</li>
<li>Logging, alerting, and metrics that will support the system.</li>
<li>Justifications and research to support the above.</li>
</ol>
<p>The theory behind this concept is sound: &quot;software is complicated and expensive to build, requiring the manpower of multiple people and serious time and commitment, if we don&#39;t have a plan for it then how can we ensure it will be built properly?&quot;. Or more practically, if multiple people are supposed to collaborate on a project, how will they know what to do without a document describing what needs to be done?</p>
<p>These two challenges (needing a plan and building a shared understanding for collaboration) are why most people building software accept and support the writing and sharing of a design document, and are stubbornly afraid to push forward without it. For these people, the design document represents a safe and paved road through the dark and forboding jungle of possible constraints, tradeoffs, and design decisions as well as a bulwark to cower behind in the event that something goes wrong.</p>
<p>Security issue? The security review of the design doc will catch it.</p>
<p>Scaling concern? The system design panel reviewing the design doc will catch it.</p>
<p>System inconsistent with the product specification? Just make sure the design doc matches the product spec, and you are all set.</p>
<p>These are the promises of the design document, and the foundation of sand on which modern software is built.</p>
<p>The allure of the design whispers in the ears of developers, middle management, VP&#39;s, and executives alike and convinces them that all of these problems can be solved through review and writing.</p>
<p>After the n&#39;th review of the document, everyone feels satisfied. The debates have been had, concerns have been heard, revisions have been made, and a few months after the ideas conception, engineers can finally begin programming, it should be easy now seeing as all the hard problems have already been solved, after all we have an ironclad design document to refer to.</p>
<p>As anyone who has participated in this process before will tell you, this is not what happens in practice. Unforeseen blockers arise, progress is delayed, new tradeoffs must be made, and in the event of success, someone is still paged in the middle of the night to allocate more nodes to handle demand.</p>
<p>Why does this happen? We went through the design document thoroughly, everyone reviewed and signed off on it, was the entire engineering org wrong?</p>
<p>No, everyone was right. That is the problem.</p>
<p>The design document was written in natural language, which is far too abstract to express the real issues that will arise from the implementation of whatever complex system is being described. </p>
<p>The situation described above where actual software is written is the best case scenario. In most cases, the document serves to block progress rather than enable it.</p>
<p>A design document allows all of the planning and ideas to take place in the world of abstraction, and as it is abstraction through natural language there are infinite ways to prove, disprove, undermine, or overwrite the various ideas contained in the document. A developer who wants to block the document can say &quot;this won&#39;t scale because of x&quot;, a security engineer who doesn&#39;t want to be responsible for a new vulnerability can say &quot;we don&#39;t support that type of connection here, so you can&#39;t build it that way&quot;, a product manager can say &quot;this won&#39;t match arbitrary requirement a, because it first needs to do b&quot; and all would be right, because no software has actually been written. In each contributor&#39;s head, there is a narrative describing the final outcome based on their own interpretation of what is written, and for each of these people that narrative will be different. In many cases drastically so.</p>
<p>As each individual maintains their own idea and interpretation of the system, there is inevitable conflict and confusion over what the document is actively describing, and this is where progress breaks down.</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Enterprise Productivity Increases With Agentic Development]]></title>
            <link>https://hlucco.dev/posts/notes_llms_enterprise.html</link>
            <guid>https://hlucco.dev/posts/notes_llms_enterprise.html</guid>
            <pubDate>Mon, 23 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Observations since the Claude Code Inflection (12/2025)]]></description>
            <content:encoded><![CDATA[<p>I want to preface these observations with the following: I do not claim to be an expert in the practical applications of large language models or their applications for generating software. I am just a programer and am exploring and learning about their practical applications at the same rate as everyone else. Much slower than the majority if Twitter and Reddit are to be believed. This being said, due to the experiments I have run and my early adoption of the various tools, I have been thrust into a position where I am regarded as such an expert by the people I work with, and have thus attempted to adapt to that responsibility.</p>
<p>First, some relevant context about where I work. I am currently a senior software engineer at a very late stage (series F) software as a service startup of about a thousand people. Of these thousand there are about two hundred and fifty engineers managed by engineering managers, directors, and a vice president of engineering. Per directive from the CEO and the CPO (Head of Product), it is the responsibility of the VP and the directors to harness the latent potential of these new generative tools to obtain the fabled &quot;LLM Productivity Boost&quot; that they are hearing about at various conferences, interactions with peers, and social media.</p>
<h4>LLM Productivity Boost</h4>
<p>I define the &quot;LLM Productivity Boost&quot; as a hype cycle where various teams claim to complete herculean tasks by properly organizing their team with agentic development in mind, then relying heavily on the agent to generate vast amounts of complex code incredibly quickly. Some examples include: the <a href="https://www.anthropic.com/engineering/building-c-compiler">Claude C Compiler</a>, the <a href="https://www.reddit.com/r/amazonemployees/comments/1oln543/was_aws_bedrock_entirely_refactored_by_ai_in_one/">Eight Person Bedrock Rewrite</a>, and <a href="https://stripe.dev/blog/minions-stripes-one-shot-end-to-end-coding-agents-part-2">Stripe&#39;s Minions</a>. The reason I say <em>claim</em> here being that the Claude C Compiler <a href="https://github.com/anthropics/claudes-c-compiler/issues/228">cannot compile hello world</a> and the eight person Bedrock rewrite has been debunked by numerous AWS employees. Stripe Minions appear to be effective, at least they seem to be from the internal tools we have built replicating their described workflow, but are limited to small tasks.</p>
<p>To achieve these productivity gains, the VP and their directors are dutifully studying the tools and appointing individual contributors (deemed &quot;expert in generative AI&quot;) to carry out the task of equipping the other engineers with the environment needed to facilitate fully agentic development. The nature of the tasks needed to accomplish this goal are anyone&#39;s guess, but have at least started with a series of debates on how productivity itself should be measured.</p>
<h4>Hypotheses of Agentic Development</h4>
<p>There are a multitude of proposed paradigms circulating for how to efficiently use LLMs to build software, but the majority can be distilled into the following two hypotheses:</p>
<ol>
<li>Autonomous LLM agents will increase the rate at which I can ship features.</li>
<li>The bottlenecks I previously faced in my engineering org can now be automated away.</li>
</ol>
<!-- In addition to these hypotheses there are a few common proposals for invariants:

1. A human being must review all of the code generated by agents.
2. One individual contributor must be working on multiple tasks at once in parallel. -->

<p>Alone, each of these statements appears reasonable, especially with the overwhelming marketing campaigns enacted by the model providers (OpenAI, Anthropic, etc.) themselves. It is evident from the marketing <a href="https://finance.yahoo.com/news/nvidia-ceo-jensen-huang-claims-agi-has-been-achieved-can-create-billion-dollar-businesses-172225126.html?guccounter=1&guce_referrer=aHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS8&guce_referrer_sig=AQAAAFhqSQ3tlRljjpWGzlkjqYDniE6OLfM-zeZMHKyOmJx8SOIkUNR3HjNaZ8s6wS276ZkNJdNgvmoCckFL6uepwb3S2kukIkyKAKhMo_-HkoOA5JIiJtYFhcTOWVmvQ7H8mKeR77W_srK7h1dl5WZdKrFFhsYk8NxZgW_dMzSS3rkl">example A</a> and <a href="https://techcrunch.com/2026/03/18/sam-altmans-thank-you-to-coders-draws-the-memes/">example B</a>, that billions of the bubble dollars are being allocated towards driving adoption that will increase the bubble&#39;s size. </p>
<p>When building a video game, teams employ the &quot;player fantasy&quot; to inform design decisions. The player fantasy refers to &quot;core emotional experience or power trip a player wants to feel when playing a game&quot;. Generative and agentic tools are marketed with the same mechanism, but instead of game mechanics, agentic tools promise the hypotheses above: I can ship faster, and my bottlenecks will be automated away. Or worded differently: I am no longer dependent on people with skills I do not possess to accomplish my goals.</p>
<h4>The reality is, predictably, much messier.</h4>
<p>Let&#39;s take a new settings menu as an example. The current agentic tools are geared towards generating code, and a functioning enterprise organization has multiple parts before and after implementation that also take time. Product must create a spec for what settings will be available and what the knobs will change, design must create the flows for the UI, multiple system design reviews are conducted to ensure the implementation of the knobs will not break the rest of the application, a security review must take place to ensure customers can&#39;t change anything dangerous. Once this is all finally complete, a single developer with an agentic tool might finish the implementation in a day, but two months have already gone by since the ideas conception. </p>
<p>This all takes place under the generous assumption that the org&#39;s procedures were properly followed.</p>
<p>Human nature is much more dynamic, and while some organizations have a strong culture and process, the majority do not. Rather than waiting for the design reviews the developer implements without a plan. The UI is added on top later once design is finished, and product decides the designs don&#39;t match their specification when everything is revealed at an unrecorded ad-hoc meeting. Engineers from another team on which the feature depends block various pull requests, then go on vacation. Nobody will remember the security team&#39;s existence until there is a P0 security incident months in the future.</p>
<p>The culmination of this dysfunctional process is a feature released months after it&#39;s conception, but the actual programming work (especially with the agentic tools) only took a few hours.</p>
<h4>So then how do we actually speed things up?</h4>
<p>It is undeniable that if properly prompted, a model can take days worth of engineering work and spit out average quality code that eighty percent of the time accomplishes the intent described. Additionally, the models shine within the realms of interpolation and repetition. By narrowing the scope and providing the model with a closed and complete system, teams can automate large amounts of work in ways that were previously impossible.</p>
<p>LLMs and agentic tools are multipliers, not creators. Given a well written codebase with minimal debt, most models can duplicate the patterns defined by the code and teams can and should automate small and menial tasks within these closed systems.</p>
<p>Due to their nature as multipliers, these models lift up the rock that covers most engineering orgs. If the org has inefficient processes, bottlenecks, or other issues that hinder productivity, these will not be magically fixed by the multiplying agent, they will exponentially worse than they were before.</p>
<h4>LLMs and agentic tools hold up a mirror to previously functional orgs, and highlight imperfections that were previously invisible.</h4>
<p>An organization that is purely blocked by implementation speed will feel the effects of agentic development instantly. For everyone else, things are going to get a lot slower before they get any better.</p>
<p><em>Further reading: <a href="https://apenwarr.ca/log/20260316">Every layer of review makes you 10x slower</a></em></p>
<!-- It is worth taking a moment here to acknowledge that the majority if not all of tech industry executives and managers view themselves as strong computer scientists and they very well may be. It is also true that no matter what the skill, every year the skill is not applied, it atrophies. The state of the art is always changing, and the experiences of someone not actively learning and improving will always become less relevant over time. -->

]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Electron, TypeScript, and Webpack]]></title>
            <link>https://hlucco.dev/posts/electron-typescript-webpack.html</link>
            <guid>https://hlucco.dev/posts/electron-typescript-webpack.html</guid>
            <pubDate>Thu, 06 Jan 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[Guide to working with Webpack to create an Electron app using TypeScript.]]></description>
            <content:encoded><![CDATA[<p>When learning how to create an Electron app, I had a hard time finding example code that explained how to build an application using TypeScript and Electron. The goal of this guide is to make the learning process easier for those who want to build their own Electron app using Typescript.</p>
<p>To begin, create a new directory and initialize it as a node module:</p>
<pre><code class="language-bash">npm init -y
</code></pre>
<p>Then, add the required dependencies to the package.json</p>
<pre><code class="language-json">&quot;devDependencies&quot;: {
    &quot;clean-webpack-plugin&quot;: &quot;^4.0.0&quot;,
    &quot;electron&quot;: &quot;^16.0.5&quot;,
    &quot;html-webpack-plugin&quot;: &quot;^5.5.0&quot;,
    &quot;ts-loader&quot;: &quot;^9.2.6&quot;,
    &quot;typescript&quot;: &quot;^4.5.4&quot;,
    &quot;webpack&quot;: &quot;^5.65.0&quot;,
    &quot;webpack-cli&quot;: &quot;^4.9.1&quot;
}
</code></pre>
<p>Once the dependencies are set, install with</p>
<pre><code class="language-bash">npm i
</code></pre>
<p>Next up we will create a tsconfig.json file which will tell the TypeScript compiler to put our compiled code in the ./dist directory</p>
<pre><code class="language-json">{
    &quot;compilerOptions&quot;: {
        &quot;outDir&quot;: &quot;./dist/&quot;,
        &quot;noImplicitAny&quot;: true,
        &quot;module&quot;: &quot;es6&quot;,
        &quot;target&quot;: &quot;es5&quot;,
        &quot;allowJs&quot;: true,
        &quot;sourceMap&quot;: true,
        &quot;moduleResolution&quot;: &quot;node&quot;
    }
}
</code></pre>
<p>Having created a tsconfig.json, we can now create a ./src directory for three files: an index.html, electron.ts, and client.ts. First index.html is the root html page that the electron app will serve.</p>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;en&quot;&gt;
&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;meta name=&quot;viewport&quot;
        content=&quot;width=device-width,
        user-scalable=no,initial-scale=1,
        maximum-scale=1,minimum-scale=1&quot;&gt;
    &lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;ie=edge&quot;&gt;
    &lt;title&gt;TS &amp; Webpack&lt;/title&gt;&lt;/head&gt;
&lt;body&gt;
&lt;/body&gt;
&lt;/html&gt;
</code></pre>
<p>The second file electron.ts is the electron process. This file is repsonsible for creating the browser instance, serving it in a window, and for loading the root html document ./index.html.</p>
<pre><code class="language-ts">import { app, BrowserWindow } from &quot;electron&quot;;

function createWindow() {
    // Create the browser window.
    let win = new BrowserWindow({
        width: 800,
        height: 600,
        webPreferences: {
            nodeIntegration: true,
        },
    });
    // and load the index.html of the app.
    win.loadFile(&quot;../dist/index.html&quot;);
}

app.on(&quot;ready&quot;, createWindow);
</code></pre>
<p>It is important to note that the path for index.html is ../dist/index.html and not ./index.html. Finally, client.ts is the entry point for clientside functionality inside the chromium instance being served by electron.ts.</p>
<pre><code class="language-ts">window.addEventListener(&quot;load&quot;, () =&gt; {
    const header = document.createElement(&quot;h1&quot;);
    header.innerText = &quot;Webpack &amp; TS&quot;;

    const body = document.querySelector(&quot;body&quot;);
    body.appendChild(header);

    let div = document.createElement(&quot;div&quot;);
    div.innerText = &quot;Hello World!&quot;;

    body.appendChild(div);
});
</code></pre>
<p>With our ./src directory implemented, the final step is to use Webpack to package our code so that it can run in electron&#39;s browser instance. To acomplish this we will create two Webpack config files in the root directory: webpack.config.js and webpack-cli.config.js. The first config, webpack.config.js, is for the server side code in electron.ts.</p>
<pre><code class="language-js">module.exports = [
    {
        mode: &#39;development&#39;,
        entry: &#39;./src/electron.ts&#39;,
        target: &#39;electron-main&#39;,
        module: {
        rules: [{
            test: /\.ts$/,
            include: /src/,
            use: [{ loader: &#39;ts-loader&#39; }]
        }]
        },
        output: {
        path: __dirname + &#39;/dist&#39;,
        filename: &#39;electron.js&#39;
        }
    }
];
</code></pre>
<p>This module finds our electron.ts entry point for our electron process and builds it using our tsconfig.json. The second Webpack config file webpack-cli-config.js is responsible for building client.ts using tsconfig.json, and packaging it into browser code so that it runs inside the electron browser instance.</p>
<pre><code class="language-js">const HtmlWebpackPlugin = require(&#39;html-webpack-plugin&#39;);
const {CleanWebpackPlugin} = require(&quot;clean-webpack-plugin&quot;);
const path = require(&#39;path&#39;);

module.exports = {
    mode: &quot;production&quot;,
    entry: path.resolve(__dirname, &#39;./src/clientmain.ts&#39;),
    module: {
        rules: [
            {
            test: /\.tsx?$/,
            use: &#39;ts-loader&#39;,
            exclude: /node_modules/,
            },
        ],
    },
    resolve: {
        extensions: [&#39;.tsx&#39;, &#39;.ts&#39;, &#39;.js&#39;],
    },
    // &lt;- ensure unique bundle name
    output: {
        filename: &#39;bundle.[hash].js&#39;,
        path: path.resolve(__dirname, &#39;dist&#39;),
    },
    plugins: [
        new CleanWebpackPlugin(),
        new HtmlWebpackPlugin({
            template: path.resolve(__dirname,
            &quot;./src/index.html&quot;)
        })
    ]
};
</code></pre>
<p>Now we update our package.json to run and build properly:</p>
<pre><code class="language-json">&quot;scripts&quot;: {
&quot;start&quot;: &quot;npm run build &amp;&amp; electron dist/electron.js&quot;,
&quot;build&quot;: &quot;webpack --config ./webpack-cli.config.js &amp;&amp;
          webpack --config ./webpack.config.js&quot;
},
</code></pre>
<p>and run our application using</p>
<pre><code class="language-bash">npm start
</code></pre>
<p>An example repo containing this code can be found <a href="https://github.com/hlucco/electron-typescript-webpack">here</a>.</p>
]]></content:encoded>
        </item>
    </channel>
</rss>