О суровости настоящего преподавания информатики

On the cruelty of really teaching computing science. EWD1036.

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

Мы планируем завтрашний день сегодня, пользуясь вчерашними словами. Мы вынуждены так поступать, если хотим обойтись знакомыми концепциями, смысл которых определяется прошлым опытом. Конечно, слова и концепции не всегда подходят, потому что будущее отличается от прошлого, и тогда мы немного расширяем значение слов. Лингвистам хорошо знаком феномен, когда значение слов меняется со временем. Также они знают, что это медленный и постепенный процесс.

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

Чтобы справиться с радикальной новизной, нужен ортогональный метод. Человек должен смотреть на своё прошлое, накопленный опыт и сформировавшиеся привычки как на достойную сожаления случайность, человек должен подходить к радикальной новизне с чистым разумом, сознательно отвергая всякие связи между ней и знакомыми вещами, потому что знакомые вещи безнадёжно далеки. Человек должен, выработав поначалу что-то вроде раздвоения личности, овладеть радикальной новизной как отдельно стоящей темой. Чтобы овладеть радикальной новизной, нужно создать и освоить новый иностранный язык, с которого невозможно переводить на родной язык. (Меня поймёт любой, кто изучал квантовую механику.) Разумеется, люди не слишком любят радикальные новинки, потому что приспосабливаться к ним — тяжкий труд.

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

Я кратко перечислю исторические факты. Карл Фридрих Гаусс, король математиков, но в то же время и немного трус, думал о судьбе Галилея — и, возможно, предвидел травлю Эйнштейна — когда решил скрыть открытие неэвклидовой геометрии, оставив борьбу за прогресс Бойяи и Лобачевскому. Наверное, будет даже показательнее переместиться в Средневековье. «Рассуждение по аналогии» было весьма распространено в ту эпоху; также та эпоха известна интеллектуальной стагнацией, и теперь мы понимаем, почему первое и второе идут рука об руку. Этот пример актуален, потому что и в наше время человек, развивший нюх на безосновательные аналогии, может увидеть много образчиков средневекового мышления.

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

Например, большинство математиков никогда не сомневались в том неявном предположении, что в будущем не произойдёт существенных изменений в умственной работе математика: новые разделы математики будут рождаться, цвести и увядать, как это было всегда, но, поскольку человеческий мозг не меняется, наши методы преподавания, обучения и понимания математики, решения задач, математических открытий останутся по сути прежними. Герберт Роббинс чётко объяснил, почему квантовый скачок в математических способностях невозможен:

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

Я оставил пометку на полях: «Так меньше используй мозг, вычисляй!» Используя аналогию самого Роббинса, можно сказать, что, чтобы добраться из пункта А в пункт Б, сейчас существуют альтернативы, на порядки более эффективные, чем бег. Роббинс отказывается признавать, что существует хоть какая-то альтернатива освящённой временем умственной работе под названием «делать математику». Таким образом, он изгоняет опасную новизну, просто подгоняя определение под свои нужды: просто по определению математика останется такой же, какой была. Достаточно о математиках.

Позвольте привести ещё один пример того, как люди отказываются признавать существование радикальной новизны и не учатся справляться с ней. Это широко распространённая методика преподавания, для которой единственной парадигмой является постепенная, практически незаметная эволюция. Приходится отбрасывать огромное количество учебников из-за того, что они обращаются к интуиции студента. Они видоизменяют увлекательные новинки так, чтобы они казались читателю настолько знакомыми, насколько возможно. Они всегда связывают новый материал с тем, что знакомо читателю. Эта методика применяется уже при изучении арифметики. Вместо того, чтобы учить 2 + 3 = 5, учителя прячут отвратительный арифметический оператор «плюс» за словом «и» и дают маленьким деткам массу знакомых примеров с яблоками и грушами, которым вход разрешён, в противоположность в той же мере счётным процентам и электронам, которым вход воспрещён. Та же самая глупая традиция существует и в университетах: студенты разных специальностей (физик, архитектор, бизнесмен) изучают разные начальные курсы математического анализа, и каждый курс украшен примерами из соответствующих дисциплин. Кажется, что образовательная догма всеми силами скрывает от студента, что он учит что-то действительно новое; и студент чаще всего не видит новизны. То, что существующая методика преподавания не может подготовить новое поколение к феномену радикальных новинок, я считаю серьёзным изъяном. [Когда король Фердинанд посетил консервативный университет в Сервере, ректор гордо заверил монарха словами: «Сир, пусть будет далека от нас опасная новизна помыслов». (Оригинальная фраза: «…Nos ponemos a los pies de V. M. para manifestar los sentimientos que nos animan; todos somos de un corazón y de una alma; lejos de nosotros la peligrosa novedad de discurrir que ha minado por largo tiempo, reventando al fin con los efectos que nadie puede negar de viciar costumbres, con total trastorno de imperios y religión en todas las partes del mundo; lejos todo odio contra quien hubiere sido en algún tiempo enemigo; lejos toda crueldad que detestada por la milicia armada, mucho más debe serlo por la togada…» Universidad de Cervera (Declaración de apoyo a Fernando VII, Gaceta de Madrid, 3 de mayo de 1827) — Примечание переводчика.) Проблемы, которые свалились на Испанию в последовавшим за этим столетии, только подтверждают серьёзность моих опасений.] Достаточно о том, как образовательные учреждения обожают парадигму постепенной эволюции.

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

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

