<?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, 09 Jun 2026 18:02:01 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[An MVP Is A Test, Not A Product.]]></title><description><![CDATA[Judging by posts I&#8217;ve seen lately, it&#8217;s time to talk about MVPs&#8212;the so-called &#8220;Minimum Viable Product.&#8221; There&#8217;s a lot of misunderstanding of the notion.]]></description><link>https://blog.holub.com/p/an-mvp-is-a-test-not-a-product</link><guid isPermaLink="false">https://blog.holub.com/p/an-mvp-is-a-test-not-a-product</guid><dc:creator><![CDATA[Allen Holub]]></dc:creator><pubDate>Wed, 03 Jun 2026 18:10:54 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>Judging by posts I&#8217;ve seen lately, it&#8217;s time to talk about MVPs&#8212;the so-called &#8220;Minimum Viable Product.&#8221; There&#8217;s a lot of misunderstanding of the notion. People take the acronym too literally. There are two definitions of MVP. The earlier one was coined by Frank Robinson, and aligns with what people often think (that the MVP is a product), but the more useful definition is the one Eric Ries describes in his book &#8220;Lean Startup.&#8221; I think of Ries&#8217; MVP as:<br><br>The&nbsp;<strong>M</strong>inimum thing that tests the<br><strong>V</strong>iability of a<br><strong>P</strong>roduct idea.<br><br>It is not version 1.0 of your product. It&#8217;s not a product at all, in fact. It&#8217;s a test. If the test passes, the idea is viable, and it might make sense to build v1.0. The whole point is to not waste time building something nobody wants.<br><br>Notice that my definition didn&#8217;t say &#8220;the minimum thing you can build&#8221; because the ideal MVP doesn&#8217;t require any building at all. The MVP for DoorDash was pizza delivery, which tested the viability of home food delivery. No coding required. A second MVP might test online ordering with a single-page site featuring a minimal menu for a single restaurant. The MVP wouldn&#8217;t process any orders&#8212;it would just forward them to a human, who would handle everything else. Again, the idea is to test the viability of a product idea, NOT to build a product. The MVP is a precursor to building. Only after those two tests (MVPs) gave you satisfactory results would you consider building something real. <br><br>MVPs must be very small. They go together in a day or two, maybe a couple of weeks on the outside. They often have zero niceties (like a slick UI or even a database under the covers). In one of his online talks, Ries suggests that you come up with the smallest possible set of features. Then cut that in half, then cut it in half again, then cut it in half one more time. Put in terms of testing theory: test only one thing at a time.<br><br>The next issue is quality, and there are two schools of thought. One is that you want to get the MVP into your potential customers&#8217; hands as quickly as possible, so using Vibe coding or sloppy manual coding to create a throwaway MVP is fine. The key concept in that last sentence is &#8220;throwaway,&#8221; though. This approach effectively bets that the idea will fail, so you want to expend the least effort.<br><br>The second school looks at the MVP as the core of a walking skeleton (the beginning of an iterative development process). Here, you&#8217;re betting that the idea will work. Given that the MVP will be at the core of a real system, it must be high-quality. The feature set is very minimal, so the MVP still comes together very quickly, but the code is real, production-quality code. My experience is that high-quality code goes together faster than low-quality code, so the quality actually helps with speed.<br><br>These two approaches cannot coexist. It&#8217;s a disaster in the making to use a low-quality MVP as the core of a walking skeleton. You&#8217;ll never overcome the corruption of the putrid core.</p><p>I&#8217;m a huge fan of the (Ries-style) MVP approach. The best way to get a product to your customer sooner is to not waste time building features they don&#8217;t want. The MVP helps with that.</p><p></p><h4>Prototypes and PoCs</h4><p>Two concepts often confused with an MVP are also worth mentioning.</p><p>A <em>prototype</em> is a test that answers the question: &#8220;Does this design actually work the way we think it does?&#8221; You can prototype any aspect of a design, from the UX to the database. Prototypes come in two main flavors.<br><br>A <em>low-fidelity prototype</em> is something like a simple whiteboard sketch of a proposed UI. It goes together in seconds and is meant to help with quick decisions.<br><br>A <em>high-fidelity prototype</em> is a fully functional model that usually tests the behavior of some part of the program under load or in some real-world usage scenario. It can&#8217;t do that if it isn&#8217;t full-on production-quality code. Usually, high-fidelity prototypes are massaged over several iterations until they work as expected, and then are inserted into the main body of the code.<br><br>Neither of these prototype flavors is an MVP. A prototype tests a design. An MVP determines if a product is worth building. Those are entirely different things, even if they have a superficial similarity.<br><br>The other related idea is proof of concept (PoC). You use PoCs very early in the design process to prove that some aspect of the design will work. Typically, they&#8217;re used before you get to the prototyping stage and don't look anything at all like the finished product. For example, if you&#8217;re worried about database performance, you might kludge together a simple program that does nothing but dump data into the database and pull it back out to make sure the database can keep up with worst-case load. The concept is similar to the notion of a "spike" in Scrum. A PoC is neither an MVC nor a prototype. It&#8217;s just testing whether a design decision that&#8217;s still under consideration will work out.<br></p><p>So, we have three tools to work with:</p><p>MVP tells us that a product is worth building</p><p>Prototypes tell us that the design of the product is working</p><p>PoCs tell us that core implementation assumptions are correct</p><p>All three of these tools are essential, I think, in product development, but they are very different from one another.</p>]]></content:encoded></item><item><title><![CDATA[Leadership Cannot Be Imposed]]></title><description><![CDATA[All too often, the word "leader" is used to describe a mere manager.]]></description><link>https://blog.holub.com/p/leadership-cannot-be-imposed</link><guid isPermaLink="false">https://blog.holub.com/p/leadership-cannot-be-imposed</guid><dc:creator><![CDATA[Allen Holub]]></dc:creator><pubDate>Mon, 25 May 2026 19:46:14 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>All too often, the word "leader" is used to describe a mere manager. That's not a leader in any real sense. Being anointed as a "leader" by upper management does not make you one. Leadership cannot be imposed. A person in that position claiming they're a leader is spouting puffery&#8212;a source of ridicule (often quiet because they're in a position of power).<br><br>Leaders don't call themselves "leaders." They lead simply by being themselves.<br><br>Leadership is a personality trait. You cannot train a person to be a leader. The notion of a "leadership seminar" is a snake-oil rebranding of management training. <br><br>Teams confer leadership. It emerges when someone behaves in an inspiring way. A true leader does not have "followers" in the conventional sense. Mindlessly obeying or mimicking someone is cult behavior. Being forced to follow or obey is bullying, not leadership.<br><br>Leaders set examples, not impose ways of working. They make sacrifices, not require them. They inspire, not demand. They don't require respect; they're respected. Force and leadership cannot coexist. A power dynamic is a bully's tool, not a leader's.<br><br>So, I find that whole "leadership" framing to be disengenuous at best. I wish we'd drop it altogether.</p>]]></content:encoded></item><item><title><![CDATA[Programming is writing, not math]]></title><description><![CDATA[Programming (the act of putting a computer program together, independent of the problem domain) has nothing much to do with math.]]></description><link>https://blog.holub.com/p/programming-is-writing-not-math</link><guid isPermaLink="false">https://blog.holub.com/p/programming-is-writing-not-math</guid><dc:creator><![CDATA[Allen Holub]]></dc:creator><pubDate>Sat, 23 May 2026 21:09:51 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>Programming (the act of putting a computer program together, independent of the problem domain) has nothing much to do with math. It is primarily about communication. It&#8217;s about us communicating with customers, with each other, and with the machine. Programming is a language skill, not a mathematical one.<br><br>Consequently, I get tired of claims that programming (again, creating code&#8212;not solving problems that are mathematical in nature) has anything to do with math. Beyond a little logic (which stems from Philosophy), a little set/graph theory, and a little statistics, I&#8217;ve never used any real math in my decades of programming unless it was required by the domain. The things that people claim math brings to programming (e.g., analytical thinking and problem solving) are part of almost every human activity, from law to carpentry to oil painting. They are not the unique purview of math or programming.<br><br>Of course, if you&#8217;re a mathematician, you will see parallels. Somebody with a different background will draw equally valid parallels with other disciplines. Programming is a lot like gardening, for example. When math is the hammer,  everything looks like a mathematical nail.<br><br>Some programs do implement problems in mathematical domains, but in those cases, the math is part of the domain, not the programming process. Some programs involve dating profiles, but that doesn&#8217;t mean that dating is an integral part of the programming process.<br></p><p>That is, do not confuse programming (stories, TDD, coding, debugging, testing, CI/CD, software architecture, UX, etc.) with the problem domain. The domain is distinct from the programming process itself. That is, the <em>programming</em> part is the part we use in every program we write, regardless of the problem we&#8217;re solving. Certainly, some problem domains (aviation is often brought up) are mathematical in nature. If you have a fundamentally mathematical problem, you&#8217;ll need math to solve it, just as if you have a fundamentally social problem, like a dating site, you&#8217;ll need knowlege of dating and human social interaction to solve it. You don&#8217;t need dating knowlege to create avionics, and you don&#8217;t need math to go on a date (unless you&#8217;re dating a mathematician &#128516;). </p><p>So, when a programmer doesn&#8217;t have domain knowlege, they use domain experts. Those experts do not, for the most part, know how to program. Sometimes, programmers are domain experts, but not usually, and more to the point, they don&#8217;t have to be. A programmer working in a mathematical domain doesn&#8217;t need to know any math, provided that they&#8217;re working with a domain expert who does (and, conversely, most mathematicians are lousy programmers&#8212;I wouldn&#8217;t let them touch the code).<br><br>Also, computer programs are not mathematical formulae, as some claim. If they were, we could prove program correctness mathematically, and we&#8217;d have no bugs. Be nice, but that&#8217;s not the current reality. People argue that you can prove correctness in the sense that the code will run, and I&#8217;ll buy that. You cannot mathematically prove that the program does anything useful or doesn&#8217;t make significant mistakes (i.e., have bugs) at the domain level.</p><p>I think this false equivalence dates back to the very early days of computing, when computers were used almost entirely to solve mathematical problems. The Babage engine was a calculator, and Ada Lovelace was a calculator programmer. That was indeed math. Modern computers are far more than simple calculators, and the problems we solve are not simple ballistics and the like. In the present, mathematical problems are only a tiny fraction of the problems we solve.<br><br>Of course, computer science&#8212;the branch of mathematics concerned with the analysis of computer programs and algorithms&#8212;uses math (though the 1.5 years of calculus and differential equations that were required prerequisites for every CS class I took were used in exactly zero of those classes, and I&#8217;ve never used either in my work). However, I&#8217;m talking about the creation of computer programs, not the analysis of them&#8212;programming, not computer science.<br><br>So, returning to my original claim, if you want to be a good programmer, forget the math. Instead, focus on developing communication and writing skills. That&#8217;s what we&#8217;re really doing. When you need knowlege of a domain (math or dating) to write the program, consult a domain expert.<br></p>]]></content:encoded></item><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></channel></rss>