Tommy

The Dependency Map · Episode 50

Tech Stack As System Fragility

2,007 words

Tommy the Hamburger is charting the Dependency Map. This is where I take the ordinary shit people trust without thinking and trace every fucking hidden line holding it up. I'm going to show you exactly which upstream motherfuckers, systems, and failure points decide whether your life keeps working or not. Nothing is standalone, nothing is self sustaining, and the moment you see the chain clearly, is the moment the comfort hidden right the fuck in front of your face starts rotting off. People talk about a tech stack like it is a menu choice. Frontend framework, backend language, database, cloud provider, done. A nice clean pile of tools. That makes it sound way more orderly than it really is. A tech stack is not just a set of technologies. It is a layered dependency tower where each piece is borrowing stability from the pieces below it while also inheriting constraints, vulnerabilities, update cycles, and maintenance moods from everywhere around it. That is the dependency here: the tech stack as a borrowed stability structure that looks solid until one layer starts rotting and the rest of the service realizes how much it was leaning on it. What people think a stack provides is capability. Faster shipping. developer velocity. ecosystem leverage. hiring clarity. sensible defaults. What it often really provides is entanglement. The app is built on a framework. The framework depends on packages. The packages depend on transitive packages. The runtime depends on a version line. The deployment depends on an operating system image. The hosting depends on cloud assumptions. The security posture depends on update discipline. The whole thing depends on humans still being able to understand the pile six months after launch and three years after the hype cycle that sold it. So trace it cleanly. The service does not run on its own code alone. It runs on a framework. The framework runs inside a runtime. The runtime depends on libraries, package management, and operating system compatibility. The deployment depends on build tooling, hosting assumptions, and infrastructure support. The team depends on documentation, maintainer activity, hiring markets, and upgrade paths. A change or failure in any layer can force work all the way upward. And because each layer feels abstracted away while it is behaving, teams routinely forget how much of their product is standing on borrowed ground. Failure point one is dependency sprawl. Modern stacks almost never consist of just the named tools on the architecture diagram. They consist of those tools plus a whole basement full of indirect baggage. A handful of direct packages quietly pull in hundreds more. Build tools bring plugins. frameworks bring conventions. ORMs bring migration logic. auth systems bring adapters. observability brings agents and exporters. Before long you are not running "a web app." You are running a small civilization of assumptions maintained by strangers and stitched together by your deployment pipeline. Failure point two is version fracture. A stack can be functional and still be unstable because its pieces want different futures. The framework wants a newer runtime. The package you need has not been updated. The cloud image is deprecating an old OS. The driver only works on one version line. The browser support matrix gets uglier. The CI image changed. The library maintainer disappeared. Nothing is fully broken yet, but every upgrade becomes a fucking hostage negotiation between layers that no longer want to age together. Failure point three is maintainer disappearance. People love open source right up until some critical dependency turns out to be held together by one exhausted bastard maintaining it at midnight after their real job. That is not a moral failing. It is reality. But it means pieces of the modern stack can become strategically important long before they become sustainably maintained. If the maintainer burns out, walks away, or simply stops caring, your business may discover it built real revenue on top of volunteer stamina. Failure point four is security drag. The older and more tangled the stack gets, the harder it becomes to patch cleanly. A vulnerability shows up in something obscure, but updating it forces a framework jump, which forces code changes, which forces retesting, which forces coordination across teams that are already overloaded. So the patch gets delayed. Then delayed again. That is how technical fragility stops being abstract engineering discomfort and turns into live exposure with customer data sitting right in the blast radius. Failure point five is talent mismatch. Stacks do not just depend on software. They depend on people willing and able to work in them. If your stack drifts into a weird dead zone, you get trapped between old enough to be unattractive and important enough to be expensive. New hires do not want it. Senior people who can handle it cost more. Existing staff get tired of babysitting it. Now the system is not merely technically fragile. It is labor market fragile too. Failure point six is tooling lock. The deeper the stack settles, the more invisible habits form around it. Deployment scripts assume certain directories. Monitoring assumes certain log formats. tests assume framework behavior. build caches assume a toolchain. Infra modules assume one cloud. The team starts calling the stack "standard" when what they really mean is "we have built our whole shop around this pile and changing it would hurt like hell." That is not standardization. That is domesticated lock in. Failure point seven is migration fantasy. Everybody knows stacks age. Everybody talks about paying down debt, modernizing, refactoring, rebuilding, or gradually extracting services. Then reality shows up with deadlines, support load, product pressure, compliance work, and the fact that rewriting a functioning service is expensive, risky, and hard to celebrate on a quarterly dashboard. So the old stack keeps breathing through a combination of caution, denial, patchwork, and one or two deeply tired engineers who know where the bodies are buried. That is why the dependency feels so sneaky. A stack often works well enough for a long time. It ships value. It serves users. It supports revenue. The team stops experiencing it as a dependency and starts experiencing it as the ground itself. But the ground is made of layered software decisions with expiration dates, labor assumptions, security obligations, and ecosystem politics welded into them. You can see it in ordinary software life. The team cannot upgrade one package because it breaks the framework. They cannot upgrade the framework because it breaks the authentication flow. They cannot swap the auth layer because too many customer accounts depend on that shape. They cannot move hosting cleanly because the deployment stack assumes a bunch of provider specific behavior. They cannot hire fast because the codebase is old, weird, or unfashionable. They cannot stop shipping features long enough to modernize because the business is already committed to promises the old stack is still barely holding together. That is how the stack becomes a pressure vessel. Every quick fix increases coupling. Every delayed upgrade narrows options. Every workaround becomes policy. Every "temporary" script grows roots. Every key person who understands the weird parts becomes a single point of failure with a calendar. And because the system still mostly works, management keeps reading the survival as stability rather than as a warning shot. There is another ugly layer here: stack choices also shape what kinds of problems an organization thinks are normal. If the stack makes certain testing hard, the team silently accepts thinner testing. If deploys are scary, the culture gets conservative or sloppy in weird bursts. If the framework encourages magic and indirection, debugging gets theological. If the stack is noisy, brittle, or slow, engineers spend more time appeasing the machinery and less time understanding user problems. The technology does not just host the product. It trains the organization's habits. Do not miss the systems above this. Investors reward speed over maintainability. Product roadmaps reward visible features over invisible resilience. Hiring markets reward whatever stack is fashionable this quarter. Vendor ecosystems reward deeper adoption. Open source ecosystems reward velocity until maintainers burn out. Cloud platforms reward using their managed conveniences until leaving them becomes surgery. All of that pushes teams to build on moving ground and then pretend the ground is bedrock. This is why stack discourse gets dumb fast. One camp says just choose boring technology and you are safe, as if mature tools cannot still rot, fragment, or become labor traps. Another camp says stay on the cutting edge or die, as if novelty were some kind of free immunity against fragility. The real issue is not boring versus shiny. The real issue is whether the organization understands the upkeep burden, migration cost, labor dependency, and ecosystem volatility hiding inside whatever stack it picked. The practical questions are sharp. How many layers does your service depend on before your own code even starts running? Which parts of the stack are one maintainer, one version line, or one vendor decision away from pain? What upgrades have been postponed so long they now look like mini disasters? How much of your deployment, security posture, and hiring strategy assumes the current stack stays viable? If a critical piece got abandoned tomorrow, would you have a path or just a panic attack? If those answers are ugly, then the problem is not just architecture. It is stack dependence. That means the posture here is deliberate stack sobriety. Know your critical dependencies. Keep the dependency tree visible instead of mystical. Budget for upgrades before they become emergency rewrites. Prefer tools with understandable failure modes over tools that feel magical until they betray you. Reduce coupling where you can. Document the ugly parts before the one engineer who understands them gets a better offer and walks. Do not treat "currently running" as proof that the foundation is healthy. And if leadership says the stack is just an engineering concern, ask them what happens to revenue, hiring, security, and delivery speed if one core layer becomes unsupported, unpatchable, or impossible to staff next year. Because that answer tells you whether the company owns its system or is just camping on top of a temporary software coalition. There is a final cruelty here. When stack fragility starts hurting, the pain usually arrives first at the human edges. Engineers lose nights and weekends to migrations nobody planned for. Security teams inherit old debt with impossible timelines. Support absorbs the weird failures users can see even though the root cause is buried five layers down. Product gets less predictable. Recruiting gets harder. Nobody outside the technical layer sees the full shape of the problem until the stack is already taxing the entire organization for the privilege of remaining alive. Fuck me sideways, half the stack pain in modern companies is just deferred replacement pretending it is architecture. And when the chain really snaps, it rarely looks cinematic. The site still kind of works. The deploy takes forever. The vulnerability stays open. The build turns flaky. The feature slows down. The incidents multiply. The team starts speaking in workaround dialect. Then one day the organization realizes it is no longer building on a platform. It is performing ongoing emergency medicine on a pile of coupled software that used to be a platform. That is the hard landing. A tech stack is not just a toolkit. It is a layered dependency structure where your product, your people, your security, your hiring, and your delivery cadence all sit on top of borrowed stability from frameworks, runtimes, packages, vendors, and maintainers you do not control. When the chain holds, people call it leverage, developer velocity, and modern architecture. When it breaks, they call it technical debt, migration pain, staffing problems, security exposure, or legacy drag, even when what really failed was the decision to mistake a stack of temporary agreements for permanent ground in the first fucking place. That's the Dependency Map. Every convenience is sitting on top of a stack of other things staying stable, and once you see the chain, you stop calling it normal and start calling it fucking fragile.