Обложка Суббота

Суббота

Толян Белый

0% прочитано
Стандартный
Толян Белый

Суббота

Глава 1

По ночам лаборатория превращалась в город теней. Паяльник чадил, как дешёвая сигара, самодельный программатор мигал одиноким глазком и будто подслушивал. Линолеум вздулся волнами — по ним удобно уходить от погони. Белых комнат у нас не было: только серые, как сводки по срокам. И всё же здесь работали честно: дрожащий вентилятор, металлические коробки и банки вместо лотков, и листок «НЕ ВЫДЁРГИВАТЬ!» над единственной розеткой с "чистым напряжением" — наш маленький кодекс порядочности.

Сомнения пришли шёпотом. В проектной документации всплыли листы «как будто согласованные», с датами «вчера», хотя вчера сеть лежала полдня. На схеме пропали подписи пары номиналов — мелочь на бумаге, риск в железе. В таблице временных окон появились «допуски», которых никто из нас не утверждал. Ни сирен, ни драм — липкий шум, от которого хочется мыть руки.

Подняли архив, развернули журнал изменений, пересчитали листы, вернули подписи, вытащили из шкафа «оригинал-оригинала». Я распечатал «сравнилку» и пришпилил к стене кнопкой: спорить стало не о чём. Шум притих, но остался в углах, как пыль после сверления: заметишь — станешь занудой, не заметишь — будешь виноватым.

Дальше — авторский надзор. На производстве светлее, но честнее от этого не становится. Встретили нас вежливо — улыбкой для похорон. «Сюда нельзя — чужая зона; там нельзя — временно закрыто». Наше изделие «упростили»: убрали часть разъёмов «для удобства монтажа», и разводка зазвучала как вязание в рукавицах. Мы положили рядом эталонный макет, отметили несоответствия, оформили акт. Сначала цеховые обиделись, потом вернули «как было». Бумага облегчённо вздохнула. На стекле остались отпечатки чужих пальцев.

Перед полётами — наземные проверки прямо на борту. Самолёт — стратегический, новый, дорогой и немногословный. Внутри тесно и жарко: воздух стоит, присесть толком некуда. Хорошо, что на этом борту мы уже бывали: знали, где прижать коленом ноутбук, куда завести щуп, чтобы не получить по рукам, как перекрикивать вентиляторы. Машина «под током», жгуты гудят, корпус дрожит от приводов. И именно там вылезло «невозможное»: несколько пакетов телеметрии пришли «раньше расписания».

Прошли по цепочке — нашли узел, где перепутали бортовой ноль и экран. В самолёте нет общей «земли»: есть бортовой ноль и экраны, которые сводятся только в расчётных точках. А здесь экран подключили как ноль — создали паразитный контур для помех. Из-за этого часть синфазного сигнала превратилась в дифференциальный. Выборка в узком окне стала изредка ловить ранние совпадения, а сигнал временами выглядел «слишком чистым» и проскакивал вперёд.

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

Проводку поправили — дрожь ушла, а защита осталась.

Полетели всё равно настороженными. В таком самолете лететь не очень комфортно: колени упираются, ноутбук на весу, кабели норовят слететь, и везде жарко. «Танец параметров» вернулся: телеметрия изредка ставит во времени невидимую запятую. Приборы — чисто, фронты — ровно, колебания — в пределах. По бумаге — гладко; по нутру — не сходится. Но ведь логика изделия была в норме.

В лоб — не войти: отладочный JTAG с платы сняли «ради чистоты компоновки». Пошли не по методике - через «технический» UART на краевом разъёме вывели скрытую служебную консоль, на секунду заморозили тактирование и сняли атомарный снапшот: одним вдохом забрали срез регистров, масок и указателей, вершины стеков с «канарейкой», счётчики вытеснений, текущую картину планировщика и короткую ленту событий — от прихода пакета до выхода из прерывания — с метками монотонных часов и поправкой дрейфа. Картина сухая и правильная: железо ровно, рантайм ровно; а ветка подготовки телеметрии местами получает вход на пару тиков раньше расписания. Не прыжок, а тихий сдвиг окна. (Кто оставил лаз в сервисный режим, почему он вообще там и при чём тут исчезнувший JTAG, — потом.)

— Такого не бывает, — сказал я, глядя на график.

Лётчик усмехнулся, не отрываясь от шкал:

