惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

P
Privacy & Cybersecurity Law Blog
SecWiki News
SecWiki News
T
Troy Hunt's Blog
Y
Y Combinator Blog
V
V2EX
美团技术团队
Last Week in AI
Last Week in AI
S
Security @ Cisco Blogs
IT之家
IT之家
博客园_首页
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
阮一峰的网络日志
阮一峰的网络日志
AI
AI
罗磊的独立博客
人人都是产品经理
人人都是产品经理
H
Hacker News: Front Page
N
News and Events Feed by Topic
P
Privacy International News Feed
V2EX - 技术
V2EX - 技术
Recent Commits to openclaw:main
Recent Commits to openclaw:main
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
GbyAI
GbyAI
L
LINUX DO - 热门话题
C
Cybersecurity and Infrastructure Security Agency CISA
Microsoft Azure Blog
Microsoft Azure Blog
Martin Fowler
Martin Fowler
月光博客
月光博客
WordPress大学
WordPress大学
Latest news
Latest news
Google DeepMind News
Google DeepMind News
S
Schneier on Security
N
Netflix TechBlog - Medium
腾讯CDC
T
Tailwind CSS Blog
TaoSecurity Blog
TaoSecurity Blog
S
Secure Thoughts
L
LINUX DO - 最新话题
Project Zero
Project Zero
Cyberwarzone
Cyberwarzone
D
DataBreaches.Net
Webroot Blog
Webroot Blog
B
Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
S
SegmentFault 最新的问题
The GitHub Blog
The GitHub Blog
H
Help Net Security
L
LangChain Blog
A
Arctic Wolf
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
User Story: полный гайд по написанию без ошибок
sproshchaev · 2026-04-29 · via Все публикации подряд на Хабре

Уровень сложностиПростой

Время на прочтение9 мин

Охват и читатели486

Туториал

Материал подготовлен в рамках курса «Системный аналитик»

Всем привет, меня зовут Сергей Прощаев, и в этой статье я расскажу про то, как команды годами пишут «вроде бы одинаковые» User Story, но получают принципиально разный результат. Почему одни истории становятся фундаментом для качественного продукта, а другие — стартовым пистолетом для багов и бесконечных уточнений.

Я Tech Lead и руководитель направления Java | Kotlin разработки в FinTech, а также преподаю на курсах разработки и архитектуры в OTUS. Через мои руки прошли десятки проектов, и я точно знаю: корень большинства проблем не в кривых руках разработчиков, а в том, как была сформулирована пользовательская история. Точнее — как она не была сформулирована.

Мы разберём живые примеры, вспомним реальные кейсы, посмотрим на типичные грабли и соберём работающие Best Practices, которые применяют лучшие команды. И да, я покажу пару схем — они помогут увидеть систему, а не просто набор советов.

User Story — это не три строчки по шаблону

Шаблон все знают наизусть: «Как <роль>, я хочу <действие>, чтобы <ценность>». Загвоздка в том, что многие команды воспринимают его как ритуальную формулу: заполнил три поля — история готова. На деле эта конструкция лишь каркас. Настоящая User Story начинается с разговора.

Когда я только начинал работать с требованиями, я сам попадал в ловушку «идеальной формулировки». У нас была история:

«Как пользователь, я хочу видеть баланс, чтобы знать, сколько у меня денег».

Звучит отлично, правда? Мы реализовали за два дня. А через неделю получили шквал звонков от клиентов, которые пытались оплатить покупки, а терминал говорил «недостаточно средств». Оказалось, мы показали баланс «на счету», а не «доступный для трат». Разница — заблокированные суммы, pending‑транзакции, суточные лимиты. Всё это не было проговорено в критериях приёмки. Мы сделали ровно то, что написано, и получили ровно то, что не нужно бизнесу.

С тех пор я держу в голове правило: User Story — это обещание о будущем разговоре, а не техническое задание в миниатюре. И именно с этого понимания начинается путь к зрелым историям.

Типичные ошибки, которые переезжают из проекта в проект

Давайте разберем частые ошибки.

Ошибка 1. История без контекста. 

Команда получает: «Как пользователь, я хочу загрузить документы». Всё. Ни слова о том, зачем это нужно, какие форматы, есть ли ограничения по размеру, требуется ли предпросмотр, куда эти документы потом денутся. Разработчики дорисовывают картину сами, и в 90% случаев — мимо.

Как это выглядит с моей стороны: я открываю бэклог, вижу такую историю и понимаю, что прямо сейчас она непригодна для разработки. Она требует сессии груминга — и это не баг, а фича процесса. Но если история приходит на спринт в таком виде, то будет требовать доработок.

Ошибка 2. Гигантские истории, которые живут неделями. 

