Хотел поделиться с товарищем хорошей заметкой “Real Programmers Don’t Use Pascal”, самая известная цитата из которой: “Настоящий Программист может программировать на Фортране на любом языке”. Но к сожалению, оба перевода, были неполными, содержали ошибки и не объясняли вещи, очевидные в 80-х, но уже не в 90-х и тем более не в 21 веке. В итоге перевёл сам.

Заметка написана в 1983 году, поэтому все отсылки в ней - на реалии того времени. Я постарался сделать её более понятной современникам, добавив в текст ссылки на источники и пояснения. В [квадратных скобках] мои примечания.

Поехали

Настоящие Программисты не используют Паскаль, Datamation, июль, 1983

В самом расцвете “Золотой Эры” компьютеров было просто отличить мальчика от мужа (иногда их называли “Сосунок” и “Настоящий Мужчина”, соответственно). Тогда настоящими мужчинами считались те, что умел программировать на компьютере, а сосунками - те, кто не умел. Настоящие Программисты говорили предложениями вида “DO 10 I=1,10” и “ABEND” (да, они говорили капсом), а весь остальной мир жаловался: “компьютеры слишком сложны для меня”, или “я не могу строить отношения с компьютером - у него нет индивидуальности”. Однако, в работе “Настоящие мужчины не едят киш”, B. Feirstein, 1982, отмечается, что Настоящие Мужчины не вступают в отношения ни с кем и совершенно не боятся прослыть безликими.

Но времена меняются. Мы живём в мире, где старушка может купить микроволновку с компьютером внутри, а 12-летний пацан порвёт Настоящего Мужчину в Asteroids или Pac-Man. Да ещё и любой теперь может не только купить себе собственный персональный компьютер, да ещё и разобраться, как он работает. Настоящим Программистам грозит вымирание: старшеклассники с микрокомпьютерами TRASH-80 метят на их место.

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

Языки

Проще всего выделить Настоящего Программиста из толпы по языку программирования который он использует. Настоящие Программисты пишут на Фортране. Сосунки используют Паскаль.

Никлауса Вирта, автора Паскаля, однажды спросили: “Как правильно произносится ваше имя?” И он ответил: “Можете меня называть по имени: Вирт, а можете по значению: Ворт”. Одного этого достаточно, чтобы записать Никлауса в Сосунки. Единственный способ передачи параметров, признаваемый Настоящими Программистами - это передача по значению, как в компиляторах Фортрана для IBM/370. Настоящие Программисты не ищут абстракций, чтобы делать свою работу, им нужны только перфоратор для карт, компилятор Фортран IV и пиво.

[прим: Wirth звучит похоже на Worth - ценный, значимый]

  • Настоящие Программисты работают со списками на Фортране
  • Настоящие Программисты работают со строками на Фортране
  • Настоящие Программисты пишут бухгалтерские системы (если вообще пишут) на Фортране
  • Настоящие Программисты развивают искусственный интеллект на Фортране

Если для задачи не подходит Фортран, возьмите ассемблер. Если ассемблер тоже не подходит, то проблема вообще не стоит того, чтобы ею заниматься.

Структурное программирование

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

Когда я закончил школу я считал себя лучшим программистом в мире. Я мог запрограммировать крестики-нолики, в которых компьютер всегда выигрывал, знал пять языков программирования и мог написать программу из тысячи строк, которая РАБОТАЛА. Правда! А потом я попал в Реальный мир. Первым же заданием было разобраться в программе на Фортране из 200 тысяч строк и ускорить её вдвое. Любой Настоящий Программист знает, что никакое структурное программирование не пригодно для решения задач, вроде этой. Тут нужен талант.

Вот небольшой обзор отношений между Настоящими Программистами и структурным программированием:

  • Настоящие Программисты используют GOTO
  • Настоящие Программисты могут запросто написать цикл на пять экранов кода
  • Настоящие Программисты любят арифметические IF, потому, что с ними код гораздо прикольнее
  • Настоящие Программисты пишут самомодифицирущийся код, особенно, если так можно сэкономить 20 наносекунд внутри тела цикла [прим: 20 наносекунд в 1983 году - это 20 тактов тогдашнего суперкомпьютера Cray-2]
  • Настоящим Программистам не нужны комментарии в коде: всё же и так очевидно
  • Так как в Фортране нет структурных аналогов для выражений IF, REPEATUNTIL, или CASE, то и беспокоиться об этом Настоящим Программистам не приходится. К тому же, в случае необходимости, их можно реализовать с помощью GOTO по значению переменной