— Точно у нас только то, что вернёмся на землю.

Правильный ответ. Худший из возможных.

Держаться было за что — за конвейер. Сборочный пайплайн шёл зелёным, как светофор на пустой улице: закреплённые раннеры, предсказуемая среда; инструментальная цепочка зафиксирована в манифесте; детерминированные сборки — одинаковый вход даёт одинаковый образ; артефакты с контрольными суммами — в хранилище; релизные теги подписаны; у каждого билда — «паспорт»: зависимости, суммы, отчёт тестов. Если «магия» и существует, ей место либо в коде, либо под паяльником. В воздухе она не живёт.

Вернувшись, я не пошёл в кабинет. Остался за своим столом — и через минуту дверь скрипнула сама: начальник отдела пришёл ко мне.

Он снял пальто, повесил на спинку стула, постоял, глядя на ровную стопку распечаток. Спрашивать не стал — всё было видно по пометкам карандашом и заломленным углам.

— Нужно идти к директору, — сказал он.

— Пойдёмте, — ответил я.

Он покачал головой — мягко, но твёрдо:

— Нет, иди сам. Так правильно. Я потом догоню бумагой.

Пауза. Он подбирал слова, словно выбирал тонкую отвёртку из банки с инструментами:

— Слушай… разговор будет сложный. Он тебя уважает. Но сейчас это не моя битва. Твоя. Скажи так, чтобы потом не пришлось краснеть ни тебе, ни мне.

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

Перед тем как выйти, я собрал всё, что делает разговор предметным. На флешку легло слишком много для флешки: результаты стендовых измерений, исходники, схемы, спецификации, черновики и чистовики, трассы, отчёты, билды с паспортами, фотографии макетов и заводских мест, комментарии к листам, герберы плат, прошивки, подпрограммы — весь дыхательный объём системы. Что это за система, здесь можно и не говорить впрямую; достаточно намёка: когда такие машины взрослеют, пилотам остаётся всё меньше задач. А машинам — всё больше решений. Иногда — своих.

Флешка стала тяжёлой. Хороший признак. Лёгкие решения обычно плохие.

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

— Садитесь, — сказал он. — Этап надо сдавать. Вы в курсе.

— В курсе. В текущем виде — нельзя. Уберём расчётный раздел — закроем уши и скажем «слышал».

— Не надо метафор, — мягко, но стеклянно. — Мы фиксируем факт прохождения. Остальное — в рабочем порядке. Сроки объективны. Вы умеете закрывать вопросы. Закройте.

— Я не хороню. Мы сняли снапшот. Логика и рантайм ведут себя ровно. Сдвиг — в ветке телеметрии. Это нужно фиксировать в отчёте, а не прятать за «не предмет испытаний».

Он положил ладонь на папку — как на выключатель.

— Вы десять лет у меня на глазах, — сказал спокойно. — Я не хочу терять перспективного человека. Но этап я не потеряю. Давайте проще. Есть выбор. Либо вы подписываете отчёт как есть — и остаётесь. Последняя статья выйдет с вами первым автором. Либо вы не подписываете — и уходите по соглашению. Статья выйдет — вы в соавторах. И ещё: сейчас не время вам выходить на совет. Первый отдел не рекомендует. Нервы, контекст. Не ломайте себя.

— Конструктив — короткий расчётный раздел в теле отчёта, — сказал я. — Подписываю сразу.

Пауза стала тише маятника.

— Вы мешаете срокам, — произнёс он. — А сроки — кислород. Я предложил честный выбор. Сегодня. Без демонстраций. Мы же понимаем друг друга.

«Вы» резануло воздух. Не оскорбление — рычаг. Рычаг работает, пока ты готов быть грузом.

— Понимаем, — сказал я.

В майнинг я зашёл «на пару недель» — как обычный инженер. Тогда ещё стояли фермы на видеокартах: колхозный алюминий, райзеры, блоки питания, которые любят умирать ночью, и вентиляторы, по звуку похожие на плохие новости. Пахло пылью, флюсом и тем особым электричеством, которое липнет к рукавам. Договор простой: почини — работает; не починил — свободен. Через месяц меня знали по имени. Через три я уже собирал «чистые» стойки: питание по шинам, развязки по рядам, нормальные жгуты, маркировка без шуток. Через полгода руководил технической частью небольшого стартапа: планирование, ревью, закупки, инциденты, и то самое «завтра надо», из-за которого график похож на ЭКГ на взлёте.

