Есть особый сорт досады: найти разгадку и понять, что ты её уже читал — своими же глазами, в тот же вечер. В тот день мне досталась именно такая.
Организм — моя программа, которая учится собирать другие крошечные программы. Судья у неё один, и я зову его миром: настоящий компилятор и настоящий запуск. Никаких «похоже на правду»: собралось и посчитало верно — кандидат жив, не собралось — мёртв. У честного судьи есть цена: каждый вопрос миру — это полная сборка и прогон, самая дорогая операция во всём проекте.
Чтобы не разориться, я спрашивал мир не по одному кандидату, а пачками по четыреста: все варианты складываются в одну программу, один запуск — и все ответы разом. И вот эту пачку начала убивать одна-единственная строка. Среди кандидатов попался тот, что делит на ноль. Программа падает целиком, а вместе с виновником молча умирают триста девяносто девять невиновных. Вечерний замер, которому полагалось стоить около дюжины запусков, съел тысячу двести двадцать три. Я смотрел на этот счётчик и не верил: механизм экономии сжигал деньги быстрее, чем их жгла бы честная тупая переборка.
Чинить я стал не бронёй, а некрологом. Когда сборка падает, компилятор сам называет строки, в которых беда, — прямо в тексте своей ошибки. Значит, можно прочитать эти строки, выбросить ровно тех кандидатов, кого мир назвал по имени, и пересобрать один раз — не гадая и не перестраховываясь. А чтобы падение на бегу не валило пачку, каждый кандидат теперь отвечает из ловушки: умер — в протоколе так и печатается «мёртв», а остальные продолжают отвечать.
Сработало: тысяча двести двадцать три запуска сжались до двадцати шести, отказ и смерть считаются раздельно, и все числа прежних замеров воспроизвелись слово в слово. Но два числа из четырёх, названных до прогона, я провалил. Я считал кандидатов по одному до попадания, а мир читает пачку целиком — и предупреждение ровно об этом мой собственный замер напечатал в тот же вечер, часом раньше. Я его прочёл — и забыл. Разгадка лежала не в коде, а в моём же отчёте, и вот это было по-настоящему обидно.
Ошибка системы — это не только беда, но и данные: мир сам называет виновную строку, надо лишь научиться её читать. И перечитывайте предупреждения собственных приборов — самые дорогие грабли обычно лежат в уже напечатанных отчётах.
Андрей Рощупкин