Voxel.js

**Voxel.js**  — великовозрастный, но так и не взлетевший хипстер-проект из эпохи раннего Node.js-хайпа, ставивший своей целью переписать Minecraft на JavaScript. Позиционировался как модульный, открытый и свободный конструктор для создания воксельных игр прямо в браузере. На деле же оказался эпическим долгостроем, набором костылей и доказательством того, что переписывать популярные вещи на жаваскрипте — путь в никуда, устланный сотнями npm install. Проект наглядно продемонстрировал, чем обычно заканчивается затея, когда за разработку игр берутся суровые веб-девелоперы, свято верующие в UNIX-way и считающие, что игра — это просто набор мелких модулей.

## Суть

В начале 2010-х, когда лучи славы Нотча пробивались даже сквозь самые толстые смузи и узкие джинсы, в богемной тусовке Окленда, штат Калифорния, обитали два видных деятеля ноды —  **Max Ogden**  и  **Substack** . Эти светочи асинхронной мысли, по их собственному признанию, были типичными  *non-game developers*  и имели примерно « *zero experience programming games* ». Однако, вместо того чтобы тихо-мирно пилить свои чат-боты и стримить видео с котиками, они решили, что пора нести свет веб-технологий в тёмное царство геймдева. Их взор пал на Minecraft — явление планетарного масштаба, написанное на страшной, энтерпрайзной и совсем не модной Java.

> Мы оба видим столько потрясающих вещей, которые можно сделать с воксельными играми, и которые Minecraft совсем не делает, и не собираемся никоим образом портировать Minecraft на JS. Вместо этого мы просто хотим упростить создание вашей собственной игры в том же стиле.
>  — Max Ogden, пророк воксельного джихада

Идея была простой, как callback-hell: взять WebGL, приправить его серверным JS, распилить всё на атомарные npm-пакеты и дать миру возможность создавать свои кубические вселенные прямо в браузере. Больше никаких лаунчеров, никаких гигабайтных клиентов, никакой JVM! Только ты, браузер и сотни зависимостей в package.json. Проект был назван  **voxel.js**  и гордо водружён на алтарь GitHub, готовый принять дары в виде пулл-реквестов от таких же энтузиастов.

Главной фишкой, мантрой и одновременно проклятием проекта стала его  **гипермодульность** . Вместо того чтобы сделать цельный игровой движок, авторы, верные заветам UNIX-философии, решили, что всё должно быть маленьким, независимым и делать только одну вещь. Хочешь, чтобы твой персонаж ходил? npm install voxel-player. Хочешь летать? npm install voxel-fly. Хочешь прыгать? Ставь voxel-jump. Нужен инвентарь? voxel-inventory. Прицел на экране? voxel-crosshair. Возможность ломать блоки? npm install voxel-mine. Список можно продолжать до бесконечности. Каждая, даже самая тривиальная фича, представляла собой отдельный репозиторий на Гитхабе, со своими багами, зависимостями и автором, который мог в любой момент забить на своё творение. В итоге, чтобы собрать что-то играбельное, нужно было превратиться в npm-сомелье, дегустирующего десятки пакетов с невнятными README и несовместимыми версиями.

## Золотой век хайпа (2012-2014)

Поначалу идея выстрелила. Сама мысль о «Майнкрафте в браузере» будоражила умы гик-сообщества. Технологические евангелисты и новостные сайты вроде Engadget и VentureBeat трубили о новой революции. Это же открытый исходный код! Это JavaScript, язык будущего! Это можно будет запустить на чём угодно, от ПК до Raspberry Pi! И действительно, первые демки выглядели впечатляюще для своего времени. Можно было зайти по ссылке и увидеть процедурно сгенерированный ландшафт из кубиков, по которому можно было бегать и летать. Это было свежо, модно и молодёжно.

Сообщество нодеров-хипстеров встретило проект с восторгом. Начался карнавал безумных модулей. Один адепт прикрутил к движку эмулятор контроллера для AR.Drone, позволяя летать над воксельным миром с помощью того же кода, что и для настоящего квадрокоптера. Другой сделал генератор, который превращал реальные карты Сан-Франциско в уродливый, но технологичный кубический мир. Появились модули для портальных пушек, для показа имени блока под курсором ( *voxel-voila* !), для спринта по двойному нажатию 'W' ( *voxel-sprint* ), и даже специальный блок-костыль  *voxel-skyhook* , который можно было ставить в воздухе, потому что законы физики — это для проприетарных движков.

