"How Thin is Thin?" An Example of Effective Story Slicing

Graphene is pure carbon in the form of a very thin, nearly
transparent sheet, one atom thick. It is remarkably strong for
 its very low weight and it conducts heat and electricity
with great efficiency. Wikipedia
If you have spent any time at all working in an Agile software development environment, you've heard the mantra to split your Stories as thin as you possibly can while still delivering value. This is indeed great advice, but the term "thin" is relative - our notion of what thin means is anchored by our previous experience!

To help communicate what I mean when I say that Stories should be thinly sliced, I'm going to provide examples from a recent client who was building a relatively standard system for entering orders from their wholesale customers.

To start, here's a very simplified model of the entities we'll be working with (using GML - the Galactic Modeling Language).

In plain language, the system creates Orders, which have a Customer and from 1 to some number of Products.

For initial planning, the team (consisting of developers, QA person, business analyst and product owner) used Jeff Patton's Story Mapping technique to determine what work the salespeople did at a relatively high level. Not surprisingly, the group determined that creating an Order was the most fundamental part of the system! So we started with a simple sticky note with the title Create Order.

Note that there wasn't any other descriptive text, no acceptance criteria, no indication of performance requirements, or even mention of how someone using the system would actually create the order.  At this point, we simply didn't need all that - we just needed a placeholder for the conversations that were required for the action of creating orders.

Everyone in the group knew that an order would need a customer and some number of products. When I asked what the first Story should be, reminding them that it should be very, very thin, the first suggestion was to have the user select a customer from a list, select products from a list, and save the order. I asked if it was possible to make that story even thinner, and received puzzled looks.

I followed with another question - why did we need to select a customer at this point, or even products for that matter? More puzzled looks. Couldn't we just hard-code a customer ID and a single product SKU? More puzzled looks.

Another question - if we presented a simple page with a button that when pressed created the order in our database with a hard-coded customer ID and a single, hard-coded product SKU, what percentage of the overall system infrastructure would be fleshed out.

That was the point at which people started to understand. The response I received was, "Almost all of it... we need to render a page, capture the submit action, write the order to an Orders table, the product to the Order Lines table and the customer & product to the Customers and Products tables respectively".

My response was, "Great!! But it's still a little too thick." More puzzled looks... how could that story be made any thinner?

I asked, "Why do we need tables for Customers and Products right now?" More puzzled looks, followed by a sheepish, "Um, because...". The need to create those tables was an assumption at that point. Everyone in the room, myself included, knew that the database would have Customers and Products tables at some point, but we just didn't need them right now. All that was required from a persistence perspective was the Orders and Order Lines tables.

Someone asked, "How do we know that the Customer ID and Product SKU are valid?" My response was, "We don't! And at this point, we don't care!" This is another way to split stories - assume the happy path where everything is valid, and build validation and error-handling later.

So, this very thin story became,

The acceptance criteria for the story were very simple as well:
  • When you navigate to the home page, it should be displayed with a Submit button
  • When the Submit button is clicked, the application creates one row in the Order table with a Customer ID of XXX, and one row in the Order Line table with a Product ID of YYY.

Note that I could have gone even further and argued that we didn't even need the database yet. We could have simply used a flat file and broken all the rules of relational data modeling by putting all the Order and Order Line data in a single line in the file. Why? BECAUSE WE DIDN'T NEED IT YET!

However, in the interest of establishing the overall architecture early, we decided to proceed with the database. It did add some complexity to the story, but it was on the order of hours rather than days or weeks. We also "gold-plated" the story to an extent by providing a rudimentary confirmation page that was displayed after submitting the Order.

After the group created this one, simple, thin story with hard-coded values, the next steps were to gradually replace the hard-coding with the selections and searches that you would expect in this type of application. Subsequent stories were,

You can now see the progression where the creation of an Order is gradually built out using very thin slices of functionality. Also note that the last two stories, which "wire up" the selection of Customers and Products to an external web service, could be implemented in either order - there is nothing in the story that indicates a dependency on anything else.

Splitting Techniques

In these stories we used several common splitting techniques:
  • Hard coding values;
  • Simple interface;
  • Defer validation;
  • Zero, then One, then Many (with the Products);
  • Defer complexity.
This is only a small handful of the available techniques, but it gave the group a powerful way to work in very, very small increments while still delivering some value with each one.

We Can't Ship That!!

The moment I suggested the first story with all the hard-coding, I was challenged by the group. Why would you want to build something that isn't production-worthy? The answer is that some aspects of the feature aren't production worthy when you look at the story in isolation. However, the whole concept of a Minimal Viable Product or Minimal Viable Feature is each consists of 1 to many smaller slices (stories in our case) that have been built together to provide enough value to warrant the cost of being put into production.

