<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://www.agilereasoning.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://www.agilereasoning.com/" rel="alternate" type="text/html" /><updated>2026-03-04T14:56:08+00:00</updated><id>https://www.agilereasoning.com/feed.xml</id><title type="html">Agile Reasoning</title><subtitle>Fractional CTO for growing companies — find the technology risks dragging on revenue, fix what matters first, build a platform that scales with the business.</subtitle><entry><title type="html">Death of SaaS</title><link href="https://www.agilereasoning.com/strategy/2026/03/04/death-of-saas.html" rel="alternate" type="text/html" title="Death of SaaS" /><published>2026-03-04T14:32:34+00:00</published><updated>2026-03-04T14:55:43+00:00</updated><id>https://www.agilereasoning.com/strategy/2026/03/04/death-of-saas</id><content type="html" xml:base="https://www.agilereasoning.com/strategy/2026/03/04/death-of-saas.html"><![CDATA[<p>Everyone’s saying SaaS is dying.
It isn’t; it’s about to metamorphose.
What that means for your tech budget depends on where you sit.</p>

<h2 id="ancient-history">Ancient History</h2>
<p>The key innovation of Software as a Service (SaaS) was a new model for software distribution.
A brief-ish history that you’re welcome to skip…</p>
<ul>
  <li>IBM Mainframes originally used paper punch cards to load software.
<em>Do not fold, spindle, or mutilate.</em> Later, reel-to-reel magnetic tape replaced paper.
Business users rarely interacted directly, but instead were delivered printed output with perforated pages.</li>
  <li>Mid-range systems such as AS/400 and HP-3000 did away with punch cards, but magnetic tape still ruled.
Software updates arrived in padded envelopes, and only operators saw them.
Clerical staff might have dumb terminals, but little more.
Managers and above still worked with paper.</li>
  <li>As PCs became commonplace, the media used to distribute software changed rapidly from cassette tape, to 8” floppies, then 5.25”, and finally 3.5”.
Managers started using PCs, but still relied heavily on paper for reporting and decision-making.</li>
  <li>As client-server took over, much of the business software was installed on the server, and users ran it via LAN.
Updates arrived via CD, and for single-machine use mysteriously loaded in the pop-out cup holder.
Paperless was a distant dream for all but a few early adopters.
Besides, faxing your screen is silly.</li>
</ul>

<h2 id="saas-revolution">SaaS Revolution</h2>
<p>SaaS changed the game.
Accessible from anywhere, no infrastructure required, only a working connection.
Updates daily, hourly, whatever was required.
<em>Move fast and break things.</em>
Printers and fax machines were for luddites.</p>

<p>The pioneer was Salesforce, and they’re still the largest pure SaaS company.
By the 2010s, “SaaS” was part of standard business vocabulary.
Startups in the space were exploding, and that’s continued as more and more business processes move online.</p>

<h2 id="ai-metamorphosis-aka-saaspocalypse">AI Metamorphosis AKA SaaSpocalypse</h2>
<p>Agentic AI is seen as a threat to SaaS hegemony, and it is — and it isn’t.
<em>Come again?</em></p>

<p>SaaS companies thrive by delivering a low-friction experience backed by solid domain knowledge.
As more and more code is written by AI models, the effects will vary by customer tier.</p>

<h3 id="enterprise">Enterprise</h3>
<p>Expect serious disruption.
Companies in this space have the budget to create bespoke software at a rate never before seen.
Enterprise SaaS isn’t dead, but the domain knowledge of the provider has to outweigh the implementation friction of their solution.</p>

<p>There is a big difference between bespoke systems streamlined for your specific processes versus SaaS in a utility role.
Writing your own sales order process might be justified, but even the largest companies won’t be eager to reinvent email.</p>

<p>Many will choose to create swarms of AI agents that bridge the gap between “legacy” systems and modern collaboration platforms such as Slack or Microsoft Teams.</p>

<blockquote>
  <p><strong>Note:</strong>
Offering Model Context Protocol (MCP) integration will be table stakes for SaaS providers.
I want to stay out of the weeds, but MCP is essentially an abstraction layer that allows AI agents to interact directly with an external system.</p>
</blockquote>

