Практическое руководство для аналитиков, архитекторов и тех, кому «навязали требования»
Что такое требования на самом деле
В большинстве проектов требования выглядят примерно одинаково: страница в Confluence с нумерованным списком, колонка в Jira или PDF-документ с печатью и подписями. Формально всё есть. На практике проект всё равно превращается в бесконечные правки, споры и «мы это не так поняли».
Причина почти всегда одна: требования воспринимают как текст, а не как систему ограничений. Пока требования — это просто слова на странице, они не управляют проектом. Проект управляет ими.
Работа с требованиями — это междисциплинарная функция, которая связывает заказчика (или приобретателя) и поставщика. Она включает выявление, анализ, формализацию, проверку, коммуникацию, документирование и управление требованиями. Результат — иерархия требований, которая даёт всем сторонам общее понимание, проверяется на соответствие реальным нуждам, может быть реализована и служит основой для верификации дизайна и приёмки решения.
Хорошие требования выполняют три задачи одновременно. Во-первых, они сужают пространство решений — команда знает, куда можно, а куда нельзя. Во-вторых, фиксируют договорённости — нет «я имел в виду». В-третьих, дают возможность проверить результат — выполнено или нет. Если хотя бы одна функция не работает, требование бесполезно.
Представьте локальную библиотеку книг. Заказчик говорит: «Система должна быть удобной и быстрой». Это звучит разумно, но это не требование. Это цель. Пока нет ответа на вопросы «удобной для кого?», «в каких сценариях?», «как измерить?», требования не существует.
Самое простое правило, которое спасает проекты: если нельзя объяснить, как проверить требование — его нет. Сравните: «Система должна быстро искать книги» и «При коллекции 500 000 книг поиск по автору, названию или серии возвращает результат за ≤ 500 мс». Второй вариант — инструмент, которым можно управлять.
Ещё одна частая ошибка — склеивать несколько мыслей в одно требование: «Система должна хранить книги, обеспечивать быстрый поиск и быть безопасной». Это три разных требования с разными рисками и проверками. Разделяйте — иначе невозможно приоритизировать и проверить.
Даже идеальные отдельные пункты не спасут проект, если они противоречат друг другу, не укладываются в сроки или бюджет, нет связей между ними. Требования эффективны только когда есть границы, приоритеты и зависимости. Без этого начинается знакомое «давайте просто ещё чуть-чуть добавим».
Проект развивается — появляются ограничения архитектуры, новые риски, меняются приоритеты бизнеса. Изменения неизбежны. Хаос — нет, если требования структурированы.
Бизнес-цели, нужды стейкхолдеров и требования: где граница
На старте любого проекта всегда есть три слоя информации.
Бизнес-цели — зачем проект нужен вообще. Это верхний уровень, который задаёт направление. Пример: «Создать офлайн-библиотеку на 500 000 книг, чтобы не зависеть от внешних сервисов и сэкономить трафик».
Нужды стейкхолдеров (stakeholder requirements) — что хотят все заинтересованные стороны: пользователи, заказчики, администраторы, служба безопасности, регуляторы. Сюда входят пользовательские требования (нужды конечных пользователей, обычно в формате «Я как [роль] хочу [действие], чтобы [польза]»), а также требования бизнеса, эксплуатации, безопасности и compliance.
Стейкхолдеры бывают разные. Минимум — пользователи и заказчик (они могут не совпадать). В сложных проектах добавляются разработчики, операторы и регуляторы.
Пример нужды стейкхолдера: «Я как читатель хочу искать по серии, чтобы быстро найти продолжение». Пример от другого стейкхолдера: «Я как администратор хочу, чтобы система работала на моём NAS без внешнего доступа».
Третий слой — требования (system/software requirements) — это уже технические, проверяемые формулировки, которые напрямую идут в реализацию. Они отвечают на вопрос «что именно должна делать система или программа» и «как хорошо она должна это делать». Это уровень, где всё становится конкретным: условия, метрики, границы, ID.
Пример требования: «Система должна возвращать результаты поиска по автору, названию и серии за ≤ 500 мс при коллекции до 500 000 книг и нагрузке до 100 одновременных запросов».
Почему третий слой называем «техническими», а не «функциональными»
Слово «функциональные» легко вводит в заблуждение. Многие думают, что «функциональные требования» — это только «что делает система» (поиск, чтение, скачивание). На самом деле третий слой включает оба типа:
- функциональные — что делает система (какие функции, сценарии, поведение),
- нефункциональные — как хорошо она это делает (производительность, безопасность, масштабируемость, удобство и т.д.).
Поэтому удобнее называть их техническими требованиями — это сразу даёт понять, что здесь уже не «я хочу», а конкретные спецификации, которые идут разработчикам и тестировщикам.
В нашей библиотеке на этом уровне появляются:
- функциональное: «Читалка должна отображать EPUB и FB2 с закладками и сменой шрифта».
- нефункциональное: «Поиск должен работать за ≤ 500 мс при 500k книг».
Граница между слоями — в уровне конкретики, проверяемости и ответственности.
Бизнес-цели и нужды стейкхолдеров — это сырьё. Они важны, но их нельзя сразу записывать как требования. Если сделать это — получим список пожеланий, который невозможно приоритизировать, проверить и реализовать в срок.
Формулировка требований начинается с первоначальных намерений стейкхолдеров (целей, ожиданий). Эти намерения ещё не требования — они часто неопределённые, неанализированные, могут конфликтовать или быть невыполнимыми.
Как перейти от нужд стейкхолдеров к требованиям (третьему слою)
- Соберите сырьё Проведите интервью, опросы, воркшопы. Запишите всё в формате «Я как [роль] хочу [действие], чтобы [польза]». Пример: «Я как читатель хочу искать по серии, чтобы быстро найти продолжение».
- Уточните и приоритизируйте Задайте вопросы: кто именно? в каком сценарии? насколько критично? как измерить успех? Пример: выясняется, что 80 % пользователей ищут по автору и названию, серия — на третьем месте.
- Сформулируйте как проверяемое требование Добавьте условия, метрики, границы. Присвойте ID. Пример: SYS.SEARCH.001 «Система должна возвращать результаты поиска по автору, названию и серии за ≤ 500 мс при коллекции до 500 000 книг».
Теперь это третий слой: требование готово к оценке, реализации и проверке.
Типичные ошибки на этом этапе
- Записывать нужды стейкхолдеров 1:1 как требования. Результат — 300 пунктов, из которых 200 никогда не реализуют.
- Игнорировать бизнес-цели. Результат — красивая система, которая не решает задачу.
- Смешивать уровни. «Я как читатель хочу MeiliSearch» — это уже решение, а не требование.
Практический совет
На старте проекта выделите три слоя явно:
- Бизнес-цели — 3–5 пунктов, зачем проект нужен.
- Нужды стейкхолдеров — включая пользовательские требования (50–200 записей).
- Технические требования — только то, что прошло анализ и проверку (обычно 50–150 пунктов с ID).
Между слоями — трассировка. Это позволит всегда ответить на вопрос «зачем мы это делаем?» и быстро отсечь лишнее.
В нашей библиотеке такой подход помог от «хочу всё и сразу» перейти к реалистичному набору требований, которые мы смогли оценить и реализовать.
Как формулировать требования, чтобы их можно было проверить
Самая большая боль в проектах — требования, которые звучат хорошо, но проверить их невозможно. «Удобный интерфейс», «быстрая работа», «надёжная система» — классика, которая гарантирует споры на приёмке.
Правило простое: требование должно быть проверяемым. Если неясно, как именно убедиться, что оно выполнено — это не требование.
Что делает требование проверяемым
- Конкретные условия — кто, когда, в каком сценарии.
- Измеримые метрики — числа, проценты, время.
- Чёткие границы — при какой нагрузке, на каком оборудовании, для каких данных.
Сравнение плохих и хороших формулировок
| Плохое (непроверяемое) | Хорошее (проверяемое) |
|---|---|
| «Поиск должен быть быстрым» | «Поиск по автору, названию или серии возвращает результат за ≤ 500 мс при коллекции 500 000 книг» |
| «Интерфейс должен быть удобным» | «95 % пользователей из целевой группы находят нужную книгу за ≤ 3 клика (по результатам usability-теста)» |
| «Система должна быть надёжной» | «Система должна работать без падений ≥ 99,9 % времени в месяц при стандартной нагрузке» |
| «Поддержка всех форматов книг» | «Система должна открывать и отображать книги в форматах EPUB 2/3, FB2 и PDF без ошибок» |
Как добиться проверяемости на практике
- Задавайте вопросы к каждой формулировке: как именно измерить успех? Какие условия должны быть выполнены? Кто будет проверять и как?
- Используйте шаблон: «[Субъект] должен [действие] [объект] [условие] [метрика]». Пример: «Система должна возвращать результаты поиска по метаданным за ≤ 500 мс при нагрузке до 100 одновременных запросов».
- Разделяйте функциональное и нефункциональное. Функциональное: что делает. Нефункциональное: как хорошо делает (производительность, безопасность, usability). Оба должны быть проверяемыми.
Пример из нашей библиотеки
Исходная нужда: «Хочу читать книги в браузере».
После уточнения: «Читалка должна отображать EPUB и FB2 в браузере с поддержкой закладок, изменения размера шрифта и ночного режима, без скачивания файла на устройство».
Проверка: usability-тест + технический тест на совместимость форматов.
Чего избегать
- Субъективных слов («удобный», «красивый», «интуитивный»).
- Открытых формулировок («поддержка всех популярных форматов»).
- Смешения нескольких идей в одном пункте.
Проверяемость — это не бюрократия. Это страховка от переделок и споров на финальной приёмке.
Почему хорошие требования всё равно не спасают проект
Даже когда требования выглядят идеально — проверяемые, с ID, приоритетами и трассировкой — проект может пойти не так. Почему?
Потому что требования — это только один кусок пазла. Они отвечают на вопрос «что строить», но не на «как строить», «в какие сроки» и «с какими рисками».
Типичные причины провала при «хороших» требованиях
- Нет связи с архитектурой Требования игнорируют технические ограничения. Пример: «Поиск за ≤ 100 мс на 1 млн книг» — красиво, но на слабом NAS это невозможно без серьёзной перестройки хранения. Результат: архитектор вынужден нарушать требование или переписывать всё.
- Приоритеты не согласованы Все требования «Must Have». Нет понимания, что можно отложить. Пример: 150 требований Must, но ресурсов на 50. Команда тонет в scope creep.
- Изменения не управляются Бизнес меняет приоритеты, появляются новые стейкхолдеры. Без процесса изменений требования устаревают. Пример: в середине проекта заказчик говорит «теперь нужна поддержка комиксов». Если нет Change Request — хаос.
- Нет оценки и планирования Требования не оцениваются по трудозатратам, рискам и зависимостям. Пример: требование «автоматическое обновление из Anna’s Archive» звучит просто, но на практике — сложный downloader, обработка дубликатов, метаданные.
- Трассировка только на бумаге Есть матрица, но никто её не обновляет. Изменение одного требования ломает цепочку, но никто не замечает.
Как избежать этих ловушек
- Связывайте требования с архитектурой на раннем этапе После формализации покажите их архитектору. Задайте вопрос: «Это реализуемо в наших ограничениях?»
- Приоритизируйте жёстко MoSCoW или числовые приоритеты. Must — не больше 30–40 % от общего объёма.
- Внедрите процесс изменений Любой новый пункт — Change Request с оценкой влияния на сроки, бюджет и архитектуру.
- Оценивайте каждое требование Трудозатраты, риски, зависимости. Это позволяет планировать спринты/релиз.
- Поддерживайте трассировку живой В Jira или Confluence — ссылки, а не статичный Excel.
Пример из нашей библиотеки
У нас были отличные требования: поиск за ≤ 500 мс, чтение в браузере, офлайн-доступ. Но на старте мы не учли, что на NAS с 4 ГБ RAM Elasticsearch жрёт слишком много. Решение: пересмотрели требование к производительности, выбрали MeiliSearch — лёгкий и быстрый. Без связи с архитектурой мы бы застряли на месяцы.
Итог
Хорошие требования — необходимое условие. Но недостаточное.
Они спасают проект только когда:
- связаны с архитектурой,
- приоритизированы,
- управляются при изменениях,
- оценены по ресурсам.
Без этого даже идеальный список остаётся просто красивым документом.
Атрибуты требований: зачем они нужны, если у нас Jira
У всех есть Jira, Confluence или Notion. Тикеты с ID, статусами, приоритетами. Казалось бы — всё, что нужно. Но почему тогда через полгода половина требований «потерялась», а другая половина стала неактуальной?
Потому что стандартные поля в трекере — это только часть истории. Атрибуты требования — это метаданные, которые делают требование управляемым в реальном проекте.
Зачем атрибуты, если есть Jira
Jira даёт базовые поля: summary, description, priority, assignee, status. Это удобно для задач разработки. Но для требований этого мало.
Атрибуты отвечают на вопросы, которые трекер не покрывает:
- Откуда это требование взялось?
- Кто за него отвечает на уровне бизнеса?
- Как именно будем проверять?
- Какой риск, если не сделаем?
- Сколько стоит проверка?
Без этих ответов требование остаётся «чёрным ящиком».
Основные атрибуты, которые спасают проект
Вот минимальный набор, который работает в 2025 году (даже если вы не фанат бюрократии):
| Атрибут | Что записываем | Почему это важно | Пример из библиотеки |
|---|---|---|---|
| Уникальный ID | SYS.SEARCH.001 или USR-READ.001 | Трассировка и ссылки | SYS.SEARCH.001 |
| Приоритет | Must / Should / Could / Won’t (MoSCoW) | Что делать первым, что можно отложить | Must для поиска |
| Источник | Интервью с Ивановым 15.12.2025, регулятор, конкурент | Чтобы знать, к кому возвращаться при изменениях | Интервью с читателями |
| Владелец | Бизнес-владелец (не разработчик) | Кто принимает решение при конфликтах | Продуктовый владелец |
| Метод проверки | Тест-кейс, usability-тест, нагрузочный тест | Нет споров на приёмке | Нагрузочный тест |
| Риск | High/Medium/Low | Чтобы понимать, где может всё сломаться | High для безопасности |
| Статус | Proposed / Approved / Rejected / Implemented | Видно, что живое, а что похоронено | Approved |
| Версия | 1.0, 1.1 | Понимаем, когда и почему изменилось | 1.2 после добавления серии |
Эти 8 атрибутов — золотая середина. Больше — бюрократия. Меньше — хаос.
Как внедрить без боли
- В Jira создайте custom fields для Source, Verification Method, Risk.
- Приоритет — используйте стандартный, но с MoSCoW-лейблами.
- ID — генерируйте по шаблону (USR-/SYS-/SW.FUNC-/SW.NFR-).
- Обязательно заполнять при создании тикета — правило в workflow.
Пример из нашей библиотеки
Требование «Поиск за ≤ 500 мс»:
- ID: SYS.PERF.SEARCH.001
- Приоритет: Must
- Источник: опрос пользователей от 10.12.2025
- Владелец: продуктовый владелец
- Метод проверки: нагрузочный тест на NAS с 8 ГБ RAM
- Риск: High (если не пройдёт — весь проект под вопросом)
- Статус: Approved
- Версия: 1.1 (добавили поддержку серии)
Когда через месяц заказчик попросил добавить поиск по аннотации — мы сразу увидели риск и влияние на производительность. Без атрибутов это было бы «давайте просто добавим».
Итог
Атрибуты — это не бумажки для аудита. Это инструмент, который делает требования живыми и управляемыми в реальном проекте.
Jira без атрибутов — просто трекер задач. Jira с атрибутами — система управления требованиями.
Почему требования нельзя написать один раз и навсегда
Многие команды на старте проекта тратят недели на «идеальные» требования. Потом с гордостью закрывают документ и говорят: «Готово, можно кодить». Через пару месяцев всё рушится. Требования меняются. Это не баг — это норма.
Почему изменения неизбежны
Проект развивается, и с ним меняется понимание:
- Появляются новые стейкхолдеры с новыми нуждами.
- Выясняются технические ограничения, о которых никто не знал на старте.
- Бизнес меняет приоритеты (рынок, конкуренты, бюджет).
- Пользователи после первого демо говорят «а вот это неудобно».
Пример из нашей библиотеки: На старте казалось, что поиск по автору и названию хватит. После первых тестов пользователи попросили поиск по серии и тегам. Если бы требования были «заморожены» — мы бы либо игнорировали фидбек, либо ломали план.
Что происходит, если игнорировать изменения
- Система устаревает ещё до релиза. Реализуете то, что было нужно полгода назад.
- Команда теряет доверие. Разработчики чувствуют, что работают «в пустоту».
- Переделки на финале. Всё равно придётся менять, но уже дороже и хаотичнее.
Как жить с изменениями без хаоса
Требования — живой организм. Нужно управлять ими, а не замораживать.
Практические правила:
- Фиксируйте версии Каждое изменение — новая версия документа (1.0, 1.1, 1.2). Указывайте дату и причину.
- Вводите процесс изменений Любое новое или изменённое требование — через Change Request:
- Что меняем?
- Почему?
- Какое влияние на сроки, бюджет, архитектуру?
- Кто одобряет?
- Обновляйте трассировку Изменилось одно требование — проверьте, что сломалось ниже по цепочке.
- Делайте базовые линии Замораживайте набор требований на ключевые точки (конец спринта, релиз). Между ними — изменения по процессу.
Пример из нашей библиотеки
Мы начали с требований версии 1.0: поиск по автору/названию, чтение в браузере. Через месяц добавили поиск по серии — Change Request, оценка влияния (риск на производительность), одобрение, версия 1.1. Трассировка обновлена, архитектура проверена — всё под контролем.
Без этого мы бы просто «дописали пункт» и потом удивлялись, почему поиск стал медленнее.
Итог
Требования нельзя написать один раз и навсегда, потому что проект — живой. Можно и нужно сделать так, чтобы изменения не убивали проект.
Процесс изменений + версии + трассировка = спокойная жизнь команды.
Разница между требованиями и архитектурными решениями
Один из самых частых конфликтов в проектах — когда аналитик или заказчик начинает диктовать, как именно строить систему.
«Нужен микросервис на Kafka», «База должна быть PostgreSQL», «Фронтенд на React».
Это звучит как требование. Но это не требование. Это архитектурное решение.
Где граница
Требование отвечает на вопрос ЧТО должна делать система и КАК ХОРОШО она должна это делать. Оно не касается КАК ИМЕННО это реализовать.
Архитектурное решение — это ответ архитектора на вопрос КАК удовлетворить требования, учитывая ограничения, риски, стоимость и долгосрочную поддержку.
| Что это | Пример из нашей библиотеки (требование) | Пример архитектурного решения | Кто отвечает |
|---|---|---|---|
| Требование | «Поиск должен работать за ≤ 500 мс при коллекции 500 000 книг» | «Для поиска используем MeiliSearch» | Аналитик / стейкхолдеры |
| Архитектурное решение | — | «Храним книги по MD5 в файловой системе, индекс в MeiliSearch» | Архитектор |
Почему важно не путать
Когда требования содержат решения:
- ограничивается свобода архитектора,
- можно выбрать плохой инструмент, который удовлетворяет требованию, но создаёт проблемы в будущем,
- сложно менять технологию при росте проекта.
Когда архитектор игнорирует требования:
- строит красивую систему, которая не решает задачу пользователя.
Как правильно разделять
- Аналитик/заказчик формулирует что нужно и как хорошо. Пример: «Система должна поддерживать чтение в браузере без скачивания файла, с закладками и сменой шрифта».
- Архитектор предлагает как это реализовать. Пример: «Используем EPUB.js в SvelteKit, закладки храним в IndexedDB».
- Обсуждение и фиксация в Architecture Decision Record (ADR): «Выбрали EPUB.js, потому что лёгкий, открытый и работает офлайн. Альтернатива — PDF.js — тяжелее и хуже с FB2».
Типичные ошибки
- Заказчик: «Нужен Elasticsearch» — это решение, а не требование. Правильно: «Поиск должен поддерживать fuzzy и возвращать результат за ≤ 500 мс». Архитектор сам выберет инструмент.
- Архитектор: «Сделаем монолит на Node.js» — без обоснования требований. Правильно: сначала проверить, удовлетворяет ли это производительности и масштабируемости.
Практический совет для нашей библиотеки
В нашем проекте мы строго разделили:
- Требования: поиск за ≤ 500 мс, чтение в браузере, офлайн-доступ.
- Решения: MeiliSearch для поиска, SvelteKit + EPUB.js для чтения, файлы по MD5.
Это позволило быстро поменять фронтенд-фреймворк (с React на Svelte), не трогая требования.
Итог
Требования — это границы для архитектора. Архитектурные решения — это ответ архитектора внутри этих границ.
Не путайте их — и проект будет гибким, реализуемым и долгоживущим.
