Previous Entry Share Next Entry
Пол Грэхем (Грэм) -- Быть Популярным, Часть 1
bukvodel
Май 2001

(Эта статья была написана в качестве некоего бизнес-плана для нового языка. )


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

Что делает язык популярным? Заслуживают ли популярные языки свою популярность? Стоит ли пытаться определить хороший язык программирования? Как бы ты это сделал?

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

1. Механика Популярности

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

Из этих двух, мнение хакеров единственное, которое имеет значение. Языки программирования не теоремы. Они инструменты, разработанные для людей, и они должны быть разработаны так, чтобы соответствовать сильным и слабым сторонам человека, также как обувь должна подходить ноге. Если обувь жмёт, когда вы надеваете её, то это плохая обувь, независимо от того, насколько она изящна как скульптура.

Возможно, что большинство программистов не способны отличить хороший язык программирования от плохого. Но с другими инструментами тоже самое. Это не значит, что попытка разработать хороший язык программирования является пустой тратой времени. Хакеры-эксперты могут узнать хороший язык программирования, посмотрев на него, они будут использовать его. Хакеры-эксперты -- это, по общему признанию, крошечное меньшинство, но это крошечное меньшинство пишет всё хорошее ПО, и их влияние настолько велико, что остальные программисты будут стремиться использовать тот язык программирования, который будет использоваться этими хакерами. Часто, indeed, это не просто влияние, но команда: часто хакеры-эксперты являются именно теми людьми (начальники или faculty advisors), которые говорят другим программистам какой язык программирования использовать.

Мнения хакеров-экспертов не единственная сила, которая определяет относительную популярность языка программирования -- унаследованное ПО (Cobol) и шумиха (Ada, Java) также играют определённую роль -- но, по моему мнению, это самая влиятельная сила. Имея первоначальную критическую массу и достаточно времени, язык программирования вероятно сможет стать настолько популярным, насколько он этого заслуживает. И популярность будет отделять плохие языки от хороших, потому что обратная связь с настоящими живыми пользователями всегда ведёт к улучшениям. Посмотрите насколько сильно меняются все популярные языки в течении их жизни. Perl и Fortran -- крайние случаи, но даже Lisp изменился более чем сильно. Например, в Lisp 1.5 не было макросов; они появились намного позже, после того как хакеры из MIT потратили пару лет на использование Lisp для написания настоящих программ. [1]

Должен ли язык быть хорошим для того чтобы быть популярным или нет, я думаю, что язык должен быть популярным для того, чтобы быть хорошим. И он должен оставаться популярным для того, чтобы оставаться хорошим. Уровень искусства разработки языков программирования не стоит на месте. И Lisp сегодняшнего дня до сих пор очень похож на Lisp из MIT, каким он был в середине 80, из-за того, что именно тогда у него была достаточно большая пользовательская база.

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

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

2 Внешние Факторы

Давайте начнём с того, что признаем тот факт, что один внешний фактор влияет на популярность языка программирования. Чтобы стать популярным, ЯП должен быть скриптовым языком популярной системы. Fortran и Cobol были языками скриптов на ранних мэйнфреймах от IBM. C был языком скриптов в Unix, и так далее. Tcl был языком скриптов в Tk. Предназначение Java и Javascript быть языком скриптов в веб браузерах.

Lisp не является массово популярным языком по причине того, что он не является языком скриптов массово популярной системы. Остаточная полярностья Lisp относится к 60-70 годам двадцатого века, когда он был языком скриптов в MIT. Множество великих программистов того времени были так или иначе связаны с MIT. И в ранних 70-ых, до C, диалект Lisp из MIT, называемый MacLisp, был одним из тех языков программирования, который стали бы использовать серьёзные хакеры.

Сегодня Lisp является языком скриптов двух умеренно популярных систем -- Emacs и Autocad, и именно поэтому я считаю, что большая часть программирования на Lisp имеет место в Emacs Lisp или AutoLisp.

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

Common Lisp непопулярен частично из-за того, что он сирота. В самом начале он поставлялся вместе с компьютером, который можно было хакнуть: Lisp Machine. Но Lisp Machine (вместе с параллельными компьютерами) были раздавлены возрастающей мощью процессоров общего назначения в 1980-ых. Common Lisp мог бы остаться популярным, если бы он был хорошим скриптовым языком для Unix. Но, увы, он ужасно плох.