<h3 id="smb">SMB</h3>
<p>The disruption will be less.
While companies may find it easy to create custom solutions, infrastructure and maintenance/upkeep continue to be real costs.
Vibe coding your way to a tool that works wonderfully for your current process is easy.
Having the discipline to apply security patches as the libraries you’re using are discovered to have vulnerabilities is not.
Zombie projects are a real risk.
And it remains to be seen how well homegrown solutions scale as the company grows.
More likely is the use of MCPs to create custom wrappers around existing SaaS solutions.</p>

<h3 id="individual">Individual</h3>
<p>Customers whose needs are slightly different than the mainstream will have the option to roll their own.
They’ve always had that option, but it’s never been as easy as it is now.
Sophisticated users are creating custom interfaces for any number of external services.
And some have embraced an open source framework called <a href="https://openclaw.ai/">OpenClaw</a> to create their own personal assistant!
<em>I named mine Pepper…</em></p>

<h2 id="implications-for-saas">Implications for SaaS</h2>
<p>SaaS will survive.
Existing software holds significant value for clients who don’t already have their own dev teams and/or domain knowledge.
And it simply isn’t worth the lift to replicate a tool that’s not specific to your business model.
SaaS that isn’t industry-specific should continue relatively unscathed if it’s low friction.</p>

<p>The most visible effect will be competition.
Competitors will rise with relatively little capital, creating a long tail of startups who see themselves as the next Slack.
Some of them will be so niche that they serve only a handful of customers.
Most of them won’t cross the chasm.</p>

<p>The more interesting effect is extension.
Clients who can afford to hire or outsource to even one engineer will find ways to build a private ecosystem around their SaaS tools.
There will be an explosion of bespoke software and workflows that we’ll implement to get work done in more efficient ways.
<em>Or at least ways that seemed like a good idea at the time.</em>
Eventually the best ideas will be incorporated into the mainstream SaaS offerings, raising the baseline of what is possible and expected.</p>

<p>SaaS isn’t going on the cart. But what emerges from the cocoon won’t look much like what went in.</p>

<hr />
<p>Join the Conversation on LinkedIn</p>
<iframe src="https://www.linkedin.com/embed/feed/update/urn:li:share:7434974382457974784?collapsed=1" height="549" width="504" frameborder="0" allowfullscreen="" title="Embedded post"></iframe>]]></content><author><name>Mack Earnhardt</name></author><category term="Strategy" /><category term="saas" /><category term="ai" /><category term="software-delivery" /><category term="vibe-coding" /><summary type="html"><![CDATA[SaaS isn't dying—it's metamorphosing. Who builds what is changing, and the effects vary by Enterprise, SMB, or individual.]]></summary></entry><entry><title type="html">Vibe Coding Proof of Concept</title><link href="https://www.agilereasoning.com/strategy/2025/08/10/vibe-coding-proof-of-concept.html" rel="alternate" type="text/html" title="Vibe Coding Proof of Concept" /><published>2025-08-10T21:36:00+00:00</published><updated>2025-08-11T16:09:00+00:00</updated><id>https://www.agilereasoning.com/strategy/2025/08/10/vibe-coding-proof-of-concept</id><content type="html" xml:base="https://www.agilereasoning.com/strategy/2025/08/10/vibe-coding-proof-of-concept.html"><![CDATA[<p>Putting the cart before the horse—<em>ludicrous mode</em>!</p>

<p>Low-code and no-code tools are advancing at an astounding pace, but the first challenge of proof-of-concept (PoC) work remains knowing <em>what</em> to build.</p>

<h2 id="what-are-you-trying-to-prove">What are you trying to prove?</h2>

<p>Let’s start with a physical example.</p>

<p>You’re designing a grown-up fidget toy for mass production, so you make a small batch of prototypes—maybe only one.
You show them to widening groups of family, friends, and strangers to learn from their reactions.
You refine the concept and make fresh batches.
Only once you’re confident in the design do you order a large production run.
In fact, you might even launch a crowdfunding campaign to gauge interest before committing.</p>

<p>Now, let’s move to the digital realm.</p>

<p>You plan to disrupt a service industry still stuck in the dark ages of manual processes—much like Uber did to taxicabs.
To do this, you’ll need to accept a request from a consumer, interact with four or five APIs, coordinate a network of gig workers, and orchestrate a seamless experience.</p>

<p>Since your vision is clear, you work out the key features, user flows, and automations that will make your service stand out.
You capture it all in a document an LLM can understand.
And then you build it.
Oh my God, do you build it—refining and fighting with the LLM to get every last detail right.
Days or weeks later, possibly with help from <em>actual software engineers</em>, you have a working prototype.
The PoC from your vision is now a reality.
You test it in the wild, then announce your arrival to the world.</p>

