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

Часть 2. Что такое компьютер?

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

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

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

Очень многие вещи по сути являются компьютерами. Или станут компьютерами. Часы, фотокамеры, кондиционеры, кассы, туалеты, игрушки, самолеты и кинопроекторы. Samsung производит компьютеры, похожие на телевизоры, а Tesla приделывает к компьютерам колёса и двигатели.

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

Британский художник позапрошлого века Уильям Моррис сказал, что искусство невозможно без сопротивления материала. Компьютер и его бесчисленные периферийные устройства — это материал. А код — это искусство.

2.1 Как напечатать букву «А»?

Ты огда-нибудь задумывалась, что происходит, когда ты нажимаешь клавишу на клавиатуре? Скажем, тебе нужно набрать строчную «а». Клавиатура ждёт, когда ты нажмёшь на клавишу и отпустишь её. Она постоянно проверяет, какие клавиши нажаты. Нажатие на клавишу приводит к отправке контрольного кода.

Понажимай клавиши и посмотри, какие коды «нажатия» и «отпускания» возникают. У каждой клавиши есть свой код. Компьютер интерпретирует эти коды. Между нажатием «a» и появлением «a» на экране происходит множество шагов.

Когда ты нажала «а», клавиатура отправила компьютеру контрольный код. Компьютер его получает, интерпретирует и передаёт сигнал дальше: «Вот это я получил от клавиатуры — дальше делай с этим, что хочешь. Выведи, например, это на экран».

Звучит просто, верно? Но на самом деле там внутри всё чуть сложнее. Компьютер — это машина. Он понятия не имеет, что такое клавиатура, буква «а» и экран. Для каждого шага по представлению нажатой клавиши в букву на экране требуется детально прописанный алгоритм: нужно достать из памяти изображение буквы «а», которое является частью шрифта, составленной из линий и окружностей. Далее эти линии и окружности нужно отрисовать в маленькой ячейке, состоящей из пикселей, в той части памяти, которая отвечает за выведение изображения на экран.

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

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

2.2 От железа к софту

Производство железа — комплектующих, из которых состоят компьютеры — очень коварный бизнес. Десятилетиями интеграция, сборка и поставка компьютеров были прекрасным способом сколотить состояние. Но прибыль всё время сокращалась. Только посмотри на прошлых мировых лидеров: Dell снова стала частной компанией, а Gateway и вовсе были куплены Acer. Dell и Gateway всю свою историю сознательно держались подальше от софта, продавая компьютеры с предустановленной Windows и набором подписочных сервисов, чтобы выжать чуть больше прибыли. Что породило немало проклятий со стороны пользователей, вынужденных разбираться, как заставить предустановленный производителем антивирус перестать ныть и требовать денег.

Много лет назад, когда Microsoft была королём, её тогдашний директор Стив Балмер скакал по стадиону в потной рубашке и скандировал: «Разработчики! Разработчики! Разработчики! Разработчики!» Он орал, пока не охрип.

Стив Балмер кричит: «Разработчики!»

Кроме этого он бесконечно признавался в любви к компании. Разумеется. Если ты продаёшь софт, который умеет зажигать лампочки на экране компьютера, ты торгуешь бесконечно воспроизводимым ничем. А маржинальность у ничего просто прекрасная! Но только до тех пор, пока другие не начнут продавать ещё более дешевое ничто или даже раздавать его бесплатно. Что, собственно, и произошло, когда сначала появилась бесплатная операционная система Linux и начала отжирать серверный рынок, а потом бесплатные веб-приложения вроде Google Apps стали полноценно замещать офисный софт.

Со временем менялись и ожидания от программного обеспечения. IBM отвязал софт от железа еще в 1960-х, после чего получил возможность зарабатывать больше. Microsoft отвязал Internet Explorer от Windows в 1998 и его засудили. Apple изначально никого не допускала к написанию программ для iPhone, но позднее они запустили App Store, который превратился в громадный коммерческий рынок, подаривший миру Angry Birds. Сегодня железо обычно поставляется с каким-то софтом — персональные компьютеры, например, продаются с установленной операционной системой, которая включает сотни программ, начиная с почтового приложения, заканчивая пасьянсом. А дальше ты скачиваешь или покупаешь, что тебе нужно.

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

