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

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

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

Вопрос 1. В чём разница между функциональными и нефункциональными требованиями?

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

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

Нефункциональное требование описывает свойство системы в целом или свойство конкретной функции: производительность, доступность, безопасность, совместимость, удобство сопровождения. «Страница списка заказов открывается за 2 секунды на 95% запросов при 500 одновременных пользователях» — нефункциональное. Оно проверяется измерением, а не наблюдением.

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

Основные группы нефункциональных требований

ГруппаО чёмПример формулировки
Производительностьвремя отклика, пропускная способностьp95 отклика API — не более 300 мс при 200 RPS
Надёжность и доступностьсколько система может лежатьдоступность 99,9% в месяц, окно планового обслуживания — до 2 часов в ночь воскресенья
Масштабируемостьзапас ростарост числа заказов в 5 раз без изменения архитектуры
Безопасностьдоступ, хранение, аудитперсональные данные хранятся в зашифрованном виде, доступ логируется 3 года
Совместимостьокружение, браузеры, интеграцииподдержка двух последних мажорных версий Chrome, Safari, Firefox
Сопровождаемостькак систему чинят и меняютразвёртывание новой версии без остановки сервиса

Вопрос 2. Приведите пример нефункционального требования и скажите, как его проверить

Что проверяют. Умеете ли вы писать измеримо. Половина кандидатов выдаёт «система должна быть быстрой и надёжной» — и на этом интервью по требованиям, по сути, заканчивается.

Плохое нефункциональное требование неизмеримо, поэтому его нельзя ни протестировать, ни принять:

ПЛОХО:  Система должна работать быстро.
ПЛОХО:  Интерфейс должен быть удобным.
ПЛОХО:  Система должна выдерживать высокую нагрузку.

Хорошее содержит метрику, значение, условия измерения и точку измерения:

ХОРОШО: 95-й перцентиль времени ответа GET /orders — не более 300 мс
        при нагрузке 200 запросов в секунду, измерение на стороне
        API-шлюза, тестовый набор данных — 1 млн заказов.

ХОРОШО: Доступность сервиса оплаты — не менее 99,9% в календарный
        месяц, считается по успешным ответам health-check раз в 30 с.

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

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

nfr:
  - id: NFR-PERF-01
    category: performance
    scope: "GET /orders"
    metric: "p95 response time"
    target: "<= 300 ms"
    conditions: "200 RPS, 1M orders in DB"
    verification: "нагрузочный тест перед релизом"
  - id: NFR-SEC-03
    category: security
    scope: "персональные данные клиентов"
    metric: "шифрование хранения"
    target: "AES-256 на уровне БД"
    verification: "чек-лист безопасности + аудит доступа"

Почему нефункциональные требования дороже

Функциональное требование обычно означает «написать ещё немного кода». Нефункциональное часто означает «переделать архитектуру». Требование «доступность 99,99%» вместо «99,5%» превращает один сервер в кластер с репликацией базы, балансировщиком и резервным контуром — это разница в стоимости и сроках в разы, а функциональность при этом ровно та же.

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

Типичные ошибки кандидатов

  • Отвечают определением из ГОСТа и замолкают, не приводя ни одного примера. Интервьюер ждёт примеров.
  • Считают нефункциональными все требования, где нет слова «пользователь». Требование «система отправляет уведомление в очередь» — функциональное, даже если пользователь его не видит.
  • Пишут неизмеримые формулировки: «быстро», «удобно», «надёжно».
  • Забывают про условия измерения. «Отклик 300 мс» без указания нагрузки и объёма данных бессмыслен: на пустой базе и в один поток почти всё быстро.
  • Не различают ограничение (constraint) и требование. «Использовать PostgreSQL, потому что так решил архитектурный комитет» — это ограничение, а не нефункциональное требование.

Как ответить кратко

Функциональные требования отвечают на вопрос «что система делает» — их проверяют по принципу «работает или нет». Нефункциональные описывают качество: производительность, доступность, безопасность, масштабируемость, — их проверяют измерением. Ключевое правило: нефункциональное требование обязано содержать метрику, целевое значение и условия измерения, иначе оно нетестируемо. Например, вместо «система должна быть быстрой» — «p95 ответа GET /orders не более 300 мс при 200 RPS на базе в миллион заказов». И собирать их надо до проектирования, потому что именно они определяют архитектуру и бюджет.

Проверьте себя
1. Какое из требований является нефункциональным?
AПользователь может отменить заказ до передачи в доставку
BСистема отправляет клиенту письмо при смене статуса заказа
C95-й перцентиль времени ответа GET /orders — не более 300 мс при 200 RPS
DМенеджер может изменить состав заказа
2. Почему формулировка «система должна выдерживать высокую нагрузку» непригодна как требование?
AОна относится к функциональным требованиям, а не к нефункциональным
BОна неизмерима: нет метрики, порогового значения и условий измерения
CНагрузочные требования вообще не описывают на этапе анализа
DОна слишком длинная и её надо разбить на несколько
3. Почему нефункциональные требования собирают до проектирования?
AИх дольше согласовывать с юристами
BОни обычно влияют на архитектуру и стоимость сильнее функциональных
CИначе тестировщики не успеют написать автотесты
DТак требует ГОСТ 34.602