скачать книгу бесплатно
– Кому ты успел об этом растрепать? – перебил я его.
– Артур, я не трепло, ты же знаешь, я могила, – заговорщически продолжил он, но, конечно, никакая он был не могила, и от этого холодело в копчике.
– Федорыч, заглохни и отвечай на вопрос: кому ты успел об этом рассказать? Говорил же кому-то, по глазам вижу! По чьему поручению ты ездил?
– Артемона… Ну, доложился ему, но он не выслушал толком, пинком под зад отправил к тебе, и всего делов. Я чуть не обделался со страху, а он даже не выслушал…
Деев – это хорошо. Но наверняка Гарри разболтал и кому-то по дороге… Я стал на него давить, называть имена тех, кто мог ему встретиться, однако Гарри упорствовал, что он могила, и никому, окромя единственно Деева и меня, он не поведал ни полслова.
– А что еще вылетело? Куски бетона, камни, песок, пыль – были? Куда оно все делось?
– Песок был, да, бетонный… Вылетел столбом и осел, крыло мне засыпал… Камни – были, ясен пень, Борисыч! Крыло мне, по-твоему, чем пробило, ежели не камнем?
– Федорыч, прошу тебя очень, не думай сейчас головой, просто отвечай и все! Думать буду я. Были куски бетона? Валяются они там, на парковке?
– А… да нет, там все чисто. Только крыло сверху слегонца присыпало, да и все. Мужики подумали, что у меня рванул компрессор.
– Какие еще мужики, Гарри?! Сколько народу было на парковке?
– Да никого не было, Артур, это я так… Проходило пара пацанов твоих, очкарики, тоже обосрались от страха, но они ничего не видели, я отвечаю, – Гарри подался вперед так, что чуть не лег на стол, так ему хотелось быть замешанным в какую-то тайну. – Они потом проходили мимо, когда я возился с крылом… Один и сказал, мол, компрессор рванул, типа умный, едрить его… И стоит, зырит, как я там корячусь. Ну, я ему высказал. Не сильно, не боись. Так, погрозил монтировкой, он и смылся.
Я кусал губы и судорожно прикидывал, как сейчас все разрулить. Что никого не убило – это хорошо. Что будет внутреннее расследование, это понятно и наплевать. Выяснить, что именно вылетело – вот ключевая задача. Потому что эксперимент не закончен, пока не известен его результат.
Сегодня Гарри предстояло докупить всякого для презентации: софиты, переносной кондиционер, генератор.
– Плевать на это барахло, завтра съездишь! Сейчас вот что: вспоминай, куда улетела эта штука! Был же от нее след? В небе был след?
– А как же, Борисыч! Как от самолета, белый такой… Ха-ха, компрессор рванул, вот балабол, умора… Компрессор – это ж не ракета! Он – хлоп, и все.
– Федорыч, замолкни, никакой ракеты не было. Ты помнишь, куда вели следы? Направление хотя бы…
– На север, в сторону промзоны ушла. Кажись, даже примерно знаю, куда она упала.
Я загорелся и наказал Гарри немедленно лететь туда и найти эту штуку. Что искать – описал как смог, хотя в действительности даже не был уверен в том, что вылетел целый предмет, а не молекулярный песок.
Гарри клялся, что будет держать рот на замке, и благодарно таращился на меня – вся история увлекала его как никогда, он, казалось, и ночью в дождь полетел бы за этой хреновиной и искал бы ее до рассвета.
– Борисыч, ну ты потом растолкуешь, что у вас за эксперименты, а? – канючил он. – Я Артемона спрашивал, он рявкнул, как на шавку, и отправил к тебе…
– Растолкую, Гарри. Потом. Сейчас я могила и ты могила. Давай, дуй туда и обратно, быстро!
Он вскочил, на ходу от радости крикнул «Есть!» и скрылся за дверью.
*
В комнате было жарко и душно от открытого окна. Кисло-горький запах пластмассы практически выветрился, если сравнивать с тем, как тут воняло час назад. Хотя, что говорить, контраст с благоухающим коридором оставался разительным.
Один из пылесосов, видимо, чересчур долго путался в расставленных конечностях искривителя и сошел с дистанции; стоял он, упершись в стену, и мигал красным индикатором в форме батарейки. Искривитель был вымыт до блеска. Чистыми были и другие поверхности: подоконник, стол, стулья, нижние полки стеллажей. А вот пол робот вытер весьма избирательными загогулинами, присущими его туповатому алгоритму.
Второй робот, начавший с потолка, справился немногим лучше. Самую черноту с плит он смыл, они были мокрыми и приобрели серый грязноватый оттенок. Планировал он помыть пол рядом с моим рабочим местом и даже растопырил свои мелкодисперсные щетки, но тут закончилось моющее средство, так что он тоже остановился посередь и мигал лампочкой.
Если не считать того, что под ногами противно скрипел песок от огнетушителя, а в одном месте было пролито моющее средство (на нем я неаккуратно поскользнулся подвернутой ногой) – результат вполне устраивал. Прихрамывая, я по-быстрому отвез роботов обратно (встретил двух фундаментальщиков на травелаторе, которые молча проводили меня коровьими глазами), включил в комнате кондиционер и закрыл окно. Пришлось подпереть створку огнетушителем, потому что ручка на окне была сломана с его же помощью.
Обливаясь потом, я, наконец, водворился за столом и первым делом позвонил алгоритмистам. Платон ответил, что с новым драйвером дела складываются, но на одном аккумуляторе много не протестируешь. А почему он не возьмет у Деева второй aCC-10? А потому что от голого аккумулятора толку с гулькин хрен, к нему надобно отдельный контроллер докупить, для чего уже зафрахтован Гарри… Некстати я отправил Федорыча на поиски улетевшей фиговины… Далее Платон затеял рассказ в своей искрометной манере, представляю ли я, какие у Корлейна, оказывается, криволапые инженеры? Там они не предусмотрели, парнокопытные, здесь им нужна отдельная железка… Слушать его анекдоты было некогда, и я распрощался.
Засим я зачем-то набрал Деева. То был не вполне осознанный, эмоциональный поступок. Позднее я понял, что хотел лишь разделить с ним страдания по дыре, но в тот раз выложить всё не решился. Позвонил я некстати, оторвал его от воспитания подчиненных. Он орал, что «в следующий раз уволит обеих», «задолбали своим инфантильным поведением» и долго не отвечал на мои приветствия. В конце концов, гаркнул, чего мне надобно, и я, растерявшись, пересказал ему разговор с Платоном.
Он честно не мог взять в толк, зачем я звоню ему по столь пустяковому поводу. Для солидности я затронул вопрос финансирования: можем ли мы закупить дополнительно полсотни контроллеров про запас?
– Пятьдесят штук? Нафига так много? Бюджет же!
– А что бюджет, Тем? – настаивал я просто так. – Давно вылезли за него, плюс-минус уже роли не играет. Все равно их покупать, ребята ведь переписывают драйвера, разводку меняют на плате…
– Ладно, черт с вами… – сказал он, чтобы отделаться. – У вас, куда ни глянь, везде жопа.
– Окей… Про Гарри потом поговорим, – добавил я мимоходом главный зондирующий вопрос.
– Что про Гарри? – удивился он. – А… ну, приходил он. Так я к тебе его отправил… Чего ему?
– Да так… ничего серьезного. Потом с тобой поговорим. Не распространяйся, что он приходил, хорошо?
– Тур, пожалуйста!.. – немедленно забеспокоился он. – Что там еще стряслось? Дженнифер в курсе?
– Артем, не ной, я все разрулю сам, – оборвал я. – От тебя требуется только молчать. Ты в состоянии молчать?
– Да, – простонал он. – Но почему Дженнифер не в курсе? Что бы там ни было, поручи это ей, ты меня пугаешь…
– Позже сообщу ей. Я ей пока не доверяю, так и знай.
Он проблеял что-то негодующее и отключился. Видите ли, какой бедненький, тяжело ему, когда все вокруг приносят плохие новости. Зато себе я принес хорошую весть: ни о какой аварии Деев не знает. И, значит, о ней не знает никто, кроме Гарри.
*
Наконец, я отбросил планшет, протер рукавом лоб, а заодно и экран терминала, на котором оставался налет седины от огнетушителя, и приступил к тягостным думам. Думы были тягостными по простой причине: проблема, приведшая к аварии – инженерная. А значит, сколько ни отлаживай свою программу, результат не улучшится. Это еще в первый раз стало ясно, когда отладчик ошибок не выдавал, а на «боевом» запуске случился песок.
А на инженерный уровень мне лезть толку мало. Я про него ничего не знаю, отлаживать не умею, да и исправить не смогу. Ну, обнаружу примерные условия ошибки, а дальше Новшек и команда неделю будут ее локализовывать и две недели перепаивать микросхему…
Оставалась призрачная надежда, что обнаружу какую-нибудь сущую глупость наподобие той, из-за которой утром образовался песок. И снова напишу макрос. Но тут должно сойтись многое: я, не смыслящий ни бельмеса в физическом устройстве наших микросхем, должен ошибку отыскать; она должна оказаться обходимой, а путь обхода – простым, чтобы до завтра я успел его воплотить.
Я взглянул на дыру и приуныл. Пространство искривилось по эллипсоиду… Это тебе не лишний inc. Дэвидсон отлавливал подобные ошибки сто лет назад на первой серии наших аппаратов, и тогда же они были искоренены с помощью аппаратных проверок… Но вот, искривление пошло по гребаному эллипсоиду, и ни одна аппаратная проверка не сработала! Электронику не взволновали ни километровые расстояния, ни адский расход энергии. Тут действительно было нечто очень глубокое.
Моя программа использует все, на что способен Porta. Разумеется, жемчужина его таланта – изменение строения атомов и молекул, ASA и MSA, дай бог Дэвидсон нам их не «зарежет». Есть функции анализа вещества, вплоть до субатомного уровня. Об этих функциях даже Опалян в курсе, и они давно оттестированы. Еще есть всякие деформации объекта по сетке, которые и в Stanley работали прекрасно. А я объединяю всю эту красоту в одной программе. И она выжимает из аппарата соки похлеще конвейерной работы.
Минут пятнадцать я тупо сидел перед терминалом, прокручивал туда-сюда свой код и перебирал потенциально проблемные функции. Создание сетки объекта? Фотосканирование границ? Все это оттестировано… ASA? У Дэвидсона на ней перегревается аккумулятор… и что? Объекты-то у него перестраиваются верно…
Не то.
Встал, прошелся по комнате.
В дыре гудели налетающие порывы ветра. Чтобы оттуда ничего не насыпалось, я нахлобучил на искривитель колбу. Искривитель был чист, как отполированный велосипед, и видом своим изображал полную готовность к дальнейшим подвигам.
За окном стояла неподвижная картина жаркого дня. Подавленный солнцем, замерший мир. Неподвижны были окна соседнего здания. Лишь на одном из них, лениво поддаваясь ветру, колыхалась какая-то привязанная ленточка. Внизу на ступеньках черного хода сидел неподвижный турок в узорчатой униформе, отлучившийся из ресторана покурить. Лениво растворялся в воздухе дымок его сигареты.
Инженерная проблема… Давай-ка не будем пугать себя этим словосочетанием. Пока есть надежда на то, что ошибка найдется и окажется легкой, нельзя бросать ее поиски.
Давай-ка соберемся. Как решают задачи, способ решения которых тебе не известен?.. Почему-то вспомнилось, как мы в Gateway собеседуем новых инженеров и программистов. Вернее, мы-то с Платоном или Новшеком собеседуем их по-человечески. А вот попадись они Дэвидсону или Опаляну, который порой захаживает на интервью – как пить дать, получат бессмысленную задачку на логику. Посчитать, сколько теннисных мячиков вмещает межгалактический SP-Z… Один кандидат не знал, как выглядит SP-Z, и Рустем немедленно его выпроводил.
Был бы я кандидатом, задали бы мне вопрос: почему пространство искривляется сосиской? Устройство аппарата мне не известно. Как бы стал решать?.. Ну, тестировал бы каждую элементарную операцию, месяц бы провозился… Ладно, пускай мне известно, что в типичных условиях каждая элементарная операция уже оттестирована Дэвидсоном. Сэкономим время и рассмотрим только нетипичные условия. Да ведь и их много, нетипичных…
На узенький край окна соседнего здания сел воробей, повертел головой, и спрыгнул.
Краевые ситуации… Откуда я это вспомнил? Краевые задачи… Диффуры тут ни при чем. А вот краевые ситуации рассмотреть стоит. Что-то работает, доходит до края, и – что происходит потом?
Я вернулся к своему коду и стал с новой точки зрения его рассматривать. За четверть часа выписал на бумажку штук пятьдесят операций, где что-то «ходит по краю». Потенциальная нехватка памяти или превышение разрядности регистра… Из этого списка выбрал шорт-лист наименее элементарных ситуаций, чтобы проверить и отсечь их в первую очередь.
Стенка шкафа, который давеча одарил меня старомодным пиджаком Деева, была запорошена белой пылью, и я стал пальцем рисовать на ней «кирпичики»: регистры – друг за другом в ряд, в сторонке – стек, сегменты памяти. Зарисовывал каждую краевую ситуацию стрелочками: что откуда берется и куда пишется. Стенка быстро пришла в негодность, однако я добрался до операции с составным регистром и вдруг задумался: а как физически он устроен?
Не поленился, отыскал на портале инженерную спецификацию процессора, перерисовал с нее кирпичики регистров – поставил их в правильном порядке. Из шестнадцати регистров две пары идут друг за другом и образуют два составных регистра – это os:op и qs:qp. И туда, и туда обычно кладутся пойнтеры – координаты объектов, с которыми в данный момент происходит работа. В первом из этих составных регистров у меня объект-образец, в другом – результирующий объект. С ним я делаю MSA, и поэтому их, объектов-молекул, в реальности очень много. И координаты их всех проходят поочередно через qs:qp. А что происходит, если составной регистр переполняется? Поднимается флаг переполнения, как обычно. На такой случай предусмотрено особое сообщение, но оно не появляется. Лог сообщений пуст. Значит, qs:qp не переполняется.
Стоп! Но ведь у меня объектов – на много порядков больше штук, чем способен вместить этот регистр! Как он может не переполняться?.. В памяти всплыл афоризм времен молодого Опаляна, когда-то висевший на двери Дэвидсона: «Излишнее доверие к рукотворному затмевает разум». Дорогой мой.
Идея довольно безумная: переполнение регистра – хрестоматийная штука, которую отлавливают на первых же инженерных тестах. Потом я вспомнил: регистры qs и qp добавились позже. Наши ребята сами добавили их в процессор для серии Multus – это третье поколение. В первом поколении – Warper – стоял серийный процессор от SP Laboratories, и были лишь стандартные регистры. Начиная с Multus и до текущего поколения – шестого по счету – мы заказываем процессоры с особой архитектурой под наши нужды.
Бросив художества, я сворганил маленькую программку – тест на переполнение составного регистра qs:qp. Программа запустилась и завершилась без ошибок.
Я похолодел. Куда же девается лишняя старшая единичка при переполнении? Куда-то ведь она девается! Глянул на шкаф – перед qs и qp у меня был намалеван «кирпичик» es – сегментный регистр, который на практике используется редко. Согласно спецификации, регистры qs и qp физически пристегнуты именно к es. Я еще раз запустил тестовую программку и посмотрел, что на выходе получается в es. И увидел там свою единичку…
Ватными пальцами я набрал Ави Новшека. Может ли переполняться составной регистр qs:qp и гадить куда-то? Быть не может совсем никак, ответил Ави. Может ли он гадить в es хоть теоретически? Не может в принципе, исключено. А он, говорю, гадит, Ави. И флаг переполнения не поднимается.
Почему, думаю, за долгие годы этого не увидел Дэвидсон? Он мог и не знать того факта, что регистры физически связаны, поскольку в цивилизованном мире это не имеет значения для программиста. Он мог не использовать es, а может, у него qs:qp не переполнялся, ведь проблема переполнения встала совсем недавно, когда появилась MSA, и объектов стало столько, сколько молекул. На серии Oris он MSA не тестировал, поскольку там эта функция была неофициальной, а на Porta он MSA тестирует в данный момент… И вероятно, что и в его комнате вскорости пробило бы потолок, если бы аккумуляторы не перегрелись. Да, слишком много случайностей сошлось в одном месте! В результате – всего один выстрел в небо сквозь толщу стены, чудом уцелевший Гарри… Прямо скажем, все могло закончиться гораздо хуже.
В дверь неистово застучали. Это прибежал Ави, посмотреть на чудесные плоды собственного разгильдяйства.
– Что у тебя стряслось? – начал он с порога, оглядывая мою подгорелую и побелевшую, как пекарный цех, комнату. Я сразу закрыл за ним дверь.
Ави был в клетчатых штанах, фиолетовой рубашке и манишке. Стоило ему пройти пару шагов, как на его огромную кучерявую шевелюру успело откуда-то насыпаться порошка, и он стал яростно его вытряхивать, придерживая очки. Я продемонстрировал, как единичка попадает в совершенно чуждый регистр es вместо того, чтобы оказаться во флаге переполнения. Пару минут он пребывал в молчании и проматывал код программы от начала до конца, после чего цокнул языком и сказал, что, да, похоже, они с ребятами конкретно облажались.
– А все-таки – что у тебя стряслось? – повторил он, указывая на потолок.
Я объяснил, что это и есть результат того, что ребята его подгадили в самый неподходящий момент и в неожиданном месте.
– Спишу ремонт из вашего премиального фонда, – сказал я как будто в шутку.
– Списывай откуда хочешь, – Ави было не до шуток, он усиленно чесал репу, – Главное, что реально попа… Такое нельзя выпускать на рынок… Переделывать, тестировать – месяца полтора, а то и больше…
Конечно, я ожидал, что Ави от моего известия потеряет дар речи и будет решительно потрясен. И внутренне подозревал, что сроки переделки будут измеряться неделями. Однако, лишь когда Ави огласил вердикт, я вдруг осознал, что категорически не готов к такому развитию событий. Не готов я потерять все из-за подобной ерунды. Ни за что.
– Что же делать? – глупо спросил я.
Но Ави уже занервничал, а это хорошо, в режиме легкой паники он горазд придумывать самые оригинальные хитрости. Он слонялся из угла в угол, прижав кулак к подбородку, что-то сопоставлял, а под ногами на каждом шагу хрустел порошок. Наконец, он выдал:
– Мы в спецификации объявим регистр es нерабочим! RFU[24 - Reserved for Future Use – зарезервировано для использования в будущем (англ.)].
Я даже похлопал в ладоши:
– Очень оригинально, Ави! Но тебе не кажется, что знающие люди нас обсмеют? Регистр es существует полтыщи лет во всех процессорах мира, а мы берем и говорим, что у нас его нет.
– Во-первых, мне до фонаря, кто над чем смеется. Во-вторых, ценность Porta – в новых функциях, а уж никак не в том, что он следует инженерным канонам… Всего-то допишем в драйвер процессора программную проверку es – если там появляется единичка, сразу же переносить ее в overflow flag[25 - Флаг переполнения (англ.)]… Часа на три работы.
– Очень оригинально, Ави, – повторил я. – К «костылям» у тебя настоящий талант.
Но менее «костыльных» идей ни у меня, ни у него не было. Я заручился его молчанием о дыре, и мы расстались.
Искривитель празднично сиял. И, несмотря на появление на горизонте нового медного таза, которым могла накрыться презентация, я воспрянул духом: забрезжила надежда, что эта ошибка – заключительная «шпилька» моего ралли. Последний рывок перед финишной прямой и клетчатым флагом, до которого останется добежать два шага. И пробежать их не помешает уже ничто.
Я стал аккуратно рефакторить код, избегая совместного использования этих дьяволовых регистров. Возился я внушительное время, отвлекся начисто от всего окружающего и не следил за часами. Задача искоренения es оказалась нетривиальной и потребовала изрядного количества кода. Вдобавок, меня обуревал страх новых ошибок, которые, если натворить, уже не будет времени вычистить, и поэтому я намеренно медлил даже в простых местах и перепроверял все трижды. Это последний отрезок эстафеты, момент истины, думал я, и надо хоть раз в жизни сделать все без задоринки с первого раза.
В самый разгар меня прервал телефон. Он звонил, вероятно, с минуту, прежде чем я вышел из транса и взял трубку. Это была Дженнифер.
– Артур, вы сейчас свободны? Мне необходимо с вами поговорить. Есть новая информация.
Голос был казенным, как у автоинформатора. И мы вроде договорились на «ты»…
– Слушаю, – сказал я.
– Это срочно. Позвольте, я к вам зайду?
– Ко мне? – заволновался я. – Зачем? Давайте в переговорку… Вообще, я сейчас очень занят. Говорите, в чем дело?
– Разговор не телефонный. Я отниму всего пару минут.
– Э-э, – промычал я, холодея. – Нет! Сейчас неудобно, давайте через полчаса в переговорке…
Но тут в дверь настойчиво постучали. Стук был острый, отрывистый, от женского кулачка. Внутри у меня все упало.
– Артур, в самом деле, вы там голый, что ли? – усмехнулась она, не теряя делового тона. – Откройте, я правда на минутку.
Она отключилась. Я посидел мгновение, соображая, но вскоре стук повторился. Назад дороги нет, не впустить ее нельзя, иначе не миновать мне проверки со стороны Ярослава Бойко. Эти ее въедливые вопросы за обедом о сути моей работы… Ноги слушались плохо, пока я плелся к двери. Шила в мешке не утаишь. Невелика разница, сейчас все рассказать или потом. Да и Деев настаивает, чтобы я доверял ей…
Отперев замки, я решительно распахнул дверь и попытался лицом изобразить беззаботность. Но Дженнифер с порога узрела, во что превратилась комната, поморщилась от запаха гари и захлопнула дверь. Ее лицо выражало горечь и разочарование, и смотрела она на меня, как на нашкодившего сына.
– Боже мой… Подозревала, что у вас творится что-то неладное, но чтобы настолько… Ну, выкладывайте.
– Сначала вы.
Она подняла брови с видом «ну знаете ли!», однако заговорила:
– Внештатник, про которого вы меня спрашивали, с вероятностью восемьдесят процентов – действительно, из Верховной Ассамблеи. Предполагаем, что он сегодня делает неофициальный обход, осматривается, что да как…