Глава 6

Требования к продукту

Как формулировать требования, техническое задание, приоритизация функций

15 мин чтения
ТЗтребованияприоритеты
Интерактивный контент

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

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

От проблемы к решению

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

Этот мост строится через пользовательские сценарии — описания того, как человек взаимодействует с продуктом для достижения своей цели. Сценарий начинается с намерения пользователя и заканчивается результатом. Между ними располагается последовательность шагов, которые человек совершает, и реакций, которые он получает от системы. Хороший сценарий написан с точки зрения пользователя, а не системы: он описывает, что человек делает и видит, а не как это реализовано технически.

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

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

Пользовательские истории

Пользовательская история представляет собой компактный формат описания функциональности с точки зрения пользователя. Классическая формула звучит обманчиво просто: «Как [роль], я хочу [действие], чтобы [цель]». Три элемента, одно предложение. Но за этой кажущейся простотой скрывается глубокая логика, которая делает пользовательские истории одним из самых мощных инструментов продуктовой работы.

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

Указание роли напоминает, для кого создаётся функция. У разных пользователей разные потребности, и функция, которая кажется очевидной для одной роли, может быть бессмысленной или даже вредной для другой. Администратор магазина хочет видеть детальную статистику, а курьер хочет видеть только то, что нужно для выполнения текущего заказа — перегруженность информацией будет ему мешать. Явное указание роли заставляет задуматься: для кого мы это делаем и почему именно этому человеку это нужно?

Описание действия фиксирует, что именно человек хочет сделать. Важно формулировать действие на языке пользователя, а не на языке системы. «Фильтровать товары по размеру» — это действие пользователя. «Применить параметр size к запросу в базу данных» — это техническая реализация, которой не место в пользовательской истории.

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

Размер пользовательской истории — отдельное искусство, которое приходит с опытом. Слишком крупная история — «как покупатель, я хочу купить товар» — охватывает огромный функционал и не даёт конкретики. Это не история, а эпопея, которую невозможно оценить, спланировать и реализовать как единое целое. Слишком мелкая история — «как покупатель, я хочу видеть кнопку зелёного цвета» — уходит в детали реализации и теряет связь с ценностью для пользователя. Зелёный цвет кнопки сам по себе не несёт ценности; он может быть частью более крупного решения, но не самостоятельной историей.

Хорошая пользовательская история описывает законченный кусок ценности, который можно реализовать за обозримое время — обычно от нескольких дней до пары недель работы команды. После реализации истории пользователь должен получить что-то новое и полезное, даже если это что-то небольшое. Именно этот критерий — законченность ценности — помогает определить правильный размер истории.

Сценарии использования

Если пользовательская история — это заголовок, то сценарий использования — это развёрнутый текст. Сценарий описывает полную последовательность взаимодействия пользователя с системой для достижения определённой цели, включая все повороты сюжета, которые могут произойти по пути.

Типичный сценарий включает несколько структурных элементов, каждый из которых выполняет важную функцию. Название даёт краткое описание того, что происходит, — это заголовок сценария, по которому можно быстро понять его суть. Действующее лицо определяет, кто выполняет сценарий, — это должен быть конкретный персонаж или роль, а не абстрактный «пользователь». Предусловия фиксируют, что должно быть истинно до начала сценария, — какое состояние системы и пользователя мы предполагаем. Основной поток описывает пошаговую последовательность нормального хода событий — так называемый «happy path», когда всё идёт по плану. Альтернативные потоки описывают, что происходит при отклонениях от основного пути — ошибки, исключения, нестандартные ситуации. Постусловия определяют, что должно быть истинно после успешного завершения сценария — какой результат мы гарантируем.

Разберём конкретный пример сценария оформления заказа в интернет-магазине, чтобы увидеть, как все эти элементы работают вместе.

Название сценария: оформление заказа с доставкой. Действующее лицо: покупатель, зарегистрированный в системе. Предусловия: в корзине покупателя находится хотя бы один товар, покупатель авторизован и находится на странице корзины.

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

Но основной поток — это идеальный мир, который редко существует в реальности. Альтернативные потоки описывают все возможные отклонения. Первый альтернативный поток: товар закончился. На этапе проверки наличия система обнаруживает, что один из товаров в корзине больше не доступен. Система показывает сообщение с объяснением ситуации и предлагает три варианта: удалить товар из корзины, выбрать аналогичный товар или подождать поступления. Покупатель принимает решение, и сценарий продолжается с обновлённой корзиной.

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

Третий альтернативный поток: адрес вне зоны доставки. Введённый адрес находится в регионе, куда доставка невозможна или слишком дорога. Система объясняет ограничение и предлагает альтернативы: самовывоз из ближайшего пункта, доставка в пункт выдачи, изменение адреса.