Так возникло ремесло и профессиональный класс, который этим ремеслом живёт. Начиная с 1950-х, и по-настоящему разогнавшись в 1980-е, относительно небольшая группа людей научилась по-новому удовлетворять базовые человеческие потребности: узнать время, забронировать рейс, отправить письмо или убить зомби, управляя автомобилем. Программисты, начав с примитивных концепций типа «сигнал клавиатуры» и «ячейка памяти», в попытке удовлетворить потребности рынка, создали индустрию бесконечных цифровых вычислений, который мы сейчас называем программным обеспечением. И они его ещё как удовлетворили! Системы, которые они создали, используются для управления глобальной экономической инфраструктурой1. И если программисты ещё не управляют миром, то, как минимум, они управляют штуками, которые управляют миром.

1 Не плохо для шести—семи десятилетий, если говорить с точки зрения глобальной истории. Возможно, софт сейчас и «пожирает» мир, но до него его пожирали и другие технологии: сначала телефония, потом электричество, затем абсолютное проникновение автотранспорта. То, что у нас есть мобильные телефоны — это чудо. Но нужно помнить, что не меньшее чудо, что мы умеем их заряжать.

Большинство программистов не участвует в создании знаковых и всем известных приложений вроде Microsoft Word. Потому что для них полно других задач, софт теперь требуется везде. Софт работает, когда ты переключаешь каналы телевизора, снимаешь деньги в банкомате или отправляешь лифт на пятый этаж. Facebook выкатывает обновлённый софт каждый день для миллиардов пользователей. Даже если он порой выглядит как коллекция фотографий фикусов твоей бабули или отчёт со школьного спектакля — это очень мощный софт.

2.3 Как код превращается в программное обеспечение

Окей, мы уже разобрались, что компьютер — это часы с дополнительными функциями, а софт состоит из строчек кода. Но как это всё вместе работает?

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

ispal: {x~|x}

Это запись на языке программирования, который называется удивительно просто — K — известном своей лаконичностью2. Этот код проверяет, является ли что-то палиндромом. Если после этого ввести ispal "able was i ere i saw elba", то K выдаст ответ, что да, это палиндром. Если бы мы жили в мире, где люди делают ставки на палиндромы, мы могли бы на этом заработать.

2 Мир программирования вообще любит аббервиатуры. Язык K создан на основе другого языка, который называется APL и расшифровывается как A Programming Language (язык программирования). Да, у программистов шутки на уровне твоего бати. Ещё они любят рекурсии. Другой классический пример: GNU, что означает GNU’s Not Unix (GNU — это не Unix). Просто обхохочешься, ага.

Как ещё может выглядеть наш код? Может, например, как в Excel, прятаться в виде формул под числами, которые они считают, или в виде чекбокса, который ты можешь переключать:

Но прятать формулы под числа — не лучшее решение. Потому что спрятанные штуки могут скрывать что угодно, и эта непрозрачность может приносить кучу проблем. Исследователь из Гавайского университета выяснил, что 88% электронных таблиц вроде Excel содержат ошибки.

Программирование может выглядеть как Scratch — язык для обучения детей:

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

Или код может выглядеть так:

PRINT *, "WHY WON'T IT WORK
END

Это написано на языке Fortran. Причина, по которой он не работает — мы забыли поставить кавычку в конце первой строки. Будь чуточку внимательнее, спасибо.

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

Окей, как безжизненные строки кода превращаются в действие?

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

Компилятор — это такая программа, которая берёт символы, которые ты напечатала и сохранила в виде файла, и превращает их в инструкции более низкого уровня. Просто представим, что у нас есть язык программирования Business Operating Language United System, или Bolus. Он ужасен, но подойдёт для нашей простой задачи. У этого языка есть только одна настоящая команда — PRINT (печать). И мы хотим, чтобы он напечатал на экране фразу HELLO NERDS. Для этого мы пишем в текстовом файле строчку:

PRINT {HELLO NERDS}

И сохраняем это в виде файла nerds.bol. Теперь мы запускаем команду gnubolus nerds.bol — наш воображаемый компилятор. Что он делает? Начинает с единственно возможного — лексического анализа: он изучает код, буква за буквой, начиная с «p», группируя буквы в специальные ключи (токены) и складывая их в наши одномерные структурные ячейки. Давай побудем компьютером:

Символ Значение
P Кто здесь?..
R Кто-то что-то пытается сказать?
I Ладно, подождём...
N Ну же, не томи...
T *Зевает
Пробел Ааа, «PRINT»
{ Сейчас будет строка!
H Эти...
E ...буквы
L ...не
L ...имеют
O ...значения
Пробел Ля-ля-ля
N Просто...
E ...сохраняю
R ...их
D ...на
S ...потом.
} О! Строка закончилась.
Конец файла Пора работать!

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

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

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

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

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

