Алан Кей: как бы я преподавал Computer Science 101
«Одна из причин, чтобы на самом деле поступить в университет — это выйти за рамки простой профессиональной подготовки и вместо этого уцепиться за более глубокие идеи.»
Давайте немного задумаемся над этим вопросом. Несколько лет назад кафедры Computer Science пригласили меня для лекций в ряде университетов. Почти случайно я спросил свою первую аудиторию, состоящую из старшекурсников, аспирантов и профессоров, об их определении «Computer Science». Все смогли дать только инженерное определение. Я проделывал это в каждом новом месте, и везде были похожие результаты.
Другим вопросом было: «Кто такой Дуглас Энгельбарт?». Несколько людей сказали: «разве он не был как-то связан с компьютерной мышью?» (и это меня очень разочаровало, поскольку моё научное сообщество приложило много усилий для того, чтобы ответить на этот вопрос было возможно после двух-трех кликов мышки и убедиться, что Энгельбарт действительно был как-то связан с компьютерной мышью).
Отчасти проблема заключалась в отсутствии любопытства, отчасти — в узости личных целей, которые не были связаны с обучением, отчасти — отсутствии представления о том, что из себя представляет эта наука, и так далее.
Я работаю на полставки на кафедре вычислительной техники Калифорнийского университета несколько лет (по сути я профессор, но мне не нужно ходить на заседания кафедры). Периодически я веду занятия, иногда у первокурсников. За эти годы и без того низкий уровень любопытства к Computer Science значительно снизился (но также возрос уровень популярности, поскольку вычислительная техника рассматривается как путь к хорошо оплачиваемой работе, если вы умеете программировать и получили сертификат в лучшей 10-ке школ). Соответственно, ни один студент ещё не жаловался на то, что первым языком в Калифорнийском университете является С++!
Мне кажется, мы столкнулись с ситуацией, в которой оба значения «Computer» и «Science» были разрушены слабыми массивными концепциями, чтобы создать новый термин — своего рода лейбл на джинсах — который хорошо звучит, но достаточно пуст. Связанный с этим термин, который был аналогичным образом разрушен, «программная инженерия», который, опять же, не использовал самые гениальные идеи «программирования» и «инженерии», а просто скомбинировал их (это было намеренно сделано в шестидесятых, когда и был придуман термин).
Одна из причин, чтобы на самом деле поступить в университет — это выйти за рамки простой профессиональной подготовки и вместо этого уцепиться за более глубокие идеи. Мне кажется довольно разумным для введения в специальность попытаться — если возможно, с помощью примеров — сделать так, чтобы обучающиеся занимались реальными проблемами и начали понимать, что на самом деле интересно, важно и центрально в этой области.
Первоклассники радуются, когда им показывают, как линейка поверх другой линейки становится арифмометром, с помощью которого они могут превзойти ребят из 5 класса при добавлении дробной части. А затем они будут счастливы принимать участие в разработке улучшенных арифмометров. Они прикоснулись к настоящему компьютеру — физическому и ментальному инструменту, помогающему нам думать. Они обучились действительно эффективному способу для представления чисел — более действенный, чем обучают в школах!
Они смогли соединить их здравую идею «добавления» как «накопления» с чем-то аналогичным с новыми мощными свойствами. Они запрограммировали его так, чтобы оно было способно решать разнообразные проблемы.
Они также расширили его. И так далее. Это не цифровой компьютер. И это не компьютер с запоминаемой программой. Но это суть компьютера. Точно так же, как антикитерский механизм — это вообще суть компьютера и вычислений.
Антикитерский механизм
Как далеко мы можем зайти и как много сделать перед тем, как все выйдет из-под контроля, и мы потеряемся в абстракциях? Я всегда был неравнодушен к характеристике Алана Перлиса — первого лауреата премии Тьюринга, который, возможно, изобрел термин «Computer Science» — который в 60-х годах сказал: «Computer Science — это наука о процессах». Всех процессах.
Ради компании Quora давайте не будем пытаться загонять это дальше или превращать в религиозную догму. Давайте просто счастливо использовать идею Ала Перлиса, чтобы лучше думать о нашей области. И особенно о том, как этому обучать. Сейчас нам нужно взглянуть на современное значение «науки», и Перлис был довольно уверен, что оно не должно разбавляться старыми значениями (например, таким, как «сбором знаний») и использованиями (к примеру, «библиотечное дело» или даже «общественные науки»). Под «наукой» он пытался понять феномен, создавая модели/карты, которые пытаются показать, «отследить» и предсказать явления.
Я дал несколько интервью о том, как лучшие карты и модели зачастую могут подойти для футболки, так, как подходят уравнения Максвелла и другие. Аналогия заключается в том, что существует «наука о мостах», хотя и большинство мостов сделаны человеком. Но как только мост построен, он отображает явления, учёные могут их изучать, из мостов возможно сделать модели многих видов и сформировать всесторонние и полезные «теории мостов». Забава в том, что затем можно спроектировать и построить новые мосты (я уже упоминал, что вряд ли есть что-то более забавное, чем совместная работа ученых и инженеров для решения больших и важных проблем!)
Герберт Саймон — лауреат премии Тьюринга и Нобелевской премии — назвал все это «науки об искусственном» (и написал великолепную книгу с таким же названием).
Позвольте привести пример. В 50-х годах компании и университеты строили компьютеры с запоминаемой программой и начинали программировать их — и был особый момент, когда в 1956 году появился Фортран — который не являлся первым языком высокого уровня, но, возможно, первым, сделанным настолько хорошо, чтобы его использовали во множестве разных областей, включая многие, которые ранее были сделаны только на машинном языке.
Все это породило «феномены».
Джон Маккарти
История Lisp’а более сложна, но Джон Маккарти заинтересовался попыткой найти «математическую теорию вычислений» и был полон решимости сделать так, чтобы всё работало отлично. Функция eval, которая интерпретирует Lisp, запросто помещается на футболке! По сравнению с «системой программирования» — это ничтожно. Что более важно, эта «теория вычислений» имела более мощную концепцию, чем Фортран! Это была лучшая идея моста!
Миниатюрность Lisp’а позволяет всей идее программирования быть схваченной с помощью пары нажатий на более глубоком уровне и быть обдуманной на уровне, который кажется просто невозможным, когда ты смотришь на огромные артефакты (это одна из причин, почему ученые любят, чтобы математика была компактной и мощной). Математика, использованная здесь, является новой математикой, поскольку допускает такие понятия как «до» и «после», и это приводит к «логике переменной величины», которая позволяет сохранять как функциональную зависимость, так и логический ход мысли, также при этом допуская положение и ход времени. (Это все ещё не понято в наше время в жестоком мире ситуационного программирования).
Lisp, выступая в роли мощного языка программирования и метаязыка, который способен представить свою собственную теорию, является примером настоящей компьютерной науки. Если вы выучите его и другие подобные вещи, то сможете более глубоко мыслить и быть в большей ответственности за свою собственную судьбу, чем если бы вы просто научились программировать в Fortran’е или его современных эквивалентах (… так вы сможете приблизиться к программистам!).
Вы узнаете намного больше о специальных видах дизайна, которые необходимы в вычислениях (например, обычно не ценится, когда вычисления зачастую требуют выхода за пределы вычислительной среды: одна из специальных характеристик хранимых программных вычислений заключается в том, что это не просто материал для программы, а материал для совершенно нового компьютера).
Другая причина выбора определения Перлиса заключается в том, что в целом вычисление гораздо больше связано с созданием систем многих видов, чем с алгоритмами, «данными структур» или даже программированием как таковым. Например, компьютер — это система, вычисления — это системы, локальная сеть и интернет — это системы, и большинство программ должны представлять собой более хорошие системы чем те, которыми они являются (старый стиль программирования с 50-х годов просуществовал до того момента, что кажется, что программирование и должно быть таким — нет ничего более далёкого от истины).
Интернет является хорошим примером — в отличие от большинства программ в наше время, интернет не нужно останавливать, чтобы починить или улучшить что-либо — он больше похож на биологическую систему — по нашему намерению, чем то, что большинство людей считают вычислительной системой. И он гораздо более масштабируемый и надежный, чем почти все программные системы, существующие на сегодняшний день. Это действительно стоит обдумать перед тем, как учить новичков в программировании не таким мощным концепциям!
Итак, что нам нужно сделать на первом курсе по Computer Science, так это принять во внимание, что конкретно студенты могут делать в самом начале, а затем попытаться остаться в пределах их «познавательной нагрузки», чтобы помочь им добраться до того, что действительно важно. Очень важно «оставаться настоящим» и найти пути, которые бы являлись интеллектуально честными и подошли бы тем, кто только начинает обучение. (Пожалуйста, не обучайте плохим идеям только потому, что они кажутся немного более простыми — множество плохих идей на самом деле более просты!).
Студенты должны начать с создания чего-то, что имело бы множество важных характеристик, которые я здесь обсуждал. Это должна быть система из нескольких динамически взаимодействующих частей и так далее. Хороший способ, чтобы решить, какой язык программирования при том использовать, так это просто сделать что-то, что имеет тысячи взаимодействующих частей! Если же нет, то вам следует найти таковой. Самое ужасное, что можно сделать, это поставить студентов на путь слишком слабой беглости, которая сильно ограничивала бы масштабные идеи. Это просто убивает их — а мы хотим вырастить их, а не убивать.