Видел историю «Как администратор, я хочу управлять пользователями» объёмом на весь спринт. В неё входило и изменение ролей, и просмотр логов, и массовые операции. В итоге она кочевала из спринта в спринт, никто не мог сказать, что именно «готово», а тестирование превращалось в хаос. При разделении на атомарные куски мы получили шесть историй, каждая из которых была закрыта за пару дней. Скорость поставки выросла, а ощущение контроля вернулось.

Ошибка 3. Отсутствие критериев приёмки. 

История: «Как клиент, я хочу восстановить пароль, чтобы войти в систему». Вроде понятно. Но что делать, если пользователь запросил сброс дважды? Как долго живёт ссылка? Инвалидируется ли предыдущий токен? Если эти вопросы не снять на этапе написания истории, они вылезут в продакшене. Я требую, чтобы каждая история имела Acceptance Criteria, записанные в формате Given/When/Then.

Ошибка 4. Желание уместить всё в одну историю ради «полной ценности для пользователя».

Звучит благородно, но приводит к тому, что история становится неподъёмной и непроверяемой. Я за вертикальные срезы, но тонкие. Лучше три истории на один экран, чем одна — на три экрана.

Ошибка 5. Игнорирование нефункциональных требований. 

История «Как пользователь, я хочу войти в систему» умалчивает, что вход должен происходить не дольше 1 секунды, а пароли храниться в хэшированном виде. Я всегда дополняю такие истории нефункциональными «рамками», иначе мы сдадим красивый фасад, за которым прячутся долгий ответ и дыра в безопасности.

Вот тут наглядно помогают схемы — они дисциплинируют мышление. Я подготовил первую: она показывает, как сырая идея превращается в зрелую User Story через серию уточняющих шагов (рис. 1).

Рис 1. Процесс уточнения User Story от идеи до готового элемента бэклога

Рис 1. Процесс уточнения User Story от идеи до готового элемента бэклога

Любая User Story начинается не с шаблона, а с сырой идеи, которую кто‑то принёс. Первый же вопрос, который я задаю себе или продакту: «Понятна ли ценность?» Если нет — не иду дальше, пока не выясню «Зачем? Кто? Почему?». Потому что без ответа на эти три вопроса история рискует оказаться решением несуществующей проблемы.

Как только с ценностью разобрались — формулируем классическую тройку «Как, Я хочу, Чтобы». Но даже после этого я не даю истории зелёный свет. Следующий жёсткий фильтр — INVEST. Проверяем: независима ли она от других, обсуждаема ли (а не жёсткая инструкция), ценна ли сама по себе, можно ли её оценить, достаточно ли она мала и, главное, тестируема ли. Если история не проходит — значит, ей нужна декомпозиция или уточнение: разбить на более мелкие, докрутить формулировку, закрыть пробелы. И только после повторной проверки мы идём дальше.

Когда INVEST пройден, наступает этап, который пропускают чаще всего: явное определение Acceptance Criteria в формате Given/When/Then и добавление нефункциональных требований — производительность, безопасность, ограничения. Только после этого история попадает в бэклог как «готовая». Схема — это не бюрократия, а страховка от иллюзии понятности. Она заставляет остановиться и задать нужные вопросы до того, как разработчик напишет первую строчку кода.

Best Practices, которые я подсмотрел у сильных команд

Я много общаюсь с коллегами из других компаний, смотрю, как устроены процессы на курсах OTUS, и собираю практики, которые реально работают.

  1. Три амиго (Three Amigos). Перед взятием истории в спринт аналитик, разработчик и тестировщик вместе за 10–15 минут проходят по ней и синхронизируют понимание. Это убирает эффект «я думал, ты другое имел в виду». Я внедрял такую практику в одной финтех‑команде, и количество дефектов, связанных с недопониманием требований, упало примерно на 40% за три месяца.

  2. Спецификация по примерам (Specification by Example). Чем сложнее логика, тем полезнее прямо в критериях приёмки привести конкретный пример данных на входе и ожидаемый результат. Например, не просто «система отклоняет перевод при превышении лимита», а «клиент с дневным лимитом 100 000 ₽ пытается отправить 101 000 ₽, система показывает ошибку „Превышен суточный лимит“„. Это разом снимает споры „а какой именно лимит, а какая ошибка“.“»

  3. INVEST как фильтр, а не как ритуал. Я применяю его неформально. Independent? Если две истории жёстко связаны, я не буду их насильно разделять, но пойму, что это риск. Negotiable? История не должна читаться как готовая инструкция к реализации — оставьте разработчику пространство для решений. Valuable — самый частый провал: если ценность нельзя объяснить одной фразой, историю нужно переписать.

  4. DoR (Definition of Ready). В ряде команд я настоял на простом чек‑листе: перед тем как история попадёт в спринт, у неё должны быть заголовок, роль, действие, ценность, Acceptance Criteria, оценка, отсутствие внешних блокировок. Это дисциплинирует, и со временем перестаёт быть бюрократией и становится привычкой.

