Scaling a start-up

Alexander Grosse
AG’s Blog
Published in
5 min readJan 5, 2013

Feature or component teams?

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 that is (similar to the one mentioned in the
article) is that 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
<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/ <about:blank>
<http://scalingsoftwareagility.wordpress.com/2009/07/22/organizing-agile-
at-scale-feature-teams-versus-component-teams-part-3/>
[4] http://softwaredevelopmenttoday.blogspot.com/2009/07/feature-team-
needs-more-than-cross.html
<http://softwaredevelopmenttoday.blogspot.com/2009/07/feature-team-needs-
more-than-cross.html>

--

--

Alexander Grosse
AG’s Blog

CTPO at issuu, co-author of ‘Scaling Teams’ with @dloft