Постусловия для успешного завершения сценария: заказ создан в системе и имеет уникальный номер, товары зарезервированы на складе, покупатель получил подтверждение по электронной почте и на экране, платёж инициирован или запланирован.

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

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

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

Функциональное требование — это утверждение о поведении системы, сформулированное чётко и однозначно, так чтобы можно было проверить, выполнено оно или нет. Это не пожелание, не направление движения, не описание идеального состояния — это конкретное, измеримое обязательство.

Рассмотрим несколько примеров функциональных требований для интернет-магазина. Система должна позволять фильтровать товары по категории, цене, размеру и цвету одновременно, с возможностью выбора нескольких значений для каждого параметра. При оформлении заказа система должна проверять наличие товаров на складе в реальном времени и блокировать оформление, если какой-либо товар закончился. Система должна отправлять письмо с подтверждением заказа в течение одной минуты после его создания на адрес электронной почты, указанный в профиле покупателя. Пользователь должен иметь возможность отменить заказ без объяснения причин в течение двух часов после его создания, если заказ ещё не передан в службу доставки.

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

Требования естественным образом возникают из сценариев. Каждый шаг сценария может порождать одно или несколько требований. Каждый альтернативный поток — тоже. Систематическая работа со сценариями, последовательный анализ каждого шага и каждой возможной ситуации помогает не упустить требования и создать полную картину того, что должна уметь система.

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

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

Помимо того, что система делает, критически важно определить, как она это делает. Нефункциональные требования описывают качественные характеристики продукта: производительность, безопасность, надёжность, удобство использования, совместимость с различными платформами и устройствами. Эти требования часто называют «-ilities» в английской терминологии — reliability, availability, scalability, security — и они определяют разницу между системой, которая формально работает, и системой, которой приятно пользоваться.

Требования к производительности определяют, насколько быстро система должна работать в различных условиях. Страница каталога должна загружаться не дольше двух секунд на соединении со скоростью 10 мегабит в секунду. Система должна обрабатывать не менее ста заказов в минуту в периоды пиковой нагрузки, включая распродажи и праздничные дни. Поиск по каталогу из ста тысяч товаров должен возвращать результаты не дольше чем за полсекунды. Эти цифры не берутся с потолка — они основаны на исследованиях пользовательского опыта и конкурентном анализе. Известно, что задержка более трёх секунд приводит к уходу значительной части посетителей, поэтому требование в две секунды оставляет запас безопасности.

Требования к надёжности определяют, как система должна вести себя при сбоях и какой уровень доступности она обеспечивает. Система должна быть доступна не менее 99,9 процента времени, что соответствует примерно восьми часам простоя в год. При сбое платёжной системы заказ должен сохраняться как черновик, чтобы пользователь мог завершить оформление позже без потери данных. Данные должны резервироваться каждые шесть часов с возможностью восстановления за последние тридцать дней. При отказе основного сервера система должна автоматически переключаться на резервный в течение пяти минут.

Требования к безопасности определяют, как защищаются данные и доступ к системе. Пароли пользователей должны храниться в виде криптографических хешей с использованием современных алгоритмов. Платёжные данные не должны сохраняться на серверах системы; обработка платежей должна происходить на стороне сертифицированного платёжного провайдера. Доступ к административным функциям должен требовать двухфакторной аутентификации. Все соединения между клиентом и сервером должны быть зашифрованы с использованием TLS. Система должна вести журнал всех операций с персональными данными для целей аудита.

Требования к совместимости определяют, в каких средах должен работать продукт. Веб-сайт должен корректно отображаться и функционировать в последних двух версиях браузеров Chrome, Firefox, Safari и Edge. Мобильная версия должна работать на устройствах с размером экрана от пяти дюймов и поддерживать операционные системы iOS 14 и выше, Android 10 и выше. При отсутствии интернет-соединения мобильное приложение должно показывать ранее загруженные данные и сохранять действия пользователя для синхронизации при восстановлении связи.

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

Приоритизация требований

Одна из самых сложных истин продуктовой разработки состоит в том, что требований всегда больше, чем ресурсов. Каждый заинтересованный участник хочет добавить что-то своё, каждый пользователь мечтает об идеальном продукте, каждый конкурент давит необходимостью соответствовать рынку. Если попытаться реализовать всё и сразу, проект либо никогда не закончится, либо закончится посредственным продуктом, в котором ничего не сделано хорошо.

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

