Pull to refresh

Четыре профессиональные деформации программистов на языке Perl, демонстрируемые на живом примере

Reading time 8 min
Views 8.4K
Эдсгер Вибе Дейкстра оказался известен, в частности, как автор нескольких ёмких и выразительных высказываний, очерчивающих бездну профессиональной деформации программистов, предпочитающих тот или иной неуютный язык программирования. Небезызвестны, в частности, следующие оценки Дейкстры (я процитирую их по Викицитатнику):

  • «Программирование на КОБОЛе калечит мозг, поэтому обучение ему должно трактоваться как преступление». («The use of COBOL cripples the mind; its teaching should, therefore, be regarded as a criminal offense».)
     
  • «Студентов, ранее изучавших Бейсик, практически невозможно обучить хорошему программированию. Как потенциальные программисты они подверглись необратимой умственной деградации». («It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration».)

Дейкстра умер 6 августа 2002 года. Сегодня, спустя десять с небольшим лет после его смерти, мы вправе оглянуться вокруг и спросить себя: а насколько изменились обстоятельства? Иными словами: а сейчас (в наши дни) среди широко употребляемых языков программирования есть ли такие языки, использование которых влечёт для склонных к ним программистов почти неминуемый риск заметной профессиональной деформации?

Как мне кажется, они есть; и это прежде всего те языки, которые подпадают под определение write-only language, то есть поощряют написание такого исходного кода, прочтение и понимание которого слишком трудно, неоправданно трудно (как правило, даже труднее, чем его написание автором кода), хотя в нормальных языках должно быть наоборот.

Наиболее употребительным из таких языков является Perl.

Будьте покойны: я не намерен просто ткнуть пальцем в Perl и объявить, что он плох. Это вышло бы слишком малоубедительно без доказательств и подробностей. И именно поэтому прямо сейчас на примере, взятом из жизни, я покажу вам четыре механизма, при помощи которых Perl воздействует на сознание программиста и поощряет сочинение им такого кода, который оказывается неприглядным write-only.

Этот пример будет фидошным.

Три дня назад в фидонетовской эхоконференции сисопов пятидесятого региона обсуждалось намерение перейти на такой новый формат списка узлов Фидонета (англ. nodelist), в котором флаги времени (в формате Txy) лежали бы в основной (а не в пользовательской) части строки описания узла. Один из сисопов предложил заранее создать nodelist в новом формате, чтобы кто угодно мог проверить на нём поведение своей системы:

╔═════════════════════════════════════════════════════────────────────────────
║ Письмо из эхи:  R50.SysOp (Сисопская глобалка пятидесятого региона)
║ URL сообщения:  area://R50.SysOp?msgid=2:5000/111+503b7f4b
║ Автор и время:  Oleg Redut, 2:5000/111 (27 Aug 12 21:06)
║ Кому написано:  Vladimir Donskoy
║ Заглавие темы:  Флаги Txy
╚════════════════════════════════════════════════════════════════════─────────
@REPLY: 2:5020/5480 503a828c
@MSGID: 2:5000/111 503b7f4b
@CHRS: CP866 2
@TZUTC: 0700
@TID: hpt/w32-mvcdll 1.9.0-cur 12-03-11
    Доброе (current) время суток, Vladimir!

 VD>> Вот и интересно найти софт, который такого не поймёт - сразу
 VD>> дискуссия и кончится.

 AB> Выйдет - узнаем. А сейчас лениво проверять. :)

    Кстати, да. Кто-нть бы обработал ноделист по предполагаемому формату и
выложил, чтобы можно было подсунуть мейлеру. А то каждому ноделист править для
себя лень. :)

    Что я могу еще сказать?..
                 Oleg

... AKA oleg(&)redut.info AKA ICQ 28852595
■■■ GoldED+/W32-MINGW 1.1.5-b20120515 (пока работает)
 √ Origin: --- ...И все на наш редут... --- (2:5000/111)
@PATH: 5000/111 5020/1042 830
────────────────────────════════╪══╬═╣()╠═╬══╪════════────────────────────────

Я нарочно процитировал это письмо со всей технической информацией. В начале письма вы можете видеть упоминание «hpt/w32», а в конце — упоминание «GoldED+/W32»: становится понятно, что этот фидошник использует программное обеспечение, предназначенное для Win32, то есть работает под Windows.

А вот каков оказался отклик программиста на Perl, поступивший в ответ на это письмо:

