Марат Муталлапов
Код Перезагрузки

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

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

Глава 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.»

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

– Подкурить? – спросил Лей, и когда парень, представившийся Стасом, потянулся за зажигалкой, Лев «ткнулся» в тот самый модуль. Не стал удалять – просто «подсветил» его в интерфейсе и мысленно отправил запрос: trace_origin(модуль).

В ответ в его поле зрения, прямо на запотевшем стекле курилки, всплыли строки лога, словно проявились невидимыми чернилами.

> Запрос обработан.

> Модуль выдан через точку доступа: [Координаты: Ул. Гримаура, 17, подвал].

> Для доступа к полному каталогу требуется аппаратный ключ или приглашение доверенного пользователя.

Адрес. Лев получил адрес. Он похлопал Стаса по плечу, оставил ему всю пачку и вышел, чувствуя себя хакером, только что подобравшим пароль к роутеру соседа.

Улица Гримаура оказалась тихой, застроенной старыми доходными домами, которые сейчас медленно умирали, превращаясь в ломбарды, массажные салоны и подозрительные конторы по ремонту телефонов. Семнадцатый номер был самым обшарпанным. На дверях – ни вывески, ни домофона. Только граффити с покемоном и надпись «Здесь был Вася». Лев уже хотел развернуться, решив, что это тупик, но его взгляд поймал странную аномалию в коде. Дверная ручка была описана слишком сложно для своего физического предназначения. В ее скрипте была целая функция check_access(invite_key) и условие if (user.in_system == True): then (unlock(“backroom”)).

Лев замер, понимая, что ему нужен ключ. Аппаратный ключ. Он огляделся. Напротив, у стены, сидел бомжеватый дед в стеганной телогрейке, пивший из горла банку какого-то энергетика. Его код был… чист. Слишком чист для живого человека. Мало переменных, никаких эмоциональных функций, только базовые процессы дыхания и сердцебиения. И еще один процесс: monitoring_perimeter(Grimaura_17). Это был сторож. Цифровой сторож, замаскированный под бомжа.

Дед поднял на Льва мутные глаза.

– Чего, пацан? Место занято. Иди в другой подвал искать приключения.

– Мне нужен «Refactoring», – тихо, но четко сказал Лев.

Дед перестал жевать невидимую жвачку. Его взгляд прояснился, став острым и оценивающим.

– У тебя нет ключа. Ты даже не в сети. Самоучка-дичок, да? Чую по запаху перегоревших нейронов.

– У меня есть вопрос к Архитектору.

– У всех есть вопросы к Архитектору. У меня, например, вопрос, когда же он повысит мне тарифный план за слежку за этой дырой. Но я его не задаю, потому что ценю работу. Сваливай.

Лев понял, что силой – ни физической, ни своей зарождающейся «кодерской» – ему здесь не пройти. Нужна была другая тактика. Хакерская. Он быстро осмотрел код деда, ища уязвимости. Защита была крепкой, но в самом низу, в самом legacy-коде, он заметил знакомый, архаичный вызов – ссылку на библиотеку old_soviet_algorithms. И там была функция, знакомая Льву по университетскому курсу истории информатики. Функция с известным багом.

Конец ознакомительного фрагмента.

Текст предоставлен ООО «Литрес».

Прочитайте эту книгу целиком, купив полную легальную версию на Литрес.

Безопасно оплатить книгу можно банковской картой Visa, MasterCard, Maestro, со счета мобильного телефона, с платежного терминала, в салоне МТС или Связной, через PayPal, WebMoney, Яндекс.Деньги, QIWI Кошелек, бонусными картами или другим удобным Вам способом.