<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Agility!]]></title><description><![CDATA[Thoughts on better ways to build software.]]></description><link>https://blog.holub.com</link><image><url>https://substackcdn.com/image/fetch/$s_!p0LI!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6bb5277-5e41-40a2-b723-b4b2bba7543f_1070x1070.png</url><title>Agility!</title><link>https://blog.holub.com</link></image><generator>Substack</generator><lastBuildDate>Tue, 19 May 2026 04:04:14 GMT</lastBuildDate><atom:link href="https://blog.holub.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Allen Holub]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[allen@holub.com]]></webMaster><itunes:owner><itunes:email><![CDATA[allen@holub.com]]></itunes:email><itunes:name><![CDATA[Allen Holub]]></itunes:name></itunes:owner><itunes:author><![CDATA[Allen Holub]]></itunes:author><googleplay:owner><![CDATA[allen@holub.com]]></googleplay:owner><googleplay:email><![CDATA[allen@holub.com]]></googleplay:email><googleplay:author><![CDATA[Allen Holub]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[The Real AI Advantage]]></title><description><![CDATA[It's the tighter inspect-and-adapt loop.]]></description><link>https://blog.holub.com/p/the-real-ai-advantage</link><guid isPermaLink="false">https://blog.holub.com/p/the-real-ai-advantage</guid><dc:creator><![CDATA[Allen Holub]]></dc:creator><pubDate>Tue, 12 May 2026 15:52:01 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!p0LI!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6bb5277-5e41-40a2-b723-b4b2bba7543f_1070x1070.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>People seem to have forgotten that the point of creating products in small iterations is to get the continuous feedback necessary to produce a great product. It has nothing to do with coding mechanics. The idea is that very few customers know what they want until they get something into their hands. So, get something into their hands, get some feedback, and adjust. Small increments (because nobody, including customers, has the cognitive bandwidth to handle an avalanche of changes all at once), frequent releases (daily is ideal), continuous improvement.<br><br>Meanwhile, the stans all tell me that the "right way" to use AI is to create a vast amount of code all at once. So much, in fact, that it's not feasible to examine it. Honestly, though, pushing out all that code in one chunk works against us from a product development perspective. I'm not saying we shouldn't use AI, but maybe we're not going about using it in the best way, at least not if we intend to produce products people actually want to buy.<br><br>That all-at-once mindset has led us back to traditional shove-it-down-the-customers-throats waterfall thinking. Build something huge, some "great idea!" that we're convinced will "disrupt the market!" with its "revolutionary!" approach &#128580;. Then try to convince customers that they actually need it. Often, the market remains unconvinced. That's a sales-driven approach.<br><br>Compare that to a marketing approach, where you figure out what the customers need first, then build that. That's where small increments come into play. It's not a coding strategy; it's a market-research strategy that's more effective (at least faster and cheaper) than doing it with mock-ups. It's a way to figure things out while we're building, rather than before. The traditional critique is that it's somehow "cheaper" to mock up the idea first, but that thinking doesn't factor in the opportunity cost of the time delay and overestimates the cost of actually building it. In this brave new AI world, that cost is lower than ever.<br><br>The AI advantage is a tight inspect-and-adapt loop that gets us feedback sooner. Leverage that.</p>]]></content:encoded></item><item><title><![CDATA[Value Is Not Proportional to Quantity]]></title><description><![CDATA[One of the dysfunctions that AI amplifies is the software industry's obsession on output.]]></description><link>https://blog.holub.com/p/value-is-not-proportional-to-quantity</link><guid isPermaLink="false">https://blog.holub.com/p/value-is-not-proportional-to-quantity</guid><dc:creator><![CDATA[Allen Holub]]></dc:creator><pubDate>Sun, 10 May 2026 17:41:35 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!p0LI!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6bb5277-5e41-40a2-b723-b4b2bba7543f_1070x1070.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>One of the dysfunctions that AI amplifies is the software industry's obsession on output. The move to AI is all about increasing output. Robot monkeys type faster and produce more output than people. The problem, of course, is that it's never been output that's the problem. Producing a garbage product faster benefits nobody; never has. It's good outcomes (e.g., happy customers, painless improvements) that we need, not more output.<br><br>That's not to say that, within limits, producing code faster is a bad thing. For one thing, getting working code into customers' hands faster gets us better feedback sooner. But. The best way to increase speed, whether or not AI is in the picture, is to not build things nobody wants. AI often does the opposite. I was reading this morning about the huge security holes in systems created by several of the vibe-coding platforms. Nobody wants security breaches. The customers certainly don't, and ultimately, given the legal liability and loss of customer goodwill, neither does the company. The same applies to even big platforms like Amazon, getting buggier and buggier by the minute. Nonetheless, the siren call of more output seems to push companies into doing things that are not in their best interests.<br><br>The other related assumption is that more code is somehow a good thing. That's also never been true. More code adds complexity. It hides bugs. It's harder to maintain (even with an AI doing the maintaining&#8212;loading 500K lines of code into a single context to fix a bug is not only expensive, but will probably introduce five more bugs for every one you fix). We always want the smallest, simplest thing that solves exactly the problem at hand and nothing else. Ego-driven development by people who pat themselves on the back and do a happy dance every time they create more more more, without bothering to look at what, exactly, that "more" entails, gets us nowhere good.<br><br>I have to add&#8212;to head of the inevitable wild-eyed cultists&#8212;that I am far from opposed to AI assistance. I use it myself, and any software shop that doesn't avail itself of effective tools has got worse problems than an output focus. However, we have to use AI in the context of producing value; value to both the customer and to the engineers. Value is not proportional to quantity.</p>]]></content:encoded></item><item><title><![CDATA[Software Development is Dancing]]></title><description><![CDATA[Software development is a dance.]]></description><link>https://blog.holub.com/p/software-development-is-dancing</link><guid isPermaLink="false">https://blog.holub.com/p/software-development-is-dancing</guid><dc:creator><![CDATA[Allen Holub]]></dc:creator><pubDate>Fri, 08 May 2026 16:29:44 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!p0LI!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6bb5277-5e41-40a2-b723-b4b2bba7543f_1070x1070.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Software development is a dance.<br><br>Developers and managers could learn a lot from partner dancing (actual dancing, not the choreographed Dancing with the Stars stuff). I know this can be a loaded topic because of how incompetent men twist around the lead-follow concept, but the fact that you see exactly the same dynamic in incompetent managers calling themselves &#8220;leaders&#8221; makes my point.<br><br>To some, lead and follow implies a power dynamic. That&#8217;s not how it works in dance or in business. The word &#8220;partner&#8221; in &#8220;dance partner&#8221; is critical. Dragging somebody around the floor is not dancing; it&#8217;s a slog. A dance is&#8212;well&#8212;a dance. It takes two, as they say. There&#8217;s no skill difference (&#8221;Don&#8217;t forget that Ginger Rogers did everything [Fred Astair] did, but backwards and in high heels&#8221;), but the partners are doing different things&#8212;have different roles. In fact, the role of the &#8220;leader&#8221; is often not to lead at all, but to provide a stable platform around which the &#8220;follower&#8221; can move. The creativity is in the &#8220;follower&#8217;s&#8221; camp. The main job of the &#8220;leader&#8221; in a turn is to get out of the way. All of this is exactly like competent management. <br><br>Dance is fundamentally improvisational, but somebody has to decide what to do next&#8212;without that, you&#8217;re just memorizing steps, not dancing. The leader&#8217;s main job is to communicate intent. That&#8217;s it. The better the leader, the clearer the communication. The partners then work together to make the idea happen. In some situations (a skilled leader and a less-skilled follower), the leader must communicate intent so unambiguously that it&#8217;s not possible to &#8220;do it wrong.&#8221; This is an exact parallel with management clearly communicating a strategic vision, and then working in partnership with the developers to make that vision real.<br><br>One clue that the leader is more interested in power than dancing is they blame their partner when something goes wrong. It is never the follower&#8217;s &#8220;fault.&#8221;  However, even the best leader cannot communicate intent sometimes, so when things go sideways (maybe literally &#128516;), everybody compensates by changing the steps to go sideways. No good dancer memorizes steps and forces their partner to go along. It&#8217;s more about improvisation within a framework that both dancers understand, just like good management. It&#8217;s a dance.</p><ul><li></li></ul><p><a href="https://www.linkedin.com/feed/update/urn:li:activity:7458551955435462657/">1 reaction</a></p>]]></content:encoded></item><item><title><![CDATA[AI Uncovers A Company's Real Priorities]]></title><description><![CDATA[This is something of a rant, so&#8230;sorry.]]></description><link>https://blog.holub.com/p/ai-uncovers-a-companys-real-priorities</link><guid isPermaLink="false">https://blog.holub.com/p/ai-uncovers-a-companys-real-priorities</guid><dc:creator><![CDATA[Allen Holub]]></dc:creator><pubDate>Fri, 08 May 2026 00:00:28 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!p0LI!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6bb5277-5e41-40a2-b723-b4b2bba7543f_1070x1070.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This is something of a rant, so&#8230;sorry.</p><p>One of the things that AI in software dev has gifted us is a first-class bullshit filter. Consider your backlog or strategic plan. Most companies have long lists of things they want to do. They spend a fortune on creating and managing those lists. Millions spent on market research and product development. Entire departments dedicated to improvement. Then along comes AI, and most of those same companies react with "Yay! We can now fire all those expensive engineers." I call bullshit.<br><br>What they're doing is keeping the pace of work constant by reducing the workforce in proportion to perceived (possibly not real, but still perceived) productivity increases.  Those companies never intended to even start anything on those expensive lists. Those features were never going to be built. Those bugs were never going to be fixed. Creating and managing those lists was all about fiefdoms and power&#8212;busy work that keeps the managers' paychecks coming. The lists are entirely political and entirely fictional. If that weren't the case, those companies would be looking at AI and saying, "Finally. We can get some of this stuff done!" They aren't.<br><br>So, what the introduction of AI has done is make the bullshit crystal clear. If you fire people, you don't care about improvement; you don't care about getting those "essential" things done; you don't care about market expansion or new customers; you don't "put your employees first." What you <em>do</em> care about is maximizing profit by providing the least value with the least effort.<br><br>I don't necessarily see anything wrong with that&#8212;it's a viable business strategy if your plan is to bail as soon as you go public&#8212;but let's at least be honest about it. The pretense benefits nobody. In fact, we could save a ton of money by dropping the pretense entirely and not doing the busywork.<br><br>We can argue whether mediocrity is a good business strategy. It certainly leaves you vulnerable to competition. But the AI has made the company's actual strategic goals crystal clear: be as mediocre as possible and still make a profit. So, there.</p>]]></content:encoded></item><item><title><![CDATA[AI Is Dumbing Us Down! (Not)]]></title><description><![CDATA[It's not cheating to use an AI, it's inevitable. Deal with it.]]></description><link>https://blog.holub.com/p/ai-is-dumbing-us-down-not</link><guid isPermaLink="false">https://blog.holub.com/p/ai-is-dumbing-us-down-not</guid><dc:creator><![CDATA[Allen Holub]]></dc:creator><pubDate>Tue, 05 May 2026 21:03:38 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!p0LI!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6bb5277-5e41-40a2-b723-b4b2bba7543f_1070x1070.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This morning, I was reading an article about U.C. Berkeley students effectively cheating with AI [<strong><a href="https://www.linkedin.com/safety/go/?url=https%3A%2F%2Ft%2Ely%2FyPj8F&amp;urlhash=eSqz&amp;mt=xyeFcr9HY0qpNNTa_zzSAVi-lpkqcu9jEaya4gy3joTdaHuNHpxfkQKWQA-8Od25c4w7v901l2IAS0nnxCPZ-nZdOrAAngdVmqvmSzYXEBuqtGMgzJ_Vzw&amp;isSdui=true">https://t.ly/yPj8F</a></strong>]. People are, of course, wailing and gnashing their teeth over the state of higher education,  saying that AI is dumbing down our entire society. They say students aren't actually learning anything anymore. Honestly, I think the problem isn't that AI is destroying the world, but that we aren't adapting how we teach to the new tools. Hidebound "institutions of higher learning" (that identifier is emblematic of the problem) are complaining rather than adapting.<br><br>Newspapers handled this same problem in the same ineffective way. They finagled themselves into nonexistence by hoping the problem would just go away, as some do with AI, even still. Only recently have the remaining players been doing what they should have been doing all along (paywalls with metered free access, for example). The issue is that they complained about "the death of the newspaper" instead of adapting.<br><br>Universities seem to be taking the same route: making themselves irrelevant by failing to adapt. They cling to old ways of working, wasting money on tools like AI-content detection that reinforce those old habits and solve nothing. It's an arms race. Instead, teach in a way that AI doesn't matter. <br><br>Back in the good old days of the 12th century, when the first universities appeared, there were no written papers (which is the only place where "AI cheating" is an issue). People went to lectures. They read books. They discussed things with each other and their teachers. Learning happened. Oxford, Cambridge, and the Sorbonne still have that way of teaching in their DNA, nine centuries later. The problem isn't that AI is somehow destroying the notion of education. All it's done is obscoleted one entirely optional pedagogic approach (papers graded in the background by TAs or, ironically, by AIs). A return to a lecture-and-discussion pedagogy fixes the problem.<br><br>I guess my main point is that whenever there's change, agility is essential. Don't complain; do something!</p><div><hr></div><p>P.S. Elsewhere, I've been told that a one-on-one process won't "scale." That's been proven false by existing 500-person large-university classes in which a competent graduate-level teaching assistant runs the discussion groups. Tell the TAs to spend more time discussing instead of grading papers, and you're there. Upper-division and grad classes are small enough that a professor can teach directly. If all the classes you'll ever take have 500 people in them and you never interact with a human being, you're attending a for-profit degree mill, not a university. Unless the resulting piece of paper will actually get you that high-paying job (unlikely), go elsewhere. You're not learning anything in that environment.</p>]]></content:encoded></item><item><title><![CDATA[Use Cases And Stories Are Different Things]]></title><description><![CDATA[What's the difference between a use case and a user story?]]></description><link>https://blog.holub.com/p/use-cases-and-stories-are-different</link><guid isPermaLink="false">https://blog.holub.com/p/use-cases-and-stories-are-different</guid><dc:creator><![CDATA[Allen Holub]]></dc:creator><pubDate>Mon, 04 May 2026 17:02:36 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!p0LI!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6bb5277-5e41-40a2-b723-b4b2bba7543f_1070x1070.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>What's the difference between a use case and a user story? <br><br>Bob Martin describes use cases pretty well in his book Clean Architecture: "A use case is a description of the way that an automated system is used. It specifies the input to be provided by the user, the output to be returned to the user, and the processing steps involved in producing that output." Put another way, a use case describes how a user uses a computer program. A use case describes how to use an existing program, or, if the program can't do everything necessary, it identifies aspects of the program we'll have to create. Use cases live in the implementation space.<br><br>A user story, on the other hand, is a description of the user's work. It is literally the user's story. The story describes a domain-level problem and, when fleshed out, describes how a user solves that problem when working at the domain level. The story describes the user's work, not ours. A story does not describe or specify a computer program at all. It does not describe how a computer program works. Stories live in the domain&#8212;in the problem space.<br><br>Neither use cases nor stories specify programmer tasks. You cannot represent them as "tickets" (despite what Jira claims). They are part of the architectural process, not the construction process. That's true even when architecture and construction are concurrent. You cannot estimate either because neither has anything to do with the construction.<br><br>Both use cases and stories are useful in different ways. Both are elements of the architectural process, but you cannot even think about implementation until that architecture, or a portion of it, is at least roughed out in your head. A skilled programmer can work on both simultaneously.</p>]]></content:encoded></item><item><title><![CDATA[Tests Are Part Of Your Architecture]]></title><description><![CDATA[To me, tests are part of your system and its architecture, not a separate thing that's tacked on as an afterthought.]]></description><link>https://blog.holub.com/p/tests-are-part-of-your-architecture</link><guid isPermaLink="false">https://blog.holub.com/p/tests-are-part-of-your-architecture</guid><dc:creator><![CDATA[Allen Holub]]></dc:creator><pubDate>Sun, 03 May 2026 21:50:13 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!p0LI!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6bb5277-5e41-40a2-b723-b4b2bba7543f_1070x1070.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>To me, tests are part of your system and its architecture, not a separate thing that's tacked on as an afterthought. As such, architectural principles that pervade the system must extend to the tests. Testability is an essential architectural characteristic that pervades the system.<br><br>For example, the test suites have to be cohesive, and the tests only lightly coupled to other system components. They must follow architectural rules like single-responsibility (test only one thing). <br><br>Liskov substitution (changes to the test are irrelevant to the clients, but more importantly, changes to the clients are irrelevant to the tests) is essential. When refactoring, for example, if the test must change because the client code changed, you have lost all safety. Tests must be implementation-independent. If changing the code breaks 100 tests, people resist necessary changes and refactoring. Business rules must be isolated into components so that, if they change, the test-change blast radius is minimized. Test via interfaces.<br><br>Basic abstraction requires an entity's implementation details to be hidden from other entities, including tests. Test behavior, not state. Tests that know how a client works under the covers are too delicate to be viable.<br><br>Testability is an essential architectural characteristic that pervades the system. You may have to define APIs or equivalents expressly for testing. These APIs also have to be secure. The last thing you need is some hacker using a test API as a backdoor. Test injection, if you use it, is an architectural concern.<br><br>Tests, like all other system components, cannot depend on volatile parts of the system insofar as that's possible. A worst-case example is a business logic test that depends on the GUI, which is typically very volatile. Change the GUI and the test breaks, even when the thing it actually tests (the underlying business logic) hasn't changed. Your architecture must isolate and separate the business logic from the GUI so you can test them independently. Indirectly testing anything through something else is always problematic&#8212;it exposes implementation and violates encapsulation.<br><br>These are just a few examples. My point is that tests are first-class citizens and that testing is integral to the entire architecture. They're there from the beginning, not something you add later.</p>]]></content:encoded></item><item><title><![CDATA[Fixed Scope And A Deadline Is Grift, Not A Way To Work.]]></title><description><![CDATA[The iron triangle (time, cost, scope) has been around for at least 40 years.]]></description><link>https://blog.holub.com/p/fixed-scope-and-a-deadline-is-grift</link><guid isPermaLink="false">https://blog.holub.com/p/fixed-scope-and-a-deadline-is-grift</guid><dc:creator><![CDATA[Allen Holub]]></dc:creator><pubDate>Fri, 24 Apr 2026 22:07:15 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!p0LI!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6bb5277-5e41-40a2-b723-b4b2bba7543f_1070x1070.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The iron triangle (time, cost, scope) has been around for at least 40 years. The basic idea is that only two of the points can be fixed. Fix all three, and you have a death march. It's not like we don't know that. <br><br>Nonetheless, you have clients demanding a death march by specifying both a deadline (which in software, is both time and cost&#8212;they track one another) and a fixed scope. They do not do this out of ignorance. They know as a fact that the project will run over if the scope can't vary. They demand the impossible because it's a way to squeeze free work out of you. (They are never penalized in the contract for providing an incorrect scope; rather, you are penalized for being "late.")<br><br>This is a scam, plain and simple. It's a way for the client to move 100% of the risk onto your shoulders and to squeeze more work out of you than they're paying for. Why anybody would fall for this particular bit of grift is beyond me, but whole segments of the industry seem willing to volunteer for the gallows.<br><br>In software, there are only two arrangements that make sense: (1) Time and materials, and (2) Fix the increment and let (collaborative) scope vary. Everything else is just lambs (that's you) to the slaughter.<br><br>I'll add that a fixed scope almost always leads to building something nobody wants. We learn as we work, and if we don't incorporate those lessons into the work, we will fail.</p>]]></content:encoded></item><item><title><![CDATA[Behind Schedule And Scope Creep]]></title><description><![CDATA[Two failed notions.]]></description><link>https://blog.holub.com/p/behind-schedule-and-scope-creep</link><guid isPermaLink="false">https://blog.holub.com/p/behind-schedule-and-scope-creep</guid><dc:creator><![CDATA[Allen Holub]]></dc:creator><pubDate>Wed, 22 Apr 2026 20:02:30 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!p0LI!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6bb5277-5e41-40a2-b723-b4b2bba7543f_1070x1070.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The related notions of "behind schedule" and "scope creep" are fundamentally wrongheaded. It's 50-year-old thinking that many of us have abandoned because it doesn't work. "Behind" implies an accurate estimate of a large, detailed specification. That is, you can't be "behind" unless you have a fixed "done" date. Similarly, "scope creep" implies that we can accurately predict exactly what needs to be built. (Sometimes that's true, but not often.) <br><br>The problems with this approach are legion, of course. Our specifications (and thus our plans) are always wrong because nobody knows what they actually want until they have something in their hands. "Scope creep" implies that we won't learn anything as we work, that we'd rather be done 'on time' than implement the changes necessary to build something our customers actually need. There's a fundamental contempt for the customer built into that attitude. It also implies that the world will not change while we're working. Finally, both assumptions imply that product development ends. It doesn't; we're never "done."<br><br>This approach has rarely, if ever, been effective. It's better to first identify just enough to get started. Build that, get feedback, and adjust. We discover what to do next by doing the current thing. There are strategic goals, but decisions about what to build are ongoing. Given that we're releasing every day (or more often), it's not possible to be "behind schedule." With that thinking comes major changes in things like budgeting. For example, we need to fund the teams and then dynamically allocate them to work as needed, rather than "project" thinking, where we budget the project, not the teams.<br><br>Of course, I say the above knowing that many will respond that the "real world" doesn't work that way. Many of those comments will come with a certain fatalism that arises from knowing that the "real world" systems don't work and that individual engineers have no power to change them. Some of that fatalism is justified (large corporations won't adapt), but not all of it (an agency can sell a different way of working as part of the client-acquisition process rather than letting the client dictate how the agency must work). However, if it's possible to improve the way you work, it's worth the effort.</p>]]></content:encoded></item><item><title><![CDATA[AI Makes Agile Irrelevant! ]]></title><description><![CDATA[Here's what to do instead!]]></description><link>https://blog.holub.com/p/ai-makes-agile-irrelevant</link><guid isPermaLink="false">https://blog.holub.com/p/ai-makes-agile-irrelevant</guid><dc:creator><![CDATA[Allen Holub]]></dc:creator><pubDate>Fri, 27 Mar 2026 15:04:50 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!p0LI!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6bb5277-5e41-40a2-b723-b4b2bba7543f_1070x1070.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I keep hearing that AI has made Agile irrelevant. Okay. I'll throw in the towel. Let's dump Agile altogether. <br><br>So, instead, here is by far the best AI-focused way of working that I know:<br><br>First,<br><br>- We are constantly discovering new and better ways to do things by actually doing them. We learn as we work. Our understanding comes from experience, not theory or wishful thinking.<br><br>Then, <br><br>- The way we treat people and work with them is more important than processes and tools<br>- Working software is more important than any sort of documentation or other formalisms<br>- The best work happens when we work collaboratively with each other and our customers. The best environments are based on trust and communication.<br>- Planning only goes so far, and we need to adapt to what we learn as we learn it<br><br>Furthermore, I'd suggest that:<br><br>- Our highest priority is to satisfy our customers through early and continuous delivery of valuable software. <br>- The best way to build the right thing is to work small and deliver very frequently (at least daily), so that we can get feedback early and adjust based on that feedback. <br>- We do that by working closely with business and product people. The code is secondary to defining and building the right thing.<br>- We have to hire motivated people and get them the best tools that we can for them to do their job. The best people to tell us what tools to use are the people doing the work.<br>- Communicating in real time eliminates lots of problems&#8212;delays, blockers, rework.<br>- We'll measure progress (and productivity) by how fast we can get valuable software into our customers' hands. Things like tokens/day, lines of code, and other measures of volume aren't useful. You are not more productive simply because you (or your AI helpers) type faster.<br>- We'll do our work in a humane environment, relaxed enough that we can come to work every day rested, relaxed, and able to do our best work. People matter.<br>- We'll focus on excellence and quality. Extensive testing, particularly when an LLM is involved, is essential. Great architecture underlies all great systems.<br>- We'll strive for simplicity, both in the code and in the product. We'll build exactly what our customers need and no more, and will determine their needs by talking to them.<br>- We'll trust the teams to figure out the best ways to go about their work. <br>- We'll constantly look at both what we're building and how we're building it, and continuously improve in both categories.<br><br>This is by far the best AI-focused approach that I know. Forget about all that "Agile" BS! &#128580;</p>]]></content:encoded></item><item><title><![CDATA[Embrace Fuzziness]]></title><description><![CDATA[It's the guardrails, stupid.]]></description><link>https://blog.holub.com/p/embrace-fuzziness</link><guid isPermaLink="false">https://blog.holub.com/p/embrace-fuzziness</guid><dc:creator><![CDATA[Allen Holub]]></dc:creator><pubDate>Thu, 12 Mar 2026 22:32:10 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!p0LI!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6bb5277-5e41-40a2-b723-b4b2bba7543f_1070x1070.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>One common critique of AI is that it's imprecise and nondeterministic. We programmers, I think, have held too long to the notion that precision&#8212;in algorithms, in the programming languages we use, in the data we collect&#8212;is essential. We think that if our specifications and implementations are precise, our problems are solved. Our eternal quest for ever greater precision has failed us. We simply cannot write precise enough code. There are always bugs. That precise spec turns out to describe something nobody wants, and the details are wrong.<br><br>Computers don't need to be this precise. Analog computers worked very well for the classes of problems they solved. Aviation and naval navigation, for example, were entirely analog until just a few years ago, and the planes and ships got where they needed to go. Precision is perhaps not as important as some of us think.<br><br>It seems to me that our attempts to impose precision on a chaotic, fuzzy world have failed us. Algorithms often fail. E.g., problems like chaotic turbulence or traffic-flow patterns are easy to model, but no algorithm can predict them. Even physics is not as precise as some imagine; the location of an electron is probabilistic, not precise. We programmers want the world to be Newtonian, subject to precise mathematics, but it's a quantum world. We need to figure out ways of working that reflect that reality.<br><br>The original Agile challenged the idea that a precise up-front plan was viable. It assumed the world was complex, not simply complicated, and we needed to work in a way that recognized that complexity. We dumped the precise plan and instead built small, got feedback, then adjusted. That worked surprisingly well. Agile failed when we reverted to the idea of precision. Estimates, backlogs, burn-down charts, prescriptive meetings&#8212;all of that is an attempt to reimpose precision onto an imprecise activity. That thinking destroyed Agile, but the original thinking was correct. We now need to extend the original thinking further, to the coding itself.<br><br>So, AI. LLMs fly in the face of precision coding, approaching programming in a more natural, almost analog way. The haters want our tools to create MORE precise results, so they are deeply suspicious of AI's fuzziness. They think they must correct that fuzziness by a detailed after-the-fact analysis that injects precision into the generated code. Disaster strikes when people who think that way are forced to use AI. Just look at Amazon.<br><br>The solution is not to fight the fuzziness, but to work with it and develop ways to write effective systems in a fuzzy way. That thinking leads to guardrails as our primary tool rather than inspection. Things like a modular component architecture, emphasis on testability, static analysis, testing in production, etc., all become critical.<br><br>So, my advice is: Embrace fuzziness. But add guardrails. It's time to rethink how we work. Instead of "that's nuts," think "what innovative guardrails solve the problem?"</p>]]></content:encoded></item><item><title><![CDATA[Business 101: Back-of-the-napkin Calculations ]]></title><description><![CDATA[Your cost is way higher than your salary]]></description><link>https://blog.holub.com/p/business-101-back-of-the-napkin-calculations</link><guid isPermaLink="false">https://blog.holub.com/p/business-101-back-of-the-napkin-calculations</guid><dc:creator><![CDATA[Allen Holub]]></dc:creator><pubDate>Tue, 10 Mar 2026 21:28:22 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!p0LI!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6bb5277-5e41-40a2-b723-b4b2bba7543f_1070x1070.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I just posted that a programmer who makes $200K costs the company about $200/hour, and a lot of people deigned to "correct" my math. Given that these back-of-the-napkin cost discussions are useful, let's correct that correction.<br><br>The first key concept is the notion of "load." When we're talking about people, the "load" is the money we have to spend to employ you over and above your salary. That includes everything from benefits and vacation time to the cost of the space you occupy (if you're on-site) and the cost of the taxes and accountants and HR people who support you. Load is expressed as a multiplier, typically in the 1.5-2.0 range. A "fully loaded salary" is what it COSTS the company to employ you, not what they pay you. If you make $200K, your fully loaded salary (your cost to the company) is roughly twice that. It could be more if you get a lot of stock, though that's opportunity cost (money the company is foregoing by not selling the stock to the public) rather than direct expense.<br><br>The other way to look at that is, in the US big-city market, $1M buys you roughly 2.5 programmers for a year. That's true for all companies, including startups, because stock counts as money.<br><br>Other back-of-the-napkin numbers: In the US, a typical work year is 250 days (52 weeks * 5 days/week - holidays, PTO, etc.) or 2,000 hours. That number is lower in civilized countries where you actually get reasonable vacation time, parental leave, &amp;c.<br><br>So, given a $200K salary, your hourly COST to a US company is ($200K * 2.0)/2000 or $200/hour. <br><br>Now, let's put that into practice: Think of that "15-minute" standup meeting. With context-swap overhead, let's call it 30 minutes (I'm being deliberately generous&#8212;it's probably more like a full hour). 6 people on the team at $200/hour yields $600 per day; times 250 days is $150,000/year; times 10 teams is $1,500,000/year. That money could be entirely wasted if you're doing the formulaic three-questions nonsense. If you're doing "scatter-gather" development and using the standup for necessary coordination before you all go off on your own, you have to spend that money. However, if you change the way you work to mob/ensemble programming, where everybody works together all day, you don't need coordination planning, so you can save $1.5M/year.<br><br>Think like a business person. It's important.</p>]]></content:encoded></item><item><title><![CDATA[AI Is Not Coming For Your (Developer) Job]]></title><description><![CDATA[But the job is changing]]></description><link>https://blog.holub.com/p/ai-is-not-coming-for-your-developer</link><guid isPermaLink="false">https://blog.holub.com/p/ai-is-not-coming-for-your-developer</guid><dc:creator><![CDATA[Allen Holub]]></dc:creator><pubDate>Fri, 06 Mar 2026 18:26:44 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!p0LI!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6bb5277-5e41-40a2-b723-b4b2bba7543f_1070x1070.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>No, AI is not coming for your developer job, regardless of the nonsense the hype mongers are pushing. (I'm talking just about developer jobs&#8212;it obviously impacts other areas.) That's not to say the layoffs aren't real, but rather that the corporations are hiding normal corporate behavior behind a smokescreen of "AI makes us vastly more efficient!" Those layoffs are a hedge against the current economic downturn. They are downsizing to game the next quarter's earnings numbers. Don't expect the layoffs to stop, but they have nothing to do with "efficiency gains, because AI!" The problems are tariffs, isolationism, and the failure to reinvest wealth concentrated in a very few hands back into the economy.<br><br>For example [from <strong><a href="https://t.ly/jQyZO">https://t.ly/jQyZO</a></strong>]:<br><br>"Asked about the cuts on an October earnings call, Amazon Chief Executive Andy Jassy told analysts that the decision was 'not really financially driven and it's not even really AI-driven. Not right now, at least.'"<br><br>"A recent survey of global executives published in the Harvard Business Review found that although AI has been cited as the reason for some layoffs, those cuts are almost entirely anticipatory: executives expect big efficiency gains that have not yet been realized." <br><br>Execs are making decisions based on magical thinking. "Soon" is always six months away. Many of these companies will not survive while they chase the end of that particular rainbow.<br><br>AI just doesn't yield the imagined gains, at least not if you consider the entire product lifecycle and you want a reliable, secure, extensible, and scalable product that does what customers need. I'm not saying an LLM isn't a useful tool, only that it's not the panacea these execs imagine. The only way to speed up an entire system is to address the entire system, especially any bottlenecks. The bottleneck is only rarely the coding. Spotify, which has gone full AI to write its code, hasn't laid anybody off because it understands these issues.<br><br>There is one place where an AI-related layoff might be justified. Working with AI requires skills that some developers seem unwilling or unable to acquire. Coding alone, no matter how good you are, is no longer sufficient. You need to understand systems thinking and software architecture. You need strong written and verbal communication skills, as well as the social skills to make that communication effective. You need to talk to your customers and have empathy for their problems. Focusing on the technical side alone is no longer sufficient (though still necessary). The "programmer" job description has changed, and you need to adapt to remain employable. That's always been the case in our profession, of course, but the changes wrought by AI seem particularly challenging.</p>]]></content:encoded></item><item><title><![CDATA[Agile Is About "Uncovering"]]></title><description><![CDATA[We are never done uncovering.]]></description><link>https://blog.holub.com/p/agile-is-about-uncovering</link><guid isPermaLink="false">https://blog.holub.com/p/agile-is-about-uncovering</guid><dc:creator><![CDATA[Allen Holub]]></dc:creator><pubDate>Wed, 11 Feb 2026 21:30:07 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!p0LI!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6bb5277-5e41-40a2-b723-b4b2bba7543f_1070x1070.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In honor of today&#8217;s 25th anniversary of the Agile Manifesto, I&#8217;d like to remind everyone that the document's first sentence is: &#8220;We are uncovering better ways of developing software by doing it&#8230;&#8221; The critical word in that sentence is &#8220;uncovering.&#8221; They didn&#8217;t say &#8220;uncovered,&#8221; which would mean there&#8217;s no more work to do. Instead, they are talking about an active and ongoing activity: uncovering. <br><br>Nowhere in the Manifesto does it tell you <em>how</em> to work. There are no sprints, backlogs, standups (or any other meeting), SMs, POs, PBIs, tickets, or any of the other barnacles that have accreted over time, often added by people with suspect agendas (like selling certificates). The emphasis is not on specific things to do, because those things change as we uncover different and better ways to work. </p><p>The single practice that is mandated is: &#8220;the team reflects on how to become more effective, then tunes and adjusts its behavior accordingly.&#8221; We are constantly improving how we work (<em>uncovering</em>), which, to me, suggests that we add, remove, and change things, and we make those changes based on observation and assessment.<br><br>This attitude is particularly important when a radical new tool, such as an LLM, emerges. We improve &#8220;by doing it.&#8221; We use the new thing, then decide based on our experience. We don&#8217;t just sit back and say it doesn&#8217;t work because it&#8217;s not what we&#8217;re doing now, or because some moron has hyped it too much. Agility is scary. It requires constant personal experimentation with new ways of working. Some of those things work, some don&#8217;t, but you don&#8217;t know until you try.<br><br>The next important word is &#8220;ways,&#8221; plural. I&#8217;ve never seen any good come from everyone marching in lockstep to a specific process or framework. At best, that uniformity adds friction. At worst, it adds dysfunction. Every team, every story, every situation, is unique and requires unique ways of working. Create a set of values and principles, and as long as people adhere to those, you&#8217;re golden. The people who do the work are in the best position to figure out how to do the work. Of course, control-obsessed people high up in an organization hate that because they can&#8217;t control it. They call it &#8220;chaos.&#8221; Replacing control for trust is an essential element of becoming &#8220;Agile,&#8221; however.<br><br>Finally, the end of that initial sentence is &#8220;&#8230;and helping others do it.&#8221; We improve as a community through collaboration and communication. That can be fraught. E.g., the <strong>#NoEstimates</strong> tag began when Woody Zuill posted that his team had just finished a successful project without estimates and wanted to share their experience. Instead of &#8220;that&#8217;s interesting, tell me more,&#8221; the reactions were often hateful attacks that came down to &#8220;It&#8217;s not possible to work without estimates, so you&#8217;re an incompetent, irresponsible liar.&#8221; But it <em>is</em> possible. It <em>did</em> work. That was the whole point. Working is the starting point of the discussion. Your comments don&#8217;t hold much weight unless you&#8217;ve tried it. If you don&#8217;t know how to try it, talk to the people who have. Conversation and experimentation fill in the details. That&#8217;s how you learn and improve. That&#8217;s Agile.</p>]]></content:encoded></item><item><title><![CDATA[Productivity]]></title><description><![CDATA[You can't measure it, but you can manage it.]]></description><link>https://blog.holub.com/p/productivity</link><guid isPermaLink="false">https://blog.holub.com/p/productivity</guid><dc:creator><![CDATA[Allen Holub]]></dc:creator><pubDate>Sun, 25 Jan 2026 17:56:49 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!p0LI!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6bb5277-5e41-40a2-b723-b4b2bba7543f_1070x1070.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>How do you measure productivity? Let&#8217;s start by talking about the engineering obsession with quantitative metrics. You can easily measure productivity on an assembly line. The faster a car comes off the line at a given quality level, the more productive you are. We do not work on an assembly line, however. We are not producing identical copies of the same object over and over again. No assembly-line productivity metric can be applied to software development.</p><p>Deming once said, &#8220;You can measure only 3% of what matters,&#8221; and this is one of those cases.  All the &#8220;productivity&#8221; metrics I see measure output. You are not productive if you produce vast amounts of garbage quickly (PRs/unit time come to mind). Even &#8220;_value_ delivered over time&#8221; isn&#8217;t measurable, because you can&#8217;t measure value. Productivity matters. You can&#8217;t measure it, however.</p><p>Sometimes, a group of metrics taken together can help. The DORA metrics (deployment frequency, lead time, change-failure rate, and mean time to restore) taken together come to mind. None of these, in isolation, does anything useful. A team with a high deployment rate is productive only if it also has a low failure rate, etc. It&#8217;s all or nothing.</p><p>But even taken together, DORA metrics are not sufficient because they&#8217;re still output measures. Take lead time: the time from when a problem is identified to when the solution generates revenue. (Idea to the customer&#8217;s hands.) Some problems are just harder than others, so they take longer to solve. That extra time doesn&#8217;t mean you&#8217;re less productive, however. A simple lead-time comparison tells you nothing useful.</p><p>People talk about how AI assistance makes them more productive, but that&#8217;s particularly fraught because the &#8220;out of the box&#8221; code always needs to be inspected and refactored. People who check in unreviewed code are actually anti-productive because someone down the line will have to deal with the problems in that code. AI-generated code is also overcomplex, and if somebody doesn&#8217;t deal with that complexity, it will kill you down the line. I&#8217;m not saying that using AI is not a good thing. It does make people more productive. Just not in an easily measured way, and only if the programmers approach the generated code with scepticism.</p><p>Deming also said, &#8220;It is wrong to suppose that if you can&#8217;t measure it, you can&#8217;t manage it &#8211; a costly myth.&#8221; You can&#8217;t measure productivity, but you _can_ manage it. The best indicator I can think of is how long it takes to make a necessary change and how solid that change is (solid code stands up over time). &#8220;Solid&#8221; applies to everything from code quality to whether your solution to a customer problem is a good one.</p><p>When the change time is low, productivity is high. If the code isn&#8217;t solid, the constant fiddling with it lowers my productivity. We&#8217;ve all experienced code that&#8217;s hellish to work on, where a change that should take a few hours takes weeks. When I work in code like that, I&#8217;m not productive (and very unhappy). This is a relative measure. Some things&#8212;some changes&#8212;are just inherently difficult, so take longer than others.</p><p>So, even if I can&#8217;t measure my productivity, I can manage it by looking for things that slow down change and eliminating those things. There are many specific things that slow me down. Wrestling with bugs. Dealing with unnecessary complexity. Inappropriate or bad architecture. Bad overall code structure. Unhelpful names. Low quality in general. Code that doesn&#8217;t make what it does obvious when reading it. The list goes on. By dealing with those things, we become more productive. If you want to measure something, measure how many of those issues you address. </p><p>A Buddhist monk (yes, seriously) once told me that suffering is the distance between the way things are and the way we think they should be. Productivity works the same way. The smaller the gap, the more productive we are. Productivity is a relative delta, not a hard number. Narrowing that gap reduces our suffering &#128516;.</p>]]></content:encoded></item><item><title><![CDATA[Complex Systems Are Uncontrollable]]></title><description><![CDATA[Complex (as compared to complicated) systems cannot be controlled.]]></description><link>https://blog.holub.com/p/complex-systems-are-uncontrollable</link><guid isPermaLink="false">https://blog.holub.com/p/complex-systems-are-uncontrollable</guid><dc:creator><![CDATA[Allen Holub]]></dc:creator><pubDate>Fri, 09 Jan 2026 01:16:56 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!p0LI!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6bb5277-5e41-40a2-b723-b4b2bba7543f_1070x1070.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Much of the dysfunction you find in organizations, and most of the problems you find in software development, come from the fact that people&#8212;engineers in particular&#8212;believe that complex systems (in the Cynefin sense) can be understood and controlled. They can not. You cannot predict how a complex system, be it organizational or software, will behave. Put another way, a metric-focused analytical approach to improvement or control does not work and never will work. Metrics are always weak indicators, too focused on a single aspect of the system as a whole, and actions taken on those metrics are always unpredictable at the system level. At best, you can observe the system and continuously adapt to the inevitable surprises.<br><br>There is a connection between complication and complexity, of course. Simpler complex systems are easier to manage than complicated ones. Good architecture _should_ move you towards simplicity. No architecture, however, resolves the inherent complexity of a large software or organizational system. The best it can do is reduce the complexity.<br><br>LLMs (and many of the people who use them) do not understand architecture. Consequently, LLM-based code generation usually results in overly complicated, hard-to-manage solutions. To my thinking, you cannot use an LLM effectively in a production environment unless you can review and refactor the generated code through an architectural lens that moves you towards simplicity. Being a "great coder" is not sufficient. You want to keep your job in an AI world? Learn software architecture.</p>]]></content:encoded></item><item><title><![CDATA[Let's Dump the CS-Degree for Programmers]]></title><description><![CDATA[Computer science is not software engineering. We need the latter.]]></description><link>https://blog.holub.com/p/lets-dump-the-cs-degree-for-programmers</link><guid isPermaLink="false">https://blog.holub.com/p/lets-dump-the-cs-degree-for-programmers</guid><dc:creator><![CDATA[Allen Holub]]></dc:creator><pubDate>Fri, 02 Jan 2026 01:24:55 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!p0LI!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6bb5277-5e41-40a2-b723-b4b2bba7543f_1070x1070.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>There's been a lot in the press lately about even Stanford CS graduates having a hard time getting jobs, so I looked up the Stanford curriculum. The problem isn't "AI." The problem is that you can get a CS degree from Stanford and know absolutely nothing useful for day-to-day work as a software engineer. </p><p>Don&#8217;t get me wrong, the world does have a use for a degree that focuses on the mathematics that underlies computing, algorithm design and analysis, NP completeness, and the other things that go into a Computer Science degree, but that stuff has little or nothing to do with the production of software. Put another way, computer science is to software development what materials science is to architecture. The connection is tenuous, and a degree in the first does not prepare you for a job in the second.<br><br>In the current job climate, the CS curriculum is a tragedy. Learning software engineering on the job to make up for educational deficiencies is a luxury that requires a strong economy and companies with money to burn. We don't have that. Sure, a university is not a trade school, but I'm talking about basic essential knowledge and skills, not the details of using specific technologies.<br><br>If AI requires the thinking of a "senior" and the schools don't teach the things a "senior" knows, even though they could, then they're failing as educational institutions. There's no reason for that. Similarly, there's no reason for schools to churn out people with no experience or knowledge of how to create real software. They can teach that, too. They can require significant projects as a graduation requirement. They can support and encourage internships (see: Drexel, Cal Poly, VCU). It's a truism that the only constant in software engineering is change, but that doesn't make it any less accurate. A hidebound university system (with a few notable exceptions) is failing us. The fact that many of the CS-degree requirements are the same now as they were when I was in school, back when dinosaurs roamed the earth, says nothing good.<br><br>PS. To address a misreading of the above that's popped up elsewhere: I am not saying that universities should teach a tech stack. I am saying that they should teach software engineering: how to work in teams, how to write production-quality programs that people can use, how to work incrementally, software architecture, basic processes like CI/CD and testing, and nowadays, AI-assisted software engineering. None of this has to do with specific tech.<br><br>We need to rethink the role of a Computer Science (a narrow specialty) degree in hiring and instead focus on Software Engineering degrees. Universities that don't offer a true Software Engineering degree are not really doing their jobs, in my opinion. They are not teaching an essential discipline.</p>]]></content:encoded></item><item><title><![CDATA[AI Hype and the Theory of Constraints]]></title><description><![CDATA[Coding is not the bottleneck.]]></description><link>https://blog.holub.com/p/ai-hype-and-the-theory-of-constraints</link><guid isPermaLink="false">https://blog.holub.com/p/ai-hype-and-the-theory-of-constraints</guid><dc:creator><![CDATA[Allen Holub]]></dc:creator><pubDate>Sun, 21 Dec 2025 19:03:59 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!p0LI!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6bb5277-5e41-40a2-b723-b4b2bba7543f_1070x1070.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Let's talk about AI Hype and the Theory of Constraints. From a business perspective, the key metric is "lead time." The time it takes to get an idea to the point where it's producing revenue ("in the customer's hands"). That process involves a complex web of processes, dependencies, and communication, though it can be linearized to some extent. Imagine that it is linear for the sake of argument&#8212;a chain of activities starting with exploration and market research, going through strategic (and some tactical) planning, architecture, analysis, tech research, and other thinking, coding, testing, feedback and modification, and operations, ending up with sales, distribution, and support. Add politics and bureaucracy, not having required skills on the teams, etc., to the mix as well.<br><br>That whole tangle is called the "value stream." The lead time is controlled by the slowest element in the value stream&#8212;the bottleneck (or "constraint"). You can attempt to clear the constraint, but more often than not, all that does is uncover a formerly hidden constraint. More to the point, putting effort anywhere other than the constraint is a waste of time and money. All that does is pile up "inventory" (work that's done and paid for but isn't producing revenue&#8212;a financial liability) in front of the constraint, or create excess capacity (people with nothing revenue-producing to work on) behind it. Firing people in the "excess capacity" region is extremely risky because, once you break the bottleneck, not having enough people in those areas creates a new bottleneck, and you will have accomplished nothing. Given that the bottleneck is often upstream of coding, any cost savings you see from firing devs are illusory (and temporary). The cost of adding the devs back when you need them far outweighs any illusory savings.<br><br>Coding speed is rarely, if ever, the bottleneck. Even if the fantasy that AI will speed coding by 100% or more were true, it would not decrease lead time. Firing half of your people because of an immagined 100% improvement in the other half will also not relieve the bottleneck. The only way to decrease lead time is to improve the entire system of work. Knee-jerk firing will not do that.</p>]]></content:encoded></item><item><title><![CDATA[Stakeholders Often Aren't]]></title><description><![CDATA[It seems to me that we all need to significantly narrow the definition of a &#8220;stakeholder&#8221; to people who have a vested interest in our work&#8217;s success.]]></description><link>https://blog.holub.com/p/stakeholders-often-arent</link><guid isPermaLink="false">https://blog.holub.com/p/stakeholders-often-arent</guid><dc:creator><![CDATA[Allen Holub]]></dc:creator><pubDate>Fri, 19 Dec 2025 19:19:39 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!p0LI!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6bb5277-5e41-40a2-b723-b4b2bba7543f_1070x1070.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>It seems to me that we all need to significantly narrow the definition of a &#8220;stakeholder&#8221; to people who have a vested interest in our work&#8217;s success. Your failure must be their failure, your success their success. Some random person in the company who&#8217;s merely &#8220;interested&#8221; in your work is not a stakeholder, no matter where they sit on the hierarchy. They&#8217;re usually just a distraction. A clue: somebody sitting in on a discussion or review with their laptop open for anything other than taking notes or looking up details relevant to the discussion at hand is not a true stakeholder.<br><br>The most important stakeholders are, of course, your users/customers. Their lives are affected by the work you&#8217;re doing, and our success depends on their happiness. User stakeholders have a vested interest in our success. If you cannot talk to users/customers whose lives are directly impacted by your work, you&#8217;re being set up to fail (as is your company if you&#8217;re an agency). Interestingly, a client that&#8217;s blocking access to the true stakeholders is setting themselves up to fail as well; they&#8217;re spending money on predictably bad outcomes. A single &#8220;client representative&#8221; is a red flag.<br><br>The people who set constraints are also not usually stakeholders. Take budget as an example. To me, somebody who constrains budget is not a stakeholder unless they&#8217;re putting their own budget on the line. They have to have skin in the game. Somebody who&#8217;s just juggling numbers isn&#8217;t a stakeholder. That&#8217;s not to say we can ignore their numbers, but they should have no input in how we do our work. I&#8217;m happy for a CFO to constrain my budget. I am not happy to have them tell me what to build or how to build it. Successful organizations are based on trust. Set my budget, then trust me to get the work done.<br><br>Frankly, the same reasoning usually applies to the CEO (or most high-level managers), though that&#8217;s politically tricky. The CEO&#8217;s job is to set and communicate a strategy, then trust people to realize that strategy. (Four-person startups are an obvious exception.) I&#8217;ve seen too many projects/products go completely off the rails when some ego-driven CEO injected themselves into the work with an &#8220;I&#8217;ve got this Great Idea! Drop everything and work on it!&#8221; Of course, if you work for a CEO who puts their ego ahead of the company&#8217;s success, there&#8217;s not much you can do about it. I can guarantee a narcissistic CEO will not hold themselves responsible when things fail, so don&#8217;t be surprised when you&#8217;re scapegoated for doing what they tell you to do, however.</p>]]></content:encoded></item><item><title><![CDATA[Let's Dump "Accountabilities"]]></title><description><![CDATA["Accountable" is the language of violence.]]></description><link>https://blog.holub.com/p/lets-dump-accountabilities</link><guid isPermaLink="false">https://blog.holub.com/p/lets-dump-accountabilities</guid><dc:creator><![CDATA[Allen Holub]]></dc:creator><pubDate>Wed, 17 Dec 2025 17:55:37 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!p0LI!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6bb5277-5e41-40a2-b723-b4b2bba7543f_1070x1070.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The notion of &#8220;accountabilities&#8221; in the Scrum Guide makes my skin crawl. The word &#8220;accountable&#8221; means that heads will roll if you fail. People in the Scrum community try to cast it in a better light (usually quoting the definition of &#8220;providing an account of&#8221;), but that&#8217;s just not what the word means in standard usage. When people say they want to hold a corrupt politician accountable, they don&#8217;t mean they want an accounting of the politician&#8217;s corruption. It wouldn&#8217;t go over well if you told your spouse or partner that you&#8217;ll hold them accountable for doing the dishes. The word implies a strict control hierarchy in which those who hold others accountable are at the top and are not accountable at all to the people beneath them. It is not the kinder, gentler thing that the Scrum folks want to turn it into. The word was deliberately removed from the Scrum Guide for years, then added back, much to my disgust. The cynic in me says it was done to appease the huge, not particularly humane corporations that buy Scrum certificates and &#8220;Scrum Transformation&#8221; consulting services.<br><br>Let&#8217;s replace the entire notion of accountability with the Drive (Self-Determination Theory) principles of connectedness, autonomy, mastery, and purpose. Where would you rather work, somewhere where you&#8217;d be punished because you were being held accountable, or somewhere where people wanted to excel because they loved their work and respected and trusted the people they worked with?</p>]]></content:encoded></item></channel></rss>