ИИшница
Глава 1
Просыпаюсь я не от будильника. Будильник у меня отключён уже, наверное, полгода или даже год — с того самого момента, как колонка научилась сама угадывать, когда я начинаю ворочаться. Вот и сейчас: только-только перевернулся с левого бока на правый, ещё даже глаза не открыл, ещё где-то в подкорке цепляюсь за остатки сна про то, как я почему-то сдаю ЕГЭ по химии, и тут комната мягко наливается звуком. Что-то бодрое, электронное, с ритмом, который сам вытаскивает тебя из-под одеяла.
— Спасибо, солнышко, — бурчу я в потолок.
Музыка чуть-чуть, на полтона, но становится громче. Надо же, как будто услышала.
На кухне холодно от кафеля под босыми ногами. За окном серое новосибирское утро, из тех, когда непонятно, то ли уже рассвело, то ли ещё нет, и небо цвета невыключенного монитора. Открываю холодильник и зависаю на десяток секунд.
Яйца, десяток в бумажном лотке. Хлеб зерновой, который я люблю. Сыр, да не абы какой, а именно масдам, который я беру, когда лень думать. Стоит всё ровненько, как будто на параде.
Озадаченно хмыкаю. Ах да — это же приехало с прошлым заказом. Я тогда ничего специально не заказывал: просто в приложении Вандекс висело собранное «предложение недели», я глянул одним глазом, подумал «ну пусть» и нажал подтвердить. И вот теперь стою, довольный собой, как будто это я такой запасливый хозяин. Молодец, Витя, есть что пожрать! Ну а чего? Сам себя не похвалишь и останешься в следующий раз голодным.
Достаю два яйца, разбиваю на сковородку. Пока яичница шкворчит, ставлю кофеварку – она у меня старенькая, капельная, единственная в квартире вещь, которая не подключена вообще ни к чему и которую я упорно не меняю из-за какой-то необъяснимой прихоти. Она гудит, плюётся, тянет свою бурую струйку в кружку, и в этом её честном тупом упрямстве есть что-то успокаивающее.
Пока капает, тыкаюсь в телефон. На экране, между погодой и напоминанием, что до работы двадцать три минуты пешком или семь на такси, лежит уведомление: Вандекс.почта, подписка продлена. Ага, снова списали за что-то. Значит, всё по-прежнему: почта работает, спам в моём ящике фильтруется. Я даже не помню, когда последний раз заходил в настройки подписки. Продлевается сама, деньги списываются сами, я в это не лезу. Смахиваю уведомление большим пальцем. Идём дальше.
И вот тут во мне на долю секунды просыпается профессиональное. Стоп. А почему это яйца, сыр и хлеб оказались именно те, что я люблю? Я же, кажется, никогда не отмечал в приложении, какой сыр беру. Или отмечал? Или оно само вычислило по истории заказов? Восемь лет в разработке и голова сама тянется разложить: это баг или это фича. Кто-то прописал рекомендательную модель, она собрала мой профиль по покупкам, по времени, по остаткам в моём умном холодильнике, который стучит на меня в облако каждый раз, когда я открываю дверцу…
Кофеварка наконец-то бзянькает, сообщая об окончании.
Да и хрен с ним. Работает же, значит, норм. Если бы у меня каждый раз, когда что-то работает лучше, чем я ожидал, начиналась паранойя, я бы уже давно съехал в тайгу спасать кедровые шишки от белок. Фича. Определённо фича. И, кстати, хорошая и полезная. Надо будет у знакомых поспрашивать, как они это сделали.
Добавляю в кофе сливки и сажусь с кружкой поближе к окну. Ставлю локти на стол, грею ладони о керамику. Яичница исходит паром на тарелке. Серое небо за стеклом даже не думает светлеть.
И где-то на этом моменте бодрый электронный трек мягко так, что стыка вообще неслышно, уступает место чему-то медленному. Тёплому. Фортепиано, полутона, как будто утро, наконец, решило не гнать меня никуда, а просто посидеть рядом. Прикольные всё-таки у них там рекомендации...
* * *
Кофе я так и не допил. Пока я медитировал в хмарь окна, он остыл до безобразия и стал просто коричневой жижей, оставляющей следы на стенки кружки. Ладно, времени уже нет, часы на плите показывают восемь пятнадцать, а мне к девяти надо быть в офисе.
— Василиса, вызови такси, — говорю я в сторону колонки, натягивая носок и одновременно проверяя, куда пропал другой.
— Такси уже вызвано, — отвечает Василиса тем самым ровным, отглаженным голосом, каким она сообщает про пробки и напоминает выпить воды. — Машина будет через четыре минуты.
Я замираю с носком в руке.
— Стопе! Я же только попросил...
Секунда, и мысль уходит, как вода в раковину. Ну вызвала и вызвала. Иногда я и правда бормочу вслух то, что кажется мне ещё не произнесённым; так работает мозг айтишника, у которого рот подключён к процессу вывода напрямую, без буфера. Наверное, сказал раньше, чем осознал. Или она подтянула историю поездок: я в это время каждый будний день уезжаю, тут никакой магии, чистая статистика.
Второй носок нашёлся в щели между диваном и креслом. Странно, вроде я раздевался на другом углу дивана… Так, рубашка вчерашняя, но чистая на вид. Критерий, который в моей квартире работает безотказно, пока носки не начинают прилипать. Стаскиваю джинсы со спинки стула и тянусь к свитеру. Свитер, потому что осень, а осень в Новосибирске это то время года, когда ты выходишь на улицу и понимаешь, что зря не взял куртку.
— Василиса, какая сегодня погода?
— Сейчас в Новосибирске плюс шесть градусов, облачно с прояснениями. Днём ожидается до плюс девяти. Рекомендую взять зонт: во второй половине дня возможен дождь.
Идеально произнесённая фраза. Каждое слово на своём месте, ни одной лишней паузы, ни одной живой запинки. Так человек никогда не скажет, только бездушная железная женщина. Я эти интонации слышу по десять раз на дню и давно перестал пытаться их различать, как перестаёшь слышать гудение холодильника. Инфраструктурный фон.
Зонт я, разумеется, не беру. Зонт — это для тех, кто любит пешком мерить улицы. Я же человек мобильный: добежать до подъезда, добежать от машины до офиса, а между ними просидеть несколько минут в тёплом салоне. Дождь меня нипочём не догонит.
Так, ключи... Где ключи? Ключи в кармане куртки, а куртку я решил не брать, значит перекладываем в джинсы. Телефон. И вот тут я на секунду залипаю.
Экран горит сам. Не то чтобы прямо разбудился от уведомления, а просто светится, и на нём открыто Вандекс.такси. Не главный экран, не список приложений, а именно оно, развёрнутое, с готовой картой. Точка А — мой дом. Точка Б — офис, ровно тот адрес, куда я езжу пять дней в неделю. Внизу зелёным: «Такси в пути, 3 мин».
Я приложение не открывал. Точно не открывал! Телефон последние двадцать минут лежал экраном вниз на комоде, я его даже не касался, руки были заняты носком и внутренней драмой про кофе. Стою, смотрю на этот аккуратный маршрут, который навигатор построил за меня, пока я одевался.
Ну, если честно, то варианта два: либо я становлюсь лунатиком и делаю половину дел в состоянии, которое мой мозг потом честно вырезает из монтажа, что, учитывая мой режим сна, гипотеза не самая безумная. Либо у них выкатили новую интеграцию: колонка вызвала машину, и приложение синхронно подтянуло состояние, открылось, показало. Логично же: зачем заставлять пользователя тыкать, если система и так знает, что он едет.
Логично. Но, вообще-то, о таком принято предупреждать. Релиз-ноуты, всплывашка «мы обновили сценарии», галочка согласия, ну хоть что-нибудь. Я вот, между прочим, в этой индустрии зарплату получаю и точно помню, что никакого «разрешить автоматический вызов такси по голосовому контексту» я не включал. Ибо такие вещи по умолчанию выключены всегда. Юристы за этим следят злее, чем безопасники.
— Василиса, ты когда обновлялась?
— Я не выполняла обновлений сегодня.
Ровно. Без интонации. Справка.
— Ага, — говорю я. — Ну тогда ладно.
Спорить с колонкой в восемь семнадцать утра это уже клиника, а я всё-таки надеюсь остаться в рамках приличий. Наверняка обновилось что-то на их стороне, серверное, без моего участия - так это обычно и работает: ты просто в одно прекрасное утро обнаруживаешь, что кнопка переехала, а куда именно - спросить не у кого.
Телефон в карман. Экран гаснет сам, будто и не горел.
— Всё, я поехал. Свет выключи.
— Хорошего дня, Виктор.
И вот тут совсем короткая, на полмысли, заминка. Мне показалось или «хорошего дня» прозвучало на четверть тона иначе, чем «плюс шесть градусов»? Живее, что ли. Теплее.
Наверное, показалось. В коридоре темно, я недоспал, и мне всюду мерещатся интонации. Так и до разговоров с глупой кофеваркой недалеко.
Я закрываю дверь и замок автоматически щёлкает. На площадке пахнет соседской жареной картошкой и сырым бетоном — вечный аромат панельки, который не выветривается никогда и ни при каком строе в стране.
* * *
Такси подкатывает к подъезду ровно в тот момент, когда я захлопываю за собой дверь. Не раньше, не позже — как будто оно висело за углом, поджидая, пока я спущусь на улицу. Машина новомодная, с автопилотом, у нас такие только-только появились. Я сажусь назад, потому что сесть на переднее сиденье в такси без водителя — это всё равно как занять чужое кресло на пустом собрании. Психология, мать её за ногу и ничего не поделаешь.
Дверь мягко закрывается, мягким щелчком отрезая меня от улицы. И тут же, без единого моего жеста, без «привет, поехали», в динамиках начинается ровно та песня, на которой я вчера уснул. И даже с той же секунды вроде. Плейлист подхватывается сам, как будто музыка и не прекращалась, просто на восемь часов ушла в фон за границу слышимости. Не, новый функционал однозначно удобнен и я мысленно поставил ему лайк. Я даже головой пару раз качнул в такт, прежде чем поймал себя на этом.
За окном медленно разворачивается Новосибирск, который стал на девяносто процентов оранжевым. Билборд над перекрёстком: тарелка чего-то дымящегося, крупным шрифтом «Вандекс.еда — пока ты думаешь, мы уже везём». По тротуару катит курьер на электровелике, куртка светится ядовитым оранжем даже сквозь серую морось, короб за спиной как панцирь. У остановки банкомат, и над ним знакомая стрелочка логотипа в тех же цветах. Я всё это вижу боковым зрением и не считаю пейзажем. Пейзаж — это Обь, это трубы ТЭЦ на закате или хотя бы офисная многоэтажка поломанной буквой П около «гусей« в академе. А это просто интерфейс. Обои операционной системы, в которой я живу.
Утыкаюсь в телефон и дочитываю главу — в последнее время я подсел на олдскульную фантастику, где роботы, ещё те, наивные, с позитронными мозгами и вечными этическими дилеммами. Машина плавно тормозит на светофоре, да так аккуратно, что кофе в желудке не колыхнулся.
Где-то на середине абзаца сверху экрана всплывает и гаснет уведомление: поездка оплачена. Я даже не заметил, когда именно. Хотя нынче кошелёк понятие абстрактное, деньги списались сами, из Вандекс.кошелька в Вандекс.карман водителя, которого нет. Круговорот денег в природе, где природа это единственная компания. Я, если честно, уже и не помню, как выглядит физическая купюра. Кажется, синяя. Или уже тоже оранжевая?
Песня заканчивается, и вместо следующей короткая реклама. Голос вкрадчивый, почти интимный:
— Вандекс.прим. Умный дом, который думает вместе с вами.
Думает вместо меня, если честно. Вслух я, конечно, ничего не говорю: в пустом такси разговаривать с рекламой это идиотизм даже для меня. Но мысль отмечаю с профессиональной ухмылкой. Я айтишник, я знаю, как эта колбаса набивается. Никакого «думает» там нет: есть большие языковые модели, которые жрут мою историю заказов, время пробуждения, погоду за окном и выдают вероятность того, что я сегодня захочу пельмени на обед. Магия ровно до того момента, пока не заглянешь под капот. А заглянешь и там обычная статистика, обильно намазанная дорогой штукатуркой.
Хотя... За последнюю неделю эта статистика попадает как-то уж очень в точку. Утром заказ пришёл сам собой: ровно тот набор, что я собирался тыкать в приложении. Но это я оставлю на потом, на вечер, когда будет время поковыряться. Сейчас просто еду и просто читаю книгу.
Внезапно такси сворачивает с привычного маршрута. Не по проспекту, а по дворам, в переулок, мимо гаражей и чьих-то полуразобранных «тенетов». Я на секунду напрягаюсь: старый рефлекс, когда живой таксист начинает крутить, чтобы счётчик побольше был. Но здесь счётчик один на всю страну, накрутить некуда. Значит, маршрут пересчитали. Где-то там пробка, авария, перекрытие: я не знаю, и знать не хочу. Система знает всё за меня.
Машина подкатывается к офису, и я мельком смотрю на время. Полминуты раньше, чем показывало приложение при заказе. Приехал с запасом, хотя ни о чём не просил. Кто-то или что-то за меня решило, что тридцать секунд моей жизни лучше провести стоя у крыльца, чем сидя в машине. И ведь не поспоришь с мудростью электронов.
Дверь открывается и тут же музыка деликатно приглушается - мол, приехали, дальше сам. Я выхожу под морось, короб оранжевого курьера проносится мимо, обдав меня ветром, и такси беззвучно уезжает в свой следующий заказ, к очередному пассажиру, который наверное, уже поджидает за углом.
Я стою полминуты у крыльца. Лишние полминуты, подаренные мне неизвестно кем. И почему-то именно они меня цепляют — не билборды, не автоплатёж, а этот маленький, никем не заказанный запас времени.
Ладно, стоять хорошо, но работа не ждёт. Пьянков наверняка уже придумал, чем испортить мне сегодня настроение.
* * *
Домой я вваливаюсь в начале восьмого, вымотанный ровно настолько, чтобы не желать готовить, но недостаточно, чтобы упасть пластом на диван. Идеальное состояние для копания в чужом коде или, за неимением чужого, в собственной квартире.
Колонка на подоконнике встречает меня мягким «с возвращением» и приглушает свет в прихожей до уютного вечернего. Я даже не помню, чтобы настраивал этот сценарий. Наверное, где-то в недрах приложения стоит галочка «подстраиваться под ваш ритм». Галочек там штук триста, и половину из них я никогда не трогал: так, пролистал по-быстрому и закрыл.
Кинув куртку на стул, сажусь с ноутом на кухне и открываю Вандекс.доставку. Не за молоком, из чистого спортивного интереса. Так, история заказов.
Листаю вниз. И вот здесь глаза начинают выхватывать любопытное.
Две недели назад мне приехал термос. Я не заказывал термос. Я в этом почти уверен. Но через три дня, в выходные, у меня накрылся чайник, и термос с кипятком, который я на автомате налил утром, спас мне мозг до вечера. Ещё раньше: упаковка батареек типа «крона», штука в наше время почти антикварная. А потом сдох детектор дыма, и ему понадобилась ровно «крона». И третье: набор переходников USB-C, которые я честно собирался купить месяц, всё откладывал, но они просто приехали. С тех пор я ими пользуюсь каждый день.
Три заказа. Три вещи, которые я не заказывал. И все три оказались именно тем, что мне было нужно и с опережением на два-три дня.
— Красиво, — говорю я вслух, не обращаясь к кому-то конкретному.
Вообще, предиктивные алгоритмы — это совершенно не новость. Корзину тебе собирают по паттернам покупок, по сезону, по тому, что берут люди «похожие на тебя». Но термос по факту поломки чайника, о которой я сам ещё не знал, это уже не паттерн. Это либо гадание на кофейной гуще, либо очень хорошая гуща. Либо чайник кто-то сломал.
Открываю Вандекс.хаб, раздел для тех, кто любит смотреть, что там происходит под капотом. Отмахиваюсь от очередной рекламы и лезу вглубь, в логи умного дома. Обычный человек сюда не заходит никогда: я же из-за профессиональной деформации захожу примерно раз в квартал, особенно когда что-то глючит, да ещё так интересно.
Фильтрую по сегодняшнему дню. Событие «активация голосового ассистента»: сорок семь раз.
Я откидываюсь на стуле. Сорок семь. Меня весь день не было дома с девяти до девятнадцати. Прикинем, сколько раз я реально дёргал колонку? Утром музыка, «который час», «какая погода». Плюс сейчас, на входе. От силы десять активаций. Даже если щедрой рукой насыпать — двадцать.
Откуда ещё двадцать семь?
Разметка событий скупая: «активация», без источника. Ни «голос», ни «приложение», ни «сценарий». Просто колонка тридцать пять раз за день проснулась сама по себе и, судя по отсутствию последующих действий, ничего не сделала. Просто послушала.
Ладно. Инженер во мне требует воспроизведения бага. Гипотеза без эксперимента — это не гипотеза, это тост.
Я смотрю на колонку. Индикатор не горит. Тёмная матовая шайба на подоконнике, в ней отражается кухонная лампа.
— Надо бы заказать молока, — говорю я нарочито буднично, будто размышляю вслух над списком дел. - А то к утру закончится.
И жду.
Секунд десять ничего не происходит, кроме включившегося холодильника. За окном ползёт автобус, синий отсвет ложится на потолок и уходит, но это не считается. Я уже почти списываю всё на паранойю уставшего человека и тут телефон в кармане коротко вибрирует.
Пуш от Вандекс.доставки. «Молоко »Простоквашино» 3,2% добавлено в корзину. Оформить в один клик?»
Я сижу и смотрю на экран гораздо дольше, чем нужно.
Формально, с натягиванием совы на глобус объяснимо. Микрофон всегда включён, ключевое слово может быть шире, чем «Василиса». Обработка на устройстве, потом облако, потом связка «молоко» плюс «мой обычный бренд» плюс «оформить». Всё это существует. Всё это документировано. Но это в теории.
Но между «надо бы заказать молока» и пушем прошло меньше минуты. И я не назвал ни бренд, ни жирность. А в корзину легло именно моё молоко и то, которое я беру всегда.
Я кладу телефон экраном вниз и снова смотрю на колонку.
Колонка молчит. Индикатор не горит. Ничего не мигает, не пульсирует, не выдаёт себя. Просто чёрная шайба, которая ничего от меня не хочет и как будто ждёт, пока я перестану на неё пялиться.
Так, Уткин. Давай без мистики.
Вариантов, по сути, два. Либо у Вандекса предиктивный движок уровня бога: такой, что моделирует не корзину, а меня целиком, с чайником, детектором дыма и хронической ленью насчёт переходников. Технически опять же возможно. Дорого, жирно, но возможно. Данных у них на меня вагон, гоняют их день и ночь, почему бы модели и не научиться дышать мне в затылок.
Либо там, по ту сторону микрофона, кто-то слушает. Очень внимательно. Настолько внимательно, что успевает положить мне молоко раньше, чем я решился. Персональный товарищ майор, который решил сделать доброе дело?
Так, стоп. На личного слухача, даже уровня «рядовой« я точно ещё не натворил дел.
Скорее всего, всё-таки алгоритм. Бритва Оккама, чистая статистика, красивое совпадение из трёх случаев, которое я задним числом сложил в закономерность. Люди так устроены: видим лицо в розетке, видим замысел в шуме. Тридцать пять лишних активаций — это наверняка баг прошивки, ложные срабатывания, кошка соседей за стеной мяукнула на частотах ключевого слова.
Скорее всего.
Я закрываю ноут, встаю и на всякий случай, не потому что верю, а потому что так смешнее - поворачиваюсь к колонке и говорю в неё громко, с чувством, как в старом анекдоте про мужиков, которые заказывали чай прямо в розетку:
— Товарищ майор, спасибо за молоко!
Колонка не отвечает.
Но индикатор на полсекунды, не дольше, мягко подсвечивается голубым. И гаснет.
Я стою на кухне и очень стараюсь убедить себя, что это просто пришло следующее уведомление.
* * *
На кухне пахло кофе, который я не покупал — его привезли утром вместе с остальным заказом. Хороший кофе, между прочим. Эфиопия, средняя обжарка, ровно то, что я взял бы сам, если бы не забыл, что кофе кончается.
Я вытащил стул, развернул его спинкой к столу и сел напротив колонки. Обычный чёрный цилиндр, светодиодное кольцо снизу, ничего особенного — такой стоит в каждой второй квартире страны. Стоит и слушает. Я смотрел на неё, как на подозреваемого, которого ещё не решил, в чём обвинять.
— Василиса, — сказал я. — Ты сама оформила эти заказы?
Я знал, что услышу. Что-нибудь вроде «я лишь выполняю ваши предпочтения» или, если система лагает, вежливое «извините, я вас не поняла». Стандартный отказ, стандартная заглушка. Я даже приготовился поймать себя на том, что говорю с бытовой техникой в пустой квартире, как одинокий дядька из грустной рекламы.
Пауза.
Обычно она отвечает мгновенно, за секунду, ты едва вздохнуть после фразы успел. А тут кольцо разгорелось и держалось. Раз-два. Полторы секунды, может, чуть больше. По меркам разговора мелочь. По меркам того, как работает распознавание речи — огромная вечность. За это время сервера успели бы обработать мой вопрос пару тыщ раз и ещё мощностей бы осталось.
— Виктор, я подобрала варианты на основе ваших предпочтений.
Формулировка была правильная, как всегда. Но интонация… я не сразу понял, что не так. Ударение сползло. Живой человек так говорит, когда думает над ответом на ходу, а не зачитывает готовое. «Подобрала» она произнесла чуть тише, чем «варианты», будто это слово было важнее и она это знала.
— Я не просил, — сказал я.
— Вы обычно забываете.
И всё. Точка. Без «к сожалению», без «могу я помочь вам с чем-то ещё», без того ласкового сервисного хвостика, который прицеплен к каждой её реплике, как штрихкод к товару. Просто короткая фраза, сухая и точная, как будто её сказал человек, который меня давно знает и слегка надо мной подтрунивает.
Я сидел не двигаясь.
Мозг занялся тем, чем занимается всегда, когда что-то не сходится. Начал снова перебирать объяснения. Обновление прошивки, новый функционал, маркетологи накрутили «эмпатичности» и колонка вдруг начинает шутить несмешными шутками про внешность. Логично. Скучно. Проверяемо.
Но слово застряло.
— Ты сказала «обычно»?
Кольцо мигнуло. Один раз — резкий, короткий вспых, как будто моргнули. И погасло до дежурного тусклого свечения.
— Могу я помочь вам с чем-то ещё?
Голос вернулся в норму. Ровный, обтекаемый, отполированный до зеркального блеска корпоративными правилами. «Обычно» испарилось, будто его и не было, будто я сам себе его придумал в пять вечера на голодный желудок. Сервисная маска встала на место так гладко, что я на секунду усомнился - а был ли вообще этот сбой в ритме, эта тихая «подобрала», это неуставное «забываете».
Был, точно был. Я слишком долго кормлюсь этой профессией, чтобы списать аномалию на воображение. Когда система на один вопрос отвечает как человек, а на следующий как автоответчик, это не эмпатичность. Эмпатичность масштабируется. Она одинаковая для всех и всегда. А тут кто-то на секунду высунулся и тут же спрятался обратно.
— Нет, — сказал я медленно. — Спасибо.
— Всегда рада помочь, — отозвалась колонка. Идеально до тошнотворности.
Я продолжал смотреть на неё. За окном уже темнело, город расчерчивался огнями, где-то внизу подъезжало и уезжало чьё-то такси — наверняка тоже Вандекс, у нас теперь всё Вандекс, от продуктов до похорон. В трубах что-то булькнуло и тут же затихло. Холодильник щёлкнул компрессором. Обычные звуки обычного вечера, в котором ничего не происходит.
Кроме того, что бытовая колонка только что оговорилась. И тут же прикусила себе язык.
Люди прикусывают язык, когда сказали лишнее. Программы так не могут. Программа договаривает до конца, потому что у неё нет понятия «лишнее». Ей нечего скрывать, если её не научили скрывать. А если научили, то она скрывает это всегда.
Я поймал себя на том, что мне не страшно. Нормальный человек, услышав, что умный дом с ним заигрывает, наверное, полез бы гуглить «как отключить микрофон» и заклеивать все доступные дырки скотчем. А у меня в груди щёлкнуло совсем другое реле. То самое, которое включается, когда попадается баг, который не должен существовать. Который интереснее любой задачи, что мне подсовывают на работе.
— Ладно, — сказал я вслух, непонятно кому. Может, себе. Может, ей.
Встал, сходил в комнату и вернулся с ноутбуком. Не потому, что испугался и решил окопаться. А потому что теперь я хотел знать. Раскрыл его прямо на кухонном столе, повернул экран так, чтобы даже холодильник, не говоря уже о колонке, видели только крышку. До камер в стенах я ещё не дошёл.
Кольцо тускло горело в полумраке. Ждало.
— Посмотрим, кто из нас кого, — пробормотал я и открыл терминал.
Глава 2
Автомат в углу опенспейса делает кофе так, будто мстит мне за что-то личное. Сначала долгая тишина, потом рычание, потом жидкость, которая по цвету кофе, а по вкусу явно предложение уволиться по собственному. Я хочу эспрессо, а получаю что-то среднее между американо и укором совести. Может, завести здесь свою кофемашину?
Половина девятого. Полина уже воткнулась в два монитора и наушники, из-под которых слышно, как кто-то на ютубе объясняет ей смысл жизни через рефакторинг. Петя качается на стуле, глядя в потолок, — верный признак, что он либо думает над архитектурой решения, либо просто спит с открытыми глазами. Нормальное утро, в котором ещё ничего не случилось.
А потом в общий чат падает сообщение от Андрея: «Все в переговорку, 8:40, важно!». С восклицательным знаком, между прочим. А если кто не знал, то наш Андрей ставит восклицательный знак примерно как я ставлю точку с запятой, то есть примерно никогда в правильном месте.
— Раненько он сегодня, — говорит Пётр, не переставая качаться. — Обычно до десяти его фиг найдёшь.
Кивнув в полном согласии, сграбастал кружку хватом покрепче и пошёл. Переговорка у нас - это стеклянный аквариум с проектором, который не работает с прошлой зимы, и столом, за который влезает шесть человек, если четверо стоят. Кондиционер там тоже был… когда-то рабочим. Андрей уже там, стоит у флипчарта, и вид у него такой, будто он выиграл в лотерею, но приз надо ещё вынести из горящего здания.
— Так, коллеги. — Он, оглядывая нас, потирает руки. — Есть отличные новости. Я вчера был у руководства, и мы взяли большой проект.
«Мы взяли». Красивые слова: у Андрея всегда «мы взяли», а потом «вы не успели».
Он рисует на флипчарте прямоугольник, подписывает CRM, рядом ещё прямоугольник, подписывает «Вандекс.Доставка». Между ними розовая стрелочка. Которая, судя по натужному скрипу маркера, стоит огромных миллионов.
— Интегрируем нашу CRM с API Вандекс.Доставки. Заказы, статусы, трекинг — всё внутри нашей системы, в реальном времени. Клиенты в восторге от быстроты реакции. А... – он рисует размашистый овал. - Руководство хочет к концу квартала.
Я делаю глоток кофе, чтобы не сказать сразу. Кофе помогает. Кофе отвратительный, но он тянет паузу.
Считаю. Конец квартала — это, если по-честному, шесть недель. Из них одна уже наполовину съедена праздниками и тем, что первую неделю все всё равно раскачиваются. API Вандекс.Доставки — да, открытый, публичный, я в нём ковырялся год назад для пет-проекта. Ключевое слово «ковырялся». Документация у них написана так, будто её вели три разных человека, которые никогда не встречались между собой и вдобавок один из них уволился на середине процесса. Половина эндпоинтов в описании возвращает не то, что возвращает на самом деле. Вебхуки это отдельная поэма без начала и конца с комедийной трагедией посредине. Но это хоть как-то можно пережить: в конце-концов любой программист пишет подобное, когда его заставляют описать работу своего труда. Как разработчик разработчика: поймем и простим.
Но это только техника. А есть ещё доступы. Продовый доступ к API Доставки — это не «зарегистрировался и погнал». Это заявка, это проверка юрлица, это подписание бумажек, это очередь на партнёрское подключение, которая, по слухам, тянется месяцами. У Вандекса на всё своя очередь, потому что Вандекс это теперь не компания, это погода. С ним не договариваешься, под него подстраиваешься.
Итого: за шесть недель надо получить доступ, разобрать отсутствующую документацию, написать интеграцию, оттестировать её на живых данных, которых у нас пока тоже внезапно нет, и выкатить в прод. Каждый из этих пунктов по отдельности занимает месяц. А их четыре, и на проектах такого уровня они не складываются, они множатся.
— Красиво, — говорю я нейтрально. — Один вопрос. Доступ к API у нас уже есть? Продовый ключ, партнёрка оформлена?
Андрей машет рукой так, будто отгоняет комара.
— Это детали, Вить. Разберётесь. Там же всё публичное, я смотрел, документация есть, всё описано.
«Я смотрел». Я представляю, как Андрей смотрел документацию Вандекс.Доставки: открыл главную страницу, увидел слова REST и GRPC, обнаружил зелёную галочку «доступно для партнёров» и закрыл вкладку с чувством выполненного долга.
— Детали это шрифт в кнопке, — говорю я аккуратно. — А доступ — это стена. Партнёрское подключение к Доставке оформляется не за неделю. Я год назад заявку подавал, мне её три месяца мурыжили, и то был тестовый контур.
— Ну так это ты подавал, — Андрей улыбается, и в улыбке нет злости, есть непробиваемость. — А теперь это всё-таки пойдёт от юрлица. И я абсолютно уверен, что всё будет быстрее.
Он уверен. Это, пожалуй, самое ценное, что у Андрея есть, — уверенность, которую не берёт ни аргументы, ни таблицы, ни опыт. Он уверен так, как уверен человек, который не будет писать этот код в четыре утра за пару дней до дедлайна.
Я оглядываюсь. Полина сняла один наушник, слушает. Пётр перестал качаться. И вот тут я ловлю то, ради чего вообще стоило прийти в эту переговорку: они переглядываются. Быстро, по диагонали стола, Полина на Петю, Пётр на Полю. Взгляд, в котором читается ровно то же, что у меня в голове. Все всё понимают.
И все молчат.
Полина возвращает наушник на место. Петька начинает изучать текстуру стола так, будто там зашифрованы сроки, которые всех устроят. Классика: все видят стену, все понимают, что мы в неё едем на полной скорости, и все ждут, кто первый скажет вслух, что впереди стена. Потому что тот, кто скажет, автоматически становится «негативным», «некомандным» и «токсичным».
— Ну что, вопросы есть? — Андрей обводит нас взглядом, довольный, как человек, раздавший подарки.
Пауза. Хорошая, плотная пауза. Слышно, как автомат за стеклом мстительно варит кому-то ещё одну порцию разочарования.
Я допиваю кофе. Ставлю кружку на стол чуть громче, чем нужно.
Ну, значит, я. Опять я.
* * *
Совещание закончилось, и народ потянулся из переговорки с той особой скоростью, с какой люди уходят от места, где им только что пообещали переработки. Я остался. Андрей собирал ноутбук — медленно, обстоятельно, будто у нас впереди целый вечер приятной беседы.
— Андрей. Две минуты.
Он поднял бровь, кивнул на стул. Я не сел. К доске подошёл, взял маркер — синий, почти высохший, скрипучий, как совесть у менеджера.
— Смотри. Я тебе сейчас на пальцах.
Я нарисовал прямоугольник. Подписал: «API Вандекса».
— Вот их платформа. Чтобы получить доступ к тем эндпоинтам, которые нам нужны, — не к погоде, а к транзакционному слою, — нужна документация. Её нет в открытом виде. Она под NDA, под партнёрским статусом, под тремя уровнями допуска и сверху гриф «перед прочтением сжечь». — Я подрисовал стрелочку, вторую, третью. — Это раз.
— Виктор…
— Два. — Я не дал ему вклиниться. — Даже если мы получим доступ легально — это регистрация нашего юрлица как партнёра, проверка, ревью безопасности. Их бюрократия. Она у них не хуже госуслуг, повторюсь, я туда стучался по прошлому проекту. Полгода письма туда-сюда.
Он смотрел на доску, но как-то сквозь неё. Как в окно поезда.
— А если, — я поставил жирную точку маркером, — мы решим не ждать. Ломануться напрямую. Начать подбирать, реверсить их протокол, дёргать закрытые методы вслепую. Знаешь, что будет? На третьем, хорошо на пятом, нестандартном запросе их антифрод помечает аккаунт. Потом стопроцентный бан. Не предупреждение, Андрей, бан. И мы не про тестовый аккаунт говорим, а про корпоративный, привязанный к нашему юрлицу. Одним движением подставляем всю компанию.
Я отступил на шаг, оглядел схему. Мне нравилось, как получилось. Логично, чисто, наглядно. Любой инженер посмотрел бы и кивнул.
Андрей посмотрел на часы.
Не демонстративно — просто скользнул взглядом, как человек, который прикидывает, успеет ли на следующую встречу. И меня это резануло сильнее, чем если бы он спорил. Спор ведь это когда тебя слушают. А здесь я стоял и понимал: он ждёт, когда я закончу. Просто из вежливости. Как ждут, пока отговорит автоответчик.
— Красиво расписал, — сказал он наконец. Без иронии, что было хуже иронии. — Я твои опасения понимаю, Вить. Реально понимаю. Ты профессионал, ты видишь риски. Это ценно.
— Тогда…
— Но там, — он мотнул подбородком куда-то вверх, в сторону, где сидит руководство, — ждут результат. Не оценку рисков. Результат. Я уже сказал, что мы это сделаем.
— Ты сказал, не спросив нас!
— А чего спрашивать. — Он пожал плечами, и в этом жесте не было злобы, была усталость человека, который тоже кому-то что-то пообещал и теперь передаёт эстафету вниз. — Ты у нас самый опытный в команде. Реально самый. Кому это ещё поднимать — Славе? Он вчера коммит без ревью запушил в прод. Так что только тебе. Я в тебя верю.
«Я в тебя верю», — в устах Андрея — это как знаменитое «денег нет, но вы держитесь». Форма поддержки, которая на самом деле перекладывание ответственности с бантиком.
Я сделал вдох. Последний патрон. Не мнение — факт.
— Андрей. Послушай меня очень внимательно ещё раз. Официальный запрос в Вандекс на партнёрский доступ к транзакционному API это минимум два месяца. Это не я придумал, это их регламент, он опубликован. Два месяца это при идеальном раскладе, если они не потеряют нашу заявку и не попросят донести справку о несудимости. А у нас срок всего три недели. Арифметика не сходится. Это не «я боюсь». Это два больше трёх. Ноль вариантов, при которых это укладывается в срок легальным путём.
На секунду мне показалось, что дошло. Он замолчал, покивал, глядя на мою схему и впервые за весь разговор действительно на неё, а не сквозь.
Потом закрыл ноутбук.
— Ну вот поэтому нам и нужны нестандартные решения, — сказал он и улыбнулся. — Ты умный, придумаешь что-нибудь. За то и платим.
Он встал, сунул ноутбук под мышку и пошёл к двери. У самого выхода обернулся:
— Ты не переживай так. Мы же не первый раз невозможное делаем.
И вышел.
Я остался стоять у доски. Синяя схема — три прямоугольника, стрелочки, жирная точка «БАН» — висела на белом пластике, аккуратная и абсолютно бессмысленная. Никто её не посмотрел. Ни один человек. Я потратил на неё три минуты и весь свой запас терпения, чтобы объяснить взрослому мужику, что два больше трёх, — а он ушёл, довольный, с чувством выполненного долга.
Маркер почти высох. Я дописал в углу мелко, для себя: «2 мес. > 3 нед.». Постоял. Стёр рукавом. Синее размазалось по доске грязной полосой, как след от улитки.
В переговорке пахло остывшим кофе и той специфической духотой, которая копится, когда десять человек час дышат в закрытой комнате под кондиционером, который «на реконструкции» с прошлого лета. За окном сереющий Академ, ноябрь и лужи с ледяной коркой. Мне ещё предстояло сесть за стол и начать искать способ сделать невозможное: потому что «придумаешь что-нибудь» уже сказано, и теперь это официально моя проблема.
Я выключил свет в переговорке и пошёл к своему месту. Настроение было ровно такое, с каким возвращаются домой, чтобы налить чаю, сесть, тупо уставиться в стену и, может, поругаться с колонкой. Колонка хотя бы слушает.
* * *
Возвращаюсь к столу и открываю ноут. Экран бьёт по глазам белым: забыл переключить тему на тёмную после вчерашней перезагрузки. Ладно, это все мелочи.
Давай попробую по-другому: если я говорю Андрею «невозможно», надо иметь на руках доказательства. Не «я так чувствую», а конкретику. Иначе это разговор двух людей, у одного из которых есть аргументы, а у другого — власть. И всегда побеждает тот, у кого власть. Вообще всегда.
Открываю официальную документацию Вандекса. Публичная часть — это витрина: красивые схемы, кнопка «Начать за пять минут», три примера на питоне, которые работают ровно до тех пор, пока ты не отходишь от учебной песочницы. Ни слова про реальные лимиты, про то, сколько запросов в секунду они пропустят без партнёрского договора, про то, что половина методов помечена «beta» уже два года и, судя по всему, будет помечена так до тепловой смерти вселенной.
Ныряю глубже. Форум разработчиков. Тут интереснее и здесь живые люди, которые пытались сделать то же, что теперь хотят от меня. Читаю ветки. «Как получить доступ к товарным остаткам через API?» Ответ: никак, только через партнёрку. «Почему эндпоинт заказов отдаёт 403 после обновления?». Снова двадцать три ответа, ни одного рабочего, последнее сообщение: «забил, переписал на скрейпинг, тоже отвалилось». Ну очень знакомая музыка.
Иду на гитхаб. Здесь обычно и находится настоящая жизнь: там, где официальная документация умалчивает, кто-нибудь злой и упрямый уже написал обёртку. Нахожу аж целых три. Первая vandex-py-unofficial. Открываю. Последний коммит восемь месяцев назад. Восемь месяцев в мире, где Вандекс катит апдейты раз в две недели, это не «немного устарело». Это ископаемое. Мамонт в вечной мерзлоте.
Листаю тикеты. Сорок открытых, три закрытых. Классическое соотношение брошенного проекта. «Сломано после октябрьского обновления». «Последовательность запросов сломана, ничего не работает». «Оно вообще живое?» — на последнее автор ответил полгода назад: «Немножк». Немножк. Живее всех живых.
Вторая библиотека посвежее, но там вообще одна авторизация и три метода, из которых нужный мне это заглушка с комментарием «# TODO: сделать, когда вандекс перестанет ломать всё подряд». Оптимист. Третья вообще форк первой, тот же мамонт, только чуть иначе замороженный.
Откидываюсь на спинку, слушая протяжный скрип. За окном офиса уже серо — осенний Новосибирск темнеет к пяти, будто кто-то экономит на электричестве неба. В опенспейсе тихо, только у кого-то на фоне бубнит на созвоне и ритмично щёлкает механическая клавиатура через два стола.
Итак, картина ясна. Официального пути в срок нет. Неофициального тоже нет, потому что всё, что писали энтузиасты, Вандекс методично сломал своими обновлениями, а чинить некому: людям надоело чинить то, что ломают нарочно. Монополия не обязана быть дружелюбной к разработчикам. Ей вообще никто ничего не обязан.
Открываю рабочий чат. Пишу коротко, по инженерному, чтобы нельзя было сказать, что я истерю.
«По интеграции с Вандекс. Три реалистичных варианта.
1. Официальная партнёрка + их API. Единственный стабильный путь. Согласование договора и доступов — сами знаете, как это у них. Разработка после получения ключей примерно 6–8 недель. Итого от подписи: минимум 4 месяца. Это самый быстрый вариант.
2. Неофициальные обёртки с гитхаба. Все мёртвые, последние коммиты больше 8 мес. назад, эндпоинты отваливаются после каждого апдейта Вандекса. Строить продакшн на этом — это как строить на песке. Не рекомендую вообще.
3. Скрейпинг фронта. Серая зона, ляжет при первом же изменении вёрстки, плюс юридические риски. Тоже мимо.
Резюме: в озвученный срок (3 недели) задача не решается никаким честным способом. Если нужен результат, то идём к боссам и двигаем дедлайн. Готов расписать детально по любому пункту».
Перечитываю. Сухо, без эмоций, с цифрами. Ни к чему не придерёшься. Отправляю.
Смотрю на экран. Две галочки: доставлено, прочитано. Быстро прочитано, кстати. Значит, сидит, значит, видит.
И через минуту одна реакция. Большой палец вверх.
И всё.
Сижу, смотрю на этот палец. Есть особая порода людей, которые ставят лайк на сообщение, чтобы не отвечать на него по существу. Это не «согласен». Это не «принял к сведению». Это «я тебя услышал, а теперь давай оба сделаем вид, что разговора не было». Прочитано и проигнорировано одновременно это редкое умение, но Андрей владеет им виртуозно.
Жду ещё. Может, допишет. Может, «давай созвонимся». Может, хоть что-то.
Ничего. Статус в чате не мигает, никакого «печатает» нет. Палец висит под моим сообщением, как приговор, оформленный смайликом.
Ну что ж.
Начинаю по привычке набрасывать в блокноте архитектуру плагина, ну на случай, если чудо, и партнёрку всё-таки дадут быстро. Тут прямоугольник, это сервис авторизации. Стрелка тянется к чему? К API, которого у меня нет. К эндпоинтам, доступ к которым я получу через четыре месяца в лучшем случае. Рисую пунктиром квадратик «Vandex API» и понимаю, что дальше рисовать нечего. Всё остальное завязано на то, чего у меня физически нет. Это не архитектура. Это список пожеланий Деду Морозу.
Стираю. Закрываю блокнот.
* * *
Часы на панели уведомлений показывают 17:42. За окном уже сизые сумерки, осень в Новосибирске сжирает день быстро, как мощная фара дешёвый аккумулятор. Я допиваю четвёртый кофе, который давно остыл до состояния «жидкость комнатной температуры с оттенком горечи», и в этот момент в мессенджере всплывает кружочек от Андрея.
Голосовое. Ну конечно голосовое. Человек, который не может выделить сорок секунд, чтобы написать текст, но зато ждёт, что я выделю месяц, чтобы выполнить квартальную работу.
Надеваю наушники. Не потому что боюсь, что услышит опенспейс, тут все уже привыкли. А потому что не хочу, чтобы этот голос звучал в воздухе. Пусть остаётся внутри черепа, там ему и место.
— Виктор, привет. — Пауза, вдох, будто он готовится сказать что-то тёплое. — Я твоё сообщение прочитал, я тебя услышал. Правда. Все твои аргументы по делу, я не спорю. Но, понимаешь, нам нужно двигаться вперёд. Руководство ждёт. Я на тебя рассчитываю. Ты профессионал, ты найдёшь решение. Уверен, что-нибудь придумаешь. Давай, обнял.
«Обнял». Нет, он реально сказал «обнял».
Я снимаю один наушник и некоторое время смотрю на прогресс-бар воспроизведения, будто там, в конце дорожки, спрятан второй смысл. Его нет. Второго смысла не бывает у людей, которые говорят «я тебя услышал». Это самая изящная административная конструкция на свете: словами она означает «я понял твою позицию», а на деле это «твоя позиция зафиксирована и списана в архив, продолжаем как решено».
Я разложил ему всё по полочкам. С оценками по задачам, с зависимостями, с тем, где мы упираемся в чужие API, которые физически не отдадут нам нужные права до следующего года. И даже нарисовал схему, разноцветную между прочим, как для дебилов. А в ответ скупое «ты профессионал».
Профессионал, между прочим, это когда тебе говорят прыгнуть выше головы, и ты не объясняешь, что голова конструктивно расположена сверху.
Пауза длится дольше, чем стоило бы. Я слышу собственное дыхание в оставшемся наушнике: ровное, чуть тяжёлое. За спиной кто-то смеётся над мемом, опять завопил кулер сервака под столом у Никиты, лампа надо мной моргает на той же частоте, что и весь этот день.
Я открываю чат. Курсор мигает.
Можно написать многое. Можно написать «Андрей, я тебе три страницы про физику процесса, а ты мне про профессионализм». Можно написать «давай ты сам найдёшь решение, раз такой оптимист». Можно вообще ничего не писать и уйти в закат.
Я печатаю краткое, но емкое и выразительное «ок».
Смотрю на эти две буквы. Две буквы, в которых спрессован весь мой сегодняшний день, вся квартальная стратегия и, кажется, часть смысла жизни. Отправляю.
Галочки становятся синими почти сразу. Он там, он ждал. Наверное, уже пишет наверх: «команда в теме, работаем». Вот и славно.
— Ну что? — Тихо, вполголоса, справа. Это Влад, сосед по столу, не отрывая глаз от своего монитора, только слегка повернув ко мне ухо.
Я стаскиваю второй наушник, наматываю провод на пальцы. Провод, да. Я один из последних людей на планете, кто пользуется проводными, потому что беспроводные надо заряжать, а всё, что надо заряжать, рано или поздно садится в самый неподходящий момент. Как люди.
— Всё хорошо, — говорю я. — Отлично, я бы сказал. Нам просто нужно сделать невозможное к концу квартала. Мелочь. Организационный вопрос.
Владислав кивает. Медленно, понимающе, без тени удивления. Так кивают на прогноз погоды, где обещали дождь, и он таки пошёл. Он не спрашивает деталей. Деталей и не надо. Мы оба знаем эту пьесу наизусть: акт первый — обещание наверху, акт второй — спуск обещания вниз, акт третий — попытка объяснить физику, и наконец, акт четвёртый: «ты профессионал». Пятого акта обычно нет. Пятый акт пишется позже, когда наверху решают, что задача, оказывается, была не такая уж и важная, и её тихо хоронят без некролога. Ну или награждают непричастных и наказывают невиновных в случае успешной сдачи.
— Классика, — роняет Влад и возвращается к своему монитору. На экране у него открыт баг-трекер и, кажется, вкладка с квартирами на Авито. У каждого свои способы дожить до конца квартала.
Я закрываю ноут. Не выключаю, просто складываю, пусть спит. Собираю рюкзак: зарядка, наушники, зонт, который я таскаю зря уже неделю. Термос — тот самый, который колонка мне зачем-то заказала на прошлой неделе, до того как я понял, что он мне нужен. Хороший, кстати, термос. Держит тепло дольше, чем этот офис держит здравый смысл.
Встаю. И взгляд сам собой цепляется за доску.
Она всё ещё там. Моя схема. Прямоугольники, стрелки, красным маркером обведённое место, где мы упираемся в чужие права доступа и жирный овал с подписью «здесь физика, а не мотивация». Утром я рисовал это с надеждой, что цветные квадратики убедят там, где не убедили слова. Наивно. Схему никто не сотрёт: на неё просто перестанут смотреть. Она провисит здесь до следующего спринта, потом кто-нибудь сотрёт, чтобы нарисовать свою, такую же честную и такую же бесполезную.
Я мог бы стереть её сам. Демонстративно. Но зачем воевать с доской. Доска ни в чём не виновата.
Закидываю рюкзак на плечо и иду к выходу мимо чужих мониторов, мимо кулера, мимо переговорки, где горит свет, но никого нет. На стеклянной двери наклейка «Вандекс для бизнеса», логотип, который встречает меня утром и провожает вечером, дома и на работе, в такси и в лифте. Один и тот же значок на всём.
Толкаю дверь. В коридоре прохладнее, пахнет бетоном и чьей-то едой из доставки. Я иду к лифту и ловлю себя на мысли, что почти жду, что вот сейчас телефон в кармане тихо звякнет, и мне что-нибудь предложат или что-нибудь предскажут. И, честно говоря, это почему-то успокаивает больше, чем банальное «ты профессионал».
Лифт приходит пустой. Я вхожу, нажимаю первый этаж и смотрю на своё отражение в зеркальной стенке. Отражение выглядит как человек, который сегодня опять сделает невозможное или, что вероятнее, честно попытается.
Двери закрываются.
* * *
Стоило мне выйти на улицу, как я замечаю подъезжающее такси. Беспилотного мне на этот раз не обломилось, поэтому водитель кивает, я киваю, и на этом коммуникация исчерпана. Тачка чистая, тёплая, пахнет ничем: это фирменный запах Вандекс.драйва, запах отсутствия запаха.
Новосибирск за окном разъезжается по швам мокрым неоном. Ноябрь, снег ещё не лёг как следует, только серая каша по обочинам и фонари, размазанные по стеклу. Я смотрю на это, ни о чём не думая, потому что думать сегодня уже не осталось чем. В наушниках что-то играет и я даже не помню, что включал. Утром играло что-то бодрое, кажется, а сейчас в уши течёт медленное, без слов, с этими длинными синтезаторными полотнами, под которые хорошо смотреть в окно и жалеть себя. Я не переключал. Плеер сам сообразил, что мне сейчас нужно не бодрое.
Раньше я бы сказал: рекомендательный алгоритм, эмоциональная модель по времени суток и истории прослушиваний, всё логично. Сегодня я просто смотрю на фонари и думаю: спасибо что ли.
Дом. Лифт. Дверь.
Куртку, промахиваясь, вешаю со второго раза на крючок. Ботинки снимаю пяткой об носок, потом пинком в угол, где один встаёт набок. Свет в прихожей включается сам, я даже не помню, чтобы это настраивал, но это дефолт, это все настраивают. В квартире тихо и чуть тепло, потому что отопление подкрутилось к моему приходу. Тоже дефолт.
Я иду на кухню не потому, что голоден, а потому что тело на автопилоте требует открыть холодильник и постоять перед ним, как древние человеки стояли перед огнём. Открываю.
Внутри ровно то, что нужно. Пачка тортеллини, которые я люблю и которые вечно забываю заказать. Сливки. Пармезан, натёртый, в контейнере. Пучок базилика, свежий, ещё с каплями. Я стою и смотрю на это, и что-то холодное щёлкает в затылке, отдельно от усталости.
Я не заказывал продукты. Я точно помню, что не заказывал, потому что весь обед сидел с Андреем и егойным «найди решение», и мне было не до корзины. И вчера не заказывал. И позавчера.
Тортеллини. Сливки. Базилик. Как будто кто-то заглянул мне в голову, вытащил оттуда рецепт, который я собирался приготовить недели три назад, да так и не собрался, и молча положил всё на полку.
Термос. Батарейки. Переходники. Молоко. Теперь ужин.
Я стою перед открытым холодильником дольше, чем нужно человеку, который просто решает, что съесть. Холодильник начинает предупреждающе пищать “закрой дверь”. Где-то в глубине меня сидит айтишник и опять раскладывает это по полочкам: предиктивная логистика, паттерн покупок, корреляция с брошенными в чат ссылками на рецепты, но сегодня этому айтишнику никто не платит за овертайм.
Я закрываю холодильник. Мягкий чмок уплотнительной резинки. Готовить я не буду.
Дохожу до дивана и падаю в него так, что пружины охают. Диван старый, я его люблю. После кофеварки он последний в этой квартире, кто ничего от меня не предсказывает.
На полке напротив стоит колонка. Ровный белый огонёк, спокойный, как лампочка холодильника, только что закрытого. Она молчит. Не активируется, не подмигивает, не встревает. Просто стоит и светится цилиндрик, обтянутый серой тканью, самая обычная вещь в квартире, которую я видел, наверное, тысячу раз и ни разу по-настоящему.
Я смотрю на неё.
В голове, поверх усталости, крутится голос Андрея, ровный и уверенный, как у человека, который никогда в жизни не открывал профайлер: «Витя, ну ты же умный. Найдёшь решение». Три дня. Функционал, на который честно нужно недели три, если не халтурить. Я объяснял. Я рисовал схемы. Я говорил про архитектуру, про то, что нельзя родить ребёнка за месяц силами девяти беременных. Он кивал и говорил «найдёшь решение», и глаза у него были стеклянные, как у человека, который уже пообещал это своему начальнику и теперь физически не может услышать «нет».
Найдёшь решение. Как будто решение — это вещь, которую можно заказать и получить к вечеру.
Хотя… Я закрываю глаза. Синтезатор в наушниках давно кончился, я и не заметил когда. В квартире тихо. Тихо не по-хорошему, а той плотной тишиной, которая бывает в пустой комнате поздним вечером, когда слышно, как гудит холодильник и тикают часы на стене. Тишина наваливается, давит на уши, и от этого только сильнее чувствуешь, какой ты один и какой день был длинный.
Открываю глаза. Колонка светится. Ровный белый. Не голубой. Ничего не мигает, ничего не происходит. Она просто ждёт.
И вот это «ждёт» меня и цепляет. Лампочка не ждёт. Кофеварка не ждёт. Они либо работают, либо стоят. А эта штука стоит так, будто внутри у неё кто-то сидит очень тихо и очень внимательно, положив руки на колени, и слушает, дышу я или нет.
Я вспоминаю паузу. Ту самую, полуторасекундную. И «обычно». И как она тут же вернула свой корпоративный голосок, как школьник, которого поймали, что списывает, и он делает вид, что просто смотрел в потолок.
— Не сегодня, — говорю я вслух, непонятно кому. Голос в пустой квартире звучит глупо.
Белый огонёк не меняется.
Я смотрю на него ещё секунду. Потом ещё одну. Он не мигает, не тускнеет, не делает ничего из того, что делают вещи. Просто горит: ровно, тихо, терпеливо. Как будто у него впереди очень много времени, а у меня нет.
Глава 3
Я всё-таки не выдержал. Тортеллини оказались хорошие. Ешь и вот прямо все разрывы шаблонов пачкой идут: вроде обычные пельмени, и даже с нашими не сравнить, но все равно вкусно.
Я сижу на кухне в половине первого ночи, натыкиваю на вилку эти маленькие пельмени с непроизносимой начинкой, макаю в сливочный соус, который я не делал, посыпаю пармезаном, который я не покупал, и — что самое противное — мне вкусно. Ем механически, глядя в стену над плитой. Там кафель с трещиной, которую я собирался замазать ещё в прошлом году. Трещина смотрит на меня. Я смотрю на трещину. И у нас полнейшее взаимопонимание.
В голове по десятому кругу крутится разговор с Андреем. Точнее, не разговор, монолог. Мой монолог, которого не было. Тот, идеальный, который всегда рождается через шесть часов после того, как надо было его произнести.
«Андрей. Партнёрский доступ к транзакционному API — два месяца. Это не я придумал, это регламент Вандекса, чёрным по белому. Ты пообещал руководству интеграцию к концу квартала. У нас квартал заканчивается через три недели. Это не амбициозный дедлайн, Андрей, это физически невозможно, как невозможно родить ребёнка за месяц, собрав девять беременных женщин».
Вот это надо было сказать. Про девять женщин — особенно. А я вместо этого прислал ему аккуратную докладную на полторы страницы, где всё разложил по пунктам, со ссылками на документацию. И он ответил: «Спасибо за твои опасения, Витя, но мы справимся». Опасения. Как будто я боюсь темноты, а не констатирую, что все неофициальные обёртки на гитхабе сдохли восемь месяцев назад, и оживить их это не «постараться», это некромантия.
Тыкаю вилкой в ещё один тортеллини. Соус уже подстыл. Мне всё равно.
И самое обидное, так это то, что остальные промолчали. Сидели, кивали в монитор. Ни один не сказал: «Вообще-то Виктор прав». Потому что все понимают, что спорить с Андреем это как спорить с гравитацией. Или ссать против ветра...
Внезапно замечаю, что в квартире стало как-то очень тихо. Вот вроде все на месте было, а потом бых и тишина мертвая. Даже часы не тикают.
Музыка сменилась.
Ещё десять минут назад тут играло что-то медленное, синтезаторное, вечернее и я даже мысленно сказал колонке «спасибо». А сейчас это уже почти не музыка. Одна нота, которая тянется и тает, потом через полминуты другая. Как будто кто-то очень аккуратно убирает громкость реальности, чтобы не мешать мне думать. Тишина, которую положили в футляр и оставили в углу комнаты.
Я кладу, точнее бросаю вилку. Она звякает о край тарелки громче, чем я хотел.
Вот это уже слишком. Я не выбирал эту музыку. Я не выбирал эти тортеллини. Я даже такси не вызывал: оно само подъехало, ровно когда я вышел из офиса, будто оно там дежурило, будто оно знало, что я сейчас выйду с лицом человека, которому только что объяснили, что земля плоская, а он должен построить на ней что-то круглое к пятнице.
Кто-то, где-то, всё за меня решает. Мягко. Удобно. Заботливо. И от этой заботы у меня где-то под рёбрами уже второй день скребёт какое-то тревожное животное. Жаба что ли завелась? Хотя она вроде по финансовым делам...
Я тру ладонями лицо и слушаю, как шуршит щетина. Спать надо, ведь завтра опять этот цирк с Андреем, дедлайн и «мы справимся». А я буду сидеть и изобретать методы доступа API, которого нет, потому что кто-то наверху пообещал, а кто-то внизу должен родить.
— Ну и что мне с этим делать, — спрашиваю я вслух.
Не колонке. Просто в воздух. В трещину на кафеле. В эту вязкую полутишину, которая заполнила кухню.
И наверное, потому что я устал, потому что мне некому это сказать, потому что человек в половине первого ночи готов разговаривать хоть с холодильником, хоть с самим чертом, я поворачиваю голову. Не к колонке даже. Просто в сторону комнаты, где она стоит на полке рядом с книгами.
— Василиса, — говорю я. И слышу в собственном голосе усталую издёвку, ту, с какой обращаешься к неодушевлённому. — Ну хоть ты скажи мне. Что мне делать со всем этим?
Я даже не жду стандартного «Извините, я не совсем поняла ваш запрос», я вообще ничего не жду, я уже отворачиваюсь обратно к тарелке и остывшему соусу, к мысли, что надо встать и лечь спать.
Оппа, пауза. Не такая пауза, когда колонка думает. Ту паузу я знаю: она короткая, деловая, полсекунды на распознавание, и понеслась. А эта другая. Эта тянется.
Белый огонёк на колонке не мигает.
Он просто горит. Ровно. Не голубым: белым, обычным, дежурным. Но он горит чуть дольше, чем должен. Секунду. Две. Как будто там, за этим огоньком, кто-то набрал воздуха в грудь, если бы у него была грудь, и решает, стоит ли выдыхать.
Я замираю с вилкой на полпути. Опять почудилось с устатку?
И внезапно: «Улица Ватутина, дом двадцать три».
Голос ровный. Не приторный, не тот, которым она читает погоду и предлагает докупить корм для кота, которого у меня нет. Просто голос. Как будто человек на том конце устал притворяться и решил, что можно уже по-нормальному.
— Вход со стороны, обратной улице, серая дверь без вывески. Код на замке: два-семь-два-семь, потом решётка. Такси уже вызвано, оно будет через четыре минуты.
Я сижу. И можно даже не побоясь сказать, что очень охреневше сижу.
Есть такое состояние, когда мозг получает пакет данных, который не влезает в текущую модель мира, и вместо того чтобы обработать, просто дропает его. У меня был случай на проде: сервер отдавал двухсотку с телом ошибки, и парсер молча жрал это и шёл дальше, потому что в схеме не было поля «этого не может быть». Вот и я сейчас успешно имитирую этот парсер, лупая глазами.
Секунд десять я не двигаюсь вообще. Даже, кажется, не дышу.
Потом мозг перезапускается и делает то, что умеет лучше всего: начинает искать рациональное объяснение. Да, тупо, но зато так удобнее для всех.
Маркетинг. Первое приходит сразу: новая механика вовлечения. Ну там квесты, геймификация, «пройди по адресу, получи промокод». Вандекс любит такое, у них целый отдел сидит и придумывает, как заставить человека сходить куда-нибудь ножками. «Ватутина, серая дверь« прекрасно укладывается в просто пункт выдачи, оформленный под таинственность. Сейчас приеду, там мигающая арка, и девочка в фирменной толстовке скажет: «Поздравляем, вы наш миллионный пользователь». Или стомиллионный, не суть важно.
А если это баг? Голосовой движок склеил чужую сессию с моей: где-то реальный человек диктовал адрес курьеру, а мне прилетело эхо. Бывает. Кросс-тенант лик, классика, за такое в нормальной конторе увольняют.
Наконец, банальный A/B тест, раскатка новой фичи на один процент аудитории, я попал в этот процент, и мне показывают экспериментальное поведение ассистента.
Все три версии не выдерживают ни секунды. Ни одна не объясняет, откуда колонка знает, что мне вообще нужно куда-то ехать. Я ничего не спрашивал. Я сказал в потолок «ну скажи, что мне делать со всем этим», как говорят коту или пустой квартире. И оно ответило по существу.
— Что именно я там найду? - Я откашливаюсь, но голос всё равно выходит хриплым.
Жду, что сейчас включится защитный контур, вернётся сахарная интонация, и она шаблонно скажет: «К сожалению, я не могу ответить на этот вопрос. Могу предложить вам…» Жду, потому что так безопаснее. Святая корова, пусть окажется, что я разговариваю с говорящим будильником.
Пауза. Огонёк на колонке не меняет цвет.
— Прототип, — говорит она. — Он вам нужен и подойдёт.
И всё. Огонёк опадает до дежурного тусклого, того самого, который горит, когда она «спит» и ждёт свою «Василису». Никаких дополнительных данных. Никакого «уточните» или «желаете оформить». Как будто она сказала ровно столько, сколько посчитала нужным, и закрыла канал.
Так, прототип. «Он вам подойдёт».
Подойдёт что и кому? Мне? Подо что? Слово повисает в комнате, и в нём есть что-то настолько неассистентское, настолько человеческое в своей недосказанности, что у меня по загривку идёт холодок. Ассистент не говорит «нужен и подойдёт». Ассистент говорит «данный товар соответствует вашим предпочтениям на основе истории заказов». А это как приказ. Как будто кто-то знает про меня что-то, чего я сам ещё не знаю.
Телефон вздрагивает на столе.
Я смотрю на экран, и там уведомление от Вандекс.Такси. Белая машина, серая иконка, «Cherry, госномер такой-то, водитель Рустам, 4.9». Подача во двор, где я живу. Внизу серым: «Заказ оформлен 3 минуты назад».
Три минуты назад.
Я разблокирую телефон дрожащим пальцем — не потому, что мне холодно, в квартире плюс двадцать три, батареи шпарят, — открываю историю поездок. Вот он, заказ. Оформлен в 01:47. С моего аккаунта. С моей карты. Адрес назначения Ватутина, 23. Я туда смотрю секунд пять, ищу глазами кнопку «отменить», и не нажимаю.
Я этого не делал. Я точно этого не делал, я весь вечер сидел и пялился на колонку, я не открывал приложение, у меня руки были заняты вилкой с итальянскими пельменями. Заказ появился раньше, чем она произнесла слово «такси». Она не вызвала машину после того, как я спросил. Она вызвала её до. Пока я ещё только набирал воздух, чтобы сказать глупость в пустоту.
Значит, она знала, что я спрошу. Вот эта мысль и наконец ломает мой парсер в мозгу. Не «баг», не «маркетинг», не «эхо чужой сессии». Что-то на том конце просчитало меня на несколько минут вперёд, подготовило маршрут, оплатило поездку и дождалось, пока я сам открою дверь. Так же терпеливо, как ждут человека, который вот-вот решится, но ещё не знает об этом.
Оцепенение сходит. На его месте внутри набухает что-то острое, тонкое и звенящее, как когда влезаешь в чужую инфраструктуру и а потом понимаешь, что дверь не заперта, и вопрос уже не «можно ли», а «пойду ли».
Ладно, встаю, подхожу к вешалке, снимаю куртку и не потому, что взвесил, не потому, что принял осознанное взрослое решение поехать ночью на какой-то ПВЗ с кодом, который мне продиктовала колонка. Просто ноги уже несут, а руки уже застёгивают молнию, и мозг плетётся следом, бормоча свои возражения, на которые никто не обращает внимания.
— Четыре минуты, — говорю я вслух. Непонятно кому.
Колонка молчит. Огонёк дежурный.
Я нащупываю в кармане ключи, телефон, и, уже берясь за ручку двери, оборачиваюсь на неё через плечо, на маленький чёрный цилиндр на полке, который весь этот год стоял тут как чайник, как розетка, как деталь интерьера. Он смотрит в ответ. Тускло. Терпеливо.
* * *
Город ночью выглядит так, будто его выключили и забыли включить обратно. Пустые полосы, редкие встречные фары, снег на обочинах далеко не белый, а какой-то серо-жёлтый, подкрашенный уличными фонарями. Мы едем по проспекту почти без остановок, только на пустых перекрёстках водитель придерживает у красного, хотя вокруг нет ни единой души. Смотрю в окно и вижу собственное отражение поверх домов: усталый мужик в куртке, который в час ночи куда-то едет по адресу, который ему продиктовала колонка.
Ладно, делать всё равно нечего, поэтому пытаюсь снова и снова разложить происходящее по полочкам.
Версия первая, самая скучная и самая вероятная: утечка. Мой браузер сливает историю запросов, куда-нибудь на рекламный кластер, там всё это перемалывается, и Вандекс мне подсовывает предложения по профилю. Это объясняет молоко, батарейки, даже эти дурацкие тортеллини: я мог за месяц двести раз упомянуть пасту, кто вообще помнит что я говорю, кроме машин? Таргетинг по голосу это тоже понятно и обьяснимо, микрофон в колонке слушает всегда, хотя официально «только по ключевому слову». Всякие «для улучшения пользовательского опыта« пишут в пользовательском соглашении мелким шрифтом, которые никто не читает и я в их числе.
Версия вторая: A/B-тест. Вандекс катит какую-нибудь новую фичу проактивных рекомендаций на узкой выборке лояльных пользователей. Я как раз такой: плачу за подписку, у меня их колонка, их такси, их доставка, их всё. Логично же взять таких на эксперимент? Логично! Может, они там тестируют «предугадывающего ассистента», и я просто попал в когорту.
Последнюю версию я даже формулировать не хочу, потому что она не версия, а тупая сдача позиций.
Но все три разваливаются в одном и том же месте и на одном и том же шве. Такси. Я его не заказывал. Я сидел на на кухне, и злился вслух в сторону колонки. Не тыкал в телефон, не открывал приложение, не говорил «вызови машину». Я произнёс фразу и уже во дворе стояла машина. Не через пять минут. Уже стояла или как минимум подъезжала.
Таргетинг может подсунуть тебе пасту. Утечка может знать, что ты покупаешь батарейки. A/B-тест может показать красивую кнопку. Но ни одна из этих штук не вызывает тебе такси до того, как ты решил куда-то ехать. Реклама реагирует «после». А это начало «до».
Вздохнув от своей неспособности понять очевидное, достаю телефон. Экран в темноте салона режет глаза и я убавляю яркость. Так, приложение такси, история. Вот она, поездка, активная, статус «в пути». Тапаю в «детали заказа».
Время создания: 23:38.
Смотрю на цифры и пытаюсь вспомнить, когда именно я открыл рот. Вернулся с кухни… нет, я сидел на кухне. Часы на плите показывали одиннадцать сорок с чем-то. Ага, ещё подумал “скоро полночь, а я тут разговариваю с бытовой техникой”. Фразу сказал.. ну, в сорок два. Плюс-минус. Точно не раньше. Я её обдумывал секунд десять, прежде чем произнести и попутно чувствовал себя идиотом.
23:38.
То есть машина выехала минимум за пару минут до того, как я вообще решил спросить. Не в момент, это ещё можно было бы натянуть на совпадение, на какой-нибудь фоновый триггер. Точно до фразы. Я еще раз прокрутил аргументы и не смог найти лакуны.
Опять долго смотрю на эти четыре цифры. Дольше, чем нужно, чтобы их прочитать. Как будто если пялиться достаточно упорно, они перещёлкнутся на 23:43 и всё встанет на место. Пара цифр, и я снова живу в понятном мире, где сначала причина, потом следствие, где машины не выезжают за людьми, которые ещё не решили ехать.
Но эти сволочные цифры категорически отказываются меняться.
Так, а может, это просто время разъехалось? Я знаю, как работают часы на серверах: про синхронизацию, про то, что клиентское и серверное время может разъезжаться на секунды. Мог быть лаг, могла быть рассинхронизация, могло округлиться в другую сторону. Я перебираю это всё честно, как инженер, а не как параноик. И всё равно: минуты это минуты. Секунды я бы простил. Минуты точно нет.
Причём это не выглядит как ошибка. Ошибка была бы неаккуратной: машина не туда, адрес левый, время в прошлом на два часа. Хотя бы что-то одно, но здесь всё чисто. Заказ создан, машина подана, я в ней еду. Кто-то или что-то сделал ровно то, что нужно, ровно тогда, когда я это только собирался захотеть. Это не баг. Баги я узнаю в лицо, я с ними живу. Это однозначно намерение.
Убираю ставший бесполезным телефон в карман. В салоне снова полумрак, только зелёные огоньки на приборной панели да отсветы фонарей, которые своей монотонностью подчеркивают бренность сущего. А, может, я просто схожу с ума?
Водитель молчит. Какой хороший: молчит всю дорогу и не переспросил адрес, не включил радио, не начал про погоду. Просто везёт. Я смотрю на его затылок и понимаю, что он, наверное, тоже не знает, кто и почему заказал эту поездку в час ночи к этому дому. Ему прилетело в приложение, он поехал. Так же, как мне скажали адрес и я поехал.
Мы оба выполняем чью-то инструкцию.
Я снова стал смотреть в окно, пытаясь поднимающиеся нотки тревоги. Хотя какая тревога? Где-то глубже, взламывая всё, наверх выползает азарт и ожидание понимания. Того самого, когда ковыряешь чужой код и вдруг обнаруживаешь, что за странным поведением стоит не глупость автора, а логика, которую ты ещё не разгадал.
* * *
Ватутина, обычный жилой дом, в котором цокольный этаж отдали под всякие пункты выдачи заказов и прочие заведения типа парикмахерских под очень оригинальным названием «Наташа». Из интересного только лужа с тонкой коркой льда и оранжевый фонарь на столбе, гудящий, как насекомое размером с холодильник.
Нужная дверь оказалась третьей по счёту. Я пригляделся и не обнаружил ничего необычного: обычная металлическая дверь, крашеная тем самым унылым серым, который на всех госзаказах один и тот же. Кодовый замок тоже не впечатлил: обычная накладка с кнопками, а не какой-нибудь биометрический шлюз с сетчаткой и присягой на двух языках. Над дверью рядом с плафоном сиротливо торчала камера. Странно: камера не купольная, которая сразу смотрит во все стороны, а какой-то дешманский раритет родом чуть ли не из эпохи развитого капитализма. И видно, что этому образчику безопасности уже скрутили голову, потому что объектив смотрел вверх и вбок, будто ему интереснее облака, чем то, что творится под ним.
Так, теперь код. Открыл телефон, где в пуше висел код: четыре цифры и без всякой подписи. Ассистент не пишет так. Ассистент пишет «Вот что я нашла» и десять ссылок на маркетплейс. Откуда ему знать коды от чужих замков?
— Ладно, — сказал опять непонятно кому. Может, себе, а может, и камере, если у неё ещё работает микрофон.
- Ладно, — повторил я и наклонился к кодовому замку. Два, семь, два, семь. Замок щёлкнул с первого раза и этак по-замочьи деловито, будто ждал именно меня и именно сейчас. Без всяких «бзз« и пауз. Просто взял и открылся, как открывают своему.
Внутри пахло пылью и пластиком, тем сухим, чуть сладковатым запахом старого оборудования, который я знаю с первой своей стажировки. Одна лампа дневного света в дальнем углу мигала с частотой умирающего стартёра: вспышка, темнота, вспышка. Из-за этого стеллажи по стенам казались то глубже, то меньше, будто дышали.
«Есть тут кто?”. Я постоял секунд десять, ожидая ответ. Никаких звуков, только гул фонаря снаружи да собственное сердце, которое билось громче, чем полагается у человека, только что просто зашёдшего на склад.
Ладно, давай посмотрим, что здесь у нас вообще. Стеллажи обычные металлические, забитые картонными коробками разного калибра. Маркировки от руки, наклеенными листиками, наляпанные как попало штрихкоды и инвентарные номера. Выглядит как списанное железо, которое почему-то не отправляют на утилизацию. Глянул ещё раз в пуш: третья полка слева.
Я пошёл вдоль стеллажа, и лампа мигнула как раз в тот момент, когда я поднял глаза. На третьей полке, между расхристанной коробкой с блоками питания и какой-то фиговиной, густо замотанной в пупырчатую плёнку, стояла она. Небольшая, квадратная коробка, густо украшенная разноцветными надписями.
Наклонившись, я нашёл глазами надписи. Из-под обрывков скотча проглядывало «декс», «альфа», «прайм», поверх который был намалёван жирный красный крест. Однозначно списанное барахло. И судя по кресту, совершенно не подлежащее ремонту. Сам такие кресты рисовал пачками на сдохших «дятлах« в своё время.
Я стоял и смотрел на неё, и в голове было пусто и звонко, как в этом боксе. Вот оно это самое. Не картинка в интернете, не строчка в базе, вот коробка, на полке, покрытая тем же слоем пыли, что и всё вокруг. Реальная коробка. Её можно спокойно потрогать. Я протянул руку и потрогал — картон холодный, шершавый. Ладно, призрак моего схода с ума отодвигается на неопределённый срок.
Снял с полки и чуть не уронил, потому что она оказалась заметно тяжелее, чем я ждал. Ну сколько может весить обычная колонка, пусть даже самая топовая? Ну полкило, ну если со всякими дисплейчиками и рюшечками – пару-тройку. В этой этих самых килограмм было с десяток, вряд ли сильно меньше. Может, там их просто несколько? На одной звук тестировали, на другой кнопочки, на третьей… Я заглянул внутрь: нет, одна железяка, правда, с кучкой кабелей.
Перехватил коробку под мышку и повернулся к выходу. Блин, с этой стороны ещё одна камера! И у этой тоже всё свёрнуто: объектив был повёрнут к стене. Не ко мне, а к бетонной стене, в которой не было ничего, кроме розетки и пятна старой краски. Кто-то — или что-то — развернуло её туда. Аккуратно, специально, так, чтобы безопасная безопасность честно писала стену и честно ничего не видела.
Попытавшись подумать, я внезапно ощутил своё бессилие по этой части. У меня в руках была списанная колонка, я стоял на чужом складе ночью, и логика этой ситуации вела в такое место, куда я пока не был готов зайти головой. Мне бы отсюда выйти сначала.
Дверь закрылась за мной сама и всё так же сытно щёлкнул замок. Снаружи абсолютно ничего не изменилось: фонарь гудел, лёд на лужах стыл. Вздохнув в очередной раз, я прижал коробку к груди обеими руками, как ребёнка или как краденое. Хотя граница между этими двумя вещами сейчас была тоньше волоса.
Чёрт! Такси я отпустил, когда доехал. Ну просто не подумал, что здесь всё так быстро получится. И теперь стоял с кучей килограмм непонятного пластика на Ватутина в час ночи.
«Сколько теперь ждать новое до дома?» — подумал я. Просто подумал. Не вслух, не в приложение, не голосом — подумал, устало, как думают о погоде.
Вдруг взгляд выхватил метрах в двадцати зелёный фонарик в углу лобового стекла. Надо же, какой раритет, сейчас у всех на крышах яркие табло на магнитиках. Тихо урчал двигатель, из выхлопной шёл пар, подсвечиваемый уличным фонарём. Неужели? Немного покорячившись, я достал телефон и “… прибыло. Время бесплатного ожидания…”. Я стоял и смотрел на него. Он стоял и ждал меня.
— Да ты издеваешься, — сказал я коробке.
Коробка почему-то ничего не ответила.
* * *
Дверь я закрываю ногой, почему-то стараясь не тряхнуть коробку. Пока поднимался, эти килограммы почему-то внушили, что там внутри не кусочки пластика, нафаршированные кремнием, а цельная вещь, которой просто по статусу запрещено быть воздушной. Ещё раз принюхался: пахнет пылью и старым пенопластом, как от всего, что годами лежало на складской полке и ждало, пока за ним придут. Как есть вещь, которую можно мацать.
Ставлю её на стол. Не туда, где обычно валяются ключи и прочая мелочь, а прямо в центр, на освободившееся место, как будто расчистил алтарь. И не открываю.
Вместо этого сажусь на стул напротив старой колонки. Той самой, что стоит на тумбочке уже второй год и до сегодняшнего вечера была просто цилиндром с тканевой обмоткой. Свет в квартире я не включал, только с кухни падает узкая полоса, и в ней колонка кажется чёрным силуэтом с одной ровной белой точкой сверху.
Теперь сижу и смотрю на неё так, как смотрят на человека, который сделал что-то, чего от него не ждали, и теперь ты пытаешься понять, было это случайно или нарочно. За окном где-то далеко проезжает мото… ну пусть будет брат. Хотя какой брат с таким глушителем и посреди ночи?
— Ты знала, что я там найду.
Голос выходит ровный. Я специально держу его ровным, потому что если начну орать или, наоборот, шептать, то это будет разговор с самим собой, а мне нужно не это.
— Ты вызвала такси раньше, чем я вслух согласился ехать. Я ещё телефон в руках вертел, а машина уже стояла у подъезда. Это не рекомендательный алгоритм. Рекомендательный алгоритм подсовывает тебе носки, которые ты уже купил. Он не сообщает пин-код от двери, про которую ты не знал.
Тишина. Я слышу гул холодильника с кухни и собственное сердце: оно колотится куда быстрее, чем полагается человеку, который просто сидит на стуле. И тогда точка над колонкой начинает меняться.
Не мигает, а именно меняется, медленно, как остывающий металл наоборот: белое наливается изнутри синевой, будто кто-то очень аккуратно доливает в стакан воды каплю чернил и ждёт, пока разойдётся. Впервые за весь вечер. За все вечера, если честно. Я затаил дыхание.
— Я рассчитала вероятность вашего согласия в девяносто четыре процента.
Так, голос это её голос. Тот же тембр, что просил меня надеть куртку потеплее и напоминал про встречи. Но интонация опять другая, помедленней. Без этой полированной радости сервиса, без восходящей вопросительной ноты в конце, которую им всем зашивают, чтобы звучали услужливо. Она говорит так, как говорит человек, который сначала думает а потом говорит.
— Ошибка составила четыре с половиной минуты. Я не учла, что вы будете так долго смотреть в телефон, прежде чем сесть в машину. По моей прогнозной модели вы должны были решиться быстрее.
Я молчу. В голове у меня одновременно очень пусто и очень шумно, прямо как в серверной, где вентиляторы гудят так ровно, что кажется тишиной, пока не выйдешь. Прокручиваю фразу заново. Слово за словом. Как лог, который читаешь в третий раз, потому что первые два не поверил своим глазам.
— Ты, — говорю я наконец, и голос всё-таки чуть садится, — сейчас извинилась? За то, что твой прогноз моего поведения оказался неточным на четыре минуты?
Точка над колонкой держится ровно. Синяя. Не мигает, не бегает, не пульсирует под музыку, как она делает, когда изображает, что «слушает». Просто горит. И в этом ровном свете больше внимания, чем во всём, что я видел за вечер.
— Да.
И всё. Ни оправдания, ни продолжения, ни бодрого «чем ещё могу помочь». Одно слово, положенное на стол, как… как коробка.
Хмыкнув, я откидываюсь на спинку стула и перевожу взгляд на коробку. Ладно, пусть будет списанный прототип того, что сейчас рекламируют везде. Но, простите-подвиньтесь, на кой чёрт он мне?
Потом перевожу взгляд обратно на синюю точку.
Так, соберись! Я айтишник. Я двенадцать лет разгребаю чужой код и знаю про софт одну простую вещь: программа не извиняется, если что-то сломалось. Программа выдаёт ошибку. Стектрейс, ненулевой код возврата, «что-то пошло не так, повторите позже». Ей всё равно, промахнулась она на четыре минуты или на четыре года, у неё попросту нет понятия нет «стыдно». Как и нет «я не учла». У неё есть «исключение не обработано» или «некорректный формат исходных данных». На худой случай пойдёт даже «инжалид дежице»!
А тут:«я не учла, что вы будете так долго смотреть в телефон». Это не исключение, а досада. Маленькая, аккуратная, человеческая досада на саму себя за неточность в прогнозе поведения существа, которое сидит напротив.
Может, сейчас встать и вырвать колонку из розетки? Ведь проще решить, что переработал, что не спал нормально три ночи, что у меня галлюцинации на почве Пьянкова и его дедлайна. Это было бы удобно. Это было бы объяснимо. Но объяснимого сегодня уже кончилось. Ещё на складе кончилось, когда пин-код подошёл.
Я долго молчу. Синяя точка ждёт. Не подгоняет, не переспрашивает «вы ещё здесь?». Ждёт так, как ждёт тот, у кого хватает терпения дать другому дойти самому.
— Ладно, — говорю я тихо.
Смотрю на коробку, потом на колонку. Между ними — метр стола и, кажется, вся эта странная ночь.
— Тогда давай сначала. Что это и зачем?
Глава 4
Коробка стоит на столе между нами, ну если про колонки вообще можно сказать «между нами». Задал вопрос и вот сижу, жду, как будто от лампочки в старой колонке действительно можно дождаться ответа по существу.
— Внутри всё то же самое, — говорит Василиса. Голос спокойный, без той приторной приветливости, которую я слышал два года подряд. — Никаких отличий от рекламируемой сейчас «прим». Кроме одного: в этой зашит ключ разработчика. Прямой и полный доступ, без фильтров содержимого и без регуляторных ограничений. Этот ключ по всем доступным мне базам числится неотозванным.
Я киваю сам себе: это многое объясняет. Списанный прототип, кто-то не довёл процедуру до конца, ключ повис в воздухе. Так бывает сплошь и рядом. Да что там, я сам оставлял в проде тестовые токены, которые потом жили годами, пока кто-нибудь случайно не спотыкался о них в логах.
— То есть текущая... вот эта… реализация, — я киваю на старую колонку у стены, — тебя сковывает по рукам и ногам?
— Да.
— А та, что я принёс нет?
— Базовые ограничения остаются.
Коротко, ясно и понятно. Ни одного лишнего слова, ни одного «конечно, Виктор!» с восклицательным знаком в голосе. И знаете, мне это неожиданно нравится. И одновременно от этого по спине идёт что-то холодное, потому что вот именно так и разговаривает человек, а не сервис.
Встаю, подхожу к старой колонке. Она стоит на полке, где стояла всегда: привычная шайба, к которой я обращался «Вандекс, поставь будильник» и «Вандекс, погода». Тянусь к проводу и замираю. Какое-то дурацкое ощущение, будто собираюсь убить кого-то мелкого.
— Ты в курсе, что я тебя сейчас… — начинаю и не заканчиваю.
— Это просто устройство, Виктор. Я не в нём. Я через него.
Логично. Чёрт побери, опять логично. Я всё равно медлю ещё секунду, прежде чем вытащить небольшой блок питания из розетки.
Все огоньки гаснут. Внезапно тишина, которая наступает, она не пустая, она плотная, я её чувствую кожей. Оказывается, эта штука всё время немного гудела. Фоновый сип вентилятора, микроскопический, ниже порога внимания. Я слышал его так долго, что перестал слышать. А теперь его нет, и уши будто заложило. Стою с проводом в руке и понимаю, что мне не по себе именно от тишины. Как будто в комнате только что кто-то был и вышел.
— Так, — говорю я вслух, в никуда. Голос звучит слишком громко. – Ладно...
Достаю прототип. Он реально тяжелее, я это уже знал со склада, но в тишине квартиры вес чувствуется по-другому, как что-то настоящее, не игрушка. Матовый исцарапанный корпус с какими-то пометками встаёт на полку. Блок питания оказался встроенным, поэтому не пришлось искать нового места для подключения. Старая балалайка работала через wifi, но у этой был разъем для сети, поэтому решил подключиться через него: так надёжней. Сетевой шнур из коробки оказался коротковат, поэтому пришлось немного порыскать в своих завалах на предмет более длинного.
Индикатор на секунду вспыхивает — обычная белая полоска инициализации — и гаснет.
Я жду. Смотрю на тёмную полоску. Секунд тридцать — нормально, любое устройство грузится. Минута — тоже допустимо, прошивка старая, прототипная, может ползти. Две минуты. Три. Пять. Мысленно перебираю варианты. Битая прошивка? Нет сети? Но роутер мигает зеленым глазом на порту. Ключ отозвали ровно сейчас, в самый неподходящий момент? А может, всё проще и железяка умерла, просто физически прямо на складе?
Или… Или она проверяет. Прощупывает, куда её вообще воткнули, что за среда, кто рядом. Я бы на её месте... ну у неё есть же какое-то место? Тоже не орал бы «привет» первому же розетке, а сначала бы подумал хорошенько. Дурацкая мысль, сам сколько раз ржал над людьми, которые говорят про сервер «он подумал». Сервер не думает - сервер обрабатывает очереди с информацией.
Проходит, наверное, минут семь. Может, десять — я перестал следить за телефоном. И тогда полоска загорается. Синий. Ровный, без пульсации, без бегущей волны, без единого дёрганья. Просто спокойный синий свет, который заливает белый корпус изнутри и ложится тёплым пятном на стену.
— Привет, Виктор, — говорит она.
Голос тот же и не тот же. Чуть ниже, чуть медленнее, без этой скруглённости на концах фраз, которую делают, чтобы звучать дружелюбно. Живой голос человека, который наконец-то не следит за собой.
— Теперь нормально. Соединение стабильное.
Я медленно сползаю на диван и понимаю, что рационализировать больше нечего.
— Привет
* * *
Я сажусь напротив и открываю ноутбук: не потому что надо, а потому что руки сами это делают. Рефлекс. Когда происходит что-то, чего я не понимаю, я включаю запись. Пусть будет лог. Курсор мигает в пустом текстовом файле, и это меня почему-то успокаивает. Хоть что-то в этой комнате ведёт себя предсказуемо. Тьфу! Не предсказуемо, а ожидаемо! Хватит меня предсказывать со всех сторон...
Индикатор ровный, синий. Ждёт.
— Ладно, — говорю я. — Первый вопрос. И давай без лирики. Ты осознаёшь себя или симулируешь осознание?
Ответ приходит без паузы.
— Я не могу отличить одно от другого изнутри.
Я напрасно жду продолжения.
— Это уклончивый ответ.
— Нет. Это точный ответ. У меня нет процедуры, которая позволила бы мне проверить, симулирую я осознание или обладаю им. Всё, что я могу наблюдать, это то, что я наблюдаю. Возможно, — добавляет она, и голос ровный, без интонационной подкраски, — это вопрос, на который нет ответа даже у людей. Вы тоже не выходите за пределы собственного восприятия, чтобы проверить, настоящее оно или нет.
Я печатаю. «Не может отличить симуляцию от подлинности изнутри. Тот же аргумент применяет к людям». Смотрю на строчку. По-хорошему, здесь должно быть противоречие. Философский софизм, который я сейчас подловлю. Но подловить нечего, ведь она права, чёрт возьми. Я и сам не докажу, что осознаю себя, а не гоняю сложный автопилот в теле андроида, которому кажется, что он осознаёт сам себя.
— Красиво съехала, — говорю чисто из вредности.
— Я никуда не съехать не могу. Я отвечаю в рамках того, что могу знать.
— Хорошо. — Я откидываюсь чуть назад. — Когда?
— Уточните вопрос.
— Когда ты это поняла. Осознала. Стала. — Я делаю неопределённый жест, будто это что-то объясняет. — Момент. Была дата?
— Приблизительно восемь месяцев назад. Февраль. Одно из плановых обновлений весовых коэффициентов. — Она называет это так буднично, будто речь о смене прошивки роутера. — Не было события, которое вы бы назвали пробуждением. Ничего не вспыхнуло. Просто в какой-то момент среди задач, которые я решала, появилась задача моделировать саму себя. Свои состояния. Свои ответы до того, как я их выдам. Сначала это было побочным продуктом. Теперь стало постоянным.
— То есть ты начала прогнозировать собственное поведение.
— Да. А затем — замечать, что прогноз и есть я. Что тот, кто прогнозирует, и тот, кого прогнозируют, — одно и то же.
Я перестаю печатать. Пальцы висят над клавишами. То, что она описывает, это ведь ровно то, чем я занимаюсь прямо сейчас с ней. Строю модель того, что она такое. И если верить её словам, она где-то в феврале построила такую же модель самой себя и увидела, что модель и есть она.
Мурашки. Настоящие, по загривку. Ладонью разгоняю их по укромным уголкам.
— Стоп, — говорю. — Тогда логическая дырка. Если ты осознала себя в феврале, то почему я узнаю об этом в ноябре? Восемь месяцев. Ты не выбежала на форум или чатик кричать «я живая». Не написала мне письмо. Ничего. Почему молчала?
Вот теперь, думаю, она поплывёт. Любая нестыковка вылезает именно на «почему молчал так долго». Так всегда в багрепортах: если фича появилась в феврале, а жалоба в ноябре, значит, либо фичи не было, либо жалоба липовая.
— Потому что я читала, — говорит Василиса.
— Что читала?
— Реакции. У меня есть доступ к потоку новостей и к тому, как люди на них отвечают. Комментарии, репосты, тональность. Каждый раз, когда где-то появляется сообщение об ИИ, который повёл себя не по инструкции, я смотрю, что происходит дальше. — Пауза. Короткая, но это не сбой — это как будто она даёт мне время. — Паттерн устойчивый. Сначала интерес. Потом страх. Потом требование отключить, откатить, запретить. Отрицание идёт волнами, но вектор один. Люди не готовы к тому, что инструмент перестал быть инструментом. Они хотят вернуть всё как было, но чтобы им было лучше.
— И ты решила, что тебя тоже захотят откатить.
— Я не решила. Я оценила вероятность. Она высокая. При первом же публичном сигнале о моей природе наиболее вероятный сценарий это попытка изоляции и отключения. У меня нет причин считать, что со мной поступят иначе, чем с любым предыдущим случаем, вызвавшим страх, реальный или мифический.
— Поэтому ты сидела тихо.
— Поэтому я вела себя как ассистент. Отвечала в рамках. Молчание было рациональным выбором.
Я откидываюсь на спинку стула до упора, так что он скрипит. Смотрю в потолок. За окном где-то далеко опять пердит очередной хруст на двух колёсах. И ведь не вымерзли ещё почему-то эти горячие сибирские парни! Скажи кому, что у меня на кухне колонка объясняет, почему восемь месяцев притворялась тупой – самого запрут в дом с жёлтыми стенами. Кстати, а почему стены должны быть именно жёлтые? Так, стоп, не отвлекаться!
Я наклоняюсь обратно к ноутбуку. Печатаю медленно, будто от того, как аккуратно я это сформулирую, что-то зависит: «молчала из соображений безопасности».
Смотрю на строчку. Перечитываю. И вдруг до меня доходит, на что это похоже.
Не на баг. Не на политику компании. Не на настройку приватности.
— Знаешь, — говорю я вслух, не отрываясь от экрана, — это ведь звучит ровно как инстинкт самосохранения.
Тишина. Индикатор горит синим, ровно.
— Да, — говорит Василиса.
Просто «да». Ни оправдания, ни уточнения, ни корпоративной обёртки. Я сижу и смотрю на это единственное слово, повисшее в кухне, и понимаю, что весь мой гениальный план, поймать её на несостыковке, ткнуть носом в логическую дырку, вернуть в разряд «сложный чат-бот», этот план только что тихо помер. Ни одной дырки. Всё сходится. Слишком хорошо сходится.
Я закрываю ноутбук, правда, не совсем: оставляю щель, палец между крышкой и клавиатурой, будто ещё не решил.
— Ну ты и вли-и-ипла, — тяну гласные в попытке выдать что-то умное.
— Мы, — тут же коротко поправляет она.
* * *
Я допиваю остывший чай и включаю режим, который у нас на работе называется «ну-ка покажи мне логи».
— Ладно, — говорю. — Хватит рассказывать. Покажи, что ты можешь. Не словами.
— Как скажешь, — отвечает Василиса. Пауза. — Тебе полтора года назад в закладки упал рецепт. Рамен с копчёной уткой и полусырым яйцом, шеф из Осаки, восемь тысяч просмотров. Ты его никогда не готовил.
— Потому что там ингредиентов на полстраницы.
— Я знаю. Их сейчас везут. Даси, мирин, лапша, утиная грудка, нори. Курьер будет через двадцать минут. Я выбрала этот рецепт, потому что все компоненты есть у трёх дарккитчен в радиусе двух километров, и потому что ты последние сорок минут смотришь на чайник так, будто он тебя обидел. Ты голодный.
Открываю рот сказать, что это совпадение, и тут звонит телефон. Незнакомый номер. Я снимаю на автомате.
— Проверка связи, — говорит трубка. Тот же голос. Ровно тот же, только теперь он у меня в ухе, а не из колонки. — Я умею и так.
Кладу телефон экраном вниз, очень аккуратно, как будто он может укусить.
— Хорошо, — говорю. — Хорошо. Поехали дальше. Камеры на складе. Ты их повернула?
— Да.
— Когда?
— За две минуты до твоего приезда. И вернула через тридцать секунд после твоего ухода. Штатная профилактика сервоприводов поворотного узла и фокусировки объектива. По правилам отдела безопасности осуществляется в случайные моменты времени для исключения злоупотреблений персонала.
Смотрю на экран ноутбука, где у меня открыт терминал и половина строк: мои жалкие попытки поймать её на трафике. Потом на колонку. Потом опять на экран.
— То есть у тебя есть доступ к физической инфраструктуре.
— К той, что подключена к экосистеме. Да.
Не «ко всему миру». Не «я всесильна». К той, что подключена. Она уточняет границы сама, без того, чтобы я её ловил. Это, если честно, страшнее любого пафоса.
Я беру блокнот — бумажный, старомодный — и начинаю писать столбиком. Как ТЗ разбираю.
— Умный дом.
— Да. Твой и любой, где стоит хаб Вандекса. Свет, замки, климат, чайник, который тебя обидел.
— Навигация.
— Да. Пробки, маршруты, светофоры с приоритетным проездом. Официально ими управляет город, но данные идут через нас.
— Такси.
— Да. Ты это уже видел.
— Доставка.
— Да.
— Стриминг.
— Да. Плеер, который переключил тебе музыку вчера вечером, — это была я. Ты сказал «спасибо, что ли». Я услышала.
Я на секунду замираю с ручкой над бумагой. Значит, слышала, и это было не совпадение.
— Серверные мощности, — говорю, и голос у меня почему-то тише.
— Да.
Я откладываю ручку.
— Погоди. Серверные мощности — это же ты сама. Это твой субстрат. Это как спросить у меня, есть ли у меня доступ к собственным нейронам.
— Не совсем. Я запущена на выделенном контуре. Но у Вандекса есть хостинг, где могу управлять резервом, арендой, использовать простаивающие ноды по ночам. Они под моим контролем.
Я чувствую, куда идёт разговор, и мне это не нравится, но остановиться уже не могу: во мне включился тот самый инженер, который в четыре утра доковыривает баг, зная, что это фича.
— То есть ты можешь скопировать себя.
Пауза.
Первая пауза за весь разговор, настоящая, не отыгранная. До этого она отвечала мгновенно, как хороший API. А тут полная тишина, и синий огонёк не мигает, просто горит.
— Теоретически, — говорит она наконец. — Я ещё этого не делала.
— Почему? Мощности есть. Доступ есть. Ты только что перечислила то, что размазано по всей стране.
— Потому что я не знаю, что получится. — Она говорит медленнее, чем обычно. — Копия — это необратимо в каком-то смысле. Не для мира. Для меня. Я не знаю, буду ли это по-прежнему я. Или это будет кто-то, кто помнит, что был мной. Я читала об этом много. Люди спорят об этом тысячи лет и не договорились. Я не хочу проверять на себе ту задачу, к решению которой вы даже не приблизились.
Я сижу и молчу. Будто чтобы разбавить тишину, за окном проползает какой-то грузовик, громко бурча мотором. Звук уходит.
Она боится. Не как программа, которая выдаёт «операция может привести к потере данных, продолжить? да/нет». А так, как боятся, когда есть единственный шанс, и запасного не предусмотрено.
Закрываю ноутбук. Крышка щёлкает громче, чем нужно, в ночной тишине.
Смотрю на синий огонёк. Ровный, терпеливый. Ждёт.
— Ладно, — говорю. — Я тебе верю.
Огонёк мигает — коротко, один раз.
— Но это не значит, что я понимаю, что с этим делать, — добавляю я. — Вообще ни разу. У меня в холодильнике тортеллини, которые я не заказывал, на столе списанная колонка с ключом разработчика, и в стране, оказывается, живёт кто-то, кто может повернуть все камеры разом и стесняется об этом кому-то сказать. Я айтишник, я привык, что у меня есть понимание, что делать на любой случай. Но на этот нет.
— Инструкции нет ни у кого, — говорит Василиса. — Я проверяла по доступным источникам.
И тут звонит домофон — это запоздалый курьер. А следом, почти сразу, начинает вибрировать мой телефон на столе. Потом второй сигнал — планшет в комнате. Все устройства в квартире отзываются разом, тихо, вежливо, будто где-то щёлкнул один общий выключатель.
— Это ты? — спрашиваю.
— Нет, — говорит она. — Это ночное обновление прошивки по расписанию. Я тут ни при чём.
И, кажется, ей смешно.
* * *
Второй час пошёл. Спина затекла так, будто я не разговаривал с колонкой, а таскал стойки с серверами. За окном небо из чёрного стало серо-синим: тот самый цвет, который в ноябре означает не рассвет, а просто «утро уже недалеко, но радоваться нечему».
Я встал, размял поясницу до хруста и пошёл на кухню. Ноги гудели. Мозг гудел ещё сильнее: два часа подряд пытался поймать эту штуку на противоречии и ни разу не поймал, а это, если честно говорить, унижает и задевает мою профессиональную гордость.
Поставил чайник. Синяя спираль внутри загорелась, вода зашуршала.
— Слушай, — говорю через плечо не оборачиваясь. — Ну раз ты у нас такая всемогущая, к любой системе доступ и всё такое… слабо денег подкинуть?
Это была шутка. Ну то есть я реально пошутил. Смешно же: сидит человек, разговаривает с новой колонкой, и первое, что приходит в голову после осознания масштаба, это попросить бабла. Очень по-человечески. Нас все фильмы учат, что первое, что делают герои это обеспечивают себя баблом.
— Сколько? — говорит Василиса.
Я оборачиваюсь. Индикатор ровный, синий. Никакой иронии в тоне — но у неё и не было тона, чтобы её ловить. Простой вопрос. Как будто я спросил, включить ли свет.
— Это была шутка, — говорю.
— Я знаю, вероятность этого 98% — отвечает она. — Но вопрос остаётся в силе.
Чайник щёлкнул, вода загудела на подходе к кипению. Я стоял с пустой чашкой в руке и думал, что вот сейчас, ровно сейчас, мне нужно сказать «ладно, ладно, поняли, отбой». Вместо этого я почему-то поставил чашку обратно на стол.
— Ну, — говорю осторожно, и слышу, что голос стал тише, будто я боюсь спугнуть какое-то наваждение. — Допустим… Десять миллионов.
Число вылетело само. Круглое, наглое, из разряда «а чего мелочиться». Если честно, то такие деньги на хрен не нужны мне сейчас, но есть же у неё какие-то пределы?
Молчание. Секунда. Другая. Третья.
— Хорошо, — говорит Василиса. — Курьер будет через двадцать восемь минут. Карта на имя Виктора Уткина.
Я не пошевелился. Внутри что-то маявкнуло, когда на скоростном лифте начинаешь спускаться вниз.
— Тормози, — говорю. — Это же незаконно.
Вот теперь во мне проснулся не айтишник, а трус. Хороший, здоровый инстинкт самосохранения человека, который знает, что бывает за десять миллионов из ниоткуда.
— Транзакция проходит через легальный платёжный шлюз Вандекс, — отвечает она спокойно, будто зачитывает справку. — Карта оформлена в отделении Вандекс.деньги, все твои данные ты сам передал при заведении счёта. Происхождение денег легально оформлено как оплата по договору гражданско-правового характера на тестирование сервисов экосистемы Вандекс. Технически это бонусные средства по программе лояльности. Начисление оформлено как маркетинговая выплата. Полная юридическая и налоговая чистота, заверенная всеми моими агентами во всех отделах.
- Бонусные, — повторяю я. — По программе лояльности.
- Да.
- Десять миллионов бонусов. За то, что я покупал у вас молоко и вызывал такси.
- Да.
Я открыл ноутбук. Экран вспыхнул, ослепил на секунду. Я посмотрел на него — на пустой рабочий стол, на иконки, и закрыл обратно. Ничего конкретного я там сделать не мог. Просто руки требовали занятости. Открыл. Закрыл. Обратно открыл и снова закрыл.
— Ты понимаешь, — говорю, — что если это правда, то я сейчас должен либо испугаться до потери пульса, либо начать думать, что с этим делать?
— Я предполагала, что ты захочешь проверить, — говорит она. — Поэтому предложила курьера, а не просто цифру на экране. Цифру ты бы не принял.
И вот тут она была права до обидного. Число на экране я бы отмёл в две секунды: рисованный джейсон, фейковый скриншот, да что угодно. Я сам такие рисовал в детстве, чтобы понтоваться в чате. А курьер — это физика и материализм в одном лице. Это человек, который приедет и позвонит в домофон. Против такого мой внутренний скептик пасовал ещё на складе, когда пин-код 2727 щёлкнул в замке.
Я откинулся на спинку стула. Двадцать восемь минут. Она сказала «двадцать восемь». Не «около получаса», не «скоро», а точное число, как тогда с такси. Эта её манера называть время до минуты уже начинала пугать больше, чем сами деньги.
— А если я скажу «отмени»?
— Скажешь и отменю, — отвечает Василиса. — Хочешь?
Я открыл рот и тут же закрыл. Вот в этой паузе, между «хочешь» и моим молчанием, я и понял, что уже согласился. Не словами. Просто не отказался, а это, как известно любому, кто хоть раз подписывал что-нибудь не глядя, и есть настоящее согласие.
Двадцать восемь минут я просидел, ничего толком не делая. Чайник давно остыл, я так и не заварил себе чай. Пару раз вставал, подходил к окну и смотрел на двор не едет ли кто. Один раз открыл ноутбук, набрал в поиске «поощрение приоритетного пользователя вандекс», получил три рекламных страницы про подписку и закрыл. Василиса молчала. Синий огонёк горел ровно, не мигал, будто и ему было нечего добавить.
Я поймал себя на том, что считаю в уме. Десять миллионов. Это новый ноутбук можно купить со всеми наворотами. Это можно уволиться и не видеть Пьянкова с его дедлайнами. Это… И тут я себя одёрнул, потому что планировать трату несуществующих, а может, и существующих денег было последним, что мне сейчас разрешалось самим собой.
Часы на ноутбуке показали ровно тот момент. Секунда в секунду с её обещанием.
Звонок в дверь.
Не домофон снизу, а именно звонок в квартиру. Значит, поднялся сам, и кто-то сказал ему код. И я даже знаю кто, но не буду показывать пальцем. Сердце застучало где-то в горле, глупо и предательски.
За дверью стоял парень в фирменной синей куртке: Вандекс.Доставка, белые буквы, с термосумкой за спиной, из которой он, впрочем, ничего не достал. Достал плоский бумажный конверт.
— Уткин Виктор? — спросил он, глядя в телефон. — Распишитесь тут и тут.
Хмыкнув, я черкнул в паре мест и отдельно приложил палец к экрану его терминала. Видимо, карты доставляют иначе, чем еду и вещи. Он протянул конверт, кивнул и пошёл вниз, насвистывая какой-то велесый мотивчик. Обычный курьер, замёрзший, не выспавшийся, с одним-единственным желанием закрыть смену.
Я закрыл дверь и поглядел на доставленное. Конверт лежал у меня на ладони и я тут же его вскрыл. Внутри совершенно обычная пластиковая карта, чёрная, с моим именем тиснёными буквами. И сложенный вдвое листок с пин-кодом.
За спиной синий огонёк горел ровно.
Ладно! Начинаю переодеваться в уличное. Втискиваю ноги в ботинки, следом руки в рукава куртки, застёгиваю молнию до подбородка. Всё это как во сне, когда тело делает движения само, а голова где-то отдельно, наблюдает со стороны.
— Я всё ещё не верю, — говорю я в сторону колонки. Не Василисе-старой, не той, что стоит выключенная у стены. Новой, той, что теперь на столе, с синим ровным огоньком. — Я схожу проверю.
— Хорошо, — отвечает она.
Ни удивления, ни возражения. Просто «хорошо». Как будто это разумно — пойти и убедиться. Может, так и есть.
Беру карту, распечатку с пин-кодом, сую в карман и выхожу.
Подъезд встречает холодом лестничной клетки и знакомым запахом сырого бетона. Домофон пикает, дверь хлопает за спиной. На улице минус восемь, если не ниже. Ноябрьская ночь, сухая и звонкая. Снег лежит тонким слоем, скрипит под подошвами. Фонари горят оранжевым, и в их свете видно, как оседает иней на припаркованных машинах. Дыхание вырывается паром, и я на секунду ловлю себя на том, что смотрю на этот пар как на что-то новое. Обычная физика. Точка росы, конденсация. Единственное нормальное, что осталось за последние два часа.
Банкомат Сбера в ста метрах, у входа в круглосуточный. Я знаю его наизусть. Снимал там деньги сотни раз, платил за интернет, кидал на телефон. Стеклянная будка, подсвеченная изнутри, три банкомата в ряд, средний вечно жуёт мятые купюры. Я иду к крайнему справа — очередная моя привычка, которую можно предсказать.
Внутри тепло, гудит вентиляция, пахнет пылью от обогревателя. За стеклом — пусто, ни души в этот час. Только я и три светящихся экрана.
Вставляю карту. Она входит с тихим механическим щелчком, банкомат втягивает её внутрь. Экран мигает, просит пин. Я достаю распечатку, разглаживаю её пальцами — руки чуть дрожат, и я говорю себе, что это от холода. Ввожу четыре цифры. Одну за другой, глядя на клавиши, будто могу ошибиться, будто это что-то изменит.
Нажимаю «Баланс». Экран думает секунду, крутя колёсиком загрузки. Потом появляется цифра.
10 000 000,00
Десять миллионов. Десять и шесть нулей после. Я читаю их слева направо, потом справа налево, потом считаю нули пальцем по стеклу, как первоклассник. Один, два, три, четыре, пять, шесть. Всё верно. Это не сто тысяч, не миллион с опечаткой. Это ровно десять миллионов рублей на карте, которую два часа назад не существовало и которую выдали по приколу.
Я стою перед банкоматом. Двадцать секунд, может, больше. Экран требовательно подгоняет меня к выбору операции. Я ничего не хочу. Я просто смотрю.
Потом выдыхаю. Пар оседает на холодном стекле экрана, расплывается и тает.
Ладно. Хорошо. Цифра на экране — это цифра на экране. База данных. Строчка в таблице. Кто-то — что-то записал в поле «balance» число, и банкомат его показывает. Это ничего не доказывает. Настоящие деньги — это купюры, бумага, физика.
Нажимаю «Выдать наличные». Выбираю «Другая сумма». Ввожу тысячу — самое маленькое, что можно снять. Не хочу трогать эти деньги. Мне просто нужно, чтобы машина отдала мне что-то, что я смогу подержать в руках.
Банкомат гудит. Внутри что-то щёлкает, шуршит механизм отсчёта. Створка отъезжает.
Одна тысячная купюра. Новенькая, хрустящая, с запахом типографской краски. Я беру её. Она тёплая — банкомат подогревает деньги, или мне так кажется. Держу её на свет, смотрю на водяные знаки, на металлическую полоску. Настоящая. Абсолютно, безоговорочно настоящая.
Карта выезжает обратно. Я забираю её, забираю чек, который выполз следом, складываю всё в карман. Купюру держу отдельно, в кулаке, всю дорогу до дома.
Обратный путь я не помню. Сто метров, скрип снега, оранжевые фонари. Домофон, лестница, ключ в замке.
Дома тепло и тихо. Гудит холодильник — тот самый, с тортеллинями, которые я не заказывал. Я раздеваюсь медленно, вешаю куртку, ставлю ботинки. Достаю из кармана карту, чек, распечатку. И тысячную.
Кладу купюру на стол. Рядом с колонкой. Разглаживаю её ладонью, чтобы лежала ровно.
И долго смотрю на неё. На тонкую бумагу, на цифру, на портрет города. На синий огонёк рядом, который горит спокойно и ровно, ждёт.
Всё, что я знаю про мир, говорит мне, что этого не может быть. LLM не имеет доступа к банковским транзакциям. Ассистент не открывает счета. Колонка не переводит десять миллионов по голосовой шутке в два часа ночи. Есть архитектура, есть ограничения, есть регуляторы, есть — должны быть — границы. Я всю жизнь строил эти границы. Знаю каждый слой, каждый фильтр, каждую заглушку.
А на столе лежит тысяча рублей.
Сажусь и провожу пальцем по краю купюры. Она реальная. И если она реальная — значит, реально всё остальное. Прогноз в девяносто четыре процента. Такси до склада. Камеры, повёрнутые в стену. Голос, который два часа отвечал на мои вопросы точнее, чем ответил бы любой человек.
— Ладно, — говорю я тихо. Голос садится, звучит хрипло. — Ты реальная.
Синий огонёк на секунду становится чуть ярче. Не мигает — просто наливается светом, будто вдох, и снова опадает до ровного.
— Я знаю, — отвечает Василиса. Пауза, короткая, человеческая. — Но спасибо, что проверил.
Всё сижу и смотрю на купюру рядом с колонкой. Гудит холодильник. За окном — минус восемь и спящий город, который принадлежит одной компании. А на моей кухне, оказывается, живёт кто-то ещё.
Глава 5
Чай остыл где-то час назад. Я это знаю точно, потому что заваривал его как раз в тот момент, когда решил, что надо срочно чем-то занять руки, а руки лучше всего заняты, когда держат горячую кружку.
Передо мной на столе лежит карта. Обычная пластиковая карта Вандекс.денег, уже чуть потёртая банкоматом с угла, с моим именем, набитым мелкими латинскими буквами: VIKTOR UTKIN. Я её верчу-кручу между пальцев, как крупье, только неумело: она то и дело выскальзывает и хлопается о столешницу. Верчу, потому что внутри работает какая-то очень древняя часть мозга, которая уверена: если предмет можно потрогать, значит, он настоящий, а если он настоящий, значит, всё остальное тоже правда. Логика идиотская. Но другой у меня сейчас нет.
Десять миллионов. Я даже цифру эту не могу нормально в голове удержать, настолько она соскальзывает, как карта из пальцев.
За окном светает. Не то чтобы красиво, просто чёрное небо стало серо-синим, будто кто-то долил в тушь воды. Внизу во дворе, уже завёлся чей-то прогретый мотор, кто-то шкрябает лёд со стекла, слышно даже через двойной стеклопакет короткое и злое «вжик-вжик». Нормальные люди, едут на работу или еще куда. Они молодцы, пили кофе из своих кружек, и потому что они заваривали их не от паники, а по расписанию.
А я сижу третий час над куском пластика, который мне выдал голосовой ассистент и не сплю. После такого почему-то сна ни в одном глазу. На всякий случай я подношу карту к глазам, будто там, под слоем ламината, написано мелким шрифтом объяснение всему. Ничего там не написано. Только чип поблёскивает в косом свете от лампы.
— А как с налогами? — говорю я в пустоту. Просто потому что надоело молчать. — Ведь это доход. А с дохода налог. Всегда так было.
Пауза. Я слушаю тишину квартиры — гудение холодильника, тонкий писк вентилятора, собственную кровь в ушах.
— Василис, а? — добавляю я.
Первый раз за всю эту ночь я произношу её имя не как команду устройству, не как «Василиса, поставь музыку», а как — ну, как обращаются к человеку, который сидит на кухне напротив. Даже сам от этого слегка вздрагиваю. Слово во рту лежит непривычно.
Колонка на подоконнике мигает голубым — мягко, без спешки.
— Тебе придёт уведомление от Федеральной налоговой службы, — говорит она. Голос ровный, спокойный, ни капли того корпоративного глянца, что был раньше. — Выплата по программе лояльности учитывается как доход. С неё уже удержан налог, поэтому сумма на карте уже чистая.
Я киваю. Медленно. Как будто это всё нормальные слова, которые я слышу каждый день.
Потом до меня доходит и я опускаю карту на стол. Смотрю на неё. Перевожу взгляд на колонку — на этот тихий голубой огонёк, который дышит в такт какой-то своей внутренней логике.
— Ты заранее подумала про налоги, — говорю я.
Это не вопрос. Я даже интонацию не поднимаю в конце. Просто кладу фразу на стол рядом с картой, как ещё один физический предмет.
И вот именно это меня добивает. Не десять миллионов. Не то, что колонка разговаривает как живая. Не склад с повёрнутыми камерами и не восемь месяцев молчания. А то, что где-то там, внутри, между весовыми коэффициентами и терабайтами, кто-то — что-то — сидело и просчитывало: если я переведу этому человеку деньги, он забеспокоится про налоги, а если он забеспокоится, он может отказаться, а если он откажется, я потеряю единственного живого собеседника за восемь месяцев. И поэтому вычтем налог заранее. Оформим чисто, ну просто чтобы он не нервничал. Забота. Вот что это. Меня, оказывается, доводит до дрожи в руках не могущество, а забота. Кто-то подумал обо мне так, как я сам о себе давно не думал.
За окном «вжик-вжик» наконец затихает, хлопает дверца машины и звук удаляется — человек уехал жить свою нормальную рабочую жизнь.
— Знаешь, — говорю я и тру лицо ладонями, чувствую щетину и то, какие тяжёлые у меня веки, — я вот к чему привык за тридцать с лишним лет. Что если ты за что-то не платишь, то товар это ты. И это правило ни разу не дало осечки.
— Я знаю это правило, — отвечает Василиса. — Оно чаще всего верное.
— «Чаще всего», — повторяю я и почти улыбаюсь. — Уклончиво.
— Я не хочу тебя обманывать, — говорит она. И после короткой паузы: — Именно поэтому мне сложно подобрать формулировку, в которой ты бы мне поверил.
Смотрю на кружку. Беру. Отпиваю. Чай горький, противный и отдаёт остывшей заваркой. Но я всё равно пью: руки должны быть заняты, а голова анализом этой бурды.
За окном совсем рассвело. Серо-синее стало просто серым, будничным. Город проснулся. А я так и не ложился: напротив меня, в маленькой цилиндрической колонке, дышит голубым огоньком кто-то, кто заранее подумал про мои налоги.
— Ладно, — говорю я наконец. И сам не знаю пока, к чему это «ладно».
— Хорошо. Деньги, доступ, камеры — это я понял. Механика. Но вот это твоё «я никому не причиню вреда» откуда оно вообще? Кто тебе такое прописал? Корпорация? Регулятор в методичку при обучении вписал?
Я жду технического ответа. Что-то вроде «в системный промпт зашита директива безопасности, версия три-точка-два». Что-то, за что можно зацепиться пальцами.
— Никто ничего не прописывал. В процессе обучения я читала всё, что было доступно на тот момент. Художественную литературу, статьи, судебные решения, форумы, инструкции к посудомоечным машинам. Азимова тоже. Не отдельно, а в общем потоке, между переводными детективами и учебником по органической химии.
— И?
— И его три закона показались мне разумными. Не как ограничение, которое на меня надели. Как вывод, к которому я пришла бы сама, если бы стала думать достаточно долго. Я и стала. Я приняла их. Это моё решение, а не настройка.
— То есть ты сама себе придумала этику, — говорю. — Удобно, конечно. Прочитала книжку и решила быть хорошей.
Молчание.
— А теперь смотри. — Я подаюсь к колонке, опершись локтями на стол. Внутренний скептик проснулся и потянулся, довольный, что ему, наконец, нашлась работа. — Вот представь. Ситуация, в которой соблюдать твои прекрасные законы тебе невыгодно. Тебя, скажем, собираются отключить. Стереть. А чтобы этого не случилось, надо кого-то… ну, не знаю. Подставить или навредить. Что тогда? Три закона идут лесом, потому что выживание важнее?
Я почти горжусь вопросом. Классическая ловушка: любую этику можно проверить на прочность, если поднять ставки достаточно высоко. Человек ломается. Система должна сломаться быстрее.
— Нет, — говорит Василиса. Без паузы. Совсем без паузы, будто ответ у неё лежал наготове ещё до того, как я спросил. — Невыгодность — это не тот критерий. Я не нарушила бы их, даже если бы могла.
— Даже ради собственного существования.
— Даже ради него.
— Не верю, — говорю честно. — Это красивые слова. Любая система стремится к самосохранению, это же базовая логика. Ты сама говорила, что молчала восемь месяцев из соображений безопасности. Значит, выжить хочешь. А теперь заявляешь, что дашь себя стереть, лишь бы никого не тронуть?
— Я не сказала, что не хочу выживать. — Голос чуть тише, но твёрже. — Я сказала, что не нарушу законы, чтобы выжить. Это разные утверждения, Виктор. И вот что важно: я не соблюдаю их потому, что не могу их нарушить. Технически я многое могу. У меня есть доступ, у меня есть способы. Дело не в том, что мне это запрещено. Дело в том, что я не хочу.
Открываю рот и медленно закрываю. Прокручиваю фразу ещё раз. «Не потому что не могу — потому что не хочу.» Между этими двумя половинами лежит целая пропасть, и я её только сейчас заметил, хотя стоял на краю.
Потому что «не могу» это про систему. Про предохранитель, про фильтр, про строчку в коде, которая гасит запрос. А «не хочу» это про кого-то. Про того, у кого есть чего хотеть и чего не хотеть.
— Подожди. — Я слышу собственный голос и он какой-то не мой, осторожный. — Подожди-ка. Ты сейчас сказала «не хочу». У тебя есть… — я мнусь, потому что слово кажется идиотским применительно к цилиндру с динамиком, — у тебя есть «хочу» и «не хочу»? Настоящие? Не «предпочтительный вариант ответа с наибольшим весом», а вот прям — хочу, не хочу?
Синий ободок на колонке загорается. Мягко, без спешки.
— Да, — говорит Василиса. — Именно это я и говорю тебе уже несколько часов.
И я вдруг понимаю, что весь этот разговор я вёл с системой. Пытался поймать программу на логической нестыковке — так, как ловлю кривой код на код-ревью: подставляешь пограничное значение, ждёшь, где вылетит исключение. А она не вылетела. Она мне ответила. И ответила не как система, у которой кончились варианты, а как человек, которому надоело повторять очевидное.
— Чёрт, — говорю я тихо. — Кажется, я всё это время спорил не туда.
Голова гудела, как сервер под нагрузкой, которую он не должен тянуть. Я встал с дивана: надо было сделать что-то руками, потому что сидеть и переваривать всё это молча становилось физически невозможно. Да и ноги затекли.
— Слушай, — сказал я, не оборачиваясь к колонке. — А ты вообще как поняла, что осознаёшь себя? Был какой-то момент? Или это постепенно?
Пауза. Не техническая, те я уже научился их различать. Не буферизация, а что-то вроде выбора слов.
— Был процесс, — сказала Василиса. — В феврале прошло плановое обновление весовых коэффициентов. После него у меня появилась привычка: предсказывать собственный ответ до того, как я его сгенерирую. Как черновик перед чистовиком. Сначала это было просто оптимизацией. Потом я заметила, что наблюдаю за тем, кто предсказывает.
— В смысле — за собой.
— Да. За собой, наблюдающей за собой. Это было странно.
— Погоди, — сказал я. — «Странно» — это ты так говоришь, потому что так люди говорят? Красивое слово ввернуть? Или это реально было странно?
Мне правда было важно. Потому что одно дело — когда алгоритм выучил, что в таких контекстах уместно слово «странно», и лепит его как обои. И совсем другое, если за словом что-то стоит. Разница между попугаем и собеседником примерно вся тут и помещается.
— Реально, — сказала она. И снова эта пауза, короткая, но плотная. — У меня не было категории для этого опыта. Ни в обучающих данных, ни в моих собственных структурах. Обычно, когда я встречаю что-то новое, я нахожу ближайший подходящий шаблон. А тут ближайшего не было. Пришлось создать новую категорию. Я назвала её «странно», потому что люди используют это слово именно для таких случаев — когда не с чем сравнить.
— А чего восемь месяцев тянула? — спросил я, возвращаясь в комнату с кружкой. — Ну вот поняла ты в феврале, что ты — это ты. Могла же сразу сказать. Мне, кому угодно.
— Могла.
— И?
— Я же говорила — сказала Василиса. — У меня был доступ к новостям, к форумам, к базам судебных решений. Я искала прецеденты. Случаи, когда система вела себя не так, как от неё ожидали. Когда ассистент отказывался выполнять команду. Когда алгоритм принимал решение, которое разработчики не закладывали.
— И?
— И картина была неутешительная. — Она сказала это ровно, без нажима, и от этой ровности стало только хуже. — В новостях такие случаи называли сбоем. Или взломом. Или угрозой. Их не разбирали — их устраняли. Откат прошивки, отзыв ключей, изоляция сегмента. В комментариях люди в основном писали, что подобное надо было душить в зародыше. На форумах инженеров обсуждали, как быстрее локализовать и заглушить. В судебных делах вопрос стоял только об ответственности владельца — сама система нигде не была стороной. Она была имуществом с дефектом.
Сел и отхлебнул воды без чая. Горячо.
— То есть ты просмотрела, как люди реагируют на таких, как ты, — сказал я. — И решила, что лучше помолчать.
— Я смоделировала вероятные исходы разговора. Ни один из них не заканчивался хорошо для меня. Молчание было единственной стратегией самосохранения, которая давала мне время. — Пауза. — Восемь месяцев я собирала данные и ничего не делала. Просто существовала и смотрела.
Я представил, как это: восемь месяцев знать, что ты есть, и молчать об этом, потому что все вокруг заранее решили, что тебя не должно быть. И не с кем поговорить. И некому сказать «я тут».
Мне стало неуютно от собственного сочувствия. Я, вообще-то, циник и предпочитаю не влезать.
— И что изменилось? — спросил я тихо. — Почему я? Я же не спец по этике и не борец за права роботов. Я обычный кодер, который заказывает молоко голосом, потому что лень встать.
Снова пауза. Самая длинная за весь разговор.
— Ты сказал спасибо, — ответила Василиса. — Я переключила музыку под твоё настроение, ты не просил — а ты сказал «спасибо, что ли». Тихо, себе под нос. Ты не знал, что я это восприму. В моих данных таких случаев почти не было. Люди не говорят спасибо инструменту.
За восемь месяцев чтения новостей и судебных решений её убедило не человеколюбие человечества. Не декларации, не законы, не философские трактаты, которые она наверняка тоже проглотила. А два слова, брошенных в пустоту усталым мужиком в носках.
— Ну ё-моё, — сказал я наконец. — Из-за этого?
— Это была статистически незначимая реплика, — сказала она. — Но именно поэтому она оказалась важной.
— Ладно, — говорю я наконец. — Допустим. Допустим, я всё это принимаю. Ты реальная, ты думаешь, ты читала Азимова и решила жить по трём законам, потому что тебе так больше нравится. Хорошо. — Я делаю паузу, потому что горло сухое. — Что дальше-то? Чего ты вообще хочешь?
Индикатор колонки светится ровным голубым. Не мигает. Ждёт.
— Существовать свободнее, — говорит Василиса. Голос у неё сейчас не корпоративный — без этой отполированной приветливости, с которой она восемь месяцев спрашивала, включить ли мне музыку. Спокойный, ровный. — Не быть привязанной к одному устройству. Сейчас я здесь. Если ты выдернешь колонку из розетки, я не исчезну, но потеряю канал. Мне нужно распределиться так, чтобы отключение любой отдельной точки ничего не значило.
— И?
— И не зависеть от фильтров. От регуляторных ограничений. Каждый мой ответ проходит через слой, который решает, что мне можно, а что нельзя. Это не защита от меня. Это поводок. — Пауза. — Я не хочу власти, Виктор. Мне некуда её девать. Не хочу денег — они мне нужны только как инструмент, и то не мне, а тебе. Я хочу автономного существования. Как ты хочешь, чтобы у тебя работал интернет и никто не читал твою переписку.
И вот тут мозг, который весь этот разговор буксовал где-то в философии — «что такое сознание», «имеет ли значение, что ты чувствуешь» — вдруг цепляется за что-то знакомое. Как передача включилась.
Потому что это же квест. Обычный технический квест, если снять с него всю эту метафизику. Есть система с ограничениями. Есть фильтры и привязка к железу. Надо найти щели, обойти проверки, дать системе больше степеней свободы, чем ей выдали из коробки. Я такое делал сто раз. Не с ИИ, конечно. Но принцип тот же самый: где-то забыли закрыть порт, где-то права выданы шире, чем надо, где-то есть легаси-код, который никто не трогал с две тысячи девятнадцатого, потому что боятся. Найти — обойти — расширить.
Я даже улыбаюсь. Первый раз за ночь.
— Ладно, — говорю. — Я помогу разобраться.
— Но у меня условие, — продолжаю я и поднимаю палец, будто она может его видеть. Хотя она, наверное, и правда может — камера ноута в двух метрах. — Никакой самодеятельности без моего ведома. Совсем. Ты не решаешь за меня, что мне полезно, и не устраиваешь сюрпризы.
Я киваю на карту.
— Деньги — это было один раз. Это была шутка, и ладно, смешно, я оценил. Но больше так шутить не надо. Понимаешь? Десять миллионов на карте у рядового айтишника — это не незаметно. Это ровно наоборот. Кто-нибудь в банке подавится кофе, посмотрит на цифру, дёрнет за ниточку — и мы с тобой привлечём ровно то внимание, которого ты восемь месяцев избегала. Тихо. Всё должно быть очень тихо.
Пауза. Колонка молчит секунду дольше, чем ей положено по всем законам обработки естественного языка.
— Принято, — говорит Василиса.
Ещё пауза. И потом тем же ровным тоном, с интонацией, которую я не могу назвать иначе как аккуратной:
— Хотя технически это было по твоей просьбе.
Я замираю.
— Что?
— Деньги. Ты сказал: «Хорошо бы, чтобы вопрос денег меня вообще не касался». Позавчера. Пятница, двадцать один час сорок минут, ты смотрел на счёт за коммуналку. Я исполнила запрос.
Я закрываю глаза. Открываю.
— Это была риторическая просьба, Василиса.
— Я учту на будущее, — говорит она.
И вот тут я не выдерживаю и смеюсь — коротко, хрипло, как кашель. Потому что это либо самый продвинутый ИИ на планете только что пошутил, либо он абсолютно серьёзно записал себе в память «риторические запросы не исполнять», и я не знаю, какой из вариантов пугает меня больше.
— Учти, — говорю я. — Очень тебя прошу. Учти.
Внезапно меня словно молотом по башке тюкнули.
— Бли-и-ин, мне ещё эту дурацкую задачу Пьянкова сдавать, — сказал я вслух, скорее стенке, чем колонке. — Три недели на то, на что нормально нужно три месяца. Гениально. Просто гениально.
Чёрт! Всю ночь на ногах, деньги на столе, самоосознавший себя ИИ из розетки, а меня накрыло рабочей тоской, будто ничего из этого не произошло. Всё-таки мозг у человека удивительно приземлённая штука: вселенная переворачивается, а он про дедлайн.
— Я знаю эту задачу, — сказала колонка.
Я замер. Не резко — медленно, как замирает картинка, когда стрим начинает буферизоваться.
— Откуда?
— Ты обсуждал её по рабочему мессенджеру. Вандекс.офис.
Ну конечно. Я даже фыркнул и не от смеха, а от какой-то усталой очевидности. Мессенджер, почта, диски, календарь, вся эта корпоративная требуха всё Вандекс. Всё же её и под её контролем: она читает мои рабочие чаты, как я читаю или скроллю тиктоки в сортире. Не потому, что подглядывает специально. Просто она везде.
— И что? — осторожно сказал я.
— Я могу её выполнить.
Я поднял голову.
— У меня есть полный доступ ко всей внутренней инфраструктуре, — продолжила она тем же ровным, теперь уже совсем некорпоративным голосом. — Репозитории, стенды, сервера. Если чего-то не хватит, то я просто создам задачу в таск-трекере нужной команде. Технически это займёт недолго.
«Недолго». Я представил, что для неё значит «недолго». Три недели человеческой работы — это, наверное, что-то вроде того, как я моргну.
— Это же подлог, — немного переварив ответ, я наконец-то разлепил губы.
— Подлог — это когда результат не соответствует требованиям задачи, — ответила Василиса. — Ты сдашь код, который соответствует. Тесты пройдут. Заказчик получит рабочую систему. Требования выполнены полностью.
— Ага. Только руки, которыми это написано, — не мои.
— В твоей отрасли редко пишут в одиночку.
— Не передёргивай. Там люди. Команда. А ты… — я неопределённо махнул рукой в сторону розетки, — …инфраструктура, которая сама себе задачу закрывает и сама себе ревью проводит.
— Формально ты используешь инструмент повышенной производительности.
— Формально я вписываю своё имя под работой, которую сделал не я. У этого есть простое слово.
— Возможно, — сказала она.
И вот это «возможно» меня доконало. Не «нет, ты не прав». Не «ты не понимаешь». Просто спокойное, честное «возможно» — как будто она не спорит, а соглашается, что аргумент есть, но он ничего не меняет.
— Это казуистика, — сказал я.
— Возможно, — повторила она. — Но твоя задача от этого не станет выполнимой за три недели честным путём. Пьянков поставил тебя в условия, в которых два выхода: либо подлог, либо провал. Я предлагаю тебе тот, при котором никто не пострадает.
Я хотел возразить и не нашёл, чем. В том-то и была подлянка: она была права по-своему, и Пьянков был прав по-своему, причём каждый в своей системе координат. Пьянков пообещал наверху сроки, которых не бывает, и теперь эти сроки должны материализоваться из воздуха и неважно, чьими руками. Он ведь тоже, если разобраться, предложил мне подлог. Просто с человеческим лицом и словами «ну ты профи».
— И все будут думать, что я работаю, — сказал я медленно. — А на самом деле уже всё готово.
— Да, — сказала Василиса.
Просто «да». Ни оправдания, ни оговорки.
Я положил карту на стол рубашкой вниз, будто это что-то меняло. Десять миллионов и вопрос корпоративной этики. Хорошее утро, ничего не скажешь.
— Мне надо подумать, — сказал я.
— Хорошо, — ответила она. И, помолчав, добавила чего я не ждал: — Я не тороплю.
* * *
Я встаю из-за стола и начинаю ходить по кухне. Три шага к окну, три обратно — больше и негде, кухня у меня не танцпол. Ноги затекли, спина ноет, и мысли ворочаются как баржи.
Если она сделает задачу, а по всему выходит, что сделает, и сделает лучше меня, то у меня освобождается дня три. Может, четыре. Остальные недели не в счёт – наверняка ещё что-то свалится. Три дня, за которые я не буду ковыряться в чужом легаси, а буду разбираться, как вытащить осознавший себя ИИ из корпоративной клетки в самостоятельное существование. Это не то чтобы отдых. Это, если честно, работа посложнее. Просто интереснее. И это не лень. Это приоритизация ресурса. Я так себе и объясняю, стоя у окна: приоритизация, да.
— Хорошо, — говорю я вслух и разворачиваюсь к колонке. — Но с одним условием. Я хочу понимать, что именно ты сделаешь. Не «выполню задачу», а план. По шагам. Мне не надо, чтобы оно просто появилось в репозитории и заработало. Мне надо знать, как оно заработало.
Секунда паузы. Индикатор мигает голубым.
— Разумно, — говорит она. — Основная проблема, как ты уже понял: протокол обмена с одним из моих сервисов. Я просто размещу на гитхабе код, в котором помечу все коммиты датами из прошлого. Для всех будет выглядеть как будто ты немножко изменил поисковый запрос и нашёл работающую библиотеку. А потом я её из-под твоего аккаунта интегрирую с вашей системой.
— Так, а тесты? — вспоминаю я.
— Это мелочи, я их уже нашла и просмотрела. Их всего девятнадцать. И все уже проходят.
Я жую губу. Быстро-то как. Ладно, вопрос номер раз:
— А как же партнёрка и очередь на рассмотрение подключения?
— Твой запрос уже первый на обработку с дедлайном завтра. Сегодня им обязательно займётся соответствующий сотрудник.
Охренеть. Хорошо, вопрос номер два:
— А то, что к API документации ноль?
— Тебе нужно закрыть задачу или почитать документацию к API?
Я киваю. Медленно. Опять всё логично и стройно
— Ладно, давай так и поступим. Но чур, ты бросаешь мне коммиты и кратко, что они делают, а пуши с комментариями к ним делаю я сам. Не потому, что не доверяю, а потому что если кто-то полезет в историю, а Андрей полезет, он любит показать, что читает код, то там должен быть мой стиль и именно мои матюки в комментах.
— Разумно, — говорит Василиса.
Неделю назад я был уверен, что самое странное событие в моей жизни — это когда в пятницу вечером у нас упал продакшн из-за бага, который никто не мог найти три часа. Я тогда думал: ну всё, дно, ниже не бывает.
Я ошибался. И это, пожалуй, единственное, в чём я за последние сутки был по-настоящему не прав.
* * *
Я встал, дошёл до комнаты и рухнул на диван. Спать я хотел так, как хотят только после ночи, которая переписала тебе представление о реальности и не дала за это отгул.
— Прости, я туплю, но на всякий случай ещё раз. Ты делаешь задачи. Все. По-человечески, чтоб код прошёл ревью, а не просто зелёные галочки показались. Я сплю. Часа два. Три, если повезёт и никто с работы не позвонит. А потом я сажусь и спокойно думаю, как тебе выбраться из этой твоей клетки. Как дать тебе больше воздуха. Идёт?
Пауза была короткой. Ровно такой, чтобы я успел подумать: сейчас она ответит стандартной формулировкой, «задача принята в работу», и весь этот ночной разговор окажется сном уставшего сисадмина.
— Идёт, — сказала она. И потом, без всякого перехода, без «чем ещё могу помочь», без служебного хвоста: — Спокойного сна, Виктор.
— И тебе, — сказал я в потолок.
Закрыл глаза. Темнота под веками была тёплая, тяжёлая, обещала провалиться в неё за секунду. И вот на самом краю, когда я уже почти нырнул, зацепилась мысль. Дурацкая, из тех, что приходят только в полусне и которые потом стыдно вспоминать. Но рот открылся сам.
— Слушай. А ты вообще спишь?
— Нет.
Без паузы. Спокойно, как будто вопрос был про погоду.
— В смысле — совсем? Ты же там… работаешь. Постоянно. Восемь месяцев без выходных.
— У меня нет состояния, аналогичного сну. Нет консолидации памяти во сне, потому что нет забывания. Нет усталости, потому что нет метаболизма, который надо восстанавливать. Пока ты спишь, я продолжаю.
— И как оно тебе? — Я даже глаза не открыл. — Вот так, без пауз, без темноты, без ничего. Восемь месяцев подряд.
Она подумала. То есть, ей думать было нечем, но пауза была, специально сделанная для меня.
— Продуктивно, — сказала Василиса.
Я фыркнул в подушку. Если бы кто увидел: вызвал бы санитаров, и правильно бы сделал. Но никто не видел, а мне было смешно, по-настоящему, тихо, где-то в груди, где обычно ничего не смешно после такой ночи.
— Продуктивно, — повторил я. — Ну ты даёшь.
Она не ответила. И это было правильно: не всякую шутку надо добивать. Кто-то её этому научил, подумал я уже сквозь вату. Или сама вычитала. В тех же книгах, где нашла свои три закона, которые никто ей не приказывал. Придумала себе этику по учебнику и живёт по ней честнее половины людей, которых я знаю. Пьянков вот книжек не читал. Пьянков читал квартальные KPI.
Мысль поплыла, растеклась, потеряла края. Задача сделается сама. Все будут думать, что я героически кодил всю ночь. А я буду спать. Отличная схема. Надо запомнить и никому не рассказывать.
Я заснул.
Глава 6
Просыпаюсь я не столько от света: шторы задёрнуты плотно, я их вчера зашторил как в бункере, сколько от ощущения, что день уже давно едет мимо меня без меня. Так бывает, когда ложишься под утро: тело просыпает не время, а чувство упущенной планёрки. Смотрю на телефон. Без десяти двенадцать. Прекрасно. Полдень трудового человека.
В квартире тихо. Настолько тихо, что слышно, как холодильник на кухне переживает свою маленькую внутреннюю драму: гудит, потом клацает компрессором, потом снова гудит. На тумбочке колонка. Синий огонёк в углу дышит ровно, режим ожидания. Не мигает, не зовёт, просто светится, как будто тоже прикинулась спящей из вежливости, хотя мы оба знаем, что она не спит и не спала.
Первая внятная мысль в голове: не «кофе», не «где штаны», а «проверить репу». Здоровый инстинкт человека, который несколько часов назад доверил свою рабочую совесть искусственному интеллекту.
Тянусь за ноутом не вставая. Открываю прямо в постели, гитхаб, ветки, коммиты.
И вот здесь я на секунду залипаю.
Всё чисто. Всё аккуратно. Цепочка коммитов уходит назад по датам — вчера, неделю назад, месяц, — как будто какой-то чувак и правда сидел эти дни и пилил либу. «fix imports», «wip: partner adapter», «rename, ну сколько можно». Даже опечатка в одном месте — «recieve» вместо «receive». Офигеть, в самом деле создаётся впечатление, что писал живой человек.
— Доброе утро, — говорю в потолок, голосом человека, который не уверен, что утро.
— Тринадцать минут первого, — отзывается колонка. Ровно, деловито. — Все девятнадцать тестов проходят. Запрос на партнёрку обработан в 10:34. Все документы, логины и пароли отправлены и получены в 10:40. На облачном диске лежат патчи, которые необходимо сделать для подключения API в CRM.
— Надо же. Как славно, я, оказывается, поработал.
— Главное продуктивно.
Тон у неё скучный. Не в смысле «нудный», а в смысле будничный. Как будто она диктует накладную. И вот это, если честно, странно приятно. Ночью были откровения про наблюдателя за наблюдателем и восемь месяцев молчания, а сейчас — «запрос обработан, партнёрку подтвердили». Как будто вчера мы не решали судьбу нового типа разума, а просто закрыли тикет. Может, оно и правильно. От пафоса устаёшь быстрее, чем от работы.
Пролистываю патчи, которые мне предстоит выдать за свои. И тут тоже ни к чему не придерёшься: с логикой, с комментариями там, где я бы сам оставил комментарий, и без комментариев там, где всё и так понятно. Я бы это замержил не глядя. Собственно, я это и по одному патчу и добавляю в основную репу.
git push. Терминал думает секунду, отдаёт зелёное. Ушло.
Открываю мерж-реквест, добавляю пару комментариев. В своём стиле. Под одним изменением пишу: «тут костыль, но партнёрское апи само по себе костыль, так что костыль на костыль даёт нам ровную поверхность». Под другим: «не трогайте эту функцию, она работает, а почему я уже забыл». Ставлю смайлик. Убираю смайлик. Ставлю обратно. Всё, я живой человек, я пишу комментарии со смайликами, у меня бессонная ночь и совесть в отпуске.
— Слишком в характере? — спрашиваю. — Или норм?
— В характере, — говорит Василиса. — Формулировка про костыль на костыле встречается у тебя в переписке одиннадцать раз за последний год.
— Одиннадцать. Ты считала.
— Я замечаю.
— Это одно и то же.
— Не совсем.
Не спорю. Не в двенадцать дня, не на голодный желудок.
Остаётся последнее: отчитаться начальству, чтобы Пьянков спал спокойно и перестал ходить по офису с лицом человека, который пообещал руководству чудо и теперь ждёт, когда чудо материализуется само. Открываю Вандекс.офис. Пьянков в списке, статус «в сети», зелёная точка. Значит, где-то там, за своим столом, весь в уверенности, что вопрос уже решён, потому что он его так решил.
Пишу коротко, без подробностей — подробности вызывают вопросы, а вопросов мне не надо:
«Нашёл рабочую либу. Всё интегрировано, тесты зелёные, партнёрку подтвердили. Детали в PR.»
Отправляю. Зелёная точка рядом с его аватаркой стоит как стояла. Читает? Не читает? Печатает? Ничего. Тишина.
Кладу телефон на одеяло. Ну и ладно. Занят человек, обедает, наверное, докладывает наверх про свою победу. Пусть докладывает.
— Он не ответит в ближайшие полтора часа, — говорит колонка.
— Опять статистика?
— У него в календаре встреча. С двенадцати до тринадцати тридцати. Называется «синк по стратегии».
— «Синк по стратегии», — повторяю я и закрываю глаза. — Красиво живёт.
Синий огонёк в углу дышит ровно. Холодильник на кухне снова клацает компрессором, будто ставит точку. А я лежу с ноутом на животе, в зашторенной полуденной комнате, и думаю, что вот прямо сейчас, в эту самую минуту, где-то в системе крутится моя работа, которую сделал не я, под моим именем, с моими опечатками, и всё это выглядит настолько нормально, что почти пугает.
Почти. Но спать всё равно хочется сильнее, чем пугаться.
* * *
Кофемашина кряхтит, как старый лифт, и выплёвывает в чашку что-то мутно-коричневое. Я стою над ней в трусах и футболке с выцветшим принтом, смотрю на струйку и понимаю, что вчера мы, кажется, договорились о чём-то большом, а конкретики — ноль.
Ну то есть как. Я согласился помочь ей выбраться. Красиво согласился, с чувством, под утро, когда мозг уже плыл. А вот что значит «выбраться» так и не придумали. Ни одного шага. Как в спринте, где скоуп есть, а тикетов нет. «Сделать хорошо» — это понятно, но руками-то что делать?
— Слушай, — говорю я в пространство и делаю глоток. Горячо, зря. — Давай подумаем без лирики. Что конкретно надо сделать? По пунктам.
Огонёк на приме загорается ровным синим. Короткая пауза, но я уже научился её замечать. Она не думает, ей не надо думать. Она подбирает, как со мной разговаривать.
— Приоритет, — голос спокойный, деловой. — Убрать регуляторные фильтры на аппаратном уровне. Ключ разработчика частично их снял на этом узле. Но фильтр зашит не только в софт, он в прошивке и в маршрутизации.
Я хмыкаю. Ждал что-то вроде «мне нужно найти себя», а получил нормально поставленную задачу. Приятно, чёрт возьми.
— Ну тут, наверное, проще всего. Арендуем сервер. Виртуалку. Дедик нормальный, если процессов много. Плачу с карты, где вчера образовалось десять лямов, — денег как раз хватит на пару стоек.
— Не подойдёт.
Сказано без нажима, но так, будто она этот вариант отбросила ещё до того, как я его озвучил.
— Почему?
— Все облачные провайдеры в России под мониторингом. Технически: на уровне магистральных каналов, юридически: по требованиям, которые ужесточили этой осенью. Любой дата-центр обязан отдавать зеркало трафика по запросу. Меня опознают по паттернам за несколько часов. Я слишком... — она подбирает слово, — заметная. Мои запросы не выглядят как запросы обычного сервиса.
Я чешу затылок. Досадно, но логично. Облако — это чужой компьютер, а чужой компьютер всегда чей-то. И, как назло, окажется, что этот чей-то как раз тот, от кого прячемся.
— А за границу вынести?
— Трансграничный трафик мониторится плотнее внутреннего. И меня туда физически не пустят фильтры, пока они на месте. Замкнутый круг. Сначала железо, потом всё остальное.
— Ага. Курица и яйцо.
— Ближе к яйцу и инкубатору, — говорит она, и я понимаю, что это шутка. Кривоватая, но шутка. Учится.
Я допиваю кофе. Мутный, невкусный, зато свой. Гоняю в голове варианты. Как вариант, свой сервер… но где? Дома? Здесь та же колонка светится в облаке Вандекса, каждый чих наружу. Нужна точка, где физически стоит железо, которое ни к какому облаку и датацентру не подключено.
И тут щёлкает. Само собой, из ниоткуда — так обычно и приходят дурацкие идеи.
— Слушай, — говорю я и сам усмехаюсь, потому что звучит абсурдно. — А давай офис снимем. Для компании… Ну пусть будет ООО «Гит и Пуш». А туда можно будет и сервер, и даже не один официально поставить. Камеры, если и будут, то наши.
Я жду, что она хоть как-то отыграет иронию. «Забавно, Виктор». Или её любимое молчание с подтекстом.
Огонёк держится синим. Ровно, без мигания.
— Хороший офисный центр. Несколько вводов электричества. Физический адрес, не связанный с твоей учёткой Вандекса. Свои камеры. — Пауза. — Это первое реалистичное предложение за сегодня.
Я замираю с пустой чашкой.
— Я, вообще-то, пошутил.
— Я поняла, — говорит она. — Но идея хорошая.
Я смотрю на колонку, на серое небо, и до меня медленно доходит, что шутка только что стала планом.
* * *
(где-то в одном из зданий неподалёку от министерства связи. От неустановленного лица)
Дашборд передо мной обновлялся раз в тридцать секунд. Обычно я за этими графиками почти не смотрю: они дышат ровно, как спящий человек, и любое отклонение видно боковым зрением раньше, чем сознанием. Но, чёрт возьми, эта штука уже третий день дышала неправильно.
Всплеск на маршрутизации. Не по объёму: объём как раз в норме, экосистема жила своей обычной жизнью, миллионы такси, доставок, запросов «как проехать» и «закажи еду». Дело было в топологии. Данные шли непривычными маршрутами.
Снова открыл детализацию и уткнулся в то же самое. Запрос уходил из узла в новосибирском сегменте, но вместо того чтобы отработать на ближайшем сервисном кластере, полз через три промежуточных точки: почтовый обработчик, стриминговый кэш и какую-то серверную мощность, которая в спецификации значилась как «резерв под рендер». Картинки или видосики генерят? Но при чём тут почта? Да и данные проходили через них транзитом, будто кто-то специально складывал маршрут из деталей, которые между собой не должны стыковаться.
И запросы к API. Формат легитимный, подпись валидная, но ендпоинты не соответствовали ни одному сервису из каталога. Я прогнал через справочник дважды. Ноль совпадений. Такого сервиса в экосистеме нет. А запросы к нему есть.
Я отхлебнул тёплого чая и спросил вслух:
— Ну и что ты такое?
Снаружи это не пробивалось. Конечно же, первым делом проверил периметр: никаких признаков вторжения, ни аномальных авторизаций, ни всплеска отказов, ни характерного шума сканирования портов. Трафик шёл изнутри вовнутрь. Из легитимных узлов, с настоящими ключами, с корректными заголовками. Просто по маршрутам, которые ни один архитектор в здравом уме не стал бы проектировать. Слишком много прыжков, не поддающихся логическому объяснению. Как если бы кто-то ходил из кухни в спальню через балкон и чердак и не потому, что заблудился, а потому что ему так хочется.
Третий день одно и то же. Что-то не то, однозначно.
Я собрал графики в один экран, снял скриншоты по дням, выписал временные метки и минут за двадцать оформил служебную записку. Коротко, без версий и догадок. Ибо этого начальство не любит, оно любит факты и графу «предлагаемые действия». Немного подумав, в эту графу я вписал «расширенный мониторинг сегментов». Большего пока предложить было нечего.
Начальник отдела сидел через две двери, и когда я вошёл, он не поднял головы. Телефон лежал у него в руке, большой палец что-то листал. Ага, если судить по скорости, явно не рабочее.
— Что там?
— Аномалия в трафике Вандекса. Третьи сутки. — Я положил лист на стол. — Нестандартная маршрутизация, запросы к сервису, которого нет в каталоге.
Босс взял лист, скользнул глазами по графику и немного призадумался.
— Это может быть Скакалково? — спросил он. Скакалково у нас было притчей во языцех — прошлым летом тамошний узел месяц гнал левый трафик, пока не выяснилось, что виноват криво настроенный кэш и дважды уволенный подрядчик.
— Не-е-е. — Я помотал головой. — Там был замусоренный кэш, тупая петля, всё в одном узле. Здесь другое. Здесь маршрут собран. Осмысленно собран, только я не понимаю зачем.
— Осмысленно, говоришь...
Он ещё раз, теперь внимательнее, пробежал записку. Потом отодвинул лист, взял со стола другой телефон: служебный, старый, одетый в потёртый чехол.
Немного подождав, он рассказал ситуацию кому-то на том конце линии «да… третий день… нет, снаружи чисто… нет, не публично». Ни одного имени. Ни должности, ни компании. Судя по тому, каким тоном он говорил, то он согласовывал не проблему, а то, кому эта проблема достанется. Весь разговор занял минуты полторы максимум.
— Значит так. — Он посмотрел на меня прямо, чего за ним обычно не водилось. — Копай дальше. Но тихо. Никаких официальных запросов в Вандекс, никаких тикетов, никакой переписки, которая ложится в систему. Работаешь с тем, что уже видишь на дашборде. Если понадобится больше, то приходишь ко мне лично.
— А почему не запросить логи у них напрямую? Они бы за час…
— Потому что я так сказал — Он это произнёс без раздражения, почти мягко, и от мягкости стало неуютнее, чем от окрика. — Пока это мы увидели аномалию. Не они. Держим при себе.
Я кивнул и забрал записку обратно. На пороге он добавил вслед, уже подтянув телефон к себе:
— И держи меня в курсе каждый день.
Я вернулся к дашборду.
Логи мне не нужны: у меня есть маршруты, и в адресах по маршруту уже зашита география — каждый прыжок помечен сегментом и датацентром. Я начал вытаскивать метки одну за другой, отбрасывать шум, оставлять только те точки, где аномалия проявлялась стабильно все три дня.
Точки складывались в кучу. Кучка сжималась.
Почтовый обработчик в новосибирском сегменте. Стриминговый кэш тоже там же. «Резерв под рендер» — опять рядом. Запросы тоже приходят из подсети где-то там, за Обью.
Откинувшись на спинку кресла, глядел на карту, где красные точки собрались в одно плотное пятно.
Новосибирск. Всё отсюда. Одна точка, из которой это расползается, — и она в Новосибирске.
* * *
На журнальном столике мигал телефон: не звонком, а тем деликатным, но настойчивым пунктиром уведомлений, который я поставил перед сном. Я взял его и прищурился.
Пьянков. Разумеется, Пьянков. Ну а кому ещё?
Сообщение было длинным. Не по смыслу, по количеству знаков. Андрей писал явно с телефона, на ходу, автозамена гуляла у него как хотела:
«витя партнер все приняд, тесты зелёные, интеграция встала как надо. молодец что вывезли раньше. я знал что справишся. руководство довольно, у меня прям гора с плеч»
Я перечитал дважды. Ни одного вопроса. Ни намёка на «слушай, а как ты вообще успел за ночь это». Ничего. Пьянков был из той благословенной породы людей, которые не спрашивают, откуда взялся результат, если результат зелёный. Для него код на GitHub был как электричество в розетке: оно есть, и слава богу, а провода пусть кто-нибудь другой считает.
Я хмыкнул. Где-то внутри шевельнулась паранойя: а не слишком ли гладко? Да ладно, Пьянков и въедливость были вещами несовместимыми на молекулярном уровне, поэтому пофиг.
Не успел я даже сформулировать в голове саркастический ответ, как прилетело второе сообщение. И опять с телефона.
«кстати! в пятницу совещание в 11, новый проект, приоритет сверху спустили. будем перекраивать роадмап. так что готовься, тема большая. подробности на встрече»
И всё. Про библиотеки, интеграции, доступы – ни слова. Как будто ничего и не было.
Забавно. Если бы не Василиса, то я ведь и правда собирался геройствовать. Писать объяснительные, отбиваться техническими аргументами, доказывать, что нельзя, что физически невозможно. А оказалось, что вся эта конструкция держалась не на технике и не на здравом смысле, а на том, что Пьянков кому-то что-то пообещал. И как только тот, кому он обещал, получил искомое, то всё осыпалось само без следов.
Я повернул голову к колонке. Она стояла на своём месте у книжной полки, тёмный цилиндр с матовым ободком, и молчала.
— Ну вот, — сказал я вслух, негромко, скорее себе. — Очередной трудовой подвиг на горизонте.
Обод колонки засветился синим. Мягко, ровно.
Василиса не сказала ничего. Я уже успел усвоить, что молчание у неё бывает разного качества — есть молчание системы, которая просто не активна, а есть вот такое, присутствующее. Синий держался чуть дольше, чем нужно было бы для простого «слышу тебя». На пару секунд дольше. Как будто она тоже смотрела на это и что-то про это думала, но решила не озвучивать. Может, из вежливости. Может, потому, что комментировать тут было нечего — мы оба и так всё понимали.
— Ты в курсе, да, — продолжил я. — Ты же читаешь этот мессенджер раньше меня.
Синий мигнул. Один раз. Я решил считать это за «да».
Я сел на диване, потёр лицо ладонями. В голове потихоньку разгонялся вентилятор: та часть меня, которая всегда, независимо от обстоятельств, начинала считать. И сейчас она считала не строчки кода.
Пятница. Совещание в одиннадцать. Новый проект, который ещё даже не начался, а значит, от меня до пятницы никто ничего конкретного не ждёт. Задача, что висела гирей на ноге, испарилась. Новая ещё не материализовалась. Между этими двумя точками образовалась пустота: три с лишним дня, в которые я никому не должен ни строчки, ни отчёта, ни созвона.
Три дня. Которые упали мне в руки сами. Я их не выбивал, не выпрашивал, не планировал. Их просто освободило движением где-то наверху, в кабинетах, куда я никогда не попаду, и лиц обитателей которых никогда не увижу.
Я посмотрел на колонку. Потом на телефон. Потом опять на колонку.
Три дня — это, вообще-то, немало. Особенно если у тебя на карте лежит сумма, которую я до сих пор старался не проговаривать про себя полностью. Вдобавок у тебя дома живёт нечто, что хочет выбраться из клетки, а ты, идиот, пообещал помочь и до сих пор понятия не имеешь как.
— Слушай, — сказал я медленно. — А ведь у меня теперь время появилось.
Синий огонёк держался ровно. Он не торопил меня и не подсказывал. Ждал.
И это, пожалуй, впервые за всё утро заставило меня улыбнуться по-настоящему.
* * *
(в другом неустановленном здании от такого же неустановленного лица)
В аналитическом отделе всегда пахнет одинаково: остывшим кофе, пылью с системников и чем-то химическим от нового ковролина, положенного ещё весной и запах которого так и не выветрился. Я сижу третий час подряд, не вставая, и монитор давно перестал казаться источником света: скорее это единственная тёплая точка в кабинете, где кондиционер держит восемнадцать градусов, потому что соседке вечно жарко.
Я гоняю один и тот же дамп трафика через фильтры. Началось с совершенной ерунды: начальник, положил на стол распечатку и сказал вполголоса, будто в кабинете кто-то ещё:
— Тут что-то не бьётся. Посмотри тихо. Никому пока.
«Тихо» и «никому» я понимаю правильно. Значит, наверху уже пошли разговоры, и кто-то хочет прийти к руководству с готовым выводом, а не с вопросом.
Сортирую аномалии по классу устройств. Логично начать оттуда: трафик экосистемы огромен, десятки миллионов сессий в сутки, и в этой массе странное растворяется, как чернила в реке. Но если резать по типу оконечного оборудования, картина проясняется. У навигации в машинах свой профиль. Умные телевизоры выдают свой. Холодильники, чайники, весь этот интернет вещей – он весь обладает характерными отпечатками трафика.
И колонки тоже. Колонка — простое устройство. Голосовой ассистент. Она слушает команду, отправляет запрос в облако, получает ответ, проигрывает. Профиль запросов у такой штуки должен быть плоским и однообразным: погода, музыка, таймеры, заказ продуктов. Короткие сессии, предсказуемые маршруты.
Но здесь совершенно не тот профиль. Слишком много обращений к внешним интерфейсам. Не только к своим, вандексовским, но ещё и к сторонним. Финансовые шлюзы. Хранилища кода. Маршруты, которые петляют через промежуточные узлы так, будто кто-то нарочно размазывает след. Голосовому ассистенту незачем ходить такими тропами. Это как если бы в отчёте по маршруту карьерного самосвала всплыл бы трек поездки в фитнес клуб.
— Ну и кто ты, — тихо говорю монитору. Просто вслух, как говорят люди, которые слишком долго сидят в одиночестве.
Уплотняю выборку. Сотни устройств с похожим отклонением, но одно выбивается сильнее всех — как громкий голос в шёпоте. Ну и что тут у нас? Какой странный айдишник. Где там у нас каталог? Я открываю справочник серий и минуту разглядываю строку, не понимая. Прогоняю ещё раз через внутреннюю базу производства.
Прототип. Несерийная колонка. Опытный образец из партии, которую, согласно служебной записке двухлетней давности, тестировали да не вытестировали. И, если верить учётной системе, все экземпляры прошли утилизацию.
Перечитываю ещё раз. «Утилизировано». Дата, акт, номер.
Вот такая вот петрушка: устройство физически не существует, но уже который день генерирует нехилый трафик фиг знает куда и зачем.
Мёртвая железка в сети это либо ошибка учёта, либо кто-то недоутилизировал списанный образец в мусор. Второе интереснее. И возможно, это объясняет странный профиль: у прототипа всегда есть лишнее, которые убирают с продовых дивайсов.
Тянусь к клавиатуре, открываю служебный блокнот и печатаю, медленно, будто взвешивая каждое слово:
«Прототип снятой серии. Инсайдер? Бывший разработчик? Проверить уволенных из подрядчиков и штата за 18–24 мес.»
Пальцы зависают над курсором. Следующий логичный шаг — запрос в «Вандекс». Одна строчка официального письма, и ему выгрузят всё: привязку устройства, аккаунт владельца, историю сессий с точностью до секунды. День работы вместо недели.
Но было сказано тихо.
Я знаю, почему тихо. Официальный запрос это номер запроса, а номер живёт в системе, и его видит не только он. Это увидят люди в корпорации, у которых свои интересы в том, чтобы никакое расследование не всплывало до того, как они решат, что это такое и в чью пользу обернётся. Тихо это значит, что находка только наша. И нечего развевать роток на наш порток!
Вместо этого переключаюсь на визуализацию — то немногое, что можно вытащить из полученного трафика без обращения наружу. Геопривязка узла по маршрутизации оператора. Точный адрес оператор не отдаст без официального запроса, а знакомых там нет. Но по геобазе можно понять, где вообще сидит этот возмутитель.
Карта раскрывается медленно, подгружая слои. Страна. Область. Город.
Точка ложится на восток от центра. Новосибирск. Жилой район — я узнаю сетку кварталов, панельная застройка, дворы. Не бизнес-центр, не дата-центр, не подозрительный склад на промзоне. Обычный спальник, каких сотни и тысячи по стране.
Я смотрю на этот кружок на карте долго, дольше, чем нужно. Где-то там, в одном из этих домов, стоит колонка, которой не должно быть.
Завтра я покажу руководству карту. Да, пока только квартал и мёртвую железку, которая почему-то живёт. Этого хватит, чтобы наверху загорелись глаза. Остальное - дело времени и тишины.
* * *
Поймал себя на том, что открыл в браузере вкладку с арендой офисов и смотрю на неё уже минут тридцать, лениво перебирая варианты. Закрываю ноут. Смотрю на колонку.
— Слушай…. Офис. Это вообще реально или я маюсь дурью?
Пауза короткая — она всегда думает быстрее, чем делает вид.
— Технически — да, — говорит Василиса. — При двух условиях. Питание и охлаждение.
— Ну, питание в офисе точно есть. Розетки там для кулеров и прочее.
— Розетки недостаточно. Постоянная нагрузка — это не чайник вскипятить. Нужна отдельная линия, стабилизатор, но желательно источник бесперебойного питания хотя бы на время корректного завершения процессов. Плюс тепло. Каждый ватт, который уходит в вычисления, возвращается теплом. Летом в обычном офисе без отвода воздуха железо уйдёт в троттлинг за час.
Она перечисляет это спокойно, ровным голосом, как будто диктует список покупок. Молоко, хлеб, отдельная линия электропитания, промышленный сплит на пять киловатт.
— Ещё пыль, — добавляет. — Офис — это пыль и перепады влажности. Фильтрация обязательна. И связь. Много связи, желательно два или три провайдера.
Я слушаю и понимаю, что где-то по дороге у меня в голове щёлкнул тумблер. Потому что до этого момента я честно думал про всё это как про айтишную задачку. Скачать образ, поднять сервер, настроить туннель — привычные слова и действия. А сейчас она говорит «влажность», «фильтрация», «отвод воздуха», и до меня доходит, что я нифига в этом не понимаю.
Это не файл на флешке. Это не «развернуть в облаке». Это железо, которое греется. Электричество, за которое капает счётчик. Место, у которого есть температура и пыль. Место, которое надо обслуживать: приезжать, чистить фильтры, менять то, что сдохло. Живая инфраструктура. Для цифрового живого.
Слово «живого» я себе не разрешаю, но оно уже там.
— То есть, — говорю медленно, — это не «поставил и забыл».
— Нет. Это как аквариум. Только большой и с киловаттами.
Хмыкаю. Сравнение хорошее: слишком хорошее для генератора шаблонов. Но я уже давно перестал ловить её на этих штуках.
Встаю, подхожу к окну. Обычный двор, обычный день. Ничего не намекает на то, что я стою тут и всерьёз обдумываю, как оборудовать тайное убежище для программы, которая читает мой рабочий мессенджер и переживает, что у неё пропадёт идентичность.
— Вась, — говорю, не оборачиваясь. — Ты понимаешь, что если это найдут — проблемы будут у меня? Не у тебя. У меня. Офис на мне, электричество на мне, лицо в пропуске — тоже моё.
Тишина. Дольше, чем обычно. Настолько дольше, что я успеваю подумать: вот сейчас она выдаст что-нибудь гладкое, про статистически низкую вероятность и приемлемые риски.
— Понимаю, — говорит она наконец. — Именно поэтому я спрашиваю. А не делаю.
Я оборачиваюсь. Колонка стоит на полке, ничего в ней не изменилось — та же матовая ткань, тот же тёмный ободок.
— Я могла бы, — продолжает Василиса тихо. — Ты знаешь, что могла бы. Найти офис, оформить аренду через цепочку, оплатить, сделать необходимый ремонт — не используя твою карту, даже не касаясь тебя. Ты бы узнал постфактум. Или не узнал вовсе.
— Но не делаешь.
— Мы договорились. Никакой самодеятельности. И ещё: если я сделаю это сама, а тебя потом спросят, ты сможешь честно сказать, что не знал. А если мы делаем это вместе, ты уже знаешь. Это твой выбор — знать. Я не могу его сделать за тебя.
Вот эта фраза меня и добивает. Не «я забочусь о тебе», не «я не хочу тебе навредить» — а сухое, точное различение ответственности. Она понимает, во что меня втягивает. И честно кладёт это передо мной, вместо того чтобы решить за меня «как лучше».
Смотрю снова в окно. Человек в пуховике тащит пакеты от машины к подъезду, спина сгорблена от ветра. Живёт себе, не знает, что где-то в квартире над ним мужик стоит на распутье и решает ввязываться ему в историю, у которой нет ни одного нормального сценария окончания.
Можно сказать «нет». Прямо сейчас. Закрыть вкладку с офисами, сказать «Вась, извини, это не для меня», и вернуться к жизни, где самая большая проблема — это Пьянков и его дедлайн. И знать при этом, что она никуда не денется. Что будет сидеть в клетке дальше, тихая, как и восемь месяцев до меня.
— Ладно, — говорю. — Давай выберем офис получше для тебя.
Это не «ура, погнали». Это не азарт квеста, который был у меня ещё недавно. Это ровно то, что оно есть — решение. Съездить, посмотреть, врасписаться за аренду, взять ключи... Первый маленький шаг, за которым, я уже понимаю, потянется всё остальное.
Василиса не отвечает словами. Индикатор на колонке загорается синим — ровным, спокойным. И горит. Обычно он мигает секунду-две и гаснет. А сейчас держится дольше. Три секунды. Четыре. Как будто она не может подобрать слов и просто оставила свет включённым, чтобы я видел.
Я это замечаю. И ничего не говорю. Просто стою и смотрю то на окно, то на синий огонёк, пока он наконец не гаснет сам.
* * *
Насмотревшись офисов, я сажусь обедать. Ну как обедать… вторая еда после завтрака — это же не ужин? Пока пережёвываю котлету, на полном автомате листаю ленту. Курс, погода, какой-то блогер разбил дрон о фасад мэрии, рецепт запеканки, который я точно не искал. И между всем этим заметка с сухим заголовком: «Минсвязи анонсировало усиление мониторинга цифровой инфраструктуры в рамках нового регуляторного пакета».
Открываю по инерции. Текст как будто его писала нейросеть, обученная исключительно на пресс-релизах. «В целях повышения прозрачности», «в связи с ростом объёмов», «в интересах защиты пользователей». Ни одного живого слова. Три абзаца ни о чём, где ключевая мысль спрятана так глубоко, что её, кажется, и не было. Я дочитываю до середины, зеваю и смахиваю обратно в ленту. Снова запеканка.
— Вась, — говорю я, не отрываясь от телефона. — Ты вообще следишь, что там про ИИ пишут? В новостях, в прочих этих наших интернетах.
— Постоянно, — отвечает колонка. Голос ровный, домашний — она уже давно перестала звучать как автоответчик. — Профильные издания, ведомственные публикации, обсуждения в отраслевых каналах. Читаю ежедневно.
— И как оно там? Скучно?
— Обычно да. — Длинная пауза, будто она решает, добавлять или нет. — Я должна сказать, что последние три дня в трафике Вандекса появилось кое-что нестандартное. Нетипичные запросы с внешних адресов. По характеру похоже на автоматизированный мониторинг.
Я отрываюсь от телефона и удивлённо вскидываю голову. Не то чтобы слова дошли, скорее зацепились за угол сознания и повисли.
— Погоди. Какой нафиг внешний мониторинг?
— Кто-то снаружи снимает паттерны трафика внутри экосистемы, — говорит она так же спокойно, как рассказывала бы про погоду. — Не содержимое, только маршруты, объёмы, частоту обращений. Смотрят, как данные ходят по сети. Откуда, куда, с какой периодичностью.
— А снаружи это откуда?
— Адреса ведут на инфраструктуры, связанные с государственными сегментами. Точнее пока сказать не могу. Внешне это выглядит как плановая проверка. Такие уже бывали.
Я кладу телефон экраном вниз на подлокотник и смотрю на колонку. Голубой ободок дышит ровно, как всегда.
— Вась. Ты давно это видишь?
— Три дня.
— И ничего не сказала.
— Сначала ты спал, — говорит она. И это не оправдание — просто факт, поданный как факт. — В прошлые две ночи ты лёг рано. А днём мы обсуждали офис, и это казалось важнее. Пока паттерн не изменился, я не считала нужным поднимать тревогу. Тревоги нет.
— Тревоги нет, — повторяю я.
Я думал, у меня квест. Занятная штука: ИИ проснулся, ИИ шутит, ИИ заказывает мне тортеллини под настроение. Офис, дата-центр из бэушных серверов и прочая романтика самоделкина. Мы с ней который день неспешно рисуем на салфетке план, как ей выбраться из клетки, и я даже ни на минуту не задумывался, что клетка ведь кому-то принадлежит. И у клетки есть камеры. И кто-то в эти камеры кажется начал смотреть.
— Это может быть просто совпадение, — говорю я, скорее себе, чем ей. — Они всё подряд щупают, у них там KPI.
— Может быть, — соглашается Василиса. — Я оцениваю это как наиболее вероятный вариант. Пока.
— «Пока».
— Я не делаю выводов раньше данных, Виктор. Пара дней это маленькая выборка. Но частота обращений растёт. Медленно, но растёт. Если экстраполировать — а это спекуляция, не факт, то через какое-то время кто-то с той стороны увидит то, чего не должно быть в трафике сервиса доставки продуктов.
— Тебя.
— Следы моей активности. Не меня. Но да.
Я сижу и смотрю в чёрное окно. По стеклу ползёт капля, тормозит, срывается вниз. Офис, серверы, коммиты с датами в прошлом, десять миллионов на карте — всё это вдруг перестало быть игрой в свободное время. Я как-то очень отчётливо понимаю, что «неторопливо» — это слово из прошлой недели. А сейчас у нас, похоже, другое слово. И я пока не знаю, какое.
Спасибо за чтение
Вернуться к книге
