Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Джеймс Микенс — исследователь из группы распределённых систем в лаборатории Микрософта в Редмонде. Его текущее исследование фокусируется на веб-приложениях, с акцентом на разработке JavaScript-фреймворков, которые позволяют разработчикам обнаруживать и исправлять ошибки в широко распространённых веб-приложениях. Джеймс также работает над быстрыми, масштабируемыми системами хранения данных для дата-центров. Джеймс получил степень доктора философии в области компьютерных систем в университете Мичигана и диплом бакалавра компьютерных систем в ДжорджиаТек.
- Как хорошо тренированный академический исследователь, я трачу кучу времени, пытаясь расширить горизонты человеческого знания. В то же время, как всякий рождённый на Юге, я втайне верю в то, что в действительности прогресс — это сказки, и я должен готовиться к концу времён, что цыплята вернутся к насестам1, а в дом войдут быстрые зомби, и медленные зомби, и вежливые зомби, которые говорят "сэр" и "мэм", но всё равно пытаются съесть твой мозг, чтобы заполучить твои умения. Когда придёт революция, я должен быть готов; таким образом, в минуты затишья, когда я не совершаю невероятные научные прорывы, я думаю о том, что я буду делать, когда прогноз погоды неотвратимо превратится в РЕКИ КРОВИ ВЕСЬ ДЕНЬ КАЖДЫЙ ДЕНЬ. Основное, о чём я размышляю, — это кто будет в моей банде, поскольку вероятность пост-апокалиптического выживания непосредственно связана с размером и качеством вашей разношёрстной стаи товарищей. Есть несколько очевидных кандидатов на приём: слесарь (для взлома дверей), эксперт-взрывотехник (на случай, если у слесаря закончатся идеи), а также человек, который сможет раздобыть, натренировать и потом метать змей в моих врагов (поскольку в мире, где нет надежды, метание змей является разумным методом разрешения споров). Все эти люди сыграют роль в моём исключительном успехе в качестве мрачного философа-главнокомандующего. Однако самой важной шишкой в моей банде будет системный программист. Человек, который способен отладить драйвер устройства или распределённую систему — это человек, которому можно доверять в гоббсовском2 кошмаре захватывающих дух масштабов: системный программист видел ужасы мира и понимает экзистенциальный ужас бытия. Системный программист писал драйверы для глючных устройств, чей микрокод был изготовлен пьяным подростком или трезвой золотой рыбкой. Системный программист трассировал сетевую проблему через восемь машин, три часовых пояса и краткий обход через страну Амишей, где проблема передавалась передним левым копытом мула по кличке Освобождение3. Системный программист читал исходники ядра, чтобы лучше постигнуть тайные пути универсума, и видел он комментарий в планировщике "РАЗВЕ ЭТО РАБОТАЕТ РЖАКА", и не ржал он, но рыдал, и отправил он патч к ядру, чтобы восстановить баланс Силы и исправить инверсию приоритетов, которая завешивала MySQL. Системный программист будет знать, что делать, когда общество рухнет, поскольку системный программист уже живёт в мире вне закона.
- Слушайте, я не утверждаю, что прочие разновидности компьютерщиков бесполезны. Я даже верю в то, что у программистов на PHP есть душа (хотя и не могу это доказать). Я считаю, это круто, что спецы по базам данных продолжают пытаться усовершенствовать select-from-where, даже несмотря на то, что единственные запросы, которые не могут быть выражены через select-from-where, — это нецензурные лимерики из Кентерберийских рассказов. Некоторым образом, который я всё ещё не понял, я рад тому, что теоретики исследуют равенство между пятимерными машинами Тьюринга и Эдвардом руки-ножницы. В большинстве ситуаций дизайнеров GUI не следует принуждать к боям с трезубцем и сетью, в то время как я ору "МОДАЛЬНЫЕ ДИАЛОГИ — ЭТО НЕ СПАРТА". Я как статуя Свободы: я принимаю всякого, даже сирых и убогих и тех, кого радует Haskell. Но когда дело дрянь, мне нужны ребята для критически важных задач, мне нужен тот, кто может надеть очки ночного видения и высадиться с вертолёта на верёвке, после чего сделать не подлежащие огласке вещи, чтобы сохранить мою свободу, пока на фоне играет музыка кантри. Системщики это могут. Я могу дать ядерному хакеру правдоподобную кличку типа "Алмазная пыль" или "Молот Зевса". На контрасте, ещё никто не говорил: "Эти полупрозрачные иконки действительно полупрозрачны! ЭТО РАБОТА МОЛОТА ЗЕВСА?"
- Я выбрал произвольный пример. Вам придётся поверить мне, когда я говорю, что предельно уважаю интерфейсников. Однако, когда интерфейсники отлаживают свой код, это похоже на арт-шоу или ассамблею Объединённых Наций. Тут вам и перерывы на чашку чая, и обмен остротами по французски; носить нефункциональный шарф необязательно, но приветствуется. Если интерфейсный код не работает, проблема может быть решена с использованием больших теорий, которые соотносят форму и восприятие с вашими глубоко личными чувствами по поводу овалов. Здесь будут большие дебаты по поводу социоэкономических подтекстов шрифта Helvetica Light, и в некоторый момент вам нужно будет решить, являются ли засечки дерзким выражением современности, или инструментом гегемонического подавления, которое подразумевает поддержку феодализма и некомпетентности. Является ли прижатие-и-перетаскивание менее элегантным, чем обвод-кружком-и-лёгкое-поглаживание? Эти неотложные загадки сами себя не решат. И всё же, после долгого дня отладки интерфейсного кода, всегда есть надежда и нет настоящего гнева; даже если вы опасаетесь, что ваш drop-down должен превратиться в radio button, он тем не менее сгодится до завтра, когда взойдёт солнце, славное и живое, и вдохновит вас соединить прокрутку и левый клик пикантными способами, которые вы помянёте в сонете, когда вернётесь с местного фермерского рынка.
- Не таков мир системного хакера. Когда вы отлаживаете распределённую систему или ядро ОС, у вас всё в стилистике Техаса. Вы собираете несколько отменных, стоических парней — парней, которые видали, как умирают, и вы берёте кой-какие примитивные инструменты, типа компаса или рюкзака и заострённой с одного конца палки, и вы топаете в дикие места и ищете приключений, вероятно жуя при этом табак. Как системный хакер, вы должны быть готовы совершать варварские, непроизносимые поступки, отстреливать сбежавшие треды своими собственными руками, писать прямо в сетевые порты, используя telnet и старую копию RFC, которую вы нашли в Ватикане. Когда вы отлаживаете системный код, нет никаких высокоуровневых дебатов про выбор шрифта или лучшую разновидность бирюзового, потому что это Ветхий Завет, сердитый и монохромный мир, и неважно какой у вас Arial, Bold или Condensed, когда люди покрыты язвами, свирепствует чума и тирания фараона египетского. Интерфейсники узнают про ошибки в коде из встревоженного письма своего терапевта. Системщики узнают про ошибки, просыпаясь и обнаруживая, что их первенец пропал, и на стене кровью написано ETIMEDOUT.
- Что такое безнадёга? Я познал это — услышь песнь мою. Безнадёга — это когда отлаживаешь драйвер для ядра, и смотришь в дамп памяти, и видишь, что указатель равен семи. В ПРИРОДЕ НЕ СУЩЕСТВУЕТ ОБОРУДОВАНИЯ С АДРЕСОМ 7. Более того, 7 — ЭТО СЛИШКОМ МАЛО, И ТОЛЬКО ЗЛОВРЕДНЫЙ КОД МОГ ПОПЫТАТЬСЯ ОБРАТИТЬСЯ К ТАКОМУ НИЗКОМУ АДРЕСУ В ПАМЯТИ. Попытки доступа к памяти по маломерным адресам без выравнивания отняли у меня десятилетия жизни. Хуже, чем смещённые маломерные адреса, только выровненные указатели на буферы невозможно большой длины. Ничто не уничтожит вечер пятницы лучше, чем последний быстрый просмотр файлов журнала и обнаружение пословно выровненного адреса буфера, длина которого равна КОЛИЧЕСТВУ ЭЛЕКТРОНОВ ВО ВСЕЛЕННОЙ. Это непреходящая грусть, поскольку попытка прочитать 2893 байт — это единственное, что признают ошибкой и демократы, и республиканцы. Это как-будто обязательная медстраховка Medicare может быть хорошей идеей, а может и не быть, но невозможно оправдать попытку прочитать всё, что существовало убиллион раз в массиве мега-убиллионного размера. Эта постоянная война за счастье и есть то, чего не понимают несистемные люди про системный мир. Ну то есть, когда алгоритм машинного обучения ошибочно распознаёт в кошке слона, на самом деле это прикольно. Вы можете напечатать картинку кота в костюме слона и добавить ироническую подпись, которая развлечёт людей с второсортным интеллектом, и вы можете отправить фотку с работы и веселиться по факту того, что фундаментально всё по-прежнему в порядке. Когда у вас есть смещённый доступ в память, не получится напечатать ничего забавного, поскольку ваша машина сдохла, и в мире теней принтеров нет. Ошибка невозможно большого буфера ещё хуже, поскольку такие ошибки зачастую скрываются за кулисами, тихо переписывая ваши данные чистым злом; если смещённый доступ к памяти похож на отморозка, сжигающего ваш дом при первой же оплошности, то ошибка переполнения буфера ведёт себя скорее как маньяк, который влезает в ваш дом, рассыпает песок на ваши простыни и зубные щётки и затем ждёт, пока вы постепенно обнаружите, что ваш мир трачен безумием. В самом деле, обычный способ обнаружения переполнения буфера — это когда ваша программа вроде бы работает нормально, а потом она пытается вывести строчку, в которой должно быть написано "Всем привет", но вместо этого она печатает "#a[5]:3!" или другой синтаксически корректный скрипт на языке Perl, и вы такие ЧТО ЗА НА... — и внезапно понимаете, что ваши чрезмерные запросы к памяти топчутся по куче как Невероятный Халк, которого попросили написать эссе на тему "Крушить вредно".
- Вы можете спросить: "Зачем кому-то понадобилось писать код на гротескном языке, который даёт доступ прямо к адресам в памяти? Почему бы не использовать современный язык, где есть garbage collector, функциональное программирование и бесплатные массажи после ланча?" Ответ таков: потому что указатели реальны. Это то, что понятно железу. Кому-то приходится иметь с ними дело. Вы не может просто положить книгу по языку LISP на процессор семейства x86 и надеяться, что он научится вычислению лямбды осмотически. Отрицать существование указателей — это всё равно что, живя в древней Греции, отрицать существование кракенов и удивляться, почему ни один из ваших кораблей не достиг Марокко, или Ур-Марокко, или как оно там называлось в те времена. Указатели как кракены — реально существующие твари, с которыми нужно справляться, чтобы цивилизованное общество могло существовать. Не ошибитесь: я не хочу писать системные программы на языках типа C++. Так же, как и Некрономикон, исходный код на C++ — это грешный, тайный документ, который наполнен тайными заклятиями и запретным знанием. В 3 часа ночи, когда вы отлаживались в течение 12 часов и обнаружили virtual static friend protected volatile templated function pointer, вы хотите забыться в гибернации, и восстать оборотнем, и найти тех, кто написал стандарт С++, и принести разрушения в то, что они любят. Ну а 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<int>>, и мои синтаксические ошибки заставили мертвецов ходить среди живых. Такие вещи очевидно плачевны. Таким образом, я полностью поддерживаю языки высокого уровня, в которых указатели скрыты, и типы сильны, и объявление структуры данных не требует от вас решения синтаксической головоломки, созданной злобными инопланетными тварями. Но, как говорится, если вы обнаруживаете себя пьющим мартини и пишущим программы на мусорособирающем и объектно-ориентированном Эсперанто, отдавайте себе отчёт в том, что единственная причина, по которой рабочий цикл Эсперанто работоспособен — это потому что существуют системщики, которые разменяли всякую надежду на потерю девственности на восхитительную возможность мыслить о шестнадцатеричных числах и их связях с операционными системами, железом и древними кровавыми ритуалами, которые Бьярн Страуструп проводил в Стоунхендже.
- Пожалуй, наихудшее в бытии системщика то, что другие, несистемные люди думают, что понимают, какие ежедневные трагедии составляют вашу жизнь. Например, несколько недель назад я отлаживал новую сетевую файловую систему, которую создала моя исследовательская группа. Ошибка крылась в недрах компонента ядра, так что мои машины рушились впечатляющими и мстительными способами. После нескольких дней ручной перезагрузки серверов я превратился в волочащего ноги, разбитого человека, некое подобие учёной компьютерной версии Саддама Хуссейна, которого извлекли из бункера, со всклокоченной бородой, мёртвыми глазами и лихорадочными, абсурдными поисками полувоображаемых врагов. Пока я бродил по коридорам, бормоча никсоновские тирады в адрес своего кода, один из моих коллег из группы интерфейсов спросил меня, в чём моя проблема. Я описал ошибку, которая крылась среди конкурентных тредов, испорченного состояния машины и асинхронной доставки сообщений через множественные машины, и он заметил: "Да, звучит погано. Ты проверял логи на предмет ошибок?" Я сказал: "Конечно, я сделал бы это, если бы я не сломал каждую из компонент, которые нужны системе протокола для записи журнала. У меня сетевая файловая система, и я сломал сеть, и файловую систему я тоже сломал, и мои машины падают, стоит мне на них посмотреть. У МЕНЯ НЕТ ИНСТРУМЕНТОВ, ПОСКОЛЬКУ Я СЛОМАЛ СВОИ ИНСТРУМЕНТЫ С ПОМОЩЬЮ СВОИХ ИНСТРУМЕНТОВ. Моя единственная возможность получить логи — это нанять монахов, чтобы расшифровать субъективный опыт наблюдения за тем, как умирают мои машины, пока я плачу кровавыми слезами." Мой коллега, искренне пытаясь проявить сочувствие, вспомнил одну из собственных историй отладки, историю, которая по существу сводилась к операции сложения, которая была ошибочно заменена операцией умножения. Я выслушал его историю и сказал: "Слушай, я понял. Умножение не сложение. Это известно на протяжении многих лет. Однако умножение и сложение по крайней мере как-то соотносятся. Умножение похоже на сложение, только больше. Умножение — это взрослый птеродактиль, а сложение — это птенец птеродактиля. Таким образом, в твоей истории отладки твой код сбился с пути истинного, но в основе его лежит верная идея. На контрасте, не существует интуитивно понятной аналогии для протокола GRE, которой можно было бы выразить, что должен делать мой код и что он на самом деле делает. У меня была благопристойная цель превратить чтение файла в сетевую операцию, и сейчас у моих машин туберкулёз и запор. Заметна ли разница в наших бытиях? Когда ты пригласил девушку погулять, её отец оказался копом. Когда я пригласил девушку погулять, Я ОБНАРУЖИЛ, ЧТО ЕЁ ОТЕЦ — СТАЛИН".
- Напоследок: я не утверждаю, что всякий должен стать системным хакером. Визуальные интерфейсы полезны. Автоматическая проверка грамотности полезна. Я рад, что люди работают над новым типом прыгающих иконок, поскольку они верят, что человечество справилось с опухолями и бездомностью и теперь живёт в мире без последствий и с многомерными спрайтами. Это восхитительно, и мне хотелось бы присоединиться к этим ребятам в XXVII веке. Но я живу здесь и сейчас, и в моём районе люди умирают на улицах. То есть, французский — это прекрасно, но никто не будет изобретать французский, если постоянно атакуют медведи. Понимаете? СИСТЕМНЫЕ ХАКЕРЫ ОТРАЖАЮТ МЕДВЕЖЬЮ УГРОЗУ. Только ценой неусыпной бдительности моих людей у вас есть свобода думать о круассанах и изысканной игре слов, в том числе о настоящем отце Людовика XIV. Итак, если вы видите меня, блуждающего по коридорам, пытающегося объяснить ошибки синхронизации сконфуженным монахам, будьте уверены, что каждый день и каждый час всё понемногу становится лучше. Для вас, но не для меня. Я всегда буду неистов при виде цифры 7, но таков путь героя.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement