Компьютинг
September 8, 2022

Записки о кибернетике | Как полагаться на доверие. В науке и в жизни

Многие из нас наверняка слышали имена Билла Гейтса, Стива Джобса, Марка Цукерберга, Сергея Брина, Ларри Пейджа, Эрика Шмидта, Линуса Торвальдса… Именно они, в первую очередь, ассоциируются с компьютерными технологиями.

Именно технологиями. Ведь и сама компьютерная сфера давно воспринимается не как наука. По крайней мере, в массовом сознании. Это так, что-то вроде ПК, планшетов и смартфонов. Банальное и несерьёзное. Есть у каждого. И не в одном экземпляре. Сродни коллекционированию марок и значков.

Ах, да пресловутый искусственный интеллект, нейронные сети… Ну, мы-то с вами в курсе, что в конечном счёте это некое программное обеспечение, исполняемое компьютерами. Т.е. те же самые программы.

Computer science, theoretical computer science — ерунда какая-то. Не надо людям голову морочить пафосным названием «компьютерные науки». Самая банальная информатика. Бери любой язык, любую систему программирования и клепай, что хочешь. Разве нет?

Интересно, а чем такое восприятие отличается по сути от той же литературы — поэзии, прозы, публицистики, да и просто от написания любых текстов — рекламных, деловых, научных, художественных… Азбуку ведь все знают. Или почти все. Грамотные. Писать как-то умеют. Всего и делов.

Вот и программирование вкупе с компьютерными науками стало восприниматься столь же доступным и элементарным. Ума много не надо. Навыков — тоже. А качество — кто его вообще проверяет? Работает и ладно. Кто же вам даст инспектировать свои исходные тексты? Да и что вы там разберёте, когда объёмы подчас исчисляются десятками и сотнями тысяч строк, завязанных на самые разные платформы и библиотеки?

Так стоит ли разочаровывать всезнающего читателя? Вот уж не знаю. Переубедить сегодня нелегко. Да и нужно ли?

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

Начну с конца.

Утверждение, тезис: «Если программа правильно работает, это не означает, что в ней нет ошибок. Даже если в ней их действительно нет».

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

В сфере компьютерных наук давно уже существует аналог Нобелевской премии — Премия Тьюринга (Turing Award). Она была учреждена крупнейшей американской ассоциацией ACM (Association for Computing Machinery) в 1966 г. Т.е. 55 лет назад. Проводится тоже ежегодно. И вручается тоже за самые выдающие мировые достижения в данной сфере интеллектуальной деятельности.

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

Забавно, что Альфред Нобель, некогда сколотивший состояние сначала на военных заказах для русской армии в Крымскую войну (1853-1856), а затем и на российской нефти, был изначально куда более благосклонен к математике — царице наук. Но что-то там не сложилось. Что-то ему не понравилось. Он её вычеркнул и заменил премией мира. Весьма показательно. Одного этого факта достаточно, чтобы понять всю условность распиаренной Нобелевки.

Но не будем о грустном. В конце концов, у математиков есть своя Нобелевка — Филдсовская премия (Fields Medal). Правда, вручается раз в четыре года (но не одному). Только учёным до 40 лет, а не всем подряд. И размер её 12 тыс. долларов США. А не 1,1 млн, как у Нобелевки в 2019 г.

То, что математики и программисты выглядят изгоями на этом празднике жизни, общественность не смущает. Ну так сложилось, так повелось. Все уже привыкли. Да и в деньгах и славе разве счастье?

Итак, компьютерные науки. Премия Тьюринга. 1983 год. Лауреатами стали Деннис Ритчи (автор языка Си) и Кен Томпсон (автор операционной системы UNIX).

Мэтры, титаны… Это вам не Гейтс и не Джобс.

Свою тьюринговскую лекцию Кен Томпсон назвал более чем прозрачно: «Размышления о том, можно ли полагаться на доверие» (Reflections on Trusting Trust).

Да простит меня читатель за очередное занудное отступление. Небольшие пояснения. Компилятор — это программа, которая транслирует исходный текст на конкретном языке программирования. И в результате преобразует его в набор исполняемых команд (инструкций) целевого процессора. Т.е. это программа, которая производит другие программы по вполне конкретному, чёткому образцу, который и задаётся исходным текстом.

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

Вот об этом и стал толковать мудрый Кен Томпсон. Причём цель его выступления с высокой трибуны ACM, полагаю, была не просто поведать программистам о «шпионских» компьютерных закладках и жучках. Он по сути раскрыл всему миру глаза на общий принцип надувательства. Гарантированный и формализованный. В любой сфере. Только вот мир этого явно не понял и не услышал.

