<?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>Wed, 08 Apr 2026 14:16:43 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[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><item><title><![CDATA["AI creates code in seconds." Nonsense.]]></title><description><![CDATA[It&#8217;s complete BS to say &#8220;AI creates code in seconds.&#8221; That&#8217;s just a lie that I&#8217;m seeing all too often.]]></description><link>https://blog.holub.com/p/ai-create-code-in-seconds-nonsense</link><guid isPermaLink="false">https://blog.holub.com/p/ai-create-code-in-seconds-nonsense</guid><dc:creator><![CDATA[Allen Holub]]></dc:creator><pubDate>Tue, 09 Dec 2025 21:00:48 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&#8217;s complete BS to say &#8220;AI creates code in seconds.&#8221; That&#8217;s just a lie that I&#8217;m seeing all too often. AI creates a first draft in seconds, and that draft has to be extensively edited before it&#8217;s even marginally acceptable as production-quality code. It moves the work from authoring to editing. The AI squirts the paint on the palette; it doesn&#8217;t create the painting.<br><br>Consider: &#8220;We find that the adoption of Cursor leads to a significant, large, but transient increase in project-level development velocity, along with a significant and persistent increase in static analysis warnings and code complexity &#8230; [which] acts as a major factor causing long-term velocity slowdown.&#8221; [<strong><a href="https://lnkd.in/g3MVvDPV">https://lnkd.in/g3MVvDPV</a></strong>]<br><br>To me, this study does NOT tell me not to use Cursor (or any other LLM code-generation tool), but rather underscores the importance of using the LLM as a starting point in the code-creation process, not the endpoint. I find that LLM-generated code _always_ requires manual refinement. It shifts our work from authoring to editing, but editing (making the prose tighter and smaller) is an essential part of the writing process. A writer who cannot edit is not a writer at all. The fact that only the best programmers edit their code, even before LLMs were on the scene, is a huge problem for me. Working with an LLM and perpetuating the bad habit of not editing is a disaster&#8212;a time bomb waiting to go off in your application.<br><br>That&#8217;s the &#8220;long-term velocity slowdown&#8221; they&#8217;re talking about&#8212;dealing with the disaster that is excess code complexity. Unless you plan to sell off your company and foist the maintenance problems onto a buyer so hapless that they don&#8217;t do due diligence, LLM-assisted engineering will be a disaster unless it&#8217;s actual engineering, with code quality being a significant factor in your work. Another reminder that LLMs do not replace programmers, they just change the way we work. The LLM saves time. The editing adds at least some of it back. Deal with it.</p>]]></content:encoded></item><item><title><![CDATA[Process Doesn't Transfer]]></title><description><![CDATA[Why process frameworks don't work.]]></description><link>https://blog.holub.com/p/process-doesnt-transfer</link><guid isPermaLink="false">https://blog.holub.com/p/process-doesnt-transfer</guid><dc:creator><![CDATA[Allen Holub]]></dc:creator><pubDate>Thu, 04 Dec 2025 18:01: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>I tell this story periodically, but it seems like it&#8217;s time again:<br><br>General Motors ran an automobile manufacturing plant in Fremont, California, that was one of the worst in the country. Accident rates and defects were astronomical. Absenteeism was through the roof. They decided to fix that through a joint venture with Toyota called NUMMI.<br><br>Toyota came in and implemented TPS (Lean), and the turnaround was dramatic. Within a few months, NUMMI was a model of perfection. Defects fell to almost zero, as did absenteeism. A critical part of that turnaround was giving the teams control over their own practices and processes. Toyota did NOT install the workstation-level practices that worked for them in Japan. Instead, the teams were given strategic goals, and it was up to each team to decide how best to fulfil them. The other critical factor was Kaizen&#8212;continuous improvement (and by &#8220;continuous&#8221; I mean &#8220;continuous.&#8221; Every minute of every hour of every day. None of this once-every-two-weeks retro stuff. Teams at various workstations coordinated as needed, but multi-team retros occurred only when a defect was detected, and someone pulled the Andon Cord, thereby stopping that part of the line until global processes were changed so the defect couldn&#8217;t happen again. The teams implemented any necessary changes.<br><br>Part of TPS is to document those practices. The good General took that documentation back to Detroit, plonked it on management&#8217;s desk, and said, &#8220;You have to work as described in these docs.&#8221; That was an utter failure. Pretty much every metric got worse. The same processes and practices that worked wonders in Freemont did active damage in Detroit.<br><br>What GM didn&#8217;t get is that the key element that made things work so well in Fremont was team autonomy&#8212;the fact that each and every team developed and was responsible for its own process and practices. The actual processes the teams came up with were much less important. Process does not transfer. There were universal guidelines (e.g. Kaizen), but nobody told the teams how to do their work.<br><br>Now, consider something like Scrum. Like NUMMI, Sutherland and Schwaber mixed a lot of Lean thinking into what they were doing. The first, autonomous Scrum team came up with a process that worked for them, and they improved. However, PROCESS DOES NOT TRANSFER. Team autonomy&#8212;the team&#8217;s ability to define how it works&#8212;is the critical element. Any organization that just mindlessly follows that first (or any other) Scrum team&#8217;s documentation will get the same results that GM got in Detroit. Failure. (Or at least no real improvement).<br><br>Worth thinking about.</p>]]></content:encoded></item><item><title><![CDATA[Innovation Is Overrated]]></title><description><![CDATA[Whenever I write about incremental product development driven by user feedback, somebody always chips in with &#8220;but&#8230;innovation!&#8221; and &#8220;you can&#8217;t work from wish lists!&#8221; Let&#8217;s start with the first of these.]]></description><link>https://blog.holub.com/p/innovation-is-overrated</link><guid isPermaLink="false">https://blog.holub.com/p/innovation-is-overrated</guid><dc:creator><![CDATA[Allen Holub]]></dc:creator><pubDate>Wed, 03 Dec 2025 19:00: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>Whenever I write about incremental product development driven by user feedback, somebody always chips in with &#8220;but&#8230;innovation!&#8221; and &#8220;you can&#8217;t work from wish lists!&#8221; Let&#8217;s start with the first of these.<br><br>The need for innovation in a new product is a myth. Usually, &#8220;innovation&#8221; people imagine that they&#8217;ll start with a &#8220;Great Idea!, built in &#8220;stealth mode,&#8221; and released with a big bang. That approach fails 100% of the time when rounded to the nearest integer. The VC failure rate is famously 90%, but that&#8217;s with considerable vetting. The failure rate is much higher when unvetted products are added.<br><br>The vast majority of successful products are not innovative at all. Consider the spreadsheet, which automated a paper process&#8212;no real innovation. More to the point, the first couple of attempts failed. Does anybody even remember VisiCalc or Lotus? You could argue that automating a paper spreadsheet was innovative, but Excel, which was the third major attempt to hit the market, was not innovative at all, just an incremental improvement on prior attempts, and it&#8217;s the one that succeeded. In other words, success came about through incremental improvement. The companies that did the innovating failed. Other huge product segments work the same way: dating sites == personal ads with pictures, Uber == limo services, DoorDash == pizza delivery. Incremental improvement driven by customer or market feedback leads to success, not big-bang &#8220;innovation.&#8221;<br><br>Often, when innovation occurs, it&#8217;s invisible. Google search, for example, was one of a long line of search engines. The innovation was the algorithm, not the idea of web searching. In AI startups, the LLM (the innovative part) is usually buried deep in the product. I&#8217;ll happily admit that ChatGPT might be an exception to my rule. It was truly innovative at the surface level, but it&#8217;s built on decades of prior research&#8212;incremental improvement, and it&#8217;s losing billions of dollars annually.<br><br>So where does that incremental improvement start? I think the best approach is to identify a very small pain point&#8212;a problem that people are having. Collaboratively develop the smallest possible solution, gather feedback, and improve based on it. The smaller the thing you release, the better. You want feedback as early and often as possible&#8212;ideally during development, not after. (One of the problems that I have with Scrum-as-usually-implemented is that the team doesn&#8217;t get feedback until the Sprint Review, which is too late. If the review comes back with a &#8220;nah,&#8221; you&#8217;ve wasted the entire Sprint.)<br><br>You&#8217;ll note that none of this incremental improvement comes about from working through a wish list. I suggested starting with a problem. A wish-list approach starts with a (you hope) fully formed solution. That never works in my experience. &#8220;Customer driven&#8221; does not mean &#8220;mindlessly implement a wish list.&#8221; It _does_ mean: get regular feedback from your (potential?) customers during development to assure that you&#8217;re building something somebody actually wants.</p>]]></content:encoded></item><item><title><![CDATA[Working With Constraints]]></title><description><![CDATA[We all work under constraints like time or budget, even when working incrementally.]]></description><link>https://blog.holub.com/p/working-with-constraints</link><guid isPermaLink="false">https://blog.holub.com/p/working-with-constraints</guid><dc:creator><![CDATA[Allen Holub]]></dc:creator><pubDate>Wed, 26 Nov 2025 20:39:03 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>We all work under constraints like time or budget, even when working incrementally. You do not solve that problem with a plan, however, particularly an inflexible one. (You do need a product strategy, but that&#8217;s a higher-level thing. Plans are tactical, not strategic.) So, how do you handle constraints?<br><br>First, budget the annual cost of the team (salary * load). You pay for the team even if they sit around and play canasta all day, so budget for that reality. Now assign the team to the product (not projects) that provides the most customer and business value. This is a basic Lean concept: bring resources and people to the constraint&#8212;the place with the most demand. That&#8217;s a moving target, so discover what to do through feedback from small incremental releases, and adapt continuously as needed.<br><br>There is _always_ more work than budget (or time), no matter how you work. Solve that by continuously assessing what to do through the lens of user/customer (and therefore, business) value. Always do the most valuable thing next. When the budget or time runs out, you will have built the best thing you could have built within the constraints at hand. When time and money are fixed, scope must vary. Fixing all three is a death march.</p>]]></content:encoded></item><item><title><![CDATA[Move Fast, but Don't Break Things.]]></title><description><![CDATA[Let&#8217;s talk about &#8220;Move fast and break things.&#8221; First of all, Facebook itself changed its motto to &#8220;Move fast with stable infrastructure&#8221; in 2014.]]></description><link>https://blog.holub.com/p/move-fast-but-dont-break-things</link><guid isPermaLink="false">https://blog.holub.com/p/move-fast-but-dont-break-things</guid><dc:creator><![CDATA[Allen Holub]]></dc:creator><pubDate>Sat, 22 Nov 2025 17:17:17 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&#8217;s talk about &#8220;Move fast and break things.&#8221; First of all, Facebook itself changed its motto to &#8220;Move fast with stable infrastructure&#8221; in 2014. So much for breaking things, at least if you&#8217;re a soulless corporate behemoth. Even if you&#8217;re a startup, though, breaking things makes no sense at all unless you&#8217;re talking about breaking the status quo in a moribund product space. Who has time to fix broken stuff?<br><br>&#8220;Move fast&#8221; is more interesting. Fast gets you two essential things: you get revenue sooner, and you get the feedback you need to ensure you&#8217;re building something the market actually wants.<br><br>&#8220;Move fast&#8221; doesn&#8217;t mean: get low-quality buggy garbage out the door faster. That slows you down. Every change to buggy code is painful (and time-consuming), particularly when you have no tests because you have &#8220;no time to write them.&#8221; You have no time not to write them. The best way to move fast is to increase quality and be serious about testing.<br><br>Also, buggy systems drive customers away. No startup can afford that. Bugs erode trust, and attempts to regain that trust by releasing a slightly less buggy version in a month are doomed. People have long memories.<br><br>There are constructive ways to move fast, though. The first is to change the way you work. Traditional Lean thinking&#8212;remove waste; work on one thing at a time (reduce WIP to 1)&#8212;cuts development time in half or more. Working collaboratively (e.g., mob/ensemble programming) eliminates coordination and integration overhead. Whole-team development&#8212;where all the skills needed to get something out the door are available within the team&#8212;eliminates dependency delays. <br><br>The next set of speed improvements comes from not building infrastructure you don&#8217;t need. If you have 100 customers, for example, you probably don&#8217;t need a database&#8212;a flat file with JSON in it will do. You almost certainly don&#8217;t need that slick UI (you need a good UX, but you can often get that with a very simple UI). You do not need an architecture or infrastructure that supports 100,000 users until you have 100,000 users. You do need an incremental-friendly architecture&#8212;one that can evolve as it scales. Eminently doable, but it&#8217;s a learned skill.<br><br>The most dramatic speed improvements come from not building entire features that nobody wants. Work very small to get code into your customer&#8217;s hands as quickly as possible, and then get feedback from them in a continuous conversation. Why build things nobody cares about? I&#8217;ve often released a small thing devoid of most of the features and bells and whistles I thought I needed, and the feedback was &#8220;this is great!&#8221; At that point, I&#8217;m done. Those bells and whistles were cruft. Build the thing that alleviates the most pain first, then get feedback. <br><br>So, I&#8217;m not sure about breaking things, but moving fast is always a good idea. You just have to go about doing it sensibly.</p>]]></content:encoded></item><item><title><![CDATA[So get crackin'!]]></title><description><![CDATA[The solution to layoffs]]></description><link>https://blog.holub.com/p/so-get-crackin</link><guid isPermaLink="false">https://blog.holub.com/p/so-get-crackin</guid><dc:creator><![CDATA[Allen Holub]]></dc:creator><pubDate>Tue, 11 Nov 2025 20:09:26 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&#8217;ll start with the conclusion: The solution to layoffs is starting your own company. It is not as difficult as people think. You do not need (or want) VC funding. You do not need (or want) a large, complex product or to solve a huge problem. You do not need AI. (Remember, you&#8217;re not selling to VCs, so you don&#8217;t need a buzzword-based product.) You do not need millions in revenue&#8212;replacing your salary is enough.<br><br>Solve a tiny problem that impacts your actual life.<br><br>Don&#8217;t wait for a <em>Great Idea!!!!!!</em> You don&#8217;t want a &#8220;blockbuster&#8221; product. You don&#8217;t even need a business plan. (Remember, no VCs.) Things like risk don&#8217;t matter&#8212;you don&#8217;t have anything better to do with your time if you&#8217;re not working.<br><br>Then build it in the simplest way possible&#8212;no need for elaborate frameworks or a 100K-customer architecture (but you do want an architecture that can grow incrementally over time&#8212;take a look at DDD). You probably don&#8217;t even need a database, at least not at first. Make it web-based because that runs everywhere (you do need it to look good and work well on a phone, though). By all means, use AI to help write the code if that speeds you up, but we&#8217;re talking small, here. An AI assist won&#8217;t make that much of a difference.<br><br>Then get it out there. Use social media. Go to meetups. Find people who have the same problem that you do. Give your solution away (once you have customers who can give you feedback, and you improve the product based on that feedback, you can think about selling it). Many engineers are scared of &#8220;sales&#8221; and &#8220;marketing.&#8221; Don&#8217;t be. Talk to friends. Write about your problem and how to solve it.<br><br>The smaller the problem, the sooner the revenue.<br><br>One of my role models for working this way is Marcus Frind, the founder of PlentyOfFish (a dating site). He built it in his free time over a couple of months to learn .NET, and ran it from a server in his closet. The site was Spartan, but it covered the basics. People could meet each other. (One of my favorite bits of corner-cutting was that all the photos were square&#8212;if you posted a rectangular image, it was squished along both axes to be square. That resulted in many football-shaped &#127944; heads. Nobody cared.) Revenue, at first, was entirely Google-Ad-based (interestingly, the ads were mostly for competing dating sites&#8212;people would click on a Match.com ad just to bounce over to match.com, giving Marcus a few cents for what amounted to a link). The company did grow beyond one person, but it was never that large, and that was _after_ he had the revenue to pay for it. He eventually sold it to the Match group for $575M. <br><br>So, get started! Now&#8217;s the time.</p>]]></content:encoded></item><item><title><![CDATA[Just Decide, Already!]]></title><description><![CDATA[Compromise is usually avoidence]]></description><link>https://blog.holub.com/p/just-decide-already</link><guid isPermaLink="false">https://blog.holub.com/p/just-decide-already</guid><dc:creator><![CDATA[Allen Holub]]></dc:creator><pubDate>Sat, 01 Nov 2025 19:03:10 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!wA2v!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc166fb4e-6f92-424d-a917-aacb458e6607_498x380.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I&#8217;ve always hated the Apple-style infinitely-long animated web pages where the scroll wheel just moves stuff around on the page rather than scrolling. All that does is add confusion and make me work harder to see actual content. It&#8217;s an obfuscation mechanism. The motion is impressive for about 5 seconds, the first time you encounter it, then it&#8217;s just annoying&#8212;a triumph of &#8220;art&#8221; over functionality. Admittedly, I see this a lot in less splashy ways. For example, light gray type on a dark gray background is a slap in the face of basic usability, but some &#8220;artist&#8221; insisted on it, usability be damned.<br><br>The thinking that leads to things like that specious animation is really ingrained in the artist mindset. Artists realize an internal vision that is not customer-driven&#8212;in fact, customer-driven art is universally bad art. A UX engineer, conversely, focuses entirely on user needs. The two perspectives are often at odds, but you need both art and UX in a good website. The skill comes in reconciling these two points of view&#8212;art without compromising usability.<br><br>Recently, I came across the new Affinity Studio site, which uses the same tired motion nonsense in spades, but also has a &#8220;Reduce motion&#8221; button that turns off the idiocy and lets the scroll button scroll. Here we have politics made visible&#8212;the user-experience camp fighting against the art camp. Somebody seems to have asked the users what&#8217;s best, and the art camp is reluctantly allowing the UX folks to turn off their precious animation in the face of user indifference. Two sites superimposed is NOT a solution, though; it&#8217;s indecision and equivocation made visible.<br><br>The cost is, of course, nontrivial. They&#8217;re building two websites: a less expensive, usable page overlaid on a vastly more costly animated page that no customer is asking for. Seems like a waste of time and money to me.<br><br>The more critical issue is the organization&#8217;s inability to make a decision. Given two ideological camps, both win, which is to say, nobody wins. More than doubling development costs is a lose-lose proposition. This is organizational schizophrenia, not compromise. Psychological safety&#8212;the ability to disagree, and even argue, without repercussion&#8212;is missing in these organizations. Avoidance is not safety. Compromise is a disease. We need consent&#8212;to experiment with one of the two choices, for example&#8212;not compromise.<br><br>This situation indicates an inability to collaborate. A good collaboration is a melding of strengths, not a &#8220;design by committee&#8221; compromise. Of course, collaboration requires psychological safety, so it&#8217;s really a secondary effect.<br><br>We also need to make decisions. I once had a particularly frustrating client who refused to decide anything. The entire spec was littered with &#8220;do a, b, c, or d, as specified in the configuration.&#8221; That file got so complicated they wrote a programming language to specify config&#8212;literally making the user write the program for them.<br><br>This sort of throw-in-the-kitchen-sink design is not uncommon, of course. That doesn&#8217;t make it good</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!wA2v!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc166fb4e-6f92-424d-a917-aacb458e6607_498x380.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wA2v!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc166fb4e-6f92-424d-a917-aacb458e6607_498x380.png 424w, https://substackcdn.com/image/fetch/$s_!wA2v!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc166fb4e-6f92-424d-a917-aacb458e6607_498x380.png 848w, https://substackcdn.com/image/fetch/$s_!wA2v!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc166fb4e-6f92-424d-a917-aacb458e6607_498x380.png 1272w, https://substackcdn.com/image/fetch/$s_!wA2v!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc166fb4e-6f92-424d-a917-aacb458e6607_498x380.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wA2v!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc166fb4e-6f92-424d-a917-aacb458e6607_498x380.png" width="498" height="380" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c166fb4e-6f92-424d-a917-aacb458e6607_498x380.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:380,&quot;width&quot;:498,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:33914,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://blog.holub.com/i/177748541?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc166fb4e-6f92-424d-a917-aacb458e6607_498x380.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!wA2v!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc166fb4e-6f92-424d-a917-aacb458e6607_498x380.png 424w, https://substackcdn.com/image/fetch/$s_!wA2v!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc166fb4e-6f92-424d-a917-aacb458e6607_498x380.png 848w, https://substackcdn.com/image/fetch/$s_!wA2v!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc166fb4e-6f92-424d-a917-aacb458e6607_498x380.png 1272w, https://substackcdn.com/image/fetch/$s_!wA2v!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc166fb4e-6f92-424d-a917-aacb458e6607_498x380.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div>]]></content:encoded></item><item><title><![CDATA[Vibe Coding And Watches]]></title><description><![CDATA[Programming is a social activity.]]></description><link>https://blog.holub.com/p/vibe-coding-and-watches</link><guid isPermaLink="false">https://blog.holub.com/p/vibe-coding-and-watches</guid><dc:creator><![CDATA[Allen Holub]]></dc:creator><pubDate>Sun, 26 Oct 2025 17:59: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>I&#8217;ve been thinking about the exuberance (and often hostility) surrounding vibe coding vs other techniques. Vibe coding is not particularly more efficient or productive than other approaches (as many studies show)&#8212;it&#8217;s just different. Why does a simple choice of tooling bring out so much emotion?</p><p>I think there&#8217;s a good analogy in men&#8217;s watches&#8212;bear with me &#128516; . I usually mentally roll my eyes when somebody says, &#8220;My $20 Timex keeps time just as well as that &lt;expensive watch&gt;.&#8221; It&#8217;s both a sort of snobbery and a failure to grasp the concept. Particularly in a cell-phone era, watches have nothing to do with keeping time. They are jewelry&#8212;the only tasteful everyday jewelry men can wear other than wedding or class rings. For engineers in particular, mechanical watches can be delightful&#8212;the charm of artful complication in a computer age. Watches also make a statement about the wearer: ostentation vs. elegance;  skeletonized complexity vs. railroad-watch simplicity, gold vs. titanium; smart vs. mechanical. All these things matter, and they all tell us something about the wearer (as does that Timex) and, like vibe coding, bring out our feelings. They are also internal: they symbolize how we see ourselves.</p><p>The way we code is like the watches we wear. The practical concerns (telling time, creating code) are secondary to the statement our coding systems make about ourselves and the delight we take in the process. Some people delight in hand-crafting, others in the cybernetic futurism of machine assistance. Some people take no delight at all&#8212;which is itself a statement (they don&#8217;t wear watches). Vibe coding or not, the work is about the same (all watches tell time), but the way we go about doing the work matters to us because it makes a statement about ourselves. So, of course, emotions can run high. It&#8217;s not about the tooling, it&#8217;s about being &#8220;modern&#8221; or &#8220;cool&#8221; or &#8220;a craftsperson.&#8221; </p><p>It&#8217;s also about social groupings. The gold Rolex crowd forms a social group, as do the smartwatch and Timex crowds (as does the Patek Philippe crowd, but that&#8217;s management &#128516;.) I can&#8217;t overemphasize the role that social groups play in technical decision-making and the development process. We don&#8217;t want to alienate our friends, and the &#8220;wrong&#8221; tooling or technical decisions&#8212;ones not approved by the group&#8212;can do that, so we resist other ways of working. Our social nature drives us in a particular direction. The technical arguments&#8212;telling time&#8212;are secondary. It is wise, I think, to never forget that we are social animals and that software development is, first and foremost, a social activity. If we want to change the tech, we first have to look at the social system that will resist (or, in some cases, encourage) that change.</p>]]></content:encoded></item><item><title><![CDATA[Systems Of Work]]></title><description><![CDATA[Changing one thing at a time rarely works. Org improvement is not programming.]]></description><link>https://blog.holub.com/p/systems-of-work</link><guid isPermaLink="false">https://blog.holub.com/p/systems-of-work</guid><dc:creator><![CDATA[Allen Holub]]></dc:creator><pubDate>Tue, 14 Oct 2025 18:31:18 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>We all adhere to a <em>system</em> of work. That system may or may not be chaotic, but it&#8217;s a system nonetheless: a collection of components and subsystems that work in concert to achieve a single goal&#8212;in our case, to produce a product. <br><br>Removing or changing any part of that system impacts the system as a whole, sometimes leading to its collapse. You cannot, for example, remove the carburetor (or even a spark plug) from a car&#8212;an automotive system&#8212;and expect to still achieve the goal of moving from one point to another at speed. Even positive improvement can be a disaster. You can go faster by adding a bigger engine, but if you don&#8217;t also beef up the brakes and the drivetrain, swap in different tires, modify the chassis to handle the extra load, etc., your car will not be able to handle the added torque.<br><br>I&#8217;m bringing this up because <a href="https://blog.holub.com/p/the-cost-of-a-stand-up-meeting?r=63mwk">yesterday&#8217;s post</a> said that you don&#8217;t need stand-up meetings. That DOES NOT MEAN &#8220;do what you&#8217;re doing now, but without standups.&#8221; The standups are a component in a larger system of work that does not stand alone. Simply removing the standup could break the overall system of work. Put another way, don&#8217;t remove stand-ups; instead, change your system of work to one where stand-ups are no longer necessary.<br><br>You cannot make even small changes to a system of work without considering the system as a whole and making systemic adjustments.<br><br>So, if you want to remove that standup, you need to adjust the overall system to compensate. For example, organizations that use mob/ensemble programming 100% of the time do not need standups. (And, just to cut off the inevitable uninformed complaint: no, that is not less efficient. Many ensembles work faster than they did when they were working as individuals. If you think you know what mob/ensemble programming is but have never done it, there are many great learning resources at [<strong><a href="https://t.ly/7wEhf">https://t.ly/7wEhf</a></strong>].)<br><br>However, for that ensemble to function, you need an overall system that promotes ensemble work. Things like individual performance reviews, a requirement for a single sign-off on a &#8220;ticket,&#8221; PR-triggered code reviews, a lack of team autonomy and psychological safety, a &#8220;hero&#8221; culture, etc., all fight against ensemble work. Put another way, you cannot just drop ensemble programming into your existing system and expect it to work any more than you could drop a new engine into that car. The overall system will guarantee its failure and pull you back to the previous status quo.<br><br>So, to get rid of that standup, you need to change the way you work. You need to change your system of work to one that does not require standups. That&#8217;s certainly possible, as is proven by many organizations that have done precisely that, but it&#8217;s not the mindless removal of a single component.</p><p>An &#8220;experiment&#8221; in which you change only one thing (e.g. remove the standup) <em>will</em> fail unless you change the other parts of the system that were dependent on that one thing (e.g. replace <a href="https://www.industriallogic.com/blog/scatter-gather/">scatter/gather</a> with an ensemble). You can&#8217;t apply a debugging strategy (change one thing at a time) to organizational improvement.</p>]]></content:encoded></item></channel></rss>