Ubin.io All Articles
Engineering Culture

Who Said You Could Access That? The Quiet Productivity Killer Living Inside Your Permission System

By Ubin.io Engineering Culture
Who Said You Could Access That? The Quiet Productivity Killer Living Inside Your Permission System

Somewhere in your organization right now, a developer is waiting on a Slack message. Not for a code review. Not for a product decision. They're waiting for someone in IT — or maybe a team lead, or maybe a VP who's currently in a meeting — to click "approve" on an access request so they can look at a log file, connect to a staging database, or pull a config from a secrets manager.

This is permissions debt. And unlike technical debt, it doesn't show up in your backlog.

The Accumulation Nobody Notices

Access control systems don't get messy overnight. They get messy the same way your garage does — slowly, incrementally, with each addition feeling completely reasonable at the time.

Someone needs temporary read access to a production bucket. Fine. A contractor joins for six weeks and gets provisioned with a custom role. Sure. A team restructures, roles get copied instead of redesigned, and now you have four versions of "senior engineer" with subtly different permissions across three environments. Each of these decisions made sense in context. Together, they create a system that nobody fully understands — including the people who built it.

The result isn't just administrative chaos. It's friction that compounds daily across your entire engineering organization.

The Real Cost of the Waiting Game

Here's a scenario most US engineering teams will recognize. A developer is debugging a production incident at 11 PM. They need access to a specific CloudWatch log group to trace the error. They don't have it. Their team lead doesn't have it either. The person who does have it is offline. So they either escalate through an on-call chain that takes forty minutes to resolve, or they work around the problem with incomplete information.

Both outcomes are bad. One burns time. The other burns trust in the system.

Now multiply that by how many times a week your team hits access walls. Multiply it by your average engineering hourly rate. That number — the real cost of your permission system — probably doesn't live anywhere in your engineering metrics dashboard. But it's real, and it's significant.

Research from development productivity consultancies has consistently shown that context switching and waiting states are among the top drains on individual developer output. Access friction is one of the most common — and most overlooked — sources of both.

When "Security-First" Becomes Security Theater

Here's the uncomfortable part of this conversation: a lot of organizations treat restrictive permissions as a proxy for good security posture. The logic sounds reasonable. Least-privilege access is a legitimate security principle. If developers can't touch something, they can't break it or leak it.

But there's a difference between principled least-privilege and reflexive denial. When access controls are designed around fear rather than threat modeling, you end up with systems where developers can't read their own application's logs, where rotating a secret requires a ticket and a 48-hour SLA, and where the only way to debug a problem is to ask someone else to debug it for you.

None of that makes your infrastructure more secure. It just makes your developers less effective — and, ironically, more likely to find workarounds that introduce actual risk. Shared credentials, copied environment files, local copies of secrets that were never supposed to leave the vault. The workarounds to overly restrictive systems are almost always less secure than the access would have been.

The Role Definition Problem

A lot of permissions debt lives inside role definitions that were written years ago and never revisited. The roles made sense when the team was ten people and the stack was simpler. Now the team is sixty people across five product areas, the stack has grown by several orders of complexity, and those same roles are still being assigned — sometimes by people who aren't entirely sure what they grant.

This creates two failure modes that coexist uncomfortably.

The first is over-restriction: roles that don't include access a developer legitimately needs, forcing constant exception requests and one-off grants that pile up over time.

The second is over-permissioning: roles that were once scoped correctly but now, after years of additions, grant access to systems the current holder has no business touching. Both problems live in the same system. Neither gets fixed because fixing them requires auditing something that nobody owns.

What a Better System Actually Looks Like

Solving permissions debt isn't about opening the floodgates. It's about replacing a reactive, fear-based model with a deliberate, maintained one.

Start with access audits that have teeth. Most organizations run access reviews as a compliance checkbox — a spreadsheet exercise that results in no meaningful changes. A real audit identifies roles that haven't been touched in six months, permissions that no active user actually needs, and exception grants that were supposed to be temporary but never expired.

Then redesign roles around actual workflows, not org chart titles. A developer working on your payments service has different access needs than one working on your marketing analytics pipeline. Generic roles that try to cover both usually end up either too broad or too narrow for either use case.

Invest in self-service where the risk profile allows it. Not every access request needs human approval. Read access to non-sensitive logs, temporary environment access with automatic expiration, developer-level access to staging resources — a lot of this can be automated in ways that preserve auditability without creating bottlenecks.

And critically: make access requests fast when they do require approval. If your approval SLA is measured in days, you've already lost. Engineers will route around the system.

The Ownership Gap

One reason permissions debt persists is that it falls between organizational chairs. Security teams care about access controls from a compliance and risk perspective. Engineering leadership cares about developer velocity. IT ops cares about provisioning and deprovisioning. Nobody has a clear mandate to sit at the intersection of all three and optimize for the right outcome.

This is where engineering culture comes in. Teams that treat developer experience as a first-class concern — not just a nice-to-have — tend to surface access friction early and fix it before it calcifies. They treat a developer waiting on an access request the same way they'd treat a flaky test or a slow build: as a problem worth solving, not a cost worth absorbing.

Stop Treating Access Like a Liability

The default posture in a lot of organizations is to treat developer access as something to be minimized and controlled. Every request is a potential risk. Every permission is a liability.

Flip that frame. Access, when it's well-designed and well-maintained, is an asset. It's what lets your team move fast, debug effectively, and build without hitting invisible walls every other hour.

Your permission system should be as thoughtfully engineered as the rest of your infrastructure. If it's not, you're carrying debt — and your developers are paying the interest every single day.