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

Прежде чем проектировать, нужно понять, что именно и для скольких пользователей вы строите.

Функциональные требования описывают, что система делает; нефункциональныенасколько хорошо она это делает (быстро, надёжно, масштабируемо).

Самая частая ошибка на собеседовании — броситься проектировать, не уточнив задачу. «Спроектируйте Twitter» — это не задача, а тема. Twitter для 1000 пользователей и для 500 миллионов — это две совершенно разные системы. Ваша первая задача — сузить формулировку вопросами.

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

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

  • Пользователь может опубликовать пост (текст, картинка).
  • Пользователь может подписаться на другого пользователя.
  • Пользователь видит ленту постов тех, на кого подписан.
  • Пользователь может лайкнуть и прокомментировать пост.

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

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

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

СвойствоВопрос, который оно задаёт
Доступность (availability)Сколько простоя допустимо? 99,9% или 99,99%?
Задержка (latency)Какая задержка приемлема? p99 < 200 мс?
Согласованность (consistency)Нужны строго свежие данные или допустимо отставание?
МасштабСколько пользователей, запросов, данных?
Надёжность (durability)Можно ли терять данные при сбое?
Соотношение чтение/записьЧего больше — чтений или записей? (часто 100:1)

Какие вопросы задать интервьюеру

Хороший набор уточняющих вопросов сам по себе производит сильное впечатление. Минимальный чек-лист:

- Сколько у нас активных пользователей (DAU/MAU)?
- Каково соотношение чтений и записей?
- Нужна ли свежесть данных в реальном времени?
- Какая задержка приемлема (медиана и p99)?
- Какие функции в скоупе, а какие точно нет?
- Глобальная аудитория или один регион?

Ответы превращают расплывчатую тему в измеримую задачу. Например: «5 млн DAU, чтений в 100 раз больше, чем записей, p99 < 200 мс, лента может отставать на пару секунд, один регион». Теперь у вас есть фундамент для оценок.

Пример: от темы к требованиям

Тема «сократитель ссылок» после уточнений превращается в такой контракт:

Функциональныесоздать короткую ссылку из длинной; перейти по короткой → редирект; (опц.) аналитика кликов
Нефункциональныередирект < 100 мс; доступность 99,99%; чтений ≫ записей; ссылки не должны теряться

Итог

  • Функциональные требования — что система делает; нефункциональные — насколько хорошо.
  • Архитектуру диктуют именно нефункциональные требования: latency, availability, согласованность.
  • Сначала сузьте задачу вопросами и явно отрежьте лишнее из скоупа.
Проверьте себя
1. Что из перечисленного — нефункциональное требование?
AПользователь может опубликовать пост
BПользователь может подписаться на другого
CПользователь может лайкнуть пост
DЛента должна загружаться за время p99 < 200 мс
2. Почему важно уточнить соотношение чтений и записей?
AОт него зависят решения вроде кэширования, репликации реплик для чтения и денормализации
BОно не влияет на архитектуру
CОно нужно только для выбора языка программирования
DЭто влияет только на дизайн интерфейса
3. Почему «Спроектируйте Twitter» нельзя начинать проектировать сразу?
ATwitter слишком простой
BЭто тема, а не задача: масштаб и скоуп не определены, их надо уточнить
CНужно сначала выбрать облачного провайдера
DТакие системы вообще не проектируют