Содержание
Внизу главной страницы есть блок «Связаться со мной» — интерактивный терминал. В нём можно набрать telegram, mail или github и получить контакты. Но у терминала есть секрет: команда play запускает Bug Hunter — аркаду в духе Space Invaders, только вместо пришельцев здесь баги.
Как найти игру
Откройте главную страницу и прокрутите до терминала. Если набрать help, он покажет все команды, а внизу — подсказку: psst… попробуйте play.

Игра откликается на несколько команд: play, game, bugs, bughunter, а по-русски — игра и баги. Ещё её можно запустить кнопкой play в строке подсказок под терминалом.
Цель игры
Сверху строем маршируют баги — null, NaN, 404, 500, undefined, segfault, NPE, TODO, leak, race, panic, deadlock, err и -1. Они медленно ползут вниз, к проду. Внизу — корабль </>, который закрывает их патчами.
Каждая волна — новый релиз: v0.1, v0.2 и дальше. Когда все баги волны закрыты, начинается следующий релиз. С каждым релизом рядов становится больше, а баги стреляют в ответ чаще и быстрее.
Игра заканчивается экраном Prod down в двух случаях: закончились жизни или баги доползли до корабля.

Управление
- ← → или A D — движение. В русской раскладке работают Ф В.
- Пробел или ↑ — патч. Если держать клавишу, корабль стреляет очередью.
- Q или Esc — выход в терминал.
На телефоне всё на касаниях: корабль едет за пальцем и стреляет, пока палец на экране. Тап по полю — старт.
Жизни и очки
В начале три жизни, максимум — пять. Очки зависят от номера релиза: чем дальше, тем дороже каждый баг.
- Обычный баг — 10 очков × номер релиза.
- Heisenbug — 250 × номер релиза. Время от времени он пролетает над строем и мерцает: попасть можно, только пока он виден. Из него всегда выпадает бонус.
- Босс — 1000 очков за каждый уровень босса и одна жизнь сверху.
- rollback — об этом ниже.
Бонусы
Иногда из закрытого бага выпадает чип. Поймайте его кораблём — и на 7 секунд патчи станут сильнее:
- Hotfix — скорострельность;
- Refactor — тройной патч веером;
- Linter — пробивающий луч, который проходит насквозь через несколько багов.
Пока действует один бонус, новые выпадают реже.
Секрет: rollback
Иногда в строю прячется особенный баг — зелёный ♥ rollback. Если закрыть его патчем, вернётся одна жизнь. А если жизней уже пять, вместо жизни начислится 500 очков × номер релиза.
Rollback появляется не в каждом релизе. Но игра немного подыгрывает: когда остаётся последняя жизнь, шанс встретить его заметно выше.
Боссы
Каждый третий релиз вместо волны багов выходит босс со своим стек-трейсом. Он качается из стороны в сторону и стреляет залпами. Боссы идут по кругу, и с каждым кругом у них больше здоровья — потолка нет:
const BOSSES = [ { name: 'Legacy Monolith', trace: ['at Monolith.init (legacy.js:1)', 'at god_object.do_everything()', 'at <anonymous>:9999'] }, { name: 'Spaghetti Code', trace: ['at goto label_42', 'at callback(callback(callback()))', 'at utils_final_v2_new.js:666'] }, { name: 'Prod Incident', trace: ['at deploy (friday.sh:17:00)', 'at db.migrate(--force)', 'at pager.wake(3:00 AM)'] }, { name: 'Merge Hell', trace: ['<<<<<<< HEAD', '=======', '>>>>>>> feature/everything'] },];Звук и рекорд
Звук по умолчанию выключен — включается кнопкой в шапке терминала. Все эффекты синтезируются прямо в браузере через Web Audio, без аудиофайлов. Выбор запоминается.
Рекорд хранится в браузере. После выхода терминал напечатает итог: до какого релиза удалось дойти, счёт и лучший результат.

Как это сделано
Игра — один React-компонент, который рисует всё на canvas в одном цикле анимации: строй багов, патчи, частицы взрывов, всплывающие очки и баннеры релизов. Шрифты те же, что на сайте, поэтому игра выглядит частью терминала, а не вставкой. Если в системе включено снижение анимации, баги перестают покачиваться, а взрывы частицами отключаются.
Если дойдёте до Merge Hell — напишите мне в Telegram, какой у вас рекорд.