Первая новизна состоит в мощности современного вычислительного оборудования. Всем известно, как мы справляется с чем-то большим и сложным: разделяй и властвуй, то есть мы смотрим на целое как на сочетание частей и оперируем частями по отдельности. Если часть слишком велика, мы повторяем этот приём. Город состоит из микрорайонов, которые образованы улицами, которые состоят из зданий, которые состоят из стен и перекрытий, которые сделаны из кирпичей, и так далее вплоть до элементарных частиц. И каждый уровень обслуживается специалистами: градостроительство, архитектура и так далее до физики твёрдого тела. Целое в некотором смысле «больше» своих частей; глубина иерархической декомпозиции является как бы логарифмом отношения «размеров» целого и самых мелких частей. От бита до нескольких сотен мегабайт, от микросекунды до получаса вычислений мы проходим обескураживающее отношение 109! Программист находится в уникальном положении, так как только в его дисциплине и профессии нужно заполнить это невероятное отношение какой-то одной технологией. Он должен думать в терминах концептуальных иерархий, которые глубже любых иерархий, о которых кто-либо когда-либо думал. Средняя математическая теория выглядит практически плоской в сравнении с таким количеством семантических уровней. Требуя глубоких концептуальных иерархий, автоматический компьютер бросает нам радикально новый интеллектуальный вызов, равного которому не было в истории.

Я опять должен подчеркнуть радикальность этой новинки, потому что последователь культа постепенных изменений не замечает её. Для него автоматический компьютер — это обычный кассовый аппарат, только крупнее, быстрее и с большим количеством функций. Но эта аналогия по-детски поверхностна: её ошибка на порядки больше, чем когда вы сравниваете сверхзвуковой самолёт и ползающего ребёнка как транспортные средства. Их скорости относятся всего лишь как 1000:1.

Вторая радикальная новизна заключается в том, что автоматический компьютер является нашим первым масштабным цифровым устройством. Мы и раньше создавали устройства со значительным количеством цифровой электроники: уже упомянутый кассовый аппарат; печатающая машинка: одно нажатие печатает «Q» или «W», но не обе сразу, хотя клавиши с этими буквами находятся рядом. Но эти механизмы являются исключениями, и большинство механизмов рассматриваются как аналоговые устройства, поведение которых описывается непрерывной функцией всех параметров на большой области определения: если мы чуть сильнее надавим на карандаш, мы получим чуть более толстую линию, если скрипач немного сместит палец, он сыграет звук немного другой высоты. Я должен добавить, что, если уж мы согласны считать себя механизмами, мы считаем себя аналоговыми устройствами: если мы чуть больше постараемся, мы добьёмся чуть большего. Очень часто поведение описывается не только непрерывной, но и монотонной функцией: чтобы определить, подходит ли молоток для забивания некоторого множества гвоздей, мы испытываем молоток на наибольшем и наименьшем гвоздях, и если результат этих двух экспериментов положителен, то мы уверены, что молоток подходит ко всем гвоздям промежуточного размера.

