Should we hire full stack developers to build the application or hire specialists for each part? This is a question that often comes up when an organization starts a new development project. In my experience there is no better team than a full stack development team for any new project. When starting a new development project, you have a choice to build a vertical or horizontal team. A vertical team consists of full-stack developers that make changes at any layer of the code base from the front end to the back end. A horizontal team divides development up into different parts of the application, typically front-end or back-end. When development teams are split into horizontal layers there are several common issues that arise that are not faced by full-stack teams. Conversely, vertical teams offer advantages that are not found in horizontally organized teams.
Challenges of Horizontal Teams
In theory, specialization leads to higher efficiency and performance. In iterative knowledge work like development, specialization breaks down at the intersection between different collaborators. As a result, a horizontal team encounters some challenges that do not exist in vertical teams.
One of the biggest challenges facing horizontal teams is integration. Each step through each layer of an application requires integration. In practice this means multiple conversations, changes on both sides of the integration, understanding of data formats and nuances such as supported values, data length limits, and what fields are available. Working through integration challenges is aided by team members sitting side by side or working in a cohesive unit, but is never easy.
In a new project that will see rapid development of new features moving targets may be one of the biggest productivity killers in a horizontal team. A back end developer will be in charge of a service that provides some API endpoint (JSON over a message queue, REST API, etc.). One of the most extreme examples of this was a project I worked on where the front-end code would need to be fixed nearly every day as the back-end API was changing constantly. It was demoralizing to have to constantly change working code just because the back-end was being refactored. In a full-stack development team, the front-end code is changed at the same time as the back-end code by the same developer removing this element of surprise.
Because of the way horizontal teams are structured, different developers are put at odds with each other. When a client application is integrated with backend services, there will be changes to make them work together well. This integration step will result in a natural territorialism between developers where one developer will suggest changes be made on the other side for whatever reason. A developer may get defensive and respond that their code or interface is the way it should be and changes should be made on the other-side. This same situation arises when supporting a production environment and an issue arises in the integration.
Advantages of Vertical Teams
Building a team of full stack developers means that any developer has the ability to make a change to any part of the code base at any time. In Extreme Programming, explicitly following this practice of allowing a developer to make a change to any part of the code is called Collective Code Ownership/Shared Code. Code ownership is not a decision to be taken lightly, there are far-reaching performance implications of code ownership.
Zero Communication Overhead
A fullstack developer implementing a new feature will require no communication overhead during development. Each implication of the new feature through the stack from client application through the web layer to the persistence layer will be worked out in that single developer’s head until all of the code is written, tested, and committed.
In horizontal teams or teams employing strong code ownership (as opposed to collective code ownership), one developer or module can become a bottleneck for the entire project. If each developer has a separate part of the code base to work on, each developer’s personal productivity or work load will impact the overall project delivery. Having multiple single points of failure is a recipe for disaster. In a vertical team, any developer will relieve the burden or work load of a single part of the code base. The end result is that any developer can pick up the next highest priority task in the development backlog.
When to Specialize
While fullstack teams are much more productive in building applications, specialization becomes more efficient as applications stabilize and grow. Once an application has been running and the interfaces and services of the application stabilize, teams can start to look at specialization. This happens when an existing web application needs a corresponding new mobile application. If the mobile application is being built with the same feature set as the web application, specialized mobile developers will bring mobile-specific expertise without adding inefficiencies to the integration with the backend code. Similarly if a back end service in an application grows to be used in other parts of an organization, a new backend team may be put in place to maintain and build new features into that service for additional use cases.