Кодеры за работой. Размышления о ремесле программиста
Шрифт:
Я спроектировал то, что сейчас бы назвали прикладной операционной системой, то, что работает как надстройка над обычной ОС. К тому времени компьютеры уже заметно подешевели. У нас были норвежские NORD-10 - кажется, они задумывались для конкуренции с PDP-11.
Там я провел почти четыре года, а потом получил работу в Шведской космической корпорации, разработал еще одну прикладную операционную систему для управления “Викингом”, первым шведским спутником. Проект был интересный. Я работал на машине, названия которой не помню, но это был клон компьютера Amdahl. Только строковые редакторы, никаких полноэкранных. Все программы хранились в одном каталоге. Не больше десяти букв
При этом я думаю, что все эти современные штуки с наворотами вряд ли делают вас продуктивней. Как работа может улучшиться при иерархической файловой системе? Как бы то ни было, программы создаются главным образом в голове. Мне кажется, что работа с такой довольно простой системой дисциплинирует мышление. Если все файлы надо складывать в один каталог, нужна строжайшая дисциплина. Если нет системы управления версиями, нужна строжайшая дисциплина. И если работать дисциплинированно, то, по-моему, нет особой нужды ни в иерархической файловой системе, ни в системе управления версиями. Они не решают главную проблему. Пожалуй, с ними удобнее работать вместе нескольким людям. Если же работать одному, то разницы я не вижу.
Кроме того, сейчас у нас что-то вроде избытка выбора. У меня имелся только Фортран - помнится, не было даже консольных скриптов. Командные файлы для запуска программ, компилятор Фортрана - и все! Ну и ассемблер, наверное, если кому-то он был нужен. Никакого мучительного выбора, как сейчас. Думаю, быть сегодня молодым программистом просто жутко: двадцать языков, десятки фреймворков и операционных систем - можно погибнуть, выбирая. А в то время - ничего подобного. Просто начинаешь работать, потому что язык и программы выбирать не приходится. Просто берешь и работаешь.
Сейбел: Разница еще и в том, что сегодня не понять, как устроена система сверху донизу. Проблема не только в выборе, но и в том, что не во всех используемых “черных ящиках” хочется разбираться.
Армстронг: Ну да. Если “черные ящик” работает неважно и надо что-то в нем подкручивать, то легче взять и написать все самому. А вот что точно не работает, так это повторное использование кода. С этим совсем плохо.
Сейбел: Вы создали не только Erlang, но и Open Telecom Platform - платформу для разработки приложений. Что вы скажете о ее многократном использовании?
Армстронг: В какой-то мере это возможно. Но возникает все та же проблема. Если эта платформа полностью решает вашу задачу, если какой-нибудь программист, ничего не знающий о структуре ОТР, посмотрит на нее через несколько лет и скажет: “Вот именно то, что мне нужно”, - отлично, вы уложились в эту меру повторного использования. Если же этого не случится, проблема останется.
Не так давно мне говорили: “Все это как-то искусственно, мы все время стараемся впихнуть код в этот ОТР”. Я отвечал: “Ну что ж, переделайте ОТР”. Но ведь этого не сделаешь. При этом фреймворк - всего лишь программа, довольно простая по устройству. Действительно простая. Я залезаю в нее, и она делает то, что нужно этим людям, после чего они соглашаются: “И правда, просто”. Но при этом заявляют: “Наши менеджеры не хотят, чтобы мы возились с фреймворком”. Ну так назовите это по-другому, и все.
Сейбел: А как по-вашему, реально ли на самом деле вскрыть все эти “черные ящики”, заглянуть внутрь, понять, как они работают, и приспособить их для своих нужд?
Армстронг: С годами я, кажется, все чаще допускаю вот эту
И знаете, это очень легко. Х-протокол принимает 80-100 сообщений, а вам нужно, скажем, только 20. Вы отображаете их в Erlang, стоит чуть поколдовать - и вы можете отправлять сообщения прямо в окна, а те уже займутся всем. К тому же это быстро работает. Правда, выглядит не очень - я мало заботился о графике, о внешнем виде, над этим надо еще поработать. Но главное - это легко.
Кроме того, я создал программу верстки, где границей абстракции, которую я перешел, был PostScript. Подходя к этой границе, боишься ее пересекать, поскольку думаешь, что за ней что-то невероятно сложное. Но и тут все оказывается легко. Это язык программирования. Хороший язык программирования. Границу абстракции пересечь легко, и это очень полезно.
Когда издавалась моя книга по Erlang, издатель сказал: “У нас есть софт для рисования схем”. Но все такие программы обычно ставят стрелку не совсем туда, куда надо. Да и рука после них болит. Я подумал, что это должно занять всего несколько часов - программа, которая бы выдавала PostScript-файлы и ставила стрелку точно в нужное место. Времени тратится на создание схем с помощью программ примерно столько же, сколько в системах WYSIWYG. Но у последних есть два преимущества. Во-первых, рука не болит и, во-вторых, при увеличении даже в 10 000 раз стрелка показывает туда, куда надо.
Конечно, начинающий программист не обязан осваивать все эти абстракции. Но надо держать в уме такую возможность, не отвергать ее, понимая, что прямой путь может быть эффективнее пакетного. Вообще, думаю, приобретая написанную кем-то программу, обычно тратишь много времени, чтобы приспособить ее к своим нуждам: программа делает не совсем так, как надо, а чуть по-другому.
Сейбел: Вы сказали, что с повторным использованием кода дело обстоит “совсем плохо”. Но ведь открытие каждого “черного ящика” и возня с его содержимым едва ли исправит эту ситуацию.
Армстронг: Думаю, проблемы с повторным использованием кода есть в объектно-ориентированных, а не в функциональных языках. Ведь объектно-ориентированные языки тянут за собой всю неявно окружающую их среду. Вы хотели только банан, а получили еще и гориллу, которая держит этот банан, и все джунгли впридачу.
Если у вас образцово прозрачный код, если у вас чистые функции - все данные вводятся через их аргументы, все возвращается и не оставляет за собой никакого состояния, - программа более чем пригодна для повторного использования. Можно использовать ее где угодно. Если надо применить ее в другом проекте, вы просто вырезаете код и вставляете его в другой проект.