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

Первый и самый недооценённый шаг: превратить «спроектируйте X» в список конкретных требований.

Функциональные требования — что система делает (функции). Нефункциональные — какими свойствами обладает: масштаб, латентность, доступность, согласованность.

Два типа требований

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

ФункциональныеНефункциональные
Создать короткую ссылкуВысокая доступность
Перейти по короткой ссылкеЛатентность редиректа < 100 мс
Аналитика кликов (опц.)Масштаб: 100M ссылок/мес

Как сужать скоуп

На «спроектируйте Twitter» нельзя ответить за 45 минут целиком. Поэтому сразу спросите: какие функции в скоупе? Обычно интервьюер согласится сузить до 2–3 ключевых («постинг и лента, без поиска и рекламы»). Это нормально и ожидаемо — фиксация скоупа экономит время и показывает зрелость.

Как работает под капотом

Нефункциональные требования напрямую определяют архитектуру. «Доступность важнее согласованности» означает выбор AP-системы по CAP, реплики, кэш. «Латентность < 100 мс» означает CDN и кэш у границы. «Сильная согласованность для баланса кошелька» означает транзакции и, возможно, отказ от агрессивного кэширования. Каждое нефункциональное требование позже превращается в конкретный компонент схемы.

Вопросы, которые стоит задать

  • Кто пользователи и сколько их (DAU)?
  • Соотношение чтений к записям?
  • Какие функции в скоупе, какие можно отложить?
  • Что важнее: согласованность или доступность?
  • Какая допустимая задержка?

Частые ошибки

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

Итог

  • Делите требования на функциональные (что) и нефункциональные (как хорошо).
  • Сужайте скоуп до 2–3 ключевых функций — это ожидаемо.
  • Нефункциональные требования напрямую превращаются в компоненты схемы.
Проверьте себя
1. Какое из требований — нефункциональное?
AПользователь может создать короткую ссылку
BЛатентность редиректа должна быть меньше 100 мс
CПользователь может удалить ссылку
DСистема показывает список ссылок пользователя
2. Почему важно зафиксировать соотношение чтений к записям?
AЭто влияет на цвет схемы
BОно во многом определяет архитектуру: кэш, реплики, выбор БД
CЭто нужно только для отчётности
DСоотношение всегда одинаковое для всех систем
3. Что разумно сделать с задачей «спроектируйте Twitter»?
AСпроектировать абсолютно все функции за 45 минут
BСузить скоуп до 2–3 ключевых функций по согласованию с интервьюером
CОтказаться, потому что задача слишком большая
DСразу выбрать базу данных