Можно сказать, что языки оцениваются не с точки зрения своих достоинств. А можно сказать, что ЯП не является языком программирования если он не является скриптовым языком для чего-либо. Это только с первого взгляда кажется нечестным. Я считаю, что это не более нечестно, чем ожидать от языка того, что у него будет, скажем, реализация. Это только часть того, чем является ЯП.

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

Также языку требуется книга об этом языке. Книга должна быть толстой, хорошо написанной, и полной отличных примеров. K&R является идеалом. На данный момент, я почти готов сказать, что книга должна быть опубликована O'Reilly. Это становится определённым тестом для хакеров.

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

3 Краткость

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

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

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

add x to y giving z

вместо

z = x+y

, то хакер воспримет это как нечто среднее между оскорблением его ума и грехом против Бога.

Иногда говорят, что в Lisp стоило использовать first и rest вместо car и cdr, поскольку это сделало бы программы более простыми для чтения. Может быть в течение первой пары часов. Но хакеры могут выучить достаточно быстро, что car указывает на первый элемент списка, а cdr -- на остальное. Использование first и rest обозначало бы, что пришлось бы печатать на 50% больше символов. И у них разные длины, что означает, что аргументы не будут выравнены, так как car и cdr очень часто встречаются в последовательных строках текста. Я обнаружил, что то как строки выравнены на на странице, имеет определённое значение. Я с трудом могу читать Lisp-код, когда он набран шрифтом с переменной шириной символов, и друзья говорят, что это правдиво и для других языков.

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

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

4 Hackability


Одна вещь для хакеров важней даже краткости: возможность делать то, что ты хочешь. Поразительное количество усилий было приложено в течении истории языков программирования для того, чтобы не дать программистам делать то, что считается неправильным. Это опасно самонадеянное намеренье. Как разработчик языка программирования может знать, что потребуется программисту? Я считаю, что разработчикам языка стоит полагать, что целевой пользователь будет гением, которому придётся делать вещи, которые они не могли предугадать, а не ламер, которого нужно защищать от самого себя. Ламер, так или иначе, но прострелит себе ногу. Ты можешь спасти его от обращения к переменной в другом пакете, но ты не сможешь спасти его от написания плохо продуманной программы, решающей неправильную задачу, и требующей вечности на реализацию.

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

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

В Common Lisp мне часто хотелось пройтись по всем полям структуры -- для того, чтобы вычистит ссылки на удалённый объект, например, или найти не инициированное поле. Я знаю, что под поверхностью структуры это просто векторы. Но, несмотря на это, я не могу написать общую функцию, которой я бы мог скормить любую структуру. Я могу получить доступ к полям только по имени, потому что это именно то для чего структуры и предназначены.

Хакеру может захотеться изменить задуманную модель раз или два в большой программе. Но возможность сделать это меняет многое. И это может быть больше чем просто вопросом решения задачи. Здесь также присутствует и некоторое удовольствие. Хакеры разделяют тайное удовольствие хирургов от копания во внутренностях, тайное удовольствие тинейджеров от выдавливания прыщей. [2] Для мальчиков, по крайней мере, некоторые виды ужасного увлекательны. Журнал Maxim публикует ежегодный том фотографий, содержащий смесь pin-up и жутких пришествий. Они знают свою аудиторию.

Исторически, Lisp давал хакерам отличную возможность делать вещи так, как им того хотелось. Полит корректность Common Lisp -- это ошибочный путь развития. Ранние Lisp'ы давали тебе возможность прикасаться ко всему. Большая часть этого духа, к счастью, сохранилась в макросах. Какая восхитительная возможность произвольно изменять исходный код.