Урок, который стоил денег: реальная история

В 2012 году компания BBC понесла серьёзные репутационные и финансовые потери из‑за провала проекта Digital Media Initiative (DMI). Это была амбициозная программа по созданию единой платформы для управления всем медиаконтентом: от съёмок до архива. Бюджет превысил 100 миллионов фунтов, проект закрыли, не получив работающей системы.

В независимом отчёте (National Audit Office, 2014) среди ключевых причин назывались: отсутствие чётких приоритетов, размытые требования и слабая связь между бизнес‑целями и тем, что реально разрабатывалось. Другими словами, команда годами реализовывала «истории», которые были слишком большими, не имели проверяемых критериев успеха и не подвергались жёсткой приоритизации. Это классическая ловушка «мы пишем User Story, но не проверяем, приносят ли они ценность прямо сейчас».

После краха DMI BBC кардинально пересмотрела подход к управлению требованиями: в новых программах внедрили строгие стандарты приёмки, сократили длительность циклов обратной связи и перешли к поставке маленькими вертикальными срезами с обязательным подтверждением бизнес‑результата на каждом этапе. Это не спасло прошлые деньги, но уберегло следующие проекты.

Я вспоминаю эту историю каждый раз, когда слышу аргумент «давайте просто закодим, а требования додумаем». Недодуманная User Story может стать первой костяшкой в домино, которое обрушит весь проект.

Как выглядит зрелая User Story: живой пример

Приведу пример истории, которую как‑то обсуждал с командой, но в обезличенном виде:

Заголовок: Просмотр доступного баланса с учётом холдов.

Формулировка:
Как клиент интернет‑банка,
Я хочу видеть доступный баланс, уменьшенный на сумму заблокированных средств,
Чтобы понимать реальную сумму, которой могу распорядиться для платежей и переводов.

Критерии приёмки:

AC1: отображение доступного баланса при нулевых холдах.
Дано: у клиента баланс 50 000 ₽, нет заблокированных средств.
Когда: он открывает главный экран.
Тогда: отображается сумма «Доступно 50 000,00 ₽».

AC2: отображение с учётом заблокированной суммы.
Дано: баланс 50 000 ₽, есть холд на 12 000 ₽.
Когда: клиент открывает главный экран.
Тогда: отображается «Доступно 38 000,00 ₽», а также показывается пояснение. «Заблокировано 12 000,00 ₽».

AC3: обновление холдов в реальном времени.
Дано: холд снят (например, покупка отменена).
Когда: клиент тянет экран вниз для обновления.
Тогда: доступный баланс увеличивается на сумму снятого холда в течение 2 секунд.

Нефункциональные требования:

  • Загрузка данных не должна превышать 1 секунду (p95).

  • Не кешировать данные более 30 секунд, чтобы не вводить клиента в заблуждение.

Видите разницу? Здесь не осталось пространства для интерпретаций. Разработчик понимает, ЧТО делать, тестировщик — КАК проверять, владелец продукта — КАКУЮ ценность мы поставим. Именно такие истории я называю «зрелыми».

Вторая схема, которую я хочу показать, отражает мышление, которое помогает писать истории именно такого качества.

Рис 2. Принципиальная схема зрелой User Story

Рис 2. Принципиальная схема зрелой User Story

На схеме видно, что зрелая история — это не только шаблон «Как, Я хочу, Чтобы», но ещё три обязательных слоя: проверка по INVEST, критерии приёмки с примерами и нефункциональные требования. Если хотя бы один слой отсутствует, история незрелая!

Заключение: не пишите «правильные» истории — создавайте зрелые

За годы работы я перестал гоняться за идеальной формулировкой. Вместо этого я гоняюсь за пониманием. Можно написать историю кривовато, но если после пяти минут разговора вся команда синхронизировалась — она работает. Можно написать красиво, но если каждый прочитал своё — это брак, который проявится слишком поздно.

Типичные ошибки, которые мы разобрали, я коллекционировал на реальных проектах. Они не исчезают сами собой — их нужно высматривать и вычищать. Best Practices работают только тогда, когда становятся привычкой. А привычка формируется через осознанную практику и обратную связь.

Если эта тема для вас актуальна и вы хотите не просто почитать, а системно прокачать навык работы с требованиями, приглашаю вас на открытые уроки в OTUS. Они пройдут в рамках курса «Системный аналитик». Мы разберём живые кейсы и покажем, как выстроить процесс, который не оставляет места для «я думал, вы другое имели в виду».

  • 5 мая в 20:00. «Как не допустить ошибок при написании пользовательских историй?». Записаться

  • 13 мая в 18:00. «Обзор нотации BPMN 2.0». Записаться

  • 19 мая в 20:00. «Диаграмма последовательности — швейцарский нож системного аналитика». Записаться

Участие бесплатное, нужно только зарегистрироваться.