The Product Owner or Product Manager is the person who decides when enough value has accrued to meet that threshold.

The Benefits of Thin Slicing

I've provide a number of examples from a real-world project but haven't really dug into the reasons why this is a good approach. There are a number of them:
  • You are deferring design decisions as long as possible which gives you more options when it does come time to implement a Story;
  • Having options also allows the Product Owner/Manager to defer business decisions as long as possible, providing the ability to make changes to the product that better suit the actual needs of the business;
  • Thin slices (in conjunction with acceptance criteria) help prevent assumptions which can lead to bloated Stories that are seemingly never done, Agile's version of scope creep;
  • Thin slices are much easier to verify since they are only providing a small increment of functionality beyond what has already been implemented;
  • Thin slices allow a product to be reviewed sooner by both the Product Owner/Manager and users/stakeholders, such that their feedback can be incorporated sooner in the process;
  • Thin slices allow the Product Owner/Manager to decide to change or drop a Story without the burden of the Sunk Cost Fallacy.
While these are all great reasons to split Stories into thin slices, here's the one that my experience suggests is by far the most important:
With Stories sliced as thinly as possible, they all become nearly the same size in terms of effort. Therefore, no estimation of individual Stories is required and a team's capacity can simply be derived by counting the number of Stories completed for some unit of time.
That means no haggling over whether a Story is a 3 or 5 on the modified Fibonacci series many teams use for sizing Stories. It means that the need for spending any time estimating individual Stories is no longer required, an activity that is downright painful for some groups.

The group from which these examples came was in the situation where there was a hard release date to be met. This stories gave the Product Owner/Manager the ability to easily tweak the what was and wasn't going to be in that initial release and, in several cases which features could be released partially completed.

If a group is in the situation where they are being asked for an estimate of when some work could be completed, my experience has also been that Story Mapping coupled with a technique called Blink Estimation provides a high-level estimate of the overall work that's much more grounded in reality.  Once a group begins working on thinly-sliced Stories, you begin to have data points with respect to how many they can complete per some unit of time. Those real numbers can then be used to make better business decisions, and deliver a product without the pressure of Crunch Time.


The group with whom I worked for this example system never spent any time estimating individual Stories. Ever. There were some instances where a Story was larger than it first appeared, but those were either balanced out by Stories that were very small, or by further splitting.

Like the graphene example at the beginning of the post, thin stories have remarkable properties far beyond the fact that they are just "thin". The value gained by learning how to split Stories effectively is enormous owing to the flexibility it provides by deferring decisions as long as possible and the removal of the need to estimate at a granular level.

Splitting Stories this thin isn't really a specialized skill - it's something that can be learned by anyone in any domain. If you need help learning this technique, let's have a chat.


Gauntlet said…
For product teams that have platforms and features that are being worked on, do you front-load the creation of thin stories, so that there is a log of all of them?

Or would you only write and slice the work immediately in front of you?
Dave Rooney said…
The simple answer is, "Yes". :)

There's a balance to be found between doing too much too soon, and not having enough to work on at any given time.

What I've seen work well is to use the story map to delineate some interim milestones. Those might contain key features or key aspects of some features. The thin stories will be created for the current milestone, and shortly before the next milestone begins.

My experience has been that the stories aren't sliced as effectively the further they are away (in a temporal sense) from being built. That leads me to want to delay creating them until the group absolutely needs them. Until that time, the story map shows the overall vision for delivery, but at a higher level of abstraction.

Does that answer your question?
Steve Rogalsky said…
This is a great example Dave - thanks. I'll link to it from my story mapping blog since lots of people are asking the 'how thin is thin' question.

Unknown said…
Absolutely love this as I have been preaching this to teams for years... do away with the formal estimation. If you have groomed ahead of time, sprint planning takes minutes, not hours. And you can more easily predict a sprint's velocity when: (a) someone is on vacation or there is a holiday; (b) you add/subtract a team member; and when you really start tracking numbers, (c) the effect a new hire has on the team over time.

In response to Gauntlet (and Dave's response), I feel it's really about how far does the business need to look ahead with their planning (and how accurate it needs to be). It's a trade-off between business vision and the likelihood that the effort will be thrown away before a feature is implemented. Is that 2 sprints? 3 months? 6 months? Each business is different. So I agree with Dave in that you want to delay the work as long as possible, but that still might be months ahead, just not for the thinly sliced stories.
kate said…
Where's the "like" button?