Application vs Platform Teams
Every time I split an engineering team into a 'platform' team and an 'application' team, I swear it will be the last. But time and time again, I end up repeating the same pattern. What are application and platform teams? Why do they tend to create organizational nightmares? What makes them irresistible to architects? Find out in today's article!
Let's start by defining "platform" and "application" (at least how I will use them in this article¹). Often, when computer engineers think about platforms, we think about Operating Systems – general-purpose subsystems that provide application developers with some abstraction from the lower layers (eg. the hardware), resource management (e.g. memory and time-slicing), and common services (e.g. storage and graphic APIs). Over the years, other general-purpose platforms have been developed higher up in the stack: development platforms (like .NET and Java) and Cloud services platforms (like Google Cloud, AWS, and Azure), etc.
But many/most engineering teams of a certain size develop their own 'platforms' for internal or limited customer use-cases. These platforms have the same fundamental properties as general-purpose platforms. That is, they usually provide some abstraction over lower layers, provide some sort of resource management, and provide a common set of services for application developers. Applications, in contrast, are built on top of platforms to perform a specific function for the user/customer (Think MS Paint, Twitter, or Mint).
My first professional experience with the challenging dynamics that can occur when you have an application and platform team occurred at Quack.com. Quack developed a voice portal infrastructure capable of hosting "sites" that allowed users to complete transactions and access information services, including movie listings, news, weather, and email. By the time Quack was purchased by Americal Online, there was only one site, AOLByPhone - but we were divided into separate application and platform teams that sat in opposite wings of the building (and blamed each other when anything went wrong).
According to the platform team, the application team was where engineers that couldn't do 'real' development went. We believed that if the app developers just used the platform as intended, everything would be just fine. Instead, they kept trying to hack around things and created a huge mess. Of course, if you asked the application team, they would tell you that the platform was an unstable and unusable monstrosity, and their lives would be so much better if they didn't have to use it. Not exactly a healthy relationship².
In last week's article, I alluded to another similar dynamic that arose during the development of the Operating System Deployment (OSD) feature in Systems Management Server 2007. In that case, the developers were split into a task sequencing team (responsible for building the basic 'platform' that would orchestrate tasks throughout the re-imaging process) and an OSD team³ (responsible for developing the OS deployment-specific actions). Each team reported through a separate management chain, had its own team meetings, and generally operated independently⁴. The results were pretty bad: teams blamed each other for mistakes, re-wrote each other's code, and had more than one spec review devolve into a shouting match.
So if application and platform teams have such dysfunctional tendencies, why do I (and most other architects) continue to split responsibility this way? Are we all sadistic jerks that take delight in the suffering of others? Well, maybe. But there is also a method to our madness. When carefully managed, separating an architecture into a platform and application team can create healthy tension.
Consider what happens when we don't do this. Suppose you start with just a single 'application' team tasked with solving a specific problem (say Operating System deployment). You end up with just that – an application that solves a specific problem (like the SMS 2003 OS Deployment Feature Pack). Even when the team sets out with the best intentions to isolate reusable 'platform' pieces of the application – shortcuts get taken (due to schedule pressure, lack of foresight, or simply laziness). The platform tends to lose its general purposeness. Likewise, trying to build a platform first (without the aid of an application team to feed in requirements, challenge assumptions, and apply schedule pressure) is equally as fraught with changes. Like it or not, we usually end up coding our org structure – so architects use this to our advantage. Creating two teams with separate charters (one focused on making a general-purpose platform and the other using the platform to solve a specific problem) is the only way I have found to ensure a balance.
So how can we avoid having the teams devolve into a dysfunctional mess? I have found the following works pretty well:
Recommended by LinkedIn
Using one or more of these approaches helps quell the worst dysfunction cases while still producing a good platform. However, it is still critical to closely monitor the team's temperature and make adjustments along the way.
Have you ever been on a platform team where the application folks kept messing things up? Ever been on an application team building an unstable mess of a platform? Have you experienced a healthy app/plat relationship? Comment below!
Be Happy!
Like this post? Please consider sharing, checking out my other articles, and subscribing to my weekly Flegg’s Follies newsletter for more articles on software engineering and careers in tech.
Footnotes
Please note that the opinions stated here are my own, not those of my company.
Brilliant thoughts! I’m currently sorting my own thoughts when it comes to hardware. In my mind the hardware and “operating system” team also forms a sort of platform team. Feature creating teams form the the application teams. And, I like the idea of seeing the app team as customers of the platform team.
Even now we are aware of DevOps methodologies, I agree we still end sometimes with this separation between apps and platforms. Why ? It is related with something you said in your article about building teams across the globe : people work more efficiently when they have common problems to solve. Building a team combining apps and platform developpers is doable for small projects (ie scrum says max 9 people) but for projects involving more than 2 people manager it often ends in mini silos of shared expertise in my experience. Like you write. Straight to the point : that is often related to the enterprise culture or lead engineers culture and it starts in what schools and companies teach you. The interesting point is to find common patterns after years of experiences and shortcut some non evident problems at the beginning of building new teams. Thanks for your articles, I have read them ORDER BY published_date DESC.
The primary challenge I see to a successful platform team is that they need to behave like an product team whose customers are the internal app teams. They should be driving requirements based on their customer needs and measuring success based on customer satisfaction. Conversely the people who gravitate to platform teams see it as an opportunity to build the holy grail of something, regardless of what's really needed or if an off the product would meet those needs. The platform team IMO is critical to scaling an engineering org, but their mission — and any team providing jnternal services such as APIs — needs to be making it easier for their internal customers to do their job. You don't build a successful product by ignoring customer needs, building in a vacuum, then throwing it over the wall and getting mad if customers don't like it.
I think this describes some risks of coupling team structure with technical architectures. There is no reason there cannot be one team that owns both the app and platform or to have the platform components collaboratively developed across several app teams. I would only create and app and platform teams if the apis between the app/platform are very stable and well defined. I also say app frameworks which make simple platform apis easy to use are likely best owned by the application teams. In short drawing two boxes and allocating teams to boxes with out thinking carefully how those boxes really interact and therefore how people need to work with each other has some risks.
Great article. I once worked for a company with this platform and app breakdown and yes we experienced the challenges you documented. At one point the senior management made the head of the platform and the head of the apps teams trade places. Disruptive? Yes. Did it spread some empathy and better collaboration? Yes. Food for thought if you're struggling in this boat - do some cross-pollination between the teams, especially within the leadership levels.