Потом пришла взрослость. Залы с ASIC Antminer. Ровные ряды, рев на уровне турбины, воздух, в котором можно сушить мокрые носки за минуту. Видеокарточная романтика кончилась; началась индустрия. Здесь «ферма» — это не риг под столом, а поезда алюминия, километры кабеля и «горячие коридоры», в которые лучше не соваться без каски и самоиронии. Если раньше ты был мастером на всё — здесь ты пыль в контуре вентиляции, пока не докажешь обратное.

Мы решили, что контроллеры будем доводить до ума сами — от идеи до поддержки. Цикл получился честный:

разобраться, что болит (нестабильное питание, перегрев, мусорные прошивки, загадочный загрузчик, паника при OTA);

разобрать партии плат: снять дампы, список ревизий, карту SoC (встречались и Zynq, и Amlogic-семейства), заметить, где JTAG «не попаяли», а где залили лаком;

сделать второй путь загрузки — tiny-загрузчик в отдельном разделе с минимумом сети и гарантированным откатом;

поставить зелёный конвейер: детерминированные сборки, подписи, «канарейка» на 1 % парка, атомарные апдейты, авто-откат, телеметрия своим путём.

Завод писал «ключи прожжены, подмена невозможна». Перевод: «подмена возможна, но платно». Классический бутчейн: ROM → первичный загрузчик → U-Boot → ядро. Где-то eFUSE прожжён частично: пара слотов пустые, пара — с «нулевым» сидом. ROM требует подпись, но строгую проверку делегирует следующей ступени, у которой флаг строгости «отпущен» — для удобства обновлений на линии. В сервисном recovery — мини-ssh на dropbear с дырявой конфигурацией и «временным сидом», читаемым из раздела, который монтируется RW при первом старте.

Путь в лоб: через UART ловим старт, уводим в recovery, подменяем сид, собираем образ с «правильным» хэдэром — и плата принимает его как родной. Путь похуже, но был: на некоторой партии recovery сам открывает наружу порт при аварийном рестарте и не чистит authorized_keys. Окно маленькое, зато реальное: зашли «как техподдержка», поставили свою прошивку, где подписи настоящие, апдейты двубанковые, откат автоматический, телеметрия в отдельный канал, а служебные двери наглухо закрыты — даже для нас. Формально — «взлом». По сути — ремонт замков.

Раз в несколько дней кусок зала «уходил в монахи»: платы живы, локально доступны, но молчат наружу. Ноль ошибок, графики — как в полдень в музее. Нашли «добрый» LLDP-демон в коммутаторе: при «странностях» он переставлял порт в тихую VLAN, а «странности» рождались из-за одинаковых MAC на клонированной партии. Прошлись утилитой — выдали уникальные адреса, в свиче отключили «опеку» на нужных портах. В отчёте — две строки. В жизни — неделя охоты на тень.

После урагана часть Antminer легла «кирпичом». Так бывает, когда света не было, а блоки питания решили сыграть в «йо-йо». Наш tiny-загрузчик как раз для этого и рождался: первым встаёт минимальный образ, проверяет «здоровье» основного, и если оно «не очень» — откатывает без слёз. Да, первые сутки нас проклинали за паранойю. На вторые — звали в столовую.

Железо мы тоже «воспитывали»: сделали джиг для быстрой прошивки и функциональных тестов, навели ESD-режим (минус «мистические смерти»), завели донорские платы, переписали кривой статус-демон, раскрутили горлышки блокировок, из-за которых всё вставало по цепочке, добавили «умный вентилятор» — чтобы кремний не жарить просто так.

И тут же жизнь подкинула воспоминание.

Бокс. Самолёт «под током». Жарко, пахнет кислым железом. Первый раз меня взяли «на борт»: «смотри и не мешай». Не кормится узел: по схеме на входе — заградительный диод в защите, деталь выгорела до угля, маркировка — в пепел, аналога на складе нет. По правилам — «сегодня не полетим». Старший спокойно вскрывает блок (спокойно — это когда ни один винт не улетает в темноту), снимает мёртвый диод, ставит аккуратную перемычку вместо него и рядом навешивает плавкий предохранитель из соседней системы. «На время», — говорит. Включили — встало. Отлётали весь цикл. Потом переложили «как надо». Тогда я понял простое: инженер — не тот, кто говорит «невозможно», а тот, кто знает, где и как можно. И где именно «перемычка на время» — честнее, чем «идеальный компонент через месяц».

