Эдсгер Вайб Дейкстра
"Ремесленник или ученый?"

Edsger Wybe Dijkstra
"Craftsman or Scientist"

Опубликовано в журнале "Компьютерра" №41 от 28 октября 2002 года

Аннотация
Эссе "Craftsman or Scientist?" ("Ремесленник или ученый?") написано в 1975 году и прочитано на конференции "ACM Pacific 75" в Сан-Франциско. Кроме того, этот текст был пронумерован Дейкстрой (получил номер EWD480) и, таким образом, вошел в его знаменитую коллекцию, содержащую более тысячи самых разнообразных работ. Некоторые из них впоследствии были переработаны автором и послужили основой для его книг, в том числе и доступных русскому читателю: "Заметки по структурному программированию" вышли в издательстве "Мир" еще в 1975 году, а "Дисциплина программирования" - в 1978-м; еще два эссе - "Притча" (EWD594) и "Как быть, если правда глаза колет" (EWD498) - стали широко известны как "программистские басни". Однако большинство из них на русский язык не переводились. Об эссе "Craftsman or Scientist?" можно рассуждать долго, но нужно ли? Забегая вперед и говоря словами самого Дейкстры: читатель без труда узнает знакомые черты в этом описании...

Константин Кноп [knop@computerra.ru]

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

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

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

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

Я сделал для вас набросок двух крайних точек на шкале образовательных методов, но это только вступление: моя настоящая тема - <куда на этой шкале мы должны поместить обучение программированию?>. Как я понял на своем грустном опыте, тема эта весьма рискованна для открытой дискуссии. Я часто обсуждал ее с людьми, имеющими непосредственно отношение к профессиональному программированию, и предмет этот всегда вызывал у них сильные эмоциональные реакции. Давайте попробуем понять эти реакции, и тогда мы сможем попытаться справиться с ними.

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

Мы должны понять, что в программистской сфере это сражение еще не закончено. Будучи в одной из европейских стран, неважно в какой, я изучил там предложение об организации преподавания вычислительных наук в университетах. Большинство его авторов - профессора вычислительной науки (computer science) в этой стране - должны быть охарактеризованы как <ремесленники>. В результате их предложение имело явную антиинтеллектуальную окраску: в нем делался упор на то, что студентам преподавать, как решать задачи из <реального мира>, и дальше следовал вывод, что учебный план должен касаться абстрактных тем настолько мало, насколько возможно. Вы, несомненно, узнаете в этом тезисе точку зрения ремесленника в чистом виде.

На другом краю мы имеем чистого ученого: если мы дадим ему власть принимать решения, результат тоже будет плачевным. Он будет видеть свою дисциплину - будь это теория автоматов, рекурсивная теория функций, теория формальных грамматик, логика или теория очередей - с исключительной ясностью, которую мы имеем право ожидать от современного ученого, но одну вещь ему принять почти невозможно: что его красивый формальный аппарат не исчерпывает содержания обучения. Со времен Тьюринга мы имеем полную теорию того, как управлять битами. Разве она не делает лишними все вычисления? К чему интересоваться проблемами <реального мира>? Теория доказала, что все эти проблемы могут быть решены, так зачем беспокоиться о фактическом решении? Вы, несомненно, узнаете в этих тезисах точку зрения настоящего ученого в чистом виде.

Следовательно, обе крайности плохи, и мы должны как-то смешать их. Но теперь мы должны быть внимательными, поскольку <смешивание> - не одномерный процесс. Оно не сводится к <столько-то процентов ремесленника и столько-то процентов ученого>, а должно быть описано как <вот это от ремесленника, а это от ученого>.