<p>This is the moment of truth.</p>

<p>You find out what you missed.
And depending on the miss, you might have to start over.</p>

<p>Wait, <em>what</em>?</p>

<h2 id="what-assumption-are-you-testing">What assumption are you testing?</h2>

<p>Something critical gets lost in the digital example: lean startup philosophy tells us to test our <em>assumptions</em>.
Chief among them is whether customers are even willing to leave the incumbents.
If you can’t convince them to engage, it doesn’t matter how polished your technology is.
This is the digital equivalent of strangers refusing to touch your fidget toy.</p>

<p>Do NOT order a large production run!</p>

<p>In many cases, the simplest path is the best.
Maybe as little as a form submission.
If it validates your hypothesis, it’s doing its job.
The orchestration can remain manual until you have <strong>validated learning</strong> around the problem space and consumer needs.</p>

<blockquote>
  <p>Do things that don’t scale. — Paul Graham</p>
</blockquote>

<p>The point of a PoC is speed and learning, not perfection.
Once you know the solution is viable, <em>then</em> you can invest in building it for real.</p>

<hr />
<p>Join the Conversation on LinkedIn</p>
<iframe src="https://www.linkedin.com/embed/feed/update/urn:li:share:7360673552729108480?collapsed=1" height="569" width="504" frameborder="0" allowfullscreen="" title="Embedded post"></iframe>]]></content><author><name>Mack Earnhardt</name></author><category term="Strategy" /><category term="proof-of-concept" /><category term="validated-learning" /><category term="prototyping" /><category term="lean-startup" /><summary type="html"><![CDATA[PoC discipline: manually validate core assumptions before heavy build—even with powerful low/no-code & AI tools.]]></summary></entry><entry><title type="html">Porting the Problem</title><link href="https://www.agilereasoning.com/architecture/2025/07/29/porting-the-problem.html" rel="alternate" type="text/html" title="Porting the Problem" /><published>2025-07-29T14:56:34+00:00</published><updated>2025-08-19T12:59:22+00:00</updated><id>https://www.agilereasoning.com/architecture/2025/07/29/porting-the-problem</id><content type="html" xml:base="https://www.agilereasoning.com/architecture/2025/07/29/porting-the-problem.html"><![CDATA[<p>Make sure your rewrite/migration is fixing the problem, not simply moving it.</p>

<h2 id="perception">Perception</h2>

<p>One of the teams I worked with was pouring a great deal of effort into moving slow background processing from Ruby/Sidekiq to JavaScript/Lambda, and Ruby was considered “legacy” by much of the team.
The prevailing perception was that JavaScript was inherently faster than Ruby, Lambda was far superior to Sidekiq, and anything ported between them would automatically be faster.</p>

<p>Soon after joining the team, I made a database change that caused a Ruby unit test to fail. It was an easy fix, and I included it in the changes I submitted for code review.
One of the reviewers commented that the code I fixed was obsolete and should be removed. Out of curiosity, I took another look at the Ruby code—and the JavaScript that replaced it.</p>

<p>I didn’t like what I found. Here’s the Ruby process in a nutshell:</p>

<ul>
  <li>Query ~100,000 rows from table A in chunks of 1,000 using <code class="language-plaintext highlighter-rouge">LIMIT</code> and <code class="language-plaintext highlighter-rouge">OFFSET</code></li>
  <li>Break each chunk of 1,000 into smaller chunks of 10 for insertion into table B</li>
</ul>

<p>This didn’t happen in nested loops. Instead:</p>

<ul>
  <li>The top-level routine read each chunk of 1,000 and queued it for level 2 using Sidekiq</li>
  <li>The level 2 routine broke it into chunks of 10 and queued those for level 3 using Sidekiq</li>
  <li>The level 3 (and final) routine inserted each chunk of 10 into table B using a single <code class="language-plaintext highlighter-rouge">INSERT</code> statement</li>
</ul>

<p>The data was modified during the process, so it couldn’t be a direct table-to-table copy.
But if you follow the convoluted process above and do the math, you’ll see:</p>

<ul>
  <li>Table A is queried 100 times</li>
  <li>Table B is written to 10,000 times</li>
  <li>Sidekiq handles 10,101 invocations across 3 routines</li>
</ul>

<blockquote>
  <p>As I was going to St Ives,<br />
