Верификация и валидация

Два похожих слова, за которыми стоят два разных вопроса к продукту.

Верификация отвечает на вопрос «делаем ли мы продукт правильно?» (по спецификации), а валидация — «делаем ли мы правильный продукт?» (тот, что нужен пользователю).

Две стороны качества

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

АспектВерификацияВалидация
ВопросПравильно ли построено?То ли построено?
С чем сверяемС требованиями и дизайномС реальными потребностями пользователя
КогдаВ процессе разработкиБлиже к готовому продукту
ПримерКод соответствует спецификацииПродукт решает задачу клиента

Запоминалка

«Verification — building the thing right. Validation — building the right thing». Верификация смотрит внутрь (соответствие спецификации), валидация смотрит наружу (соответствие потребности).

Пример, где код верен, а продукт — нет

Допустим, в спецификации сказано: «комиссия — 5% от суммы». Программист реализовал это идеально. Верификация пройдена. Но если бизнесу на самом деле нужна была фиксированная комиссия, валидация провалена — построили не то.

def fee(amount):
    """Комиссия по спецификации: 5% от суммы."""
    return amount * 0.05


# ВЕРИФИКАЦИЯ: код соответствует написанной спецификации (5%)
assert fee(1000) == 50
assert fee(0) == 0
print("Верификация пройдена: код соответствует спецификации")

# ВАЛИДАЦИЯ: а нужна ли была вообще процентная комиссия?
business_needs_fixed_fee = True  # бизнес хотел фиксированную комиссию
if business_needs_fixed_fee:
    print("Валидация провалена: построили не то, что нужно бизнесу")

Вывод:

Верификация пройдена: код соответствует спецификации
Валидация провалена: построили не то, что нужно бизнесу

Зачем различать

Модульные и интеграционные тесты — это в основном верификация: они проверяют код против спецификации. А приёмочное тестирование, демо заказчику, бета-тесты — это валидация: показывают, решает ли продукт реальную задачу. Здоровая команда занимается обеими: и собирает продукт правильно, и собирает правильный продукт.

Итог

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