Опять накопились открытые табы -- и опять жалко закрывать их. Но нужно наступить на горло одной собственной песне, чтобы спеть другую.
Компьютерная революция еще не совершилась (тезисы Алана Кея, которые он говорит уже давно-давно):
http://www.squeakland.org/school/HTML/essays/face_to_face.html -- множество отличных метафор для объяснения его целей: "Большинство школ определяет компьютерную грамотность как возможность работать с Майкрософт Офис и, возможно, немножко веб-дизайнить. Они ошибаются. Это как если бы говорить: "Если ты знаешь, каким концом держать книгу, и ты знаешь как найти Главу Три, то ты грамотен". Грамотность -- это прежде всего о том, чтобы иметь идеи, достаточно важные, чтобы обсуждать и писать в какой-то форме. Так вы должны спросить: "Какая литература лучше всего пишется на компьютере?" Один из ответов -- сделать динамическую симуляцию какой-то идеи, которую вы считаете важной, симуляцию, с которой вы можете поиграть и у которой вы можете учиться" (об этом же -- literacy is a fluent "reading" and "writing" at the highest level of ideas that the medium can represent)..." Наиболее трудное -- это помогать помощникам. Лого было отличной идеей -- и провалилось. Это произошло не потому, что компьютеры не могли выполнять Лого, и не потому, что софт Лого был плох. Провал случился потому что вторая и третья волны учителей были не заинтересованы в нем, как в новой вещи, и практически никто их них не понимал ничего про математику или науку. Очень трудно учить Лого хорошо, если ты не знаешь математику"... "Самая большая проблема в том, что школы имеют очень мало идей, что делать с компьютерами, если все дети будут их иметь...Вы можете разместить рояль в каждой комнате, но это не даст вам развитой музыкальной культуры, потому что музыкальная культура заключена в людях". Только когда в школе будут музыканты, можно озаботиться музыкальными инструментами. Компьютеры -- это такой же иструмент, как рояль. Толку от него в школе не будет, если не будет понимающих сути компьютинга учителей. Вон, важность математики ощущается уже 200 лет, а познания выпускников школ в математике крайне низки -- ибо математику преподают не слишком понимающие в ее сути люди. -- И так далее, и так далее...
Диалог с Alan Kay --
https://queue.acm.org/detail.cfm?id=1039523 (декабрь-январь 2004-2005), пять страниц диалога со Stuard Feldman. Много самых разных мыслей -- про рефлексию, про позднее связывание, про выразительность и эффективность языка описания мира. Так и хочется перевести -- так много там мыслей.
1. Про новое и старое в языках программирования. Ожидание того, что в 1984 молодежь вырастет и предложит следующую принципиально новую вещь -- после Пролога, Лиспа, Смолтока. Ожидался язык, более нацеленный на стратегию, policy-oriented. Но коммерциализация 80-х пришла и все новое убила на корню (low-pass filter). Это как с телевизором: его открыватели ожидали, что в дом придут постановки Шекспира. А пришло то, к чему было готово население (уж точно не к Шекспиру). Поэтому огромная проблема с компьютерами (наукой и инжинерией) -- это попсовая компьютерная культура.
2. Софтостроение сейчас -- это строительство египетских пирамид, без понятия архитектуры, без миллионы огромных кирпичей, складываемых без понимания тысячами рабов. Использование грубой силы, а не ума.
3. История показывает, что IBM осознала, что менеджеры обработки данных не хотят учить новые пути компьютинга, а Burroughs -- нет. А ведь с 1979 года бенчмарк Xerox PARC работает на сегодняшних машинах лишь в пятьдесят раз быстрее (закон Мура говорит, что с тех пор было 40000-50000 улучшение!). Разница в 1000 раз может быть приписана лишь паршивой архитектуре современных процессоров. Миф, что закон Мура закроет любые ляпы в процессорной архитектуре -- именно миф! Лисп и Смоллтолк были реализованы и нормально бежали на восьмибитной архитектуре. Сейчас они бегут быстрее только за счет того, что у процессоров огромный кэш, а не за счет удачных архитектур собственно процессора. Понятно, что современные языки (типа Java) реализуют только "половину" из тех языков, остальное не укладывается в процессорную архитектуру, чтобы быть эффективным сегодня.
4. Культура интереса к масштабированию, базирующаяся на математике/науке -- именно она была в среде компьютерщиков 60х и 70х. Интернет -- это как раз упражнение по масштабированию. С тех пор появилась попсовая культура. Не нужно ни о чем сожалеть: это два разных мира, науки и попсы. Пусть сосуществуют -- как бесполезно скорбеть грамотеям об остальных людях мира, которые такими грамотеями не стали, так и тут пользы скорбеть нет. Что происходило за последних 20 лет в компьютинге -- это нормально, хотя это и нельзя назвать полным счастьем.
5. Смоллтолк был чуть не убит в конце 70-х: ибо рефлексия в нем была не такая полная, какая могла бы быть. А это главная идея: иметь в языке мета-систему, позднее связывание. Это главное про Лисп и Смоллток. Это позволяет масштабировать систему. Отсутствие нормальной виртуальной машины, которая позволяет языковой среде исследовать себя, не позволяет Java легко портироваться, как ожидалось. А вот Сквик портирован на дюжину самых разных платформ, давая идентичное (математически!) исполнение. Тут нужно думать про интернет, понимая, что он может работать на всем, что подсоединено к интернету. Как пофиксить в этом плане Java, не является секретом -- но это секрет для поп-культуры.
6. В школе Алан Кей понял, что полстраницы кода на странице 13 руководства Lisp 1.5 представляет собой Лисп сам по себе! Это были "уравнения Максвелла" для софта! Это был весь мир программирования в нескольких строчках, которые можно было закрыть рукой. "Я осознал, что в любое время, когда я захочу узнать, что я делаю, я могу просто написать ядро этой вещи -- на половинке страницы, и оно не потеряет в мощности. Фактически оно приобретет в мощности, ибо будет способно повторно войти (reenter) в себя с намного большей готовностью, чем большинство систем, сделанных другим способом, могут это сделать возможным". Все эти идеи могли бы быть частью как software engineering, так и computer science, но этого не случилось, ибо учебные курсы сегодня -- это лишь профессиональные тренинги Java.
7. С как универсальный язык, но не портируемый. С++ как Simula -- препроцессоры, делающие свое дело плохо.
8. Стильные языки (APL, Lisp, Smalltalk) и агглютинативные ("клейкие") языки типа PL/1. Стильные языки -- для людей, у кторых есть математическая ленивость, они окупаются через год после начала проекта -- когда у вас появляется сильная идея, и вам быстро-быстро нужно все переделать. Агглютинативные языки сопротивляются этой переделке. Кроме того, стильные языки обычно позднего связывания, а агглютинативные языки -- раннего, что приводит к совершенно разным процессам отладки, дает абсолютно разные типы ошибок. И для стильных языков не нужно беспокоиться об архитектуре фон Неймана. Это раздел двух культур, через эти различия в стилях невозможно общаться.
9. Когда Смолток-80 пошел к взрослым программерам, он потерял всю свою привлекательность для конечных пользователей -- и умер как язык тем самым. Поэтому в 1995 году был стартован Сквик, как предназначенный для детей, как среда, которой пользуется конечный пользователь. И дело пошло. В язык потихоньку включаются такие идеи, как (из Lucid) замена рекурсии нормальным итератором, чтобы избежать "излишней функциональности". Это можно расширить и на случай с интернетом -- логический объект может иметь физические образы на разных компьютерах. И теперь мы можем не только догнать новеньких, но и перегнать их по мощности и выразительности языка.
10. Любой язык в конечном счете выводит на пользовательский интерфейс. А пользовательский интерфейс сейчас мыслится как вывод функций на экран. Итог: если какая-то область интересна для исследования, то система становится по интерефейсу похожей на ядерный реактор, в итоге мы получаем агглютинацию фич. Кнопка на каждом пикселе правильна для корпоративных покупателей, они покупают в терминах "наборов фич". Нужно иметь другой подход: пользовательский интерфейс должен быть обучающей средой -- чем-то, что исследуемо разными способами. Улучшения должны касаться не только приложения, но и пользовательского интерфейса. Этот подход был в первых Макинтошах, но не в сегодняшних Маках и уж тем более не в Виндоуз. Есть существенная разница между застывшим смыслом и уточняемым смыслом. В естественных языках тоже есть эта разница -- между "поверхностным смыслом" и "уточненным смыслом", включающая подключение различных контекстов. Для этого есть две скорости восприятия: быстрая (сканирование текста в буквальных значениях) и медленная (пауза, необходимая для того, чтобы подключить новые контексты -- скажем, для распознавания шутки. За распознавание шутки и реагирование на шутку отвечают вообще разные части мозга). Вся креативность рождается из шутки: креативность это переход из одного контекста в другой, искусство тоже имеет этот элемент.
11. В 60-х были попытки сделать расширяемый язык -- преуспели только три (Smalltalk, Imp и какой-то еще). Но случилась трудность: мета-системы было трудно сделать легкими в использовании. Smalltalk-72 легко использовался детьми. Расширение языка было каждый раз, когда добавлялся обычный класс. Результат был таков, что для расширения языка вы никогда не попадали в такое эзотерическое место, как компилятор компиляторов навроде YACC. Побочным эффектом этого было то, что расширения языка были ужасны -- легкость их приводила к ужасному непродуманному результату, поздне-ночное расширение языка несопровождаемо. Сейчас нужно принять такой подход, в котором при заходе через "забор" в мета-область пользователь получал бы предупреждение -- но имел бы все возможности продолжать работу.
Речь при вручении тьюринговой премии (видео):
http://www.acm.org/talks/AlanKay/ACM-Kay2.htm Беседа с Аланом Кеем (2003):
http://www.openp2p.com/pub/a/p2p/2003/04/03/alan_kay.html -- плотник и архитектор отличаются так же, как кодер и программист. Программист -- это не тот, кто пишет пару строчек на Си. Программист -- это тот, кто все время задает вопросы о цели и назначении системы. Вопрос: "можешь ли ты прийти с продвинутой архитектурой для рендеринга идеи?".
http://www.cra.org/Activities/grand.challenges/kay.pdf -- кратенькое описание (1. Интернет как масштабируемая компьютерная p2p-среда групповой коллаборации -- "мечта Engelgard". 2. Персональный компьютинг -- понимание "математики архитектурного процесса" в таком виде, что даже дети могут это понять, и это должно быть научено "неестественно" наподобие чтения и письма. Пересекается сильно с интернетом, ибо люди хотят разделять их персональные идеи. 3. Обучение компьютерной грамотности для всех -- "динамические самоподдерживающиеся отношения" должны появиться, чтобы можно было просто выразить сегодняшние сложные компьютерные среды. Этот сорт программирования должен быть расширен на скриптовые миры детей и взрослых-неэкспертов. Пользовательские интерфейсы должны стать адаптирующимися и должно появиться "учащее знание". 4. Должна появиться динамическая математика для целой системы -- Windows XP содержит 60млн. строк кода. А Squeak содержит более-менее то же самое в 200000 строк, ибо содержит некую "динамическую математику", позволяющую компактно выразить те же мысли. Есть шанс сделать то же самое, но чуть ли не в 10000 строчках исходного кода. Вот это и будет "высокоуровневое программирование".
Знание принципов освобождает от знания фактов. Чем больше я об этом думаю, тем больше понимаю, каким должно быть образование будущего. Вновь вспоминаю The Accretion Model of Theory Formation Дугласа Лената (
http://eksl.isi.edu/files/library/Lenat-1983-theory-formation-by-heuristic-search-AIJ-heuristics.pdf):
1. Когда дано немного новых (не полностью исследованных) определений, объектов, операций, правил и т.д., немедленно собери о них эмпирические данные: найди их примеры, попробуй их применить и т.д.
2. По мере того, как это продвигается, пробуй заметить в данных регулярности, паттерны и исключения для паттернов.
3. Из этих наблюдений сформируй новые и модифицируй старые гипотезы. В мире, который ты можешь как-то контролировать, спланируй и проведи эксперименты для проверки этих гипотез.
4. По мере того, как развивается набор догадок, экономизируй путем создания новых определений, которые укорачивают формулировки наиболее полезных догадок. Весь циклический процесс сейчас начнется заново с шага 1, на материале этих новых определений.
5. По мере прохождения цикла (шаги 1-4), становится необходимо время от времени обобщать некоторые новые специализированные эвристики, перерабатывая прошедший опыт обучаемого [тут нужно учесть, что Ленат описывает "обучение открытиями" -- lerning by discovery]
6. В еще более редких случаях будет необходимо дополнить или сдвинуть репрезентацию, в которой кодировано знание о предметной области.
7. Для всех шагов в этой модели, даже для шагов 5, 6 и 7, достаточно собирать и использовать набор эвристик, неформальных правил рассуждения, которые ведут исследователя к наиболее приемлемым альтернативам и уводят от наиболее неприемлемых.
Программа Симпозиума по динамическим языкам (
http://www.swa.hpi.uni-potsdam.de/dls07/): интересна тем, что в ней написаны современные areas of interest в этой области (которые я считаю современными мощными идеями -- о которых стоит знать), а именно: domain-oriented programming, very late binding, dynamic composition, runtime adaptation, reflection and meta-programming, software evolution, language symbiosis and multi-paradigm languages, dynamic optimization, hardware support, educational approaches and perspectives, object-oriented, aspect-oriented and context-oriented programming. Дальше нужно брать Гугль и долго-долго серфить на эти темы.
Еще по этой ссылке можно найти людей, которые этим всем занимаются (оргкомитет Симпозиума).