Читать книгу «> npm i» онлайн полностью📖 — Сергея Твардовского — MyBook.
image
cover

Сергей Твардовский
> npm i

Акт I

– Да твою ж мать…

«Фактический результат: датапикер имеет ширину на 5 пикселей больше, чем в макете. Ожидаемый результат: датапикер соответствует размеру».

Третий раз тикет возвращался от тестировщика, и третий раз Макс был уверен в том, что всё было сделано точно так, как было указано в том грёбаном макете.

Приподняв очки, он протёр глаза, издав звук максимального раздражения и усталости, которые годами копились внутри и вырвались наружу только благодаря именно этой незакрытой задаче. Снова.

Звук был громким, протяжным. Похожим на вой.

Макс не стеснялся, ведь стены его квартиры не будут осуждать за нарушение рабочей атмосферы – потому он и не ходил в офис, никогда. Не хотелось мешать коллегам, ведь те могли быть не в курсе его дел. Да и не обязаны были.

Он был готов клясться кровью всех живущих на планете Земля (и за её пределами), что всё проверял много раз. В трёх браузерах. И даже на личном ноутбуке, куда, нарушая политику безопасности, выгрузил весь проект. Всё, нахрен, соответствовало макету!

Капли дождя, настукивающие по карнизу хаотичный и неровный бит, казалось, пытались донести Максу послание: «Обнови резюме, ты пришёл в мир для большего».

Макс уже думал об этом, и не раз. За первые три месяца испытательного срока он будто бы наелся этих «3 пикселя туда» и «4 пикселя сюда», а тут цвет должен быть «#aae5d3» – он это не любил. Ему больше была интересна архитектура приложения, а не этот джуновский треш, которым его заваливали каждый день.

«Привет, го созвон», – набрал сообщение Макс, удержавшись, чтобы не поставить скобочку, тестировщику, который вернул ему «баг».

Сверля взглядом цифру 250, которую выдавал инспектор компонентов страницы, Макс сделал скриншот, вставил его в чат, затем наделал ещё парочку с другими разрешениями экрана, чтобы с чувством холодного превосходства отправить их Алексею, который всё не унимался и возвращал ему задачу.

«Да, без проблем. Через 20 минут… у нас внутренний созвон», – ответил тестировщик.

«Ок», – подумал Макс, ставя большой палец вверх на его сообщение, и отправился на «перекур».

Перекуром Макс называл привычку бегать к окну каждый, без малого, час, а то и пару раз. Вот уже два года, как он бросил курить, когда дела пошли уже совсем плохо – две пачки в день не вписывались ни в какие рамки. Тогда он просто взял и бросил, пожевав пару дней жвачку-заменяйку, чтобы организм адаптировался к новым условиям, совершенно не жалея о содеянном. Только вот, как он ни старался, привычка вставать от компьютера, чтобы совершить привычный ритуал, коим была вся его зависимость, осталась и никуда не собиралась уходить – ни через неделю, ни через три месяца.

Он пробовал всё: отжиматься, качать пресс, просто ходить по комнате кругами, наматывая шаги в приложении. В результате купил пачку своих бывших сигарет и перестал придумывать новые способы заткнуть глотку орущему на него рефлексу.

Всё было просто: можно не зажигать огонь.

По спине пробежал холодок – не сквозняк. Макс не умел просто так отпускать плохие мысли и до сих пор морщился, вспоминая то, как один из лидов скинул во флудилку новость о том, как один из бэкарей крупного финтеха повесился в горящем доме, который сам поджёг, да ещё и с глумливой подписью «сгорел на работе».

– Ублюдок… – сплюнул Макс, положил сигарету на подоконник и покинул кухню, наслушавшись шелеста дождя и преисполненный отвращением.

Не глядя на сообщение от тестировщика, он открыл сайт со своим резюме.

***

– Макс, я не могу задачу закрыть, пока не будет всё по макету, – отозвался Алексей.

Макс, тускло взирающий на экран, где транслировался браузер тестера, и, чёрт возьми, датапикер был ровно на 5 пикселей меньше.

– Закрыть эту и завести баг?

– Не вариант, – мгновенно отозвался Алексей, – мы же в прод льём сразу…