Между залами с Antminer я всё чаще оказывался в ЦОДах. Там масштаб другой: падает не сервер — падает сервис. Учишься думать пластами: два контура питания, два пути сети, два места, куда писать правду о жизни. Привыкаешь, что «безопасность» — это не файрвол на картинке, а воспроизводимость и минимум чудес: ключи уникальные, туннели проверяются, подписи — не «к когда-нибудь», а «сейчас и всегда», а журнал — не помойка, а орган чувств.

Постепенно стало понятно: это всё — не карьерная лестница, а конструктор рефлексов.

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

ЦОДы научили масштабированию, отказоустойчивости и кибергигиене в промышленных дозах — без позы и с автоматами (теми, что запускают процедуры, а не стреляют).

И где-то на этой тропе стало ясно, что всё сольётся не в «очередной бортовой компьютер», а в сетецентрический боевой организм: рои автономных носителей, которые думают роем, тянутся к источнику, самовосстанавливаются, пережёвывают помехи и атаки. Там «мозг» не сидит в одной башне — управление распределено, чтобы система не глохла с потерей «короля». И вот тут опыт из залов с Antminer внезапно оказался ключом: не потому что «похоже», а потому что правильные рефлексы одинаковы — детерминированные сборки, честная телеметрия, двойные контуры, атомарные изменения, мгновенный откат, наблюдаемость без «магии», а не из пресс-релиза.

Иногда ночью, закрывая очередной релиз, я ловил себя на старой привычке: положить в карман тяжёлую флешку — как правильное решение. На ней — исходники, схемы, герберы, дампы, журналы, скрипты, без которых музыка не играет. И на секунду вместо рядов асиков видел тесный борт, где мы ловили невидимую запятую времени. У этих историй один хребет: воспроизводимость и прямой взгляд. Всё остальное — декорации.

Юмор здесь держится на честности. Когда меня спрашивали: «Ну и как там, в майнинге?», я отвечал: «Как в авиации, только быстрее дымит. Но лечится тем же — дисциплиной и проводком “на время”, пока не доедет правильный диод». А когда просили «сделать красиво к утру», я говорил: «Красиво — это когда послезавтра ещё работает. Утро — это про макияж, а не про инженерию».

И всё же, пока «сво» — как система — топчется на месте, у любого упрямого инженера появляется опасная мысль: успеть защитить кандидатскую в гражданском вузе. Знания, опыт, публикации — позволяют заходить «без лишних танцев». Вписаться в аспирантуру, оформить то, что уже сделано руками и головой — в формулы, методики, результаты. Не ради бумажки, а чтобы зафиксировать метод: как строить системы, которые встают сами, не врут о себе и не ломаются от чужих чудес.

А дальше — почему нет — вернуться в ВПК уже не «в отдел», а главным конструктором проекта. Или — проектов. Туда, где «зелёный» пайп — не отчёт, а способ жить; где слова «отказоустойчивость» и «наблюдаемость» не текут мёдом с презентаций, а идут в поставку вместе с железом; где рой — не метафора, а граф вызовов. А если очень повезёт — сделать так, чтобы у будущих лётчиков в кабине работы было меньше, а молчания — больше. Пусть это молчание будет про спокойствие, а не про хронометраж последней записи.

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

В зале для совещаний было светло, холодно и очень слышно, как тикают сроки. На стене — дашборд с графиками, которые делали вид, что всё под контролем. На столе — макет нового веб-интерфейса: красиво, будто витрина кофейни. За стеклом зала гудел зал Antminer — как море, которое не интересуется нашими макапами.

CEO постучал карандашом по столу:

— Коллеги, мы тратим половину времени на UI. Он должен влюбить пользователя с первого экрана.

Я поймал взгляд и сказал то, что давно чесалось:

— UI — это макияж. Нам нужна кость: чёткий API и воспроизводимые бинарники. Если скрипт не лечит стойку, никакая кнопка «Обновить всё» не спасёт. Давайте меняем приоритеты: API-контракт → надёжный агент → обновления без суицида. UI — тонкий слой, не 50 % спринта.

Кто-то фыркнул. CEO не фыркнул.

