Глава 4. Будний день
Просыпаюсь и тут же снова засыпаю. Мимо меня поначалу беспорядочно топчется туда-сюда Коля, а потом проходит на кухню жена – готовить завтрак. Ничего, ничего, отрываюсь как мыльный пузырь, попадаю было в сон, а он меня отбрасывает. Это реальность, утро, четверг. Переворачиваюсь на другой бок, но мешают звуки портативного телевизора из кухни. Прижимаю правое ухо к простыне, на левое кладу подушку. Коленька скучает и ноет, моя мама фальшиво напевает ему: «мы везём с собой кота, чижика, собаку, кошку-забияку». Ещё лежу, и ещё лежу. А теперь всё, я уже достаточно вертикален. Пытаюсь подняться – ох, нет, недостаточно. Продолжаю лежать. У меня крепкий утренний стояк. В проходной комнате темно, на балконе сушится бельё. По ночам в квартире холодно, и я сплю в куртке-аляске и шерстяном шарфе, иначе проснусь с больным горлом. Начало ноября, но топить всё никак не начнут. Сажусь в кровати, какое-то время провожу неподвижно, адаптируясь к вертикальности. Протягиваю руку и беру с тумбочки пластмассовую хлебницу (точнее, бывшую хлебницу), где обустроились два мои мыла – грубое хозяйственное и мягкое дегтярное. Иду в ванную, с помощью дегтярного намыливаю тело и принимаю душ. Выхожу на кухню («вот и папа проснулся»), обнимаю Олю, прижимаюсь щекой к её плечу. Она, не отрываясь, смотрит визгливую передачу с клоунами-докторами. Возвращаюсь, падаю в постель: всё ещё не слишком вертикален. Мама передаёт мне с рук на руки Коленьку; ей хочется сходить в туалет. Разнывшийся малыш у меня на руках затихает. Улыбается, потом хватает меня за нос острыми коготками – пора бы их подстричь. Я притворно хмурюсь, но на деле подсмеиваюсь заразительному Колиному хохоту. Подхожу с малышом на руках ко круглому зеркалу. Коленька мгновенно ощупывает металлический узорчатый край; но особенно интригует его бумажный цветок, наклеенный поверх трещины в стекле. Приходит Оля и забирает сына у папы. Снимает подгузники, несёт Коленьку в ванную, мыть попку. Тот сохраняет лучезарно-философское выражение лица даже под струёй воды, окатывающей его из крана. Мне пора начать работать над стихами. Могу пропустить время, и тогда пиши пропало: выйду из подходящего для стихов полусонного состояния. Придётся ковыряться с прозой, а это не так интересно. Я беру три недавно купленные книги, один журнал, одну распечатку. Кладу их на подоконник, рядом с пустым Колиным горшком. Врач мне говорила, что сидеть лучше по-американски, задрав перед собой ноги на стол. Со стихами это возможно, а с прозой не получается. И на работе так не посидишь – разве что поздно вечером, когда никто не видит. Оля в соседней комнате напевает Коленьке детские песенки. Я кричу, требую перестать или закрыть дверь: это ужасно отвлекает. Меня никто не слышит, я подбегаю к двери, закрываю её сам. Становлюсь ужасно истеричным, когда работаю с текстами. Всех вокруг раздражаю и раздражаюсь сам. Спасибо, золотая Олька: забрасываю ноги на подоконник, беру в руку приготовленный для меня бутерброд. Читаю одного, затем другого гениального автора. Читаю третьего автора, украинского, неповторимого. Над переводами его текстов я корплю уже долгий срок, почти без продвижения. Такое чтение должно разогреть мою психику и настроить её на собственные стихи. Но психика не разогревается. За моей спиной происходят некие перемещения: мама раскрывает входную дверь, выкатывает наружу стоящую в коридоре коляску, спускается с ней на лифте. Вслед за ней выходит Оля с ребёнком на руках, идёт вниз по лестнице. Через пять минут мама возвращается, добывает из холодильника суп и разогревает его. А нельзя было подождать? Видишь же, я пытаюсь писать. Нельзя подождать, ты не один живёшь в квартире. Слово за слово, начинается ссора, а мне нужна тишина; я собираю книги, перехожу из кухни в спальню. Окно раскрыто на проветривание, Оля жить не может без свежего воздуха. Приходится его закрыть, не только из-за холодного сквозняка, больше из-за шума трассы, который не даёт сосредоточиться. На набережной появляется Оля с коляской и показывает мне кулак. Я развожу руками: не могу иначе, надо прекратить шум. Взамен раскрываю балкон в проходной комнате, где я ночевал. Возвращаюсь к письменному столу. Нет, чтение опять ничего не даёт, всех авторов я уже читал раньше, никто из них меня не удивляет, ни с кем я больше не резонирую. Буду писать прозу. С ней и проще, и труднее. Во всяком случае, в такой текст гораздо легче войти. Если стих предполагает прорыв на новую территорию, то проза – обживание уже знакомых пространств. Я действительно с лёгкостью набрасываю две новые страницы. Потом в комнату заходит мама, чтобы попрощаться перед уходом на работу. Продолжает обижаться из-за моей грубости на кухне. Мне кажется, ничего особенного не произошло: сейчас, когда мы живём вчетвером на крохотной территории, уровень внутренней агрессии в семье велик, и планка, с которой начинается скандал, существенно выше этой мелкой стычки. С Олей мы ссоримся часто и бурно; я громко матерюсь, она распускает руки. Сегодня я, по крайней мере, не сказал ни одного нецензурного слова, а такое бывает редко. Не вставая из-за стола, я нервно бормочу: извини, мама, но сейчас иди, иди, не мешай мне, пожалуйста. Трижды отражённая в створках трюмо, мама крестит мне спину перед тем, как выйти из квартиры. Поток прозы легче лёгкого перебить, а войти в него обратно трудно. Я задумываюсь, а стоит ли пытаться, утреннее время дорогое, и остаётся его немного. Вопрос решается сам собой: звонит Оля, ей нужно зайти в супермаркет и выбрать хорошую рыбу, без жёлтых пятен, а мне, следовательно, – перехватить у ней коляску на набережной. Пока они с Колей возвращаются из парка, и у меня есть ещё несколько минут. Я коротко и растрёпано молюсь. Надеваю верхнюю одежду и попутно пролистываю фейсбук. Моя знакомая, поэтесса и драматург, выложила новые фотографии. Полузаброшенные посёлки, высокое небо над ними. Какой у ней точный глаз, удивительные ракурсы. Несколько новых лайков к выложенным мной вчера вечером переводам. Одно сообщение, от этой же поэтессы: когда мы повезём Колю в её город на консультацию, она не сможет нас разместить в своей квартире. Разъезжается с бывшим мужем и не знает, где сама будет жить через неделю. Значит, придётся остановиться в гостинице, может быть, надолго. Это недёшево, да и всё, что связано с Колиным лечением, обходится в большие деньги. Закрываю дверь и, не дожидаясь лифта, сбегаю по лестнице. В углах лестничных площадок висит чёрная паутина. Потолки закопчены, на стенах разводы сажи – недавно в подъезде был пожар из-за неисправной проводки. Двор залит лёгким, прерывистым светом из-под перистых облаков. Навстречу друг другу торопятся на занятия студенты консерватории, студенты таможенной академии. Первые одеты артистически пёстро, а вторых легко опознать по унылой униформе. Ворота, замыкающие двор, настежь открыты, и над ними на осеннем ветерке развевается двуцветный флаг. Я подбегаю к переходу; недавно здесь поставили светофоры, но я постоянно об этом забываю. Выскакиваю на проезжую часть и едва увёртываюсь от автобуса. С противоположной стороны улицы Оля снова грозит мне кулаком. Зелёного светофора ждать ещё шестнадцать секунд. Рядом со мной стоят студентки-таможенницы в коротких форменных юбках, одна – в обнимку с индусом ниже неё на полголовы. Проезжают маршрутка, грузовая фура и такси, за ними дорога свободна вплоть до самого моста, и я перехожу её, хотя до перемены света остаётся ещё несколько секунд. Оля хмурится – ну неужели сейчас начнёт промывать мне мозги? Пока я пересекаю остаток проезжей части, внутри скапливается сильное раздражение. К счастью, Оля уже смотрит на уснувшего Коленьку, нежная улыбка оживляет её лицо, делает его прекрасным и юным. Хорошо, что она не стала злиться. Какое-то время мы идём вместе по набережной. Я внимательно смотрю на разноцветную плитку, чтобы колесо коляски не налетело на притаившиеся здесь и там бутылочные осколки. Не замечал их, пока не появилась коляска. Каждый месяц приходится покупать на рынке новую камеру взамен пробитой, а если быть ротозеем – то чаще. На набережной видно, что транспорт с левого берега зажат на мосту в пробке и почти не движется. Как удачно, что я живу и работаю в центре, а значит, никак не связан с маршрутками. Оля рассказывает о состоянии ремонтных дел в купленной нами квартире. Работники, которых присоветовала моя мама, её бывшие ученики, закончили штукатурить и красить на кухне. Мало того, что раздолбали электрическую розетку рядом с батареей, на прощание ещё и украли респиратор. Оля созвонилась с паркетчиками, те как раз окончили шлифовку в обеих комнатах. Необходимо вынести мебель в коридор и на кухню, чтобы они начали лакировать. Ладно, я поговорю на работе с товарищами, завтра на перерыве всё сделаем. Возле скульптуры, что изображает женщину, обхватившую руками голову – вместо самой головы красуется овальное отверстие – Оля сворачивает на боковую дорожку и уходит от нас по направлению к супермаркету. Пересекает дорогу на опасном светофоре, где автомобили постоянно поворачивают на красный свет. Я любуюсь её походкой – плавной, точной. Коленька, одетый в тёплый костюм медвежонка, почмокивает во сне губами. Я везу коляску через площадку под мостом, где открывается вид на двойной ряд мощных опор, уходящий в притенённую бесконечность. Погода пока ещё солнечная, и по опорам скользят отражённые блики. Несколько лет назад я часами мог стоять с удочкой, глядя на игру световых линий. Теперь всё лишнее отсечено, время строго распределено, и даже на главные вещи его хронически не хватает. Осколки встречаются на этой площадке намного чаще, приходится выписывать между ними замысловатые каракули. За мостом отпочковывается вторая дорожка, подальше от воды, поближе к проезжей части. Прохожу каштановую аллею, и за ней, после аляповатой часовни, аллею берёзовую, объезжаю памятник воинам-афганцам в виде застывшего бронзового взрыва, – вокруг него, как обычно, тусят скейтбордисты. Теперь площадка с фонтаном: во включённом состоянии он напоминает пушистого котёнка, а в выключенном, как сейчас, – сжавшегося в клубок ежа. Я останавливаюсь и вынимаю из сумки электронную книгу. Одной рукой держу её, другой покачиваю коляску, чтобы ребёнок не проснулся. Лучезарная погода портится, небо над рекой стремительно затягивают грозовые облака. Коля открывает чёрные глаза, глядит куда-то поверх моей головы. Снова закрывает и снова открывает. Это сигнал к действию: в это время он уже хочет есть, а значит, скоро будет нервничать и хныкать. Я дочитываю страницу и убираю книгу, разворачиваю коляску, прохожу в обратном порядке через аллеи. Звоню Оле – она уже на кассе. Иди поскорей, здесь дождь собирается – я так и думала, у меня с утра раскалывается голова. Где встречаемся? Давай на набережной, возле гостиницы. Поднимается резкий ветер, здесь нас с Колей уже не отгораживают от реки деревья, и везти коляску против этих воздушных порывов трудно. По реке приближается дождь: гладкое и прозрачное пространство покрывается волдырями. За первыми разреженными полосами идёт фронт густого ливня, где речные волны разглаживаются, как под утюгом. Я перехожу на бег, хотя из-за ветра не получается передвигаться быстро. На бегу пою все подряд, какие приходят в голову, детские песни; Коленька начинает было беспокоиться и ныть, но услышав папин голос, умиротворяется и стихает. Приходится целую минуту ждать, пока на светофоре не загорается зелёный. Ливень движется со стороны моста, накрывая дом за домом по набережной. Наконец я пересекаю проезжую часть и завожу коляску под бетонный козырёк перед гостиничным входом. Одновременно у дальнего края гостиницы появляется Оля, несущая два тяжёлых пакета с продуктами. (Всегда её прошу – не нагружайся, тебе нельзя, бери только самое необходимое, а остальное я сам куплю на выходных). Оля торопится, видя наступающий дождевой фронт. Я оставляю коляску, бегу к ней навстречу, перехватываю пакеты, и под козырёк мы влетаем вместе под уже начавшимся градом. Я не верю своим глазам: лета давно нет, ноябрь начинается – и тем не менее, это настоящий град, крупный, хлёсткий. Ледяные кругляши скачут по ступенькам. Из соседнего кафе выглядывают бариста и официантка. Град мельчает и постепенно разбавляется размашистым ливнем. Решаем, что всё-таки надо идти домой – мы ведь совсем рядом. Накрываем коляску полиэтиленовым чехлом, который лежал прежде на полке возле колёс, а на место чехла заталкиваем один из продуктовых пакетов. Коля изумлённо смотрит на ливень, сжимая кулачки, время от времени выкрикивая «бу!» и «ба!». Теперь Оля везёт коляску, я несу второй пакет. Мы с ней сразу же вымокаем до нитки. Ворота во двор заперты, и охранника не видно. Я вынимаю связку ключей, чтобы отрыть боковую, пешеходную калитку. Придерживаю её, пока Оля поднимает коляску на бордюр перед дверью, провозит внутрь и спускает с бордюра. Теперь к подъезду, его я тоже открываю. Коленька в порядке, в коляске совершенно сухо. Оля берёт его на руки, тащит наверх. Я переношу пакеты с продуктами к первому лестничному пролёту, кладу их на тумбочку под почтовыми ящиками. Нажимаю кнопку лифта и возвращаюсь за коляской. Вытягиваю и её в лифтовую зону, перекладываю пакеты на опустевшее сиденье. Лифт у нас в подъезде старинной конструкции; надо вручную открыть внешнюю решетчатую дверь, раздвинуть деревянные створки, завезти коляску в лифт по диагонали, чтобы она поместилась, поставить её после этого прямо, чтобы не мешали колёса, закрыть за ней левую створку, устроиться в тесноте поудобнее самому и закрыть створку правую. Нажать кнопку, медленно подняться на свой этаж, после чего проделать все операции в обратном порядке. На этаже я слышу громкий Колин рёв. Пятясь, завожу коляску в квартиру, в коридорный простенок за дверью, затем наклоняюсь над коляской, притягиваю дверь за привязанный к ручке ремешок и щёлкаю замком. Сбрасываю мокрую верхнюю одежду и спешу к ребёнку. Оля ушла на кухню готовить себе чай с молоком и звонить по телефону. По её мнению, ничего страшного не произойдёт, если Коля немного побудет один. Мне это не нравится: мальчик орёт изо всех сил и перегружает больное сердце. Не слишком ли мы его разбаловали? Тем не менее, раз уж Коля завёлся, только лишь песенками не отделаешься. Пока я переодеваюсь в сухую одежду, громко и с выражением читаю «Богородице, Дево, радуйся» и «Верую во единого Бога Отца, вседержителя». Молитвы помогают, Коля прислушивается и перестаёт кричать, уровень недовольства снижается до ровного хныканья. Переодевшись, я сажаю его себе на плечи, расхаживаю по квартире. Ещё недавно я боялся с ним так обращаться: как ребёнка контролировать снизу? что, если он потеряет равновесие? Но я убедился, что Коля ведёт себя на плечах у папы ответственно и осторожно, наклоняется для баланса к папиной голове, держится за волосы или уши. Мы подходим к зеркалу и заглядываем в него. Молодой человек на моих плечах уже улыбается, хотя и неуверенно. Вылитый я – но глаза у него мамины, тёмные, и форма носа по сравнению с оригиналом улучшена, появилась выразительная горбинка, а толстая перепонка между ноздрями сократилась, стала не такой заметной. Я усаживаю ребёнка на его любимое креслице, стоящее на подоконнике. Проезжающие внизу автомобили занимают Колю недолго, – начинает отталкиваться пятками, так что сиденье опасно дрейфует к краю. Разворачиваю креслице так, чтобы его спинка упиралась в стенку. Теперь Колю начинает интересовать коробка конфет, подаренных его бабушке учениками. О том, что конфеты вкусны, Коля не догадывается – они привлекают его яркими фантиками. Он вынимает конфеты по одной, мнёт, бросает обратно в коробку, размахивает цветными бумажками, возит ими по оконному стеклу. Оля возвращается из кухни с большой кружкой чая с молоком. Коля издаёт приветственный вопль и тянет к ней руки. Ню, говорит ему Оля, уже не плачешь? Берёт его на руки и переносит на кровать. Расстёгивает бюстгальтер и даёт грудь, – Коля ест жадно, заглатывая воздух, а Оля прихлёбывает чай из кружки, в то же время рассказывая мне о звонке своей мамы. Прояснилась судьба посылки, которую та выслала нам неделю назад. Оказывается, в Черновцах, на полпути к нам, сортировщик не разобрался, что из Италии пришли две разные посылки от одного и того же лица. Скрепил их вместе и выслал обе по верхнему адресу – Олиной сестре, Тени. Теперь та передала нашу посылку с рейсовым автобусом, который будет в Новом центре уже через полчаса. Как раз есть время, чтобы добраться и перехватить. А по дороге, попросила Оля, зайди ещё и в хозяйственный, возьми увлажняющий крем и подгузники для Коли. Дождь окончился, но стало сыро и холодно, в выбоинах на дороге собрались глубокие лужи. Возле будки охранника стоит группа из семи или восьми дворовых активистов, обсуждает, как собирать деньги со владельцев автомобилей. Молодые люди успели уже превратить двор в платную ночную стоянку. Но по крайней мере, он теперь закрыт по вечерам, и в него не заходит с набережной молодёжь, чтобы облегчиться. Я выхожу из двора через калитку, у свадебного салона поворачиваю на улицу с безликими жёлтыми зданиями, с единственным граффити, изображающим домохозяйку с артистическими наклонностями: она, встав на цыпочки, вывешивает чулки на просушку. Свисающие с верёвки полосы повторяют рисунок на шкуре стоящей рядом с ней зебры. Сразу за жёлтыми зданиями смотрят друг на друга через дорогу два заброшенных особняка. Первый из них – руина хроническая, с рухнувшей крышей и выросшим внутри молодым леском. Когда проходишь мимо, в оплетённых плющом верхних окнах появляется и исчезает, будто чёртик в коробке, стоящий за особняком небоскрёб. Дом на другой стороне попрочней, он обезлюдел всего несколько лет назад, и выглядит более трагично. Упорно сопротивляется разрушению, но не выдерживает этой борьбы – то у него рухнет опорная балка, то обвалится одна из лестниц. Сейчас на решетчатом балконе второго этажа стоит собака и лает во влажное пространство. Бог её знает, как она туда попала – не летает же по воздуху. Я сворачиваю в Ломаный переулок и выхожу через него в классический еврейский квартал с двумя старинными синагогами. Один из домов тщательно отреставрирован, – в нём жил знаменитый ребе, – а другие по-прежнему пляшут вприсядку. Вот и нужная мне автобусная остановка. Я забираю у шофёра передачу, расплачиваюсь и торопливо иду к хозяйственному магазину. Ассортимент здесь шире, чем в том супермаркете, где Оля была с утра. У входа заминка: я долго проталкиваю посылку в узкую ячейку для хранения. Хватаю одну из маленьких тележек, провожу её сквозь вертушку на входе в торговый зал, пробираюсь через вертушку сам. Я редко бываю в этом магазине и не знаю, где какой товар лежит. Крем нахожу сразу, но долго разыскиваю подгузники, приходится даже спросить у работницы, выкладывающей новый товар на полки. Хватаю их – и вот я в очереди перед кассой. Бесцветная кассирша медленно, с запинками пробивает каждый товар. Успеваю вытащить электронную книгу и прочитать две страницы. Расплачиваюсь и спешу к ячейке – но ключа от неё в кармане нет. Не видно его и в тележке. Я выбит из колеи; звоню Оле, но она начинает потешаться над моей беспомощностью. У меня нет времени это всё выслушивать, подскажи, что я могу сделать. А ведь верно, надо спросить у кассира и охранника, самому не пришло в голову. Кассирша ключа с номерком не видела, и она вообще таких вещей не решает. Охранник спрашивает: что было в ящике? А что в свёртке? Идите за мной. Мы проходим в маленькую комнату позади кассового зала, там сидит ещё один охранник и следит через камеры за кассовым залом и площадкой перед ячейками. Он выдаёт мне ключ, – я просто позабыл закрыть дверцу. Ох и придурок. Скорей, скорей, не брать же сегодня отпуск. Бегу с тяжёлой посылкой в руках, время от времени переходя на шаг, чтобы отдышаться. Дома выкладываю крем и подгузники на тумбочку в прихожей. Забрасываю в сумку приготовленные Олей банку с гречневой кашей и бутерброды. Оля рядом, стоит с Коленькой на руках. Жалуюсь ей: из-за всех этих покупок опаздываю на работу. Опаздываешь ты из-за своей глупости. Зачем ты вообще пошёл в хозяйственный магазин? Но ты сама сказала, что нужно зайти. Ты ведь видел, что времени нет. Всё это можно было купить в субботу. Ну какого чёрта! Конечно, я никуда бы не пошёл, но я считал, что дело срочное. Думал, у Коли не осталось подгузников. Знаешь, больше не посылай меня в будни за ненужными вещами. А что это за крем? Ты же не тот крем купил, это взрослый! Что за херня, ну какой ещё крем?! Оля не переносит мата; тюбик летит в меня и больно бьёт по губам. Я перехватываю его, пока он падает, и тоже швыряю – в сторону, сминая его о стену прихожей. Коля пугается, видя разозлившегося папу, и прячет голову внутрь Олиного халата. Оля свирепеет и начинает кричать: ах ты ничтожество, убирайся вон отсюда! Ни на что не годен, ни покупки сделать, ни даже отлюбить нормально не может! Я выскакиваю за дверь; в такие моменты в меня могут полететь любые предметы, подвернувшиеся Оле под руку. Из-за моего быстрого ухода она не получает сатисфакции. Пока я поднимаюсь по Крутогорной улице, Оля трижды звонит мне и трижды объясняет по-разному, почему я ничтожество. Каждый раз я отвечаю «раз так, давай разведёмся» и обрываю звонок. Нервничаю, размахиваю руками, бормочу под нос: сама просрала научную карьеру – и ещё смеет меня поучать? В четвёртый раз, после паузы, Оля более спокойным тоном сообщает, что перечитала инструкцию: крем подходит и для грудных детей. Но не смей материться при Коле, я до сих пор на тебя зла. Извини, мне самому неприятно. Это всё из-за того, что я так нервничаю, когда опаздываю. Дошёл до офиса, больше не могу разговаривать. Поднимаюсь по мраморным ступенькам к столику охраны и турникетам. Как всегда, трудно нащупать в сумке бумажник с электронным пропуском – из-за лежащих в том же её отделении зонтика, банки с кашей, кошелька и антисептика. Приходится положить сумку на столик рядом с охранником, залезть внутрь обеими руками. «Гвард» –похожий на суслика человек с близко посаженными глазами – неодобрительно смотрит на мои манипуляции. Наконец я прикладываю бумажник к датчику, турникет скрежещет и пропускает меня внутрь. Лифтом я обычно не пользуюсь, его слишком долго приходится ждать. Поднимаюсь на пятый этаж по боковой лестнице, перепрыгивая через две ступеньки. Вытираю влажные подошвы ботинок о резиновый коврик у входа в оупен спейс и спешу на рабочее место, – оно расположено в кубрике слева от лестницы. Почему-то не видно Димы Бритвина, моего начальника. Заглядываю через перегородку – в соседнем кубрике нет на месте Дарьи. Может быть, у нас бизнес-митинг? Чтобы сэкономить время, не иду к вешалке, а сбрасываю куртку на кресло. Подхожу к митинг-комнате: да, угадал, весь актив юнита уже там. Почему-то не видно нашего продакта, прилетевшего к нам из Швейцарии на прошлой неделе. Когда я захожу, меня встречают роскошным известием: Ойген простыл под дождём, и сегодня его не будет. Не будет его и завтра, у него утренний рейс в Цюрих. Напряжение спало, все расслаблены и улыбчивы. Ойген в этот раз нагрянул к нам, как снег на голову. Объявил буквально за пару дней до прибытия, что отправляется в командировку. Дима и Даша продумали, какие текущие вопросы надо будет с ним решить, и стали ломать голову, чем бы занять его в нерабочее время. Ойген был человеком неопределённым – достоверно было известно, что живёт он один, любит кошек и, в меньшей степени, девушек, – во всяком случае, стремится завести приятельские отношения со всякой симпатичной сотрудницей, которая приезжает в цюрихский офис. Ойгена посадили на свободное место между мной и Димой. Хотя он мало со мной общался, я был целую неделю на лёгком взводе. Обнаружилось, что Ойгена ничем в свободное время занимать не надо, и что главная цель его визита – поправить разладившиеся отношения с девушкой из команды архитекторов, которая обитала с нами на одном этаже. Отношения так и не поправились. Ойген был грустен и непривычно предупредителен со всеми нами. Воспользовавшись его уступчивостью, Дима согласовал с ним переход с Svn-а на Git в качестве основного репозитория для программного кода и даже дату предстоящего релиза нового продукта, – выход его Ойген затягивал, чтобы сделать продукт как можно более совершенным и привлекательным для пользователей. Это был немалый прогресс, прямо-таки повод открывать шампанское – но, правда, офисными правилами такое настрого запрещено. Кроме результатов визита, мы обсуждаем на собрании текущие задачи. Две наши гранд дамы – Даша, чёрная королева команды программистов, и Марина, розовая королева тестинга (цвета – их волос и основных тонов одежды), снова бесконечно спорят о деталях процесса. По сути, это спор о распределении власти внутри нашего отдела. Даша считает, что тестирование должно быть вспомогательным процессом, помогающим программистам. Начинаться должно сразу при формировании запроса на изменение, ещё до проверки кода архитектором. Марина энергично настаивает, что тестирование должно быть заключительной, важнейшей фазой, когда все предварительные проверки уже пройдены и завершено программистское модульное тестирование. Дима, выступая в роли арбитра между двумя враждующими гранд дамами, пытается стандартизировать наш хаотический на сегодняшний день процесс. Однако сделать это так, чтобы все были довольны, ему не удаётся. Отдельной нерешённой проблемой остаётся загрузка команды тестировщиков, слишком высокая в предрелизное время и слишком низкая посередине между релизами. Конечно, тестировщики могут при недогрузке писать техническую документацию, но это не слишком рациональный способ распределения времени. Всё у нас не по SOP-ам, говорит Марина, и FDA может к этому придраться. Группа PQA не должна слать задачу на исправление. Вообще-то процессы в разных командах должны быть одинаковыми. По факту они всё-таки разные, говорит Дима. Нас должен интересовать в первую очередь наш собственный процесс, а не выравнивание с другими командами. У них есть своя специфика, и она может оказаться для нас неудобной. Даша проходится по предстоящим релизам старого продукта, сообщая, какие задачи для них она согласовала с Ойгеном. Эта, монотонная часть митинга затягивается. Я борюсь с подступающей дремотой и, в какой-то момент проваливаясь в неё, вижу интерьер швейцарского офиса, открытые пространства со множеством сотрудников, лаконичный интерьер с винтовыми лестницами между этажами, раздвижные жёлтые шторы на окнах столовой, а в клиентском отделе – фотографии приглашённых для рекламы знаменитостей, прижавших к ушам ладони, дескать «мы слышим вас». Выныриваю из сна, освежающего, радостного, ибо поездки в Швейцарию являются наибольшим счастьем моей работы, – и вижу, что Даша фотографирует меня на мобильник. Я мнителен, и мне часто кажется, что она кропотливо собирает на меня компромат. Честно говоря, я не самый дисциплинированный работник и даю ей много необязательных поводов для пополнения досье. После окончания митинга Даша присоединяется к ребятам, собравшимся в лифтовой зоне у стола для кикера. Зовёт своего обычного партнёра, Кирилла, огромного спортсмена-дзюдоиста – на лице у него начинает мерцать рассеянная и застенчивая полуулыбка, потом он отвечает ей, почти шёпотом: «Ну пойдём». Я какое-то время стою рядом со столиком и наблюдаю за игроками. Коллеги отошли от рабочих столов на пятнадцать минут, – по корпоративным правилам, это разрешено делать без разлогина, – но игра обычно затягивается на все сорок пять. У Кирилла прямо-таки талант, он с первых же игр сделался лучшим игроком в нашей программистской команде. Вот в настольный теннис наш спортсмен играет уступчиво, можно взвинтить темп и дожать его, ну а здесь – нет, выдаёт изумительные пасы, забивает мячи в одно касание, чуть подправив направление катящегося мяча фигуркой нападающего. Забивает и отражёнными от бортика ударами, и дальними от собственных ворот. Линию, где вертится его «шашлык» – пять пластиковых игроков на металлической жёрдочке – соперникам пройти почти невозможно. До того, как он взялся за дело, лучшим игроком была Даша, у ней накопился большой опыт во время командировок в швейцарский офис. Но игра Кирилла в нападении свежей и разнообразней. Сейчас он, тем не менее, играет в обороне, защищает Дашины тылы. Это выходит у него не так ловко, в нападении против него – Артём, игрок опытный и хладнокровный. Он расшатывает Кирилловы позиции, меняет ритм игры, пытается загнать мяч одним неожиданным щелчком. На другой стороне поля Даша ничего не может поделать с тестировщиком Даней, защищающим противоположные ворота. Он хорошо изучил её тактику, ловко отражает и перехватывает удары. Без случайностей не обходится: то Кирилл, пробуя выбить мяч со вратарской линии, загоняет себе невынужденный гол, то Артём пасует неожиданно для Дани мяч назад и попадает прямо в угол своих ворот. Даша в эту минуту не тимлид, а страстная ведьма с волосами, заплетёнными в толстый узел. Отмечает каждый свой гол, вскидывая вверх тонкие, голые до плеча руки. Мне нравится этот жест, но – полюбовался, и хватит. Если бы я не так сильно опоздал, тоже поиграл бы, а сегодня времени на это нет. Возвращаюсь на рабочее место, переношу куртку с кресла на вешалку. Королева тестинга, ничего в программировании не смыслящая, опять разъяснила мне на митинге, как надо кодировать. Копипастом. Так, дескать, вся Генетика создана. И хороший ли это продукт? Тот продукт хорош, который хорошо продаётся. За стенкой кубрика, скорее, заборчиком, слышна музыка в чьём-то наушнике. Столовую перенесли в подвальное помещение, и сегодня туда невозможно попасть на лифтах: они перевозят груды свёртков на третий этаж, арендованный аудиторской фирмой. Я перекусываю на своём рабочем месте, воспользовавшись тем, что Дима ушёл на совещание к верховным менеджерам. Смотрю в окно: вышедшее на минуту из-за туч солнце ещё далеко от той точки, где оно обычно садится. Сейчас оно слева, над склоном холма, так густо засаженным зеленью, что он кажется лесным массивом – а на самом деле под деревьями стоят дома, маленькие, непропорциональные, с рябыми кирпичными стенами. Думаю: о нежное, щемящее чувство, когда читаешь документацию, написанную женщиной, в которую ты влюблён – и хорошо написанную, без единой ошибки. Или разглядываешь перед Хэллоуином нарисованные её рукой на стенах кровавые петли. В ответ на четыре поста в мессенджере – долгожданная скобка. Трудна она, любовь в социальных сетях. Похоже, всё кончилось, когда я сказал, что проза её неудачна. Дикий внутренний холод и какая-то нежелудочная тошнота. Не могу смотреть на себя в зеркало: старый, толстый, беспомощный, во всём бездарный. По крайней мере, этот диалог ещё не прервался, ещё тянется тонкая линия, никому не нужная, виртуальная связь. Береги её, истерик, береги её. Окончив полдник, я возвращаюсь к задаче о пересчёте поверхностей при движении компонентов с нажатой клавишей Shift. Проблема вызвана тем, что для компонента вычисляется не только внутренний, но и скругляющий контур – кстати, быть может, это тоже можно ускорить. Но пока Эрвин, один из швейцарских архитекторов, предложил делать в отдельном потоке вычисления для каждой позиции. С потоками я имел дело редко – значит, можно научиться чему-то для меня новому. Просмотрев пару лекций по асинхронному программированию, создал цепочку из двух задач, разделив существующий код: в первой задаче шли вычисления геометрии обоих контуров, во второй – обновление рендеринга и деформация шаблонов. Теперь стал происходить креш на стороне рендеринга: дело в том, что вторая задача тоже открывалась в отдельном потоке, а мне надо было вернуться с вычислениями в исходный, главный. Вчера я обсуждал этот вопрос с Лёшей, нашим техническим лидером, и он посоветовал мне использовать метод планировщика задач, использующий контекст синхронизации. Действительно, такой метод помогает связать вторую задачу с исходным потоком. Вычисления контуров проходят без крешей, но отсутствует обновление рендеринга, даже если я заказываю его напрямую. Долго разбираюсь, в чём дело, и понимаю, что ошибка в разделении кода – я просто забыл включить во вторую задачу функцию перевычисления шаблонов. Обратил внимание и на то, что проверочный метод, вызывающийся для каждого вычисленного скругляющего контура, игнорирует свой аргумент. Быть может, его стоит вызывать только один раз и заранее, а не каждый раз для новой позиции? Не поможет ли это само по себе увеличить скорость? В итоге потоки мне ничего не дают, на их вызов тратится добавочное время, да и сами они заканчивают работать в некий неопределённый момент, не обязательно скоро. Даже если сам компонент перемещается с приличной скоростью, контура и поверхности перерисовываются с большим опозданием. Эрвин говорил о том, что львиная доля времени уходит на алгоритм, разделяющий поверхность контуром. Я полез было внутрь нашей вспомогательной библиотеки, вызывающей стандартный алгоритм, но мне показалось, что оптимизировать там ничего не удастся. Всё лаконично – кроме конвертации данных, только вызов вспомогательного алгоритма, прицепляющего полином к поверхности, и затем самого разделителя. Вторая из текущих задач удалась мне намного лучше. Надо было отобразить степень удержания в цвете, на этот раз не на главной поверхности, а на шаблоне замкА. У меня был уже алгоритм, поточечно вычисляющий нужные оттенки. Первая загвоздка была в том, что он требовал нормали к шаблону, а они существовали не во всех точках. Я обошёл это, добавляя неопределённые значения в список цветов. Вторая беда была посерьёзней: при переключении с контроля формы на визуализацию удержания приходилось пересоздавать саму поверхность; затем стандартная функция, её обновляющая, генерировала ненужный мне элемент отмены. Здесь пришлось покрутиться. Лёша предлагал мне подменять на ходу цвета внутри класса поверхности. Сначала я так и делал, но убедился, что этот подход является излишним. Достаточно было заменить поверхность на рендеринге, не трогая сцену пересечений. В библиотеку добавлен был лаконичный метод, принимающий в качестве аргумента цвета, новая поверхность для рендеринга вычислялась теперь внутри него. Я не уверен, что этот способ понравится Эрвину, – посмотрю, что он скажет во время проверки. Ещё какое-то время приходится исправлять неполадку: отменялось не только перемещение контура, но и переключение контроля качества. Проблема в том, что последнее обновление шаблона происходит внутри элемента сцены, и оно перетирает все предыдущие. Приходится устроить обратный вызов; похожие действия в этом элементе уже совершались, так что это в достаточной степени безопасно. Тестируя изменения перед тем, как отправить на проверку, нахожу ошибку: поверхность перестала обновляться после отмены, её контур буквально виснет в воздухе – правда, с расцветкой всё на этот раз верно. Приходится поменять логику обратного вызова, она даже немного упрощается. Заодно я избавляюсь от введённой мной отменяемой переменной, содержавшей недетализированное впечатление. Обслуживание её обходится слишком дорого, а впечатление можно передать через конструктор шаблона – только поменять аргументы фабрики, поправить её вызов из метода взаимодействия для замка. Я сразу же начинаю готовить и вторую часть задачи: степень удержания там вычисляется уже для части впечатления, ограниченной контуром, и для текущей оболочки, полученной после операции опустошения. Теперь этого можно достичь однотипными функциями для обратных вызовов, переключений контроля качества, вычислений цветов в реальном и предварительном режиме. Для поверхностей я выношу эти функции в отдельный класс. Остаётся неясным, стоит ли распространить их и на шаблоны, – это потребует выделения общего интерфейса для шаблона и поверхности, что может быть слишком искусственным подходом и сделает интерфейсы запутанней. Остаётся открытым главный вопрос – не слишком ли замедляется перемещение контура теперь, когда постоянно перевычисляются цвета и для шаблона, и для ограниченной части впечатления? Если это так, цвета надо будет считать только после окончания перемещения. Ответ от Эрвина приходит почти сразу – мой вариант подходит, остаётся несколько замечаний. Во-первых, надо вычислять цвета только для внешней поверхности – сейчас внутренняя поверхность и полка между ними окрашены в ядовито-синий цвет, смысла в этом нет. Во-вторых, и это главное, изменив метод для вычисления контроля формы, я испортил цвета превью на финальной стадии, сейчас там просто чернота, прямо как на картине Малевича. В-третьих, шкала, которая показывает процентный уровень удержания, вычисляет его теперь только для одного из шаблонов, а не для всей поверхности. Переделать два первых пункта несложно, хотя работа и кропотливая, приходится добавлять новый аргумент с маркером внутренней поверхности сразу во многие методы. Третий же пункт требует существенной переработки всей системы вычислений контроля качества, и мы с Эрвином договариваемся вынести его в отдельную задачу на будущее, не для текущего релиза. Так или иначе, задача решена, и я этому очень рад. Ещё одна – рассинхронизовать изменение ширины и высоты вентиляционных выходов для каналов, имеющих Д-форму. Текущая синхронизация может приводить к тому, что неактивный выход ныряет глубоко под поверхность, и его в свою очередь приходится поправлять – возникает порочный круг. Задача даётся без труда: буквально за несколько минут я нахожу участок кода, где размеры выходов копируются друг в друга, и ограничиваю копирование условием, вытянув форму канала из параметров. Можно было проверить, впрочем, интерфейс выхода – не знаю, какой из способов здесь больше подходит. Так же быстро решается и задача о переключении режима движения канвы с перемещения на поворот в случае нажатой клавиши контроля. Правда, при этом у меня начинают падать интеграционные тесты, приходится вынести проверку нажатия в отдельный класс, изготовить удобную для тестов куклу. А вот с ещё одним дефектом канвы находит коса на камень. Где-то посреди вычисления внутреннего контура происходит креш из-за того, что буфер, содержащий предварительно вычисленный режущий контур, к этому времени оказывается очищен. Сначала, поставив брейкпойнт в методе, где очищается буфер, я нахожу в коде основного продукта подозрительный фрагмент, который мог привести к дефекту: очистка буфера, происходящая только после окончания режущей операции. Она происходит в отдельном потоке, а в основном в это время заново инициализируется канва. Если пользователь быстро кликает по канве, он успевает запустить вычисление контуров, и буфера могут быть очищены после вычисления первого из них. Я делаю простейшее исправление: добавляю локальную переменную, которая блокирует вычисления контуров до тех пор, пока операция не отработала. Но это ничуть не спасает ситуацию, креш продолжает воспроизводиться. Для того, чтобы разобраться, приходится залезть внутрь вспомогательной библиотеки, скомпилировать её последнюю версию, встроить внутрь основного продукта и подключиться из дебаггера библиотеки к исполняющемуся продукту. Суть проблемы в том, что после вычисления контура его буфер очищается также и в случае, если вычисляемая параллельно карта расстояний оказывается пустой. Но при этом точки контура всё равно возвращаются в основной продукт, и тогда он запускает вычисление контура внутреннего, не имея необходимой базы. Нахожу одну из потенциальных проблем: при вычислении класса равенства для данной канвы надо заменить обычное копирование на перемещающее для уникального указателя. Исследую построение карты расстояний – и снова беда, при ошибочном вычислении не возвращается код ошибки, только пустая карта уходит наверх, и режущий контур признаётся валидным. Исправляю это, добавляю возвращаемые логические значения, но хлоп – продукт продолжает падать, уже на рендеринге режущего контура. Сохраняю этот контур и текущую поверхность с помощью диагностического класса, открываю для визуализации. Ужас какой, при повторной активизации канвы она проходит по самому краю отрезанной поверхности, образуя контур тонкий, многократно самопересекающийся – настоящий фрактал, который не могут показать толстокожие рендеринг-функции. Я в тупике и пока не знаю, как с этим бороться. Наверное, надо исследовать алгоритм построения контура. Хуже того, Даня, опытнейший наш тестировщик, обнаружил, что рендеринг может падать и при вращении, на самых простых контурах. Спасибо Эрвину – он подсказывает мне, что дело может быть попросту в удвоенных точках контуров. Теперь ничего не стоит написать заплатку, где подобные точки будут устранены. Однако корень зла в том, что алгоритмы разрезания работают неверно; вероятно, придётся писать запрос к алгоритмической команде, чтобы их нам починили. После этого мой быстрый фикс можно будет благополучно отменить, во избежание программной замусоренности. Я вспоминаю, что обещал одной из сотрудниц-волонтёрок, собирающих деньги на армию, передать небольшую сумму для поддерживаемого ей подразделения военной разведки. Прихватываю кошелёк, поднимаюсь по лестнице на десятый этаж и вручаю своей – очень правильной – знакомой несколько сотен. Лучше так, чем истратить их на выпивку с поэтами. По дороге заглядываю в менеджерскую комнату. Там сидят, вместе с первоверховным офисным начальством, и Дима с Дашей. При спуске по лестнице открывается вид на парковку и ряд металлических скамеек в офисном дворике, где перекуривает несколько сотрудников, включая нашего Даню. Вернувшись на место, я какое-то время работаю над предыдущей задачей. Понимаю, что дремота никуда не делась, она опять на меня накатывает. Как раз в это время, между четырьмя и половиной шестого, сонливость самая вкрадчивая. Завариваю на кофе-машине двойной американо – надеюсь, он поможет мне продержаться ближайшие полтора часа. Чтобы воспроизвести самый сложный из порученных мне дефектов, надо открыть ордер старого формата, перейти в закладку «вентиляционный канал» и переместить приёмник звука в другое положение. Проблема в том, что при этом неожиданно смещается и звуковой выход. Происходит это в три этапа: сначала, при загрузке ордера, все параметры, присутствующие в проекте со старым форматом, получают состояние «всегда равны» для сравнения с прежним своим значением. На втором этапе – после того, как мы сместили звуковой приёмник – по узлам движка распространяется грязь, и часть «всегда равных» параметров получает противоположное состояние «никогда не равных» – именно так работает у нас оптимизация для неизменённых входных данных. Параметр, ориентирующий звуковой выход исходя из положения приёмника, тоже становится «никогда не равным». Несмотря на то, что он пуст, параметр этот триггерит операцию, вычисляющую звуковой выход; из-за оптимизации система считает, что значение его изменилось с момента предыдущего исполнения операции. Попытки отключить вычисления внутри операции не дают никакого эффекта: этого мало, чтобы остановить начавшееся падение доминошных косточек. Самое меньшее, что я мог сделать – загружать из ордера, помимо окончательного значения звукового выхода, ровно такую же величину ещё и в параметре с промежуточным, неспроецированным значением. Такой параметр чист, и его присутствие рассекает предыдущую цепь вычислений, ведущую от положения звукового приёмника. Таким образом, звуковой выход уже не прыгает в сторону, однако из-за оптимизации вычисления продолжаются. Выходной параметр операции, оказывается, в свою очередь, «никогда не равным», за счёт этого она поджигает по цепочке следующие операции, и в итоге меняется, хотя и немного, положение вентиляционного канала и связанных с ним коллизий. В конечном счёте, такое рассечение только скрывает настоящую проблему – ведь если бы оптимизация работала правильно, операция просто не отрабатывала бы при неизменённых данных. Как сказал Лёша, с которым я успел и эту проблему обсудить, – движок работает по своей логике, и оптимизация не сбоит, но совместная их работа порождает крайне запутанную проблему – мало ли какие операции они ещё могут при различных сценариях поджечь с помощью «никогда не равных» параметров. Сегодня я обговаривал этот дефект ещё раз, уже с Эрвином, по мессенджеру – но, видимо, мне не удалось донести до него главную Лёшину мысль: при скрещивании ортогональных логик у нас возникает зазор, делающий функциональность непредсказуемой. Эрвин предпочитает отладить текущий вопрос, введя дополнительную грань между «никогда не равным» параметром и операцией – так, чтобы движок отслеживал состояние этой грани, а не состояние параметра. Вместо основательного перепроектирования движка ему хочется перебросить ажурный мостик над очередной раскрывшейся внутри нашего продукта бездной. На этих мыслях я проваливаюсь в сон и снова оказываюсь в Швейцарии. Это времена первой моей командировки, самой запомнившейся. В первый день, ещё не рабочий, мы поднимаемся всей нашей рабочей командой на высокий холм, откуда город виден целиком, вплоть до дальних окраин, карабкающихся на высокие, заснеженные даже осенью, горы. Вдоль крутого подъёма расставлены фонари в виде бородатых жирафов и сфинксов со светящимися головами. Посередине пути установлен метровый жёлтый диск – это Солнце, первый объект в расположенной вдоль тропы модели планетарной системы, где пропорционально соблюдены размеры космических объектов и расстояния между ними. Стенд с первой планетой, Меркурием, едва заметной дробинкой, установлен метрах в сорока от главного светила. Чуть короче расстояние до Венеры, но сама она крупней, размером с вишнёвую косточку. До Земли добираться дольше, стенд с ней уже совсем недалеко от вершины холма. Марс нам найти не удаётся, наверное, он затерялся на одной из боковых дорожек. На маковке холма стоят вплотную друг к другу стрельчатая радиовышка и ресторанчик под открытым небом, где мы съедаем по порции сосисок со вкуснейшей квашеной капустой. С одной стороны площадки открывается вид на вызревшие поля, где вкрадчиво крадутся туманы, на горбатую канатную дорогу и параллельные гряды соседних возвышенностей. С другой стороны – город, компактный, насыщенный, проштрихованный ярким дневным светом. Над центральной его частью проносится воздушный парад: кувыркаются, накладываются друг на друга, разлетаются разноцветные самолётики. В стационарную подзорную трубу видно, как на центральной площади взмывает и затем стремительно падает кабинка в одном из механических аттракционов. Через квартал от неё ползёт, оплетая высотные здания, полосатая змея железной дороги. Втроём с Дашей и Лёшей, отделившись от остальных коллег, мы спускаемся по череде металлических лесенок в долину за холмом. Дальше нет асфальтированных проездов, только ухоженные грунтовые тропы. Время от времени нам попадаются двухэтажные домики с широкими ставнями и островерхими черепичными крышами, вокруг них монотонные ярусы виноградников, отбрасывающие строгие решетчатые тени на устланные гравием дорожки. На одном из поворотов тропы, перед хвойным леском, мы видим Сатурн – десятисантиметровый медный диск с поперечной тарелочкой, установленный на высоком бугристом камне вместо пьедестала. Как же мы пропустили Юпитер? Судя по карте, прикреплённой к камню, до Урана идти ещё несколько километров. Делать это нам кажется не обязательным, и мы начинаем спуск по направлению к озеру мимо искусственного, окружённого перилами, водопада, переходящего в шумливый горный ручей, – он петляет между скалами, как слово, записанное буквами неизвестного алфавита. Даша и Лёша идут быстро, спортивно, я едва поспеваю за ними – всё, как во время работы. Начинают попадаться здесь и там первые городские дома, обширные, деревянные, с неокрашенными оградами, с окнами, заставленными цветочными горшками. За распахнутыми настежь воротами двое рабочих в комбинезонах чинят моторную лодку. А у следующего строения как будто подрезан первый этаж, чтобы не мешать уличному движению; верхний этаж и крыша нависают над дорогой. На школьных стенах, толстых, добротных, художники-любители намалевали несколько фресок. Юноша поднимает над собой развевающийся квадратный флаг на фоне размытой зелени, двое сидящих мальчиков младшего возраста глазеют на него, разинув рты и обняв друг друга за плечи. Учитель – в просторном комбинезоне, с причёской горшком – читает нечто из большой амбарной книги группе плохо прорисованных учениц, что держат раскрытые тетради на коленях. Юноша в спецовке, с молотком в руке, задумчиво изучает другого юношу, полуобнажённого, атлетического, столь же задумчиво поигрывающего циркулем. На следующем здании, вероятно, полицейского управления, изображён сельский праздник. Солдаты и поселяне кружат в танце белокурых девушек, то в белых развевающихся передниках, то в облегающих платьях. Арлекин играет на виолончели. Грустный человек в мятом костюме извлекает музыкальный ветер из трубочки, больше похожей на поварёшку. Священник, наклонив кубическую бутыль, – Лёша сначала думает, что кинокамеру, – наливает вино двум полуистёршимся собутыльникам. Ручей, вдоль которого мы продолжаем спускаться, ныряет под автостраду и выбирается наружу возле стройки с торчащими безо всякой логики сваями, – над ней доминирует магически точный, внушающий некую надежду красный кран. Ручей уходит в сторону, под бетонный шлюз, а мы оказываемся на краю очередного склона, откуда видна вблизи центральная часть города: растянутая речная излучина, выгнутые спиралями узкие улицы, высокие арки внутри зданий, террасы со скверами, над которыми возвышаются кривоугольные башенки. Спустившись по каменным ступенькам, переходим на другую сторону реки у особняка, опустившего в воду сваи, как вёсла. Огибаем въездные ворота со средневековыми часами, выпускающими каждые полчаса на прогулку фигурки князей, принцесс и священников. Выпиваем по стаканчику глинтвейна посреди ярмарки, растёкшейся по улицам тремя шумными рукавами. Фотографируемся возле фонтана: из огромной буквы f льётся тонкая струйка в полную до краёв мраморную миску. Здания в виде ромбов и треугольников, вцепившиеся в наклонную мостовую фонари. На одном из них герб: змея в короне обвивает зубило и клещи. Между замком и музеем современного искусства, – тройной волной из стекла и стали, – прячется маленький парк со скульптурами. Одна из них изображает юношу и девушку, соприкасающихся ягодицами, обхватывающих друг друга сзади за бёдра. У юноши вместо обычной головы – ощеренный череп, едва прикрытый тонкой кожей. Девушка, как отмечает с опаской Даша, очень похожа на неё лицом и фигурой. С плавным скрежетом крутится мобиль, составленный из многочисленных колёс, цилиндров, труб и рычагов. Ближе к музею возвышается розовое дерево из соединённых друг с другом октаэдров, – привет Дэвиду Линчу. Троллейбусная остановка светится, как раскалённая жаровня, и кажется ещё одним, добавочным экспонатом. Через несколько минут мы добираемся до серо-суровой железнодорожной станции, под ребристым потолком которой покачивается надувной ангел – фиолетовая женщина, выставившая жестом регулировщика пылающий меч поперёк направления рельс. Электричка приходит по расписанию с точностью до секунды. Даша сидит со мной плечом к плечу, совсем как в юности, когда мы ездили с её семьёй к ним на дачу. За окном стремительно несущегося вагона проворачивается озеро, меняются виды на пригородные посёлки с высокими церковными шпилями. Мы сходим возле лодочной станции в сгущающихся сумерках; рассудительный, умеренный ветер треплет красные и зелёные флаги, подвешенные на высоких шестах. К причалу один за другим подходят сияющие прогулочные теплоходы. Вдоль заросшей высокой травой прибрежной поляны выстраивается ряд зачехлённых яхт. Поднимаемся на второй этаж ресторана рядом с нашей гостиницей; здесь переплетаются резкие запахи пива и сыра раклет, но мы к ним быстро адаптируемся. Находим столик, где нас уже ждут остальные члены нашей команды и присоединившиеся к ним местные коллеги. Из основных блюд, на выбор, мясо маринованное и мясо слабопрожаренное. «Дичь» – Ойген, чтобы пояснить, поднимает согнутые пальцы, показывая ушки животного, и я догадываюсь, что это лань. Сборные гамбургеры, компоненты которых мы выбираем сами в длинном меню с непонятными немецкими названиями, – а в качестве гарнира получаем понятную жареную картошку. Наши ребята пьют пиво, девушки лёгкое местное вино. На стене за нами мозаика с актрисой Скарлетт Йохансон, выполненная в стиле поп-арт. Официанты в очках с золотыми оправами выглядят интеллектуалами. Разговор за столом ветвится на несколько параллельных русел. На левом фланге Марина рассказывает о последнем танцевальном фестивале в Осло, в котором она принимала участие. Условия были суровые; жить пришлось, благодаря организаторам, на берегу фьорда в палатке, и ночью она замерзала даже в спальном мешке. Эрвин рассказывает о временах своей учёбы в университете. Преподавателем у него был знаменитый Никлаус Вирт, – он говорил, что правильно написанной программе даже не нужно тестирование. Поэтому Эрвин сделался настолько придирчивым к качеству программного кода. Помимо технических и математических у нашего главаря есть ещё два увлечения – футбол и музыка. Каждый будний день он гоняет мяч на стадиончике возле лодочной станции, а на выходных музицирует со своей большой семьёй; сам он хорошо играет на фортепиано, сестра – на виолончели, дядя – на скрипке. Даша вовсю сияет в присутствии швейцарского начальства и демонстрирует своё изрядное владение как английским, так и немецким. На противоположной стороне стола происходят разговоры серьёзные, политические. Сначала речь идёт о модных климатологических веяниях, озабоченности которыми мы понять не можем: казалось бы, если зимы потеплеют, просто будет меньше травматизма, а летом для нас ничего не изменится, ведь летом и так постоянно сидим под кондиционерами. Потом речь заходит о военных угрозах. Лёша опять объясняет швейцарским коллегам ситуацию с возможным вторжением России, сетует, что европейцы относятся к этой теме равнодушно. Мы не хотим воевать, терпеливо объясняет Ойген, русские – выгодные партнёры, и мы хотим торговать с ними. Это недальновидно, начинает кипятиться Лёша, и это граничит с предательством. В центре стола тестировщики разных национальностей обсуждают супергеройские фильмы и последний сезон модного стримингового сериала. Марина без энтузиазма ковыряет вилкой варёного осьминога, а я уплетаю его за обе щёки. На полках между окнами, где помаргивают огоньки с другого берега озера, выставлены мутные бутыли с глубоководными рыбами – кажется, попавшими сюда из другого моего сновидения. Раскачиваясь на цыпочках, Даша ядовито говорит: как же хорошо тебе спится, Андрей. Я мгновенно выныриваю из дрёмы; опять она меня застукала спящим. И что ты делал на десятом этаже? Как же, рассказывай, сдавал он деньги на армию. Опять ходил, как это у тебя называется? – девочек окучивать. Я предлагаю: давай сходим наверх и спросим, что именно я там делал. Даша жестом отказывается. Тебя слишком часто нет на месте, и ты при этом не разлогиниваешься. Работаешь меньше положенных восьми часов. Есть же правило пятнадцати минут, возражаю я. Есть, но ты им всё время злоупотребляешь. Работать надо, понимаешь? Работать надо! Даша разворачивается: любимая тактика чайки-менеджера, поклевала и улетела, – но я её догоняю. Хорошо, давай обсудим, а в каких случаях я могу уходить со своего места без разлогина? В туалет я могу выйти? Андрей, ты издеваешься надо мной, что ли? Если тебе так часто надо в туалет, иди ко врачу и лечись. Я как раз и лечусь, у меня больной кишечник. Справку из гастрологии надо тебе показать? Даша опять повышает голос: садись и работай, сегодня надо закрыть билд. Уходит в свой кубрик, слышно, как она всё ещё нервно беседует с кем-то из швейцарских коллег по скайпу. Антон спрашивает: может быть, она тебя ревнует? Ни к кому так не придирается. Думаю, она меня просто хочет уволить. Я стараюсь успокоиться сам. Решаю. чтобы не засыпать, пить ещё больше кофе днём, в самый смутный период. Если честно, моя бывшая приятельница права – хотя и прицепилась к ерунде, к этому десятому этажу. Но вот, например, моё сегодняшнее опоздание. Мог я хотя бы раз вовремя прийти на работу? Теперь надо проверить несколько чужих заданий для сегодняшнего билда. Первое из них – о креше: продукт падает, когда для юнита с кровью сохраняются в базу и антигены, и антитела. Дело было в неверном копировании из одной структуры в другую, при этом загрязнялись индексы в целевой структуре, часть информации терялась. Второе задание – очень лёгкое: надо просто переименовать файл секьюрити, плюс заменить соответствующую строчку в мейкфайле: из-за несоответствия названий случаются ошибки при инсталляции. Ещё один баг – в настройках продукционных процессов. Если задаётся более трёх операций и для них более шести финальных продуктов, система после предупреждения всё равно даёт сохранить изменения, и в базу падают пустые записи. Сами изменения понятны, но с этой задачей возникает другая беда: Ульяна просто залила файл в билдовую ветку продукта из версии, но не скомпилировала его, и теперь при сборке возникает ошибка. В файле использовано поле, доступное только в транковой базе данных. Надо либо домёржить датабазные изменения в ветку, либо удалить из файла все упоминания об этом поле. Я спрашиваю в текстовом мессенджере у Эрвина, пойдут ли изменения базы в бранч. Он отвечает через полчаса: нет, это не для бранча. Ульяна сегодня в отпуске, поэтому я прошу Василия сделать новую версию файла, без того злополучного поля – а я итог проверю и замёржу. Параллельно я просматриваю предлагаемые изменения ещё по одной проблеме: при завершении продукционного процесса окошко виснет из-за неверной трансформации, но только под графическим интерфейсом. На апдейте, несмотря на режим просмотра, поля в таблице остаются доступными для редактирования. Алгоритм у трансформации был диковинным изначально. Основная таблица фальшива, она собирается из россыпи отдельных полей и малых таблиц, приходящих в инпуте. Если хотя бы одно из исходных полей для данной колонки доступно для чтения, то и вся колонка объявляется доступной, в противном случае её защищает трансформация. Но при этом не учитывается, что исходные поля на апдейтах могут оказаться как доступными, так и заблокированными. После того, как запрошена защита, при отработке сообщения по всем полям идёт блокировка, но зато сбрасывается и атрибут «только для чтения». А если так, поля в основной таблице оказываются разблокированы. Сначала я всего этого не понял, только увидел, что Антон в запросе на изменения написал что-то очень странное. Перекрёстную логику он инвертировал на прямую: теперь из атрибута «только для чтения» сразу следует доступность. Смешно, но абсурдная логика в абсурдном месте раньше приводила к правильным результатам. Нет, это неправильно, говорю я Антону, давай вернём прежнюю трансформацию, она странная, но умная. Зато в основном коде защитим поля. Алгоритм таков, что для проверки изменений каждый раз приходится генерировать новые юниты и задавать отдельную операцию – это занимает несколько минут, и я в промежутках пытаюсь проверить ещё одно задание, крайне загадочное. В дефекте написано, что надо отменить генерацию баркода в тех случаях, когда после тестирования получается невалидный результат для группы крови, но по коду выходит что-то совсем другое. Отменяется проверка и генерация исключения в тех случаях, когда резус-фактор пуст или не изменён. Я бы расспросил Серёжу, который эту таску делал, но он уже ушёл, приходится разбираться самому. Тем временем Антон заканчивает вариант с защитой в исходном коде, показывает мне – всё работает точно так же, то есть неправильно. Давай тогда сделаем в полях частичную защиту, предлагаю я, это другой механизм, он может сработать. Метод научного тыка, говорит Антон. Не люблю эту шутку, но что тут ответишь – действительно, мы пробуем разные варианты решения наугад. Я звоню Серёже, он стоит где-то в автомобильной пробке. Объясняет: это нужно, чтобы баркод генерировался только в зависимости от группы крови. Исключается тот случай, когда группа не пуста, а резус пуст. Но он же в этой функции не генерируется, здесь только какие-то проверки. А ты посмотри дальше по коду, где эти проверки используются – как раз в зависимости от них мы запускаем генерацию. Спасибо, Серёжа, я понял, теперь могу зааппрувить таску. До завтра, хорошего тебе вечера. Антон уже сделал вариант с частичной защитой – стало ещё хуже. Всё равно поля остаются доступными, но ещё и повисают, когда в них попадает курсор. А номера юнитов теперь почему-то перебегают из первой колонки во вторую, когда закрываем сообщение. Это не может быть испорчено в текущей задаче, здесь что-то другое – надо будет посмотреть попозже, уже после билда. Включаем трейс, проверяем по нему, как работает трансформация, и я вникаю в ситуацию с парными атрибутами «только для чтения» и «доступно». Ясно: если приходит ложный атрибут «доступно», надо в ложь поставить и «только для чтения». Если нет, вычислять его так, как он раньше вычислялся. Как дела с билдом, спрашивает Дима. На мне осталось одно ревю. Сейчас Антон сделает трансформацию, и всё должно заработать. У Кирилла ещё одна задача, реворк, а дизайн по ней делал ты. Я подхожу к Кириллу, его место далеко, через несколько кубриков. Сейчас рядом с ним сидят Даша и Даня, у всех кипит работа. Даша говорит мне, что сама проверит реворк. Значит, мне надо закончить только Антонову задачу. Звонит мой телефон – это мама. На всякий случай разлогиниваюсь и выхожу в пустую митинг-комнату, чтобы никому не мешать. Привет, говорит мама, как у тебя дела? Всё в порядке, сейчас закончу с работой и пойду на стадион. Не ходи никуда, видишь, какой ливень. Лучше пережди его и возвращайся домой. Я выглядываю в окно, дождь и правда серьёзный. Вниз по проезжей части катит целая речка, автомобили перемещаются с трудом. Я всё равно пойду, есть зонт, – и не пытайся на меня, пожалуйста, давить. Как там ребята? Коля спит, я его укачала. Оля варит ему суп – позвать её? Нет, лучше не отвлекай. Я возвращаюсь к Антону. Новый вариант трансформации работает. Проверяем с ним несколько сценариев. Пока не всё идеально: когда формируется запрос о завершении процесса, одним и тем же цветом показываются и заблокированные, и доступные поля. Но здесь мы ничего не испортили, так оно было и с прежней трансформацией. Дефект заключался не в этом, и мы его, наконец, поправили. Антон заливает изменения, я их аппрувлю в системе. Подхожу к Даше: мы закончили, может быть, здесь нужна моя помощь? Даша, не поднимая головы, сухо отвечает: мы справляемся, ты можешь идти. Я добываю из ящика в столе свой старый зонт – раньше он был «мужским», с чёрной ручкой, но во время одного из ремонтов мастер заменил ручку на розовую. Говорю «до завтра» соседям по кубрику. Бритвин пока уходить не собирается, смотрит на дождь из широкого окна. Едва выхожу из офиса, ветер выворачивает зонт наизнанку, – я иду под трепещущей красной чашей, что собирает падающую воду. Пара спиц уже сломалась, и теперь они висят на ткани, к которой пришиты, опасно мечутся перед глазами из стороны в сторону. На другой стороне улицы несколько вымокших до нитки студенток ждут рейсовый автобус. Черпая ботинками из шумящих потоков, я перехожу через дорогу и присоединяюсь к ним. Уже стемнело, в световых колодцах проносятся крупные капли. Светофоры мигают жёлтыми глазами под кропотливой волокитой ливня. Сквозь дырку в ткани зонта холодная струйка брызжет на шерстяную шапку, я уже чувствую влагу за пазухой. Подъезжает нужный мне, плотно упакованный автобус. Вопреки предчувствиям, останавливается – водитель жадничает, слава водителю. Я складываю зонт и протискиваюсь внутрь мягкой человеческой массы на нижних ступеньках. Хватаюсь за чью-то ляжку в чулке, прежде чем нащупать поручень. Висеть на нём совсем не легко, однако становится легче на следующей остановке: кто-то сходит, вырывая себя из тёплого человечьего мяса, кто-то одновременно заходит, проталкивая предшественников вглубь норы. Удаётся встать поосновательней, освободить руку и передать заранее приготовленные три гривны. Белобрысая девушка, с которой мы сплетены тесней, чем при половом акте, протягивает купюру дальше, по направлению к водительской кабине. Сзади сопят и наваливаются мне на плечи двое пьяных футбольных фанатов; запах от них стоит несусветный. На повороте, потеряв равновесие, один из них хватает меня за ворот куртки, – какое-то время я терпеливо пытаюсь выдернуться из мощной руки. К счастью, это замечает его товарищ, чуть менее пьяный, вытягивает у соседа из клешни мою куртку и разворачивает его к себе лицом. Никаких извинений, да я их и не требую, лишь бы эта публика вела себя спокойно. Вот и нужная остановка, двери приоткрываются, и все стоящие на ступеньках плюхаются в глубокую лужу. Мне всё равно, ботинки ещё до этого промокли. Толпа поднимается к стадиону по длинной лестнице. Качающиеся зонты заслоняют столбы света, поднимающиеся в небо над бетонной чашей. Дождь уже не хлещет, а клубится, и похоже, что к нему примешивается снег. Из-под козырька стадиона доносится какофония: несколько человек играют на духовых инструментах и стучат палочками в барабаны. Проходим сквозь стадионные ворота, мимо безликой колоннады, возведённой ещё в сталинские времена. Суровые парни в чёрных плащах проверяют билеты, сразу за ними полицейские досматривают сумки. Я открываю свою: там только подстилка для сидения и электронная книга, банку из-под каши я оставил на работе, зная, что стекла с собой быть не должно. Над нами серая громада стадиона, ручейки болельщиков текут на верхние сектора по спиральным лестницам. Вдоль внешней стены стадиона – десятки входов в туалетные комнаты, мужчины заходят и выходят, хлопая разноцветными дверцами. Вероятно, женских туалетов здесь нет. Между туалетами в стенах стадиона расположены витрины небольших магазинчиков: одни торгуют пивом, другие – футбольной амуницией и мячами, подписанными выдающимися игроками команды. Перед входами на сектора билеты повторно проверяют, чтобы обладатели дешёвых не проникли к дорогим местам. Я прохожу на своё место в дорогом центральном секторе. Эта часть стадиона самая пассивная, обычно здесь глохнет волна, поднятая в секторах подешевле. С местом мне везёт, вид на поле идеальный – однако прямо за моей спиной проход, где непрерывно ходят люди. Того и гляди, кто-нибудь заденет коленом голову или пнёт плечо. Сиденье замызгано, я вынимаю салфетку, протираю его, поверх кладу подстилку. Игроки уже на поле, разминаются, бегают трусцой, катают полосатый мяч. Чувствуется, что им зябко. Из раскрытого над полем чёрного небесного квадрата, извиваясь, опускается снег – теперь один только снег, без дождя. На электронном табло крутят ролик, футболисты с разными цветами кожи желают остановить расизм. Поле в чудовищном состоянии, здесь и там в лучах софитов поблёскивают глубокие лужи. Игроки выстраиваются, чтобы прослушать гимн Лиги, пожать друг другу руки перед началом игры. За правыми воротами фан-сектор скандирует: «Героям слава!» Бьют барабаны, блеют дудки. Матч начинается – нельзя сказать, что блестяще. Обеим командам надо приспособиться к тяжёлому полю. Атаковать по той его части, которая ближе к фан-зоне, не выходит: в ложбине образовалось настоящее болото. Мяч не катится, игроки чавкают бутсами. В такой игре меньше техники, но гораздо больше нервов. После первого же удара по воротам вратарь соперников, отбивший мяч на угловой, падает в жидкую грязь. Теперь он изгваздан с головы до ног, с него обильно капает жижа. Инициативой владеют хозяева, монотонно навешивают в штрафную, а итальянцы без труда навесы эти отбивают. Зато они остро контратакуют и на первых же минутах забивают гол. Полузащитник выдаёт пас через половину поля, и шустрый нападающий, опередив поскользнувшегося защитника, вовремя подставляет голову для хлёсткого удара. Рядом со мной сидит неприятный тип: всё время на взводе, с самого начала матча непрерывно орёт что-нибудь или скандирует фанатские речёвки, брызгая на меня слюной. Я отчасти даже рад, что наша команда проигрывает. Сосед при этом испытывает некоторую подавленность и верещит не так отчаянно. Хотя, может, он просто надсадил голосовые связки. Перед перерывом наша атака активизируется, лучше сказать, выходит из спячки. Мяч то и дело получает нападающий Зозуля, но распорядиться им удачно не может. То бьёт впритирку со штангой, то попадает в защитника, то слишком долго возится, и мяч у него отбирают. Сосуля, умоляюще кричит сосед, ну пожалуйста, Сосуля. Чёрта с два, первый тайм так и оканчивается в пользу гостей. Команды идут в раздевалку. Итальянцы, поначалу молочно-белые, похожи на грязный снег, наши – на сточные воды. Я вынимаю было электронную книгу, чтобы не скучать во время перерыва. И тут осознаю, что мне хочется узнать, как там дела с Кирилловым заданием. Всё-таки мой дизайн, и я чувствую, пусть и запоздало, свою ответственность. Чтобы не помешал гул, выхожу за пределы стадиона к площадке перед туалетами. Звоню Даше, но она сбрасывает трубку. Звоню Диме, он тоже сбрасывает. Что за чёрт? И снег, и дождь прекратились, в воздухе летает какая-то неопределённая мокрость, оседая на дуговых фонарях. Я решаю до конца перерыва обойти стадион, глядя на сырые пятиэтажные дома, быстро тающую снежную накидку на газоне, дождевые потёки вдоль асфальтовых дорожек и непрерывно стучащие, будто клавиши печатной машинки, туалетные дверцы. Стадион, кажущийся изнутри необъятным, огибаю всего лишь минуты за три. На задней его стене обнаруживаю профессионально сработанный мурал, изображающий этот же стадион в окружении далёких от него в реальности городских примечательностей: цирка, памятника Славы, железнодорожного моста, кафедрального собора. Далее к стадиону примыкают уходящие в темноту хозяйственные пристройки. Обойти их до начала второго тайма мне вряд ли удастся, так что я не спеша возвращаюсь к своему сектору. Мне перезванивает Дима: с заданием Кирилла всё в порядке, его уже послали швейцарским архитекторам на проверку. Говорит он из какого-то тихого помещения, не напоминающего по звучанию ни офис, ни его шумную квартиру с тремя малыми детьми. Даша мне так и не перезванивает, а это на неё совсем не похоже. После разговора с Димой мне мерещится, что мои старые-престарые товарищи, менеджер и тимлидка, где-то вместе уединились. Давно замечаю, что Даша неровно дышит к Диме, – это по глазам видно, и по тому, как она оживает в его присутствии. А я, дурак, продолжаю столько лет подряд её ревновать; эта подростковая любовь так никогда до конца и не проходила. Скорей всего, они ведь и правда сейчас сидят вместе в кафе, обсуждают приезд Ойгена. Мне здесь вообще расстраиваться не из-за чего. Я снова сижу на своём сиденье, но от футбола на всё начало второго тайма отключаюсь. Про моего соседа так не скажешь, он опять на взводе. Мяч попадает к щуплому бразильскому легионеру, играющему за нашу команду. Покажи, кричит сосед, что ты настоящий мужчина, а не какой-нибудь (задумывается) шпиндель! Бразилец отдаёт пас вразрез между двумя итальянскими защитниками на полузащитника Коноплянку, тот выходит один на один и мажет. Сосед надрывается: сука! молодец! и всё равно сука! В руке у соседа большой пластиковый стакан с пивом, он то и дело размахивает им, брызги летят на мои брюки. Игра заметно оживляется. Хозяевам удаётся прижать итальянцев к штрафной площадке, но реализовать преимущество они никак не могут. Гости обороняются плотно и умело, опасные моменты остаются крайне редкими. Зозуля принимает мяч в штрафной и бьёт с разворота, но защитник отбивает мяч на угловой, вовремя выставив длинную ногу. Коноплянка несколько раз подряд навешивает в район вратарской площадки с фланга. Итальянцы легко отбивают его навесы и в два-три быстрых паса пытаются развернуть контратаку. Так они забивают второй гол: после перехвата следует долгий перевод мяча на полузащитника, тот проходит по флангу, простреливает вдоль ворот, и нападающий, проехавшись ногами по грязи, замыкает комбинацию. Мой сосед сидит молча, со сжатыми челюстями, раскачиваясь из стороны в сторону. Хозяева бросаются отыгрываться, делают это бестолково, обнажают тылы и едва не пропускают третий мяч. Итальянцы проводят контратаку через центр поля, нападающий убегает сразу от двух защитников и вратаря. Кажется, это уже всё, но мяч попадает в штангу и подоспевший к нему первым вратарь забирает его в руки. Ещё минут десять проходят в яростных атаках хозяев, борьба идёт за каждый квадратный метр поля. Наши смотрятся в эти минуты очень хорошо. Хрупкого бразильца сбивает недалеко от штрафной площадки рослый итальянский полузащитник, тот эффектно падает, словно срезанный косой. Коноплянка закручивает со штрафного в дальнюю девятку – боже ты мой, красота какая. Мяч от перекладины отскакивает к Зозуле, тот подставляет голову и забивает первый гол в итальянские ворота. Мой сосед оживает, я снова слышу его охрипший голос. За первым голом – почти сразу же второй, бразилец вытанцовывает его на пятачке между вратарём и защитниками, никто из них не успевает его остановить. Сосед подскакивает, выкрикивая что-то несвязное, и выливает мне пиво за шиворот. Чтоб ты сдох – это я про себя говорю, я слишком осторожен, читай труслив, чтобы с ним и вправду конфликтовать. Остаётся мало времени, обе команды пытаются закатить победный мяч, но ни у одной это не получается. В последние минуты я болею за итальянцев, пусть испортят поганцу праздник. Но если честно, игра нашей команды в этом сезоне – одна из тех мелочей, что примиряют меня с жизнью. По стадиону проходит волна, затихая на дорогостоящей трибуне и снова поднимаясь на следующей, простецкой. Матч заканчивается на атаке хозяев, под аккомпанемент гнусавых болельщицких дудок. Я иду к выходу, мокрый, умеренно расстроенный, умеренно радостный. Успеваю выйти со стадиона через боковые ворота ещё до толкучки, пока большинство болельщиков смотрит, как игроки-хозяева поднимают руки, приветствуя трибуны, благодарят их за поддержку. Спускаюсь по улице Воскресенской, совсем недавно – улице Ленина. Следовало бы назвать её Банковской, так здесь много финансовых учреждений. Вокруг меня умеренно возбуждённая толпа; в основном, это молодые люди спортивного телосложения. Довольные тем, что нашим удалось отыграть два мяча, они обмениваются деревянными шуточками. Рядом с ними я чувствую ненулевой уровень опасности из-за моей смешной шапки-петушка, сто лет назад вышедшей из моды. На перекрёстке сворачиваю и отделяюсь от основного потока, направляющегося к проспекту. Из противоположных углов ярко освещённой площади глядят друг на друга церковь и управление МВД – так сказать, местные скрепы. Крыша грязновато-бежевой сталинки увенчана целой рощицей юных берёзок. Россыпь старинных двухэтажных домишек, на одном из незакрывающихся подъездов табличка «Стоматологический кабинет за углом, а здесь жилые квартиры». Немыслимой красоты канализационный люк со стёртыми буквами, с орлом, у которого отъедена временем одна из голов. На полпути к Пассажу – обёрнутое полосой брусчатки здание в стиле модерн: полукруглые окошки, фантазийные балкончики. Верхние этажи пусты, и окна в них разбиты, а снизу всё ещё работают продуктовый магазин и отделение банка. Снесут или не снесут? В этом городе и то, и другое возможно. Именно здесь я задумывал поселить героиню хоррор-повести. Стоило бы взяться опять за наброски, довести до ума. Повести, положим, не выйдет – но, может, хоть рассказ? Чтобы сэкономить минуту-другую, я ныряю в наклонный диагональный двор, однако такая идея оказывается неудачной, во дворе множество луж, приходится их обходить или перепрыгивать. Справа – отбеленный домик, на стене его советское по виду граффити в виде листика календаря, немного опережающего сегодняшнюю дату. Изогнутая, как лук, Баррикадная улица, вот ей впору пришлось бы название Ресторанной. У входа на круглосуточный цветочный рынок курит скучающая молодая торговка. Похоже, что ей понравилось бы любое происшествие, как хорошее, так и дурное. Она на всякий случай провожает меня глазами – но я не происшествие, а заурядный мудак в нелепой шапке. В одном из ресторанчиков двое кавказцев тоже смотрят футбольный матч, – верней, один из них смотрит, а второй, раздвинув пальцы, медленно и раздельно говорит что-то первому. В другом окне немолодая женщина сосредоточенно пьёт виски. Из ресторанных недр доносится задохнувшийся звук саксофона и жидкие хлопки. После ещё двух заведений следует неосвещённый участок, без единого фонаря. Я помню, что где-то посередине таится раскрытый люк. По другой стороне улицы пройти нельзя – там грязища возле полностью достроенного, но пустующего торгового центра. О наш вечный экономический кризис. О смены властей и разборки криминальных авторитетов. О страсть к совершенству, заставляющая облицовывать мрамором стены безвкусных поделок. Теперь освещение уже полное, люк я аккуратно обошёл стороной. Высотный офисный дом в американском стиле, с парковкой на нижних этажах и с огромными часами на верхних, – каждые полчаса они наигрывают начальные такты «Пер Гюнта». По диагонали от него – здание в духе Гауди, плавящееся, колышущееся, изгибающее окна и крыши со множеством криволинейных скатов. Рядом кубистический особняк с лепниной, напоминающей месопотамские барельефы. Я волновался из-за того, что в последние месяцы его окружили забором и разобрали на втором этаже ветхие балконы. Все эти старые дома под ударом из-за строительного бума. Внезапный резкий скрежет над головой – и опять, и опять. Ветер оборвал на уровне пятого этажа растяжку с рекламой и молотит о стену вшитым в её нижнюю часть металлический прутом. Чуть не задевает соседнее окно. Надо побыстрей отойти отсюда, все эти крепления в любой момент могут на меня рухнуть. Вход в офисное здание тёмен, внутри никого не видно, сообщить об аварии с рекламой некому. Сразу за высотным зданием стоит старинный краснокирпичный дом с деревянными балконами – сколько таких было уничтожено за последние годы, а этому везёт. С другой стороны улицы стоят приземистые одноэтажные домики. У одного из них боковая стена сплошь покрыта кондиционерами, будто ядовитыми грибами. Далее – весьма таинственный объект: хорошо отреставрированный особняк с рядом голубых елей под окнами, не похожий ни на жилой дом, ни на офис. Угловой дом в виде буквы «С», давно не ремонтировавшийся, с огромными застеклёнными верандами, со светом изнутри прикрытых деревянных ставней. Акациевая аллея перед школой. В ней на секунду одновременно гаснут и потом опять разгораются все фонари. За поворотом, перед заброшенными особняками – топлес-бар на месте бывшего ресторана «Дворянский», преобразованного потом в уже тоже бывший ресторан «Хуторок». Под апельсиновым фонарём у вынесенного наружу столика пьют кофе две юных особы со следами насыщенного жизненного опыта на лицах – может быть, проститутки, а может, барменши. Собаки возле двух заброшек не видно, но где-то неподалёку она поскуливает. На заборе, огораживающем левый особняк, ряд крупных объявлений: «Сон на ульях», «Сливные ямы, бетонные работы», «Осторожно, зона падения сосулек», «Пилатес: вы почувствуете разницу». С правой стороны дороги ряд светильников, охватывающих мёртвые треугольные пространства. Дальше, за особняками, ряд одинаковых металлических столбиков, навевающий ритмом некоторую мистическую оторопь. Почему-то все знаки дорожного движения стоят внаклонку, и трудно чем-то, кроме разгильдяйства, объяснить столь тонко задуманный художественный эффект. Автомобильная мойка работает ночью, трое работников обхаживают бирюзовый «Ланос». Открыта и парикмахерская при мойке. Молодой человек, похожий на футбольную звезду, накручивает бигуди белокурой женщине. Лицо её закрывают крупные буквы, приклеенные к стеклу, но хорошо видны загорелые стройные ноги. Находясь ещё под впечатлением как от их загара, так и от наклонных дорожных знаков, я сворачиваю к воротам своего двора. Разумеется, они заперты. Роюсь в сумке, но связки ключей не нахожу – вероятно, забыл её дома, когда принёс посылку. Второе за день мощное проявление моей рассеянности. Как назло, в будке нет охранников, так что некому открыть. Можно обойти весь дом по набережной: с другой стороны двора тоже есть калитка, магнитные замки на ней сломаны, и ключ не нужен. Но к воротам уже идёт главарь привратной шпаны, жадный, разнообразно прыщавый Антоша. Сообщает: стоял бы ты здесь целую ночь, если бы я не открыл. Купи у меня дистанционный пульт, будешь открывать сам. Господи, ерунда какая, мне вполне хватает ключа. Ничего ему не отвечая, иду к подъезду. Вслед мне летят вялые оскорбления: что ты за человек? человек ли ты вообще? Ни копейки от меня не получишь, Антоша, даже на благоустройство двора, – не надо было мне постоянно хамить, и уж совсем не надо было хамить Оле. Ключей от подъезда у меня тоже нет, приходится набрать номер квартиры на домофоне. Открой, мама, я забыл ключи. В подъезде на втором этаже опять пахнет газом. Плохо это может закончиться. А у нас на площадке снова не включается лампочка. Может быть, наша очередь её заменять? Из окна видно, как над городом светится туман. Было бы красиво, если бы не присохшая к окну корка грязи. Дверь в квартиру заблаговременно мамой открыта, я снимаю сапоги, отношу свою сумку на кухню. С лёгким раздражением отвечаю «всё нормально» на стандартный вопрос мамы «как дела?». Сбрасываю куртку в средней комнате на швейную машину, тихонько захожу в спальню. В темноте видно, как лежит жена – в неудобной позе, сжавшись в клубок, а рядом с ней почивает Коленька, причмокивая во сне губами. Мне очень больно, говорит Оля. Жгучая боль в желудке, уже целых два часа. Боже мой, почему ты мне раньше не позвонила? Я думала, само пройдёт, я ждала тебя с футбола. Давай мы скорую вызовем. Оля молчит. Оленька, давай вызовем скорую. А как же Коля? Он побудет с бабушкой. Если больно, точно лучше вызвать врачей. Ладно, давай вызовем. Я звоню в скорую со стационарного телефона. Иду на кухню, – к счастью, есть немного свежесваренной ромашки. Ставлю кастрюльку с ромашкой на огонь, через полминуты переливаю в Олину чашку тёплую жидкость. Возвращаюсь в спальню. Оля с моей помощью садится в постели, пьёт мелкими глотками. В комнату протискивается мама – выяснить, что происходит. Делает это так громко, что просыпается Коля и трёт сонные глазки. Я коротко объясняю положение вещей и прошу выйти. Ах, милая моя, радость моя. Оля растрогана, я сто лет её так не называл. Не волнуйся, Андрей, всё будет хорошо. Мне уже немного легче, ромашка помогает. Коля начинает плакать, я уношу его в другую комнату к маме, и та пытается его укачать. Звонит домофон, это прибыла скорая. Через минуту к нам заходит плотно сбитая женщина лет сорока пяти, с металлическим ящиком. Расспрашивает Олю, что случилось, давно ли был ужин и что та съела. Салат из редьки? Это может быть острый гастрит или обострение язвенной болезни. Может быть и острый панкреатит. Советую проехать вместе с нами в медсанчасть и сделать УЗИ. Если это панкреатит, обязательно нужна госпитализация, иначе могут быть серьёзные проблемы. Я помогаю Оле одеться и собираю пакет с вещами, которые могут пригодиться в больнице: шлёпанцы, мыло, зубную щётку, халат, полотенце. Мы медленно спускаемся по лестнице. Оля опирается мне на руку и плечо, у ней большая слабость. В фургончик скорой помощи Олю помогает посадить докторша. Едем сначала по набережной, затем по центральному проспекту, переходящему в проспект нецентральный, заполненный панельными хрущёвками, затем по короткой улице со сплочёнными серыми сталинками. Последняя из них, самая просторная, изогнутая покоем – это нужная нам медсанчасть. Вылезаем из фургончика. Оля показывает жестом, что помогать ей не нужно. Спрашиваю, как она себя чувствует. Острой боли уже нет, в животе нехорошо, но спокойней, чем было раньше. Ждём несколько минут, пока нам не открывает двери дежурная медсестра. Идём по тусклому коридору, пол которого выложен клетчатой плиткой. На стенах стенды с фотографиями врачей отделения и полезные советы: сдавать анализы на гепатиты B и C, не иметь случайных половых связей, бросить курить, пить и есть. Плакат с грозным предупреждением: нельзя входить в отделение без бахил. Игнорируя его, идём в УЗИ-кабинет. Оля снова рассказывает свою историю бородатому врачу с мешками под глазами, снимает с себя верхнюю одежду и свитер. Вы захватили полотенце или покрывало? Да, мы об этом подумали. Оля ложится на койку, врач смазывает гелем её живот и возит по нему головкой прибора, одновременно смотря на экран, где пульсируют неясные пятна и тени. Время от времени нажимает на кнопку, изображение останавливается. Увеличивает масштаб, чтобы рассмотреть один из фрагментов. Докторша, приехавшая вместе с нами, сидит в углу и ждёт результатов. Нет, это не панкреатит, говорит бородатый врач. Проблемы с желудком и поджелудочной. Очень похоже на язву, вам надо сделать ещё и гастроскопию, чтобы уточнить. Пока придерживайтесь первой диеты по Певзнеру. Интернет у вас есть? Найдите первую диету и разберитесь, чем вам сейчас можно питаться. Вот моя визитка, приходите для дальнейших обследований. Слава Богу, это не панкреатит, можно отправляться домой. Ох, как же я переволновался. И продолжаю волноваться, язва – это что-то новое, это серьёзно. Докторша скорой помощи предлагает подбросить нас до центрального проспекта всего за 30 гривен. Это дешевле, чем ехать на такси, и мы соглашаемся. Внутри фургончика Оля тихо говорит мне: когда тётка осталась с нами, я сразу поняла, что она хочет заработать. Вот и хорошо – кто знает, когда бы мы дождались такси. Теперь, когда напряжение спало, поездка в разболтанной скорой кажется романтичной: вокруг сполохи реклам и светофоров, блики на мокром асфальте, всплывающие и пропадающие клёны, приготовившиеся к листопаду. Чтобы проехать в центр напрямик, водитель поворачивает на крутую улицу с видавшими виды одноэтажками, с редкими фонарями на деревянных столбах. Затем обрисовывается знакомый район, по левую руку – стадион, другой, не тот, на котором я был вечером. Проносится мрачное здание, которое Оля зовёт Замком Паутины из-за похожих на паутину решетчатых окон. Наконец мы доезжаем до проспекта и сходим, киваем на прощание водителю и врачу. Идём по непривычно пустой аллее, где днём торгуют картинами местные художники, – впервые за много лет взявшись за руки, ощущая усталость и дружескую близость.
Свидетельство о публикации №223112201182