Увы, я вынужден описать вам всю гибельность картины смешивания технологий Ремесленника с подходом Ученого. Ремесленник не имеет никакого сознательного, формального владения предметом, он только <знает>, как использовать инструментальные средства. Если объединить это с подходом ученых к созданию явного знания, ремесленник опишет то, что он знает (то есть свои инструментальные средства), вместо описания, как надо их использовать! Если он - живописец, он сообщит ученикам все, что знает о кисточках, а также все, что ему известно о колебаниях цен на холст. Если он - профессор вычислительной науки, он сообщит своим студентам все, что знает о существующих языках программирования, машинах, операционных системах, пакетах прикладных программ, и все уловки, обнаруженные им при непосредственном программировании. Он не просто перечислит указанные в руководстве пробивки 17-го столбца первой перфокарты для установки приоритета вашего задания в очереди, но обязательно упомянет недокументированную пробивку в 17-м столбце, которая обеспечит вашему заданию высший приоритет, а оплату начислит как за низший. Опять-таки, вы несомненно можете узнать знакомые черты в этом описании.

О гибельности такого смешивания нужно специально предупреждать, и не только для того, чтобы продемонстрировать точку зрения, согласно которой выбор пробивки в 17-м столбце перфокарты имеет такое же отношение к программированию, как выбор между карандашом и шариковой ручкой - к математике. Об этом нужно предупреждать, потому что такое смешивание не просто гибельно, оно до сих пор весьма уважаемо! С одной стороны, вы находитесь в сфере проблем реального мира, и никто не может обвинить вас в чрезмерном навязывании студентам абстракций. С другой стороны, вы настолько конкретны, насколько это возможно, а все, что вы сообщаете, является бесспорной истиной. Когда кто-то имеет наглость указывать вам, что знания, которые вы передаете, являются в лучшем случае малополезными и при этом совершенно произвольными, а кое в чем даже запутывающими, вы пожимаете плечами и говорите: <Но это - лучшее из имеющегося, не так ли?> Как будто это оправдывает подобный стиль обучения:

Все же я боюсь, что подобная форма обучения вычислительным наукам преобладает. Ведь как еще мы можем объяснить часто высказываемое мнение, что <период полужизни> специалиста по вычислительным системам приблизительно равен пяти годам? О чем еще говорит это высказывание, как не о том, что ему преподали хлам?

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

Основа технологии ученого - сделать явными как можно больше аспектов своего предмета. При этом обучение программированию включает обучение фактам - о системах, машинах, языках программирования и т. д. - и все это очень легко сделать явным. Но неприятность состоит в том, что эти факты составляют всего лишь 10 процентов. То, что должно преподаваться в оставшихся 90 процентах, - это <как решать задачи>, <как избежать непреодолимых трудностей>, - короче, это обучение умению мыслить, не больше и не меньше. Явное обучение мышлению - нетривиальная задача, но кто сказал, что обучение программированию проще? В нашей терминологии: чем более явно преподавать мышление, тем больше доля Ученого в будущем программисте.

Это, конечно, приводит нас к вопросу о том, как обучать мышлению. Чтобы сделать этот вопрос более реалистичным, мы несколько уточним его: знание, как преподавать мышление, не будет подразумевать, что каждый студент способен научиться этому. Это не должно нас смущать: в этом отношении <мышление> не отличается от любой другой темы, которую мы преподаем. Можно ли преподавать мышление? Реклама на последней странице обложки моего издания книги Пойа <Как решать задачу> звучит весьма обнадеживающе: <Пойа, как умелый преподаватель, показывает нам, как снять шоры, мешающие думать, и ведет нас к ясному и продуктивному образу мыслей>.

Звучит отлично, однако это всего лишь реклама: Между тем другая большая работа Пойа по этой же тематике - <Математика и правдоподобные рассуждения> - была прохладно встречена математическим сообществом и оказала крайне незначительное влияние на обучение математике в университетах. Однако после некоторого размышления понимаешь, что прохладный прием книги Пойа математическим сообществом не означает неправоты автора. Напротив! Такое отношение может интерпретироваться и как реакция математической гильдии, которая, как и все другие гильдии чувствует угрозу раскрытия тайн ремесла. Впервые изданная тридцать лет назад, книга Пойа о процессе математических открытий была сочтена ересью, и таковой она остается в глазах многих математиков и сегодня. Процитирую книгу <Менеджмент и Макиавелли> Энтони Джея: <В корпоративных религиях, как и в остальных, еретик должен быть изгнан не из-за вероятности того, что он ошибается, а из-за возможности, что он прав>. Другими словами, неприятие работ Пойа говорит больше об интеллектуальной инерции математического истеблишмента, чем о качестве книг, так что на сей раз я предлагаю вам поверить рекламе!

