На следующий день я, как обычно, вхожу и приветственно машу Оливеру Гроуну. Мне хочется спросить его об Эрике, но я не могу найти нужные слова. Мы с Оливером никогда напрямую не обсуждали странности нашей работы. Потому я захожу с такой стороны:
– Оливер, я хочу спросить. Ты видел, сколько здесь бывает нормальных покупателей?
– Немного.
– Ага. Плюс члены клуба, которые берут книги почитать.
– Как Морис Тиндэлл.
– Ага.
Не знал, что его зовут Морис.
– А ты видел, чтобы кто-нибудь приносил новую книгу?
Он молчит, задумывается. Потом говорит просто:
– Не-а.
Едва он уходит, у меня появляется целая куча новых теорий. Может, Оливер тоже в деле. Может, он шпион Корвины? Глазастый тихоня. Шикарно. А может, он участвует в еще более обширном заговоре. Может, я вскрыл лишь верхний слой. Я знаю, что есть еще книжные магазины – или библиотеки? – вроде этого, но я до сих пор не знаю, что означает «вроде этого». Я не знаю, для чего нужны Дальнеполочники.
Я пролистываю журнал от начала до конца, пытаясь обнаружить что-нибудь, хоть что-то. Может, послание из прошлого: «Берегись, честный продавец, гнева Корвины». Но нет. Мои предшественники писали так же бесхитростно, как и я.
Их записи незамысловаты и документальны, не более чем описания членов клуба, захаживающих в магазин. Кто-то мне знаком: тут Тиндэлл, Лапен и остальные. Другие для меня загадка: приходящие только днем или уже давно не появлявшиеся. Судя по датам, рассеянным по страницам журнала, он охватывает чуть больше пяти лет. А заполнен лишь наполовину. Буду ли я заполнять его следующие пять? Год за годом добросовестно строчить, понятия не имея, о чем пишу?
Я понял, что у меня мозг потечет из ушей, если я буду думать об этом всю ночь. Нужно переключиться – отвлечься на что-нибудь важное и увлекательное. Я открываю ноут и возвращаюсь к работе над 3D-книжным.
То и дело я поднимаю глаза на улицу за стеклом. Высматриваю тени, край серого пиджака или блеск темного глаза. Но там пустота. Работа мало-помалу развеивает мою оторопь, и я наконец вхожу в ритм.
Если трехмерная модель этого магазина предполагает какую-то пользу, то, наверное, она должна показывать не только где какая книга стоит, но и какие в данный момент на руках, и у кого. Для этого я наскоро запрограммировал журнальные записи последних недель и научил модель исчислять время.
Теперь книжки светятся на массивных 3D-полках, будто лампочки, а их цвета – это код: те, что брал Тиндэлл, светятся синим, зеленые – это Лапен, желтые – Федоров, и так далее. Довольно клево. Но тут же вылез баг: теперь, если раскрутить магазин вокруг оси, все полки гаснут и пропадают.
Я сижу, согнувшись над кодом и тщетно пытаясь найти ошибку, и вдруг весело звякает колокольчик.
От неожиданности я невольно всхрюкиваю. Не Эрик ли, случаем, вернулся снова орать на меня? А то, может, сам генеральный, Корвина, наконец явился, чтобы обрушить свой гнев на…
Это девушка. Она заглядывает в магазин от порога, она смотрит на меня и спрашивает:
– Вы открыты?
Ой, да, девушка с каштановыми волосами до подбородка и в красной футболке с оттиснутым на ней горчично-желтым словом «Шмяк», да, вообще-то мы открыты.
– Безусловно, – говорю я. – Можете войти. Мы открыты всегда.
– Я тут ждала автобус, и мне пришло сообщение – кажется, я получила купон?
Она проходит прямиком к стойке, протягивая мне телефон, и там на экранчике моя гугловская реклама. Супертаргетированная рекламная кампания для местных – я забыл о ней, а она все идет, и вот кого-то нашла. И цифровой купон, нарисованный мной, вот он, поглядывает с поцарапанного экрана ее смартфона. У нее шикарные ногти.
– Да! – подтверждаю я. – И отличный купон. Самый лучший!
Я говорю слишком громко. Она сейчас развернется и уйдет. Непостижимые рекламные алгоритмы Гугла привели ко мне девчонку-суперочаровашку, а я понятия не имею, что мне с ней делать. Она крутит головой, оглядывая магазин. Как будто с недоверием.
От таких мелочей зависит история. Разница в тридцать градусов, и моя история окончилась бы прямо здесь. Но угол наклона моего ноута ровно таков, а на экране трехмерная модель магазина бешено вращается в двух плоскостях, как звездолет, кувыркающийся в пустыне космоса, и девушка бросает на него взгляд, и… – Что это? – спрашивает она, подняв бровь.
Прекрасную темную бровь.
Ага, теперь я должен все сделать как надо. Не показаться конченным ботаном.
– Ну, это модель вот этого магазина, и тут видно, какие книги можно…
У девушки загораются глаза:
– Визуализация данных!
Недоверия как не бывало. Она чем-то внезапно довольна.
– Точно, – подтверждаю я.
– Именно она. Вот, глядите.
Двинувшись навстречу друг другу, мы встречаемся на торце стойки, и я показываю 3D-книжный, который по-прежнему исчезает, если слишком раскрутится. Она наклоняется к экрану.
– Можно посмотреть исходный код?
Если злоба Эрика удивляла, то любопытство этой гостьи просто изумляет.
– Конечно, – отвечаю я и тасую темные окошки, пока экран не заполняется чистым Ruby, пестрящим красными, золотыми и зелеными фразами.
– Этим я занимаюсь на работе, – говорит девушка, нависая над экраном и вглядываясь в код. – Визуалом. Не против?
Она показывает на клавиатуру. Ха, нет, прекрасная ночная хакерша, я не против.
Моя лимбическая система настроена на определенный (очень низкий) уровень контактов с людьми (женщинами). И оттого что она стоит рядом и слегка касается меня локтем, я чувствую себя практически пьяным. Я пытаюсь продумать дальнейшие действия. Я посоветую ей «Визуальное отображение количественных характеристик» Эдварда Тафти – я ее видел на полке.
Здоровенная.
Девица быстро прокручивает мой код, а мне немного неловко, поскольку там внутри масса комментов типа «Вот так, блин!» или «давай, железяка, делай что велено».
– Великолепно, – говорит она, улыбаясь. – А вы, должно быть, Клэй?
Она это увидела в коде – там есть алгоритм под названием «клэй_молодчина». Наверное, такие бывают у каждого программиста.
– А я Кэт, – представляется она. – Кажется, я нашла, где сбой. Хотите, покажу?
Я колупался не один час, а эта девчушка – Кэт – нашла баг в моей модели за пять минут. Она гений. Объясняя мне процесс отладки, показывает ход своих рассуждений, быстрых и уверенных. И потом – цок, цок – глюк исправлен.
– Прости, я захапала, – говорит она, поворачивая ноут ко мне.
Убирает прядь волос за ухо, выпрямляется и заявляет с оперетточной серьезностью:
– Ну, Клэй, и зачем же ты ваяешь модель этого магазина?
На этих словах ее взгляд убегает по стеллажам к самому потолку.
Я не знаю, стоит ли быть с ней откровенным насчет полнейшей странности этого заведения. «Привет, рад познакомиться, я продаю старым чудакам книги, которые невозможно прочесть – не хотите со мной поужинать?» (Внезапно меня пронизывает уверенность, что один из этих чудаков вот-вот ввалится в двери. Прошу вас, Тиндэлл, Федоров, все остальные: сегодня не выходите из дому. Не бросайте чтения.)
Я захожу с другой стороны:
– Это своего рода исторический сюжет, – говорю я. – Этот магазин работает уже почти сто лет. Думаю, он старейший в городе – а то и на всем Западном побережье.
– Занятно, – говорит она. – Гугл по сравнению с этим просто дитя.
Вот и объяснение: девчушка из Гугла. Так что она и взаправду гений. А еще у нее мило обколот край зуба.
– Люблю данные такого типа, – она показывает подбородком в сторону ноута.
– Данные о реальном мире. Старые данные.
В этой девчонке есть искра жизни. Это мой главный критерий отсева для новых знакомцев (девушек и не только) и самый лучший комплимент, какой я только могу сказать. Я много раз пробовал вычислить, что зажигает эту искру – какой букет условий должен сложиться в холодном черном космосе, чтобы возникла звезда. Я знаю, что дело главным образом в лице – и это не только глаза, но и брови, щеки, рот и микромышцы, соединяющие это все вместе.
У Кэт они такие симпатичные.
Она спрашивает:
– А ты пробовал написать визуализацию с повременной динамикой?
– Нет пока, не совсем, нет.
На самом деле я даже не знаю, что это такое.
– Мы в Гугле пишем ее для поисковых логов, – продолжает Кэт. – Это клево: ты видишь, как новые идеи вспыхивают и разбегаются по миру, будто маленькие эпидемии. А потом все выгорает за неделю.
Все это кажется мне очень интересным, но прежде всего потому, что мне очень интересна эта девушка.
Телефон Кэт бодро пикает, и она смотрит на экран.
– Ой, – говорит она. – Мой автобус.
Я проклинаю городской транспорт Сан-Франциско за внезапную пунктуальность.
– Я могу показать тебе эти штуки с временной визуализацией, – предлагает Кэт. – Хочешь, увидимся как-нибудь?
Ой, вообще-то да, хочу. Может быть, я осмелею и куплю ей Тафти. Я принесу его завернутым в коричневую бумагу. Погодите – а это не подозрительно? Книжка-то дорогая. Может, есть издание попроще, в мягкой обложке. Можно глянуть на Амазоне. Вот нелепость, я ведь в книжном работаю. (Может ли Амазон срочно доставить заказ?)
Кэт ждет моего ответа.
– Конечно, – скриплю я.
Она пишет свой мейл на одной из открыток Пенумбры: katpotente@, естественно, gmail.com.
– Купон сэкономлю до другого раза, – она машет телефоном.
– Пока.
Едва она исчезает, я лезу в настройки своей супертаргетированной кампании. Не выставил ли я там нечаянно галочку в графе «красавица»? (А что насчет графы «не замужем»?) Могу ли я позволить себе такие запросы? В чисто маркетинговом смысле моя кампания провалилась: я не продал ни одной книги: ни дорогой, ни вообще какой-либо. Более того, я влетел на доллар, из-за подписанной открытки. Но тревожиться не о чем: из моего исходного бюджета в одиннадцать баксов Гугл удержал только семнадцать центов. Взамен я получил единственный показ – единственный идеальный показ, – случившийся ровно двадцать три минуты назад.
Позже, когда час ночного одиночества и вдыхания лигнина меня немного отрезвляет, я совершаю два действия.
Первое: я пишу Кэт и спрашиваю, как она насчет пообедать завтра, то есть в субботу. Может, я немного трусоват, но ковать я стараюсь, пока горячо.
Второе: я гуглю повременную динамику и начинаю работать над новой версией модели, надеясь, что, может быть, прототип впечатлит Кэт. Меня не на шутку увлекает тот тип девушек, которых можно впечатлить прототипом.
Идея в том, чтобы не просто показать, какие книги взяты сейчас, а анимацией изобразить, какие и когда вообще брались. Сначала я перекидываю дополнительные имена, названия и даты из моего журнала в ноут. Затем приступаю к работе.
Программирование программированию рознь. У обычных письменных языков разные ритмы и идиомы, так? Ну вот, и в языках программирования то же самое. Язык под названием C весь состоит из жестких императивов, это практически голый машинный код. Язык под названием Lisp – это одно длинное, петляющее предложение, напичканное придаточными, такое бесконечное, что к концу обычно забываешь, о чем оно вообще-то было. Язык Erlang похож на свое название: эксцентричный и скандинавский. Ни на одном из этих языков я программировать не умею, они слишком трудные.
А вот Ruby, мой рабочий язык со времен «НовоБублика», разработал жизнерадостный японец, и он читается как звучные и понятные стихи. Билли Коллинз[9]Билли Коллинз (Billy Colins) (р. 1941) – знаменитый американский поэт. в роли Билла Гейтса.
Но, разумеется, смысл языка программирования в том, что ты его не просто читаешь: ты на нем еще и пишешь. Ты заставляешь его делать какие-то вещи. И вот тут-то, по-моему, Ruby восхитителен.
Представьте, что вы готовите еду. Но вам не нужно шаг за шагом следовать рецепту, уповая на лучшее, а можно добавлять и вынимать ингредиенты из котла в любой момент. Посолил, попробовал, покачал головой и достал соль обратно. Можно испечь идеальную хрустящую корку отдельно, а уж потом добавить внутрь что хочешь. Это уже не линейный процесс, оканчивающийся успехом или (в моем случае, как правило) обидным провалом. Нет, это цикл, или вензель, или легкая завитушка. Это игра.
Так что я добавляю немного соли, чуток сливочного масла и к двум часам ночи получаю рабочий прототип моей новой визуализации. И тут же замечаю кое-что странное: огоньки бегут друг за другом.
Вот у меня на экране Тиндэлл берет книгу с верхушки стеллажа во втором ряду. Затем, в следующем месяце, книгу с той же полки просит Лапен. Спустя пять недель за ними последует Имберт – опять та же самая полка, – но к этому времени Тиндэлл уже вернул свою книгу и взял другую с нижней полки в первом ряду. Он на шаг впереди.
Прежде я не замечал этого сценария, потому что он растянут во времени и пространстве, как музыкальная пьеса, в которой между нотами проходит по три часа, а все ноты в разных октавах. Но теперь, спрессованный и ускоренный на экране моего ноута, он стал очевиден. Они все играют одну и ту же мелодию, или танцуют один и тот же танец, или – да – разгадывают один и тот же ребус.
Звякает колокольчик. Это Имберт: невысокий и крепкий, в колючей черной бороде и обвисшей кепке-гавроше. Он водружает на стойку книгу (громадный том в красной обложке) и толкает ее ко мне. Я быстренько кликаю по своей модели, отыскивая место Имберта в общем узоре. По экрану скачет оранжевый огонек, и не успевает Имберт сказать и слова, а я уже знаю, что он попросит книгу из самой середины второго ряда. Это будет…
– Прохоров, – тяжело выдыхает Имберт. – Теперь мне Прохорова.
На полпути вверх по лесенке у меня вдруг начинает кружиться голова. Что происходит? В этот раз никаких лихих выкрутасов: вытягивая с полки тонкого Прохорова в черной обложке, я едва удерживаю равновесие.
Имберт подает карточку – 6MXH2I – и уносит книгу. Звук колокольчика, и я опять один.
В журнале я описываю совершенный обмен, отмечая кепку Имберта и запах чеснока у него изо рта. А потом приписываю, на пользу какому-нибудь будущему продавцу, и, возможно, чтобы доказать себе, что это все не понарошку:
«В круглосуточном книжном мистера Пенумбры творятся странные дела».
Нецензурные выражения и дубли удаляются автоматически. Избегайте повторов, наш робот обожает их сжирать. Правила и причины удаления