– Слушай… – Макс перестал пытаться поплавить монитор взглядом, – то, что девопса не нашли, как бы, не моя проблема. Я и так всё сам собираю и вручную лью туда, и у меня всё на скринах, в общем. То скрины билда, а не dev’а. И вообще, у нас кто приоритеты определяет? Эти пять пикселей сраных блочат что-то? А вот раздел несвёрстанный, за который я взяться не могу из-за стори незакрытой, – он, да, всех блочит.

– Макс…

Наушники внезапно стали сильно давить, что аж уши заныли, прижатые к голове длительное время.

– Я тебя понял, в общем, схожу к ПМ’у, чтобы он сам всё двинул и завёл. Давай, – нажал на кнопку отключения от созвона и сорвал наушники, чтобы дать передавленным капиллярам чуток нормальной жизни.

Развернул сайт поиска работы – какие-то просмотры уже пошли, и, возможно, к вечеру уже кто-то да напишет.

«Пошло оно всё нахер.»

Макс решил, что не станет воротить носом. Первые адекватные ребята на техническом собеседовании – пусть, привычно, лукавящие о том, как отлажены у них технические процессы и какие интересные задачи ему предстоит решать. Пускай.

Главное – не слышать о том, что чёртовы пять пикселей, на которые абсолютно никто не обратит внимания, важнее целого раздела, за который с него же спрашивают каждый день те же, кто не даёт закрыть стори с грёбанным датапикером.

Руководитель проекта ответил почти сразу, и они долго разговаривали о том, как плохо распределена нагрузка и приоритеты. Он всё время повторял, словно мантру, что прекрасно понимает его – Максима – боль и готов всячески содействовать, но заказчик, хоть и мелкий, но перспективный, истерит по поводу каждого несоответствия.

– Вы не представляете, сколько я бабла отвалил дизайнеру, – пародируя непривычно быдловатым тоном того самого заказчика, прокривлялся ПМ, чем вызвал тень понимающей полуухмылки у Максима.

Откинувшийся в кресле Макс, вытянув ноги под столом, запрокинул голову на спинку кресла и смотрел в потолок. В уголке, едва уловимой тенью, колыхалась какая-то паутинка, которую он всё собирался ликвидировать влажной тряпкой, но каждый раз забывал.

На экран смотреть не хотелось. Ни на один из трёх – даже на тот, где накручивался счётчик просмотров его резюме.

– Макс, ты же суперкрутой, чего ты, ну? – ПМ, после очередной экспозиции того, как ему самому нелегко, «но начальство…», включил свои софт-скиллы, – похорони уже эту таску долбанную, как ты умеешь, да возьми пару дэйоффов. Ты, к тому же, перерабатывал там нормально, потому тебе оплатят.

Пара дэйоффов была бы очень к месту. Макс с радостью бы свалил из города на пару дней и, может быть, даже потерялся бы в лесу, чтобы не приходить на дэйлик в понедельник, но у него не было ни одной идеи, как можно было бы выполнить эту задачу.

– Может, ну его нахрен, тот? У тебя же стили и вся красота уже готова… может, тебе свой сделать быстрее будет? Ты же, помнишь, делал для нашего внутреннего проекта…

– Сань, а ты помнишь, что у нас свой UI-kit, и все компоненты мы берём оттуда? – Словно ожидая в засаде своего часа, протянул Макс. – Это НАШ датапикер, который я ДОЛЖЕН использовать. Я понятия не имею, зачем тестер мне мозг делает. Или нам, под этого неадеквата, новый кит пилить?… Я-то… ха, да я с радостью, лол. Только вот это повесит вообще весь спринт. – Макс знал куда бить. Нет, он рад был бы сделать самый крутой набор компонентов, но… кто ж ему даст… – Ставь всё на паузу… и будет вам нормальный пикер, либо забейте на эти сраные пиксели уже…

ПМ шумно вздохнул, прежде чем произнести то, что ему явно не хотелось, но Макс ждал этого, ведь не зря была вся та телега о том, «как ему самому тяжело»:

– Не вариант, Макс… И да, он реально конченный и с линейкой или хрен знает чем сверяет всё по фигме. Там очень заумный контракт, и он неустойку за эти пиксели может выкатить… Мы и так по срокам не вписываемся.

«Бл…» – оборвал себя на полуслове Макс, сообразив, что мысль пошла наружу.

