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