Какие виды нефункциональных требований к системе вы знаете?

Ответ

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

  1. Производительность (Performance) – время отклика, пропускная способность, использование ресурсов (CPU, память).
  2. Надежность (Reliability) – устойчивость к сбоям, среднее время наработки на отказ (MTBF), возможность восстановления.
  3. Масштабируемость (Scalability) – способность системы справляться с увеличением нагрузки (горизонтально или вертикально).
  4. Безопасность (Security) – аутентификация, авторизация, шифрование данных, защита от уязвимостей (OWASP Top 10).
  5. Совместимость (Compatibility) – работа с различными ОС, браузерами, устройствами и версиями ПО.
  6. Удобство использования (Usability) – интуитивность интерфейса, доступность (a11y), качество документации.
  7. Поддерживаемость (Maintainability) – модульность кода, наличие тестов, простота внесения изменений и отладки.
  8. Портативность (Portability) – легкость переноса системы в другую среду.

Пример теста производительности (Java + JUnit):

@Test
@Timeout(5) // Требование: ответ менее 5 секунд
public void apiResponseTimeShouldBeLessThanOneSecond() {
    long startTime = System.currentTimeMillis();
    // Вызов тестируемого API-метода
    apiClient.makeRequest();
    long duration = System.currentTimeMillis() - startTime;

    assertTrue(duration < 1000, 
        "Время ответа API превысило 1 секунду: " + duration + " мс");
}

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

Ответ 18+ 🔞

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

Ну, типа, это не про то, что система делает, а про то, как она это делает, сука. Какая она, твоя система, в душе? Быстрая, как укол в жопу, или медленная, как черепаха в соплях? Надёжная, как швейцарские часы, или сыпется от чиха? Вот это всё — NFR, ёпта.

Смотри, основные виды, чтоб не путаться:

  1. Производительность (Performance) – это сколько она тормозит, сколько народу одновременно выдержит и как жрёт твои процессоры с памятью. Если дольше трёх секунд — пользователь уже в пизду послал и ушёл.
  2. Надежность (Reliability) – упадёт ли она, если мышка чихнёт рядом? Сколько может проработать без перезагрузки? А если упадёт — сама встанет или её пинками поднимать?
  3. Масштабируемость (Scalability) – накроется ли она медным тазом, когда пользователей станет не десять, а десять тысяч? Можно ли просто серверов добавить (горизонтально) или придётся один, но здоровенный, покупать (вертикально)?
  4. Безопасность (Security) – вот это, блядь, святое! Чтоб не любой пидарас шерстяной мог зайти и всё повыносить. Логины, пароли, шифрование, защита от этих ваших OWASP Top 10 уязвимостей — иначе будет пиздец, а не система.
  5. Совместимость (Compatibility) – будет ли это говно работать на старом айфоне твоей бабки и в браузере «Интернет Эксплорер», который сам бог велел убить?
  6. Удобство использования (Usability) – чтоб не пришлось инженерное образование получать, чтобы кнопку «Сохранить» найти. И чтоб слепой мог пользоваться. И документация, блядь, чтоб была, а не «и так понятно».
  7. Поддерживаемость (Maintainability) – код написан так, что его можно читать, а не как шифровку из берлинской подстанции. Есть тесты, чтоб не бояться каждое изменение вносить. Иначе потом придешь через полгода — и волосы дыбом, ебать мои старые костыли.
  8. Портативность (Portability) – а можно ли эту систему с Windows на Linux перетащить, не переписывая половину? Или она там наглухо к одной платформе приклеена?

Вот, смотри, как можно проверить, не обосрётся ли твой API по времени (пример на Java):

@Test
@Timeout(5) // Требование чёткое: отвечай за 5 секунд, а не думай тут
public void apiResponseTimeShouldBeLessThanOneSecond() {
    long startTime = System.currentTimeMillis();
    // Вызов тестируемого API-метода
    apiClient.makeRequest();
    long duration = System.currentTimeMillis() - startTime;

    assertTrue(duration < 1000, 
        "Время ответа API превысило 1 секунду: " + duration + " мс");
}

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