Avoiding Becoming a Bottleneck
← Part 9
Adoption Metrics
There is a specific failure mode in platform engineering that is frustrating because it is predictable: the team that set out to accelerate product delivery ends up slowing it down. The ticket queue grows. Product engineers complain that getting a new environment takes longer than it did before the platform team existed. The platform team, buried in requests, doesn't have the capacity to build the self-service features that would empty the queue.
This is the bottleneck trap, and it's endemic to platform teams that don't actively manage it.
How Platform Teams Become Bottlenecks
The trap has a consistent anatomy:
The cycle is self-reinforcing. Each step feels reasonable in isolation. Together they create a team that's simultaneously overworked and failing its mission.
Failure Mode 1: Being a Ticketing System
The first warning sign: product teams submit requests and wait. Even if the turnaround is 24 hours, you've inserted a synchronous dependency into their workflow. Multiply that by the number of requests per sprint and you've added days of wait time to every team's cycle time.
The diagnostic question: "Can a product team go from idea to infrastructure running in production without talking to anyone on the platform team?" If the answer is no, you're a ticketing system.
The fix is not to be faster at processing tickets. It's to build the self-service path so the ticket is never needed.
Failure Mode 2: Owning Operations Instead of the Platform
The platform team that fields on-call alerts for services they don't own, manages infra for teams that could manage it themselves, and answers Slack questions that a well-written runbook would answer — that team has confused "helping" with "doing."
Helping teams by doing their work for them creates dependence. Helping them by building self-service tools and documentation creates capability.
Practical test: pick any operational task your team performs that isn't about the platform itself. Ask "could a product team do this with the right tool or runbook?" If yes, build the tool or write the runbook and stop doing the task. Track how many hours per week your team spends on operational tasks that belong to product teams. That number should trend toward zero.
# Weekly time tracking audit (team lead reviews this)
team_time_log = {
"platform_development": 0.45, # 45% - good
"platform_operations": 0.20, # 20% - expected
"product_team_support": 0.25, # 25% - too high, what specifically?
"on_call_product_services": 0.10 # 10% - this should be zero
}
def audit_drift(log: dict, thresholds: dict) -> list[str]:
warnings = []
for category, actual in log.items():
if category in thresholds and actual > thresholds[category]:
warnings.append(
f"{category}: {actual:.0%} (threshold: {thresholds[category]:.0%})"
)
return warnings
thresholds = {
"product_team_support": 0.15,
"on_call_product_services": 0.05,
}
print(audit_drift(team_time_log, thresholds))Failure Mode 3: Centralising Decisions
The platform team that requires approval before a product team can use a new language, framework, database, or cloud service has recreated the enterprise architecture review board. This was the process everyone was trying to escape.
Decisions that should be centralised: security controls, cost controls, compliance requirements, cross-cutting standards.
Decisions that should not be centralised: which framework to use for a new service, whether to use Redis or Memcached for caching, how to structure internal domain logic.
The test: when a product team wants to do something new, is the platform team's role to approve it or to help them do it safely? Approval gates that the platform team owns are bottlenecks. Safety guides that the platform team provides are enablers.
Failure Mode 4: The Black Hole Roadmap
Platform teams that have long-running projects with no visible progress and no intermediate deliverables create frustration and political exposure. "We're building the new deployment system" is not reassuring to a product team waiting six months for it.
Work in thin vertical slices. Ship something usable every two weeks, even if it only covers 30% of the use cases. The 30% that's complete is better than 100% that's pending.
With thin slices, Go teams are shipping through the new system on day 15. With the big bang, everyone waits until April, and the April date will slip.
Failure Mode 5: Ignoring User Research
Platform teams that build based on intuition rather than observation drift away from what product teams actually need. The platform gets features that are technically elegant and practically unused.
Spend time embedding with product teams. Not listening to what they say they need (people are notoriously bad at articulating requirements), but watching what they do. Where do they struggle? Where do they work around the platform? Where do they copy-paste from the wiki instead of using the tool?
Do this formally, at least once a quarter. A rotating "embedded week" where a platform engineer sits with a product team and pairs on their work is more valuable than any survey.
Failure Mode 6: Measuring Outputs, Not Outcomes
This connects to the previous post, but it's worth repeating in the context of bottlenecks specifically: a platform team that measures its success by tickets closed, features shipped, and migrations completed can be objectively busy while making no positive difference to product team velocity.
Ask the product teams directly, quarterly, in a structured way:
- What has the platform team made easier in the last quarter?
- What is still unnecessarily hard?
- Where did you have to wait for the platform team when you shouldn't have?
The answers to question 3 are your bottleneck map. Treat them as a backlog.
What Healthy Looks Like
A healthy platform team is invisible to product teams most of the time. When a product engineer creates a new service, things just work. When they need a database, they run Terraform. When a deployment fails, the observability is already there. The platform team shows up when the product team's requirements push beyond the golden path, or when something on the platform breaks.
The goal is to be noticed only when you ship improvements. Not when you're blocking.
Key Takeaways
- The bottleneck trap is self-reinforcing: ticket queues crowd out self-service development, which grows ticket queues further — the only exit is building self-service fast enough to drain the queue.
- The diagnostic: can a product team get from idea to production infrastructure without talking to the platform team? If not, you're a ticketing system regardless of how fast you process tickets.
- Platform teams that do operational work for product teams create dependence; the alternative is building tools and runbooks so product teams can do it themselves.
- Centralising decisions (framework choices, library choices, internal architecture) recreates the architecture review board — reserve approval gates for security, compliance, and cost controls only.
- Work in thin vertical slices, shipping usable functionality every two weeks; a big-bang platform rewrite that lands six months late helps nobody.
- The strongest signal that you're becoming a bottleneck is the answer to "where did you have to wait for the platform team when you shouldn't have?" — run this survey quarterly and treat the answers as a backlog.
← Part 9
Adoption Metrics