There are some really cool startups in Berlin. Last week I met Alexander Grosse (
@klangberater) from SoundCloud at ALE2011. Alexander is their VP of engineering and he had been thinking and writing about Feature teams. After reading his article I thought it would be a good and balanced view at that topic that could generate a good (and balanced) discussion on the blog. Alexander kindly agreed to let me publish it, so here it is!
Building and Scaling a startup - the Feature vs Component teams debate
Guest post by: Alexander Grosse from SoundCloud
The first team in a startup is a feature team by default. But as the company grows and you hire more developers, a common question pops up: How do you structure your engineering department when you have more than one team? Two common approaches are teams per component/service/layer or feature teams. This article describes the pros and cons of each approach based on experience.
So you have a startup. Let’s assume for the sake of simplicity it is a consumer facing website done in Ruby on Rails with an underlying database (but this article applies to other kind of startups too). You have around 10-15 employees, of which 6-10 are developers. These developers are one team, some of them concentrate on front-end work, some on the back-end, the mysql database is maintained by a handful of the developers. The team feels like it has reached the natural size limit and is considering splitting into smaller teams. Before discussing team structure let’s first talk about some important goals while scaling up the company.These goals should determine what you do:
- Developers should have as much knowledge of the system as possible, so that there is no single point of failure and technical decisions are made with an understanding of the overall system.
- There should be common approaches to most technologies like CSS and for some technologies, like databases, specialists are needed.
- Communication overhead should be avoided where possible as well as handovers between teams.
Overall there should as much common knowledge as possible but specialists where needed. Let’s first discuss the terms “Feature Team” and “Component Team”, especially in a startup context. The usual definition of a Feature Team is: Feature teams are supposed to be cross-functional groups that focus the software development process in valuable-chunks of work, which normally cross the whole system (vertical slices of the system).[1]
While this sounds good you usually reach pretty fast the team size limit when trying to compose teams which can touch every part of the system. At SoundCloud we currently have 35 engineers working on topics like Android, iOS, Search, Anti Spam, MySQL, Operations, Web Front-end, Back-end and so on. So you can see very easily that if you define seven as an ideal team size, we have difficulties forming teams which can touch every part of the system.
A lot of consultants say that engineers should be able to work on any part of the system, but in reality and especially if you operate under scale, where for example every single SQL query can impact the site, this just does not work. Component Teams are usually defined as horizontal slices of a system, so for example front-end, presentation layer, business logic, database and operations. But I haven’t seen a startup which organizes it’s teams exactly that way. This is usually a team structure big companies choose. But what I’ve seen at a lot of startups is the separation between front-end, backend and operations. There are lot of obvious disadvantages associated with component teams:
- Features often touch several teams, this leads to costly handovers
- Teams often act as silos and lose sight of the coherency and goals of the product But especially in large organisations component teams also have some advantages, like having dedicated teams for components - like databases - under scale. (please look at [3] for details)
So, we now have two approaches which on the surface both are not applicable for startups either at all or from a certain size on. Reading the post from Vasco Duarte ([4]) clarifies the situation in a very good way. Feature teams are not necessarily defined by their structure, but the most important thing is that a feature team can deliver value to the customer without dependencies on other teams. The reason for that is to reduce handover between teams which usually produces what “waste” is in terms of lean. Citing Vasco: A feature team is not defined by it's structure (being cross-functional), it's defined by it's output! (delivering shippable pieces of the system)[4]
A common anti pattern for the implementation of Feature Teams is (similar to the one mentioned in the article): design is not integrated into front-end teams. This often causes blocked user stories (waste) when design specs are either unclear or during implementation a necessary change in design has been discovered. In reality there is no such thing like having absolutely no dependencies on other teams. So we defined teams, which can work on the vast majority (at least 90%) of the stories in their backlog without needing other teams. How those teams are formed changes over time.
We at SoundCloud did not always have a stable API. So in the beginning front-end and back-end developers were one team until we were able to extract a well defined API, which offered the necessary functionality for all front-end clients (mobile and web). At that point we separated the joint web team as the front-end teams were now enabled to work on the majority of features without involvement of the back-end. Looking back at the start of the article where we defined that we want to have developers as much overall knowledge of the system as possible it seems like the chosen setup at SoundCloud violates that. To achieve a compromise, we encourage developers to rotate through teams. Some developers want to stay in their comfort zone (these are often the specialists mentioned above), some are interested in all parts of the system. As long as half of the developers in a team are aware of what other teams are doing, that team will be fine.
Combine both approaches The question is not so much which formal definition of team to follow. The importance is for teams to deliver the majority of stories in their backlog without depending on other teams. And team composition ought to change over time as the overall software stack matures. Analyze your teams if they can deliver value without depending on other teams (for at least 90% of the features). Do this regularly and team composition changes over time just as architecture does!
Inspired by:
[1]
Scaling Lean and Agile Development, Larman, Vodde: Feature team definition on page 153 [2] http://blog.mountaingoatsoftware.com/the-benefits-of-feature-teams
[3] http://scalingsoftwareagility.wordpress.com/2009/07/15/organizing-agile-at-scale-feature-teams-versus-component-teams-part-1/
[4] http://softwaredevelopmenttoday.blogspot.com/2009/07/feature-team-needs-more-than-cross.html
. Eric Wahlforss from SoundCloud will be speaking there.