– Ясно, – завершил он подошедший к концу диалог.

***

Пять.

Шесть.

Левый трицепс забило, но Макс собирался выжать штангу хотя бы восемь раз.

Семь.

Сердце будто остановилось, а капелька пота попала в левый глаз.

Во-о-о-о-осемь.

– Ух-х-х-х, бля, – выдохнул Максим, обрушив семьдесят килограммов на стойку. Дыхание даже не сбилось, ведь, казалось, его организм просто забыл, как дышать.

– Ещё бы пару раз, – прочитал Макс по губам, глядя на лицо бритого качка, который его страховал.

– Не, – мотнул он головой в ответ, успев заметить лёгкое разочарование, проскользнувшее в глазах человека, чьего имени он и не знал. Да и видел впервые.

Уселся, крякнув, и тут же встал, вытянув левую руку, чтобы растянуть туго стянутую мышцу…

Бл…

Поняв, что трицепс не просто забился, а окончательно сдох, Макс перестал тянуть руку, схватил полотенце со скамьи, одним взмахом забросил его на плечо, взял бутылку с водой и телефон и направился к выходу.

Не доставая наушник из уха, покачал головой, отвечая на вопрос «Ты всё?», который он даже не услышал.

«Сука, ну как же так…» – первая и последняя мысль, что возникла в голове Максима, когда, под бодрый запил Within Temptation в ушах, он, глядя только вперёд, запнулся о лежащую посреди дороги гантель. Он ведь видел её, но нога не посчитала нужным подняться выше.

Растянувшись на полу качалки, он старался не думать о том, что на него смотрели.

***

После получасового кардио Макс, решивший, что хватит на сегодня страданий, отправился в раздевалку.

Зеркало он не любил. Всегда не любил.

Когда он худел – видел в отражении вечного дрыща, когда набирал – жирного. Ожидания никак не хотели договариваться с реальностью, потому он старался особо себя не разглядывать. За полторы-две секунды, чуть напрягая плечи и грудь, можно было заметить результат – или его отсутствие.

Обычно он делал это мимоходом, на пути в сауну, где можно было прогреться после тренировки. Именно так, ведь после двадцати минут в изнуряющей жаре у него не было ни сил, ни желания куда-то там смотреть.

Вот и сейчас, проходя мимо одного из огромных зеркал, что были разбросаны в раздевалке, Макс нехотя, краем глаза, окинул свой плечевой пояс и застыл на секунду, увидев за спиной, между рядами шкафчиков, лицо, которого не должно было быть здесь.

Раньше его не было.

Вымышленными друзьями он никогда не страдал. До недавнего времени. Возможно, всё из-за стресса и выгорания.

«Тебя нет! Уйди!» – мысленно гаркнул Макс, встретившись взглядом с тем, кого он не должен был видеть в отражении, и, резко отвернувшись, направился в душевую.

***

Маршрутка, как назло, ушла прямо перед ним, свет фар медленно растворился в мокром воздухе, и он решил не ждать следующую. Пешком, казалось, было быстрее, а может, и полезнее, хоть и было холодно.

Оттопырив ворот своей осенней куртки, Макс двинулся в направлении дома.

Дождь снова начался, как будто подгадав момент, когда Максим достаточно отошёл от остановки, чтобы стало лень возвращаться. Накрыло не ливнем, а мелкой моросью, от которой хотелось моргать, когда редкие капельки прилетали на ресницы. Дождь преследовал его, не отпуская, а Макс хотел только стряхнуть с лица холодную влагу и спрятаться под капюшон, который он почему-то отстегнул и забросил на шкаф.

Асфальт под ногами блестел, отражая редкие фонари, которые дрожали в ряби на поверхности луж. Макс шёл быстро, но не спеша, и каждый шаг отзывался в голове тихим стуком – как метроном, сбивающийся на полудолю каждый раз, когда приходилось притормаживать, обходя кого-то. Холодный воздух пропах поздней осенью и мокрой листвой, и где-то внутри этого запаха слышался другой – едва уловимый, кисловатый…

Он достал телефон, чтобы глянуть время, но экран не загорелся. Секунду держал кнопку, потом ещё, но ничего не происходило.

