Источник: http://habrahabr.ru/post/203276/
#Стражи ночи
Будучи высококвалифицированным исследователем, я потратил немало времени на продвижение науки вперёд. Но я родился на Юге и искренне убеждён, что прогресс — это выдумка, и что нужно готовиться к Судному дню, к жатве того, что мы посеяли и к появлению быстрых зомби, медленных зомби, и даже вежливых зомби, которые обращаются к вам «сэр» или «мадам», но в итоге пытаются съесть ваш мозг дабы заполучить ваши навыки. Когда нагрянет революция, нужно быть готовым; поэтому в моменты тишины и покоя, когда я не произвожу очередной прорыв в науке, я размышляю над тем, что же я буду делать, когда прогноз погоды изменится на «РЕКИ КРОВИ ЦЕЛЫЙ ДЕНЬ ДО СКОНЧАНИЯ ВРЕМЁН».
В основном я думаю о тех, кто будет прикрывать мою спину, поскольку шансы на выживание в постапокалиптическом мире напрямую зависят от размера и качества того сброда, который вы будете называть своей командой. Очевидно, мне понадобятся: слесарь (чтобы двери вскрывать), эксперт‐подрывник (если уж у слесаря закончатся идеи) и конечно же тот парень, что отловит, выдрессирует и затем будет швырять змей в моих врагов (потому что в мире умершей надежды бросок змеёй — это разумный способ урегулирования разногласий). В сией антиутопии они помогут мне прослыть воинствующим философом.
Но! Но… Самым важным членом моей банды будет системный программист, ибо в гоббсовском кошмаре невероятных масштабов умеющему отладить драйвер устройства или распредёленную систему человеку можно доверять; системный программист видел ужасы Вселенной и понимает безысходность бытия. Системный программист писал драйверы для устройств, прошивку которых создавал то ли пьяный ребёнок, то ли трезвый карась. Системный программист отлавливал проблему с сетью через восемь машин, три часовых пояса и с дружеским визитом в Омск, откуда ее перенаправили в левое переднее копыто той лошади, что избавила Трою от перенаселения. Системный программист читал исходники ядра для лучшего понимания процессов мироздания и видел комментарий «И ЭТО РАБОТАЕТ ЛОЛ» в коде планировщика, и не смеялся он, но плакал; и отправил он патч ядра для восстановления баланса Силы и устранения инверсии приоритетов, что приводила к зависанию MySQL. Системный программист знает, что делать, когда общество падёт, потому что он уже живет в мире, где царит беззаконие.
Впрочем, я не говорю, что остальные айтишники бесполезны. Я свято верю (хоть и не могу доказать), что у PHP‐разработчиков есть душа. Я считаю, что оптимизирующие SELECT‐FROM‐WHERE люди делают полезную работу, хоть и единственное, что этим не выразишь — это матерные частушки. Не пойму почему, но я рад, что теоретики исследуют эквивалентность пятимерной машины Тьюринга и Эдварда Руки‐Ножницы. И в большинстве случаев дизайнеры GUI не должны бросаться друг на друга с вилами, когда я кричу: «МОДАЛЬНЫХ ОКОН НЕТ! ЭТО СПАРТА!» Я — Статуя Свободы: признаю всех, будь они жалкими, уродливыми или любителями Haskell. Но когда ситуация накалится до предела, я хочу иметь под рукой людей «целевого назначения», которые в очках ночного виденья спустятся с вертолета и проведут секретную операцию для защиты моей свободы под музыку в стиле кантри. Системный программист способен на такие вещи и я вполне серьёзно могу прозвать такого человека «Гремучей Змеёй» или «Молотом Зевса». Но ни от кого еще я не слышал: «Эти полупрозрачные иконки действительно полупрозрачны! НЕ МОЛОТА ЗЕВСА ЛИ ЭТО РАБОТА?»
Вообще, последний пример я привёл от балды. Поверьте, я уважаю специалистов по человеко‐компьютерному взаимодействию. Но когда ЧКВшники отлаживают свой код, это похоже на выставку картин или саммит ООН с перерывами на чай и шуточками на французском, а не‐функциональные шарфы хоть и не обязательны, но поощряются. Когда код ЧКВшника не работает, проблема решается построением грандиозных теорий, связывающих Форму и Восприятие с вашими глубокими чувствами к овалам. И будут бурные дебаты о социально‐экономических последствиях Helvetica Light, и в какой‐то момент вам прийдется решить, являются шрифты с засечками дерзкой заявкой на современность или же тайно поддерживающим феодализм и невежество инструментом гегемонического гнета. Элегантней ли «обвести‐и‐нежно‐тапнуть», нежели «сжать‐и‐перетащить»? Эти насущные проблемы не решатся сами по себе. Но после долгой отладки ЧКВ‐кода в сердце всё еще теплится надежда и нет места злости; даже если вы волнуетесь, не лучше ли вместо выпадающего списка сделать radio button, список доживет до конца дня. А назавтра будет новый восход, восхитительно яркий, и он вдохновит вас на соединение полос прокрутки и щелчка левой кнопки мыши в печальном танце, что вы увековечите в сонете, вернувшися с покупками с базара.
В мире системных программистов всё иначе. Когда вы отлаживаете распределённую систему или ядро ОС, вы делаете это по‐ковбойски. Вы сколачиваете команду черствых, непробиваемых, видевших смерть мужиков, выдаёте им несколько примитивных вещей вроде компаса, рюкзака и заточеной с одного конца палки и идёте в глушь с твёрдым намерением нарваться на неприятности, попутно пожёвывая табак. Вы — системный хакер, и должны быть готовы голыми руками убить убежавший поток, писать напрямую в сетевые порты с помощью telnet и замшелой копии RFC, подобранной вами в Ватикане, и совершать другие дикарские поступки, о которых не говорят вслух. Когда вы отлаживаете системный код, нет никаких споров о вкусных шрифтах и лучшей форме для квадрата, потому что это — Старый Завет, бесцветный и жестокий мир, и совсем не важно, узкий ваш Arial или жирный, когда в стране ад, чума и все гнут спину на царя. ЧКВшники находят баги после получения письма от психотерапевта. Системщики находят баги, просыпаясь в холодном поту и обнаруживая, что их первенец пропал, а на стене кровью написано «ETIMEDOUT».
Что есть отчаяние? Внемлите мне, ибо я познал его. Отчаяние — это когда вы отлаживаете драйвер ядра и смотрите в дамп памяти, а оттуда на вас смотрит указатель со значением 7. ДА НИ ОДНА АРХИТЕКТУРА НЕ ВЫРОВНЕНА НА 7. К тому же, 7 — ЭТО СЛИШКОМ МАЛО, И ТОЛЬКО ЗЛОВРЕДЫ ПЫТАЮТСЯ ДОСТУЧАТЬСЯ ПО ТАКИМ АДРЕСАМ. Неправильно адресованная память с малыми значениями указателя погубила десятилетия моей жизни. Хуже этого только правильно адресованная память с невозможно огромной длиной буфера. О да, когда в вечер пятницы вы производите «один мааахонький послееедненький» проход по логам и обнаруживаете правильно адресованную память с длиной буфера равной КОЛИЧЕСТВУ ЭЛЕКТРОНОВ ВО ВСЕЛЕННОЙ. Такое оставляет шрамы на сердце, ведь пагубность чтения 2^893 байт — это единственное, в чём сходятся коммунисты и единороссы. Что‐то вроде «медицинское страхование — это, возможно, хорошо, а возможно и плохо, но попытки считать всю информацию Вселенной хреналлион раз и засунуть это в хреналлион‐мерный массив — тут уж извините…»
Не‐системщикам не понять эту войну за кусочки счастья в мире систем. Ведь когда алгоритм машинного обучения принимает кота за слона, это и правда смешно. Можно распечатать картинку кота в костюме слона, добавить смешную подпись — и это развеселит пару не слишком обременённых интеллектом индивидов. А копии потом можно раздать на работе, радуясь тому, что всё, в общем‐то, в порядке. Ничего веселого при неправильно адресованной памяти распечатать не получится, потому что ваш компьютер умер, а принтеров в царстве мёртвых как бы и нет. Буфер невозможного размера — это еще хуже: он сидит за кулисами, не отсвечивая, и тихонько нашпиговывает состояние злом. Если чтение плохого адреса сжигает ваш дом единожды и полностью, то непомерные буферы забираются к вам через окно, подсыпают песок в кровать и зубную пасту и наблюдают, как вы постепенно осознаёте, что безумие овладело вашей жизнью. Ведь правда: обычный случай отлова безграничного буфера — это когда ваша программа работает, а потом вдруг пытается отобразить строку «Hello, World», но на выходе получается «#a[5]:3!» или любой другой синтаксически правильный Perl‐скрипт, и вы такие «КАКОГО МАМУ ЛЕШЕГО», а потом до вас доходит, что ваши обращения к памяти подобны Халку, услышавшему просьбу написать эссе на тему «Почему крушить плохо».
И тут вы спросите: «Почему кто‐то станет писать на гротескном языке, поддерживающем прямую работу с памятью? Почему не использовать современный язык со сборщиком мусора, функциональными примочками и бесплатным массажем после обеда?» Я вам отвечу: указатели реальны. Железо только их и понимает, и кому‐то прийдется иметь с ними дело. Нельзя водрузить талмуд по LISP на x86‐процессор и надеяться, что машина усвоит лямбда‐исчисление через осмос. Отрицая указатели, вы уподобляетесь древним грекам, что отрицали существование Кракена и потом удивлялись, что их корабли не доходят в Марокко, Широкко или как там эта несчастная страна тогда называлась. Указатели — как Кракены: они реальны, они существуют, и кому‐то нужно с ними работать, чтобы остальные могли спать спокойно. Но не поймите превратно: я вовсе не желаю писать системное ПО на языке вроде C++, потому что «плюсовые» исходники подобны Некрономикону — опасны, непонятны, полны запретных знаний и магических формул. И когда в три часа утра, после полусуток отладки вы встречаете статический защищенный волатайл указатель на виртуальную дружественную шаблонную функцию, вам хочется впасть в спячку, а потом проснуться в теле оборотня, найти создателей стандарта C++ и разорвать в клочья всё, что им дорого. А C++ STL со своим вызывающим дислексию синтаксическим ураганом угловых скобок и точек с запятыми гарантирует превращение первых семи попыток создания любой мало‐мальски осмысленной структуры данных в лавину ошибок компилятора поистине вагнеровского размаха:
Syntax error: unmatched thing in thing from std::nonstd::__map<_Cyrillic, _$$$dollars>const basic_string< epic_mystery,mongoose_traits < char>, _default_alloc<casual_fridays =="" maybe="">>
Однажды я пытался создать list<map> и мои синтаксические ошибки подняли мёртвых из могил. Такое поведение не назовешь правильным. Потому я обеими руками за высокоуровневые языки, где указатели скрыты, типизация строгая, а объявление структуры данных не превращается в разгадывание синтаксических головоломок, выдуманных злобным инопланетянином. Так что если вы вдруг обнаружите себя попивающим мартини в процессе написания кода на объектно‐ориентированном эсперанто со сборщиком мусора, то не забывайте, что ваш эсперанто работает лишь потому, что системные программисты променяли надежду потерять девственность на возможность размышлять о шестнадцатеричных числах и их отношениях с операционной системой, железом и древними кровавыми ритуалами, которые Бьёрн Страуструп проводил на территории Стоунхенджа.
Но худшее в жизни системного программиста — это когда не‐системщики думают, что осознают всю глубину трагедий, из которых она состоит. Несколько недель назад я отлаживал созданную моей исследовательской группой сетевую файловую систему. Баг спрятался в компоненте ядра, и моя машина умирала самыми невозможными способами. После нескольких дней постоянных перезагрузок серверов от меня осталось еле волочащее ноги бородатое красноглазое нечто, вроде айтишной версии Саддама, которого только что вытащили из бункера, несущего витиеватый бред о полувымышленных врагах. И вот, расхаживая по коридорам, браня свой код, я наткнулся на коллегу из отдела ЧКВ, который незамедлительно поинтересовался моими делами. Объяснив ему баг, который затрагивал конкурирующие потоки, повреждённое состояние и асинхронную отправку сообщений через несколько машин, в ответ я услышал: «Да, звучит не очень. А логи на ошибки ты проверил?» «Ну, я бы так и поступил,» — сказал я, «если бы не сломал каждую компоненту системы, необходимую для ведения логов. У меня есть сетевая файловая система и я сломал сеть, файловую систему, и мои компьютеры подыхают от одного моего взгляда. У МЕНЯ НЕТ НИКАКИХ ИНСТРУМЕНТОВ, ПОТОМУ ЧТО Я СЛОМАЛ СВОИ ИНСТРУМЕНТЫ СВОИМИ ЖЕ ИНСТРУМЕНТАМИ. Единственный способ залоггировать хоть что‐то — нанять монахов и стенографировать их субъективный опыт созерцания гибнущих машин, попутно размазывая кровавые слёзы по щекам». В искреннем порыве симпатии мой коллега изложил одну из его историй об отладке — об операции сложения, которую случайно заменили операцией умножения. Выслушав его, я сказал: «Умножение — не сложение, это и ежу понятно. Но они хотя бы похожи! Умножение — это как сложение, только сложения чуть побольше. Проще говоря, умножение — это взрослый птеродактиль, а сложение — это детёныш птеродактиля. В твоём случае код немного капризничал, но сама идея была правильной. В моём случае нельзя придумать аналогию для дошкольников о том, что мой код должен делать и что он делает на самом деле. Я всего лишь хотел превратить чтение файла в сетевую операцию, но вместо этого мои машины подхватили чахотку и дрестун. Улавливаешь разницу? Ты пригласил девушку на танец, а потом узнал, что её отец — мент. А я пригласил девушку на танец, А ПОТОМ УЗНАЛ, ЧТО ЕЁ ОТЕЦ — ГИТЛЕР».
На самом деле, я не говорю, что все должны быть системными хакерами. GUI нужны, проверка правописания тоже. Я рад, что люди разрабатывают новые виды прыгающих иконок, так как верят, что человечество распрощалось с раком, нищетой и теперь живёт в безмятежном мире, окруженноё трёхмерными спрайтами. Это восхитительно. Я надеюсь присоединиться к этим людям лет эдак через шестьсот. Но я живу в мире настоящего, и в моём районе люди гибнут на улицах. Французский — это тоже хорошо, но никто не станет его придумывать, попутно отбиваясь от медведей. Смекаете? СИСТЕМНЫЕ ХАКЕРЫ РЕШАЮТ ПРОБЛЕМУ С МЕДВЕДЯМИ. Лишь благодаря бдительности моих людей вы вольны размышлять о круассанах и отпускать шуточки о настоящем отце Луи XIV.
Так что если вы вдруг встретите меня, слоняющегося по коридорам и пытающегося объяснить оторопевшим монахам баги синхронизации, будьте уверены: каждый день, день за днем, становится чуточку лучше. Для вас. Не для меня. Я всегда буду зол на число 7. Но таков путь джедая…