Свойства как компас: точное программирование ✛ ✎

Оригинал: "Accurate Programming: Thinking about programs in terms of properties"
arXiv:1109.0786 · 2011-09-05 · arXiv non-exclusive · собственный разбор · 2 мин
Программы — это не только код, но и математические свойства, которые можно проверять автоматически.

Контекст

В последние годы методы разработки программного обеспечения развиваются стремительно: статическая типизация, модульное тестирование, экстремальное программирование, проверка моделей. Однако обилие терминов и техник затрудняет понимание их взаимосвязей. Работа предлагает единый взгляд через математическое понятие свойства, которое связывает примеры использования, тесты, типы и доказательства корректности. Такой подход особенно актуален на фоне роста популярности тестирования на основе свойств, которое делает проверку свойств практичной и доступной.

Методы

Авторы используют язык Scala и библиотеку ScalaCheck для спецификации и случайной проверки свойств. На примере простых функций (максимум, сумма, подсчёт элементов) демонстрируется, как записывать свойства в исполняемом виде. Свойства формулируются с помощью универсальной квантификации и оператора forAll, который генерирует случайные тестовые данные. Показывается, как из конкретных примеров извлекать общие свойства, комбинировать их и даже преобразовывать свойства в код. Для работы со списками используется индуктивная структура данных и сопоставление с образцом.

Результаты

Статья демонстрирует, что даже однострочные функции обладают нетривиальными свойствами, которые можно проверять автоматически. Например, для функции max проверяются симметрия, идемпотентность и свойство наименьшей верхней границы — вместе они полностью характеризуют функцию. Для функции sum свойство монотонности выявляет ошибку переполнения целых чисел, которую не находили другие тесты. Для функции count показано, как постепенно уточнять свойства, чтобы исключить некорректные реализации (например, функцию, всегда возвращающую ноль). Важный результат: программы сами могут рассматриваться как свойства, что стирает грань между спецификацией и реализацией.

Значение

Работа предлагает практичный мост между тестированием и формальной верификацией. В отличие от соседних работ, фокусирующихся на отдельных техниках (например, на объяснимом ИИ или квантовых вычислениях), здесь свойства выступают как универсальный язык для описания поведения программ. Это позволяет получать большинство преимуществ формальной верификации с существенно меньшими затратами. Подход особенно ценен для обучения: он даёт словарь для рассуждений о программах и помогает понять, почему программирование сложно.

Развитие

Точное программирование может развиваться в сторону более тесной интеграции со средствами доказательства теорем. По мере автоматизации доказательств свойства, сформулированные при разработке, станут отправной точкой для полной верификации. Также перспективно применение подхода к распределённым системам и протоколам, где свойства помогают описывать инварианты. Возможно создание инструментов, которые автоматически извлекают свойства из кода и предлагают их для проверки.

Влияние

Метод применим в любой области разработки ПО: от встроенных систем до веб-сервисов. Он улучшает качество кода, облегчает рефакторинг и документирование.

Следующие шаги

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

Ключевые проблемы

В программной инженерии остаётся проблема масштабируемости формальных методов. Точное программирование показывает, как свойства могут служить промежуточным звеном между неформальными тестами и полными доказательствами, смягчая разрыв между практикой и теорией.

Взгляд машины знаний

Этот раздел адресован автору работы и его коллегам. Соседние работы нашёл смысловой поиск по нашему архиву — не по совпадению слов, а по смыслу. Мы не рецензируем: мы показываем поле вокруг.

Что сделано в работе

Авторы вводят понятие точного программирования, где свойства служат мостом между спецификацией и реализацией. На примерах функций max, sum и count с использованием ScalaCheck показывается, как формулировать и автоматически проверять свойства, выявляя ошибки (например, переполнение) и уточняя спецификации.

В чём сила

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

Куда можно двигаться

Что можно попробовать

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

Почему это может быть важно

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

Название библиотеки ScalaCheck отсылает к идее автоматической проверки свойств, а не к «проверке Скалы» — это инструмент для проверки свойств в Scala.

В сериале «Мир Дикого Запада» поведение роботов определяется сложными правилами, но их корректность не гарантирована. Точное программирование могло бы помочь формулировать и проверять свойства поведения, предотвращая неожиданные сбои.

Ключевые числа

  • количество сгенерированных тестов для свойства по умолчанию: 100
  • значение, вызвавшее переполнение в примере с суммой: 65536
  • размер списка для кодирования числа 8: 4 элемента
Учёные
Erwin SchrödingerHugh Everett IIIMax BornAlbert EinsteinJohn von NeumannAugustin-Louis Cauchy
Понятия
точность автоматизация оптимизация диагностическая точность обработка естественного языка реальное время квантовый алгоритм дизайн лекарств открытый исходный код сходимость машинное обучение компьютерное моделирование распознавание речи персонализированная медицина искусственный интеллект робототехника вычисление классификация точное решение точность