«Разрядился, видимо», – подумал он, но всё равно не убрал в карман, а просто шёл вперёд, держа в руке чёрный прямоугольник, в котором, казалось, отражалось что-то, кроме него. Тень, может. Или просто ему нужен был чёртов отпуск?

Где-то справа, за высоким забором, кто-то шёл параллельно – шаг в шаг.

Макс прислушался, остановился, и шаги остановились.

«Эхо», – решил он, но когда сделал ещё шаг, звук отозвался чуть позже – будто тот, кто находился по ту сторону, задумался, а потом всё-таки решил не отставать.

Он свернул во двор, где всегда коротал путь, если решался идти пешком: старые пятиэтажки, мрачные подъезды, пара мусорных баков под навесом. Свет в одном из окон мигнул, и Максу показалось, что внутри кто-то стоял у окна, глядя на него. Мотнув головой, он продолжил путь, так и не решив: глюк это был или отражение.

Отражения сегодня вообще были не на его стороне.

На последних метрах пути он поймал себя на том, что прислушивается. К чему – сам не понимал, жалея о том, что не стал ждать маршрутку, ведь продрог до костей.

Ключ провернулся в замке с лёгким щелчком. Он вошёл, включил свет, и в прихожей на секунду показалось, что на стене – два силуэта: его и чей-то ещё.

Макс моргнул, отступив на шаг, тряхнув головой, и снова остался один.

***

Макс уже был на грани, когда в последний раз проверил размер пикселей в коде – и снова: на пять пикселей больше. Строчка в инспекторе компонентов, как всегда, показывала 250, а в макете – 245. Всё так же, чёрт побери. Он сжал зубы и, выдохнув, снова переключил вкладки, повторяя для себя одно и то же: «Не должно быть так, блять…».

Пальцы сами начали жать на клавиши, ещё раз прописывая стиль – снова и снова. Он отключил все плагины, обновил всё, что только можно было обновить, и, отчаянно тупя в цифры, продолжал искать причину этой грёбанной разницы в пять пикселей. Но чем дольше смотрел, тем меньше это казалось чем-то реальным. Он уже почти не замечал, что ноутбук начинал лагать, требуя перезагрузки, экран тускнел, а мышка перемещалась в медленном, почти незаметном темпе – как будто сама давно сдалась.

«Где я ошибся?» – отчаянно спрашивал он себя, тупо глядя в код, уже совершенно не понимая, что там написано. Баг был тупой. Но в этом тупом баге Макс понял, что застрял по самую макушку. Он уже не вывозил. Он опять наткнулся на ту самую мелочь, которая всё перекрывала, подрывала суть его работы, лишала смысла и веры в завтрашний день.

Он проклял датапикер. Проклял все датапикеры на свете.

– Да твою мать, где эти пиксели! – сорвался на полный голос, бросая взгляд на часы. Три часа ночи. – Чёрт.

Он схватил бутылку с водой, сделал пару глотков, чувствуя, как холод по горлу отрезвляет. Ледяная вода, которую он закинул в морозильник, чтобы как следует охладилась, была великолепна. Внутри всё стыло, а пожар, который разгорался внутри, был смыт ледяным потоком.

Пальцы сжались на клавишах, и Макс уже не мог остановиться. Этот пиксельный кошмар не отпускал. Он снова и снова проверял и перепроверял каждый свой шаг, но цифры были неумолимы. Все данные сходились, а результат – нет.

Новый билд снова не дал результата.

– Блядь, да что за нахер! – Максим выругался, поднимая глаза к экрану и замечая, как его отражение в тусклом свете лампы выглядит почти чужим. Он отвёл взгляд, злясь на себя. Глубокий вдох, второй, третий, десятый. Снова сосредоточился.

Ещё час спустя, когда уже начинала ломиться башка, Макс, не отрываясь, проверял угол наклона экрана, меняя разрешения и переписывая код. Но ничего не менялось – результат как был, так и остался. Пиксели вновь не сходились. Точнее, он просто не мог воспроизвести всё то, что было написано в баг-репорте.

– Может, это я в глаза долблюсь, или я, сука, глюки ловлю, или я тупой, или чё?!

На экране снова отразился его пылающий яростью взгляд. Он внезапно понял, что сам теряет чёткость, словно датапикер высасывал из него всё.

«Стоп… остынь. Стоп, стоп, стоп!»