Один из распространённых методов приоритизации — классификация MoSCoW, названная по первым буквам четырёх категорий. Must have — обязательно: без этого продукт не имеет смысла, запуск невозможен. Если интернет-магазин не позволяет добавлять товары в корзину и оформлять заказ, это не интернет-магазин. Should have — важно: существенно повышает ценность продукта и должно быть сделано, но можно отложить на следующую версию после запуска. Фильтрация товаров по параметрам важна, но магазин может работать и без неё на первых порах. Could have — желательно: было бы хорошо иметь, но не критично для основной функциональности. Рекомендации похожих товаров улучшают пользовательский опыт, но их отсутствие не делает продукт непригодным. Won't have this time — не сейчас: идеи, которые могут быть рассмотрены в будущем, но сознательно исключены из текущей версии. Интеграция с социальными сетями, программа лояльности, мобильное приложение — всё это может подождать.

Распределение требований по категориям требует честности и дисциплины. Соблазн записать всё в категорию Must have огромен — ведь кажется, что всё важно и всё нужно. Но если всё обязательно, значит, ничто не является приоритетом. Приоритизация работает только тогда, когда категории используются честно и в первую категорию попадает действительно необходимый минимум.

Полезный мысленный эксперимент для проверки приоритетов: представьте, что бюджет внезапно сократился вдвое. Какие требования останутся? Это и есть настоящие приоритеты. Или: продукт нужно запустить не через полгода, а через два месяца. Что войдёт в эту версию? Эти жёсткие ограничения заставляют отбросить иллюзии и увидеть истинную важность каждого требования.

Другой подход к приоритизации основан на оценке по двум параметрам: влияние и усилия. Влияние — насколько сильно требование повлияет на ценность продукта для пользователей или для бизнеса. Фильтрация товаров имеет высокое влияние, потому что помогает пользователям находить то, что им нужно, и увеличивает конверсию в покупки. Усилия — сколько времени и ресурсов потребует реализация. Простой фильтр по цене требует небольших усилий, сложная система рекомендаций на основе машинного обучения — огромных.

Когда требования размещены на матрице влияние-усилия, приоритеты становятся очевидными. Требования с высоким влиянием и низкими усилиями — «быстрые победы», очевидные кандидаты на первую очередь. Требования с высоким влиянием и высокими усилиями — стратегические инвестиции, которые нужно планировать и выполнять постепенно. Требования с низким влиянием и низкими усилиями — мелочи, которые можно добавить, когда будет время. Требования с низким влиянием и высокими усилиями — кандидаты на отказ или радикальное переосмысление.

Техническое задание

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

Хорошее техническое задание начинается с введения, которое описывает контекст проекта: какую проблему решаем, для кого создаём продукт, какие бизнес-цели преследуем. Введение помогает исполнителю понять общую картину и принимать правильные решения в ситуациях, не описанных явно. Если исполнитель понимает, что цель проекта — увеличить конверсию интернет-магазина, он будет принимать решения, способствующие этой цели, а не просто формально выполнять букву требований.

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

Раздел функциональных требований перечисляет все функции продукта, структурированные логичным образом — по модулям системы, по ролям пользователей или по сценариям использования. Каждое требование имеет уникальный идентификатор, который позволяет ссылаться на него в других документах: в плане тестирования, в протоколах приёмки, в договорах на поддержку. Идентификаторы обычно имеют вид FR-001, FR-002 и так далее, где FR означает Functional Requirement.

Раздел нефункциональных требований описывает производительность, безопасность, надёжность, совместимость и другие качественные характеристики. Эти требования часто сложнее формулировать и проверять, чем функциональные, но их важность от этого не уменьшается.

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

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

Раздел ограничений и допущений фиксирует рамки проекта: что не входит в объём работ, какие предположения приняты, какие решения остаются на усмотрение исполнителя. Явная фиксация того, что не будет сделано, не менее важна, чем описание того, что будет. Она предотвращает ложные ожидания и споры при приёмке.

Глоссарий определяет термины, используемые в документе. Это особенно важно для проектов в специфических предметных областях — медицина, финансы, логистика — где одно и то же слово может иметь разные значения в разных контекстах. Если в документе используется термин «SKU», глоссарий объясняет, что это Stock Keeping Unit, уникальный идентификатор товарной позиции в системе учёта.

Типичные проблемы требований

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

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

Неоднозначность возникает, когда требования можно понять по-разному. «Система должна быстро обрабатывать запросы» — классический пример неоднозначного требования. Быстро — это сколько? Секунда, десять секунд, минута? Какие запросы — все или только определённые типы? При какой нагрузке — при обычной или при пиковой? Для кого быстро — для пользователя с хорошим интернетом в Москве или для пользователя с мобильным интернетом в деревне? Каждое слово, которое можно интерпретировать по-разному, должно быть уточнено. «Быстро», «удобно», «надёжно», «безопасно», «просто» — все эти слова требуют конкретизации.

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

