Что такое код? (перевод)

Специальный выпуск Bloomberg Businessweek, 11.06.2015

Часть 4. Почему программисты такие злые?

Существует сайт, который сравнивает скорость работы разных языков программирования. Он начинается с такого предисловия: «Существуют и другие языки программирования. Существуют и другие программы, которые можно писать. Существуют и другие задачи, которые можно было бы решать. Это просто десять маленьких примеров». Написано явно на случай массовых беспорядков.13.

13 Написание этого эссе было для меня сущим кошмаром ещё и потому, что я представляю, какое количество людей со мной захотят поспорить. Если вам потребуется выпустить пар, я доступен ford@ftrain.com.

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

У каждого языка есть какая-то своя повестка, к которой люди прикипают. Хорошим качеством любого разработчика считается прямолинейность. Прямо и четко заявляй о своих сомнениях, чтобы как можно раньше получить технический консенсус. Всегда будь готов к тому, что тебе скажут, что ты неправ. Сам не стесняйся в выражениях, это часть индустриальной культуры. Программирование даже успело приобрести устойчивую аналогию с синдромом Аспергера, которое характеризуется трудностями в социальном взаимодействии, ограниченными интересами и стереотипным поведением. Многие программисты часто говорят, что они «где-то в спектре», оправдывая своё грубое и навязчивое поведение.

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

Несмотря, на то, что культура программирования широка и многогранна, её географическое и культурное ядро сегодня находится в локомативе цифрового прогресса под названием Кремниевая долина. Там принято мифологизировать молодых гениев с огромными деньгами. К её чести — эта культура работает, но к её стыду — не для всех.

В любой момент времени из ниоткуда в этом месте может появиться что-то новое, что перевернёт всю индустрию с ног на голову. Instagram был написан на Python и продан за 700 миллионов долларов — после чего все бросились писать на Python. Следующее популярное приложение может появиться на каком-нибудь новом языке — и все будут использовать только его. А ещё через полтора года твои новые навыки в какой-то узкой технологии рискуют оказаться если не бесполезными, то сомнительными.

Я как-то присутствовал на совещании, где кто-то спросил «Когда это будет исправлено?» Человек, который работал в компании много лет ответил: «Три месяца». Новичок, который только пришёл из индустрии облачных микросервисов, сказал: «Три минуты». И оба были правы. Вот так перемены входят в этот мир. Очень долгий старт, а потом, на следующий день после релиза, ты на обложке «Hacker News».

Программисты, несмотря на всю внешнюю надменность, каждый день чувствуют уязвимость своих собственных позиций. Они начинают защищаться, когда слышат, что Python лучше Ruby, потому что [вставь сюда эмоциональный тред на 500 комментариев]. Они знают, что прям сейчас где-то нарастает следующая большая волна. А не сметёт ли она их любимый Java, когда придёт? Завоюет ли Go позиции Python? Нужно ли учить JavaScript, чтобы оставаться востребованным?

Разработчики часто злятся, потому что постоянно боятся. Мало кто из них видит всё поле битвы целиком — и каждый вынужден складывать своё представление о мире по кусочкам, в полной темноте.

4.1 Легенда о 10x программисте

В программировании соседствуют два культа: культ гениальности и культ молодости. Частично репутация Google была заработана на найме вундеркиндов. Только дипломы кандидата наук из Стенфорда, КалТеха или MIT были входными билетами в штат компании. Настоящий программист из этой плеяды начинал кодить еще в утробе матери и обладает IQ не менее 10,000.

Существует даже легенда о 10x программисте — человеке, который продуктивнее всех остальных ровно настолько, что это кажется невозможным. Никто их никогда не видел, но все пытаются нанять. А ленивых разработчиков ими пугают как городских детей волками.

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

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

Для по-настоящему одарённого программиста написание кода — побочный эффект мышления. Его мастерство не в знании синтаксиса, а в том, как он воспринимает задачу, время и вычисления. Если 10x программисты существуют, им нужны 10x мереджеры и 10x компании. И в том, чтобы не быть 10x самого себя — нет ничего постыдного.

4.2 Проблема художников в том, что они художники

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

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

Усилители продуктивности
Питание: Soylent

