As someone who used to be part of a platform team, and is now actively working in the same organization to fight the creation of any more platform teams, I very much disagree with the article that this is a good working model.
What we have found is that platform teams are a huge point of frustration for product teams, since they cause unnecessary and unmanageable coupling between different business divisions, leading to impossible to balance priorities. What we've seen happen over and over is that product A needs Feature A, and product B needs Feature B, and they both need it tomorrow, and the platform team only has resources for one. And since Product A and Product B are in different business divisions, you end up needing to involve a senior VP or even an officer to make a prioritization decision for a simple software feature, and everyone gets frustrated by the process.
What we're striving towards instead is an "inner source" model, where a platform is collaboratively developped and maintained by multiple product teams. Each product team is then empowered to build new features as needed into the platform, and others can reuse them.
Of course, the platform needs some architects and overall review, and all teams will not equally participate. But the key point is to encourage this collaboration mode, where no one team is a bottleneck for multiple products.
The inspiration for this structure is obviously the open-source world, where multiple corporations and foundations collaborate on a single code base without needing to rely on a single platform vendor to provide features for them.
> What we're striving towards instead is an "inner source" model, where a platform is collaboratively developped and maintained by multiple product teams. Each product team is then empowered to build new features as needed into the platform, and others can reuse them.
I have seen this fail (once myself and once through coworker experiences) as well, IMO the best approach is to have as little shared infrastructure between teams as possible even if it means more work in the end
IMO the best approach is to have as little shared infrastructure between teams as possible even if it means more work in the end
That's the route to shipping features faster for sure, but it costs more, requires duplication of effort, and is really painful when you discover two teams built the same thing and you want to unify on one version rather than paying to run and maintain both. Plus, when the cost cutting comes in the bad times, you find whole teams are axed because you don't need two sets of people doing the same job. The remaining engineers then have to unify the features but without the resources to get the work done and without access to the institutional knowledge required to understand the version they didn't build themselves.
If you're an engineer in a FAANG it's not a bad solution to the shipping issue. If you're anywhere else it's a road to absolute chaos.
You do bring good points, I was a bit too forceful with the language in my original message. "Most of the time" was probably better language to use.
In my experience shared infrastructure is less prone to breakage on reorgs because "platform" teams usually get the axe first as they are not directly delivering value (from upper management perspective at least)
IMO each team should maintain their own infra and tools and be free to choose what works best for them within reason, a few exceptions need to be made of course like having unified authorization and the like, infosec is usually better to be a separate team consulting to individual product teams, etc
Only speaking as a FAANG engineer, but it's absolutely essential to shipping anything as a vertical team. If you depend on updates to any platform that isn't federated to enable your own siloed development: good luck.
This sounds like fundamentally a business problem (we have finite resource, is product A or B our priority?) and trying to solve it with choices in the technology division. Well, here be dragons.
Based on my experiences, the idea that a genuine bottleneck in tech is being made visible to customer division management and senior management, is generally an authentic way to ensure realism creeps back into the prioritisation and funding processes.
A platform team might have a very unevenly distributed workload. Some weeks nothing has to be done on the platform, everything works fine. Then all of a sudden 2 teams request some extra features. How many people do you put in the platform team?
Either you put too many in there, and they are basically idle the time in between. Or you put a limited team, and once even a single team requests something they will have to wait for the developments, let alone 2 requests at the same time.
The OP describes an excellent solution: the team that needs the feature, pays for it in man-hours. In fact, those developers that need it, are pretty familiar with using it, so most of the time capable of doing some developments on it. They can also schedule in the work in their project. The teams that will need it afterwards will get it for free.
>> A platform team might have a very unevenly distributed workload.
But When would this hypothetical occur? If the platform is new-ish, there’s always going to be more work to be done than there are people to do it so there’s no variation in workload - there’s just lots to be done.
When the platform is established and operating in self-service mode, so think Amazon S3, were in a mode where we’re really not expecting features to be added, more about bugfixes and operational capacity at that point.
>> the team that needs the feature, pays for it in man-hours
there’s no free lunch. These developers don’t really care about the platform, they have bigger fish to fry. You need to ensure that infra doesn’t become a tragedy of the commons.
Let's say you offer a custom built UX design system with components. Most of it is written. At some point, you need a big component that doesn't exist yet, but other teams could benefit from that.
This is such a situation, and it happens all the time in internal products.
Either you over invest, you under invest, or the solution proposed here: jit developments where you can allocate resources as you need them.
> These developers don’t really care about the platform
They care as much as it helps them. The overall vision is steered by the architect responible for that internal product/platform, as said by OP.
>> jit developments where you can allocate resources as you need them
Again there’s just no free lunch here, you’ve got a generalist writing a specialist component.
In your example, how confident are you that the full stack product team developer is acutely aware of, i don’t know , let’s say accessibility practices or
maybe performance tradeoffs for constructing this component?
The specialist in the platform team member knows this intimately, it’s their specialism.
Sure, it's fundamentally a business problem. But it's very hard to do product planning when you need to take into account global priorities for the platform team. Plus, you need to spend time to even estimate the cost of Feature A and Feature B, so you actually end up with several rounds of discussions where you first prioritise spending time on the estimation, then the feature itself etc. Not to mention, if this is a deep platform feature, it's probably only a prerequisite for an actual customer facing-feature that requires additional work, which gets delayed by all the estimation work and so on.
Additionally, this overall means that no one can plan in advance any features that depend on the platform, since global business priorities are constantly shifting.
Not to mention the political angle, where more adept business leaders can always push through their pet platform features to the detriment of what are more obvious business goals. Or at least, it will always seem this way to teams whose requirements keep falling through the cracks.
If product A is my breadwinner, i might not even need product B to estimate workload impacts for their feature request because my business strategy might be such that i’ll be allocating the resources based on business priority of product A.
Trying to second guess this by making tech a black hole with no levers to pull by the business is fundamentally unsound.
>> where more adept business leaders can always push through their … Or at least, it will always seem this way
I mean i think you’re calling out the solution with the problem. Just strive to be a better operator, level up to their ability. Exceedingly hard to do but overall win for everyone.
If you're the person in charge of planning product A's road map, you do need to take into account platform schedules, and those do depend on every other product that uses the platform.
And of course the choice is sometimes simple, but it's often not. It's often the case that both Product A and Product B are breadwinners. One might need a feature that can bring $1M in revenue, and take between 3-4 months, and another might have a feature that should bring in $200k in revenue, but take 0.5-1 month. Which do you prioritize? What if both must be done by some date, but for one there is a chance to push a customer to accept a later date, but it's not sure yet? What happens when it later turns out that the estimation was overly optimistic and it will take twice as long?
> Just strive to be a better operator, level up to their ability. Exceedingly hard to do but overall win for everyone.
Politics in an org is a 0-sum game. If I win, someone else loses, and then their team is going to be the one that feels frustrated, and we're back to square one.
This is good insight and matches with my experience. As a product-focused engineer/manager, it’s too often I’ve found my teams giving up and taking into our own hands what “should be” owned by platform teams, while they work on things nobody seems to see value in.
> What we're striving towards instead is an "inner source" model, where a platform is collaboratively developped and maintained by multiple product teams.
If a platform has shared ownership, then decisions will get implemented by cohorts only thinking for themselves and thus damaging the long-term roadmap. All systems, especially complex ones, need sole owners or they will devolve into what is essentially a pyramid of doom at the product level.
Those "long-term roadmaps" are, in my experience, created by self-important architects who are far removed from the realities and needs of everyday developers. Full of lofty ideals, grandiose abstractions, and "silver-bullet-itis".
Good communication across teams and good design (i.e. flexible, maintainable, extensible) tends to alleviate the tunnel vision associated with each team building what works for them.
You can still have code/design reviews by other stakeholders. It just means that if something is really high priority for you but not for them you can just do it yourself.
I've had to wait weeks for one-line changes because somebody else had to do them.
> What we've seen happen over and over is that product A needs Feature A, and product B needs Feature B, and they both need it tomorrow, and the platform team only has resources for one. And since Product A and Product B are in different business divisions
That seems like an unnecessary coupling between different products.
I understand this concept of a platform team mainly within one (larger) product. But maybe it's the same thing, just on a different scale.
> What we're striving towards instead is an "inner source" model, where a platform is collaboratively developped and maintained by multiple product teams. Each product team is then empowered to build new features as needed into the platform, and others can reuse them.
I think it breaks down at a certain point of complexity. The platform itself is complex enough that it's very difficult for product teams to understand it holistically. I've seen this multiple times when the product teams were still able to make the changes as needed, but over the long term this approach created a hot mess of platform features which didn't align to each other and no single person understood.
Sounds like you were working at a terrible organisation, not that there is anything wrong with running a platform team. Teams with stressful deadlines, having to involve VIPs or architects at the org to make decisions rather than giving teams autonomy to make their own decisions.
Not sure I'd like to use a platform with a code base that has the whole organisation contributing to it. Sounds like a design-by-committee dumpster fire. Teams need ownership of their product to perform effectively. You can claim that this is collective ownership of the platform, but in reality no one will feel any responsibility for the platform when things don't work or don't align entirely with the particular thing they are currently working on.
And have you ever looked at the source code for most open source software? It's an absolute mess that requires the collective effort of large numbers of people to keep it going. It works, but it's not exactly a good or effective model for internal software.
I don't think the org is/was dysfunctional. Tight deadlines are a reality of certain business sectors, especially when selling big expensive B2B software, where you have to sell something in your customers' budget windows or lose the opportunity. And I don't see how a platform team could be empowered to decide on its own which of two competing business goals, from two separate business groups, to pursue, and which to postpone for months.
Related to collective dev/ownership, that is a risk, I absolutely agree. That is going to be the hardest part for sure, maintaining a uniform standard and a high bar for contributions to a common platform.
Finally, I believe the general opinion is that open-source software is higher quality and especially has higher code quality than internal company software. I can't say I studied any directly comparable open-source projects VS our internal tools, but code quality definitely varies significantly between our own internal projects, with some extremely clean and well written, while others are messes of hasty bug fixes and accumulated tech debt.
What kind of services did you push to the platform team? If product teams need to wait for the platform team to deliver on some features then it doesn’t sound like a platform team.
A platform team is there to consolidate tooling and provide services that enable product teams to move faster.
Think of it as an internal AWS. In small companies AWS is the platform team. If you’re talking about an upstream service that your product team depends on, it’s just an internal product team that’s understaffed. Or poor organization if your product team’s domain has been split up into two teams arbitrarily based on e.g. managerial politics or front end/backend division.
The platform team was developing the core framework that a few applications ran on. At one point this was either a C#-based GUI framework for Windows apps, extending WinForms and later WPF with various business-area specific controls (e.g. network topologies, protocol stacks etc.) and various communication frameworks to talk to some shared embedded hardware or to do cross-product integrations. At other times it was a Java based web framework to help move these Windows apps to the cross-platform world of VM HTTP servers, handling things like authorization in a unified way, apart from some of the same concerns as the original C#.
The products using the shared frameworks had slightly different histories and were mostly addressed to different market segments with different conventions, but still neede plenty of common scaffolding that a platform provided. A common platform team seemed to be a natural fit, and to a great extent in worked, but the problems I was discussing earlier were also pretty constant throughout its lifetime.
I have seen platform teams work extremely well. I have also seen them fail spectacularly. The main reasons? The organization's ability to identify, or hire, the kind of developers that do great on platform teams. At the very least, the senior members need to have a mix of empathy and technical excellence that is often hard to find, and when you only have one of the two (or at worst, neither!), the platform fails to gain any traction, or is mandated, and ends up being a noose to productivity instead of a boon.
Sometimes the platform team is staffed by people that have been there forever, as a sort of semi-promotion. But when they know everything, it's easy to have little interest in the difficulties of learning internal concepts: After all, the learning has already been done. This makes the tools be technically capable, and intractable. Other times, the team is easy to get along with, but what they deliver isn't very good at all, and the lack of quality is papered with social skills.
You need people capable of understanding the problem other teams have, and their architectural constraints, and deliver something that will save them time, and they'll prefer to use over some open sourced hodgepodge. They need to think of upgrade paths, or live in a low-repo environment where the platform team can upgrade things for everyone. The customer service attitude should be immaculate, as to make people be happy to ask for help, yet be so good at documentation, or at simple enough architecture, as to make that customer service load be light. Many places can't hire people that meet those kinds of profiles at all, as someone like that will basically excel in most roles in most companies. So yes, you end up with the technically capable, yet gruff guys that nobody wants to talk to: The equivalent of Seinfeld's Soup Nazi... and that's if at least they are very good.
Most team topologies will work if your company is full of empathetic heroes though, so platform teams might not even be needed if you really are that good at hiring.
I think a critical component of making platform teams work is to allow internal competition between the platform team and the stream-aligned team using some other technology. In this way the platform team is a stream-aligned team whose customers are internal, and they have to win or lose within their market (internal teams). For example, a stream-aligned team can either use platform team CI/CD or github actions.
What I've seen is that platform teams work well in either small scale (because focus is clear to all) and large scale (because of this internal competitive dynamic) but are extremely hard to execute between the two.
Sure, there are different ways of building platforms, and some leave the end-users with fewer options than others. But ultimately, if you have a separation between platform and product teams, the product teams will depend on the platform team to provide a better fishing rod to catch a bigger fish, they aren't empowered to enhance their own rod. And if the product teams are empowered to modify the platform, then you're actually implementing another model than what the article and book seem to suggest.
> What we've seen happen over and over is that product A needs Feature A, and product B needs Feature B, and they both need it tomorrow, and the platform team only has resources for one.
Is this any different from a product team where there's competing demands between Customer A and Customer B?
In some ways, it's the same situation. However, the big difference is that I'm not a colleague to the customers waiting for this feature. If they get frustrated, (1) I don't get to see them at coffee time being frustrated with my team, and (2) they have a quick fix for their frustration: but from someone else. Internal customers don't typically have that luxury.
I recognise the friction points very well. It's very frustrating and limits product team velocity. That said, in my experience this is mainly due to a misinterpretation and mis-implementation of platform teams. Too often, platform teams are forced upon product teams. This misses an essential element of a platform, optionality. A platform should be a jumping board, that people can choose to accelerate development. When a platform is made mandatory it misses essential feedback mechanisms, such as rate of adoption, for it to steer in the right direction. While the rate of adoption is still often seen as a metric for a platform team's success, the mandate to enforce the platform onto product teams is fundamentally corrupting. In addition, the tools to truly accelerate development are not the same as time progresses. Without optionality, there is never the incentive to sunset anything the platform provides. Deviations of technology/pattern/solution use are often seen as negative aspects of the product team's performance, but rarely reflect back on the platform team's output.
TLDR; platform teams without product team's freedom to deviate (optionality) is corrupt and can destroy a large chunk of engineering velocity.
That is one important aspect, absolutely. But I don't think it's the main point. There are normally good reasons for which the platform itself is necessary and useful. Working around it, while a good option to have, is rarely ideal - or else you fall back to the model where every team invents and builds its own tools. Renouncing (or worse, forking) the whole platform because a feature can't be prioritized to be added to it is not exactly a great outcome.
If you fall into the case where every team is forced to work around the platform and create their own solution, the problem is not enforcement, it's offering. The thing that is offered is not working for the teams and there is a negative impact because of it. Teams building their own solutions, for a while, after which they are consolidated into a platform offering is a healthy cycle. What is IMO unhealthy is a dysfunctional platform where product people are forced to endure it. I'd much rather empower teams to take on their own impediments then to suck away their motivation by not letting them fix whatever is holding them back.
Sorry in advanced if I state this a little bluntly, but this rhetoric of teams going off and building the same tools all over the place is in my experience not a fault of any team, it's that of the context/organisation they operate in. Framing it as such is IMO destructive for company culture. As if product teams, left to their own, will just degrade into building sub-par platform-esk tools that ruin the org. I don't buy it. Trying to make one thing do two things (the single source of tech complexity) is a trap often catching platform engineers who try to tailor to an audience that is not unified in their needs, still platform teams are incentivised to create just that.
I think we are mostly in agreement - platforms are good, but they should be driven by product teams who see value in them and feel empowered to improve and maintain them when needed. Whether there is also a dedicated platform team or it is more of a group collaboration between product teams is ultimately a detail, as long as the product teams do participate in building and maintaining the platform.
I recognize this problem, although my experience was a lot worse. It seems to me that this one is very, very hard for many people to realize:
> Platform teams, however, need to build their services as products themselves, with a deep understanding of their customer's needs.
If there is no malfunction like a monopoly or a scam, as a customer I just choose a different product if one is not meeting my needs. The same must be true of a platform, and if it happens a lot that its customers are choosing something else then its time for some hard reflection. This is not just an ideal, but a hard requirement, and something that a lot of orgs just don't have.
So, what do I need as a developer? I can make excellent use of open source libraries within even a couple of minutes, but somehow for my enterprise platform I need to fire up a request and wait for weeks or months to even get to play with it. When I need a tiny little change I can't do anything myself, I need to request it and it is filed in the backlog. The same change, would I have composed it out of open source libraries or had cloud access myself, I could make in minutes. Now it takes days, weeks and I even experienced many months of waiting for a simple task I can do in 5 minutes. Thus, making use of the platform meant fighting for higher cloud privileges so we could do it ourselves and ship at least within a couple of month instead of a year, and dancing around bizarre compliance regulations, mostly in order to either evade or pleasing a chain of risk owners to satisfy audits required for certification. At some point we became almost incapable of shipping.
Not every platform team is as kafkaesque as this though, and it doesn't need to be.
We tried inner sourcing as well and it was quite hard honestly, because each team was just focused on their own goals and contributing to the shared platform or libraries was often an extra investment that defacto penalized their achievements - which _did_ have repercussions on their individual performance reviews. Furthermore, it was done in such an ad-hoc way that it was quite hard to get something sane off the ground. I think you do need a kind of dedicated ownership.
Best experience was in a team where we did everything ourselves and had the required expertise. Second-best was in really close collaboration with a platform team where we also had members going from one team to the other. But even that team failed to build the features we really needed as a product team.
Open source is a good model, and there is one essential thing that platform teams need to provide their users that open source has: autonomy. I have actually never seen this in a platform team in the org I am talking about.
I can use a library, drop it, change it or exchange it for another one. The same _must_ be possible with a platform. It needs to be something that helps its users, not limits them in any way, and it can't ever be rammed down their throats. If your platform doesn't work for me, I should have the autonomy to just use a third party to get the job done. If your magic abstraction over AWS doesn't work, give me an AWS account with admin access and I do it myself. Bonus points if its not an all-or-nothing and I can just use what works and build the rest myself.
If you don't have time to build feature B because feature A is more important, everything I need to build feature B myself should be readily available. For example, I must be able to just fork the platform, build feature B, and when done 'upstream' it to the platform again.
Theoretically yes, but since they weren't directly responsible for customer interactions, they couldn't do much more than coordinate with product PMs. Which wouldn't work if two product PMs for two different products had fundamentally different views of what is more important for the business.
What we have found is that platform teams are a huge point of frustration for product teams, since they cause unnecessary and unmanageable coupling between different business divisions, leading to impossible to balance priorities. What we've seen happen over and over is that product A needs Feature A, and product B needs Feature B, and they both need it tomorrow, and the platform team only has resources for one. And since Product A and Product B are in different business divisions, you end up needing to involve a senior VP or even an officer to make a prioritization decision for a simple software feature, and everyone gets frustrated by the process.
What we're striving towards instead is an "inner source" model, where a platform is collaboratively developped and maintained by multiple product teams. Each product team is then empowered to build new features as needed into the platform, and others can reuse them.
Of course, the platform needs some architects and overall review, and all teams will not equally participate. But the key point is to encourage this collaboration mode, where no one team is a bottleneck for multiple products.
The inspiration for this structure is obviously the open-source world, where multiple corporations and foundations collaborate on a single code base without needing to rely on a single platform vendor to provide features for them.