— Формализуй. Что именно?

— Контракт на уровне системы. Версионированные REST/gRPC-эндпойнты с идемпотентностью и строгими схемами. Schema Registry для всего, что летает по проводам. Наблюдаемость по умолчанию: каждый вызов — трасса, метрика, лог с корреляцией. Безопасность по умолчанию: mTLS между агентом и контроллером, короткоживущие токены, ротация ключей, нулевой доверительный периметр. OTA как транзакция: двубанковая раскладка образов, атомарность, авто-откат. И самое важное: SDK для вендоров: драйвера как плагины. Тогда мы сможем брать не только Bitmain/Antminer.

— «Другие производители» — это кто?

— Любой, у кого есть паяльник и гордость. Начнём с тех, кто уже у нас в коробках. Например, платы на Rockchip — их встраивают как контроллеры в разные «неприкасаемые» изделия. Там часто шьют «как есть». И иногда «как есть» — это буквально.

Я включил слайд. Лаконично, без крови: снимок разобранного образа, дерево разделов, и жирная стрелка в системный раздел.

— Из живого кейса: «защищённая» прошивка на RK-плате лежит в открытом доступе, в образе — приватные ключи для сервисного доступа, прямо в системном разделе. Лозунг — «невзламываемо», практика — «заходи и логинься». Мы такое не используем, мы закрываем: выносим ключи в безопасное хранилище/TPM, меняем политику SSH, запрещаем рут без пароля, включаем проверку подписи образов, валидируем цепочку доверия. И главное — больше никаких «костылей для производства» в релизной ветке.

Маркетинг кашлянул. CEO поднял ладонь:

— Оставьте «вау» на демо. Тут речь о выживании.

— Именно. Мы не делаем ещё один красивый пульт. Мы строим операционную систему зала. А чтобы завтра выйти к другим вендорам, нам нужен агент-адаптер и общий язык для «прошив — увидел — восстановил». Тогда следующий клиент — это не новый проект, а новый драйвер.

— Сколько?

— По-честному: две итерации на API/SDK и агента, третья — UI поверх. Параллельно готовим конвертер образов и «санитайзер» прошивок (убираем ключи, проверяем подписи, жёсткие права). По итогам — поддержка трёх семейств: Antminer, Whatsminer и «Rockchip-контроллеры». Дальше — по накатанной.

— Риски?

— Те, что всегда. Люди. Дисциплина. И привычка делать «к утру». Взамен мы получаем систему, где масштабируется смысл, а не картинка.

Пять секунд тишины — вечность на совещании. CEO кивнул:

— Делаем. Перераспределяем спринт: UI — хвостом. В приоритете — API, агент, безопасность, OTA. С вендорами — начинаем переговоры. Готовьте «переезд» Rockchip на человеческие рельсы и отчёт по ключам. И ещё: «невзламываемо» в наших текстах больше не произносится. У нас — «воспроизводимо и проверяемо».

— Приятно слышать здравый цинизм, — сказал я.

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

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

Дальше пошла «грязная» работа, которую никто не любит показывать на презентациях:

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

SDK/агент: единый интерфейс для датчиков, питания, загрузки, сети. Внутри — плагины под вендоров. Внешне — одна кнопка «обновить безопасно», а не магия.

Схемы/наблюдаемость: OpenTelemetry, трассы с корреляцией до устройства, метрики — по SLO, не «что есть в библиотеке».

Безопасность: HSM/TPM, ротация ключей, mTLS, «секретов на диске» — ноль; доступ по принципу наименьших прав; аудит — всегда включён.

OTA: двубанковая жизнь, атомарные свитчи, «канарейки» на малой доле парка, автоматический откат, если хоть один чек не зелёный.

Rockchip-миграция: чистим образы, вытаскиваем ключи из системных разделов, жёстко перевыпускаем доступ, включаем проверку цепочки доверия. Сервисные «двери» — только через наш агент, по политике.

UI, освобождённый от роли «содержимого», вдруг заиграл лучше. Когда под капотом — контракт и дисциплина, даже таблица с логами выглядит как искусство.

На финальном демо CEO посмотрел на выровненные графики, на чёткие коды ошибок и сказал:

— Красиво. И страшно.

— Почему страшно?

— Потому что так и работает. И теперь у нас нет отговорки.

Спасибо за чтение

Вернуться к книге