Когда-то его провозгласили «концом эпохи еды». В составе картофельный и рисовый крахмал, овсяная мука, растительные масла, витамины и минералы. Придумал его в 2013 году программист Роб Райнхарт, решивший сделать прием пищи максимально эффективным. Цена: около $70 за пакет порошка Soylent.

Система доставки кофеина: Club-Mate

Газированный напиток баварской пивоварни, который в основном продается в Европе. Делается на основе мате, богатого кофеином и полифенолами.

Компьютер: 13-дюймовый MacBook Pro

Эти ноутбуки многие считают эталоном по качеству железа. Они способны запускать не только macOS, но и Windows с Linux.

Текстовый редактор: вопрос почти религиозный

Разработчики пользуются десятками разных редакторов кода, которые помогают писать и отлаживать программы. Среди популярных вариантов: Sublime Text, Text Wrangler и Brackets.

Письменный стол старой школы: Jerker

На бесчисленных форумах гики до сих пор тоскуют по этому снятому с производства модульному столу IKEA. Он позволял свободно настраивать высоту столешницы и полок под себя. На eBay такие столы до сих пор продаются примерно за $250.

Стол для работы стоя: GeekDesk Max

Четыре предустановленные высоты, стальная рама и два электромотора, поднимающие или опускающие столешницу со скоростью 2,8 см в секунду. Выдерживает до 152 кг нагрузки. Выпускается в двух размерах: маленький ($949) и большой ($985).

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

Одна из главных опасностей в этой работе — начать использовать то, что ярче всего блестит. Новые модные языки программирования представляют здесь наибольшую опасность. Они каждый раз обещают более высокие скорости, продуктивность или просто счастье. В сети существует множество статей о том, как убедить менеджера перевести проект на новый язык. Проблема в том, что талантливый разработчик может выучить новый язык за неделю, но середнячку потребуется для этого куда больше времени. Поэтому опытный менеджер, покрытый боевыми шрамами, на это отвечает «Мы сейчас не можем себе этого позволить, стоимость слишком высока» или «Давай попробуем небольшой пилот на изолированном сервисе» 14.

14 Здесь важен баланс: необходимо давать инженерам возможность поэкспериментировать. Иначе они сами создадут систему у вас за спиной. Именно так и появился, например, Linux.

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

У менеджеров и опытных разработчиков вариантов поведения поменьше. Зачастую лучше просто продолжать работать как раньше и выпускать продукт. Даже когда код начинает выглядеть уродливо, даже когда существуют более изящные решения, даже когда вокруг нарастает технический долг15 — потому что через несколько лет всё равно всё изменится. Может, тебя повысят, и новый менеджер с проклятиями снесёт всё, что ты сделала, и начнёт заново — возможно, продукт перейдёт на новый язык — с целью построить что-то большее, но значительно проще. Или всю индустрию накроет так, что всё построенное придётся выбросить и переделать. (От десктопа к вебу, от веба к мобильным, от мобильных к облакам, от облаков к… квантовым? Кто знает. Но что-нибудь всегда приходит на смену.)

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

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

4.3 Нам всё ещё нужно выбрать язык…

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

Ты заметила, что его команда начала одеваться, как он. Одна из женщин пришла в высоких сапогах и с какой-то замысловатой причёской. На ней чёрная кожаная куртка. Ничего кричащего, просто выглядит круто. Раньше она одевалась исключительно в Patagonia. Так, значит, теперь одеваются программисты? Откуда у них взялся новый дресс-код?

— PHP, — говорит ЧБП, — ну… что есть, то есть. Команда отлично провела время на PHP[world]. Думаю, если чему-то мы там, пожалуй, и научились…

Скобки он, конечно, не проговаривает вслух, но расходы на поездку согласовывала ты, а пишут они это название именно так — в квадратных скобках. Хорошо, что они отлично провели время, ведь тебе это стоило $25 тысяч — отправить их на конференцию, поселить в отелях и накормить, — и ты понятия не имеешь, окупились эти деньги или нет.

— …так это тому, что нам действительно пора слезать с PHP.

А. Ну. Вот и ответ.

— Мы все сходимся на том, что PHP — не тот язык, на котором мы проведём следующие пять лет.

— А какой, по-твоему, тот?

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

— Ну и, — спрашиваешь ты, — На каком языке ты хочешь писать?

Он выглядит озадаченным.