Можно рассматривать программу как абстрактный механизм, что-то типа прибора. Такой взгляд даже привлекателен. Но этот взгляд очень опасен: программа как механизм кардинально отличается от тех механизмов, с которыми мы привыкли иметь дело. Как и любая цифровая информация, она имеет неотъемлемое, но неприятное свойство, что малейшее искажение — изменение одного бита — может привести к чудовищным последствиям. [Для полноты я должен добавить, что картина существенно не изменилась с добавлением избыточного кодирования и кодирования с исправлением ошибок.] В дискретном мире вычислений нет и никогда не будет осмысленной метрики, в которой «малое» изменение входа соседствует с «малым» изменением выхода.

Это радикальное новшество постигла обычная судьба: его отрицают, потому что правда колет глаза. Я не знаю, во сколько это отрицание обходится Соединённым Штатам, но миллион долларов в день кажется скромной оценкой.

Я описал в наиболее общих терминах суть новинок и теперь собираюсь показать, что эти новинки действительно являются радикальными. Для этого я опишу некоторые феномены, которые в противном случае казались бы необъяснимыми. Я объясняю эти феномены как попытки не обращать внимание на непривычные вещи.

Ряд этих феноменов можно объединить под названием «инженерия ПО» (или «технология разработки ПО», software engineering — примечание переводчика). Если экономическую теорию называют «нищей наукой» (The Miserable Science), то инженерию ПО нужно называть «обречённой дисциплиной», обречённой потому, что она не может даже приблизиться к своей цели, так как эта цель противоречива. Конечно, инженерию ПО представляют как ещё одно полезное занятие, но нам просто пудрят мозги: если вы внимательно почитаете литературу и присмотритесь, что делают адепты этого занятия, то увидите, что в качестве путеводной звезды они выбрали лозунг «Как программировать, если ты не умеешь программировать».

У меня вызывает подозрение даже популярность названия этой дисциплины. В обществах, которые мы называем «примитивными», нередко встречается такое суеверие, что если вы знаете истинное имя некоторого человека, то вы имеете над ним магическую власть. Вообще-то, мы недалеко от них ушли: почему мы упорно отвечаем на звонок бесполезным «алло», а не своим именем?

Мы не избавились от примитивного суеверия, что можем обуздать страшного и опасного демона, дав ему безобидное, знакомое, невинное имя «инженерное дело». Это символическое действие. Что и доказал несколько лет назад один из производителей компьютеров в США, за одну ночь наняв сотни «инженеров ПО»: он просто повысил своих работников-программистов до этой высокой должности. Достаточно об этом названии.

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

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

Термин «поддержка ПО» раскрывает новую сторону неправильного понимания. Благодаря ему многие люди верят, что программы и даже сами языки программирования могут изнашиваться и ломаться. Что тут странного? Ведь даже автомобилям нужно обслуживание. Есть известная история с нефтяной компанией, в которой верили, что программы на Фортране прослужат дольше, чем программы на Паскале, «потому что Паскаль не поддерживается».

Развивая тему, я хочу подчеркнуть, с какой удивительной готовностью люди верят в то, что можно решить все проблемы производства ПО с помощью «правильных инструментов». (Отсюда возник термин «среда разработки». (Programmer’s workbench, слово «workbench» само по себе означает «верстак», что делает аналогию между программистом и столяром совсем прозрачной — примечание переводчика.)) Детскость этой аналогии достойна Средневековья. Столкнувшись с этими убогими «инструментами» для «анимации алгоритмов», я нисколько не смягчил своего приговора; напротив, опыт ещё раз убедил меня, что мы имеем дело с новым видом шарлатанов.

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

Достаточно о том, что новизна компьютеров является действительно радикальной.

Мы переходим ко второй, более трудной части моего выступления, которая описывает последствия для науки и образования. Последствия для образования, конечно, более запутанны, поэтому давайте пока отложим их и поговорим только об информатике (computing science, буквально переводится как «наука о вычислениях» — примечание переводчика). Что есть вычисление? Что изучает наука о вычислениях?

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

Но, чтобы компьютер выполнял осмысленные манипуляции — если хотите, вычисления — мы должны сначала написать программу. Что есть программа? Существует несколько ответов. Мы можем рассматривать программу как штучку, которая превращает универсальный вычислитель в специализированный, не переключая ни единого проводника. (Это существенное усовершенствование, если сравнивать с машинами, которые имели коммутационные панели.) Я же предпочитаю описывать программу по-другому: это абстрактный манипулятор символами, который можно превратить в конкретный, добавив компьютер. Сейчас уже не так, что программы нужны, чтобы управлять машинами; машины нужны, чтобы исполнять программы.

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

