Building a Platform Is a Balancing Act
Two Kinds of Dead Platforms
The first kind of dead platform is the one that said yes too often. Every team got their special flag, their bespoke deployment path, their one-off integration. From the outside it looks like a platform. From the inside it’s twelve platforms duct-taped together, each maintained by someone who left two years ago. Changes take weeks because every change risks breaking someone’s snowflake.
The second kind of dead platform is the one that said no too often. It had a clean abstraction, a beautiful API, and exactly three users — because every other team found it faster to build their own thing than to wait six months for a feature request to land. The platform team is still shipping. Nobody’s using it.
Both failures start with the same moment: a team shows up with a request that doesn’t fit. What you do next is the whole job.
The Pull Toward Yes
Saying yes feels good. It makes a user happy today. It proves the platform is “flexible.” It avoids the awkward conversation where you explain why their very reasonable-sounding request is actually going to cost you six months of maintenance burden.
But every yes is a promise. Not just to ship the feature — to support it, document it, migrate it, and keep it working when the next version ships. A platform with a hundred features has a hundred promises. Most of them will outlive the person who made them.
The teams asking for custom behavior aren’t wrong to ask. They have real problems. The mistake is treating every real problem as something the platform must solve in the shape the user proposed.
The Pull Toward No
Saying no feels principled. It protects the abstraction. It keeps the surface area small. It lets the platform team sleep at night.
But a platform that only solves the problems its designers anticipated isn’t a platform — it’s a framework for the problems that already existed when it was built. Real users have real needs that weren’t in the original design doc. Refusing to evolve is just a slower way of dying.
“No” is also expensive in a way that doesn’t show up on the platform team’s dashboard. It shows up as shadow infrastructure, forked repos, and the quiet realization that half the company has stopped using you.
Snowflakes Aren’t Snowflakes
Here’s the pattern I’ve seen over and over: the “unique” request isn’t unique. The team asking for a custom retry policy is the third team this quarter to ask for one — they just phrased it differently. The team that needs a special deployment hook has a problem that’s one config flag away from the team that asked last month.
Snowflakes feel unique to the person holding them. From the platform’s vantage point, they almost always cluster. Two requests are a coincidence. Three requests are a feature. Five requests are a design flaw you haven’t fixed yet.
This is the same Rule of Three that keeps you from over-engineering on day one. It also keeps you from under-engineering on day three hundred. The first request is a conversation. The second is a pattern forming. The third is a signal that the platform is missing something real.
The Real Job: Finding the Pattern
The job isn’t saying yes or no. The job is translation.
When a team shows up with a custom request, the first question isn’t “should we build this?” It’s “what’s the general shape of this problem, and how many other teams have it?” The answer determines the response:
- Truly one-off: Help them solve it outside the platform. Not every problem belongs to you.
- One of a few: Say no for now, but track it. Two more and you have a pattern.
- Recurring: Build it into the platform properly. Not as a flag for this team, but as a first-class capability everyone can use.
The worst answer is the middle path that looks like a compromise: a special flag, a hidden config, a “temporary” exception that becomes permanent. That’s how platforms accumulate the snowflakes that kill them.
Abstractions Earn Their Keep
Good platform abstractions don’t come from whiteboard sessions. They come from watching three teams solve the same problem three different ways and extracting what’s common. You can’t design that upfront — you have to earn it through contact with real users.
Which means the platform team’s instinct to protect the abstraction is right and wrong. Right, because abstractions are load-bearing. Wrong, because abstractions that never evolve become museums. The abstraction you shipped last year was based on the problems you understood last year. The problems got more interesting. The abstraction should too.
Yes, No, and Not Yet
The most useful word in a platform team’s vocabulary isn’t yes or no. It’s not yet.
“Not yet” says: I see your problem, I believe it’s real, and I’m going to wait until I see it from enough angles to build the right thing instead of the fast thing. It’s harder than yes. It’s more honest than no. And it’s the only answer that scales.
Platforms die when teams stop being willing to say any of the three. Yes-only platforms collapse under their own weight. No-only platforms get abandoned. Not-yet-only platforms become irrelevant. The balancing act is knowing which answer this request — and this moment — calls for.
The platform that lasts is the one where every yes was earned, every no was explained, and every not-yet eventually turned into one or the other.