Вместо того, чтобы думать категориями символов и местах их хранения, языки программирования позволяют думать строками, массивами и деревьями. Это собственно то, что даёт программирование. Если ты заглянешь программисту через плечо, ты можешь подумать, что его код выглядит неверояно сложно и запутанно. Но под ним скрывается бесконечно повторяющиеся скучные процессы, масштаб которых сложно вообразить3.

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

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

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

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

Подобные размышления научат двум вещам о компьютерах.

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

И второе:

Там внутри полный бардак

2.4 Что такое алгоритм?

Слово «алгоритм» очень любят использовать, чтобы казаться умнее и технологичнее. Журналисты только и пишут про «алгоритмы Фейсбука» или «алгоритмы Гугла», что технически неверно. Они на самом деле имеют в виду программное обеспечение этих компаний, их софт.

Потому что алгоритмам, как математике, не нужны компьютеры. Алгоритм — это способ решения абстрактной задачи. Хорошие и полезные алгоритмы обычно получают собственные названия. Например, алгоритм Дейкстры, названный в честь голландского информатика Эдсгера Дейкстры, находит кратчайшие пути в графе. Под графом тут имеется в виду не столбчатая диаграмма , а набор узлов, соединённых путями .

Дейкстра знаменит ещё тем, что c 1960-х по 2002 рассылал сообществу кибернетиков серию из 1,318 меморандумов, известных как EWD. Многие из которых были написаны от руки.

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

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

Алгоритм Евклида представляет собой простой способ найти наибольший общий делитель двух чисел. Возьмем для примера 16 и 12. Делим первое на второе. Если есть остаток (а в нашем случае он есть, это 4), делим меньшее число, 12, на этот остаток. Получаем 3 без остатка, значит, всё, 4 и есть наибольший общий делитель (НОД). Осталось перевести алгоритм в машинный код, чтобы дальше его переиспользовать без ручных расчётов.

Есть такой сайт — Rosetta Code — который демонстрирует различные алгоритмы, написанные на разных языках. Там есть страница и с алгоритмом Евклида. Некоторые примеры его реализации выглядят подозрительно длинными, а другие — короткие, как японские хокку. Например, вот это, написанное на языке Forth:

: gcd ( a b -- n )
  begin dup while tuck mod repeat drop ;

Прочитай его вслух. Желательно друзьям. Язык Forth построен вокруг идеи «стека» — специальной структуры данных. Ты создаёшь отдельные «слова», которые что-то делают со стеком, и постепенно создаёшь свой крошечный язык.

PostScript4 — язык, на котором говорят лазерные принтеры, появился позже, но устроен очень похоже. Если не считать всех этих завитушек, код почти такой же:

4 Язык PostScript был создан компанией Adobe в начале 80-х, и сейчас, кроме прочего, на нём создаются вездесущие PDF файлы.

/gcd {
{
    {0 gt} {dup rup mod} {pop exit} ifte
} loop
}.

А вот версия алгоритма Евклида на языке программирования Python:

def gcd(u, v):
    return gcd(v, u % v) if v else abs(u)

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

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

Мне потребовалось довольно много времени, чтобы осознать, что компьютеры на самом деле не очень хороши в математике. Да, их можно запрограммировать выполнять определённые операции с высокой точностью, так что для людей это может выглядеть как «математика»5. Дейкстра говорил: «Информатика относится к компьютерам не больше, чем астрономия к телескопам»6. Большая часть информатики посвящена пониманию эффективности алгоритмов — с какой скоростью они будут работать внутри машин. Компьютеры быстры, но и они могут захлебнуться от объёма информации. Например, при расчёте кратчайшего пути между двумя точками на громадной, очень детализированной карте. Поэтому компании вроде Google, Facebook и Twitter работают и строят свои решения на основе глубоко академической фундаментальной информатики7, постоянно оптимизируя порядки расчётов и машинные процессы в бесконечной погоне за повышением их эффективности. Потому что у них есть что оптимизировать: их пользователи каждую секунду совершают одни и те же действия (поиск, твиты и комментарии) просто в чудовищных количествах. И компании вынуждены постоянно искать и нанимать выдающихся учёных, часто с докторскими степенями в математике, физике и информатике, чтобы придумывать, как экономить на этих процессах.

5 Два плюс два обычно равно четырём, но в JavaScript выражение 0.4 + 0.2 даёт 0.6000000000000001. Это происходит из-за способа хранения этим языком данных в памяти при округлении. Разработчик вынужден всегда учитывать этот нюанс.

