К стабилизатору Алексей действительно вернулся — ровно настолько, чтобы убедиться, что новый трансформатор ведёт себя прилично: вентиляционные щели не забиты, ничего не подгорает и не пахнет.
После истории с памятью думать о перегреве было почти приятно. Железо простое: если что‑то греется — видно, слышно, иногда ещё и дым идёт. В отличие от ошибок в ОЗУ, которые тихо сидят в одном бите и ждут удобного случая испортить чей‑нибудь расчёт.
К середине февраля эта мысль перестала его отпускать.
В один из таких февральских вечеров, когда снег уже не падал, а просто висел в воздухе серой взвесью, Алексей поймал Евгения в коридоре у стенгазеты.
— Вдохновляешься? — спросил Алексей.
— Успокаиваюсь, — поправил Евгений. — После наших накладных приятно знать, что где‑то ещё хуже.
— Что, снова в машзал зовёшь? Я думал, после того как мы память на стенде приручили, ты наконец успокоишься.
— Память на стенде — это хорошо, — сказал Алексей. — Но у нас всё ещё нет нормальной оценки, сколько шаблонов самотест может себе позволить.
Он выдержал паузу.
— Нужно прогнать алгоритм на машине. Нормально, с измерением времени, с разными последовательностями.
Евгений театрально закатил глаза.
— То есть мало того, что маленькая ЭВМ будет заниматься самолюбованием при каждом включении, ты предлагаешь ещё и большую заставить по ночам работать диагностом?
Он хмыкнул.
— Знаешь, в каком месте Кирилл Савельевич скажет нам «спасибо»?
— В том, где ему потом не придётся объяснять министерству, почему учебный прибор завис в колхозной бухгалтерии, — спокойно ответил Алексей. — Машинное время дешевле командировок на ремонты.
Евгений вздохнул, но спорить дальше уже начал без нажима.
— Хорошо, допустим. Что ты хочешь? Очередную «гуляющую единицу»?
— Хочу нормальный самотест, — сказал Алексей. — Не только «все нули» и «все единицы». Минимальный набор, который заодно поймает зависшие неизменяемые биты, ошибку адреса и паразитную связь между соседними ячейками.
Он поймал взгляд Евгения.
— И да, часть этих шаблонов мы сейчас придумать не сможем «по ощущению». Их лучше проверить на машине, где мы видим всю картину.
Евгений помолчал.
— Ладно, — сдался он. — Давай так: сегодня идём к Кириллу Савельевичу, выпрашиваем ночной слот. Но с условием: мы не забиваем весь барабан под твои диагностические фантазии. Ты придумываешь три, максимум четыре шаблона. Остальное — потом, в следующей жизни.
— Договорились, — сказал Алексей. — Но про «три» мы ещё поторгуемся.
Комната начальника вычислительного центра была наполнена двумя вещами: запахом старой бумаги и здоровой подозрительностью.
Кирилл Савельевич, сухощавый мужчина с аккуратной седой бородкой, оторвался от стопки ведомостей и посмотрел поверх очков.
— Машинное время, говорите, — протянул он. — Ночью. На учебные эксперименты.
Так он называл всё, что не попадало ни в расчёты планового отдела, ни в отчётность по областной статистике.
— Не только учебные, — вставил Евгений. — Это для новой ЭВМ, которая у нас в НИИ идёт как учебно‑демонстрационный комплекс. Мы тестируем алгоритм контроля ОЗУ при включении.
— То есть вы хотите, чтобы наша ЕС проверяла вашу память, — уточнил Кирилл Савельевич. — Чтобы потом ваша ЭВМ проверяла сама себя.
— Можно и так сказать, — кивнул Алексей. — Нам важно понять, какие последовательности записи‑чтения дадут максимальный эффект при минимальном времени. Здесь мы можем это измерить точно.
Начальник машинного зала вздохнул.
— Вы, ребята, вообще видели очередь на расчёты? — Он ткнул в сторону доски, где мелом были написаны фамилии цехов и номера заданий. — У меня плановики, автоматчики, бухгалтерия по налогам… А вы с самотестами.
— Зато строго ночью, — мягко напомнил Евгений. — Я сам буду сидеть рядом на подхвате, если что‑то повиснет.
Кирилл Савельевич посмотрел на него внимательно.
— Это вы нам уже обещали, когда модель ЦУБа гоняли, — сказал он. — С тех пор я к вашим «экспериментам» отношусь осторожнее.
Алексей вмешался, пока разговор не ушёл в сторону:
— Мы готовы вписаться между плановыми заданиями, — сказал он. — Любое окно, когда барабан простаивает. Нам не нужен весь ночной слот. Полтора часа с учётом перезапуска — и всё.
Он добавил, чуть смягчив голос:
— И мы потом принесём вам отчёт. С конкретными цифрами, чтобы вы могли показать: машину используют не только как счётчик зарплаты, но и как средство разработки новой вычислительной техники для того же министерства.
Кирилл Савельевич коснулся пальцами стола. При слове «министерство» у него в голове появлялось что‑то вроде внутреннего калькулятора.
— Полтора часа… — протянул он. — А если сначала не заведётся? Маршрутные карты вы мне принесёте? Ответственного назначите?
— Ответственный — я, — тут же сказал Евгений. — Маршрутную карту Наталья Сергеевна уже заполняет. Там будет написано «проверка алгоритма контроля ОЗУ». Красиво.
— В ТЗ у нас есть такой пункт, — добавил Алексей. — «Предусмотреть контроль исправности основных узлов». Мы просто выполняем.
Начальник ещё немного помолчал, потом махнул рукой:
— Ладно, уговорили. Со среды на четверг. С двух ночи до половины четвёртого.
Он поднял палец:
— Но если плановики задержатся, вы ждёте. И никаких «всего одну карточку добить».
— Ни одной лишней карточки, — торжественно пообещал Евгений.
Ночь на четверг началась с перфоратора.
Комната подготовки программ напоминала одновременно типографию и птичник: треск перфораторов, шелест карт, приглушённые ругательства. В углу курили «Приму» в открытое окно, стараясь не попадаться на глаза технику‑методисту.
Евгений сидел за своим столом, перед ним — аккуратная стопка перфокарт. На первой крупным аккуратным почерком было выведено: «TESTMEM1». Ниже — «FORTRAN».
— Ну что, — сказал он, когда Алексей сел рядом. — Вот твой «минимальный набор».
Он постучал пальцем по верхним картам:
— Первый проход — все нули. Второй — все единицы. Третий — шахматка «01». Четвёртый — обратная «10». Пятый я выбросил.
— Как это — выбросил? — насторожился Алексей.
— Очень просто, — сказал Евгений. — Ты предложил «гуляющую единицу» по всей памяти. Я прикинул цикл — при нашей скорости это ещё секунд десять сверху.
Он развёл руками:
— Дети в школах и так будут считать, что прибор долго «думает». Хочешь, чтобы они его выключали, не дождавшись «Готов»?
— Лучше пусть выключают, чем мы потом ловим подвисания от невыявленных бит, — сухо возразил Алексей. — «Гуляющая единица» ловит ошибки по адресам. Когда у тебя один провод на шине отвалился не полностью, а так… наполовину.
Он чуть наклонился к столу, не повышая голос:
— В моём… скажем так, в хорошем будущем, которое мне иногда снится, все нормальные машины при включении гоняют похожие тесты по памяти. И никого не смущает, что это занимает несколько секунд.
Он посмотрел прямо:
— Если мы сейчас начнём экономить на этом — будем потом всю жизнь разбираться, почему у кого‑то в школе таблица умножения однажды посчиталась не так.
Евгений какое‑то время молча вертел в пальцах карандаш.
— Ты умеешь испортить человеку радость от оптимизации, — наконец сказал он. — Ладно. Я верну тебе твою «гуляющую единицу», но вместо второго прохода шахматки. Одной хватит.
Он взял верхнюю карту, задумчиво посмотрел на дырочки, потом отложил в сторону:
— Иначе мы точно не впишемся в полторы минуты на реальном приборе.
Алексей кивнул:
— Договорились. Вместо двух шахматок — одна. Но «гуляющую» оставляем. И всё равно сначала замеряем на ЕС: сколько это реально занимает.
Евгений вздохнул, но поднялся с довольным видом:
— Пошли тогда в машзал, пока я ещё добрый.
Машинный зал ночью был похож на гулкий храм. Под фальшполом беспрерывно шёл воздух, в стойках переливались лампочки, барабаны тихо шипели, как удалённый водопад.
Тихонова встретила их у окна операторской, прижимая к щеке трубку телефонной гарнитуры.
— Ага, ваши пришли, — сказала она куда‑то внутрь, кладя трубку. — Только без фокусов, Громов. Если опять повиснем — я на этот раз в журнал так и напишу: «из‑за экспериментатора».
— Мы будем тихими, как мыши, — заверил её Евгений. — Вот, посмотри, какая невинная колода.
Он поднял коробочку с перфокартами.
Тихонова взяла верхнюю, глянула на надпись «TESTMEM1» и на служебные поля.
— Фортран? — уточнила она.
— С элементами, — скромно признался Евгений. — Низкоуровневыми.
— Главное, чтобы не низкооплачиваемыми, — вздохнула Тихонова. — Ладно, идите. Плановики только что освободились, окно есть. Но я вас в три с копейками выгоню.
Они прошли в зал. ЕС‑1035, с блестящими панелями и рядами лампочек, уже спокойнее смотрела на ночных гостей, чем в самые первые их визиты. На отдельном столе, чуть поодаль, стоял небольшой металлический ящик — их испытательный стенд. К нему тянулся толстый шлейф от одной из периферийных стоек.
— Даже красиво, — заметил Алексей, глядя на эту импровизированную пуповину. — Большая машина проверяет маленькую. Как мама руку держит.
— Вот сопли мне тут не распускай, — буркнул Евгений. — Лучше помоги перетащить.
Он осторожно поставил на стол знакомую плату, подсоединённую к стенду.
— Напомню, — пробормотал он, пока подключал разъём, — всю шину адреса и данных мы закинули через этот канал. ЕС пишет в регистр — регистр дёргает наш ЦУБ, тот шлёт сигнал на память. Потом всё в обратную сторону. А машину мы спасаем от осознания, с кем она связана.
— То есть если что‑то пойдёт не так, — уточнил Алексей, — первой сгорит не ЕС.
— Вот видишь, ты уже мыслишь как настоящий программист, — сказал Евгений. — Думаешь, как бы чужую машину не тронуло.
Они загрузили перфокарты в считыватель. Тихонова из операторской кивнула, нажала несколько кнопок, барабан зашуршал быстрее. На пульте загорелась надпись задания с номером их маршрутной карты.
— Поехали, — сказал Евгений.
Самотест на большой машине был, по сути, тем же, что они уже гоняли на стенде, только в роскоши двоичного поля из восьми тысяч слов, аккуратно уложенных в группе рабочих переменных. И с таймером.
Первая часть программы записывала в память «Сферы» нули, потом читала, сравнивала, считала ошибки и время. Вторая — единицы. Третья — шахматку. Четвёртая — «гуляющую единицу».
Единственное, чего не было в «большой» версии, — это человеческого визуального контроля. Вместо лампочек работал принтер.
— Сейчас будет музыка, — предупредил Евгений.
Через несколько секунд в дальнем конце зала затрещал печатающий барабан. Лента ползла, на ней появлялись строки: сначала служебные заголовки, потом сообщения вида «PATTERN 0: ERRORS 0, TIME 0.37 SEC».
— Нули прошли, — прокомментировал Евгений. — Время — тридцать семь сотых. Жить можно.
— Единицы? — спросил Алексей.
Новая строчка: «PATTERN 1: ERRORS 0, TIME 0.38 SEC».
— Тоже ничего, — сказал Евгений. — Шахматку смотри.
«PATTERN CHESS: ERRORS 0, TIME 0.39 SEC».
— Видишь? — довольно протянул он. — Три прохода, чуть больше секунды. С учётом того, что у нас там всё работает медленнее, ну, пусть будет полторы. Дети даже не успеют отойти за тетрадкой.
Алексей не отрывал взгляда от ленты.
— «Гуляющую» дождёмся, — сказал он.
Евгений закатил глаза.
Через полминуты принтер снова ожил.
«PATTERN WALK1: ERRORS 0, TIME 0.85 SEC».
— Почти секунда, — вслух подсчитал Евгений. — В сумме набегает уже две с лишним.
Он посмотрел на Алексея:
— Ну, велико ли счастье‑то? Ноль ошибок, зато дети считают, что ЭВМ зависла.
— Счастье в том, что мы теперь знаем цифры, — возразил Алексей. — Две с половиной секунды — это не «вечность». И если за них мы ловим то, что иначе поймаем через год, я не вижу проблемы.
Евгений хотел было ещё что‑то сказать, но в этот момент принтер внезапно ожил снова.
Новые строки печатались с чуть меньшими паузами, чем раньше. Алексей заметил в начале: «REPEAT 2».
— Это что ещё? — нахмурился он.
— Я оставил там цикл по повторению, — признался Евгений. — На случай, если ошибка случайная. Второй прогон «гуляющей».
«PATTERN WALK1 REPEAT 2: ERRORS 1, TIME 0.85 SEC».
Оба замолчали.
Единица в графе «ERRORS» смотрелась как загвоздка в идеальной бухгалтерской ведомости.
— Это шутка? — осторожно спросил Алексей.
— Машина шуток не понимает, — мрачно сказал Евгений. — Особенно ночью.
Он уже шагал к принтеру, отрывая ленту. Вернулся с длинным куском бумаги, где под строкой с «ERRORS 1» шли подробности:
«ADDR 1A3, EXPECT 00000001, GOT 00000000».
— Один конкретный адрес, — сказал Алексей. — Одна конкретная единица, которая потерялась.
— Может, это канал, — предположил Евгений. — Глюк на связи между ЕС и нашим стендом.
— Тогда ошибка прыгала бы по адресам, — возразил Алексей. — А тут в обоих повторениях — один и тот же.
Он кивнул на следующую строчку: там было то же «ADDR 1A3».
Евгений замолчал.
— Саша плату паял, — сказал он механически. — Может, дорожка.
— Может, — согласился Алексей. — Поэтому сейчас мы сначала повторим тест, но с другой платой.
Он показал на коробку с микросхемами у стены:
— А потом поменяем местами пару К565 и посмотрим, чья вина.
Через двадцать минут у них было четыре распечатки.
На первой — плата номер один. Ошибка по адресу 1А3, оба раза. На второй — плата номер два, собранная на тех же микросхемах: опять 1А3. На третьей — плата с другой партией памяти: ошибок нет. На четвёртой — первая плата, но с заменой одного корпуса К565РУ5 на новый: ошибка исчезла.
— Вот тебе и канал, — проговорил Евгений, глядя на ленты, разложенные по столу. — Канал у нас один, платы разные, а болит всё равно одно и то же место.
— И тип микросхемы один и тот же, — добавил Алексей. — Серия РУ5, партия девяносто седьмая.
Он поднял коробку. На этикетке было аккуратно выведено: «К565РУ5, 02‑77».
— Ты видишь закономерность, Громов?
— Вижу, — выдохнул тот. — Не любит она, когда единственный бит гуляет по всему слову.
Он задумчиво постучал по столу:
— Похоже, если до этого там стояла единица в соседнем разряде, эта конкретная К565 не всегда успевает её «забыть».
Алексей кивнул.
— Типичная ошибка по времени восстановления, — сказал он автоматически, и только потом поймал себя на том, что в семидесятых это звучит слишком умно. — Короче, у неё память лучше, чем положено.
Евгений усмехнулся криво:
— То есть она помнит лишнее. Как бухгалтерия.
— И как некоторые инспектора, — добавил Алексей. — Но это нас сейчас не интересует. Нас интересует, что весь ящик этой партии под подозрением.
Евгений посмотрел на коробку, как на чугунный груз.
— Николай нас убьёт, — задумчиво произнёс он. — Он эту партию выбивал, наверное, полгода.
— Либо он нас убьёт сейчас, — спокойно сказал Алексей, — либо потом нас всех будут убивать по одному в школах и домоуправлениях.
Он свернул ленты в аккуратный рулон:
— Пойдём завтра к нему с цифрами. Тут уже не «кажется», тут адреса и повторяемость.
— Может, сначала ещё раз прогнать? — неуверенно предложил Евгений. — Вдруг это… не знаю… солнечная буря.
— Прогоним, — согласился Алексей. — Но не сегодня.
Он посмотрел на часы:
— У нас осталось двадцать минут машинного времени, а я предпочитаю аккуратно завершить, чем убегать под крики Тихоновой.
Евгений тяжело вздохнул.
— И всё‑таки, — сказал он, пока они аккуратно закрывали программу и отдавали машине короткий тестовый job, чтобы она не скучала, — внутри меня есть маленький программист, который плачет.
Он закатил глаза к потолку:
— Мы могли бы за это время написать нормальную игру. Простую, конечно, но…
— Мы пишем игру, — возразил Алексей. — Только для ОЗУ. Выигрыш — когда у тебя нет скрытых ошибок.
Евгений хмыкнул:
— Это даже хуже. В нормальной игре хоть финальные титры есть.
Николай Петрович встретил их на следующий день с тем же выражением, с каким смотрят на людей, которые пришли с заявлением «верните деньги».
— Мне снабжение звонит, — начал он ещё с порога, — говорит: «Ваши опять ругают партию». Я думаю: кто такие «ваши»? Оказалось — вы.
Он кивнул на коробку, которую держал Алексей.
— Ну? — спросил он. — Чем вам наша память не угодила?
— Тем, что она слишком избирательная, — сказал Алексей. — Одни вещи помнит, другие забывает.
Николай не оценил метафору.
— У нас по накладной допускается до двадцати процентов отказов, — сухо напомнил он. — Это эксплуатация, товарищ Морозов. Вы же не хуже меня знаете.
— Отказ — это когда микросхема совсем не работает, — вмешался Евгений. — А тут всё хуже. Она вроде бы работает, а потом иногда вспоминает лишнее.
Николай нахмурился.
— Конкретнее можно? А то я вас сейчас всех отправлю в отдел технического контроля, они любят, когда разговаривают по формам.
Алексей развернул ленты.
— Конкретно — вот, — сказал он. — Мы прогнали четыре платы с этой партией через программу самотестирования на ЕС. Везде, где стояли К565РУ5 из партии 02‑77, в одном и том же адресе при шаблоне «гуляющая единица» возникала ошибка.
Он ткнул пальцем:
— Адрес 1А3. Направление — запись единицы после нуля. Модель с другой партией — ошибок не даёт.
Николай взял ленты, придвинул к себе, некоторое время молча разбирался в таблицах.
— А это что? — спросил он, показывая на строку «REPEAT 2».
— Повтор теста, — ответил Евгений. — Чтобы исключить «случайный сбой».
Он усмехнулся:
— Случайность, которая дважды попадает в один адрес, у нас переходит в категорию «закономерность».
Николай помолчал.
— И что вы от меня хотите? — наконец спросил он. — Чтобы я всю эту партию на помойку снёс?
Он кивнул на коробку:
— Вы понимаете, сколько бумаги на неё ушло? Согласования, заявки, протокол комиссии…
— Мы понимаем, — спокойно сказал Алексей. — Поэтому не просим выбрасывать.
Он чуть наклонился вперёд:
— Просим не использовать её в оперативной памяти «Сферы‑80».
Он сделал паузу:
— Поставьте их куда попроще. В счётчики, в табло, во что угодно, где одинаковые числа крутятся и нет сложных последовательностей. Там эта ошибка может за весь срок службы не вылезти.
Он постучал по рулону:
— А у нас дети будут гонять по этой памяти такие комбинации, о которых ваша спецификация даже не мечтала.
Николай вздохнул, поёрзал на стуле.
— Вы, Морозов, как всегда, — проговорил он. — Взяли и перевернули всё с ног на голову.
Он поскреб лоб:
— По‑человечески я вас прекрасно понимаю. По бумаге — у меня есть партия, которая формально проходит по ОТК.
Он поднял взгляд:
— Давайте так. Официально эта партия уходит в другой отдел.
Он выдвинул ящик, достал бланк:
— Тут как раз у автоматчиков заявка на память для их табло. Там адреса как Бог положит. Им с этой партией будет счастье. А вам я попробую выбить ещё одну — с завода, где контролёр у нас… наш человек.
Евгений облегчённо выдохнул.
— И вы это можете? — спросил он.
— Могу, — вздохнул Николай. — А то что же я тут сижу, по‑вашему.
Он посмотрел на Алексея:
— Только учтите, я теперь по каждому вашему чиху машинного времени ЕС требовать не буду. Посчитали, доказали — хорошо. Но если через неделю вы придёте и скажете: «знаете, мы придумали ещё два прекрасных шаблона, которые ловят новые виды глюков»…
— Мы всё равно придём, — честно сказал Алексей. — Но, может быть, не через неделю.
Николай закатил глаза, но в уголках губ мелькнуло что‑то похожее на улыбку.
— Идите уже, — буркнул он. — Пока я не передумал.
Они вышли из бюро снабжения на лестничную площадку и какое‑то время молча спускались.
Евгений первым нарушил тишину.
— Знаешь, Морозов, — сказал он, — я, конечно, всегда подозревал, что ты параноик.
Он достал из кармана маленький бумажный пакет, помял:
— Теперь у меня есть экспериментальное подтверждение.
— Это комплимент? — уточнил Алексей.
— Сегодня да, — кивнул Евгений. — Потому что твоя паранойя только что спасла нам, возможно, пару десятков приборов от таинственных зависаний.
Он вытряхнул из пакета несколько мятных карамелек.
— Держи, — сказал он. — Программистский гонорар за выявленный глюк.
Алексей поймал одну.
— Думал, у тебя мятные идут по смете только за новые функции, — заметил он.
— Ошибаешься, — сказал Евгений. — За правильно найденные баги положено вдвое.
Он чуть ухмыльнулся:
— А ещё — право в следующий раз первым ругаться, когда я скажу: «да ну его, этот самотест, давай лучше игру напишем».
— Я тебе даже помогу ругаться, — пообещал Алексей. — Но самотест мы всё равно допилим.
Евгений вздохнул, но уже без прежней досады.
— Знаешь, — сказал он, — в одном ты прав. Лучше уж машина пару секунд думает, чем потом мы неделю бегаем по учреждениям, объясняя, почему у кого‑то вдруг из таблички исчезла одна строка.
— Это и называется надёжность, — ответил Алексей. — Она скучная, как отчётность. Зато потом никто не вспоминает, что где‑то кто‑то ночью сидел с перфокартами.
Он сунул карамель в рот. Сладость была почти приторной, но мята бодрила и успокаивала одновременно — и после ночи в машзале и утренней ругани со снабжением казалась очень уместной.
— Ладно, — сказал Евгений. — Раз уж мы отстояли «гуляющую единицу», давай вечером посчитаем, как вписать всё это в наш базовый код.
Он усмехнулся:
— А то ещё окажется, что самотест у нас занимает больше места, чем табличные формулы.
— Ничего, — ответил Алексей. — Значит, табличные формулы ужмутся.
На дворе по‑прежнему висел февральский сумрак, на ступеньках общежития кто‑то чистил от снега валенки. Внутри же у Алексея было неожиданно спокойно.
Он не «спасал СССР». Он всего лишь выбросил из будущей ЭВМ партию капризной памяти и довёл до ума кусок самотеста.
Иногда этого вполне достаточно, чтобы потом где‑то в школе маленький курсор спокойно мигал на экране и ждал очередной строки формулы — не исчезая в самый неподходящий момент.