Чрезмерная детализация — ошибка, противоположная неполноте. Требования описывают не что должно быть сделано, а как именно это сделать, вплоть до мельчайших деталей реализации. «Кнопка должна быть размером 100 на 40 пикселей, зелёного цвета с HEX-кодом #4CAF50, с закруглёнными углами радиусом 5 пикселей, с тенью 2 пикселя» — это не требование к продукту, а спецификация дизайна. Требования такого уровня детализации лишают исполнителя возможности применить профессиональные знания и найти лучшее решение. Они также становятся бременем при необходимости изменений — каждая мелочь требует формального согласования.

Отсутствие приоритетов — ситуация, когда все требования выглядят одинаково важными. Они записаны одним списком, без разделения на обязательные и желательные, без указания порядка реализации. В реальности это никогда не так — какие-то требования критичны для запуска, какие-то можно отложить, какие-то вообще не нужны. Отсутствие явных приоритетов приводит к тому, что исполнитель расставляет их сам, исходя из технического удобства или собственного понимания важности. И не факт, что его понимание совпадает с пониманием заказчика.

Эволюция требований

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

Это нормально и неизбежно, но требует управления. Неконтролируемые изменения требований — одна из главных причин провала программных проектов. Явление, когда объём работ постоянно растёт за счёт добавления новых требований, получило название «scope creep» или расползание границ. Оно начинается невинно: «давайте добавим ещё одну маленькую функцию», «пользователи просят эту возможность», «конкуренты уже это сделали». Каждое отдельное дополнение кажется разумным и небольшим. Но вместе они превращают проект в бесконечную стройку, которая никогда не заканчивается. Сроки срываются, бюджет превышается, команда выгорает, все участники разочарованы.

Как управлять изменениями требований, не превращаясь в бюрократическую машину, которая месяцами согласовывает каждую мелочь? Первый принцип — фиксировать базовую версию требований. Это то, на что все согласились в начале проекта или итерации. Базовая версия — точка отсчёта. Любое отклонение от неё — это изменение, которое требует явного решения, а не тихое добавление «по ходу дела».

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

Третий принцип — принимать решения осознанно. Добавить требование — значит либо увеличить бюджет и сроки, либо убрать что-то другое из плана, либо сознательно пойти на риск превышения. Бесплатных изменений не бывает, и иллюзия того, что можно добавить функциональность без последствий, ведёт к катастрофе. Заказчик должен понимать это и принимать решения с открытыми глазами: «да, мы добавляем эту функцию, и это означает, что запуск сдвигается на месяц» или «да, мы добавляем эту функцию вместо той, которая была в плане».

Четвёртый принцип — документировать изменения. История изменений помогает понять, как проект эволюционировал и почему текущая версия требований выглядит именно так. Через полгода никто не вспомнит, почему было решено отказаться от определённой функции или добавить определённое ограничение. Документированная история сохраняет это знание и предотвращает повторение прошлых ошибок.

Работа с исполнителем

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

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

Не стоит ожидать, что исполнитель угадает невысказанное. Если что-то важно для заказчика, это должно быть написано в требованиях. Если что-то кажется очевидным заказчику, это не значит, что оно очевидно исполнителю — у них разный опыт, разный контекст, разные предположения по умолчанию. «Мы думали, это само собой разумеется» — одна из самых частых и самых бесполезных фраз в проектных спорах. Явное всегда лучше неявного.

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

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

Резюме главы

Пользовательские сценарии и требования — это мост между пониманием проблемы и созданием решения. Они переводят знания о пользователях и их потребностях на язык конкретных спецификаций, по которым можно проектировать, разрабатывать и тестировать продукт.

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

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

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

Приоритизация определяет, что делается в первую очередь, что откладывается, а что не делается вообще. Не все требования одинаково важны, и честное ранжирование — необходимое условие реалистичного планирования.

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

Требования неизбежно эволюционируют, и этой эволюцией нужно управлять. Фиксация базовой версии, оценка влияния изменений, осознанное принятие решений и документирование истории — ключевые практики управления изменениями.

Ключевые тезисы главы
  • Требования — это мост между проблемой пользователя и техническим решением; они фиксируют что должна делать система
  • Пользовательские истории (формат «Как [роль], я хочу [действие], чтобы [цель]») и сценарии использования помогают формулировать требования с точки зрения пользователя
  • Функциональные требования описывают поведение системы, нефункциональные — производительность, безопасность, надёжность и совместимость
  • Приоритизация требований (MoSCoW, матрица влияние-усилия) необходима для фокусировки на главном при ограниченных ресурсах
  • Техническое задание — юридический документ, который должен быть полным, однозначным и проверяемым

В следующей главе мы перейдём к проектированию пользовательского опыта и рассмотрим, как превратить требования в интерфейс, с которым удобно и приятно работать.