Вершиной этого абсурда стал модуль  **voxel-clientmc** . Его создатель, видимо, осознав тщетность попыток догнать и перегнать оригинал, решил просто... подключиться к нему. Модуль использовал прокси, чтобы транслировать протокол Minecraft-сервера в WebSocket и позволить поделию на voxel.js притвориться настоящим клиентом. Конечно, это был лишь жалкий  *proof-of-concept* , способный едва-едва рендерить мир, но сам факт его существования идеально описывал всю суть проекта: вместо того чтобы создать убийцу Minecraft, они создали его убогого веб-клиента.

> Позднее в 2013-м прогресс voxel.js как бы замедлился...
>  — deathcap, летописец упадка

Авторы и сами подливали масла в огонь, излучая оптимизм, граничащий с наивностью. В своих выступлениях и статьях они признавались, что почти ничего не понимают в геймдеве, но верили, что коллективный разум опенсорса всё исправит. Фраза  *«if you find bugs it is because we don't really know what we are doing»*  ( *«если найдёте баги, то это потому, что мы не особо в курсе, что делаем»* ) даже попала в заголовки. И это работало! На какое-то время voxel.js стал самой модной песочницей для JavaScript-программистов, уставших от jQuery-каруселей и AJAX-форм.

## Конец немного предсказуем

А потом хайп прошёл. Оказалось, что игра — это не только рендеринг кубов и ходьба по ним. Нужен был контент, геймплей, враги, крафтинг, физика, мультиплеер. А каждый из этих пунктов требовал не просто очередного npm install, а скоординированной работы, единого видения и, о ужас, централизованного управления. Философия маленьких модулей, которая так хорошо работала для утилит командной строки, в геймдеве дала сбой.

Представьте, что вы собрали игру из 50 модулей. Внезапно автор  *voxel-engine*  обновляет API. Половина модулей отваливается. Их авторы уже нашли новую модную технологию и забили на свои репозитории. Вы сидите посреди руин из несовместимых зависимостей, и единственный выход — форкать всё подряд и поддерживать самому.

Браузерный JavaScript — не самое лучшее место для высокопроизводительных вычислений. Как язвили комментаторы на Hacker News по поводу схожих проектов, рендерить мир из тысяч независимых DOM-элементов или даже WebGL-объектов — это верный способ  *«убить браузер»* . Любая сложная сцена с большим количеством чанков, динамическим освещением и физикой превращала игру в слайд-шоу даже на мощных машинах, не говоря уже о смартфонах.

Самый главный вопрос, который так и повис в воздухе. За всё время существования проекта так и не появилось ни одной законченной, полноценной игры. Только бесчисленные демки, техно-песочницы и «метавселенные», которые были интересны лишь самим разработчикам. Один из ведущих контрибьюторов,  *deathcap* , годами пилил свой проект  *voxelmetaverse* , который должен был стать витриной возможностей движка. В ретроспективе он честно признался:  *«...it wasn't reaching where I wanted it to be and alas, real life took over, and the project became inactive»*  ( *«...оно не достигало того уровня, которого я хотел, да и, увы, реальная жизнь взяла своё, и проект заглох»* ).

К 2015-2016 годам коммиты в основных репозиториях стали редкими, а затем и вовсе прекратились. Сообщество разбежалось по другим, более перспективным проектам. Попытка перезапуска под названием  **voxeljs-next** , призванная обновить кодовую базу до современных стандартов ES6 и Three.js, также тихо скончалась, не оставив после себя ничего, кроме ещё одного заброшенного репозитория.

## Наследие

Проект так и не смог «убить» Minecraft, не создал ни одного коммерческого продукта и не произвёл революции. Он остался в истории как кружок по интересам для веб-программистов, которые на пару лет вообразили себя игровыми разработчиками. И, возможно, в этом и заключается его главная ирония: самое популярное, что было создано с помощью voxel.js, — это статьи и доклады о самом voxel.js.

## См. также

- Minecraft — недостижимый идеал.

- Node.js — секта, породившая это чудовище.

- Хипстеры — целевая аудитория.

- Велосипед — основной метод разработки.

- Серебряная пуля — то, чем проект так и не стал.