реклама
Бургер менюБургер меню

Марат Муталлапов – Код Перезагрузки (страница 1)

18px

Марат Муталлапов

Код Перезагрузки

КНИГА ПЕРВАЯ. КОД ПЕРЕЗАГРУЗКИ

ЧАСТЬ ПЕРВАЯ: БАГ В МАТРИЦЕ

Глава 1

Монитор упорно тупил. Вернее, тупил не монитор, а код, который на нем был открыт. Или человек, который его писал. Лев Каменев, senior-разработчик компании «Система-Плюс», смотрел на вязкую паутину строчек, которая должна была стать новым модулем для банковского API, и чувствовал, как у него начинает дергаться глаз. В правом. Классический признак того, что дедлайн уже не на горизонте, а бьет сапогом по лицу.

– Лев, клиент опять пишет, – голос менеджера Артема, прозванного в кулуарах «Голодным Фантомом» за способность материализоваться за спиной именно в тот момент, когда хотелось отойти на десять минут покурить, прозвучал прямо у уха. – Спрашивает, почему у него в личном кабинете, цитата, «вместо суммы баланса отображается смайлик с подмигивающим хохочущим чертиком».

Лев медленно, как робот-убийца из дешевого боевика, повернул голову.

– Артем. Дорогой. Ты видишь эту строчку? – Он ткнул пальцем в экран, где мигал курсор. – Это – запрос к базе данных. А вот это, – палец переместился на соседнюю вкладку, – это лог ошибок. Видишь, как он красив? Он похож на новогоднюю гирлянду, если бы ее собрал эпилептик в припадке. Клиентский смайлик – это меньшее из зол. Могло бы вылезти предупреждение «Аларм! Сейчас все полетит к чертям собачьим, включая твою кошку». Так что иди и скажи своему клиенту, что мы работаем. Или принеси кофе. Черный. Без сахара. Как мои мысли о его проекте.

Артем сглотнул и отступил, растворившись в полумраке open-space’а, освещенного лишь мерцанием экранов и зловещим синим светом от роутера. Был третий час ночи. Четвертая ночь подряд. Воздух в помещении был густым, как суп, и состоял из запахов немытой кружки, пота, пыли и отчаяния.

Лев потянулся к своей механической клавиатуре, любимой «клаве» с кликающими синими свитчами. Единственной вещи, которая приносила ему дзен в этом аду. Он ударил по Enter, запуская компиляцию.

И вот тогда все завертелось.

Сначала просто потемнело в глазах от усталости. Потом экран монитора заплыл, будто под водой. Лев протер глаза, списал на переутомление. Но когда он снова взглянул, мир изменился.

Поверх реальности, будто полупрозрачный OLED-дисплей, наложилась… разметка. Строки кода. Они висели в воздухе, оплетали столы, компьютеры, людей. Над чашкой Артема висел простой комментарий: # Кофе, три часа назад, остывший. Над самим Артемом, копошившимся у принтера, колыхался более сложный, местами запутанный блок: куча переменных (стресс = 95, авторитет = 10, желание_сбежать = 99), цикл while (работает) { здоровье– } и вызывающая жалость функция def повысить_зарплату(): return None.

Лев ахнул. Он резко оглядел open-space. Каждый объект, каждое явление было описано. Кондиционер гудел, и над ним бежали строки управления температурой. За окном моросил дождь, и в небе, как гигантский, медленный скрипт, выполнялся if (давление < 740): осадки = True.

– Глюк… – прошептал Лев. – Системный глюк. Надо поспать. Срочно. Надо выключиться.

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

ОШИБКА ВЫПОЛНЕНИЯ: Cactus.moribund_status = True

# Функция photosynthesis() не отвечает. Сегмент root_34 сгнил.

# Рекомендуемое действие: отладка (debug) или удаление (delete).

Рука Лев потянулась к кактусу сама, против воли. Он не знал, как это работает, но его мозг, заточенный под чистку кода, уже видел решение. Он «ухватил» мысленным взглядом строку с ошибкой и… «закомментировал» ее, мысленно поставив решетку вначале. Потом нашел переменную moribund_status и сменил ее значение на False.

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

Лев отпрянул, задев свою кружку. Она грохнулась на пол. Виктор вздрогнул и обернулся.

– Опа… Лев, ты чего?

– Ничего, – сипло ответил Лев, уставившись на цветок. – Устал. Просто… устал.