╔═════════════════════════════════════════════════════────────────────────────
║ Письмо из эхи:  R50.SysOp (Сисопская глобалка пятидесятого региона)
║ URL сообщения:  area://R50.SysOp?msgid=2:463/68+503b854d
║ Автор и время:  Pavel Gulchouck, 2:463/68 (27 Aug 12 17:32)
║ Кому написано:  Oleg Redut
║ Заглавие темы:  Re: Флаги Txy
╚════════════════════════════════════════════════════════════════════─────────

27 Aug 12, Oleg Redut ==> Vladimir Donskoy:

 VD>>> Вот и интересно найти софт, который такого не поймёт - сразу
 VD>>> дискуссия и кончится.

 AB>> Выйдет - узнаем. А сейчас лениво проверять. :)

 OR>     Кстати, да. Кто-нть бы обработал ноделист по предполагаемому формату
 OR> и выложил, чтобы можно было подсунуть мейлеру. А то каждому ноделист
 OR> править для себя лень. :)

Вот преобразование пользовательских флагов U,Txy в обычные:

perl -pe 'next unless /(([^,]*,){6,})U(.*)/; ($l,$u)=($1,$3); while ($u =~
/^(.*,)?(T[A-Xa-x]{2}),?(.*)/) { $l.="$2,"; $u="$1$3" }; $_="${l}U$u\n";
s/,U?,?\s*$/\n/'

────────────────────────════════╪══╬═╣()╠═╬══╪════════────────────────────────

Две с небольшим строчки кода на языке Perl; и код этот, как нетрудно видеть, в значительной мере подпадает под определение write-only.

Но что именно в языке Perl делает этот код таким?

Во-первых, неумеренное обилие регулярных выражений. Язык Perl устроен таким образом, что регулярные выражения в нём использовать несколько удобнее, чем вызов функции. Это приводит к тому, что программист на Perl закономерно испытывает непрерывное искушение набросать регулярными выражениями собственный (возможно, более адаптированный под конкретную задачу) аналог любой простой функции (например, функции split, которая вычленяет из строки фрагменты, разделённые запятыми или иными символами) вместо того, чтобы вызывать эту функцию. Исходный код получается write-only, потому что читатель сразу узнал бы по названию функции, чего она тут делает, а вот по виду регулярного выражения это понять почти на порядок сложнее и притом приходится проявлять внимательность.

Во-вторых, использование не семантических (что-то означающих), а кратких (в данном случае — даже односимвольных) имён переменных. Так как переменные, создаваемые самим Перлом, имеют односимвольные имена (наподобие $1, $3, $6, $_), то привычка повседневной работы с ними постепенно создаёт у программиста ощущение, что отказ от смыслового значения переменной в пользу краткости её имени является чем-то вполне естественным и оправданным — а значит, он и свои собственные переменные со временем начнёт называть однобуквенно (наподобие $l, $f, $u), как это было в мрачную и незапамятную эпоху какого-нибудь Фортрана или первых версий Бейсика. Исходный код получается write-only, потому что читатель кода тратит на порядок больше усилий для того, чтобы понять, что переменная $u содержит пользовательские флаги (а это было бы сразу понятно в том случае, когда она имела бы имя $userflags), переменная $f содержит очередной флаг ($flag), переменная $l содержит начало строки ($line) или элемента списка ($list_item).

В-третьих, Perl допускает запись управляющих конструкций в противоестественном порядке «код оператор условие» (например, «код unless условие» или «код if условие»). Исходный код получается write-only, потому что читатель кода сперва прочитывает код в качестве столь же безусловно исполняемого, что и все предшествующие строки, но затем замечает в той же строке условие — а значит, принуждён бывает заново переосознать только что прочитанный им код в качестве исполняемого лишь при этом условии. Этот приём опять же тормозит чтение кода — впрочем, ужé не на порядок, а всего лишь раза в два; если бы он ограничивался только краткими конструкциями наподобие «next unless …», то с ним можно было бы смириться.

В-четвёртых, беспрерывные нечеловеческие усилия (сперва мучительные, а затем увенчивающиеся радостным успехом), предпринимаемые в повседневном чтении write-only кодов, постепенно развивают в программисте довольно неприятное качество презрения к окружающим непрограммистам, которое в терминах православного христианства можно называть гордынею, а в терминах люркморского жидокащенизма можно называть ЧСВ (чувством собственного величия). Подвергшиеся этой деформации программисты либо искреннейше забывают, что не все вокруг программируют на Perl под Linux, либо совершенно плевать хотели на судьбу тех лиц, которые не программируют на Perl под Linux, либо проявляют деятельное желание как-нибудь наказать тех, кто не программирует на Perl под Linux.

