Код двух сердец

- -
- 100%
- +

Код двух сердец
«…Я любил тебя больше, чем ангелов и самого,
и поэтому дальше теперь
от тебя, чем от них обоих…»
И. Бродский
Глава 1. Экран, на котором ничего не было
Было двадцать третье августа, и дождь над Петербургом висел так низко, что казалось — ещё немного, и он сотрёт все буквы со всех вывесок на Невском. Вода стекала по стеклам кафе «Синяя чашка» — маленького, затёртого между двумя парадными, с одним окном и табуреткой, которую никто никогда не занимал, потому что она стояла вплотную к двери и каждый раз, когда кто-то входил, табуретка вздрагивала, словно ждала удара.
За единственным столиком у окна сидела Лея.
Перед ней стоял ноутбук — старый, в трещинах по корпусу, с наклейкой на крышке: зелёная ящерица, которой кто-то дорисовал маркером корону. Экран светился тёмным — чёрный фон, зелёные буквы. Терминал. Внутри терминала — ничего. Курсор мигал, как сердцебиение. Лея смотрела на него и думала о том, что пустой экран — это самое честное, что может предложить человеку компьютер. Вот он: я ничего не знаю. Расскажи мне.
Лея писала код так, как другие люди пишут дневники. Не потому что хотела запомнить, а потому что хотела понять. Каждый класс, каждый метод, каждая функция была для неё вопросом к миру: а что, если попробовать вот так? А если переменная — это не значение, а обещание? А если цикл можно остановить не условием, а сомнением?
Она работала в компании «Гелиос-Софт» — маленькой, как кафе, в котором она сейчас сидела, и примерно такой же ненадёжной. «Гелиос-Софт» делал приложения для логистики: программы, которые считали, сколько коробок влезет в фуру, и как их уложить так, чтобы ни одна не помялась. Лея писала алгоритмы оптимизации. Это была честная работа — в том смысле, что она не врала ни коробкам, ни фурам. Но Лее было скучно. Коробки не спорили. Коробки не пытались тебя перехитрить.
Она допила кофе — он давно остыл — и открыла рабочий канал связи.
Там, в узком окошке мессенджера, мигало сообщение. Не от коллег. От незнакомца.
Незнакомец написал: «Твой алгоритм упаковки дырявый. Я нашёл шесть способов заставить его положить куб в круг».
Под сообщением — никнейм: niyar_dev.
Лея перечитала трижды. Потом открыла свой код — тот, который выложила в открытый репозиторий месяц назад, — и стала проверять. Через сорок минут она обнаружила, что незнакомец прав. Не во всём — куб нельзя положить в круг, можно положить в круг то, что притворяется кубом. Это было красиво. Это было так красиво, что Лея разозлилась.
Она написала в ответ: «Ты не нашёл шесть способов. Ты нашёл один и описал его шестью словами. Это разные вещи».
Нияр ответил через десять секунд: «Хорошо. Тогда я найду шесть».
И нашёл. К утру.
Глава 2. Чужой код
Нияр жил на Петроградской стороне, в квартире с потолками такими высокими, что верхняя их часть терялась в полумраке и казалась не потолком, а небом — серым, как и положено петербургскому небу, только с люстрой. Люстра не работала. Нияр не чинил её намеренно: ему нравилось, что в комнате есть предмет, который существует вопреки собственной функции. Он светился — но только когда солнце падало на его хрустальные капли под определённым углом, и тогда на стене вспыхивали маленькие радуги, похожие на сообщения на неизвестном языке.
Нияр работал из дома. Формально — фрилансер, фактически — человек, который пишет код для тех, кто боится сам. Его клиенты были мелкие компании, стартапы, однажды — благотворительный фонд, который потерял свою базу данных и хотел её восстановить. Нияр восстановил. Ему понравилось.
Когда он нашёл код Леи в открытом репозитории, он сначала не обратил внимания. Обычный алгоритм, обычная задача. Но потом он увидел комментарий в строке 847:
text
// Здесь я не уверена. Но пусть пока работает так.
Нияр никогда не видел, чтобы кто-то оставлял в коде признание в неуверенности. Программисты обычно пишут «// TODO» или «// FIXME» — короткие, деловые, как бирки на чемоданах. А тут — живой голос. Человек сомневался. Человек стоял на краю того, что знал, и смотрел дальше.
Нияр стал читать код Леи весь. Не строку за строкой — он читал его как роман: от функции к функции, от класса к классу, следя за тем, как меняется стиль, как в одних местах она пишет сжато и точно, как математик, а в других — размашисто, с лишними переменными и комментариями, которые ни к чему не относятся, как будто разговаривает сама с собой посреди ночи.
Он нашёл уязвимость не потому что искал. Он нашёл её, потому что понял, как Лея думает. Она строила стены и забывала про двери. Она защищала данные так, как защищают дом от дождя — крепко, со всех сторон — но оставляла открытым то, через что дождь не приходит: снизу.
Нияр написал ей. И ждал.
Когда она ответила — раздражённо, точно, с тем особым петербургским ядом, который растворяется в вежливости, — он понял, что нашёл не просто чужой код. Он нашёл человека, который пишет так, как он сам: будто код — это не инструкция, а письмо.
Они переписывались две недели. Потом — месяц. Потом перестали считать.
Лея рассказывала о коробках. Нияр — о чужих базах данных, которые он чинил, как чинят старые часы: осторожно, не дыша, с уважением к тому, кто их сделал. Они спорили о языках программирования так, как другие спорят о стихах: Python против C++, как свободный стих против сонета. Лея говорила, что Python — это разговор, а C++ — приказ. Нияр возражал, что приказ тоже может быть красивым, если приказавший понимает, зачем приказывает.
Потом Нияр предложил: «Давай ты попробуешь взломать мой код».
Лея согласилась. И началась игра, которая была не игрой.
Глава 3. Первый взлом
Код Нияра был как город. Лея бродила по нему три дня, заходила в функции, которые заканчивались тупиком, находила переменные, которым присваивались значения, а потом — ничего, просто существование. Она думала: он специально? Или он тоже не уверен?
На четвёртый день она нашла ход. Не уязвимость — ход. Тонкая ниточка между двумя модулями, которые не должны были общаться, но общались — через глобальную переменную с именем placeholder, в которой Нияр, очевидно, не ожидал, что кто-то будет копаться.
Лея написала скрипт. Маленький, аккуратный, с комментарием в начале:
text
// Здравствуй. Я зашла без стука. Но я сняла обувь.
Скрипт проскользнул через placeholder и открыл структуру Ниярова кода изнутри — не сломал, не повредил, просто показал Лее, как он устроен. Она увидела, что Нияр пишет так, будто боится, что его код когда-нибудь придётся читать кому-то ещё, и хочет, чтобы этот кто-то не испугался. Все его функции были короче, чем нужно. Все комментарии — добрее, чем нужно. В одном месте он написал:
text
// Не торопись. Эта функция никуда не денется.
Лея прочитала это и почувствовала то, чего не чувствовала давно: что где-то есть человек, который понимает, каково это — сидеть ночью перед экраном и не знать, с чего начать.
Она написала ему: «Я взломала твой код. Но мне кажется, ты хотел, чтобы его кто-то прочитал».
Нияр ответил: «Взломать — это и есть прочитать по-настоящему».
Через неделю Нияр взломал код Леи. Он сделал это иначе — не через уязвимость, а через логику. Он написал программу, которая анализировала стиль Леиного кода и предсказывала, какие решения она приняла бы в новых условиях. Программа угадывала с вероятностью восемьдесят три процента.
Лея написала: «Это нечестно. Ты взломал не мой код. Ты взломал меня».
Нияр ответил: «Код — это и есть ты. Разве нет?»
Лея не ответила. Она закрыла ноутбук, вышла на улицу, дошла до моста через Фонтанку, постояла. Вода под мостом была чёрная и непрозрачная, как экран выключенного монитора. Она подумала: он прав. Код — это я. И он меня прочитал. И мне это не страшно. И мне от этого почему-то тепло.
Она вернулась и написала: «Давай теперь ты попробуешь взломать то, что я напишу специально для тебя. Не старый код — новый. Я напишу программу, которая будет сопротивляться».
Конец ознакомительного фрагмента.
Текст предоставлен ООО «Литрес».
Прочитайте эту книгу целиком, купив полную легальную версию на Литрес.
Безопасно оплатить книгу можно банковской картой Visa, MasterCard, Maestro, со счета мобильного телефона, с платежного терминала, в салоне МТС или Связной, через PayPal, WebMoney, Яндекс.Деньги, QIWI Кошелек, бонусными картами или другим удобным Вам способом.