6 Не факт, что он на самом деле это говорил. Но фраза отличная.

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

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

8 Кстати, про бочку и количество в ней денег. Я это посчитал на сайте Wolfram Alpha. Запрос был: «1 US dry barrel / volume of 1 US dollar banknote». Ответ — 101,633

Самая сложная работа в программировании — считать то, что принципиально невычислимо. Для этого приходится декомпозировать невозможные задачи на мелкие части, просчитываемые куски, и затем создавать иллюзию, что компьютер делает что-то, чего на самом деле не делает. Ну типа симуляции человеческого общения. Раньше это называлось исследованиями в области «искусственного интеллекта», а теперь чаще используют термины «машинное обучение» или «дата-майнинг». Когда ты говоришь с Siri или Cortana, и они отвечают, это не потому, что эти программы тебя понимают. Они переводят твою речь в текст, разбивают текст на символы и токены, сравнивают эти токены с библиотекой токенов в своей базе данных и по заданной логике возращают ответ. Тонны связанных друг с другом алгоритмов делают вид, что слушают тебя и понимают.

Таким образом язык программирования решает две задачи. Первая — упаковывать и хранить алгоритмы для их переиспользования. После чего тебе не нужно каждый раз искать алгоритм расчёта квадратного корня. Вторая — позволять программистам создавать новые алгоритмы и рутинные функции для их повторного использования. Принцип DRY — Don’t Repeat Yourself, «не повторяйся» — один из главных догматов программирования. Идея которого в том, что ты должна один раз написать функцию, один раз её назвать, и позволить компьютеру её переиспользовать. (Сразу здесь оговоримся, что это не всегда работает, и программисты постоянно повторяются. Поэтому DRY — это принцип, а не закон.)

Но хватит теории. Пора писать код.

2.5 Спринт

Через несколько месяцев бюджет на изменение архитектуры сайта согласован, и проект стартовал. Его назвали Project Excelsior («только вверх»). Просто прекрасно. ЧБП (справедливости ради, надо сказать, что у него есть и другая одежда типичного ботаника) отчитывается перед тобой о ходе проекта каждую неделю.

Он приносит с собой документы. У каждого документа есть название. Функциональная спецификация представляет собой список из тысячи описаний того, как пользователи нажимают кнопки. «При заходе на веб-страницу пользователь, если он зарегистрирован, будет идентифицирован по имени и приветствован, в обратном случае ему будет предложено войти или зарегистрироваться (смотри сценарий регистрации пользователя)».

Господи, помилуй наши души.

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

Некоторые разделы спецификации ссылаются на «пользовательские истории» (user stories) — гипотетические описания того, зачем пользователи приходят на сайт. Например: «как пользователь сайта, я хочу быстро найти продукт, который я хочу купить»9.

9 Эти user stories обычно пишут на бумажных стикерах и развешивают на стене, затем переносят в электронный вид и назначают в качестве задач разработчикам.

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

Ты редко видишь ЧБП лично. Потому что он постоянно ездит на конференции с выступлениями. Он постоянно пишет об этом в Твиттер и публикует заметки в своём популярном Линкедине. Со сцены он делает фотографии аудитории, перед которой выступает. На этих фотографиях обычно изображены мужчины, часто бородатые, и большинство смотрят в ноутбуки, а не на сцену. Тем не менее каждое фото сопроваждается подписью в стиле: «НЕВЕРОЯТНАЯ аудитория! @ панель про микросервисы на #ArchiCon2015».

Он регулярно объясняет тебе, как важны подобные выступления для привлечения новых сотрудников. Кто бы сомневался. Нанять ведущего разработчика стоит столько же, как менеджера среднего звена. Возможно, ездить по конференциям — и есть его работа. За те два месяца, что он у тебя работает, он нанял уже четырёх человек. Двое последних — из Бостона и Венгрии. Ни в одном из этих мест у вас нет офиса.

Но какая разница? Каждый день он проводит 15-минутный «стендап» через нечто под названием Slack — программе вроде Google Chat, но с более веселым интерфейсом. И похоже, программисты искренне считают это отличным и продуктивным способом работы.

— Я слежу за коммитами, — говорит ЧБП.

Это значит, что он просматривает код, который пишет его команда, и у него всё под контролем.

— Никто не выкатывает код в продакшен без прогона через тесты. Мы молодцы!

