Тук-тук-тук.
Пальцы без устали порхали по клавиатуре.
Однако, несмотря на эту суету, работа шла довольно легко.
Простой кодинг: нужно было лишь реализовать всё в точном соответствии со спецификацией.
Для меня, разработчика с пятилетним стажем, это было рутиной, которую я выполнял каждый день.
«Хм…»
Но бывали моменты, когда даже мои пальцы замирали.
Первый случай — когда я задумывался над самой спецификацией.
«А может, лучше реализовать это вот так…»
Мне постоянно бросались в глаза более удачные варианты решения.
И всё же «Да какая разница, сделаю по спецификации, и дело с концом.»
Если проявить самодеятельность и возникнут проблемы, будет только хуже.
И, что важнее всего, сейчас был как раз второй случай, когда мои пальцы останавливались.
Конец рабочего дня.
— Тесты я закончил ещё раньше, коммит сделал, так что…
Проверив всё в последний раз, я встал с места, накинул куртку и сказал:
— Что ж, я закончил, ухожу домой.
Я уже собирался выйти из офиса.
Как вдруг сзади послышался голос:
— У тебя что, какие-то важные планы?
Это был наш новый руководитель Ким.
Говорили, что он хорош в планировании задач и показывает отличные результаты.
Хотя, если перевести с офисного языка, это означало, что он мастерски выжимает все соки из разработчиков.
Впрочем, если говорить о важных планах…
— Нет, никаких.
Их действительно не было.
Ведь всё, чем я занимался дома после работы, — это игры.
— Тогда почему бы не поработать ещё немного? Ты ведь разработчик с опытом и должен понимать: если твой график сдвигается, это тянет за собой весь проект.
Конечно, я это понимал.
Я сам не раз страдал из-за того, что мой коллега, сидящий напротив и ломающий голову над кодом, задерживал весь график.
Но ко мне это не относилось.
— Что мне нужно сделать?
— В смысле, что сделать? У тебя наверняка ещё полно работы на сегодня.
— Я всё закончил. Можете проверить.
— Что? Не может быть…
Руководитель Ким с недоверием посмотрел на меня и защелкал мышкой, но по мере того, как он просматривал работу, выражение его лица менялось.
От удивления к оцепенению, а затем к откровенному недоверию.
— Ты сделал всё это за один день?
— Да.
— А тесты?
— Я прогнал их на сервере разработки ещё раньше. Логи сохранил, можете проверить…
— Нет, я должен убедиться в этом лично.
Руководитель Ким взял USB-накопитель, встал и сказал мне, стоявшему в стороне:
— Чего стоишь? Пошли.
— Мне обязательно идти?
— Конечно. Проверим всё прямо у тебя на глазах. Убедимся, что ты действительно всё сделал как надо.
Щелк. Дверь серверной открылась, и я был вынужден войти следом.
Внутри всегда было прохладно, а пространство наполнял лишь гул работающего оборудования.
— Пэк Ин Ук.
Вставив USB в сервер, руководитель Ким назвал моё имя и произнес:
— В твоем резюме сказано, что ты первый кореец, победивший на международном студенческом чемпионате по программированию.
— Было дело.
— Не знаю, чем ты занимался все эти шесть лет, но если думаешь, что можешь кичиться этим достижением до сих пор… со мной это не пройдет.
Он сбросил настроенную мной тестовую среду и начал настраивать всё заново, уже самостоятельно.
— Я встречал много таких, как ты, участников олимпиад. Все они умеют быстро решать сложные алгоритмы, но почти никто не понимает, что код должен быть точным и безупречным.
В этот момент код запустился, и на экран начали выводиться результаты тестов.
— Конечно, признаю, что в скорости ты превосходишь многих…
Логи быстро бежали по экрану.
Ожидая завершения, он предложил мне пари:
— Давай поспорим? Условие простое: если в твоем коде найдется хоть одна ошибка, ты проиграл.
Пари, значит…
На самом деле я уже знал результат, так что ничем не рисковал.
— Хорошо, договорились.
— Если найдется хоть малейшая ошибка, с завтрашнего дня ты будешь каждый день приходить ко мне на проверку и не уйдешь домой, пока не исправишь всё до последней запятой.
— А если ошибок не будет?
— Тогда с моего разрешения ты сможешь уходить сразу, как только закончишь работу. Хотя, сомневаюсь, что до этого дойдет.
…А это уже заманчивое предложение.
Если бы он предложил что-то вроде «куплю тебе обед», я бы отказался — мне это не нужно.
Но это предложение оказалось куда интереснее.
И в этот самый момент…
Тест завершился, и результаты были выведены на экран.
Я быстро ответил, прежде чем руководитель Ким успел всё прочитать:
— Я принимаю пари.
— Ты сам на это пошел. Только потом не жалей и не проси отменить всё назад.
— Вот именно. Здесь, в этой части, сверху и снизу всё выводится как True, а тут False.
Вдруг он усмехнулся и указал на экран:
— Ну вот, я так и знал. Здесь, в этом месте, везде должно быть True, а у тебя False.
Действительно, он был прав.
— В этом месте я просто реализовал спецификацию как есть.
— Что?
Я открыл файл спецификации, который также был сохранен на USB.
Затем указал на место, которое он критиковал, и объяснил:
— Если следовать спецификации, здесь и должно быть False. Если это ошибка, то ошибка в самой спецификации.
Я догадывался, где именно кроется проблема.
Но это уже не входило в мою компетенцию.
В мои обязанности, за которые мне платят, входило только кодирование.
Руководитель Ким ещё несколько раз перечитал спецификацию, долго и внимательно изучая, нет ли других ошибок.
— Не может быть. Ты правда написал такой объем кода за день и без единого бага?
Однако, похоже, он так и не смог найти ни одной ошибки.
— Признаю. Ты действительно отличаешься от остальных.
— Значит, я могу сегодня идти?
— Какое «сегодня»? Мы же договорились. С завтрашнего дня, как закончишь работу — можешь сразу уходить.
Сказав это, он снова погрузился в изучение моего кода.
— Ты реализовал эту часть вот так…?
Казалось, он был настолько поглощен моим кодом, что забыл обо всём на свете.
* * *
Автобус по пути домой.
Едва найдя свободное место, я достал из кармана смартфон и привычно запустил игру.
[Добро пожаловать в «Хроники Терасии».]
«Хроники Терасии».
Игра, которая работает уже три года, отличалась невероятной свободой действий и проработкой, почти как в реальном мире.
И в то же время это была причина, по которой я так стремился уйти с работы вовремя.
Меня часто спрашивали, что в ней такого интересного.
Конечно, из-за маниакальной детализации и высокой сложности игра нравилась далеко не всем.
Но я не бросал её не из-за интереса.
«Как, черт возьми, они это разработали?»
Обычно я понимал, как устроено большинство игр и программ, максимум за пару дней.
Но с этой игрой всё было иначе.
Я играл уже три года, но до сих пор не мог даже догадаться, как она была создана.
Это стало делом принципа.
Пусть никто об этом не знает, но я сам не хотел сдаваться в этом противостоянии.
Так прошел третий год моего «аналитического» прохождения игры.
В тот момент, когда я почувствовал, что сегодня особенно сосредоточен, в голове что-то щелкнуло, словно проскочила искра.
Наконец-то я увидел ниточку, торчащую из этой безупречной игры.
«Это…»
Я не ошибся.
Эффект заклинания, примененного персонажем, отличался от описания.
Я провел тест ещё раз.
«В точно таких же условиях, как и раньше…»
Щелк.
Заклинание сработало, и результат снова был тем же.
«Каковы точные условия?»
Меняя различные параметры, я наконец смог определить природу этого явления.
Это баг.
Причем первый баг, который я нашел за три года игры в «Хроники Терасии».
Более того, я примерно догадывался о его причине.
«Конечно, чтобы быть уверенным, нужно увидеть код…»
Но описание явления я уже подготовил.
Теперь мне оставалось только отправить отчет об ошибке.
Я начал писать отчет, основываясь на собранных данных.
Кратко описал условия возникновения бага, его суть и предполагаемую причину.
[Отправить]
Как только я отправил отчет…
Бр-р. Телефон завибрировал, пришло уведомление.
Это был ответ от разработчиков игры.
«Уже?»
Слишком быстро.
Я уже было подумал, что это автоматический ответ, но, прочитав сообщение, пришел в замешательство.
— Здравствуйте, это команда разработчиков «Хроник Терасии». Мы внимательно ознакомились с вашим отчетом. У нас есть к вам предложение касательно этого бага.
Первая часть сообщения определенно была похожа на автоматический ответ.
Однако слово «предложение» в конце заставило меня насторожиться.
Я тут же отправил ответ:
— Какое предложение?
Ответ пришел так же быстро.
— Не хотите ли вы сами исправить это заклинание?
Что это значит?
Неужели то, о чем я думаю?
Дрожащими руками я набрал ответ:
— Вы хотите дать мне код?
— Мы сообщим вам, если вы согласитесь исправить заклинание самостоятельно.
Они явно что-то скрывали.
Это было подозрительно, но я ничего не терял.
Для меня получение даже крошечного фрагмента кода «Хроник Терасии» было огромной выгодой.
— Я согласен.
В ответ пришел не текст, а какой-то файл.
-[Прикрепленный файл]
«Что это?»
Сердце бешено колотилось, когда я осторожно открыл его, и экран смартфона заполнился кодом.
«Код?»
Я затаил дыхание от удивления, но ненадолго.
Вскоре я заметил нечто странное.
«Подождите, что это…»
Названия функций и переменных были необычными.
«Fire, Mana, Casting?»
Это был не тот код, который обычно используют в разработке игр.
Конечно, читая код, я примерно понимал, для чего он нужен.
Вероятно, это код того самого заклинания, в котором я нашел баг.
И они прислали его, чтобы я исправил ошибку.
Но «Что это вообще за язык?»
Тем не менее, он придерживался форматов, характерных для языков программирования, поэтому я понимал, что это код.
Однако конкретный синтаксис не совпадал ни с одним известным мне языком.
«Какой-то редкий язык?»
В любом случае, мне нужно было знать, что это за язык.
Поскольку общая логика была понятна, я бы как-нибудь справился, но работать, зная язык, и работать вслепую — это две большие разницы.
— Можете сказать, что это за язык программирования?
Ответ оказался совершенно неожиданным.
— Это просто магический язык. У него нет названия. Если вам нужно какое-то имя, то ML (ML) вполне подойдет.
Они что, сумасшедшие?
Собственный язык?
«Впервые вижу таких безумцев, которые разрабатывают собственный язык, чтобы реализовать магию в игре».
Теоретически это возможно, но если думать о совместимости и оптимизации игры, это абсолютно нерационально.
И всё же… мне это понравилось.
Разработчики «Хроник Терасии» должны быть именно такими.
— Спасибо за ответ.
Отправив сообщение, я немедленно приступил к кодингу.
Поскольку ML был самодельным языком без корней, ожидать наличия специального редактора кода не приходилось.
А это означало, что обычного приложения «Заметки» на смартфоне будет вполне достаточно.
«Так, сначала баг…»
Всё оказалось именно так, как я и предполагал.
Благодаря этому исправление не составило труда.
Но «Сейчас вижу, что проблема не только в баге».
Код местами был далек от идеала.
Конечно, это не был уровень «кодинга ногами», но для человека, который создал собственный язык ради игры, здесь было слишком много огрехов.
«Ну, работать-то оно будет…»
Вопрос оптимизации, так сказать.
Недочеты есть недочеты.
«Может, подправить ещё немного?»
На всякий случай я сохранил версию, где исправил только баг.
А затем начал вносить правки в другие части.
Бесполезные повторные вычисления.
Участки с риском бесконечного цикла.
Даже утечки памяти.
Я был так увлечен оптимизацией кода на смартфоне, что потерял счет времени.
Я так быстро стучал по клавиатуре смартфона…
Как вдруг кто-то постучал меня по плечу.
— Пассажир, пассажир…
Я поднял голову и увидел перед собой человека.
Это был водитель автобуса.
— А? Что?
— Конечная.
Похоже, пока я был погружен в оптимизацию, мы уже доехали до конечной остановки.
— Подождите секунду.
— Пассажир, вам нужно выйти…
— Подождите, пожалуйста. Мне буквально одна минута нужна.
Это была правда.
Я поспешно проверил оптимизированный код в последний раз.
«Опечаток вроде нет…»
Я бы с удовольствием сам запустил программу… то есть магию, чтобы проверить, но…
В реальности это было невозможно.
В итоге мне оставалось лишь довериться коду, который я написал вручную.
[Отправлено.]
Убедившись, что файл ушел, я встал с места.
— Извините.
Я извинился и уже собирался выйти из автобуса.
Вдруг смартфон снова завибрировал.
— А?
Это был ответ от разработчиков.
— Впечатляет.
В сообщении было лишь короткое восхищение.
Конечно, я не ждал ничего взамен за отладку.
Но то, что они прислали только восклицание, меня озадачило.
Однако это было ещё не всё.
— Что ж, раз мы убедились в ваших способностях, перейдем к выполнению контракта.
Способностях? Контракте?
Я был в полном недоумении от этих неожиданных слов.
«А?»
Внезапно зрение начало затуманиваться.
«Что за…»