The Engineering Tax · Article 13 of 29
When Your Software Choices Stop Making Economic Sense
You've built the modular architecture and the clean interfaces, and the system still leaks margin. The next article walks through three economic distortions that turn sound engineering into a money-losing machine: the commoditization trap, the hidden cost of free dependencies, and the CEO override that kills demand-driven work. The first leadership team that recognizes these patterns cuts waste before competitors even see the signal.

Market Signals Misaligned with Business Reality
I watched three systems tear each other apart at a company I worked at. That’s when I learned the real pattern. Software companies reach a point where their choices stop making economic sense. They build features nobody uses, pull in components labeled “free” and then pay the bill in maintenance, and expand teams to support internal complexity instead of customer needs. The pattern repeats across the industry, and the root cause violates a single economic principle:
Everything you do to satisfy demand makes you wealthier. But everything you do not to satisfy demand, but ignoring it, makes you poorer.
This article walks through three distortions that trap product companies, with examples of the damage they cause and a practical way to restore economic sanity. None of it is theory. I’ve lived the cost of ignoring it.

1. The Commoditization Trap
Competing on the offer, not the demand
Companies build features “because the competitors have it”. That’s a reaction to a competitor’s launch, and a reaction isn’t a strategy. The CEO looks at competitor feature lists instead of customer behavior, and the company ends up competing on the offer (what’s visible in the market) rather than on the demand (what people are actually willing to pay for). Over time, this turns the product into a commodity as margins shrink and differentiation disappears. The company becomes a slightly worse copy of everyone else, and the only thing left to compete on is price.
The reasons for building the feature are usually emotional: pride, envy, fear of looking weak in front of a competitor’s launch, the discomfort of saying no to a sales team that lost a deal. None of those reasons connect to a customer willing to pay for the work, and every minute the engineering team spends on those features is a minute taken away from features customers would actually use.
The Triple Sync of Death
I saw this play out at a company I worked at. Its product had found market fit. The original system was a monolith, and the company started building new services next to it. In my team, data had to stay in sync between the monolith and my service. Not a huge deal at first, but as my team’s domain grew more relevant, a third service entered the picture, and three systems that all needed to agree with each other, all the time.
Features kept piling on top while technical debt from the syncs accumulated quietly. When the tech team warned leadership, they wanted more features anyway, not shipping features wasn’t acceptable. Different people at different times made changes without considering the impact on the other systems. The system grew to support the company’s offer, not the market’s demand, and the bill came due in incidents, customer complaints, and team burnout.
I was the one who eventually had to assess the damage honestly and that’s when I called those three tangled systems “the triple sync of death”. I told the leadership what the real problem was and what it would take to fix it, and nobody liked hearing it, so I didn’t make friends while fixing that mess. I had to push hard through a year of refactoring with my team, fighting for budget against a leadership that saw my team as an expensive black box rather than the people closest to the actual cost of the mess.
The result was worth it. Incidents dropped to almost zero, confidence in the product came back, and the team could ship again without everything breaking. The political cost was real, but the economic cost of not doing it would have been much higher. By the time the bill arrives in any company, the people who could have stopped the damage have often moved on, and the people left to pay it had no part in the decision.
A peer-review that asks the right questions
Build a cross-functional peer-review process for any feature proposal that takes more than a day of work. The questions must be blunt on purpose, because the point is to show the reasons behind the request before they get laundered into “the customer wants it”. The CEO wants it, the sales team wants it, and someone in a meeting wants it. The process makes the difference visible.
- Are we adding this because customers demand it, or because competitors have it?
- Does this feature make us more differentiated, or does it make us more interchangeable?
- What is the real economic cost over three years, including development, maintenance, infrastructure, and support?
The peer-review is a forced pause, and the pause is the point. The original conversation usually skips these questions, and skipping them is how the trap reopens every quarter.