В прессе сейчас уделяется большое внимание структурам данных. Абстрактные типы, структуры, указатели, списки и строки стали популярны в некоторых кругах. Вирт (тот самый Сосунок) даже написал целую книгу (“Алгоритмы + Структуры данных = Программы”, Prentice Hall, 1976) убеждая, что писать программы нужно только структурно и никак иначе. Но все Настоящие Программисты знают, что единственная структура данных, заслуживающая внимания - это массив. Строки, списки, структуры, множества - это всего лишь частные случаи массивов, и легко могут быть ими заменены. Без ненужных усложнений вашего любимого языка программирования. Хуже всего в этих новых типах данных то, что их приходится описывать явно, а Настоящие Программисты давно привыкли отличать типы по первым буквам названий переменных (шестибуквенных, разумеется).

Операционные системы

Какую операционную систему использует Настоящий Программист? CP/M? Да боже упаси! Это же просто игрушка. Даже старушки и школьники в состоянии с ней разобраться.

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

Нет… Настоящий Программист использует OS/370. Хороший программист может найти в документации по JCL (Job Control Language) описание ошибки IJK305I и понять, что произошло. Отличный программист может писать на JCL вообще без документации. Гениальный программист способен находить ошибки по 6-мегабайтному слепку памяти работающей программы не используя даже калькулятор. (Я правда такое видел)

OS/370 крайне примечательная операционная система. С ней нельзя терять бдительности: из-за всего одного неправильно поставленного пробела можно потерять недельную работу. Лучший подход к этой системе - через перфокарты. Некоторые люди считают, что OS/370 умеет в разделение времени, но я пришёл к выводу, что это не так.

Средства программирования

Какими инструментами пользуется Настоящий Программист? В теории, Настоящий Программист может запустить программу, введя её с помощью переключателей на передней панели компьютера. Когда у компьютеров были передние панели, это нередко случалось. Типичный Настоящий Программист знал наизусть весь шестнадцатеричный код системного загрузчика и мог его восстановить, если программа затирала часть системы. (В те времена память была Памятью и не пропадала при отключении питания. В наши дни память может забыть то, что не следовало, и помнить то, что уже и не нужно). Ходит легенда, что Сеймур Крей, создатель суперкомпьютера Cray I и большинства компьютеров Control Data, набрал при первом включении CDC7600 весь код операционной системы по памяти, переключателями на передней панели. Без сомнений, Сеймур - Настоящий Программист.

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

В некоторых компаниях редактирование текста программы больше не похоже на очередь из 10 человек к карточному перфоратору 029. По правде говоря, в здании, где я работаю, нет ни единого перфоратора. В таких услових Настоящему Программисту приходится делать свою работу в программном текстовом редакторе. Во многих системах есть выбор из нескольких редакторов, и Настоящему Программисту нужно быть особенно осторожным, выбирая тот, что подходит к его стилю. Многие считают, что лучшие текстовые редакторы написаны в Xerox для их компьютеров Alto и Dorado. К сожалению, ни один Настоящий Программист не будет работать на компьютере, чья операционная система называется несерьёзным словом SmallTalk, и уж тем более не притронется к мыши. [прим: на самом деле операционная система называлась просто Alto, а SmallTalk на ней был основным инструментом для написания программ]

Некоторые идеи Xerox были перенесены в текстовые редакторы, работающие в операционных системах с более солидными названиями. EMACS и VI - самые известные из них. Но дело в том, что концепцию WYSIWYG (“what you see is what you get”, “что видишь, то и получишь”) Настоящие Программисты ненавидят не только применительно к текстовым редакторам но и к женщинам. Настоящим Программистам нужно другое: сложное, запутанное, мощное, непрощающее, опасное - “Ты это хотел, ты это получил”. TECO, если быть точнее.

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

Именно по этой причине Настоящий Программисты очень неохотно вносят изменения в почти работающую программу. Легче поправить код в готовом бинарнике с помощью SUPERZAP (или чего-то подобного). Последствия этого явления таковы, что сложно найти программу на IBM-системах, которые бы соответствовали её исходнику на Фортране. Иногда исходника даже вообще не существует. Когда бывает нужно что-то скорректировать в такой программе, ни один эффективный менеджер не осмелится доверить эту работу никому, кроме Настоящего Программиста. Сосунки даже не будут знать с чего начать. Это можно назвать “заботой о сохранении рабочих мест”.

Вот некоторый инструментарий, который Настоящие Программисты не используют никогда:

  • Препроцессоры для Фортрана, такие как MORTRAN и RATFOR. Упрощение программирования отлично подходит для Сосунков. Причины те же, что и против структурного программирования.
  • Отладчики программ. Настоящим Программистам достаточно дампов памяти.
  • Компиляторы с проверкой границ диапазонов. Это наносит вред изобретательности, не позволяет креативно использовать выражение EQUIVALENCE и изменять код операционной системы с помощью отрицательных индексов. А что хуже всего, проверки границ неэффективны.
  • Системы контроля версий. Настоящий Программист держит свои карточки с кодом в сейфе, что достаточно хорошо защищает исходный код от изменений.