Таким образом, наука о вычислениях изучает — и всегда будет изучать — взаимодействие между механической и ручной манипуляцией символами, которые обычно называются «вычисление» и «программирование» соответственно. Преимущество этого определения в том, что из него мы немедленно делаем поразительный вывод, что термин «автоматическое программирование» является противоречивым. Второе преимущество в том, что определение точно указывает нам, где на карте интеллектуальных дисциплин находится наука о вычислениях — в направлении формальной математики и прикладной логики, но намного дальше их, потому что она требует эффективного применения формальных методов и в гораздо более широких масштабах, чем это было до сих пор. Поскольку в наши дни любой уважаемый проект имеет ТБА (= трёхбуквенный акроним), я предлагаю назвать науку о вычислениях «ПФМ» (= проект «формальные методы» (Formal Methods Initiative)), и, чтобы спать спокойно, нам стоило бы последовать примеру наших флагманов и зарегистрировать это название как торговую марку.

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

Конечно, не все приветствуют такое видение. Наоборот, со всех сторон его встречают враждебно, буквально в штыки. Привожу примеры:

Шестой пример незаметно, но неизбежно привёл нас к той самой запутанной части выступления — к образованию.

Изъян наших методик обучения состоит в том, что они определяются не соображениями и законами той науки, которой учат, а случайными ненаучными факторами: средним арифметическим ожиданий студентов, их родителей и будущих работодателей; ролью университетов в обществе. Как вы думаете, роль университетов в том, чтобы подготовить выпускников к вакансиям для молодых специалистов, или в том, чтобы предоставить интеллектуальный фундамент для развития на ближайшие 50 лет? Мы должны, скрипя зубами, допустить абстрактные науки в самый захудалый домишко кампуса, или мы должны принять их как двигатель научно-технического прогресса? В последнем случае, должны ли мы считать научно-технической такую вещь, «техническая» сторона которой заключается в формальной математике? Университеты дают обществу интеллектуальное лидерство, в котором общество нуждается, или всего лишь интеллектуальную тренировку, которую общество заказывает?

Традиционная академическая риторика, конечно, даёт жизнеутверждающие ответы на эти вопросы, но я ей не верю. Проиллюстрирую недавней статьёй «Кто правит Канадой?» Её автор, Дэвид Флаэрти, бесцеремонно заявляет: «Более того, элита бизнеса презирает традиционных учёных и интеллектуалов как бесполезных и бессильных».

Поэтому, когда я высматриваю в своём хрустальном шаре смутное будущее информатики, я вижу одну и ту же печальную надпись: «Бизнес, как всегда». Университетам не хватает храбрости учить точным наукам, они продолжают вести студентов в тупик, и каждую новую инфантилизацию учебной программы приветствуют криками «Слава прогрессу!»

Я пользуюсь моим хрустальным шаром довольно давно. Хотя его предсказания неизменно мрачны и обычно правильны, я уже привык. Они не удержат меня от того, чтобы дать несколько рекомендаций, хотя всё это тщетно и только увеличивает угрызения совести.

Можно начать чистить язык. Например, мы можем называть баг (bug, буквально переводится как «насекомое» — примечание переводчика) не багом, а ошибкой. Это продемонстрирует нашу честность, потому что мы возлагаем вину за ошибку на настоящего виновника — на программиста, допустившего ошибку. Воображая сельскохозяйственного вредителя, который пролез в программу, пока программист отвернулся от экрана, мы обманываем себя и других. Мы скрываем тот факт, что программист создал ошибку. Это интеллектуальная нечестность. Эффект от этого простого и приятного изменения терминологии будет значительным: если раньше программа с одной-единственной ошибкой называлась «почти правильной», то теперь программа с ошибкой называется просто «неправильной» (из-за ошибки).

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

Нужно принимать меры, потому что антропоморфная метафора — за которую мы должны сказать спасибо Джону фон Нейману — невероятно мешает любому сообществу, работающему в сфере информатики. Получается, что программы хотят чего-то, знают что-то, ожидают чего-то, догадываются о чём-то и так далее. Эти фразы всегда приводят к путанице. Аналогия настолько поверхностна, что она не только путает, но и парализует.

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