2. When Free Costs Everything
When free is an unknown cost, not a feature
External dependencies look free, but “free” only describes the price. It says nothing about the cost. The cost of an external dependency is everything the company pays to keep using it. That means the upgrades that break things, the security patches that arrive on someone else’s schedule, the maintainers who can quit, the license terms that can change, and the documentation that goes stale. The company owns the consequences of every one of those risks.
The thinking that creates the trap goes like this: “Why pay my team to build an independent module (a self-contained piece of the product the company owns and controls) when I can pull in this external library for free?” The question sounds reasonable at the time, and the answer only becomes visible after the company has built the rest of the product around the dependency, when replacing it would mean rebuilding half the system.
For a non-technical reader, the mental model is simple. Imagine you’re building a restaurant and decide to use a third-party payment processor because setting up your own would cost time and money. The processor is “free” in the sense that you don’t write the code, but if that processor raises its prices, changes its terms, or goes out of business, your restaurant stops taking payments. You depend on a supplier you don’t control for one of the most important parts of your business, and the same logic applies to any external piece of software a product depends on.
The more important the dependency is to the product, the worse the risk. A logging library that breaks is annoying. A payment library that breaks is a company-killing event. A core part of the product’s “secret sauce” (the thing that makes the product different from competitors) that lives in an external dependency is a bet that someone else will keep maintaining the thing that defines your business. GitHub stars say nothing about long-term maintenance. People lose interest, companies get acquired, maintainers get busy, and the library can be deprecated next year with no warning.
Open source follows the same rule, and the stakes only get higher at scale
Open source libraries follow the same logic as any other external supplier. The stakes rise with the product’s success. When the product is early, depending on an open source library is a reasonable trade-off. The team moves fast, the product changes constantly, and the cost of replacing a small library is low. After product-market fit, the trade-off changes. A library that was a quick win at ten customers becomes a piece of the architecture at ten thousand, and the cost of replacing it goes up by orders of magnitude without anyone having a conversation about it.
The right way to think about an open source dependency is as an external supplier. The supplier controls the roadmap, the timeline, and its own continuity, and the company inherits all of it. If the supplier disappears, the company inherits the maintenance of the code. If the license changes, the company inherits the legal risk. If the library becomes incompatible with the rest of the stack, the company inherits the migration. The most dangerous moment is when the dependency is so embedded that replacing it would take longer than building it would have in the first place.
For a non-technical reader, the analogy is procurement. If your factory relies on a single supplier for a critical component, and that supplier has no contract, no obligation, and no financial incentive to keep serving you, you’re running a bet, not a business. Open source dependencies work the same way, except the bet is on the goodwill of strangers.
The rule that follows is straightforward: the more central a component is to the product, the more important it becomes that the company builds it in-house. The reason goes beyond stability, because governance and intellectual property matter as well. The “secret sauce” of the product should never live in someone else’s repository.
Auditing interfaces on a recurring schedule
Create a process for auditing external dependencies on a recurring schedule. Dependencies drift, maintainers leave, and licenses change, and a one-time audit misses all of that. The audit runs continuously, with five signals that trigger a closer look. The signals are written for engineers, but the reasoning is plain: the goal is to catch dependencies that are quietly becoming too important to leave unmanaged.
- Maintenance frequency. How often do updates break your system? If updates from the library are causing incidents or forcing emergency work more than a few times a year, the dependency is becoming a liability.
- Community health. How many active maintainers exist, and how fast do they respond to issues? A library maintained by one person who hasn’t committed in a year is a library that’s one life event away from abandonment.
- License stability. What is the risk of the license changing? Open source projects can relicense, and companies can acquire maintainers and change the terms. The risk is small for major libraries with corporate backing, and large for hobby projects.
- Business criticality. How essential is this to the product’s secret sauce? The more central the dependency, the more important the interface.
- Integration depth. How deeply is the library woven into the code? A library that’s called in one place can be replaced in a day. A library that’s referenced in fifty files is a project.
For high-risk dependencies, the fix is to wrap the library behind a well-defined interface. This interface acts as a contract describing what the product needs, written in terms the product cares about rather than in terms the library provides. Building the interface has a cost, and that stays small compared to rebuilding the dependency from scratch if the worst happens. The interface doesn’t remove the risk, but it makes recovery cheap.
Reading the risk matrix as a non-technical leader
The matrix below is a tool for non-technical readers. It scores each external dependency on the five signals above and recommends an action. The thresholds are starting points, and each company calibrates them based on its own reality. The point of the matrix is to force a conversation about whether the company is comfortable with the risk it’s carrying.
| Signal | Low Risk | Medium Risk | High Risk | What to do |
|---|---|---|---|---|
| Maintenance frequency | Few updates per year, and they don’t break your system | A few updates per year, and they sometimes force changes | Updates break your system often, or the project is abandoned | Wrap in an interface if high |
| Community health | Multiple active maintainers with regular commits | A few maintainers, slower response times | One maintainer, or no recent activity | Plan a replacement if high |
| License stability | Stable, well-known license with no expected changes | Minor revisions, or some corporate influence | Project relicensed, or acquired by a company that may close the source | Wrap in an interface immediately if high |
| Business criticality | Auxiliary feature, the product works without it | Important, but the product can survive a temporary outage | Core to the secret sauce, and the product doesn’t work without it | Build in-house if high |
| Integration depth | Used in one or two places, easy to swap | Used across several modules, requires planning | Used everywhere, replacing it would take months | Wrap in an interface if high |
Each row asks a different question. Maintenance frequency asks whether the library is becoming a source of broken production systems. Community health asks whether the people behind it are still showing up. License stability asks whether the legal terms could change under the company’s feet. Business criticality asks how much damage a failure would cause. Integration depth asks how expensive a replacement would be.
A “high” rating in any row tells the company to know the risk and have a plan for the day the dependency fails. The interface is the cheapest plan, the replacement is the most expensive, and the choice depends on the company.
3. When the CEO Overrides the Customer
Why top-down requirements are already a warning sign
The most expensive features are the ones with no genuine customer demand. They get built because someone important asked for them, and the team’s afraid to say no. The result is a product that does what the CEO wanted, not what the customer needed, and the ROI is negative by definition. The feature costs money to build, costs money to maintain, and generates no profit.
According to Clayton Christensen, the people who understand demand best in most companies sit in the middle of the org chart: product managers, engineering managers, account leads.
When a feature requirement comes from the top, it has most likely passed through zero layers of customer contact. When a feature requirement comes from a product manager who talked to fifteen customers that week, it has most likely passed through multiple layers. The direction of the requirement is itself a signal. A top-down requirement is a hypothesis about demand, and a bottom-up requirement is closer to evidence. The further down the org chart the requirement originates, the more it has been pressure-tested against real customer behavior.
A public example: Qualtrics in 2023
In October 2023, Qualtrics cut 780 jobs, around 14% of its workforce.
This is the demand delusion at organizational scale. The company built capability to satisfy an internal definition of success (headcount, structure, process) rather than an external one (customer demand, profit, sustainable growth). The result was the same as building a feature nobody uses. But the unit of waste was a team instead of a feature. The economic damage was measurable: 780 people lost their jobs, productivity dropped during the restructuring, and the company had to rebuild trust with the people who stayed.
Staged demand validation
Demand validation is a sequence of checks, each designed to catch a different kind of failure. The CEO owns the process, because the company is the CEO’s responsibility, and the cost of getting it wrong falls on the company.
Stage 1: Behavioral evidence. The first check is what customers do, because stated preferences are unreliable. People say they want a feature and never use it. Behavioral evidence is what they actually do in the product: the workarounds they build, the goals they try to accomplish, the patterns that show up in the data. The minimum bar is five to ten customer conversations per week with the people who would actually use the feature, plus whatever the analytics show about their current behavior. The bar is evidence, not a fixed number of conversations, and setting it too low is how the entire validation process fails before it starts.
Stage 2: RICE scoring. Once the evidence is in, score the feature using the RICE formula. It evaluates Reach (users affected per month), Impact (improvement from 0.25 to 3.0), Confidence (how sure the team is about estimates, from 50% to 100%), and Effort (person-months to build and ship). The final score is Reach × Impact × Confidence ÷ Effort, giving teams a way to compare features against each other so the conversation shifts from feelings to relative value.
Stage 3: Total cost of ownership. The final check is the three-year cost. A feature that costs a little to build and a lot to maintain usually costs more over time than one that costs more to build but less to maintain. The TCO calculation adds up development, annual maintenance, infrastructure, and support over three years, and the feature has to generate enough value to justify that cost. If the three-year ROI is negative, the feature doesn’t ship, no matter how many people asked for it.
Each stage has a different job: Stage 1 confirms the demand is real, Stage 2 ranks the value against the work, and Stage 3 checks that long-term cost doesn’t eat the short-term gain. Skipping a stage is how companies end up with features that look good in the planning meeting and destroy value in the year after.
Why the CEO owns the call
Owning this process falls to the CEO, because the responsibility comes with the role. The person carrying it sets the thresholds for the balance between speed and rigor. Approval is theirs, because the consequence is theirs too.
This is the part that matters most. Money funds a project only when demand justifies the investment. An investor’s check is a resource, and a successful fundraising round provides capital the CEO can deploy. A CEO’s real job is making sure company money follows customer demand, not the other way around. When the company has money but no validated demand, the money is a tool, and the tool should fund the search for demand. To break even and grow profitably, every feature must pay for itself.
The team is allowed to push back. So is the product manager. And the engineer who says “I don’t think this is worth building” is doing their job. The CEO who hears that and overrules has to know the cost, because the override is a real decision with a real cost, and the cost is the company’s margin.
4. Putting It Together
Filter cost vs. project cost
Apply the filter to anything that costs more than a day of work. If five people each spend a day on something, that’s five days the company is paying for, even if the work happened on the same calendar day.
The filter also has a ceiling. If running the filter process would cost more than the project and its future maintenance, the filter has lost its purpose. A filter that costs more than the thing it filters becomes overhead, not protection, so use common sense. The thresholds belong to the company, not to a template.
How the three distortions connect
The three traps in this article are not separate. They reinforce each other. A company that competes on offer builds features to match competitors, then uses open source libraries to ship them fast, then maintains them for years without checking whether the demand is still there. By the time the audit happens, the company is paying maintenance on a feature that was never demanded in the first place, built on a dependency that was never controlled in the first place. These features become a portfolio of distorted assets: things that look valuable on paper and destroy value in practice.
The cycle is reversible. The same chain of decisions can be used in reverse: demand first, then interface, then peer review, then build. The order matters. Building first and validating later is how the cycle restarts.
Other distortions worth watching
The three traps in this article are the most common ones, and the same structural failure shows up in other places. It’s worth naming them so the pattern is easier to recognize. They are all the same disease: satisfying internal incentives, market theater, or org politics instead of demand.
- Time value distortion. Prioritizing immediate delivery over long-term viability. Quick hacks replace sustainable solutions, and the company pays interest on every one of them.
- Resource allocation distortion. Treating engineering as a fungible commodity (interchangeable, like generic parts on a shelf). Constant team reassignments destroy institutional knowledge and make every project start from zero.
- Valuation distortion. Basing company value on feature count rather than profit margins. Feature bloat to impress investors who don’t pay maintenance.
- Innovation distortion. Measuring innovation by technology novelty rather than customer value. New frameworks get adopted without anyone asking whether the customer cares.
- Competitive distortion. Prioritizing feature parity over differentiation. Companies copy competitor features because copying is easier than thinking.
- Data distortion. Tracking vanity metrics (numbers that look impressive but don’t reflect economic reality) over economic indicators. User growth gets measured instead of customer lifetime value, and the team chases the wrong number.
The list is long, and the fix is the same for all of them: ask whether the activity serves customer demand, and if the answer is no, kill it. Distortions survive because nobody asked the question.
A short checklist
For any feature that costs more than a day of work, run through these five checks before approving it:
- Do we have behavioral evidence that customers want this, or are we inferring it from what competitors do?
- Does this feature make us more differentiated or more interchangeable?
- What is the three-year total cost of ownership, including maintenance, infrastructure, and support?
- Is the feature’s core logic wrapped in an interface, so we can replace the implementation without rebuilding the feature?
- Does the ROI hold if our estimates are off by 50%?
The checklist is a forced pause to make sure thinking happened. The most important question on the list is the first one, because if the answer is “we don’t have evidence,” the rest of the list doesn’t matter.

