Это первая глава книги «Записки ездового кота» — историй из двух десятков лет программирования на C++ в самых разных областях. Книгу целиком можно скачать в PDF или EPUB.
Моим детям, Катюше, Матвею и Рите, надеюсь что показал вам правильную дорогу…
Проблемы, как это часто бывает в нашем нелегком деле опытной эксплуатации, начались тихо и невзрачно, почти незаметно, словно первые трещины по льду весной, когда кажется, что поверхность еще крепкая, но где-то глубоко внутри уже идут необратимые процессы слома и таяния. На серьезном объекте сначала вышел из строя один датчик движения, но ему и так через полгода надо было под замену, и мы списали это на случайность, на естественный износ или скачок по питанию, мало ли что могло случиться. Но потом через несколько дней полетел другой датчик, у заводских на этот случай всегда есть указания, и начальник охраны позвонил нашему директору с легким недоумением в голосе, — «чего мол вдруг? техника у вас вроде надежная была, а тут один за другим».
А потом за следующую неделю сгорело сразу три датчика в разных точках контура и стало понятно, что это уже не случайность, не совпадение, а прямо таки «пожарный случай» и надо лететь туда на всех парах и чинить. Наша небольшая фирма в те годы, в начале нулевых, занималась довольно специфическим делом — системами контроля доступа на режимных объектах. И мы не были ни особо крупными, ни особенно богатыми, но подобных фирм крутилось в этой области не так чтобы очень много, и заказов понятное дело всем не хватало, поэтому репутацией дорожили, ибо репутация это будущие контракты. А контракт с судостроительным заводом в городе С. был для нас настоящим прорывом, достаточно жирным куском, который мы буквально выцарапали у более крупного игрока, и этот контракт давал нам не только стабильно жить следующие пару лет, но и возможность работать с серьезными людьми на серьезных объектах.
Директор в те дни, когда посыпались отказы датчиков, ходил по коридору нашего офиса быстро, перемещаясь от «физиков» к «монтажникам». Иногда попадало и разработчикам, которых тоже отправляли «в поле», потому что все команды уже и так были на объектах и выдергивать их значит латать дырявое одеяло одной заплаткой. Директор обещал разобраться, говорил, что это временный сбой и что мы уже выезжаем на место, и там все будет исправлено в кратчайшие сроки, но даже через закрытую дверь его кабинета было слышно, как в его голосе появляются нотки, которых раньше не было.
Репутация важнее денег — это он повторял нам постоянно, на каждом собрании, при каждом удобном случае, как мантру, как заклинание, и в этих словах была правда, потому что в нашем бизнесе, где все построено на репутации, на уверенности заказчика в том, что твоя система не подведет в критический момент, один провал может перечеркнуть годы успешной работы. Я тогда был обычным «инженегром», сидел в своем углу офиса за компьютером и тыкал кнопки, т.е. писал серверную часть системы, возился с протоколами обмена данными, настраивал обработку сигналов от датчиков и объемников, которые реагировали на изменение инфракрасного излучения, то есть, грубо говоря, на тепло человеческого тела. Системы наши были не самые изящные с точки зрения архитектуры, местами даже староватые и громоздкие, иногда это делалось наспех, в условиях нехватки времени и ресурсов, но зато они были надежными, проверенными, работали по простой и понятной схеме: датчик – событие, сигнал – контроллер – сервер. Сервер записывает в журнал и принимает решение, все логируется, все под контролем, без всяких магических черных ящиков.
Так должно было быть, так было задумано, и так было реализовано, но реальность порою вносит свои коррективы, и стало совсем не так. Сгоревшие датчики, эти небольшие пластиковые коробочки с электронной начинкой внутри, сыпались странно, необъяснимо странно: чаще всего выходили из строя именно объемники, те самые, что реагируют на присутствие человека в зоне контроля, реже контактные, которые очень простые по своей сути и, казалось бы, не должны ломаться вообще, но что может сломать в четырех проводах и батарейке? На совещании перед командировкой наш «физик», парень лет тридцати но уже с бородой как у батюшки, который отвечал за всю физическую часть системы, за монтаж, за проводку, за питание, высказался за скачки напряжения в заводской сети, мол, может быть, там какое-то мощное оборудование включается-выключается и дает всплеск, который умудрился проскочить контур бесперебойников и убить чувствительную электронику. Кто-то буркнул про брак партии, мол, видимо, купили «левак» не у того поставщика, сэкономили где не надо, теперь расхлебываем. Слово на букву С никто не произносил, но оно тоже витало в воздухе, потому что рядом ставили второй контур охранки конкуренты, и хотя это казалось параноидальным, в условиях работы с режимным объектом, такую версию нельзя было просто отбрасывать.
Через две недели этого растущего кризиса, когда количество отказов перевалило за дюжину и начальник службы безопасности завода уже открытым текстом говорил о расторжении контракта и привлечении других подрядчиков, директор вызвал меня и моего коллегу, назовем его Максом, такого же разработчика, только постарше и поопытнее, в свой кабинет и сказал коротко, без обиняков, глядя прямо в глаза: «Разбирайтесь на месте сколько потребуется. Езжайте туда, смотрите своими глазами, что происходит, проверьте систему от и до, но найдите причину. Или будем разбираться уже без контракта, без репутации и, возможно, без работы, потому что никто не захочет иметь дело с конторой, которая провалила там работы».
Дорога на севера — это всегда какой-то особенный переход, почти мистический, из одной реальности в другую, из суеты больших городов в тишину и простор, который одновременно и успокаивает, и тревожит своей бесконечностью. Чем дальше поезд уходил от Питера и больше километров оставалось позади, тем меньше становилось этой бесконечной городской суеты, постоянного напряжения северной столицы, и больше становилось неба, огромного, высокого неба, которое казалось все более синим, все более холодным по мере движения на север. Поезд шел медленно, покачиваясь на стыках рельсов, за окном густели леса, сначала смешанные, потом все более хвойные, темные, с высокими прямыми соснами и елями, между которыми виднелись заснеженные поляны и замерзшие ручьи. Потом, где-то после Вологды, пошел снег, хотя на календаре был март, и в Питере уже вовсю таял серый городской снег, а здесь шла полноценная зима, настоящая, северная зима, которая не собиралась уступать место весне. Макс сидел напротив, смотрел в окно и курил в тамбуре, возвращаясь с запахом табака и морозного воздуха, а я листал распечатки логов, пытаясь найти хоть какую-то закономерность в отказах, намек на то, что могло их вызывать.
Вечером, когда за окном стемнело и поезд шел уже сквозь полную темноту, изредка прорезаемую огнями маленьких станций, мы пили чай из стаканов в подстаканниках и обсуждали версии. Вариант с электросетью был самым простым – на заводе, наверное, какая-то старая советская проводка, в которой могут быть наводки от мощного оборудования, от сварочных аппаратов или подключенных больших нагрузок, что нужно просто поставить более качественные фильтры и проблема решится. Я не был так уверен и проблема с проводкой проявилась бы сразу, но альтернативных идей у меня не было, поэтому кивал и соглашался, хотя внутри чувствовал, что все не так просто.
Город С. встретил нас морозом, не жестоким – но таким цепким, что пробирал через любую одежду, и белым снегом, что заставлял щуриться при солнце за облаками, таким чистым и нетронутым, что все вокруг казалось ярче, чем на самом деле. Город показался мне странным, не совсем обычным — стоял на самом краю воды, рядом было Белое море, которое зимой замерзает, превращаясь в белую пустыню, где можно ходить пешком, а вокруг росли сосны, высокие и прямые, были небольшие озера, скрытые под толстым льдом. Снег лежал везде – как он должен лежать на севере — глубоко, серьезно, без намека на скорую оттепель. Здания в городе были в основном пятиэтажками, типовыми советскими коробочками, серыми и одинаковыми, но когда идёшь между ними, возникает ощущение, что их когда-то делали надолго, — не питерские коробочки-хрущи, с которых сыпется цементная крошка. Время всё равно добавило им своих оттенков — где-то потемневший фасад, где-то скрипучий балкон, и вдруг среди этих одинаковых домов попадается деревянный, с резными наличниками, чуть покосившийся, как будто он здесь старожил, он ведь и правда старожил. Сам город, если говорить честно, не старый, он появился уже в советскую эпоху, вырос не постепенно, как северные поселения, которые веками тянулись вдоль рек и морских берегов, а почти разом, по плану, по чертежу, по необходимости, но при этом земля вокруг него хранит куда более старую память Николо-Корельского монастыря, и когда думаешь о том, что монастырь видел поморов, штормы, долгие зимы и корабли, уходившие в холодные воды, начинаешь понимать, что место здесь гораздо старше самого города.
Но сам город родился не из торговли и медленного разрастания улиц, а из задачи, ТЗ, которое решали в сжатые сроки, когда в тридцатые сюда пришли люди, которые умели строить корабли и заводы, и на берегу холодного Белого моря, начали поднимать верфи, цеха, стапели, а рядом дома для рабочих. Сначала город назывался по-другому, и не было и в том названии ни намёка на романтику, только формулировка ради чего он существует. И среди всего этого стоял завод, огромный, раскинувшийся на несколько километров вдоль берега, с высокими корпусами, с трубами, с прожекторами, которые освещали территорию по ночам так, что было светло как днем. С пропусками и проверкой документов без суеты, но очень внимательно. И люди здесь не суетились, не торопились, но было видно, что отвечают за свой участок работы, все понимают важность того, что происходит за этими заборами, за этими бетонными стенами с колючей проволокой наверху. Охранник на проходной, мужчина за пятьдесят с усталыми глазами, долго сверял наши фотографии с лицами, потом позвонил нашему куратору из СБ.
Завод пах маслом, металлической стружкой и чем-то еще, едва уловимым, каким-то особенным запахом большого производства, который невозможно описать словами, но который сразу узнаешь, если хоть раз его почувствовал. Начальник СБ, встретил нас в своем кабинете на третьем этаже административного корпуса и оказался именно таким, каким я его себе представлял по голосу в телефонных разговорах — седой, сухой, с беломориной в зубах, отставной военный под шестьдесят, с прямой спиной и голосом без всяких интонаций – «У нас система работала, — сказал он, не предлагая садиться, глядя на нас сверху вниз, хотя мы были примерно одного роста. — Потом перестала работать. Вы ее ставили — вы и лечите. У вас неделя».
Жили мы в заводской гостинице, небольшом трехэтажном здании рядом с территорией завода, где останавливались командированные специалисты, инженеры, военприемка и все, кто каким-то боком относился к заводу. Номера были очень советскими, судя по оставшимся ценниками и наклейкам на мебели, почти аскетичными — кровать, стол, шкаф и удобства в конце коридора. Кормили там плотно, по-северному, без изысков, но сытно и с придумкой: свежая рыба, которую, наверное, ловили тут же, в Белом море, мясо с тушеной капустой и изюмом, черный хлеб, какой в Питере уже не пекли, тяжелый такой с хрустящей корочкой. Столовая работала по расписанию, и явиться на завтрак надо было до восьми утра, что для людей привыкших появляться в офисе ближе к полудню выглядело небольшой, но пыткой.
Вечером, когда возвращаешься в гостиницу, понимаешь, что вокруг очень тихо, и можно слышать скрип снега под ногами, такой характерный, густой звук, который бывает только на сильном морозе, когда снег сухой и плотный — такой тишины нет в больших городах и даже уехав в пригород, все равно будешь слышать как он шумит. Над заводом в темном небе горели прожектора, конуся кружащиеся снежинки, и эта картина была одновременно красивой и осязаемо холодной, забираясь зашиворот и гоня в номера.
Система, которую мы установили на заводе год назад, была очень простой по архитектуре, без наворотов, покрывая определенную территорию с множествов точек доступа в режимные зоны. Среди большого числа разного рода датчиков, особо капризными были просветные, которые работали по принципу есть передатчик, есть приемник, если луч между ними пересекается, срабатывает тревога. Ставить их не любили, из-за их жестких требований по питанию и частому обслуживанию, но, как говорится, любой каприз, лишь бы клиент платил. Объемные датчики, несмотря на свою сложность, имея на борту почти что мини-ПК для предварительной обработки приходящих данных, мужественно выдерживали местный климат и почти не сбоили. Объемник «видит» инфракрасное излучение в зоне контроля и реагирует на изменение тепловой картины, то есть на появление человека с его температурой тела, которая всегда выше окружающего фона, чем бы не намазался и какую-бы одежду не надел. Все эти датчики были заведены в контроллеры, небольшие металлические ящики, которые немного обрабатывали приходящие данные, убирая всякую мелочь и передавали их дальше по сети на сервер, где все эти события записывались в логи с точностью до миллисекунд, с указанием места, времени и типа события.
Проверку начали методично обходя каждый датчик и сбрасывая его «в ноль», как будто выстраивая всю систему заново, обычная практика пусконаладки, если не понятны причины. Проверили логи блоков питания, где не было серьезных всплесков или провалов за последние пару недель, да и сами источники бесперебойного питания тоже были в полном порядке, новенькие батареи были рассчитаны на стандартные три года работы до замены. Макс от безысходности даже съездил на заводскую подстанцию с парой «пузатых армянского», чтобы поговорить с энергетиками завода, двумя седыми армянами, которые работали там еще с советских времен и знали, наверное, каждый трансформатор и каждый кабель в этой сети, но и там ему сказали, что все работает стабильно, без сбоев и никаких проблем не было и не будет.
Та неделя прошла на удивление тихо, без единого отказа, без единого сгоревшего датчика, и я уже начал нервно посмеиваться над всей этой ситуацией, думая на соседей, строивших второй контур, которые подуспокоились и решили вести себя хорошо. Перезапустив систему, каждый день мы обходили проблемные зоны, заодно проводя текущую подстройку, раз уже выбрались на внеплановое обслуживания, проверяли работу датчиков, смотрели на графики сработки от местных усатых и полосатых нарушителей, которым не составляло труда пробраться к паре кусочков сала, оставленных неосторожным охранником на пороге, минуя супер-чувствительные датчики. Я собирался было звонить директору и просить прислать кого-то с других объектов, потому что причину мы так и не нашли и система стабилизировалась сама собой, что было похоже на действительно плохую партию датчиков, которые выходили из строя друг за другом. Понимания истинной причины проблемы не было, когда в понедельник, буквально за несколько часов возвращения в гостиницу, один из датчиков лег прямо при нас, прямо в тот момент, когда мы проходили мимо него. Хуже было то, что это был тот самый датчик, который мы меняли в первый день после приезда, совсем новый, только что из коробки и из другой партии, которая месяцами работала на других объектах без сбоев, и вот он уже мертв, всего через неделю после установки. Макс посмотрел на меня, и в его глазах я увидел то же самое чувство, которое было у меня в тот момент — удивление, раздражение и какого-то почти суеверного страха перед необъяснимым.
Пришлось опять лезть в журналы событий с остервенением людей, которые наконец-то увидели зацепку, выгрузили все события за последние два месяца, время выхода из строя каждого датчика, и сопоставили их с логами системы, где записывались прохождения сотрудников через каждую дверь с электронным замком. Чисто механически я сел писать скрипт, который накладывал проходы через двери на места поломок датчиков, пришлось немного пошаманить и обработать таблицы «перекуров» – проходов через боковую дверь, которые обычно никто всерьёз не анализировал, вытащить и эти данные тоже, не ожидая найти там что-то важное, чтобы увидеть корреляцию проходов и поломок. А потом, пролистывая эти отчеты на экране оператора увидел совпадение, совпадение было такое четкое и такое явное, что первая мысль была про ошибку в скриптах, что-то не то посчиталось, и пришлось перепроверять уже руками через бумажные таблицы учета входа-выхода с подписями. Сейчас это может звучать странно, но это было в середине нулевых и бумажная бюрократия очень неохотно сдавала свои позиции высоким глючным технологиям.
Один и тот же электронный пропуск отметился рядом с большинством датчиков незадолго до их выхода из строя, одно и то же лицо, один и тот же человек появлялся в зоне действия датчиков, а через какое-то время, от нескольких часов до двух суток, датчики умирали. Не все, не каждый раз, но в семи случаях из десяти корреляция была настолько очевидной и статистически значимой, что её нельзя объяснить простым совпадением. Вечером мы с Максом обсуждали результаты, и сначала он посмотрел скептически, несколько раз помянув страшное слово на букву С, а потом сел перепроверять мои расчеты.
Невыспавшийся Макс был хмур как осеннее питерское небо, – «Надо посмотреть, кто это» – была первая фраза утром и мы пошли к начальнику СБ с нашей распечаткой, картой проходов и поломок, а тот все-так же без эмоций отправил нас на кладбище подлодок: «Капраз С., он тут временно, контролирует процесс списания».
← Все записки