If you work within agile teams, then you have most likely heard about vertical slicing, the most common definitions are the ones that say a vertical slice is the slice that goes across all architectural layers, reaches production and delivers value to the customer.
Yeah, that’s great, but what does it really mean when it comes to putting in practice? This is the question I will try to answer, in order to do so I will use 1 scenario, I don’t like to use generic scenarios or scenarios that are not related to the software industry, so here os mine:
- You are a B2B company working on the travel industry, you lack product in USA, so you have found a supplier that will give you new hotels to sell on the whole USA market, you are going to need to integrate this new supplier into your systems.
B2B Travel Company
Are we aligned if we say that the only moment, where you will get real value for the company, talking about economics it’s going to be from the moment you perform the first booking? at the end, this project has been approved to increase sales in USA.
In order to simplify the example the typical steps in order to integrate a supplier like this in your system will be:
- Getting availability.
- Perform a prebook.
- Perform a Booking.
- Canceling a booking.
And each step will have its own logic, mapping rooms, content, cancellation policies, etc… a lot to take into account right?
So, try to answer this question, how do you vertical slicing so you deliver value to your customer in each sprint? the answer is easy, 99% you can’t.
But, there is hope, I like to come up with strategies in order to tackle these difficult scenarios, so how I would do that?
NOTE: We assume that this supplier is very flexible and will allow us to deliver in increments
What’s the easiest path?
If the goal is to perform a booking, what would be the easiest path to reach that goal? This will involve some analysis, yeahh in agile there is analysis as well 🙂
That’s the first question you need to answer, how can I reach a booking faster? in this scenario, I would as myself questions like:
- Should I start with all hotels where there are no cancellation policies so avoid building all that logic? so the cancellation step is also much easier to implement?
- Should I just start by mapping to rooms we can quickly map as well, so even if I have fewer rooms (product) to sell I can start selling sooner ($).
So, once you know the quickest path to reach a booking in production then the time to start implementing it starts.
Take into account that this is just an example, if you are working in the travel industry this might sound silly, but turn out that this is a competition and creativity and pragmatism are very important!
Let’s say we work in 2 weeks sprint, are we expecting bookings coming through at the end of the sprint? of course not, 99% not.
So, what value to the customer we are going to deliver at the end of each sprint? none.
Note that in the previous question by customer I refer to the people who will by our product (the real and unique customers), but we will definitely be able to add value to our company at the end of every sprint, but will be a different value.
Have you heard this before?:
- We will add logging and monitoring later… let’s first deliver.
- I’m just adding functional tests now to make sure end to end works, we will add the unit test once it’s delivered…
- I would have done differently but it will take more time, so let’s refactor once it’s delivered.
To make it clear, a vertical slice includes ALL necessary steps to guarantee that what’s been developed is safe, performs well and has a great design.
So, whatever you work in the sprint MUST include a bit of everything, for instance, let’s say the team has agreed as sprint goal to have the search of availability integrated into their system.
This is a vertical slice, why? because it represents an end to end, and something that can be in production, this means we could have the production endpoints ready at the end of the sprint, and with a SOAPXML, Postman or similar we could see request being send, and responses being processed.
What should we expect as a result of this increment?
- Being able to send a request and receive a response.
- Being able to see in a monitoring dashboard why a request maybe was rejected, wrong parameters? values? content-type?
- Being able to see in a monitoring dashboard CPU usages, memory, request per second, etc…
- Functional and Unit Test that covers the search functionality.
- SonarQube metrics in regards to the code, cyclomatic complexity, architecture, etc…
Involve your customer if possible.
We could even talk to some customers (the ones who pay for our services) if they would be happy to help us by activating this new supplier, they would just be able to get availability, and in exchange, we could put that kind of customers in a program where they are the first ones to get our latest developments or something like this.
But that way we could have real customers start using the integration, and we could already see that information!
We will expect a lot of sources of information that will give us a lot of feedback, that will put the team in a much better position to pivot or make decisions.
What if we see that the way it’s been designed is not good for performance? we will be on time to change, and avoid much bigger problems once the integration it’s finished completely and activated with all customers.
And then REPEAT on the second sprint!