Closing
At its core, economic distortion is a failure of business logic at the level of decisions. Software companies fall into the traps because the signals they respond to (competitor launches, free libraries, organizational pressure) aren’t the same as the signals that matter (customer demand, three-year cost, sustainable margin). Fixing it is mostly the work of telling the difference.
That responsibility falls to the CEO. CTOs, product managers, and engineering leads all have a stake, but the CEO is the one who carries the consequence. Building a process for separating demand from noise, and holding the line when the noise is loud, creates a company that stays profitable when the market turns. The market rewards demand-aligned work and punishes everything else, and the only question is whether the company feels it next quarter or three years from now.
References
- Clayton Christensen, “Know Your Customers’ ‘Jobs to Be Done’”, Harvard Business Review, September 2016. https://hbr.org/2016/09/know-your-customers-jobs-to-be-done
- Taylor Soper, “Qualtrics cuts 780 jobs, about 14% of workforce, citing complexity from rapid hiring”, GeekWire, October 4, 2023. https://www.geekwire.com/2023/qualtrics-cuts-780-jobs-about-14-of-workforce-citing-complexity-from-rapid-hiring/
- Sean McBride, “The RICE prioritization framework”, Intercom Blog, 2016 (updated 2018). https://www.intercom.com/blog/rice-simple-prioritization-for-product-managers/
← Previous: The Way Teams Talk Shapes the Software They Build
Up next in The Engineering Tax · Article 14
There Are No Natural Boundaries Waiting Inside Your Monolith
Fix the economic distortion and the system that produced it remains: a monolith with no natural seams. The next article shows that the boundary you're hunting doesn't exist in the code; it lives in the product, the customer, and the evolving margin of each component. Learning to read those signals before the coordination cost eats your margins is the skill that lets founders keep their architecture from holding them back.
Coming soon
Frequently asked questions
What Is the Commoditization Trap
What is the commoditization trap?
The commoditization trap is building features because competitors have them, not because customers will pay for them. The company competes on the offer (what is visible in the market) instead of on demand (what people actually buy). Over time the product becomes a slightly worse copy of everyone else, margins shrink, and the only thing left to compete on is price.
How do you stop competing on the offer instead of demand?
Pause any feature that takes more than a day of work and run a blunt peer review. Are we adding this because customers demand it, or because competitors have it? Does it make us more differentiated, or more interchangeable? What is the three-year cost including development, maintenance, infrastructure, and support? The pause is the point. Skipping those questions is how the trap reopens every quarter.
How to Prevent Scope Creep
How to Prevent Scope Creep
Most features that get added to a project were never validated by customer demand. Use a three-stage filter. Stage 1: behavioral evidence. Track what users actually do, not what they say they want. Require five to ten customer conversations before any feature is approved. Stage 2: RICE scoring.
What else should leaders know about How to Prevent Scope Creep?
Reach times Impact times Confidence divided by Effort. If the score doesn't clear your threshold, the feature waits. Stage 3: TCO analysis. Feature development costs $25K to $75K. Annual maintenance runs 20 to 40 percent of that. If the feature can't show positive ROI over three years, it's scope creep, by definition.
What Is Dependency Hell and How to Escape It
What Is Dependency Hell and How to Escape It
Dependency hell happens when the libraries you depend on require more effort to maintain than the code they replace. Every update breaks something. Every version bump cascades through the dependency tree. Research shows external dependencies consume 20 to 40 percent of annual maintenance budgets. The fix is the Dependency Mirage framework.
What else should leaders know about What Is Dependency Hell and How to Escape It?
Audit each dependency on five signals: maintenance frequency, community health, license stability, business criticality, and integration depth. For high-risk dependencies, create well-defined interfaces that make replacement straightforward. After product-market fit, depending on external libraries for core functionality is reckless. Thousands of GitHub stars don't guarantee continuity.
Newsletter
Be the first to get next articles in this series.