Программист смотрит на функцию max, которая возвращает большее из двух чисел. Как убедиться, что она работает? Можно написать тесты: max(2,3)=3, max(5,5)=5. Но что если где-то в глубине кода ошибка, которая проявится только на числе 65536? Вместо угадывания можно сформулировать правило: «результат никогда не меньше каждого из аргументов». Это свойство — оно должно быть верно для любых входных данных.
Библиотека ScalaCheck автоматически генерирует сотни случайных чисел, подставляет их в свойство и сообщает, если правило нарушилось. Так свойства работают как компас: они не проверяют один маршрут, а задают направление, верное для любого пути. Например, для функции sum (сложение списка чисел) свойство «если добавить положительное число, сумма вырастет» находит ошибку переполнения, которую обычные тесты не замечают.
Точное программирование — это когда разработчик думает о коде через его свойства. Вместо того чтобы тонуть в тумане сложности, он держит в руках компас из правил, которые можно проверить автоматически. Это делает программы надёжнее, а их изменение — безопаснее.
Название библиотеки ScalaCheck отсылает к идее автоматической проверки свойств, а не к «проверке Скалы» — это инструмент для проверки свойств в Scala.
В сериале «Мир Дикого Запада» поведение роботов определяется сложными правилами, но их корректность не гарантирована. Точное программирование могло бы помочь формулировать и проверять свойства поведения, предотвращая неожиданные сбои.