— В смысле, это неважно, — говорит он. — Я же не пишу код.

Тогда кто пишет? И тут ты понимаешь: прямо сейчас — никто.

4.4 Почему языков так много?

В одной из знаменитых работ по вычислительной технике — «The Next 700 Programming Languages» — говорится о 1,700 языках, уже загромождающих ландшафт программирования. Работа писалась для академического журнала и открывается чудесно точным, почти коановским утверждением: «Большинство языков программирования — это способ выражать одни вещи через другие, и только в некоторой части они выражают сам базовый набор этих вещей». Это было написано в 1966 году.

Некоторые из тех 1,700 языков дожили до наших дней. Например, Cobol 16 — легендарный и всеми ненавидимый, чудовищно многословный язык, тесно связанный с «проблемой 2000 года». Как однажды выразился Дейкстра: «Использование Cobol калечит ум; поэтому его преподавание следует рассматривать как уголовное преступление».

16 Но при этом у Cobol прекрасный язык описания данных. Если вы много возитесь с форматированием дат, валют и тому подобного — он вас очень выручает.

Дифирамбов ему никто не поёт (кроме банков — банки Cobol обожают), но он до сих пор крутится на мейнфреймах. Fortran — от Formula Translating System, авторства Джона Бэкуса — и LISP — от List Processor, авторства Джона Маккарти (со временем название изменилось на Lisp, ровно как UNIX стал Unix) — оба были разработаны ещё в 1950-е, во времена, когда компьютеры были похожи на мебельные гарнитуры, которые кормили огромными лентами и бумажными картами. Они оба используются по сей день. Мощь, которую давал Fortran, была заложена в самом его названии — выглядит он почти комично «компьютерно»:

PROGRAM SQUARES
    CALL SQUARE(10)
    END
    SUBROUTINE SQUARE(N)
    SUM = 1
    DO 10 I = 1, N
    WRITE (*,'(I10,$)') (I*I)
10  CONTINUE
    PRINT *, ""
    END

Это та же программа, что мы писали на C, которая столь бесценно печатает список квадратов. Стоит взглянуть на Fortran — и мозг воспроизводит странный металлический запах больших вычислительных центров с фальшполами. Этот древний язык превосходно справляется с численными расчётами, нужными учёным, и в некоторых задачах до сих пор обходит C. Физики и астрономы любят Fortran (ну, или мирятся с ним).

А вот Lisp — зверь совсем другой породы. Он вышел прямиком из математических исследований. Странным его делало многое. Некоторые говорят, что название расшифровывается как «Lots of Superfluous Parentheses» — «куча совершенно лишних скобок»16:

16 Lisp благоговейно чтят за то, что он позволяет программировать самого себя; его называют «программируемым языком программирования».

(defun squares (count)
  (dotimes (n count)
    (format t "~a " (* (+ n 1) (+ n 1)))))
(squares 10)

В 1980-е, пока фортрановцы оптимизировали мощность ядерных зарядов, лисповцы пытались научить робота поднять плюшевого мишку или написать сонет. Но однажды пришли люди, распоряжавшиеся мировыми деньгами, крикнули «Всё выключить!» и дёрнули большой красный рубильник (запрограммированный, вероятно, на Fortran). Лисповцам, так и не сумевшим ни смоделировать человеческий мозг, ни автоматически произвести великий сонет, осталось лишь сожаление. Компании, делавшие Lisp-машины, стали закрываться и распродавать активы. Студенты всё чаще учили C или Java. Lisp превратился в поучительную притчу, а его уникальное, цельное видение компьютера — в тёплое воспоминание о лучшей эпохе. И всё же…

Lisp и сегодня встречается в мире в изрядных количествах — например, в системе авиаданных, построенной компанией ITA, которую поглотил Google. Когда вы гуглите «рейс из Нью-Йорка в Берлин», где-то в глубине работает ITA — на Lisp. Было время, когда Lisp казался мертвее древнегреческого: прекрасная философская система, но непрактичная.

Lisp размывает границу между кодом и данными — тем, как он позволяет функциям ссылаться на самих себя. Это прекрасно работает, но требует от рядового программиста видеть мир бесконечно программируемым. Что оказалось немного через чур. Поскольку нам нужна простота.

А значит, наступила пора поговорить о работе с данными.