Игра в эти пиксели вдруг показалась ему шуткой. Он – как тот глупый тестировщик, который жёстко сверял всё по линейке. Справедливости ради, кто вообще решал, что эта чёртова разница в пять пикселей стоит таких усилий?

Макс сгорбился, чтобы хоть как-то расслабить плечи. Он уже почти не ощущал, что делает что-то важное. Эти пиксели уже были неважны. Они просто были там, интегрированные ему под кожу, и он знал, что этот грёбаный баг поглотит его с концами.

«Подожди… так вот же оно!» – внезапный инсайт. В дереве нод. Прямо под носом. – «ВОТ ЖЕ ЭТА СУКА!»

Макс чуть ли не вскочил с кресла, несмотря на усталость и разбитость.

Почему он до сих пор не смотрел на обёртки, у которых при билде появлялись модульные классы, но была там одна обёртка со статичным классом! Была!

БЫЛА!

Макс застучал пальцами по клавиатуре, как одержимый.

Да! Так делать плохо, так делать не стоит. Не нужно заносить костыльные стили в общую таблицу, но ему было можно. Ему было нужно – именно сейчас, именно ему.

Пять пикселей исчезли, будто бы их не было никогда. Макс откинулся в кресле.

Пофикшено!

***

Он сразу понял, что спит.

Не потому, что всё выглядело странно – наоборот, всё было слишком чётким, без привычного глазу размытия, каким обычно бывали его сны. Просто где-то внутри уже щёлкнуло: «Это всё понарошку».

Дом был большой, частный, двухэтажный и до одури пустой. Макс стоял внизу, возле панорамного окна. За ним тянулся серый туман, который был настолько плотным, что в нём не было ни единого просвета. Никаких деревьев, ни дороги – просто стена светло серого, похожего на густой дым от горящей плёнки, клубящегося тумана, в котором тонул этот чужой дом, в который его забросило.

И запах…

Пахло гарью – сухой, едкой, как будто в доме недавно что-то горело, и этот запах въелся в дерево и стены. Он был таким отчётливым, что от него было не скрыться.

Он провёл взглядом по комнате. Это была студия-гостиная с кухней – будто бы с объявления на «Авито». Всё новое, едва обжитое, несмотря на ощущение, что тут был настоящий пожар.

Внимание привлекла лестница наверх. На втором этаже – открытый проём, а под потолком, где не хватало панелей, виднелись балки. На одной из них болталась верёвка – петля, прямо на уровне второго этажа. Лёгкое покачивание слегка гипнотизировало, словно маятник.

Макс застыл, глядя на неё, и понял, что не хочет знать, зачем она там.

Он закрыл глаза, потом открыл – петля всё ещё была. Движение не прекратилось.

– Это сон, – тихо сказал он, не пытаясь себя убедить, а чтобы услышать хоть что-то в этой гнетущей тишине.

Шорох.

Он повернулся к окну.

Снаружи туман зашевелился. Сначала едва, потом заметнее, и через секунду из него выступила фигура.

Шаг, ещё шаг… теперь Макс мог различить лицо.

Тот самый парень из спортзала. Из отражения в зеркале. Он стоял, не двигаясь, и смотрел прямо перед собой, будто не видя Макса. Но нет… видел. Движения зрачков говорили о том, что парень посматривал на него, отвлекаясь от созерцания дома.

Взгляд его был таким… будто он хотел попасть внутрь. Он вожделенно вглядывался в интерьер – будто ребёнок, которому дали посмотреть на желанную игрушку, которой у него не могло быть по ряду причин. Он, казалось, пытался запомнить всё, что было внутри, словно видел это в последний раз в своей жизни.

Макс почувствовал, как внутри что-то холодеет. Хотел отступить, но ноги не послушались. Взгляд из-за стекла был настолько переполнен горечью, что аж скулы сводило.

– Кто ты? Чё тебе надо от меня?

На этой странице вы можете прочитать онлайн книгу «> npm i», автора Сергея Твардовского. Данная книга имеет возрастное ограничение 18+, относится к жанрам: «Мистика», «Триллеры». Произведение затрагивает такие темы, как «хоррор», «психологические триллеры». Книга «> npm i» была написана в 2025 и издана в 2026 году. Приятного чтения!