Кен Томпсон: «Компилятор Си написан на Си. То, о чём я собираюсь рассказать, представляет собой одну из разновидностей проблемы курицы и яйца, которая возникает, когда компиляторы пишутся на том же самом языке».

Далее он пояснил, что раз компилятору поручено преобразовывать исходный текст в исполняемый код, в принципе нет проблем встроить в него особую реакцию на особые случаи. В основном он работает штатно и честно. Но когда распознает особый случай, «подсовывает» в финальный код некую свою «закладочку», «жучок».

Простите, скажет проницательный читатель, мы же его тут за руку и поймаем. Сравним, где честно, а где нечестно.

Увы… Томпсон вынужден вас разочаровать. Можно сделать так, что вы НИЧЕГО не обнаружите. Как — в своей лекции он детально пояснил. Желающие могут почитать перевод и оригинал.

А вот и неутешительный вывод. Кен Томпсон: «Мораль ясна. Нельзя доверять программе, которую вы не написали полностью сами (особенно если эта программа пришла из компании, нанимающей таких людей, как я). Сколько бы вы не исследовали и не верифицировали исходный текст — это не защитит вас от троянской программы. Для демонстрации я выбрал компилятор Си. Я мог бы выбрать любую программу, обрабатывающие другие программы — ассемблер, загрузчик или даже микропрограмму, зашитую в аппаратуру. Чем ниже уровень программы, тем труднее и труднее обнаруживать подобные «жучки». Мастерски встроенный «жучок» в микропрограмме будет почти невозможно обнаружить».

Справедливости ради, стоит сказать, что в 2005 г. Дэвид Уилер (David Wheeler) нашёл-таки способ решить эту проблему Томпсона. (Дэвид Уилер ныне занимает высокий пост директора по безопасности в Linux Foundaton.) Решение базируется на понятии доверенного компилятора, которым особым образом и проверяют потенциально инфицированный.

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

Попробуйте сегодня найти доверенный компилятор. Реально доверенный. Если, разумеется, вы не делали его своими собственными руками. О чём и твердил мудрый Кен Томпсон. Который в свои почти 80 лет работает теперь в Google и участвует в развитии языка Go.

Теперь перекинем мостик из компьютерной сферы в реалии нашей жизни. Обычная ситуация. Есть набор документов или неких фактов. Предположим, что в их достоверности мы убедились. Изучали под лупой. Пробовали на зуб. Тщательно выверяли. Пусть так. Это и есть аналог исходного текста. Но дальше вступает в действие интерпретация этих данных (стадия компиляции). Она подразумевает наличие контекста («исполняющей системы компилятора»).

Схема суждений выглядит так: (1) факты (документы, данные) --> (2) знания (контекст, источники) --> (3) интерпретация (гипотезы, постулаты).

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

Как только мы включаем режим профессиональной доверенности (как же — признанный эксперт, доктор наук, профессор, академик и т.п.), мы по сути попадаем в воронку модели Кена Томпсона. У нас нет времени самим писать свой «компилятор» (долго и дорого), как и времени на то, чтобы тщательно сделать трассировку всей логики работы данного «компилятора» (как и почему данный специалист пришёл к этим выводам, насколько они носят оценочно-предположительный характер).

Факторы времени и знаний... Той и другой стороне проще перейти на категоричность суждений. Да, это так. Мы верим. А эксперт в очередной раз остаётся бесконтрольным и по сути никак не рискует своим реноме. Ибо всегда может сослаться на своё частное мнение. Ни к чему не обязывающее.

И в завершение… Вновь взглянем на мой исходный тезис. «Если программа правильно работает, это не означает, что в ней нет ошибок. Даже если в ней их действительно нет».

Это утверждение можно обобщить. Вместо слова «программа» подставить слово «теория». Речь, разумеется, о научной теории. Но можно спокойно распространять практически на любую систему идей и взглядов. В любой сфере.

Как же так? Это покушение на вековечные устои науки? Да нет. Просто осознание реальности, когда всю шелуху накопившихся иллюзий начинаешь постепенно и аккуратно счищать.

Так кому можно доверять в нашем несовершенном мире? Правильно: никому. Мне и Томпсону — можно…


• Фото: Алексей Лозгачев (Самара), 2021.
• Название: «Творение».


• Лекции лауреатов Премии Тьюринга: http://rkka21.ru/turing_award.htm
• Соджетто о соджетто: http://proza.ru/2020/09/27/1704