

Монолит
Глава
Это художественное произведение. Все персонажи, события и организации, описанные в книге, являются вымышленными. Любые совпадения с реальными людьми, компаниями и обстоятельствами случайны.
Монолит
Глава 1. Приглашение
Дмитрий влетел в комнату и едва не снёс плечом косяк. До начала оставалось меньше минуты. Тяжёлая дверь общежития глухо хлопнула за спиной, и красный глаз HAL-9000 на старом постере дёрнулся в сквозняке, будто успел проводить его взглядом.
Он боялся только одного — опоздать.
— Чёрт… — тихо выдохнул он.
Дмитрий быстро пересёк комнату двумя широкими шагами. На ходу сбросил рюкзак на пол и почти упал на скрипучий стул перед письменным столом у окна.
Это была обычная маленькая комната для одного-двух старшекурсников. Стены покрывали старые обои с выцветшим узором — когда-то жёлтые ромбы на сером фоне. Почти весь рисунок уже исчез под слоями студенческих надписей, стрелок и формул, будто каждый жилец пытался дописать к комнате что-то своё.
Предыдущие обитатели нарисовали огромного кота в очках. Чуть ниже крупными буквами было написано:
«СДАШЬ АЛГОРИТМЫ — СДАШЬ ВСЁ»
Немного дальше поверх узора жирно красовалась надпись:
«НЕФРИТОВЫЙ ЖЕЗЛ»
— со схематичным и довольно хулиганским рисунком. Рядом была нарисована стрелка, направленная вверх и вправо — почти как логотип Вектора, только грубо выведенная шариковой ручкой.
У окна стоял старый письменный стол с облупившимся краем. На нём лежал ноутбук, рядом стояла кружка с давно остывшим чаем, а поверх стопки распечатанных листов была разложена тренировочная подборка задач.
На верхнем листе крупно было написано:
ICPC Regional Training Set — Problem H
Дмитрий резко открыл крышку ноутбука. Экран вспыхнул холодным светом и отразился в тёмном стекле окна.
На панели задач мигала иконка: синяя стрелка, направленная вверх и вправо. Рядом с ней было написано:
Вектор
Этот логотип был везде: на экранах телефонов, в такси, в платёжках, в новостях, почти во всём интернете. Но сейчас он выглядел непривычно маленьким — просто значком программы на его старом ноутбуке.
Под логотипом было написано:
Vector Nexus
Дмитрий кликнул.
Окно программы открылось почти мгновенно. В правом верхнем углу уже медленно пульсировал тёмно-красный огонёк. На долю секунды в центре экрана мелькнула строка:
Инициализация core-platform…Загрузка сервисов…
Затем текст исчез.
Интерфейс переключился на экран подключения. В левом верхнем углу светился логотип компании:
Вектор ↗
Внизу появилась строка:
Подключение к конференции…
Проверка устройства…
Синхронизация профиля…
Внизу интерфейса появилось сообщение:
Рады вас видеть, Дмитрий.
Ниже автоматически подтянулись строки:
Университет: Южный технический университет
Специализация: алгоритмы и структуры данных
ICPC: региональный финал
Мелким серым текстом было добавлено:
Профиль сформирован автоматически.
Он не помнил, чтобы вводил эти данные именно здесь. Видимо, профиль подтянулся из анкеты стажёра. Так даже было удобнее.
Красный огонёк в углу экрана медленно пульсировал.
Дмитрий прищурился. Красный круг показался ему странно знакомым — почти такой же смотрел на него со старого постера HAL-9000 на двери. Он усмехнулся.
— Ну конечно… — пробормотал он. — Кто только придумал сделать маскотом конференции искусственный разум, который не пускает Дэйва.
Он покачал головой.
— Дизайнеры. Что с них взять.
В этот момент интерфейс Nexus тихо щёлкнул. Окно разделилось, и на экране появилось лицо девушки на фоне светлого современного офиса. За её спиной были стеклянные перегородки, зелёные растения и люди с ноутбуками, спокойно работавшие за длинными столами.
— Дмитрий, добрый день! Вы меня слышите?
Анна на миг замолчала, и на лице у неё мелькнуло что-то вроде досады — короткой, рабочей, уже привычной.
— Простите. День длинный. Дмитрий?
— Да, здравствуйте… извините, я только подключился.
Анна улыбнулась — быстро, будто по привычке, но не совсем автоматически.
— Ничего страшного. Меня зовут Анна, я из команды рекрутинга Вектора.
На ней была светлая блузка, и когда она немного наклонилась к камере, Дмитрий заметил на её груди тонкую золотую цепочку. На ней висел маленький кулон — пчела с расправленными крыльями. Кулон едва заметно блеснул, когда Анна повернула голову, а потом она машинально поправила его двумя пальцами.
— Я посмотрела ваш профиль. Финалист университетского этапа ICPC, победитель региональной олимпиады по программированию, несколько призовых мест на тренировочных контестах. Очень хороший результат.
Дмитрий немного неловко улыбнулся.
— Спасибо… стараюсь.
Анна кивнула и переключила презентацию.
На экране появились светлые офисы, стеклянные переговорные и аккуратные ряды ноутбуков. Дмитрий машинально оглянулся на свою комнату. Скрипучий стул, старые обои и кружка с остывшим чаем выглядели рядом с этим не бедно, а временно.
Все эти схемы, дата-центры и ровные ряды экранов на слайдах выглядели гораздо более естественной средой для сложных алгоритмов.
— Вектор — это технологический холдинг, — рассказывала Анна. — Платформы, транспорт, платежи, инфраструктура, машинное обучение и ещё много всего, без чего современный человек уже не любит оставаться один.
Слайды сменялись один за другим: дата-центры, серверные залы, кампусы из стекла и бетона. Потом — столовые, кофейпойнты, спортзалы.
Дмитрий машинально посмотрел на пакет лапши на своём столе.
Следующий слайд назывался Ценности Вектора. Фразы звучали слишком уверенно, чтобы им совсем уж верить, но ровно настолько, чтобы захотеть оказаться по ту сторону этих слайдов.
Потом появился слайд конкретнее.
Развитие и обратная связь
— В Векторе действует система регулярной аттестации сотрудников.
Ежеквартальная оценка результатов.
Обратная связь руководителя и команды.
Индивидуальные траектории развития.
Внизу слайда мелким текстом было добавлено:
В отдельных случаях по итогам аттестации может быть принято решение о завершении сотрудничества.
— Такой процесс помогает нам поддерживать высокий инженерный уровень, — сказала Анна.
Дмитрий кивнул.
Он немного помедлил, а потом спросил:
— А кто будет руководителем команды?
— Тимлид платформенной команды — Егор, — ответила Анна. — Он относительно недавно занял эту позицию. Команда сильно изменилась за последние пару лет: часть инженеров перешла в другие проекты, часть ушла из компании. Сейчас команда фактически собирается заново.
Она переключила слайд.
— Егор как раз занимается тем, что пытается постепенно разобрать монолит и выделить из него сервисы. У него довольно амбициозный план: сначала детально исследовать, как система устроена, а потом — медленно, не развалив всё по дороге, — вытаскивать из неё сервисы по одному.
Дмитрий тихо присвистнул.
— Звучит… масштабно.
Дмитрий хотел добавить: «и красиво», но не успел.
— Да, — согласилась Анна. — Но это одна из самых интересных инженерных задач в компании.
Следующий слайд.
Сложная схема из десятков блоков и стрелок.
— У Вектора тысячи сервисов, — сказала Анна. — Но многие из них выросли из одной большой системы.
На экране появился большой тёмный прямоугольник.
Подпись:
CORE PLATFORM
Анна чуть улыбнулась.
— Внутри компании её обычно называют просто… монолит.
Она пожала плечами.
— Инженеры любят простые названия.
Анна задумалась.
— Честно говоря, никто уже до конца не помнит, почему он называется именно так.
Она на мгновение отвела взгляд, будто вспоминая.
— Есть версия, что это слово появилось после одного из внутренних инструментов архитектурного анализа. Когда инженеры пытались автоматически разобрать зависимости системы, отчёт генератора почему-то озаглавил её одним словом — Monolith.
Анна усмехнулась.
— Название просто прижилось.
— Похоже на половину проектов, которые я видел, — сказал Дмитрий.
— Эта платформа работает уже больше пятнадцати лет и обеспечивает значительную часть внутренних процессов компании, — продолжила Анна. — Интересно, что за всё это время её ни разу полностью не останавливали.
Она задержала взгляд на схеме.
— Даже на обновлениях. Обычно мы просто переключаем часть трафика и смотрим, как система реагирует. У старых систем иногда появляется своя инерция. Потом уже не очень понятно, ты её обслуживаешь или просто стараешься не мешать.
Он посмотрел на схему ещё раз.
— А стажёры обычно попадают именно в эту команду?
— Не обязательно, — ответила Анна. — Иногда мы распределяем стажёров в смежные команды. Но сейчас у нас есть место именно в команде платформы.
Она улыбнулась.
— И мы хотим предложить его вам.
Дмитрий моргнул.
— Серьёзно?
— Абсолютно.
Она закрыла презентацию.
— Я отправлю вам детали на почту. И, Дмитрий…
— Да?
— Добро пожаловать в Вектор.
Связь в Vector Nexus тихо оборвалась. Экран потемнел.
Дмитрий ещё секунду сидел, глядя на монитор, потом открыл почту.
Новое письмо уже лежало там.
Vector Engineering Internship — Offer
Дмитрий улыбнулся. Похоже, его жизнь только что резко изменилась.
И только потом он заметил, что окно Nexus почему-то не закрылось полностью. В правом верхнем углу всё ещё медленно пульсировал тёмно-красный огонёк.
Он мигнул чуть ярче и снова стал тусклым, словно соединение всё ещё не закончилось.
Дмитрий больше не обращал на него внимания. Красный огонёк продолжал спокойно мигать.
Глава 2. Первый день
Стеклянные двери кампуса Вектора разошлись перед ним беззвучно.
Ещё вчера всё это существовало только на экране ноутбука: логотип, оффер, голос Анны, тёмно-красный огонёк в углу окна Nexus. Теперь Дмитрий стоял в настоящем холле компании и невольно замедлил шаг.
Холл был огромный и очень светлый. Пол из серого камня, высокие потолки, аккуратные ряды турникетов. За ними начиналась длинная стена из экранов, на которых медленно двигались графики, диаграммы и какие-то показатели.
Дмитрий прошёл через турникет и направился к стойке регистрации.
Девушка за стойкой подняла глаза.
— Соколов? — спросила она.
Дмитрий остановился.
Он не успел ни подойти к стойке, ни сказать ни слова.
— Да… — сказал он после паузы.
Ему показалось, что он что-то пропустил. Может быть, его имя было написано на пропуске? Но пропуска у него ещё не было.
Он машинально огляделся.
Только тогда он заметил над стойкой маленькую чёрную полусферу камеры. Внутри неё медленно горел маленький красный огонёк — почти такой же, какой вчера продолжал мигать в окне Nexus уже после завершения звонка.
Он мигнул.
Дмитрий отвёл взгляд.
Девушка уже доставала из-под стойки белую коробку с логотипом компании.
— Ваш комплект сотрудника.
Она протянула коробку; та оказалась неожиданно тяжёлой.
Внутри лежали ноутбук, телефон, пропуск, синяя футболка с логотипом Вектора, кружка, блокнот и несколько листов со стикерами.
На внутренней стороне крышки было напечатано:
Build systems that move the world
Девушка улыбнулась.
— Поздравляю.
Она чуть наклонила коробку к нему.
— Теперь вы официально часть инженерной культуры Вектора.
Дмитрий кивнул.
— Спасибо.
Девушка жестом показала в сторону огромной стены экранов в конце холла.
— У нас принято показывать новым сотрудникам операционную панель компании.
Дмитрий поднял голову.
Вся дальняя стена холла была занята экранами. На них медленно обновлялись графики, диаграммы и какие-то аббревиатуры.
— В Векторе мы считаем, что любая система становится лучше, если её можно измерить, — сказала она почти наизусть. — Поэтому у нас единая программа операционных метрик.
На первом экране крупно светилась строка:
ZBS — Zero Bug Score
0.000%
— Это показатель качества программных систем, — сказала девушка. — Количество обнаруженных дефектов в критических компонентах платформы.
— Ноль? — спросил Дмитрий.
— Именно, — кивнула она. — Мы очень гордимся этой цифрой.
Дмитрий только начал говорить, но следующий экран сменился почти незаметно.
TRASH — Total Reliability &Availability System Health
99.98%
— Это агрегированный показатель здоровья инфраструктуры: устойчивость сервисов, операционные риски, стабильность процессов.
Экран рядом обновился.
CHAOS — Corporate Health &Operational Stability
12.4
— Это интегральный индекс операционной динамики. Чем выше показатель, тем активнее система адаптируется.
Дмитрий кивнул, хотя не был уверен, что понял смысл фразы.
Последний экран выглядел особенно спокойным.
DISASTER — Distributed Incident Status &Event Response
0 active
— Это глобальный мониторинг инцидентов, — сказала девушка. — Отслеживает любые события, которые могут повлиять на устойчивость экосистемы.
— Любые? — переспросил Дмитрий.
— Абсолютно любые.
Дмитрий снова посмотрел на стену экранов. В другой обстановке он бы, наверное, усмехнулся над этим парадом аббревиатур, но здесь сначала почему-то хотелось понять, как всё это склеено.
Почти все графики были зелёными. Все показатели находились в «нормальной зоне».
Только в углу одного из экранов была маленькая строка:
Days since last catastrophic event: 0
Он моргнул.
Но экран уже обновился.
Девушка тем временем протянула ему пропуск.
— Ваш этаж шестой.
Она указала в сторону лифтов.
— Платформенная команда.
И снова улыбнулась.
— Добро пожаловать в Вектор.
Дмитрий вошёл в лифт и остановился перед панелью кнопок.
Он уже собирался нажать 6, но кабина мягко тронулась вверх сама.
На табло загорелась цифра 6.
Дмитрий успел удивиться и сразу сделал вид, что тут, видимо, всё так и должно работать. В Векторе почти любая мелочь выглядела так, будто о ней подумали раньше, чем она успела стать действием.
На втором этаже лифт остановился.
Двери разъехались, и внутрь вошли двое сотрудников с бумажными стаканами кофе. На стаканах был напечатан логотип Вектора — синяя стрелка вверх и вправо, которая при желании напоминала пчелу с расправленными крыльями. Видимо, дизайнеры долго думали над этой двойственностью и решили оставить оба смысла.
Сотрудники продолжали разговор, словно лифт был просто продолжением коридора.
— …я тебе говорю, вчера навигатор опять предложил маршрут через реку.
— Через мост?
— Нет. Напрямую.
— Ну… оптимизирует.
— Видимо.
Лифт тронулся дальше.
Дмитрий немного сдвинулся в сторону, чтобы освободить место, и случайно задел локтем одного из них. Кофе выплеснулся из стакана и тёмным пятном растёкся по полу кабины.
— Ой, извините! — быстро сказал Дмитрий.
Сотрудник посмотрел на лужу, потом на него. В его взгляде не было ни раздражения, ни удивления — только спокойствие человека, которого здесь уже давно ничем не удивить.
— Ничего.
Второй сделал глоток кофе.
— Сейчас робот приедет.
На табло загорелась цифра 3, лифт остановился, двери открылись, и из коридора тихо въехал круглый робот-уборщик — низкий, матовый, с вращающимися щётками и небольшим сенсорным куполом сверху.
На его корпусе мелкими буквами было напечатано длинное служебное название:
Vector Autonomous MultiPurpose Intelligent Room Equipment
Ниже стоял инвентарный номер:
Unit 17
Робот замер, словно оценивая обстановку, затем подъехал к луже кофе и начал негромко жужжать, втягивая жидкость.
— Быстро реагирует система, — сказал Дмитрий.
— Да, — ответил один из сотрудников. — Иногда даже слишком быстро.
Робот аккуратно собрал кофе, немного покрутился на месте, будто проверяя результат, и выехал обратно в коридор прежде, чем двери закрылись.
Лифт продолжил движение.
Несколько секунд все молчали.
Потом один из сотрудников сказал:
— Кстати, у меня вчера погода в приложении показывала прогноз на 31 декабря 2099 года.
— И какая там погода?
— Облачно. Минус три.
Второй задумался.
— Ну… стабильно.
Он сделал ещё глоток кофе.
— А у меня вчера система прислала уведомление.
— Какое?
— «Спасибо, что были с нами».
— За что?
— Не уточнили.
Второй тихо хмыкнул.
— Вежливо. Как будто заранее проверяет, кто тут временный, а кто нет.
Лифт остановился на шестом этаже, двери открылись, сотрудники спокойно вышли из кабины и пошли по коридору, продолжая разговор.
— Может, это тест.
— Может.
— Или просто кто-то опять выкатывал обновление в пятницу.
Дмитрий вышел следом.
Коридор шестого этажа оказался заметно тише, чем внизу. Здесь почти не было людей — только редкие рабочие места за стеклянными перегородками и длинная линия окон, через которые падал холодный утренний свет.
Один из сотрудников кивнул в сторону дальнего конца этажа.
— Платформенная команда там.
Дмитрий поблагодарил и пошёл в указанном направлении.
Чем дальше он шёл по коридору, тем больше вокруг становилось мониторов с графиками, логами и архитектурными схемами.
Почти на всех схемах линии в итоге сходились в один и тот же прямоугольник.
В центре диаграммы он был подписан коротко:
MONOLITH
Где-то впереди, за стеклянной стеной, начиналось пространство, где обитала платформенная команда. Это уже был не весь офис с его гладкой корпоративной вежливостью, а отдельная рабочая среда — более тесная, живая и заметно менее декоративная.
— Платформенная команда? — спросил Дмитрий, заглянув за стеклянную стену.
— Да.
Человек кивнул, будто это и так было очевидно, и протянул руку.
— Саша.
Рукопожатие было коротким и уверенным.
— Система пропусков сказала, что у нас сегодня новый человек, — добавил он. — Она обычно не врёт.
— Иногда врёт, — сказал голос слева.
Саша слегка наклонил голову в сторону соседнего стола.
— Это Олег.
Высокий худой парень в наушниках снял один наушник и посмотрел на Дмитрия так внимательно, будто пытался понять, с каким типом задачи ему предстоит иметь дело.
— Привет.
— Привет.
Олег коротко кивнул и снова надел наушник.
— Он сейчас дебажит очередное проявление свободы воли монолита, — пояснил Саша.
— Я всё слышу, — сказал Олег, не оборачиваясь.
С другой стороны стола сидел ещё один человек, который выглядел немного старше остальных и держал в руках кружку с крупной надписью:
NO SILVER BULLET
Саша постучал костяшками пальцев по столу.
— Алексей.
Алексей поднял взгляд.
— А?
— Это Дмитрий. Новый стажёр.
Алексей задержал на нём взгляд чуть дольше, чем требовало знакомство, и кивнул.
— Добро пожаловать.
Он сделал глоток кофе, поморщился и только потом откинулся в кресле.
— Не бойся, — сказал он. — Первые пару лет тут тяжело.
Саша усмехнулся.
— Он шутит.
— Не особо.
Дмитрий невольно снова посмотрел на схему на стене.
— Это… вся система? — спросил он.
Саша тоже повернулся к стене и некоторое время рассматривал схему, будто видел её впервые.
— Нет, — сказал он наконец. — Это только часть.
Он указал на центральный прямоугольник.
— Вот это — монолит.
Дмитрий сделал шаг ближе.
Внизу схемы был небольшой системный дашборд, закреплённый прямо под распечаткой и, судя по всему, подключённый к какому-то внутреннему мониторингу. На нём отображалась короткая информация о платформе.
SYSTEM STATUS: ACTIVE
UPTIME: 1843 days
SYSTEM AGE: origin 1994
Дмитрий машинально пересчитал в голове.
— Подождите… — сказал он. — Эта система старше меня.
И сам услышал в своём голосе почти уважение.
Саша кивнул.
— Ага.
— И всё ещё работает?
Олег снял наушник.
— В основном.
— Иногда даже правильно, — добавил Саша.
Дмитрий снова посмотрел на схему.
— А почему она называется монолит?
Саша пожал плечами.
— Тебе уже рассказывали версию про старый отчёт?
— Да, — сказал Дмитрий. — Что генератор сам написал MONOLITH.
— Ну вот, — сказал Саша. — Это самая приличная версия.
Олег добавил:
— Есть ещё версия, что кто-то так назвал директорию временно.
— И временно оказалось навсегда, — сказал Саша.
Алексей сделал ещё один глоток кофе.
— Как обычно.
Дмитрий снова посмотрел на дашборд.
UPTIME: 1843 days
— Её правда ни разу не останавливали? — спросил он.
Саша покачал головой.
— Полностью — нет.
— Иногда выключают куски, иногда запускают новые, иногда делают вид, что понимают, что происходит.
Олег повернулся в кресле.
— Но в целом она просто… работает.
Он кивнул на схему.
— Это главное свойство монолита.
Дмитрий задумчиво посмотрел на центральный прямоугольник.
MONOLITH
Схема действительно напоминала карту какого-то старого города — со стрелками, переходами, странными перекрёстками и узлами, которые, судя по всему, появлялись здесь в разное время и по разным причинам.
— Ничего, — сказал Саша. — Скоро Егор придёт и расскажет, как мы будем это всё переделывать.
Он ещё немного смотрел на схему на стене, потом хлопнул ладонью по столу и повернулся к Дмитрию.
— Ладно, давай начнём с простого.
— Сначала поставим тебе окружение.
Дмитрий поставил на стол свой новый ноутбук из комплекта новичка и открыл крышку. Экран загорелся почти мгновенно. На нём уже были корпоративный образ системы, логотип Вектора в углу, несколько предустановленных приложений и аккуратная папка Vector Dev Tools на рабочем столе.
Олег, не отрываясь от своего монитора, сказал:
— Да.
— Это самая простая часть.
Пауза.
Алексей тихо добавил:
— И самая длинная.
Саша наклонился ближе к экрану.
— У нас своя система контроля версий, — сказал он. — Называется Perverse.
— Почти как Perforce, — добавил Олег.
— Только хуже.
Саша сделал вид, что не услышал.
— Открой терминал.
Дмитрий открыл терминал. Чёрное окно с белым текстом выглядело почти слишком чистым на новом ноутбуке.
— Теперь открой корпоративную вики.
Через минуту на экране появилась страница с оптимистичным названием:
Developer Onboarding — Quick Start
Под заголовком шло три шага.
Установить Perverse CLI
Получить исходный код
Выполнить make install-dev
Саша кивнул.
— Видишь. Всё очень просто.
Он указал на строку команды.
perverse materialize monolith@internal.dev.vector
— Начинай.
Дмитрий набрал команду.
Терминал задумался.
Потом начал печатать строки.
Resolving workspace…
Syncing objects…
Receiving files…
Несколько секунд всё выглядело вполне нормально.
Потом терминал остановился.
ERROR: client spec not found
Дмитрий посмотрел на Сашу.
— Это нормально?
Саша вздохнул.
— А, да.
— Инструкция немного устарела.
Олег снял наушник.
— Немного.
— Года на четыре.
Саша открыл другой терминал.
— Сначала нужно создать workspace.
Он набрал несколько команд.
— Потом прописать клиента.
— И только после этого materialize.
Дмитрий снова запустил команду.
На этот раз синхронизация пошла дальше.
Receiving file 18432/91277
Receiving file 18433/91277
Receiving file 18434/91277
— Сколько там файлов? — спросил Дмитрий.
Олег ответил, не оборачиваясь:
— Никто точно не знает.
— Мы перестали считать несколько лет назад.
Саша пожал плечами.
— Монолит большой.
В этот момент дверь пространства команды открылась.
Внутрь зашла девушка с ноутбуком под мышкой.
Она остановилась у ближайшего стола и молча смотрела на экран Дмитрия, где терминал продолжал прокручивать тысячи строк.
Дмитрий заметил её не сразу. Поднял глаза и поймал спокойный оценивающий взгляд, будто она уже много раз видела подобные сцены и примерно представляла, чем всё закончится.