Классические макросы являются настоящими инструментами для хакера -- простые, мощные и опасные. Так просто понять, что они делают: ты вызываешь функцию !!с аргументами макроса, и чтобы это не возвращало, это вставляется на место вызова макроса!!(что-то я не понял этот пассаж -- you call a function on the macro's arguments, and whatever it returns gets inserted in place of the macro call ). !!Гигиенические!! (вот опять -- Hygienic) макросы воплощают противоположный подход. Они пытаются защитить тебя от понимания того, что они делают. Я никогда не слышал, чтобы гигиенические макросы объяснялись одним предложением. И они являются классическим примером попыток определения того, что программистам позволено хотеть. Гигиенические макросы предназначены для того, чтобы, помимо других вещей, уберечь меня от !!захвата переменных!! (variable capture), но захват переменных -- это именно то, что мне нужно в некоторых макросах.

Действительно хороший язык должен быть как чистым, так и грязным: чисто спроектированным, с маленьким ядром легко-понятных и крайне ортодоксальных операторов, но грязным в том смысле, что он позволяет хакерам делать вещи тем способом, который им нравится. C именно такой язык. Именно такими были ранние Lisp. У языка для настоящих хакеров всегда будет слегка разгульный характер.

Хороший яп должен обладать чертами, которые заставят людей, использующих фразы типа "программная инженерия" (software engineering), не одобряюще качать головами. На другом конце континиума находятся языки, наподобие Ada или Pascal, примеры пристойности, пригодной для обучения, но ни для ничего больше.

5 Одноразовые Программы

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

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

Мне кажется, что лучшие из больших программ начали свою жизнь именно так, а не проектировались с самого начала, как Hoover Dam. Страшно строить что-то большое с нуля. Когда люди берутся за проект, который слишком велик, они не могут справится. Проект либо захлёбывается, либо результат получается стерильным и деревянным: торговая улица, а не настоящий деловой центр, Бразилия, а не Рим, Ada, а не C.

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

Перл является поразительным примером такого развития событий. Он не только был разработан для написания одноразовых программ, но и сам, в значительной степени, был одноразовой программой. Перл начал свою жизнь как коллекция утилит для генерации отчётов, и эволюционировал в язык программирования только тогда, когда одноразовые программы, которые люди писали на нём, стали больше. Только после Перл 5 (если не позже) язык стал пригодным для написания серьёзных программ, но уже тогда он был популярен в массах.

Что делает язык подходящим для написания одноразовых программ? Для начала он должен быть уже доступным. Одноразовые программы это что-то, что по вашему мнению, вы напишите за час. Так что, язык уже должен быть установлен на вашем компьютере. Это не должно быть что-то, что нужно устанавливать перед использованием. Оно уже должно быть здесь. C поставлялся вместе с операционной системой. Перл первоначально являлся инструментом для системного администрирования, и вы уже установили его.

Быть доступным означает большее чем просто быть установленным. Интерактивный язык, с интерфейсом командной строки, более доступен чем, тот язык, с которым приходится компилировать и запускать программы раздельно. Популярный язык программирования должен быть интерактивным и быстро запускаться.

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


//*********************************************

Примечания

[1] Макросы, очень похожие на современное представление о них, были предложены Тимоти Хартом (Timothy Hart) в 1964 году, через два года после того как Lisp 1.5 был выпущен. Изначально, недоставало способов избежать variable capture и multiple evaluation; Hart's examples are subject to both.

[2] В "When the Air Hits Your Brain", нейрохирург Франк Вертосик (Frank Vertosick) приводит разговор в котором его chief resident, Гари, говорит о различие между хирургами и терапевтами ("вшами"):

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

Мне Трудно думать о грыжах межпозвонкового диска как о чём-то сочном (кроме как буквально). Но всё же, я думаю, что знаю, что они имеют в виду. Мне часто приходилось ловить больших сочных жуков(bug -- жук). Непрограммисту может быть трудно представить, что можно получать удовольствие от работы с жуками. Конечно, было бы лучше, если всё просто работало. И это так, с одной стороны. И всё же, в выслеживании определённых типов жуков присутствует мрачное удовлетворение.

  • 1
Большое спасибо за проделанную работу.

denotational semantics переводится как денотационная семантика.

Пугаться слова "гигиенические" не нужно. В Схеме (стандарт R5RS) реализованы гигиенические макросы.

воплащают -> воплощают

Про макросы можно прочитать в книжке Пола Грэма On Lisp, глава 7.
Про захват переменных рассказывается в главе 9.

lumbar disc herniations переводится как грыжа межпозвонкового диска.

strong типизацией - строгой типизацией.

что это правдиво и для других языков - что это справедливо и для других языков.

  • 1
?

Log in