На грумінгу команда читає історію: «Як покупець, я хочу оплатити замовлення карткою, щоб отримати товар». Усі кивають, оцінка — п’ять балів, історія йде в спринт. Через два тижні тестувальник питає, що робити, якщо банк списав гроші, а магазин відповіді не дочекався. Відповіді немає ні в історії, ні в кого в голові.
User story і use case відповідають на різні питання. Історія говорить, кому й навіщо потрібна можливість, і залишається короткою: одна фраза плюс критерії приймання, які роблять її перевірюваною. Сценарій описує, як система поводиться крок за кроком, включно з усіма гілками, де щось іде не за планом. Вибір між ними вирішує не методологія команди, а кількість розвилок у задачі: чим їх більше і чим дорожча помилка в гілці, тим потрібніший сценарій.
Порівняльних таблиць із цієї теми багато. Тут підхід інший: одна й та сама вимога до оплати замовлення записана двома способами, і видно, що втрачає кожен запис.
Два записи — два різних питання
Формат історії «Як <роль>, я хочу <можливість>, щоб <цінність>» придумала у 2001 році команда лондонської компанії Connextra. Причина була практична: історії писали продажі та маркетинг, записували потрібну функцію, а розробникам потім доводилося шукати автора, щоб зрозуміти, для кого вона і навіщо. Шаблон змусив записувати «хто» і «навіщо» одразу.
Історія навмисно неповна. Вона — привід для розмови, а не специфікація. Перевірюваною її роблять критерії приймання: умови, за якими команда та замовник домовляються, що історію зроблено. Без них історія залишається побажанням.
Use case старший. Івар Якобсон представив його на конференції OOPSLA у 1987 році, а широко він поширився після книги 1992 року «Object-Oriented Software Engineering: A Use Case Driven Approach». Сценарій описує актора, його мету та кроки взаємодії із системою. Алістер Коберн у книзі «Writing Effective Use Cases» розділив його на основний успішний сценарій і розширення — гілки, де щось пішло інакше, — і радив перебирати ці гілки вичерпно.
Обидва записи можуть містити вимоги різного рівня — від бізнес-мети до поведінки екрана; як їх розрізняти, розібрано в статті чим бізнес-вимоги відрізняються від функціональних. І ще одна часта плутанина: діаграма варіантів використання в UML — не те саме, що текстовий use case. На діаграмі видно акторів і цілі, але не кроки; де вона стоїть серед інших нотацій, — у статті BPMN і UML: чим відрізняються.
А як сформулювати одну функціональну вимогу, щоб її зрозуміли однаково, — у статті функціональні вимоги: як писати, приклад і шаблон.
Одне завдання: оплата замовлення карткою
Інтернет-магазин, покупець оформив замовлення й платить карткою через зовнішній платіжний шлюз. Завдання виглядає простим, але розвилок у ньому багато. Картку можуть відхилити. Банк може запросити підтвердження, а покупець — його не пройти. Шлюз може не відповісти взагалі. А може відповісти пізніше, ніж магазин перестав чекати, — і тоді гроші списані, а замовлення висить неоплаченим.
Запишемо це завдання двічі.
Запис перший: історія з критеріями приймання
Історія. Як покупець, я хочу оплатити замовлення карткою, щоб отримати товар і не оформлювати замовлення заново, якщо оплата не пройшла з першого разу.
Друга половина фрази з’явилася не одразу. Її дало питання «навіщо»: покупець хоче не просто заплатити, а не втратити зібраний кошик. Це змінює поведінку системи в разі відмови.
Критерії приймання:
- Дано: замовлення оформлено, картка дійсна. Коли покупець підтверджує оплату, тоді замовлення отримує статус «Оплачено», а покупець бачить номер замовлення.
- Дано: банк відхилив картку. Коли покупець повертається до замовлення, тоді кошик і дані доставки збережено, і можна повторити оплату іншою карткою.
- Дано: банк запросив підтвердження. Коли покупець його не пройшов, тоді гроші не списані, замовлення залишається неоплаченим і доступним для повторної оплати.
Історія коротка, її легко оцінити й обговорити з власником продукту. Цінність — не втратити замовлення — видно в першому рядку.
Запис другий: сценарій з альтернативними потоками
Сценарій: Оплатити замовлення карткою. Актор: покупець. Мета: замовлення оплачено.
Основний потік:
- Покупець вибирає оплату карткою.
- Система передає суму й номер замовлення платіжному шлюзу.
- Покупець вводить дані картки на сторінці шлюзу.
- Шлюз підтверджує оплату.
- Система змінює статус замовлення на «Оплачено» і показує покупцеві номер замовлення.
Альтернативні потоки:
- 4а. Картку відхилено. Система показує причину відмови, замовлення залишається неоплаченим, покупець може вибрати іншу картку.
- 4б. Підтвердження не пройдено. Система не змінює статус замовлення й пропонує повторити оплату.
- 4в. Шлюз не відповів за відведений час. Система не скасовує замовлення, а позначає його «Очікує підтвердження оплати» й повторно запитує в шлюзу статус платежу.
- 4г. Шлюз підтвердив оплату після тайм-ауту. Система за повідомленням шлюзу переводить замовлення в «Оплачено». Якщо замовлення на цей момент уже скасовано — система запускає повернення грошей.
- 4д. Повідомлення про оплату надійшло двічі. Система обробляє його один раз і не створює другий платіж.
Що втратив кожен запис
Історія втратила гілки 4в, 4г і 4д. Це саме ті, де гроші й статус замовлення розходяться: покупець заплатив, а магазин цього не знає. Їх не видно з фрази «хочу оплатити замовлення карткою», і вони не спадають на думку на грумінгу. Спливають вони на тестуванні або в проді — у вигляді листа від покупця, у якого списали гроші двічі або не віддали замовлення.
Критерії приймання можна дописати, і хороша команда їх допише. Але формат історії не змушує шукати гілки. Він змушує відповісти «навіщо», а перебір відмов залишає на розсуд того, хто пише.
Сценарій втратив «навіщо». У ньому є кроки й відмови, але немає рядка, з якого випливає, що кошик потрібно зберегти. Без питання про цінність у гілці 4а легко написати «замовлення скасовується» — формально коректно, а покупець збирає кошик заново й іде. Сценарій відповідає, як система поводиться, але не перевіряє, чи потрібна користувачеві саме така поведінка.
Історія захищає від того, щоб побудувати не те. Сценарій — від того, щоб побудувати те, але з дірою в гілці, де зникають гроші.
Що писати у своєму завданні
Почніть із підрахунку розвилок. Один шлях, дві-три очевидні перевірки — історія з критеріями приймання закриває завдання повністю, сценарій буде бюрократією. Багато гілок, і кожна веде до різного стану грошей, даних або зобов’язань перед клієнтом — потрібен сценарій хоча б для цієї частини.
Найчастіше працюють обидва записи одразу. Історія заводить завдання в беклог і тримає розмову про цінність із бізнесом. Для ризикованої частини — оплата, повернення, інтеграції із зовнішніми системами — до неї додають сценарій з альтернативними потоками, і критерії приймання посилаються на його гілки. Так оцінка й тестування спираються на один перебір, а не на те, що кожен уявив собі сам.
Команда працює за Scrum — це не заборона на сценарії. Команда пише ТЗ — не заборона на історії. Форму запису обирають під завдання, а не під процес.
Як це звучить на співбесіді
У нашому банку питань із реальних співбесід ця тема трапляється 26 разів, і 16 із цих питань розмічені як junior. Це більше половини: різницю між історією та сценарієм запитують на вході в професію.
Слабка відповідь — переказ визначень: «user story — коротка, з Agile, use case — довгий і докладний». Правильно, але це переказ підручника, а не розуміння. Сильна відповідь показує, що ви бачите, що втрачає кожен запис. Історія тримає цінність, але пропускає гілки. Сценарій перебирає гілки, але не питає «навіщо». Далі — як ви обираєте: за кількістю розвилок і ціною помилки в них. Якщо є приклад із практики, де гілка спливла пізно, — це найкращий аргумент.
Потренуватися відповідати вголос
Бот ставить питання з реальних Middle-співбесід і розбирає відповіді — безкоштовно, без реєстрації.
Часті питання
Чим user story відрізняється від use case простими словами?
User story говорить, кому й навіщо потрібна можливість, і залишається короткою: одна фраза та критерії приймання. Use case описує, як система поводиться крок за кроком, включно з усіма гілками, де щось іде не за планом. Історія — про цінність, сценарій — про поведінку.
Що таке критерії приймання в user story?
Це умови, за якими команда та замовник домовляються, що історію зроблено. Без них історія залишається побажанням: її не можна перевірити. Критерії часто записують у формі «Дано — Коли — Тоді»: вихідний стан, дія, очікуваний результат.
Чи можна використовувати user story і use case в одному проєкті?
Так, і це звична практика. Історія заводить завдання в беклог і тримає розмову про цінність, а для ризикованої частини з багатьма розвилками — оплати, повернень, інтеграцій — до неї пишуть сценарій з альтернативними потоками.
Use case — це те саме, що діаграма варіантів використання?
Ні. Діаграма варіантів використання в UML показує, які актори з якими цілями працюють із системою, але кроків і гілок на ній не видно. Текстовий use case — це якраз кроки: основний потік і альтернативні.
Що вибрати аналітику: user story чи use case?
Порахуйте розвилки. Якщо у завдання один шлях і пара очевидних перевірок, вистачить історії з критеріями приймання. Якщо гілок багато і кожна веде до різного стану даних чи грошей, потрібен сценарій — хоча б для цієї частини завдання.
Джерела
- https://en.wikipedia.org/wiki/User_story
- https://www.mountaingoatsoftware.com/agile/why-the-three-part-user-story-template-works-so-well
- https://cucumber.io/blog/bdd/user-stories-are-not-the-same-as-features/
- https://www.ivarjacobson.com/publications/white-papers-articles/use-case-definition
- https://dl.acm.org/doi/pdf/10.1145/38807.38824
- https://dl.acm.org/doi/book/10.5555/993806
- https://www.amazon.com/Object-Oriented-Software-Engineering-Approach/dp/0201544350
- https://www.ifi.uzh.ch/dam/jcr:00000000-25a0-3d08-0000-00000ce96422/weuc_extract.pdf
- https://www.informit.com/store/writing-effective-use-cases-9780201702255