Задуумайтеся и рассудите: много ли пользы принесёт рецепт, состоящий только из вот этих двух с небольшим строк на Perl, предназначенных для командной строки?

perl -pe 'next unless /(([^,]*,){6,})U(.*)/; ($l,$u)=($1,$3); while ($u =~
/^(.*,)?(T[A-Xa-x]{2}),?(.*)/) { $l.="$2,"; $u="$1$3" }; $_="${l}U$u\n";
s/,U?,?\s*$/\n/'

Нетрудно видеть, что рецепт полагается на то, что Perl ужé установлен и прописан в PATH. Это бывает именно так в Linux, но это, как правило, далеко не так в Windows (я нарочно указал всем вам чуть выше, что получатель совета употребляет Windows). Программист на Perl, однако, ни слова не сообщил о том, где можно раздобыть perl.exe.

Нетрудно догадаться, что скрипту надобно подать на стандартный вход исходные данные (nodelist) и принять со стандартного выхода итоги работы (изменённый nodelist). Программист на Perl, однако, ни словом не коснулся этого достаточно простого знания, которое, однако, легко может оказаться неизвестным или подзабытым у конечного пользователя.

Кроме того, приведённое обрамление исходного кода апострофами не способно сработать в Windows. Иными словами, если получатель рецепта даже раздобудет perl.exe и корректно укажет «<входной» и «>выходной» файл, то его всё равно ждёт тягостное разочарование — примерно такое же, как если на диске «C:» подать команду cd 'Documents and Settings' вместо cd "Documents and Settings".

В итоге код проявляет природу write-only не только при попытке читать его, но и при попытке запустить его на исполнение. Этот эффект несколько отдаёт мазохизмом: сперва программист трахается и страдает, а в итоге и пользователь вынужден трахаться и страдать — не буквально, к счастью, а в техническом отношении.

(Кстати призадумайтеся: отчего учение Захер-Мазоха принято называть именно мазохизмом, а не захеризмом? Разве не очевидно, что термин «захеризм» лучше соответствовал бы именно первой — а не второй — части фамилии автора этого полового извращения, да притом он лучше соответствовал бы русскому словосочетанию «за хер», имеющему прямое, непосредственное отношение к этой половой практике?)

В конце девяностых годов в Фидонете было распространённым мрачное пророчество: «Фидонет создали геи, а погубят его пидарасы». Подразумевалась, с одной стороны, известная нетрадиционная половая ориентация Дженнингса (создателя Фидонета), а с другой стороны — нарастающее количество организованных сетевых подонков, ведущих себя преотвратительно. Но на протяжении нескольких последних лет я использую собственную версию этой фразы: «Фидонет создали педерасты, а погубят его мазохисты». В ней проявляется некоторая неполиткорректность по отношению к гомосекам, но главное — глубокая убеждённость в том, что основною проблемою современного Фидонета является глубоко укоренившаяся привычка к употреблению такого крайне неудобного программного обеспечения, с которым поневоле подчас приходится потрахаться и настрадаться.

На всякий случай уместно подчеркнуть: в вышеприведённом примере для меня очевидна вина не Павла Гульчука (превосходного программиста, ведущего разработчика binkd, поддерживающего домен binkp.net, и так далее, и так далее), а именно вина языка Perl, который исподволь поощряет программистов к написанию и распространению исходного кода write-only. Даже когда сам программист неплох.

Это чем-то напоминает фантастический язык (человеческий, а не компьютерный) «новояз» из романа Джорджа Оруэлла «1984» — искусственный язык, который постепенно искажал образ мысли носителя языка, приводя его к партийному образу мысли.

А ещё более напоминает фантастический язык (человеческий, а не компьютерный) «Вавилон-17» из одноимённого романа Сэмюэла Дилэни — искусственный язык, который за счёт компактности и продуманности резко увеличивал темп мысли носителя языка и способности к умозаключениям, однако постепенно искажал образ мысли носителя языка, делая его террористом и предателем, действующим под влиянием самогипноза со стиранием памяти.

(Уместно отметить, что Дилэни также был гомосеком, да притом чернокожим.)
Tags:
Hubs:
-15
Comments 90
Comments Comments 90

Articles