На следующий день Лев вызывался к начальству. Артем, «Голодный Фантом», исчез. Не вышел на работу, не отвечал на телефон. К обеду пронеслась шепотком новость: с Артемом случилось ЧП. Он шел утром на работу, смотрел в телефон, и на него… упало облако. Нет, не туча, а именно небольшое, пушистое кучевое облачко, которое, по словам очевидцев, вдруг сорвалось с неба и обрушилось на несчастного менеджера конденсационной массой в несколько сотен литров. Человека сбило с ног, он захлебнулся, получил ушибы и сейчас в больнице в шоковом состоянии. Все списывали на аномалию, на редкое атмосферное явление.

Но Лев знал. Он помнил, что видел в коде Артема накануне. Среди прочего мелькала строчка: external_threat = “pending”. Он тогда не придал значения, решил, что это метафора в данных. А что, если это был таймер? Маркер?

Весь день Лев ходил как во сне, наблюдая за кодом. Он учился им управлять. Чтобы «отредактировать» что-то, требовалась чудовищная концентрация. Попытка «ускорить» лифт, добавив ему speed_multiplier = 1.5, обернулась приступом мигрени, будто его мозг был сервером, на котором запустили слишком тяжелый процесс. Но он мог делать мелочи: «удалить» лужу у входа (delete puddle_42), «переименовать» надоевшую назойливую муху в bug_silent, после чего она замолкала. Магия, если это она, оказалась работой скучной, технической и очень затратной.

Вечером, в опустевшем офисе, Лев сидел за своим столом. Он вызвал код своей кружки с холодным кофе и попробовал изменить переменную temperature с 22 на 70. Кружка начала дымиться. Лев ухмыльнулся. Внезапно его взгляд упал на рабочее место Алисы, аналитика с другого отдела. Алисы, в которую он был по-тихому, по-офисному влюблен уже год. Ее стол был всегда безупречен: никаких лишних бумаг, только стильный ноутбук, блокнот в сером холщовом переплете и герань в керамическом горшке.

Но сегодня Алиса ушла рано, сославшись на недомогание. И сейчас над ее стулом висел не привычный, сложный, но живой код с переменными creativity, sarcasm, hidden_attraction_to_Leo, а нечто странное. Чистый, почти пустой скрипт. Как шаблон. И в самом верху, как заголовок, горела строка:

# ЭКСПЕРИМЕНТАЛЬНЫЙ МОДУЛЬ “ЭФФЕКТИВНОСТЬ v.2.71”. СОСТОЯНИЕ: ТЕСТИРУЕТСЯ.

А ниже, в свойствах, было прописано: emotional_response = subdued, personal_memories = archived, free_will = limited.

И в углу, мелким шрифтом, стояла метка:

**Исходный файл души: /auctions/refactoring/lot_451**

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

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

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

> find_process(“Архитектор”, “Refactoring”)

> trace_error(“Алиса.Душа”)

На экране ноутбука и в воздухе перед ним поползли строки лога. Охота началась. Не на человека. На баг. На зловредный, чужой, убийственный скрипт, который кто-то посмел вписать в исходники его мира.

ЧАСТЬ ВТОРАЯ: ЧЁРНАЯ БИРЖА «REFACTORING»

Глава 2

Следующие два дня Лев жил в режиме отладки гигантского, недокументированного легаси-проекта под названием «Новая Реальность». Он почти не спал, но теперь не из-за дедлайнов, а из-за параноидального желания понять правила системы. Он экспериментировал осторожно, как сапер, зная, что один неверный delete может обрушить что-то важное. Выяснил, что редактирование живых объектов в разы сложнее, чем работа с физикой. Что его «вычислительная мощность» – он мысленно называл ее «маной» с ироничной усмешкой – восстанавливается после сна и еды, словно это был заряд аккумулятора. И что постоянное видение кода начинает сводить с ума: читая уличную рекламу, он видел и ее исходный скрипт с ценами и мета-тегами, что создавало в голове невыносимый информационный шум.

Его целью была биржа «Refactoring». Поисковый запрос в реальности результатов не дал – только ошибка «Доступ запрещен. Требуется авторизация». Запрос «Архитектор» возвращал «Информация засекречена или не существует». Льву было ясно одно: чтобы найти лазейку в систему, нужен был проводник. Или уязвимость.

Уязвимость нашлась в пятницу вечером, в гипермаркете «Мега-Гранд», куда Лев поехал за пельменями и тоником. На кассе, наблюдая, как молодой кассир с выцветшими татуировками на нервных пальцах дважды пробивает один товар, он увидел кое-что интересное. В коде кассира, среди переменных скука = 90 и желание_сбежать = 85, висел небольшой, почти незаметный внешний модуль: «Модуль_Удачи_Минимальный.ver1.01». Он был прицеплен к основному скрипту, как левый апдейт, и содержал простой цикл: if (клиент_злой): then (сдача_найдена). Модуль был подписан: «Courtesy of Refactoring. Trial version. Expires in 2 days.»