Работа Настоящих Программистов

Над чем обычно работают Настоящие Программисты? Какие программы заслуживают привлечения настолько талантливых людей? Можете быть уверены, ни один Настоящий Программист не был замечен за программированием бухгалтерских систем на Коболе, или сортирующим списки рассылок для журнала People. Настоящему Программисту нужны потрясающие задачи (буквально):

  • Настоящие Программисты работают в Los Alamos над симуляциями атомных бомб на суперкомпьютерах Cray I.
  • Настоящие Программисты работают в NSA, перехватывая послания русских.
  • Огромная заслуга Настоящих Программистов в том, что астронавты из NASA слетали на Луну первыми, обогнав космонавтов.
  • Над компьютерами космических Шаттлов трудятся Настоящие Программисты.
  • Настоящие Программисты в Боинге пишут операционные системы для крылатых ракет.
  • Многие Настоящие Программисты, что работают в NASA, знают весь код операционных систем Pioneer и Voyager. Комбинируя работу больших наземных программ на Фортане и маленьких космических на ассемблере, они могут достигать невероятных успехов в навигации и импровизации. Таких как: попасть в 10-километровое окно возле Сатурна после шестилетнего полёта, чинить повреждённые сенсоры, платформы, радио и батареи. Одному из Настоящих Программистоя, якобы, пришла идея разместить программу поиска визуальных объектов в небольшом кусочке неиспользуемой памяти Вояджера, что позволило начать поиск, найти, и сфотографировать новую луну Юпитера.

Одна из хитростей, применённая в грядущей программе Галилео - использование гравитации Марса по дороге к Юпитеру. Для этого пришлось проложить курс в 80 километрах над его поверхностью, с погрешностью не больше 3 километров. Никто бы не доверил программе на Паскале (или программисту на Паскале) разработку навигации такой точности.

Очевидно, что многие Настоящие Программисты работают на правительство США, главным образом в министерстве обороны. Так оно и должно быть. Но недавно над ними стали сгущаться тучи.

Некоторые Сосунки из руководства решили, что все оборонные програмы теперь нужно писать на языке высокого уровня ADA. (Кстати, само название языка: “ADA” - это зарегистрированная торговая марка минобороны США.) Похоже на то, что язык ADA создавался, чтобы нарушить все принципы Настоящего Программирования - это язык со структурами, типами данных, строгой типизацией и точками с запятой. К счастью, в языке есть несколько интересных особенностей, которые делают его всё-таки приемлемым: это его невероятная сложность, в том числе организация системных вызовов и методы работы с памятью. К тому же он не нравится Дейкстре. (Да, тому самому, что написал статью “О вреде оператора GOTO”, которой рукоплескали программисты на Паскале и Сосунки.) В конце концов, Настоящий Программист может писать программы на Фортране на любом языке.

Настоящий Программист может поступиться принципами и начать работать над чем-то более тривиальным, чем уничтожение всей жизни. При условии, конечно, достойной оплаты. Некоторые Настоящие Программисты пишут игры для Atari. (Но не играют в них - им известно, как никогда не проигрывать, и потому терют всякий интерес.) Все, работающие в ЛукасФильме - Настоящие Программисты. (Было бы очень глупо отказываться от денег 50 миллионов фанатов Звёздных Войн.) Количество Настоящих Программистов, работающих с компьютерной графикой, относительно небольшое, в основном потому, что пока никто не знает, что с этой графикой делать. С другой стороны, вся работа с графикой пишется на Фортране, и поэтому значительная часть людей ей занимаются просто для того, чтобы не писать программы на Коболе.

Игры Настоящих Программистов

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

Несколько подсказок, как распознать Настоящего Программиста, когда он не за компьютером:

  • На вечеринке Настоящие Программисты кучкуются в углу, общаясь про защиты операционных систем и способы их обхода
  • На футболе Настоящие Программисты сравнивают реальную игру с симуляцией, которую они предварительно просчитали и распечатали на фальцованной бумаге
  • На пляже Настоящие Программисты чертят диаграммы на песке
  • На дискотеки Настоящие Программисты ходят, чтобы посмотреть на световые шоу
  • На похоронах от Настоящего Программиста можно услышать: “Бедный Джордж! Он почти заставил работать эту процедуру сортировки, если бы не инфаркт”
  • В продуктовых магазинах Настоящие Программисты настаивают на том, чтобы самостоятельно просканировать консервные банки лазером, потому, что они никогда не поверят, что человек за клавиатурой может всё правильно сделать с первого раза.

Настоящие Программисты в естественной среде обитания

