Cross-Functional Squads

A few years ago, Spotify popularized the idea of organizing engineering teams into squads and guilds. This isn’t actually a new concept, it’s an old one given a new name; Amazon has been organizing development teams into two-pizza teams along the same principles at least as far back as the early 2000s. Organizational design is something that most engineering managers need to tackle with at various points in their careers.

When teams are small, they often index for hiring full-stack developers (i.e. jack-of-all trades developers). This often serves them well, especially considering when all they can afford is 2-3 developers. As teams grow, individuals tend to specialize. You’d be really hard pressed to find a developer that’s good at mobile, web, backend, distributed systems, devops, data engineering, systems engineering, etc. I’ve never actually met a developer that was actually excellent across all these engineering areas. I’ve met some that were fearless and willing to dive in and learn, but in most cases, they’re just average in the areas that aren’t their main areas of expertise.

The purpose of a cross-functional team is to outfit the team with the right tools to complete the job without the need to depend on outside help. The more a team needs to collaborate and coordinate externally the slower they get. Decoupling teams gives the team autonomy and the ability to own the situation.

Analogy time! Let’s take a basketball team, everyone on the team should be able to dribble, rebound and perform layups, these are basic skills. But individual players will have their areas of expertise, some will be excellent 3pt shooers, some excellent at posting-up under the net because of their size, and others great at play-making because of their speed/agility. A team with 5 centers in the starting lineup would likely be a pretty bad team, they’d be slow to move down the court, have their passes constantly intercepted, and balls stolen whenever they dribbled against a smaller more agile player. Each person on a team is filling a position, a good team is a team of complementary players that help each other be effective at what they do best.

We want developers that in a pinch could debug a web form or look at why an API is suddenly slow, this isn’t necessarily a full-stack developer, that’s just a willingness to do something when called upon, a lot of it just basic debugging skills and understanding of how software works. In a pinch, a center can shoot a 3-pointer, but you probably don’t want them to do that all the time; if you want your teams to be effective, get folks to focus on what they do best.