Никаких Ошибок, Никаких Недостатков Или Надежности Систем Как Таковых.

Сегодня просматриваю публикацию Егора Бугаенко Когда вы прекратите тестирование! , я с удивлением обнаружил, что мало кто понимает и задумывается о том, что проблема тестирования и подтверждения отсутствия недостатков в системе принципиально неразрешима.

Кстати, это до сих пор актуально в связи с введением электронных выборов и требованиями от чиновников и журналистов доказательств отсутствия дыр в системе безопасности.

Например, у нас в Эстонии эта дискуссия идет полным ходом, и политики хотят получить 100% доказательство надежности системы электронных выборов.

Публичные политики обычно незнакомы с логикой в ее формальной форме.

А Юм и Поппер в лучшем случае напоминают какие-то скучные философские семинары, о которых лучше забыть.

Но когда я слышу, что тестировщик или сеньор начинает вполне серьезно доказывать, что код проверен и ошибок вообще нет, мое лицо принимает такое выражение:

Никаких ошибок, никаких недостатков или надежности систем как таковых.
</p><p>

Есть несколько основных моментов, по которым следует исключить саму постановку такого рода вопросов, особенно из уст ИТ-специалистов.



Первый пункт логичный

Проблема индукции, которую серьезно рассматривал Юм, ставит под сомнение саму возможность обоснования целого ряда задач и вопросов.

Например, невозможно сделать какие-то общие выводы из наличия тех или иных частных наблюдений.

Неограниченное количество наблюдений за чем-либо не подтверждает истинность утверждения.

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

В чем суть проблемы фальсификаций и как она нас затрагивает? Самый известный пример – «Черный лебедь».

Черный лебедь был символом невозможности чего-либо в Лондоне XVI века.

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

И в этом контексте черные лебеди были невозможны или вообще не существовали.

Однако в 17 веке представитель Старого Света встретил в Австралии невозможное.

Существует асимметрия между подтверждением и фальсификацией.

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

Единственное утверждение о существовании не доказывает общего.

Например, если в течение последних 4,5 миллиардов лет Солнце регулярно (ну ладно, ну, с некоторым замедлением) поднималось над горизонтом, это не говорит нам о том, что Солнце всегда поднимается над горизонтом.

Или любитель парадоксов Б.

Рассел приводит пример индейки, которую кормят и о которой заботятся, и она думает, что так будет всегда, пока не наступит тот самый день, День Благодарения.

Таким образом, чтобы доказать, что все лебеди белые, мы должны проверить всех лебедей во Вселенной, и Лейбниц шепчет мне, что это должны быть все возможные миры, что, естественно, невозможно.

Но чтобы опровергнуть это утверждение, достаточно приехать в Австралию и встретить одного черного лебедя.

Таким образом, существует фундаментальная асимметрия между подтверждением и фальсификацией.

В данном контексте говорить об отсутствии ошибок в коде или дырах в системе некорректно.

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



Второй момент – вычислительный.

Теорема Райс оставляет след пессимизма в отношении нашей способности создавать совершенные системы.

Следствие из теоремы Райса, которое обычно следует из проблемы остановки и вычислимости машины Тьюринга, гласит, что не существует универсального алгоритма для доказательства или утверждения того, что программа, система или алгоритм безошибочны и делают то, что должны.

Автоматизированные универсальные системы тестирования, как правило, невозможны.

В частности да, но что бы мы не делали, баги будут! Статическая типизация, TDD и другие техники могут лишь придать нам больше уверенности и избавить от некоторых страхов, не более того.



Третий момент – инженерный

Бывают такие ситуации, что мы можем даже знать, что у нас есть какая-то конкретная ошибка, разрушающая нашу систему, потому что мы наблюдали ее в какой-то момент. Мы знаем, что есть ошибка.

Но мы не можем это воспроизвести.

Я имею в виду проблемы в многопоточных приложениях, где господствует недетерминизм.

Особой проблемы отловить баг, если сервер зависает каждые десять минут, не составляет. Но что, если нам нужно, чтобы сервер работал в течение нескольких месяцев, прежде чем проблема вернется? Это буквально невозможно отладить.

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

Тот факт, что доступ потоков к памяти может быть переупорядочен, не означает, что они будут переупорядочены.

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

Все эти три пункта делают бессмысленным само утверждение об отсутствии багов или о доказательстве безопасности чего-либо.

Очень большой процент ИТ-специалистов этого тоже не понимает. Отличный пример — в посте Егора Бугаенко.

Если бы мне предложили на выбор две суперспособности, возможность делить на ноль или найти все ошибки в коде, то я бы задумался, что взять, ведь это вещи одного порядка.

Теги: #тестирование #безопасность #логика #информационная безопасность #тестирование ИТ-систем #программирование #Анализ и проектирование систем #отладка

Вместе с данным постом часто просматривают: