<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ user story - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Browse thousands of programming tutorials written by experts. Learn Web Development, Data Science, DevOps, Security, and get developer career advice. ]]>
        </description>
        <link>https://www.freecodecamp.org/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ user story - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Tue, 25 Aug 2026 02:12:57 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/news/tag/user-story/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Mistakes Your Team Might Be Making When Writing User Stories - and How to Fix Them ]]>
                </title>
                <description>
                    <![CDATA[ By Vikash Koushik There's a lot of information out there on how to write user stories and why it's important. And yet, many of us make mistakes that cost us a lot. There are many who even prefer an alternative method. (Here’s another one.) And it's o... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/user-story-mistakes/</link>
                <guid isPermaLink="false">66d4617137bd2215d1e245f6</guid>
                
                    <category>
                        <![CDATA[ agile development ]]>
                    </category>
                
                    <category>
                        <![CDATA[ user story ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Tue, 12 May 2020 17:20:09 +0000</pubDate>
                <media:content url="https://cdn-media-2.freecodecamp.org/w1280/5f9c9b15740569d1a4ca2997.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Vikash Koushik</p>
<p>There's a lot of information out there on <a target="_blank" href="https://zepel.io/agile/user-stories/">how to write user stories</a> and why it's important. And yet, many of us make mistakes that cost us a lot.</p>
<p>There are many who even prefer an <a target="_blank" href="https://jtbd.info/replacing-the-user-story-with-the-job-story-af7cdee10c27?ref=hackernoon.com">alternative method</a>. (<a target="_blank" href="https://dev.to/redfred7/enough-with-the-user-stories-already-2a8a?ref=hackernoon.com">Here’s another one</a>.) And it's often because they're frustrated by poorly written user stories. </p>
<p>As much as it's important to know how to write good user stories, it's equally important to know how to NOT write one. </p>
<p>Today, many software teams want to adopt agile processes. They want to put the user in the center of their product development process while building products. And it makes perfect sense. After all, you are building the product for your users, right?</p>
<p>A lot of times when writing user stories we think we are writing from the user’s perspective, but we end up skewing it with our biases and knowledge. And a lot of times, these mistakes are interlinked and only get worse with time.</p>
<p>In this article I will talk about some of the common mistakes teams make when writing user stories.</p>
<h2 id="heading-user-stories-that-are-too-broad">User stories that are too broad</h2>
<p>When user stories are too broad, crucial information regarding the expected action and the need can get missed. If there are a lot of “<em>ands</em>” or “<em>ors</em>” or "<em>thats</em>" in your team’s user stories, it is good indication that it is too broad and you should consider re-writing it. </p>
<p>Also, there’s a very good chance that your too broadly written user story is actually an <a target="_blank" href="https://www.agilealliance.org/glossary/epic?ref=hackernoon.com">epic</a>.</p>
<p>An example of a broad user story might look like this:</p>
<p>“<em>As a user, I would like to continue reading the article later when I’m on my way home, without needing to sign up and find the exact spot where I left off.</em>”</p>
<p>In this case you can see the user story is trying to achieve two things — not needing to sign up and not having to find where they stopped reading. Instead of trying to cram everything into a single user story, consider breaking it down into multiple user stories.</p>
<p>Here's how it may look after it is broken down:</p>
<p>"<em>As a user, I would like to continue reading the article later without having to sign up</em>"</p>
<p>"<em>As a user, I want to continue reading from where I left off, so that I don't have to find the last paragraph I finished reading</em>"</p>
<h2 id="heading-user-stories-that-are-too-fine">User stories that are too fine</h2>
<p>When user stories are broken down into too much detail, you begin talking about how you are going to implement it. This removes the focus from the user and leads to poor communication of expectations within the team.</p>
<p>Here's an example of a user story that is defined too fine that it talks about implementation details.</p>
<p>“<em>Define a scalable, relational database structure so that I can use it to implement any possible future use case.</em>”</p>
<p>What business value does a great relational database have if the end user cannot use it? Besides, this user story is written from the business' perspective and not from the user's perspective. When you begin to include the implementation details, user stories no longer are written from the user's perspective.</p>
<h2 id="heading-user-stories-that-arent-negotiable">User stories that aren't negotiable</h2>
<p>User stories are not meant to be specific, precise descriptions of a feature. And therefore, they must not be fixed in stone.</p>
<p>Here's an example of a non-negotiable user story: "<em>As a user, I want to have a clear all button in the notifications tab, so I can remove old notifications</em>"</p>
<p>You can clearly see, the user wants to be able to remove old notifications. While having a "clear all" button is one solution, you can still automatically clear the notification after it's read too!</p>
<p>Here’s a classic scenario to help you identify if your user stories are too rigid: </p>
<p>Sometimes a user story may have been written in a particular way, and your team finds it hard to implement because there’s an easier alternative. </p>
<p>In cases like these, the team should be willing to compromise on the approach provided it doesn’t hurt the value a user derives.</p>
<h2 id="heading-user-stories-that-are-reiterated-in-acceptance-criteria">User stories that are reiterated in acceptance criteria</h2>
<p>Far too many times I notice the acceptance criteria repeating the user story, just in different words. </p>
<p>Here's how it looks:</p>
<p><strong>User story:</strong> "<em>As a user, I want to add pop-up forms to my blog, so I can capture the visitor's email id before they leave the site</em>"</p>
<p><strong>Acceptance criteria:</strong> "<em>Given a reader visits a blog, when they try to leave, then the pop-up form should come asking them to subscribe to the blog</em>"</p>
<p>Acceptance criteria should communicate the conditions that need to be met for the story to be marked as completed. This ensures that you gather feedback, help the team plan, and track their work. It makes the user story richer, more precise, and more easily testable. And more importantly, it aligns your team on what they're expected to deliver.</p>
<p>Here's a better example:</p>
<p><strong>For the user story:</strong> "<em>As a user, I want to receive notifications when others add comments so that I am up-to-date.</em>"</p>
<p><strong>Acceptance criteria:</strong> "<em>Given I have the app open when I am writing on the doc then the bell icon should update to show unread notifications with count</em>"</p>
<h2 id="heading-user-stories-that-have-an-undefined-user">User stories that have an undefined user</h2>
<p>It can feel silly to mention the user persona in every user story over and over and over. However, it can add a tremendous amount of value in terms of the outcome. </p>
<p>This is particularly important if your product has more than one user persona. There will, of course, be features that’ll get built specific to different personas. If you want your team to be more aligned on the outcome you are expecting out of them, they need to know who the end users are and what benefit they’ll get out of the feature.</p>
<p>If you're looking for an example for this, nearly all examples I provided above are great ones of how not to do. Don't worry, it was intentional so I can talk about this. :)</p>
<p>Every time you write a user story that begins with "<em>As a user...</em>" or "<em>As a visitor...</em>" or "<em>As a reader...</em>", you're leaving room for ambiguity. Clearly defining who that person is will go a long way in giving your team the context they require.</p>
<p>At <a target="_blank" href="https://zepel.io/">Zepel</a>, we recommend writing the persona instead of user/visitor/reader. This means, your user story will look like this:</p>
<p>"<em>As a writer, I want to receive notification when others add comments within the Google Docs app, so I don't have to refresh the page every now-and-then</em>"</p>
<h2 id="heading-user-stories-with-poor-context">User stories with poor context</h2>
<p>Far too many times, we end up writing user stories just for the sake of it. After a certain point, nearly every user story starts to look the same.</p>
<p>Here's an example: "<em>As a content manager, I want a text editor so that I can edit text.</em>"</p>
<p>All this tells your team is that you want them to build a text editor and nothing else. If you’ve been writing down a bunch of user stories for a while, it’s best to take a break and revisit it with a fresh perspective.</p>
<p>Sometimes, even after a break, you might not be able to come up with something more meaningful. This can be a good indicator that you need to talk to your users more and understand their needs better. There’s really no point trying to squeeze it out of your brain.</p>
<h2 id="heading-conclusion">Conclusion</h2>
<p>Although using a user story template can be useful, it is never as simple as completing a fill-in-the-blanks form in your agile tool.</p>
<p>Because one mistake while writing user stories often leads to a series of other mistakes as a by-product. And even if you do manage to write user stories properly, it’s only the beginning. You should still enable your to team to analyze the stories — from a technical point of view — to help them estimate and create the necessary next steps.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ A radically simple approach to user stories ]]>
                </title>
                <description>
                    <![CDATA[ By Bertil Muth User stories are a great way to plan development work. In theory. But how do you avoid getting burned in practice? I propose a radically simple approach. Here's a popular template to describe a user story: Here's an example user story... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/a-radical-simple-approach-to-user-stories/</link>
                <guid isPermaLink="false">66d45dd5264384a65d5a9506</guid>
                
                    <category>
                        <![CDATA[ agile ]]>
                    </category>
                
                    <category>
                        <![CDATA[ backlog ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Scrum ]]>
                    </category>
                
                    <category>
                        <![CDATA[ user story ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Tue, 17 Sep 2019 19:01:36 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2019/09/adorable-book-boy-1250722.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Bertil Muth</p>
<p>User stories are a great way to plan development work. In theory. But how do you avoid getting burned in practice? I propose a radically simple approach.</p>
<p>Here's a popular template to describe a user story:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/08/grafik-18.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Here's an example user story:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/08/grafik-22.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>User stories look at software from a perspective of user value. After implementing a story, the developers can get feedback from users whether they're satisfied or if there's something they'd like changed. That's the core idea of agile development.</p>
<p>Good user stories follow the three Cs: <strong>Card</strong>, <strong>Conversation</strong>, and <strong>Confirmation</strong> [1].</p>
<p><strong>Card</strong> means: user stories are short. They focus on the value provided to the user. You can write them on an index card, or a Post-it. Of course, a Post-it doesn't contain all the information necessary for development.</p>
<p>So the team developing the software has <strong>conversations</strong> about the stories. Input from users and business stakeholders is necessary, but developers bring their ideas to the table as well. It's important that everybody keeps an open mind in these discussions. </p>
<p>The team documents the results of the conversations as acceptance criteria. Checking the acceptance criteria later serves as <strong>confirmation</strong> that the team has implemented the story correctly.</p>
<h2 id="heading-acceptance-criteria-and-invest">Acceptance criteria and INVEST</h2>
<p>The acceptance criteria should answer questions like:</p>
<ul>
<li>What are the possible user inputs?<br>For example: "The payment options are MasterCard, Visa, [...] PayPal<em>."</em></li>
<li>How does the system react to user input, or a business relevant event? Under which conditions?<br>For example: "When the user enters a wrong credit card number, the system shows the following error message: [...]"</li>
</ul>
<p>There are many ways to document acceptance criteria. Bullet points, sketches, examples, tables. Development starts a few days after the conversation about the story. So developers need just enough documentation to remember the conversation.</p>
<p>How does a team check if a story has a good enough quality to start implementing it? The <strong>INVEST</strong> criteria define a quality checklist for each story [2]:</p>
<ul>
<li><strong>I</strong> for <strong>Independent</strong>. The story can be implemented independently of other stories. This facilitates priority changes.</li>
<li><strong>N</strong> for <strong>Negotiated</strong>. The conversation between developers and stakeholders about the details of the story has happened.</li>
<li><strong>V</strong> for <strong>Valuable</strong>. The story provides visible value for users. In contrast to implementation tasks like querying the database, for example.</li>
<li><strong>E</strong> for <strong>Estimable</strong>. The developers can estimate the story.</li>
<li><strong>S</strong> for <strong>Small</strong>. The story can be implemented quickly. In Scrum for example in a Sprint.</li>
<li><strong>T</strong> for <strong>Testable</strong>. The story is so concrete that the team can derive test cases.</li>
</ul>
<h2 id="heading-the-problems-in-practice">The problems in practice</h2>
<p>I like user stories. In product planning, they shift the focus from technical details to users and their needs. That's good.</p>
<p>And yet, in my work as an agile coach and trainer for agile approaches, I've started questioning the common way people deal with them.</p>
<p>I've seen backlogs with hundreds of stories that became extremely hard to manage. I've witnessed people use the terms "feature", "epic" and "business requirement" without sharing an understanding what that even means. I've heard endless discussions about detailed acceptance criteria, and how to slice stories based on them. It was frustrating.</p>
<p>I claim there is an alternative. A simple way to avoid all these traps. First, you need to understand that there are two fundamental levels of user stories.</p>
<h2 id="heading-goals-deliver-value-but-cant-be-implemented">Goals deliver value, but can't be implemented</h2>
<p>In one of my courses, I ask questions like: "What can you do with a web shop?<em>"</em><br>The typical answers are: "Buy a  product", or "Order products".</p>
<p>What the participants talk about are goals. If we were a team developing a web shop, we might come up with the following user story:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/08/grafik-23.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Is this goal level story valuable to the user? Yes! It reflects the needs of the web shop customer.</p>
<p>Can you implement this goal directly? No! In order to implement a goal, you need to derive steps to reach it first. For the story "Buy Product", the steps might look like these:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/09/grafik.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Each step could be documented with the user story template: "As a web shop customer, I want to enter the address so that the product is shipped to me."</p>
<p>Can you implement this step level story directly? Yes! As soon as you have clarified the acceptance criteria. But is it valuable for the user? Without the other steps, no.</p>
<p>Value only emerges when the goal has been reached. Each step represents progress towards the goal. But independently, the step has no value. Does it make sense to use the story template for it then?</p>
<h2 id="heading-a-radically-simple-approach">A radically simple approach</h2>
<p>The stories at the goal level are coarse grained. They can be used for long-term planning, without wasting effort on details:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/09/grafik-1.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>You can often realize good user stories at the goal level independently of each other. And they deliver value. They are <strong>I</strong>ndependent, <strong>N</strong>egotiated, and <strong>V</strong>aluable. But they are not <strong>S</strong>mall, easily <strong>E</strong>stimable and <strong>T</strong>estable. Because you cannot define acceptance criteria for them without talking about steps.</p>
<p>The stories at the step level are <strong>N</strong>egotiated, <strong>E</strong>stimable, <strong>S</strong>mall, and <strong>T</strong>estable. However, they are not <strong>I</strong>ndependent and do not provide <strong>V</strong>alue alone. </p>
<p>How do you combine the two kinds of stories into one simple approach? Here's my proposal. </p>
<p>The team picks a goal, say "Buy product". The team then reflects: "What is the simplest way to reach the goal? And how can we reduce architectural risks early?"</p>
<p>Let's assume that the team sees the greatest risk in the communication with PayPal, because they've never implemented an interface to PayPal before. </p>
<p>So what does a simple way to get to the "Buy product" goal look like? The team puts goal level story, step level stories and acceptance criteria as stickie notes below each other:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/09/grafik-2.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Here's what the acceptance criteria say (green stickies). There is only one fixed product that can be ordered. No search, no choice. The user interface is basic, and only allows users to pay with PayPal. </p>
<p>These are the first steps that the developers implement. Once the developers have implemented a step, they demonstrate it to company internal stakeholders. At latest when a goal is reached, the team involves users. Getting feedback and deriving insights for further iterations is crucial. </p>
<p>In later iterations, the team adds and changes stories. Examples include: more products, a search capability, and new payment methods. Or the team picks another story as a goal. Whatever is most valuable and makes sense at a given point in time. </p>
<h2 id="heading-summary">Summary</h2>
<p>You focus on a few goals to look further ahead. But you only discuss the acceptance criteria of the steps that you will implement in a few days. You implement the steps and gather feedback. You use the feedback to inform what you will develop in the future.</p>
<p>That way, everybody has a clear idea of what happens in development. You avoid wasteful discussions. And you keep backlog management to a minimum.</p>
<p>I've followed this approach many times. When everybody involved is on board, it works great. It makes development a joy. </p>
<p>And that's it.  </p>
<p>Sources:</p>
<p>[1] Ron Jeffries 3Cs: <a target="_blank" href="https://ronjeffries.com/articles/019-01ff/3cs-revisited/">https://ronjeffries.com/articles/019-01ff/3cs-revisited/</a></p>
<p>[2] Bill Wake on INVEST criteria: <a target="_blank" href="https://xp123.com/articles/invest-in-good-stories-and-smart-tasks/">https://xp123.com/articles/invest-in-good-stories-and-smart-tasks/</a></p>
<p><em>To <a target="_blank" href="https://skl.sh/2Cq497P">get the basics of agile software development right</a>, visit my online course. If you want to keep up with what I'm doing or drop me a note, follow me on <a target="_blank" href="https://dev.to/bertilmuth">dev.to</a>, <a target="_blank" href="https://www.linkedin.com/in/bertilmuth/">LinkedIn</a> or <a target="_blank" href="https://twitter.com/BertilMuth">Twitter</a>. Or visit my <a target="_blank" href="https://github.com/bertilmuth/requirementsascode">GitHub project</a>.</em></p>
 ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
