***
В машине пахло вчерашним дождём и чьей-то несбывшейся мечтой. Я вырулил со двора и тут же уткнулся в пробку. Впереди маячил микроавтобус с наклейкой на заднем стекле: «Не сигналь – я медитирую». Водитель, судя по скорости, действительно пребывал где-то в астрале: он трогался на зелёный с задержкой секунд в десять, а потом ехал так, будто в салоне перевозил аквариум с нервными рыбами. За мной пристроился оранжевый «Рено» с принтом на капоте: «Обгоняй, пока я добрый». Видимо, доброта у водителя заканчивалась примерно на третьей секунде после старта, потому что он непрерывно моргал дальним и пытался протиснуться в щель между мной и отбойником, которой не существовало в природе. В левом ряду томился чёрный джип с хромированной надписью на запаске: «Паркуюсь как хочу. Нет, серьёзно, как хочу». И, судя по тому, что его заднее колесо наполовину заехало на тротуар, автор текста ничего не преувеличивал. Пока я полз вдоль бесконечного забора, мой взгляд зацепился за свежее граффити на бетонном блоке: «Ты не в пробке. Ты в очереди за смыслом жизни». Ниже кто-то подписал мелом: «Тогда почему смысла нет, а бензин кончается?» Я усмехнулся и машинально проверил, не заблокировала ли меня снова «Тойота» с вечно обновляющимися философскими лозунгами. Нет, сегодня обошлось. Зато на соседней полосе обнаружилась «Газель» с надписью на борту: «Груз надежды. Не кантовать». И чуть мельче: «Впрочем, уже поздно». Навигатор предложил три маршрута: быстрый (через центр), объездной (без пробок по окраине) и экономичный (где-то между отчаянием и апатией). Я выбрал четвёртый – выключил звук и поехал по памяти. В конце концов, какая разница, каким путём двигаться, если финальная точка всё равно офис. На светофоре рядом притормозила девушка на розовом «Мини Купере». На заднем стекле красовалась надпись: «Любовь – это когда он моет мою машину». Я скосил глаза на её заляпанный грязью бампер и подумал, что с любовью у неё, кажется, недавно случился перерыв. Стрелка тронулась, и через пару кварталов я наконец въехал на парковку. Моё место занимал чей-то велик с табличкой «Я экологичен, как ваши нереализованные мечты». Рядом стоял хипстер с такой густой бородой, что в ней можно было прятать запасные ключи. Я опустил стекло и поинтересовался: – Это ваше? – Нет, – ответил он с достоинством. – Это манифест.***
В офисе пахло перегретым пластиком и вчерашними амбициями. Я плюхнулся в кресло, и оно жалобно скрипнуло, словно спрашивая: «Опять ты?» IDE загрузилась с пятой попытки. Я открыл вчерашний код. Строки смотрели на меня с немым укором, будто спрашивали: «И это всё, на что ты способен?» Комментарии предыдущего разработчика не оставляли сомнений:text
// Магия, не трогать
// Здесь должно работать, но почему-то не работает
// FIXME: Когда-нибудь разобраться
Я вздохнул и полез в документацию. Документация, как обычно, устарела. Stack Overflow предлагал решения для похожей, но не идентичной проблемы. Гугл настойчиво спрашивал: «Возможно, вы имели в виду: как сменить профессию?» На часах было 9:17. До стендапа – тринадцать минут. Я сделал глоток из термокружки. Кофе, переживший поездку от дома до офиса, уже остыл и приобрёл лёгкий привкус безысходности.***
Каждый день в 9:30 утра наша команда собиралась на виртуальный стендап – пятнадцатиминутный ритуал коллективного самообмана. Я всегда присоединялся ровно в 9:29:58, чтобы моя иконка появилась в Zoom последней, как нежеланный гость на вечеринке. – Ну что, начинаем? – голос Артёма, нашего тимлида, звучал так бодро, что было ясно: он либо выпил три чашки кофе, либо смирился с неизбежным. Его аватарка – фото с корпоратива, где он неестественно улыбался, – напоминала мне, что даже фальшивая улыбка когда-то заканчивается. Первой слово взяла Аня, фронтенд-разработчица: – У меня почти всё готово, осталось немного допилить анимации и получить фидбек от дизайнера. Её глаза на веб-камере нервно бегали из стороны в сторону, выдавая, что «немного допилить» на самом деле означает «переписать половину компонентов с нуля». Саша, бэкендер, скрестил руки на груди: – Я залил изменения на staging, жду, когда QA проверит. Мы все знали, что staging не работал уже неделю, а QA-инженер Виктор вчера ушёл на больничный с диагнозом «профессиональное выгорание». Макс, junior-разработчик, неуверенно пробормотал: – Я… в процессе изучения задачи. Его взгляд, полный животного ужаса, говорил, что «изучение задачи» пока сводилось к паническому гуглению «как стать фермером в Алтайском крае». Когда очередь дошла до меня, я глубоко вздохнул: – Разбираюсь с тем, почему метод getUserData() иногда возвращает null вместо объекта пользователя. Моя веб-камера в этот момент замылила изображение – не то технический глюк, не то метафора моего профессионального существования. Артём кивнул с видом шамана, пытающегося вылечить рак лёгких танцем с бубном: – Может, это не баг, а фича? Например, если пользователь – призрак? В чате тут же всплыло сообщение от продукт-менеджера: – Если это фича, надо задокументировать в API! Клиенты любят мистику! Я медленно закрыл глаза и представил, как пишу в документации:text
/**
* Возвращает данные пользователя
* @returns {User | null} Объект пользователя или null, если пользователь – призрак
*/
– Ещё вопросы? – спросил Артём с наигранной бодростью. Молчание в ответ было таким громким, что его можно было бы записать на плёнку и продавать как ASMR для страдающих бессонницей. – Тогда всем продуктивного дня! – заключил он фальшиво-жизнерадостным тоном, которым обычно говорят «держитесь там» пассажирам тонущего парома. Квадратики с лицами исчезали один за другим. Я остался последним, глядя на своё отражение в чёрном прямоугольнике выключенной камеры. Мой взгляд спрашивал: «Какого чёрта?» Мой ответ – пожимал плечами. Прежде чем выйти из конференции, я заметил, что забыл выключить микрофон. Последнее, что услышала команда перед тем, как я нажал «Leave meeting» – это мой глубокий, полный экзистенциальной усталости вздох. На часах было 9:43. Следующий стендап – через 23 часа 47 минут. Но кто считал?***
Slack вспыхнул красной иконкой непрочитанных сообщений, как предупреждение о радиационной опасности. Первое же сообщение в общем чате заставило мои пальцы замереть над клавиатурой: @Дима Почему падает прод? Клиенты в панике!!! – это был Алексей из саппорта, человек, чей уровень стресса можно измерять в банановых эквивалентах. Я взглянул на часы – 11:03. Раньше обычного. Обычно прод начинал падать после обеда, когда все уже успевали забыть, как выглядит их код. Но сегодня система решила начать праздник пораньше. @Дима Ну что там? – появилось новое сообщение через сорок семь секунд. Алексей явно сидел, уставившись в экран, обновляя страницу, как голодный кот у миски. Я открыл Kibana. Логи напоминали сценарий фильма ужасов:text
ERROR [2024-04-15 9:58:23] NullPointerException: Cannot invoke "User.getSoul()" because "user" is null
– Отлично, – пробормотал я. – Теперь у нас есть научное подтверждение, что у пользователей нет души. @Дима Клиент SC-441 в ярости! Они теряют деньги! – Алексей явно перешёл в режим паники. Его сообщения выглядели так, будто их писал перегретый телеграфный аппарат. Я принялся лихорадочно пролистывать историю коммитов. Последнее изменение было внесено вчера в 18:30 – прямо перед тем, как я ушёл, мечтая забыть о работе хотя бы на ночь. Комментарий к коммиту гласил: фикс NPE Ирония была настолько густой, что её можно было резать ножом. Я мысленно поставил памятник себе вчерашнему: «Здесь лежит человек, который думал, что починил проблему с NullPointerException». В чате всплывали новые сообщения: «Может откатить?» – предложил кто-то разумный. «Нельзя! Там критичный фикс для SC-228!» – парировал Артём. «SC-441 говорит, что подаёт в суд» – доложил Алексей, явно наслаждаясь хаосом. Я открыл IDE. Пальцы замерли над клавиатурой. В этот момент пришло личное сообщение от QA Виктора, который формально был на больничном, но, видимо, не мог удержаться от шоу: «Смешно, да? 😆» Я не ответил. Вместо этого я начал писать код. Не знаю, можно ли было назвать это кодом – скорее, что-то среднее между заклинанием и молитвой:java
try {
user.getSoul().getMeaningOfLife();
} catch (NullPointerException e) {
// Если у пользователя нет души, просто притворимся, что всё ок
return new Soul().setMeaningOfLife(42);
}
Я сделал коммит с сообщением горячий фикс, что в переводе с корпоративного означало «я понятия не имею, что делаю, но давайте попробуем». «Фикс будет через 5 минут», – написал я в чат, добавив смайлик с улыбкой. Смайлик лгал. Я не улыбался. Через три минуты пришло сообщение от CI/CD: Build failed. Я забыл точку с запятой. В этот момент я понял, что ад – это не метафора. Ад – это когда ты торопишься починить продакшен, а твой код не компилируется из-за синтаксической ошибки, и весь Slack смотрит на тебя. «Всё ок?» – спросил Артём. Я представил, как беру ноутбук, открываю окно и аккуратно, двумя руками, выпускаю его в свободный полёт. Вместо этого я поставил точку с запятой и запушил изменения снова. «Готово», – написал я, когда продакшен поднялся. В душе я уже составлял заявление об уходе. Через минуту пришло сообщение: «SC-441 говорит спасибо, инцидент исчерпан» Никто не спросил, что было не так. Никто не сказал «хорошая работа». Чат просто умер, как будто ничего не произошло. Я остался один на один с экраном, на котором теперь безмятежно работал прод. На часах было 11:47. До следующего падения продакшена оставалось примерно четыре часа. Я откинулся на спинку кресла и задумался о том, что, возможно, в следующей жизни стану плотником. Или камнем.***
Я вышел из офиса в обед, и первое, что бросилось в глаза – рекламный щит с надписью: «Успей купить – осталось мало!» – Жизнь – тоже что-то, чего осталось мало, но почему-то никто не торопится, – пробормотал я, закуривая у входа. Дорога до ближайшей забегаловки лежала через парк. На скамейке кто-то оставил газету с заголовком: «Эксперты говорят: нужно работать больше!» – Эксперты явно не пробовали работать, – сообщил я спинке скамейки, перешагивая через бордюр. На асфальте мелом было выведено: «Люби жизнь!» Я перешагнул через надпись, чувствуя, что инструкция неясна. В кафе висела табличка: «У нас вкусно, как у мамы!» – но бутерброд, который мне принесли, по консистенции напоминал мокрый картон. Я сидел у окна, жевал и смотрел на плакат напротив: «Ты можешь всё!» – и мысленно дописывал: «Но зачем?» За соседним столиком девушка что-то строчила в блокноте. На обложке красовалось: «Мечтай! Действуй! Достигай!» Я машинально завершил фразу в голове: «А потом умри». Кофе был горьким. Как осознание того, что через полчаса надо возвращаться в офис. Я допил до дна и увидел на внутренней стороне чашки: «Жди перемен!» Вспомнилась песня, но сердце – всего лишь мышца, а перемены – миф. На выходе из кафе я заметил наклейку на урне: «Спасибо, что не мусоришь!» – и чуть не ответил вслух: «Спасибо, что не живу». По пути обратно я прошёл мимо билборда: «Будь лучше, чем вчера!» Вчера я вообще не выходил из дома. Над дверью офиса висел корпоративный плакат: «Ты – часть команды!» Я мысленно вздохнул: «Команды неудачников» – и приложил пропуск к турникету. Турникет щёлкнул, пропуская меня обратно. На часах было 13:17. До конца рабочего дня оставалось пять часов сорок три минуты. «Время – иллюзия, – подумал я, шагая к своему рабочему месту. – Обед – тем более».***
Монитор мерцал в полутьме офиса, как угасающая звезда. Последние лучи солнца пробивались сквозь жалюзи, рисуя на стене полосатые тюремные решётки. Я закрыл Jira, оставив три «критических» бага, четыре «срочных» задачи и один тикет с пометкой «Дима, это на тебя» на завтра. «Всё равно никто их сегодня проверять не будет», – подумал я, но на всякий случай перевёл все в статус «В работе». Корпоративная привычка врать о прогрессе оказалась сильнее меня. В Slack всплыло новое сообщение: @Дима Ты скинешь отчёт по задачам? – Артём явно задержался на работе, чтобы спросить об этом ровно в 18:01. Я глянул на часы – 18:02. Двадцать восемь секунд опоздания. Достаточно, чтобы почувствовать вину, но недостаточно, чтобы извиниться. «Да, сейчас», – ответил я, хотя отчёт лежал готовым ещё с обеда. Подожду ещё пять минут – пусть поволнуется. Мой взгляд упал на стикер, прилепленный к монитору: «Ты можешь больше!» Кто-то из HR оставил его во время последнего тимбилдинга. Я дописал снизу: «Но зачем?» – и отправил в урну. Скрипнула дверь. В офисе появился уборщик дядя Вася – единственный человек в этом здании, чья работа имела видимый результат. – Ты ещё здесь? – спросил он, начиная подметать. – К сожалению. – Ну держись. Он выключил свет в дальнем конце зала. Мы играли в эту игру каждый вечер: он выключал свет постепенно, давая мне понять, что пора уходить, а я делал вид, что не замечаю. Я закрыл ноутбук. На мгновение в тёмном экране отразилось моё лицо – усталое, с красными от напряжения глазами. «Отчёт в приложении», – наконец отправил я Артёму и тут же получил ответ: «Спасибо! Завтра в 9:30 стендап, не опаздывай!» Я фыркнул. Завтра. Как будто завтра что-то изменится. Телефон в кармане завибрировал. Напоминание, что на завтра назначен сеанс у Ольги Сергеевны на 19:00.***
Я вышел на улицу. Ночь встретила меня фразой на рекламном билборде: «Новый день – новые возможности!» – И те же самые проблемы, – пробормотал я, натягивая воротник куртки повыше. Моя «Лада» стояла на парковке. На капоте кто-то (скорее всего я вчера) дописал мелом:text
// TODO: Починить жизнь
Ниже кто-то (скорее всего я сегодня утром) приписал:text
// FIXME: Или хотя бы перезагрузить
Я сел за руль, повернул ключ. Двигатель кашлянул, но завёлся – верный товарищ в этом бессмысленном пути. Навигатор снова предложил три маршрута: быстрый, без пробок и экономичный. Я выбрал четвёртый – выключил его и поехал наугад. По радио играла песня: «We are the champions…» Я переключил волну: «…hello darkness, my old friend…» – Вот это уже теплее, – пробормотал я. На светофоре зацепился взглядом за свежее граффити на стене: «Счастье не за горами. Но и горы не близко». Рядом кто-то приписал баллончиком: «А счастье вообще не в курсе, что мы его ждём». Я усмехнулся. Может, завтра действительно будет лучше. А может, и нет. Но сегодня я хотя бы ехал домой. На часах было 19:38. До следующего утра оставалось одиннадцать часов двадцать две минуты. – Время – понятие относительное, – вспомнил я, сворачивая к дому. – Как и счастье.***
Я стоял под дверью квартиры, ключ замер на полпути к замку. На стене лифта кто-то вывел маркером: «Твоя жизнь – не баг, а фича». А ниже, тем же маркером, но другим почерком: «Тогда почему её всё время хочется откатить?» Дверь скрипнула, будто спрашивая: «Ну и где ты шлялся?» Квартира встретила меня мерцающей лампочкой в прихожей (азбука Морзе: «поменяй меня»), холодильником, гудящим похоронный марш, и грустным кактусом на подоконнике, который, кажется, перестал колоться от безысходности. Я бросил ключи в миску, где они легли рядом с тремя чеками из аптеки: снотворное, витамины, пластырь – стандартный набор выживальщика. На микроволновке по-прежнему мигало «00:00». Раскрыл ноутбук. Slack по привычке дёрнулся уведомлением: «@here Кто-то забыл выключить свет в кухне!» Я закрыл вкладку. Открыл новую. Набрал в Google: «Как перестать видеть цитаты во всём?» Выдача предложила: Статью про обсессивно-компульсивное расстройство. Книгу «Когнитивно-поведенческая терапия за 21 день». Форум с темой: «Брат постоянно говорит цитатами, как убить?» Холодильник выдавил из себя банку пива – последнюю. На этикетке красовалось: «Открой новый вкус!» Я приложил холодное стекло ко лбу. Новый или нет, а всё равно горький. По телевизору шли новости. Бегущая строка гласила: «Эксперты советуют мыслить позитивно!» И в тот же момент диктор произнёс: «Число увольнений в IT-секторе выросло на тридцать процентов».***
Душ пытался смыть с меня этот день. Шампунь почему-то пах офисным кофе. На запотевшем зеркале я машинально написал пальцем: «Ты – не то, что о тебе думают». А затем стёр полотенцем и прошептал: «Скорее уж – не думают». Потянулся за снотворным. На упаковке: «Не превышайте дозировку!» Я высыпал на ладонь ровно одну таблетку и зачем-то посмотрел на неё с укоризной. Потолок. Темнота. Тишина. – Бытие определяет сознание, – шепчет мне мозг. – А зарплата – бытие, – отвечаю я. Сосед сверху начинает сверлить. Стена передаёт вибрацией: Тук-тук-тук – «Я мыслю». Тук-тук-тук – «Следовательно существую». Тук-тук-ТЫК – «Но лучше бы не существовал». Напоминание на телефоне издевательски пискнуло: «Пора спать. 6:30 – Подъём! Новый день – новые возможности!» Я нажимаю «Отложить». За окном проезжает грузовик. На его борту светится: «Мечтай! Действуй! Достигай!» Он сворачивает за угол, и надпись гаснет. На часах 01:17. До следующего стендапа – 8 часов 13 минут. До следующего падения продакшена – около 9 часов. До сеанса с Ольгой Сергеевной – 12 часов 43 минуты. Я закрываю глаза. – Утро вечера мудренее, – говорит последняя мысль перед сном. – Но не факт, – успеваю я подумать в ответ. Темнота. Тишина. На часах – бесконечность.