Утро у Тёмы — сплошное благодушие. Выспался, по дороге взял свой любимый капучино с корицей, зашёл в офис вразвалочку, кивнул паре коллег. Опустился в кресло, отхлебнул, потянулся и открыл ноутбук с ленивой полуулыбкой. Вчера он лёг чемпионом: собрал из кубиков целый собственный мир, взял второе звание, а под вечер поставил рабочий портал Антона на всю ночь — доделаться самому. Сейчас откроет, а там готовое чудо. Жизнь прекрасна.
Он открывает портал.
Витрина не грузится — вместо неё битый блок. Тёма хмурится, жмёт обновление. Битый блок остаётся. Кликает по навигации — она ведёт в никуда. Лезет в reward-flow, где считаются награды, — цифры скачут, начисляет как пьяный. Открывает лидерборд — пусто, будто таблицы и не было. Ещё раз обновление. Ещё раз. Ничего не меняется.
— Это что за… — капучино замирает на полпути ко рту.
Рука привычно тянется к спасательному кругу. Ну подумаешь, Саня ночью сбойнул. Что-то пошло не так — жми /rewind, верни все в зад Эта кнопка вытаскивала его весь месяц, он обращается с ней как профи. Жмёт и выдыхает - все вернулось как было.
Или нет?! Не откатывается!
Тёма моргает. Жмёт ещё раз — увереннее, будто кнопка не заела. Пусто. Лезет в историю отмены посмотреть, к чему откатывать, — а истории нет. Пробует по-другому, третий заход — тот же результат. Откат не работает.
— Да ладно, — уже без улыбки. — Ты-то чего.
Попробовав все возможные варианты, Тема приходит к очевидному выводу: откат сегодня не работает вообще. И медленно, снова набирая разные команды, начинает догадываться почему. /rewind жил внутри ночной сессии — отматывал разговор с агентом и правки в нём. А ночью что-то сбойнуло: сессия не закрылась аккуратно, её снесло. Вместе с ней снесло и всё, к чему откатывать, — историю, точки возврата. Команда есть, а отматывать ей больше нечего.
Этот урок ощущается гораздо горше, чем кофе. /rewind — штука хорошая, но лёгкая: страховка для обычных задач, не от катастрофы. Пока сессия жива — тянет назад что угодно. А сносит сессию — сносит и страховку. Для настоящей беды нужна защита покрепче, которая живёт отдельно от проекта и которую никаким сбоем не сдует. Такой у Тёмы пока нет.
Тема впервые не может сдержать себя в руках:
— Да он с ума сошёл за ночь! — Тёма чуть не роняет стакан. — Кто вообще просил менять половину проекта?!
Обвинить хочется кого угодно — агента, ночь, кривой портал. Но результат от этого не изменится. Может, не всё так плохо? Может, обновить пожёстче, кэш почистить? Может, где-то лежит вчерашняя копия, и он сейчас её найдёт, подсунет — и всё как было? Он тыкается туда-сюда, ищет запасной выход. Запасного выхода нет.
И вот теперь — он просто уставился на проект и молчит. Лучший день месяца превратился в худший за 30 минут. Раньше любая поломка была локальной: сломал — сам починю, моя песочница, никто не увидит. А сейчас нет. Это реальный коммерческий проект Антона, который поставил на кон свою репутацию и доверил портал ему. Не очки в Змейке посыпались — посыпалось чужое дело, за неделю до сдачи.
Долго горевать Тёма не умеет — не тот характер. Но и тут его встряхивают снаружи.
В чат с Артём2036 падает сообщение. По утрам оттуда обычно летит что-нибудь смешное — мем, картинка, шутка без подписи. Сегодня иначе: голос суше, жёстче, без баловства. Будто тот, кто пишет, сегодня не развлекается.
Под текстом — картинка, и не мем. Слева — схема, как Тёма и думал про жизнь: прямая стрелка, на одном конце «успех», на другом «провал», между ними ничего. Либо-либо. А справа — другая дорога: кривая, с поворотами, тупиками, местами возвращается назад и идёт дальше уже иначе. И вторая подписана так, будто она и есть настоящая, а первая — детская.
Текста немного. Сегодняшняя ночь — не конец. Не та точка, где стрелка упёрлась в «провал», и всё. Это поворот на кривой дороге. Концом он становится в одном случае — если сам решишь сбежать. Ни жалости, ни «бедненький, наладится». Холодный тычок: встал и пошёл дальше.
И только теперь Тёма замечает: картинка пришла чистой. Ни одной чёрной кляксы, ни съеденного слова — впервые за долго. Обычно тот, из будущего, кричит сквозь помехи: полтекста в труху, угадывай. А тут — ровно, целиком, будто это сегодня важнее любой цензуры. Тёма не знает, что страшнее — каша или вот такая ясность.
Он залипает на развилку дольше, чем на утренний прикол. Тычок «поворот, а не конец» принимает целиком: ладно. Встал и пошёл. Кофе, считай, остыл.
Мимо стола проходит Олег. Тёма внутренне сжимается — вот сейчас прилетит. Старик давно ждёт, когда новичок навернётся, а тут красная ошибка во весь экран, идеальный повод добить. Олег притормаживает, скользит взглядом по руинам, по красным ошибкам. Смотрит на Тему и не добивает.
— Споткнулся — вставай, — роняет коротко, почти по-рабочему, и идёт дальше.
Тёма провожает его взглядом. Странно. Ни ухмылки, ни шпильки. Будто старик слишком хорошо знает, как выглядит настоящее падение в работе, чтоб ржать над чужим.
Тёма ещё раз обводит глазами монитор — и паника отпускает, а на её место лезет упрямое, рабочее. Если ночь — поворот, а не финал, то и грустить нечего. Надо понять, что именно случилось. Не «всё сломалось», а — что конкретно, в каком порядке, чьими руками.
И тут он вспоминает простую вещь. Пару дней назад он сам, ещё играясь с автоматикой, повесил на портал логирование — чтобы важные шаги агента писались в отдельный файл. Тогда это была забава «оно само пишет». А сейчас — единственная зацепка. Сессию ночью снесло, откат мёртв, но журнал-то писался в файл на диск, отдельно. Его сбой не тронул. Значит, есть хроника прошлой ночи.
Тёма лезет за ночным логом. Открывает — и это не сухой хвост ошибок, а кое-что поинтереснее. Журнал того, кто всю ночь хозяйничал в проекте, пока хозяин спал.
— Ну-ка, ну-ка, — он пододвигается ближе. Из того, кого ночью обокрали, он на глазах превращается в того, кто это дело расследует.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