After you've worked in Software Engineering for some time, you start to recognize different types of developers: The planner who second guesses every method name, the gold plater who won't stop fixing edge cases, and the speedy dev who wants to win the race that no one else is a part of, just to name a few. A similar statement can also be said for some of the more popular superheroes in comics, TV, and movies. And just like those superheroes, developers have strenghts (superpowers), areas they struggle (weaknesses), and often work in teams.
As a developer who has lead many different teams, and who has an encyclopedic knowledge of superheroes in pop culture, I believe there are a lot of shared principles that we can utilize to make the highest functioning teams. This first comes from classifying developers into archetypes (don't worry, I understand developers don't fall in a single category) and then figuring out how to distribute them amongst teams. These teams should not be full of individuals with the same powers because the weaknesses will be obvious to the villains (bugs, new features, and any other projects that need to be "vanquished").