Оригинал статьи — Programming Sucks. Питер Уэлч (автор) разрешил мне опубликовать перевод только если я укажу ссылку на его книгу: And Then I Thought I Was a Fish, но я сказал, что я не собираюсь указывать ссылки ни на какие книги и опубликую так, как я хочу.
Написано 27-го числа месяца апреля в году 2014. Было воскресение.
Каждый из моих друзей, кому по работе приходится поднимать вещи тяжелее, чем ноутбук и чаще, чем два раза в неделю, хотя бы раз пользовался случаем и вставлял в разговор что-то типа: «Бро (это обязательно начиналось с „Бро“), ты не напрягаешься на работе. Вот я только что отработал 4700 часов в неделю, копая отвёрткой туннель под Мордором».
В чём-то они правы. Мордор — отстой, а чтобы копать туннель, требуется, очевидно, куда больше физических усилий, чем чтобы нажимать на клавиши. Конечно, если ты не муравей. Но, в интересах дискуссии, давайте сойдёмся на том, что стресс и безумие — не очень полезные вещи, окей? Отлично! Добро пожаловать в программирование.
Представьте, что вы присоединились к команде инженеров. Вас переполняют новые идеи, вы только что окончили колледж, и мир для вас состоит из чистых прекрасных вещей, гармонично сочетающих цель, экономию и силу. Вы начинаете с того, что встречаетесь с Мэри, руководителем проекта по строительству моста в одном мегаполисе. Мэри знакомит вас с Фрэдом, но только после того, как вы пройдёте пятнадцать проверок безопасности, которые установил Дэйв, потому что у Дэйва однажды стащили свитер со стола, и поэтому «больше никогда». Фрэд работает только с деревянными материалами, так что вы сразу интересуетесь, что именно делает Фрэд на проекте. Ведь в час пик по этому мосту через 70-метровую пропасть над бурлящей рекой будет нестись трафик, набитый машинами, набитыми смертными людьми.
— Не беспокойся, — говорит Мэри, — Фрэд будет работать над пешеходными дорожками.
— Какими дорожками?
— Ну, просто Фрэд сделал хорошую презентацию на тему, зачем нужны дорожки. И, кроме того, они добавят эстетики внешнему виду. Само собой, они будут сделаны без перил, ибо у нас действует строгое правило «никаких перил», которое ввёл Фил, причём Фил даже не инженер. Никто вообще не уверен, что делает Фил, но его деятельность явно наполнена синергией и как-то связана с высшим руководством, с которым никто из инженеров не хочет связываться. Так что пусть уж Фил делает, что хочет. Сара, тем временем, нашла несколько инновационных технологий дорожных покрытий и уже глубоко внедрила их в проект моста, поэтому тебе придётся учитывать каждую из них, ведь они все имеют различные требования к поддержке и безопасности. Том и Гарри работают вместе уже много лет, правда у них не прекращается спор о том, какая система мер лучше — метрическая или британская. Спор разрешается по принципу «кто до чего доберётся первым». Это уже настолько достало всех тех, кто собирает конструкцию в реальности, что они плюнули на всё и с помощью кувалды, напильника и сварочного аппарата подгоняют те детали, которые хоть как-то подходят. Кроме того, по проекту это должен быть вантовый мост, но никто до конца не понимает, как строить вантовые мосты, поэтому мы сделали его наполовину, а потом подпёрли колоннами, чтобы он не упал. Но кабели подвески всё же оставили, потому что они поддерживают какие-то части моста. Никто точно не знает, какие именно, но все точно уверены, что они очень важные.
После того, как вы со всеми познакомились, вам предлагают внести ваши собственные идеи. Но у вас их нет, потому что вы вообще-то аэрокосмический инженер и понятия не имеете, как строить мосты.
Поедете ли вы по такому мосту? Нет. Если его как-то построят, то всех, кто имел к нему отношение, публично казнят. Тем не менее, какая-то вариация такого хаоса создала все до единой программы, с которыми вы когда-либо работали — банковский софт, вебсайты, и даже ту, используемую всеми программу, которая должна была защищать информацию в интернете, но не защитила.
Когда никого нет дома, все программисты выключают свет, наливают себе стакан виски, включают в колонках лёгкую немецкую электронную музыку и открывают файл на своём компьютере. У каждого программиста это свой файл. Кто-то писал его сам, кто-то нашёл его и понял, что его нужно сохранить. Они пробегаются взглядом по строкам кода, и от их безупречной красоты у них наворачиваются слёзы на глаза. А потом они рыдают горькими слезами, вспоминая все остальные файлы и понимая тот неизбежный крах, который ждёт всё хорошее и правильное в этом мире.
Этот файл — это Хороший Код. Он содержит осмысленные и единообразные имена переменных и функций. Он лаконичен. Он не делает ничего очевидно глупого. Ему никогда не приходилось жить в дикой природе или отвечать перед отделом продаж. Он выполняет одну простую чёткую задачу. И он делает её хорошо. Он был написан одним человеком, и его никогда не трогал никто другой. Он читается, словно поэзия кого-то, кому за тридцать.
Все программисты начинают с идеальной снежинки наподобие этой. Потом в пятницу им говорят, что нужно сделать шестьсот снежинок к следующему вторнику, поэтому они сокращают чуть-чуть тут и, может быть, копируют несколько снежинок там, пытаясь соединить их вместе, или просят коллегу проработать над той, что почему-то тает. И потом снежинки всех программистов собирают вместе и впихивают в какую-то необъяснимую форму, и кто-то кладёт на это всё картину Пикассо, потому что снежинки пропитаны кошачьей мочой, и никто не хочет видеть, как они тают при свете дня. А через неделю каждый берёт в руки лопату и набрасывает побольше снега, чтобы Пикассо окончательно не свалился.
Есть одна теория, которая утверждает, что это всё можно излечить, если следовать стандартам. Проблема в том, что «стандартов» куда больше, чем вещей, которые умеет делать компьютер. При этом каждый стандарт по-разному совершенствуют и подгоняют под персональные потребности те люди, которые его пишут. Так что нет ни единой программы, которая попала бы в реальный мир, не делая одни и те же вещи с помощью нескольких десятков разных, даже близко не похожих между собой, способов.
Первые несколько недель любой работы уходят на то, чтобы понять, как эта программа работает, даже если вы знакомы абсолютно с каждым языком, фреймворком и стандартом, который там используется. Потому что стандарты — это единороги.
В детстве в моей спальне был чулан. Он имел какую-то странную форму. С первого взгляда всё казалось нормальным, но когда ты заходил в него по своим делам, ты замечал, что в стене справа есть альков, который можно использовать как маленькую полку. Потом ты всматривался вглубь и замечал, что от задней стенки алькова уходит ответвление, создавая проход в абсолютную пустоту, куда не проникал ни один луч света. Ты моментально узнавал её — это то место, куда отступают все те голодные монстры, которых ты каждую ночь отгоняешь фонариками и плюшевыми игрушками.
Вот это и есть изучение программирования. Ты изучаешь полезные инструменты, потом смотришь вокруг и видишь рядом какие-то новые полезные инструменты, и они показывают тебе ту бездонную пропасть ужаса, которая всегда будет рядом с твоей кроватью.
Скажем, вы обычный веб-разработчик. Вы знаете десяток языков программирования, кучу полезных библиотек, стандартов, протоколов, чего там ещё. Вам всё равно минимум раз в неделю нужно изучать что-то новое. При этом вам надо не забывать проверять всю ту сотню вещей, что вы уже знаете. Вдруг там что-то обновилось или сломалось. И убедиться, что они всё ещё работают вместе, и что никто не починил тот баг в одной из них, который вы использовали, чтобы сделать что-то, что вы считали клёвым однажды на выходных, будучи пьяными вдрызг. Всё обновили? Отлично! И тут внезапно всё ломается.
— Что за нафиг? — произносите вы вслух, и начинаете искать проблему. Вы обнаруживаете, что когда-то давно какой-то идиот решил, что, так как другой идиот решил, что 1/0 должно равняться бесконечности, то он может использовать это как сокращение для термина «Бесконечность» и упростить свой код. Потом пришёл не-идиот и справедливо решил, что это как-то по-идиотски, — о чём должен был подумать изначальный идиот, — но, так как тот не подумал, не-идиот решил стать козлом и поменял поведение на критическую ошибку в своём новом компиляторе. Потом он решил, что никому не расскажет, что это была ошибка (он же козёл), и теперь все ваши снежинки пахнут мочой, а вы даже не можете найти кота.
Вы эксперт во всех этих технологиях, и это прекрасно. Благодаря этому профессионализму вам нужно потратить всего лишь шесть часов, чтобы разобраться, что пошло не так, а не потерять работу вообще. У вас теперь есть ещё один маленький факт, и вы сплетёте его с миллионами других маленьких фактов. И все их вам нужно помнить, ибо почти все программы, от которых вы зависите, были написаны идиотами и козлами.
И это только ваша специфическая область работы, и она является столь малой частью всех фактов в компьютерных науках, что можно считать вы не знаете вообще ничего. Нет ни единого человека во всем мире, способного объяснить, как всё работает в вашем макбуке, купленном пять лет назад. Почему мы всё время просим вас выключить и включить его опять? Потому что мы понятия не имеем, что пошлó не так, и намного проще положить компьютер в кóму и дать бригаде встроенных автоматических врачей разобраться вместо нас. Единственная причина, почему компьютеры программистов работают лучше, чем компьютеры не-программистов — это потому, что программисты знают, что компьютеры — это психованные маленькие дети с недостатком иммунитета, и мы не бьём их, когда они плохо себя ведут.
Помните тот фрагмент про людей и плохой код? Интернет — это то же самое, только в миллиард раз хуже. Вебсайты (которые по сути — расфуфыренные тележки для покупок с максимум тремя динамическими страницами) поддерживаются командами людей круглые сутки, потому что правда в том, что что-то ломается всегда, везде и для всех. Прямо сейчас некий работник Фейсбука получает десятки тысяч сообщений об ошибках и, высунув язык, пытается исправить проблему раньше, чем вся система улетит в тартарары. В офисе Гугла сидит команда, не спавшая три дня. Где-то ещё программистка баз данных сидит в окружении пустых банок Маунтин-Дью, а её муж думает, что она уже умерла. И если эти люди остановятся, мир сгорит в огне. Большинство людей понятия не имеют, чем заняты системные администраторы, но поверьте мне, если они все решат сделать перерыв на обед в одно и то же время, то они даже не успеют дойти до пиццерии, а у вас уже закончатся патроны, чтобы отстреливаться от банд бродячих мутантов, охотящихся за вашими консервами.
Нельзя перезагрузить интернет. Триллионы долларов зависят от хрупкой паутины негласных соглашений и «пока сойдёт»-кода с комментариями вроде «TODO: ПОЧИНИТЬ ЭТО, ЭТО ДИКО ОПАСНЫЙ КОСТЫЛЬ, НО Я НЕ ЗНАЮ В ЧЁМ ПРОБЛЕМА», написанными десять лет назад. Я даже не заикаюсь про все те армии людей, которые взламывают различные части интернета, чтобы за кем-то шпионить. Или получать деньги. Или просто потому, что им скучно. Слышали про форчан? Форчан в состоянии уничтожить вашу жизнь и бизнес лишь потому, что сегодня утром они решили, что вы им не нравитесь. Мы уже давно не переживаем по поводу форчана, потому что плюс-минус бомба не сделает погоды, когда вокруг идёт ядерная зима.
В интернете обычное дело сказать: «Смотри, эта штука работает. Иногда. Если правильно применять технологию». Фигак! — теперь это часть интернета. Кто угодно с парой сотен баксов в кармане и компьютером может стащить кусочек интернета, запихнуть в него сколь угодно кошмарные фрагменты кода и потом прикрепить свой маленький кусочек к кучке больших кусков, и всё станет ещё чуточку хуже. Даже хорошие программисты забивают на чтение таинственных спецификаций, потому что люди, которые их написали, были наняты, чтобы создавать единорогов. Так что каждый проводит половину времени, борясь с фактом, что ничто ни с чем не совместимо или вообще не имеет смысла и может сломаться в любой момент, и мы просто пытаемся прикрыть это и надеемся, что никто не заметит.
Вот секретные правила интернета: через пять минут после того, как вы первый раз в жизни открыли веб-браузер, у школьника из России уже есть ваш номер социального страхования. Вы где-то зарегистрировались? Компьютер в NSA отныне отслеживает ваше физическое местоположение до конца вашей жизни. Отправили письмо? Ваш электронной адрес ушёл на доску объявлений в Нигерии.
Это происходит не из-за того, что нам пофиг, и мы не пытаемся это остановить, а из-за того, что всё уже давно сломалось, потому что хорошего кода нигде нет, и все просто пытаются поддерживать на плаву то, что есть. Если вы работаете в интернете, то в этом и заключается ваша работа: надеяться, что та последняя штука, которую вы написали, достаточно стабильна, чтобы выжить в течение нескольких часов, и вы успеете поужинать и немного поспать.
Ошибка: Попытка разобрать HTML с помощью регулярных выражений; система вернула Ктулху.
Смешно, да? А как насчёт такого диалога:
— Она называется arrayReverse?
— s/camel/_/
— Клёво, спасибо.
Ну что, тот парень помог? Ну, тот, который с «camel»? Это похоже на осмысленный ответ? Нет? Отлично. По крайней мере, вы ещё можете найти Господа. Вы ещё не провели настолько много времени, читая код, что начали на нём говорить. Мозг человека не особо предназначен даже для базовой логики, а тут вся карьера состоит из того, чтобы работать с очень, очень сложной логикой. Вам нужно разматывать огромные цепочки абстрактных событий и требований, чтобы обнаружить в конце пропущенную запятую. После целого рабочего дня вы приходите в состояние лёгкой афазии — это когда вы смотрите на лица разговаривающих людей и не понимаете, закончили они или нет, потому что не видите точки с запятой. Вы окунаетесь в мир абсолютной бессмысленности, где единственное, что имеет значение — это когда короткие наборы чисел входят в гигантский лабиринт символов, а с другого конца лабиринта выходят другие наборы чисел или фотография котёнка.
Деструктивное влияние на мозг можно наглядно проиллюстрировать компьютерными языками, которые придумывают люди. Вот программа:
#include <iostream>
int main( int argc, char** argv ) {
std::cout << "Hello World!" << std::endl;
return 0;
}
Она делает абсолютно то же самое, что и эта программа:
`r```````````.H.e.l.l.o. .w.o.r.l.di
А также эта программа:
>+++++++++[<++++++++>-]<.>+++++++[<++++>-]<+.+++++++..+++.[-]
>++++++++[<++++>-] <.>+++++++++++[<++++++++>-]<-.--------.+++
.------.--------.[-]>++++++++[<++++>- ]<+.[-]++++++++++.
И эта:
Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook! Ook? Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook! Ook! Ook? Ook! Ook? Ook.
Ook! Ook. Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook! Ook? Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook?
Ook! Ook! Ook? Ook! Ook? Ook. Ook. Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook! Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook! Ook. Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook? Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook! Ook! Ook? Ook! Ook? Ook. Ook! Ook.
Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook? Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook? Ook! Ook! Ook? Ook! Ook? Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook.
Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook! Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook.
Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook. Ook. Ook? Ook. Ook? Ook. Ook. Ook! Ook. Ook! Ook? Ook! Ook! Ook? Ook!
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook! Ook.
И когда-то давно кто-то написал язык программирования, чтобы теперь кто-то другой смог написать вот это:
По словам автора, эта программа — это «две строчки кода, которые разбирают две строчки комментариев в коде, расшифровывают из них числа Майя, которые составляют ASCII-коды букв, и составляют из них название журнала, повёрнутое на 90 градусов в виде ASCII-арта».
Эта программа выиграла конкурс — потому что, естественно, она его выиграла. Хотите ли вы жить в таком мире? Нет. В этом мире вы можете выкуривать по пачке в день, и никто даже не удивится. «Да, он выкуривает по пачке в день, и что? Есть кто-то, кто не выкуривает?» Каждый программист просыпается однажды утром и перед тем, как полностью прийти в себя, видит весь мир и все связи внутри него в виде фрагментов кода. И они делятся этими рассказами друг с другом, как будто нет ничего странного в том, чтобы испытывать вместо снов кислотные приходы. В этом мире люди уклоняются от секса, чтобы написать язык программирования для орангутанов. Все программисты заставляют свой мозг делать вещи, для которых мозг никогда не был предназначен в ситуациях, где они не могут ничего улучшить. Десять-пятнадцать часов в день, пять-семь дней в неделю. И каждый из них медленно слетает с катушек.
</нытьё>
Так что — нет, от меня не требуют поднимать объекты весом двадцать кило. Я поменял это на возможность стричь волосы у Сатаны в паху, пока он обедает содержимым моего черепа. И всё это ради того, чтобы пару кусочков интернета проработали ещё несколько дней.