Какая обстановка заставит Настоящего Программиста работать в полную силу? Это важнейший вопрос менеджеров, под чьим началом трудятся Настоящие Программисты. Учитывая зарплату, которую ему приходится платить, лучше создать ту атмосферу, в которой он сможет выдавать результат.

Типичный Настоящий Программист живёт возле компьютерного терминала. А поблизости от терминала находятся:

  • Распечатки всех программ, над которыми Настоящий Программист когда-либо работал, пришпиленные в хронологическом порядке на все доступные поверхности в офисе.
  • Несколько чашек с недопитым остывшим кофе. Иногда в них могут встречаться сигаретные окурки. (Вместо кофе в чашках может быть Orange Crush [прим: газировка, типа фанты, только от Dr.Pepper])
  • Если Настоящий Программист не очень крут, то найдутся копии JCL и распечатки наиболее интересных страниц из документации по операционной системе
  • Приклеенный скотчем календарь со Снупи на 1969 год.
  • Разбросанные снеки с ореховым маслом (те самые, что становятся чёрствыми ещё в пекарне, и поэтому не портятся в торговом автомате)
  • Спрятанный в левом ящике стола запас печенья “Орео” - для особых случаев
  • Под печеньем лежит недоделанная диаграмма, оставленная предыдущим хозяином комнаты (Настоящие Программисты пишут код, а не документацию. Оставьте это обслуживающему персоналу)
  • Настоящий Программист может работать 30, 40 и даже 50 часов подряд, находясь под сильным давлением. Честно говоря, он предпочитает именно так и работать. Долгое ожидание отклика системы не заботит Настоящего Программиста - так у него появляется шанс вздремнуть. Если на Настоящего Программиста не оказывать должного давления, в первые девять недель он будет заниматься мелкой, но очень интересной проблемой, а в последнюю неделю завершит всю работу за два-три 50-часовых марафона. Это не только впечатлит менеджера, который уже отчаялся завершить проект вовремя, но и будет удобным оправданием отсутствия документации.

В целом:

  • Настоящие Программисты не работают с 9 до 5. (Кроме случаев, когда 9 - это вечер, а 5 - это утро)
  • Настоящие Программисты не носят галстук
  • Настоящие Программисты не носят туфли на высоком каблуке
  • Настоящие Программисты приходят на работу к обеду
  • Настоящий Программист может помнить (а может и нет) имя своей жены. Зато он знает наизусть таблицу кодов ASCII (или EBCDIC)
  • Настоящие Программисты не умеют готовить. Продовольственные магазины редко работают в 3 часа ночи, так что им приходится выживать на снеках и кофе.

Будущее

Что же в будущем? Беспокойство Настоящих Программистов вызывает тот факт, что новое поколение программистов не разделяют мировоззрения своих предшественников. Многие из них даже никогда не видели компьютера с передней панелью. Вряд ли каждый сегодняшний выпускник умеет считать в шестнадцатеричной системе без калькулятора. Сегодняшние выпускники слабы - они защищены от реалий программирования отладчиками, текстовыми редакторами, которые автоматически считают скобки, и дружелюбными операционными системами. Хуже того! Некоторые дипломированные компьютерные специалисты дажи никогда не программировали на Фортране! Мы катимся в мир Юникс-хакеров и программистов на Паскале?

С другой стороны, я могу заверить, что светлое будущее ждёт Настоящих Программистов везде. OS/370 и Фортран умирать не собираются, несмотря на все усилия программистов на Паскале. Даже попытки добавления структурного подхода в программирование на Фортране с треском провалились. Да, многие производители выпустили новый компилятор: “Фортран 77”, но каждый из них имеет опцию обратной совместимости и может работать в точности, как “Фортран 66”, чтобы компилировать циклы DO так, как того хотел Господь.

Даже Юникс может быть не так уж плох для Настоящих Программистов. Последний релиз показал, что у него есть хороший потенциал: два разных и несовместимых пользовательских интерфейса, загадочный и непонятный драйвер терминала, виртуальная память. Если забыть тот факт, что он структурирован, даже программирование на C может быть высоко оценено Настоящими Программистами, смотрите: тут нет проверки типов, имена переменных не больше семи (десяти? восьми?) символов, и дополнительным бонусом - наличие указателей. Похоже на то, что в одном месте собрали лучшее из Фортрана и ассемблера. (И это я ещё не упоминал про креативное использование #define)

Нет, будущее совсем не плохо. За последние несколько лет в популярной прессе начали комментировать выпуск ярких талантов из МИТ и Стенфорда в Реальный мир. Очевидно, что в этих юношах и девушках живёт дух Настоящего Программирования. До тех пор, пока есть плохо написанные ТЗ, непонятные цели, таинственные ошибки и нереалистичные сроки, найдутся и Настоящие Программисты, которые придут и решат все проблемы, оставив документацию “на потом”.

Да здравствует Фортран!