Speaker Rabbit

abbra


CIFS: curious information funneled sometimes


Previous Entry Share Next Entry
Coders at work: Knuth
Speaker Rabbit
abbra
Отпуск проходит в активной фазе сна и чтения. В интервью Кнута Сейбелю есть замечательный фрагмент о чтении:
"... Очень важно забраться внутрь чьего-либо образа мышления, разобрать его словарь, его записи. Если получается понять, как люди думали и каким образом они совершали свои открытия, это поможет сделать собственные открытия. Я часто читаю первоисточники, что говорили об этом величайшие люди прошлого. Да, их выражения необычны для сегодняшнего читателя, но для меня очень важно впитать их подходы и попытаться вникнуть в их идеи.

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

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

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

У меня большая коллекция исходников. У меня есть компиляторы; например, компиляторы Digitek из 1960-х, написанные очень интересным образом. Они использовали собственный язык и идентификаторы длиной в 30 символов, но очень описательные. Эти компиляторы уделывали всех конкурентов в свое время -- компания создала лучшие компиляторы 1963 и 1964 годов.

У меня также есть исходный код операционной системы THE, написанный Дийкстрой. Я его не читал, лишь просмотрел, но он у меня в коллекции, потому что я уверен, что его будет интересно прочитать, если у меня будет время.

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

...

[Читать код] очень важно из-за того, что создается в твоем мозге в процессе чтения. Была такая машина Bunker Ramo 300 и кто-то сказал мне, что компилятор Фортрана для этой машины был исключительно быстрым, но никто не знал, как он был устроен. Я достал копию исходного кода. У меня не было документации по машинному коду этого компьютера, так что я был даже не очень уверен, какой машинный код там был.

Но я решил, что это интересный вызов. Я смог найти обработку BEGIN и начал декодировать. Коды имели двухбуквенную мнемонику и пришлось гадать: "возможно, это инструкция загрузки, а это -- переход". А поскольку я знал, что это компилятор Фортрана, то в какой то момент он должен был смотреть в седьмую колонку перфокарты и делать вывод о том, комментарий это или нет.

После трех часов я понемногу выяснил устройство машины. Затем нашел большие таблицы переходов. Это была головоломка и я делал зарисовки, как будто я работал в агентстве национальной безопасности и пытался раскодировать секретный код. Однако я знал, что код работал и это был компилятор Фортрана, он не был зашифрован в смысле специального запутывания, просто это был код на языке, который мне был незнаком из-за отсутствия документации.

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

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

Нам надо публиковать код. Lions Book доступна. И программы Билла Аткинсона тоже доступны теперь, спасибо Эппл, так что не так уж далеко время, когда мы сможем их прочесть. Это хорошо документированный код с многими прорывными графическими алгоритмами."


(Вот этот код Билла Аткинсона, MacPaint и QuickDraw, на Apple Pascal и ассемблере 68000 -- http://www.computerhistory.org/highlights/macpaint/)

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

Еще один фрагмент:
С ТеХом я взаимодействовал с сотнями лет человеческой истории и не хотел выбрасывать все те вещи, которые дизайнеры книг освоили за столетия, чтобы начать с нуля и сказать: "Ребята, забудьте все; вы же знаете, нам нужно быть логичными". В этом случае целью игры было взять невозможно сложную задачу и найти достаточно простой набор примитивов, которые бы смогли ее описать. Вместо 1000 примитивов, у меня получилась сотня или около того. Но уменьшать до 50 или даже 10 примитивов, чтобы обеспечить математическую чистоту, -- я не верю, что это бы сработало. Проблема создания книг очень глубоко связана со сложностью мира, которая совсем не жаждет упрощения."

  • 1
"Приключение" -- пожалуй довольно точно описывает ощущения от re.

Читать проприетарный код опасно. Потом какая-нибудь SCO заявит, что у неё списали.

По работе мне приходится читать миллионы строк проприетарного кода. Он разный, есть интересные находки, есть традиционные провалы, в стиле dailywtf. Важен не столько сам этот код, сколько образ мышления людей, его создававших. Конечно, есть разница между плохим и хорошим кодом, равно как и между плохими и хорошими книгами. Человек волен выбирать, что ему читать -- плохой или хороший код. Если у тебя нет возможности получить доступ к проприетарному коду, не читай его, у нас сегодня есть огромная база свободного кода. Однако нужно сознательно читать разнообразный свободный код, а не только тот, который тебе "близок".

В качестве интересного -- для меня -- примера может служить случай с кодом X.org. С начала 90-х код xkb был таким, каким он был написан. Очевидно, что никто не читал его -- в том понимании процесса, как его видит Кнут -- и не обращал внимание на ошибки в этом коде. Потребовался Иван Паскаль и его желание иметь работающую систему, чтобы прочитать и разобраться в этом старом коде настолько, чтобы мы получили пусть и сложный, но работающий клавиатурный код в X.org.

Xorg (XFree) - это страшно.

На одном из наших проектов в СаМ разматывали стек вызовов, чтобы понять что делает одна функция из API(наш явист адаптировал X-server как Java-апплет). На двадцатом уровне вложенности обнаружили что это всего лишь memcpy.



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

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

Глыба человечище...

  • 1
?

Log in

No account? Create an account