I met a man with seven wives,<br />
Each wife had seven sacks,<br />
Each sack had seven cats,<br />
Each cat had seven kits:<br />
Kits, cats, sacks, and wives,<br />
How many were there going to St Ives?</p>
</blockquote>

<p>The new JavaScript code did much the same thing, except:</p>

<ul>
  <li>It substituted Lambda for Sidekiq</li>
  <li>It introduced a data error because the developer misunderstood a bit of Ruby logic</li>
</ul>

<h2 id="reality">Reality</h2>

<p>Ruby vs. JavaScript is out of scope for this post, and Lambda definitely had an edge here simply due to its higher concurrency.</p>

<p><strong>HOWEVER</strong>, the real performance limit was the database access pattern.</p>

<p>Here’s a better approach:</p>

<ul>
  <li>Create a temporary table matching table B</li>
  <li>Copy the 100,000 rows from table A to the temp table using <code class="language-plaintext highlighter-rouge">INSERT ... SELECT</code></li>
  <li>Modify the data using <code class="language-plaintext highlighter-rouge">UPDATE</code></li>
  <li>Insert the rows into table B using another <code class="language-plaintext highlighter-rouge">INSERT ... SELECT</code></li>
  <li>Drop the temporary table</li>
</ul>

<p>The entire process only needed 5–7 queries in a single invocation.
And even though the runtime of the single job was significant, it still ran ~3× faster than the JavaScript/Lambda implementation—largely because the data never left the database.
As a bonus, the entire task was now atomic.</p>

<p>Oh, and we moved the job back to <em>legacy</em> Ruby/Sidekiq—because consolidating 10,101 invocations into one caused timeouts in Lambda.</p>]]></content><author><name>Mack Earnhardt</name></author><category term="Architecture" /><category term="rewrite" /><category term="database" /><category term="performance" /><category term="root-cause" /><summary type="html"><![CDATA[Rewrite misfire: Ruby→JS shift hid the real bottleneck—database access patterns, not language.]]></summary></entry><entry><title type="html">Astronomer Fail</title><link href="https://www.agilereasoning.com/leadership/2025/07/20/astronomer-fail.html" rel="alternate" type="text/html" title="Astronomer Fail" /><published>2025-07-20T16:22:00+00:00</published><updated>2025-08-03T15:00:00+00:00</updated><id>https://www.agilereasoning.com/leadership/2025/07/20/astronomer-fail</id><content type="html" xml:base="https://www.agilereasoning.com/leadership/2025/07/20/astronomer-fail.html"><![CDATA[<p>Seems like a good time to share my Astronomer story—and fair warning, it ends with questions, not spicy takes.</p>

<p>A few years ago, my team was maintaining a critical ETL process. An exec got excited about Astronomer and asked me to evaluate it. After a couple of hours with a trial account, I concluded our needs were too complex, explained my reasoning, and moved on. Case closed—or so I thought.</p>

<p>Some time after I’d left, the idea resurfaced—same exec, same goal. This time, the team spent six months trying to make it work. They failed. My successor was shocked to discover I’d previously told the exec it wouldn’t succeed. In a moment of ironic vindication, I later saw the then-CEO of Astronomer (not Andy Byron) publicly cite our failed project as an example of SaaS trying to do too much.</p>

<p>This isn’t a knock against Astronomer—the current version might easily handle the job. The real issue wasn’t technical; it was human. And no LLM can paper over that.</p>

<p>So here’s what I’m still pondering:</p>
<ul>
  <li>How can leaders differentiate negativity from foresight when someone resists a “new” idea?</li>
  <li>How could I have communicated differently—since, clearly, we weren’t on the same page?</li>
</ul>

<p><em>P.S.—I’ve been doing this long enough that some new ideas feel like I’m Merlin remembering the future.</em></p>

<hr />
<p>Join the Conversation on LinkedIn</p>
<iframe src="https://www.linkedin.com/embed/feed/update/urn:li:share:7352735397979836416?collapsed=1" height="265" width="504" frameborder="0" allowfullscreen="" title="Embedded post"></iframe>]]></content><author><name>Mack Earnhardt</name></author><category term="Leadership" /><category term="due-diligence" /><category term="communication" /><category term="team-alignment" /><summary type="html"><![CDATA[Astronomer adoption failure: skipping technical due diligence became a human alignment issue—tooling wasn’t the root cause.]]></summary></entry></feed>