Четвёртая машина узнала про чужую ветку секунд через десять, получила её заголовок и остановилась. Журнал остановился на одной строке, и курсор под ней мигал, как на сломанном банкомате.
— Первая машина говорит, что Миша получил пятьдесят единиц, — сказал Белоусов, показывая пальцем. — Третья говорит, что пятьдесят единиц получил Антон. Обе истории подписаны правильно, обе проверены по всем нашим правилам, и каждая половина сети считает свою историю единственной. Вот результат, Артём. Две стороны одной сети уверены в несовместимых историях одного платежа.
— А если работы поровну? — спросил я, хотя ответ уже висел на экране.
— Поровну и есть. Я остановил вторую пару в тот момент, когда ветки сравнялись по накопленной работе, иначе такого равенства пришлось бы ждать до осени. Двадцать пятого клиент в этом месте переключался не туда. Теперь он не переключается вообще, сидит и ждёт, пока одна из веток не станет сильнее другой. Это прогресс-с-с, если хотите…
Я не хотел. Я ещё помнил, как во время собеседования ответил ему на этот вопрос у себя в кабинете: при равной работе сеть держит обе ветки и ждёт следующего блока. Вот клиент и ждал, только сеть он уже не слышал.
— Ярослав, а когда придёт следующий блок?
— Придёт к одной из веток. И тогда у неё работы станет больше. Только ваш клиент к этому моменту завис на сравнении и новых блоков не принимает.
Шевелёв закрыл ноутбук.
— Нужно ещё две недели.
— Две недели у тебя были в начале июля.
— Тогда мы чинили переключение. Оно починено, Артём, он больше не прыгает на чужую ветку. А тут другое. В описании правила для равной работы нет. Мы его сами придумывали и придумали неправильно. Тут вопрос к описанию, и кодом он не закрывается…
— Антон, я плачу четверым людям за то, чтобы они придумали. Объяснения, почему не придумали, мне сегодня не нужны.
Он посмотрел на меня спокойно, и от этого стало хуже. Миша перестал грызть колпачок. Гурьев у окна отвернулся к стоянке. Я вызвал тег на четвёртую машину, хотя знал, что он мне ничего не даст: над корпусом проявилось [Системный блок: исправен], и висок отозвался коротким уколом, от которого я сощурился. Спасибо, тег. Что машина исправна, я и без него видел, а про две недели он молчал…
— Нужно ругаться на тест, Артём, — сказал Белоусов, не поднимая головы от журнала. — Антон его не писал.
— Ладно… — сказал я, сделав глубокий выдох. — Тогда так. Больше сегодня ничего не чиним.
Белоусов поднял глаза.
— В смысле?
— В прямом. Если правила для равной работы нет, бессмысленно чинить код, который должен это правило выполнять. Сначала решите, что именно должна делать сеть. Не «как сейчас получается», а как она должна работать по нашему протоколу.
Антон Шевелёв открыл ноутбук обратно.
— Это надо обсудить, — сказал он.
— Обсуждайте. Вчетвером. И запишите.
— Запишем.
— Не в виде «если вот это, то, наверное, делаем вот так». Мне нужен нормальный кусок спецификации. Что происходит при равной работе, что происходит после следующего блока, что делает узел, который увидел две одинаково сильные ветки, что происходит после восстановления связи. Все варианты, которые мы можем получить, должны быть перечислены. Чтобы через месяц никто не сидел и не говорил, что он понял правило иначе.
Белоусов кивнул.
— Это день-два.
— Вот и потратьте, Ярик, день-два на это. А потом напишите тесты под каждый случай.
Гурьев наконец отвернулся от окна.
— Тесты мы напишем, — уверенно заявил он.
— Вы напишете то, что касается безопасности и самого протокола. А гонять их вручную будете только в том случае, если очень соскучились по бессмысленной работе.
Миша перестал вертеть колпачок в пальцах.
— Ну, а… стенд?
— Стенд тоже нужен. Но его не должны собирать вы.
Я выдержал короткую паузу.
— Я дам кадровикам задачу найти пару временных программистов. Ммм… Не архитекторов и не криптографов. Нормальных ребят, которые умеют поднимать машины, настраивать сеть, запускать сборки, гонять тестовые сценарии и разбирать журналы. Сдельно, на время работ. Нам не нужны четыре дорогих специалиста, которые будут по очереди перезагружать компьютеры и вылавливать глазами строки в журнале.
— На сколько? — спросил Шевелёв.
— Я думаю, пока на месяц. Если окажется, что работы больше, продлим.
Я посмотрел на Белоусова.
— Схему тестирования дадите им вы. Они не решают, как работает протокол. Они делают ровно то, что вы им скажете, и возвращают вам результат. Ошибка, время, номер машины, какая ветка, какой блок, какой журнал. Всё.
— Это разумно, — сказал Белоусов.
— И ещё. Никаких изменений в основной код, пока не будет утверждено правило.
Он чуть нахмурился.
— Даже если я вижу, как это исправить?
— Особенно если видишь. Сначала договоритесь, что исправлять. Потом исправляйте.
На несколько секунд стало тихо вокруг.
Я посмотрел на четыре машины, на кабели под столами, на лист с датами на стене. Мы полгода строили систему, которая должна была работать без человека, принимающего решение в каждом отдельном случае. А сейчас сами оказались в положении такого человека: сеть столкнулась с ситуацией, которой разработчики заранее не описали, и каждый мог придумать собственный ответ.
— И ещё одно, — сказал я. — Когда кадровики найдут людей, их сначала покажут вам, я дам соответствующее указание. Мне не нужны случайные прыщавые мальчики, которые вчера перестали мамкину титьку сосать и научились Windows устанавливать без регистрации и СМС. Нужны те, кто понимает, что такое сеть, умеет работать с Linux и не путает журнал программы с текстовым файлом, который можно закрыть крестиком.
Миша усмехнулся.
— Таких подобрать можно.
— Вот и подберите.
Я посмотрел на Белоусова.
— Так что вы четверо занимайтесь тем, ради чего я вас сюда посадил. Не стендами. Не кабелями. Не просмотром двух тысяч строк журнала. Придумайте правило.
Белоусов посмотрел на экран четвёртой машины, потом снова на меня.
— Хорошо.
— И Ярослав.
— Да?
— Завтра я хочу увидеть не исправленный клиент.
Он вопросительно поднял глаза.
— Я хочу увидеть документ, в котором написано, что этот клиент должен делать, когда две ветки имеют одинаковую накопленную работу.
Белоусов помолчал секунду.
— Это будет.
— Работайте, господа! — сказал я и кивнул.
К самому концу июля я решил показать техническое описание проекта человеку со стороны.
Но не потому, что этого от нас кто-то требовал. Никакого обязательного внешнего рецензирования для нового IT-продукта не существовало. Мне просто не нравилась мысль, что мы, шестеро центральных создателей Dorcoin (не считая внештатников), первой во Вселенной децентрализованной криптовалюты с собственной блокчейн-сетью и протоколом консенсуса, полгода смотрим на одну и ту же архитектуру и в какой-то момент перестанем замечать очевидное. Когда все в группе знают, каким должен быть результат, они начинают автоматически достраивать пропущенное за автора.
Поэтому наружу я отдал только то, что требовалось для независимого разбора. Наталья Борисовна подготовила договор и соглашение о конфиденциальности. Рудько получил техническое описание протокола, форматы блоков и транзакций, правила выбора цепочки, описание тестового стенда и несколько обезличенных журналов последних испытаний. Исходников не было. Доступа к машинам, ключам, рабочим адресам и внутренней инфраструктуре тоже. Человеку со стороны нужно было понять, как должна работать система, а не получить возможность собрать её целиком.
Рудько нашёл Белоусов через старые связи в научных кругах. Станислав Рудько, кандидат технических наук, специалист по вычислительным сетям и протоколам, десять лет занимавшийся системами связи для телефонных операторов. У него был CCIE Cisco — редкая для России того времени профессиональная сертификация, которую просто так себе в резюме не получишь. Белоусов говорил, что Рудько любит не красивые архитектурные схемы, а вопрос «а что будет, если всё пойдёт не так?».