Я рассматриваю книгу Пойа <Как решать задачу> в качестве первого шага в нужном направлении. Он рассматривает эвристику как своего рода контрольный список стандартных вопросов, которые могут быть полезны, чтобы не упустить простого, хотя и неожиданного решения, если оно существует. Когда я прочитал книгу в первый раз, я был несколько разочарован. Мое разочарование было прямым следствием того, что я уже был глубоко вовлечен в программирование: я чувствовал, что мои проблемы как программиста лежали в основном вне области, рассмотренной Пойа. Сначала я не хотел говорить так категорично, потому что те, кто заявляет об исключительности собственной сферы исследований, как правило, выглядят крайне смешными. Но после внимательного анализа я сделал вывод, что интеллектуальный вызов, представленный задачей программирования, на самом деле столь же беспрецедентен, как и высокоскоростной компьютер. Это вызвало в моем сознании сдвиг внимания от вопроса <как открыть неожиданное> к вопросу <как избежать непреодолимых трудностей>, а затем к <как уменьшить объем запросов к количественно ограниченным ресурсам нашего мышления>.

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

Однако следует помнить, что существуют некоторые пределы того уровня, на котором методы мышления можно преподавать явно, <в научной манере>. Как сказано у Пойа, <первое правило открытия - иметь мозги и удачу. Второе правило открытия - напрячься и ждать, пока не придет озарение. Следует также помнить, что некоторые стремления безнадежны. Безошибочные правила, ведущие к решению всех возможных математических проблем, были бы еще более желательны, чем философский камень, безуспешно разыскиваемый алхимиками. Такие правила работали бы как волшебство; однако волшебства не бывает. Находить неизменные правила, применимые ко всем видам проблем - старая мечта философов; но она никогда не станет больше чем мечтой>. И это - в книге, где обучение размышлениям напоминает обучение ремеслу, где, как в добрые старые времена цехов и гильдий, Мастер творит чудеса и может создать Школу своим примером.

К тем из вас, кто преподает в университетах и колледжах, у меня есть только одна просьба: пожалуйста, не стыдитесь, что ваше обучение размышлениям <ненаучно>! Помните, что вся непонятая глубина человеческой мысли - всего лишь игра ума в процессе человеческого общения. Мы - несмотря на то, что думают по этому поводу психологи, педагоги и т. п. - очень слабо понимаем, как происходит передача знаний, понимания и навыков. Весьма вероятно, что передача знаний в виде фактов - всегда всего лишь имитация, и что все явное обучение в научной традиции не больше, чем сообщение студенту вербальных подпорок, которые просто-напросто помогают его памяти. Если это так, то все <научное обучение> - то есть явные правила и ничего более - должно быть навсегда отброшено как бесплодное и непродуктивное занятие.

Я хотел бы закончить маленькой историей, приоткрывшей мне абсолютную тайну человеческого общения. Однажды я пошел к фортепиано с намерением сыграть сонату Моцарта, но у клавиатуры внезапно передумал и вместо этого заиграл Шуберта. После первых тактов моя удивленная мать прервала меня словами <я думала, что ты собирался сыграть Моцарта!> В тот момент она читала книгу и всего лишь краешком глаза видела, что я иду к фортепиано. Однако выяснялось, что всякий раз, когда я шел к инструменту, она уже знала, что именно я собирался играть! Как? Единственным объяснением является то, что она знала меня в течение семнадцати лет. С тех пор я думаю, что тщетно пробовать понять то, что происходит в классной комнате между тем, кто преподает, и тем, кто узнает новое. Следовательно, не иметь никакой модели этого процесса безопаснее, чем, имея такую модель, забывать о ее погрешностях. Спасибо за внимание.