Some time ago I read Crisp’s blog post about teams and decided to make a brief overview of team format approaches I take.
First I think you need to decide about who will be in the team and then decide what this team will be responsible for.
Functional or cross-functional in terms of specialization
There are two ways how to decide who will the team consist of:
- Functional - when team is built around one specialization or function: for example team of testers, team of analysts, team of developers, team of devops, etc. Sometimes we call them departments. The main idea here - same specialization or function people are gathered in one team.
- Cross-functional - when the team is built out of different specialization people. First what comes to mind: a team can be formed out of analyst, designer (such as UX designer), developer, tester. Usually scrum teams are being formed this way - we have different roles people in on team.
I go for cross-functional teams, mostly because of these reasons:
- Such setup gives you faster delivery
- Team has customer focus
- There is a constant knowledge sharing happening between members with different experience
Feature (product) or layer (component) in terms of scope
I see two possible approaches to define the scope for the team:
- Layer team - this is most common approach and I think most of development companies start this way, when teams are being gathered around the layers of software architecture. For example: team responsible for data bases, team responsible for backend, UI team.
- Feature - when the team is formed around a feature or a product and does a full stack development of that feature: starting form analysis, coding, testing, deployment, monitoring; and covering all the layers of this feature: data base, backend, UI, etc.
I seek for feature teams, mainly because:
- It gives you increased value throughput
- Team has an autonomy
- There is a single point of contact for a feature (or product)