Agile process allows us to deliver software product in customer’s hands faster through iterative chunks, enabling quicker feedback from the user, lowering the cost of responding to changes and allowing better accuracy of work estimated by development team. The increment delivered by each iteration has to result in a working product. Iteration is a ‘vertical slice’ of working end-to-end product increment that could have code changes in all layers of the product. This post explores what this ‘vertical slice’ delivery actually means for the team, product and software design.
Product
Delivering potentially shippable product in each iteration is achieved by delivering small working vertical slices of the product. Product owner must produce user stories that reflect these vertical slices by breaking the feature (epic) into series of business requirements (user stories) that can be built and operate on their own. The big change from the waterfall approach is that users must provide feedback in each iteration, regardless whether the iteration will be actually released or bundled with several iteration for later release. This review could be performed through the demo, access to staging environment or deployment of the slice in production environment for a subset of users.
Design
The software design needs to enable vertical design thinking and depart from trying to solve everything up front in a layered horizontal approach. The idea is to implement vertical slice by encapsulating all user interactions, business logic and data access needed for the feature to work in a slice, with minimal dependences on other slices. As most of the code will be added and not modified, this approach leads to fewer bugs, easier deployment and less costly rollback. However, this growing design will result in duplication and other inefficiencies requiring continual refactoring to ensure good design and maintainability in the long run.
Team
The scrum team needs to deliver a complete working vertical slice of the product. This requires the team to have understanding of the overall application architecture and be able to make changes to each application layer (presentation, business logic, data). If you have inherited the legacy structured team, where teams are divided based on application components or architecture layers (backend/frontend), the members of these teams must be mixed and cross-trained. The goal is to train developers to become full-stack developers. This will significantly improve ability of each team member to work on different parts of the system and gain the big picture understanding of the application, leading to better solutions and less time in coordinating between team members.
Ability to deliver product through vertical slices requires the company to transform itself. These changes are not exclusive to engineering teams and have to be spread across all departments, for example, adapting marketing and sales strategy to more frequent smaller releases. This process requires looking into new technical designs and tools, not only how the product is built, but also how it is delivered through continuous delivery pipeline.