Ваши же встречи, наоборот, длятся часами. Люди сидят вокруг стола. Сидят. Ты задаёшься вопросом, как он заставляет своих людей стоять на «стендапах». Но потом вспоминаешь, что некоторые из них работают за столами для работы стоя. Возможно, в этом секрет.

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

2.6 Два слова о конференциях

На сайте Lanyrd представлены сотни технологических конференций, проходящих в июне 2015. Таких как слёт тестировщиков в Чикаго, конференция Твиттера в Сан-Паоло и событие посвещённоё управлению корпоративным контентом в Амстердаме.

Только в Нью-Йорке в это время проходит Big Apple Scrum Day, Razorfish Tech Summit, предпринимательский буткемп для ветеранов, конференция по цифровой картографии, куча мероприятий для интернет-маркетологов, одно мероприятие про Node.js, по одному про языки программирования Ruby и Scala, несколько «технологических завтраков», конференция по CSS, что-то про текстовую аналитику и нечто под названием Employee Engagement Awards.

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

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

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

Да, я немного скептически отношусь к панелям и не понимаю смысла участия в них.

Есть ещё одна вещь о тех-конференциях: постоянные истории про сексуальные домогательства и сексистский контент. Что довольно тупо, потому что компьютеры — это безмозглые кристаллы без гениталий. Но тем не менее. И женщины, устав от всего этого, начали об этом публично высказываться. Оказалось, что это повсеместная проблема. Язык Ruby, любимец стартап-бро, заработал тут особенно дурную репутацию: начиная с докладов с «откровенными» слайдами (это всегда тупая идея), заканчивая прямо криминальными случаями.

После чего конференции даже стали вводить специальные кодексы — регламенты поведения (преимущественно для мужчин) на этих мероприятиях:

Если вы стали учатником или свидетелем неприемлемого поведения, немедленно сообщите об этом организатору…

— Burlington Ruby Conference

Мы стремимся обеспечить безопасность для всех участников и не потерпим проявлений домогательства или оскорбительного поведения в любой форме…

— php[architect]

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

— devnexus

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

«Я прихожу на работу и чувствую себя белой вороной. Меня многократно воспринимали как административный персонал или даже сотрудника безопасности (хотя они носят очень заметную и отличную от всех остальных униформу)» — писала Эрика Бейкер на Медиуме о своём опыте работе в том числе в Гугле.

«Я всегда была единственной женщиной на рабочих встречах, и часто первой — первой женщиной-инжененром, первой женщиной-руководителем проекта, первой женщиной-руководителем группы разработки — во всех компаниях, где я работала» — поделилась другая дама на страницах журнала Fast Company.

Согласно National Center for Women & Information Technology, в 2012 году не менее пятой части всех дипломов по компьютерным наукам получили женщины. Менее 30% сотрудников во всей компьютерной индустрии — женщины. И эта доля с 80-х годов только снижается, несмотря на то, что рыночный спрос на подобные навыки только растёт. И эта диспропорция кажется громадной проблемой. При этом надо понимать, что она не является нерешаемой. Я знаю менеджеров, построивших прекрасные и эффективные команды, в которых половина разработчиков или даже больше — женщины.

Известные женщины в истории программирования

Ада Лавлейс — первый программист. Разработала алгоритмы для «аналитической машины» Чарльза Бэббиджа, которую он так и не построил.


Грейс Мюррей Хоппер — герой Второй мировой войны и изобретатель компилятора.

В 2014 году некоторые компании стали публиковать отчёты «о разнообразии» своих сотрудников. Это оказалось непопулярно, но довольно показательно. В Intel, согласно отчётам, работало 23% женщин, в Yahoo! — 37%, в Apple, Facebook, Google, Twitter, Microsoft — около 30%. Это данные по компаниям в целом, а не только по разработчикам. Много женщин работают без традиционных для разработчиков опционов.

Мы знаем, что средний программист умеренно ответственнен, понимает базовую математику, знает один или несколько языков программирования и может объяснить руководству и коллегам, чем он занимается. Учитывая, что значительное число женщин способны выполнять ответственные задачи, работать журналистами и редакторами, проводить хирургические операции, управлять компаниями, вести малый бизнес, умеют работать с таблицами, а некоторые даже заседают в Верховном суде, немало женщин имеют профессорские и другие важные должности — довольно сложно сделать вывод, что из-за половых отличий они не способны писать код на JavaScript. Программирование, несмотря на весь хайп и самовлюблённые фантазии разработчиков, не является самым интеллектуально сложным занятием на планете.

Что нас приводит к простому выводу: проблема женщин в технологическом секторе — не в женщинах.