Позвольте объяснить, какие затраты я имею в виду, и убедить вас, что «колоссальный» вовсе не является преувеличением. На некоторое время мне придётся обратиться к формализму, но не бойтесь: рассуждения такого уровня любой человек может делать в уме. Если нужно доказать что-либо обо всех элементах большого множества, то было бы пустой тратой сил рассматривать каждый элемент отдельно. Эффективное доказательство ссылается не на элементы, а на определение множества.

Пусть Q — плоская фигура, квадрат 8×8, из которого убрали две противолежащие клетки. Площадь фигуры Q равна 62, что равно суммарной площади 31 костяшки домино размером 1×2. Теорема гласит, что нельзя накрыть фигуру Q указанным набором костяшек.

Другими словами, у вас не получится выложить на бумаге в клетку фигуру Q костяшками домино.

Эту теорему можно доказать, сгенерировав все возможные расположения 31 костяшки и проверив, что ни одно из них не равно фигуре Q. Сизифов труд.

Однако существует более лёгкое доказательство. Раскрасьте клетки бумаги в шахматном порядке. Поскольку одна костяшка накрывает две соседние клетки, она накрывает одну белую и одну чёрную клетки. Таким образом, любая фигура из костяшек накрывает столько же белых клеток, сколько и чёрных. Но количество белых клеток и количество чёрных клеток, которые накрыты фигурой Q, отличается на 2, так как противолежащие клетки лежат на одной диагонали. Поэтому из костяшек невозможно составить фигуру Q.

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

Конец примера. Этот пример демонстрирует силу элементарной математики. Излишне говорить, что отказ применять математику равносилен интеллектуальному и технологическому самоубийству. Мораль сей басни такова: работайте с элементами множества, игнорируя их и работая с определением множества.

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

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

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

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

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

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

С одной стороны, мы преподаём материал, который похож на исчисление предикатов, но совсем не так, как это делают философы. Чтобы начинающий программист хорошо набил руку в манипулировании неинтерпретированными формулами, мы преподаём логику в контексте булевой алгебры, знакомим студента с алгебраическими свойствами логических связок. Чтобы ещё сильнее оборвать связь с интуицией, мы переименовываем значения {истина, ложь} булевого домена в {чёрный, белый}.

С другой стороны, мы излагаем простой и ясный императивный язык программирования, с пропуском (skip) и множественным присваиванием в качестве базовых инструкций, с блочной структурой для локальных переменных, точка с запятой обозначает композицию инструкций, элегантная конструкция выбора (alternative construct), элегантное повторение и, если очень хочется, вызов процедуры. К этому добавляем минимум типов данных, скажем, булевый тип, целые числа, символы и строки. Важно, чтобы ко всем конструкциям, которые мы вводим, была определена семантика с помощью правил вывода.

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

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

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

Моё предложение не нужно воспринимать всерьёз, потому что выучить подобный материал для первокурсника колледжа абсолютно нереально. Этот трюк тоже не пройдёт. Вам только кажется, что это слишком тяжело. С начала 80-х сотни первокурсников каждый год проходят такой курс в колледжах. [Мой опыт говорит, что произнести предыдущее предложение один раз недостаточно. Поэтому следует повторить его ещё как минимум два раза.] Следующая попытка.

Вы нехотя признали, что в принципе возможно прочитать такой курс самым способным студентам. Однако всё равно моё предложение неприемлемо по той причине, что этот курс настолько отличается от всего того, к чему привык и чего ожидает 18-летний молодой человек, что преподавание такого курса есть педагогическая безответственность: студент просто ничего не поймёт. И этот трюк тоже не проходит. Действительно, студент, который никогда в жизни не манипулировал неинтерпретированными формулами, быстро понимает, что от него требуют решать такие задачи, которых он раньше никогда не решал. К счастью, правила манипулирования просты и немногочисленны, поэтому студент успокаивается, когда видит, что он постепенно овладевает навыком, и этот навык даёт ему такие возможности, о которых он даже не мечтал.

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

Остин, 2 декабря 1988 года

Prof. dr. Эдсгер Вибе Дейкстра
США
Остин, TX 78712-1188
Техасский университет в Остине
Кафедра информатики

Расшифровка: Javier Smaldone.
Откорректирован 12 мая 2009 года.