Как стать автором
Обновить
2658.61
RUVDS.com
VDS/VPS-хостинг. Скидка 15% по коду HABR15

Я мучился с Git, поэтому создал про него игру

Уровень сложностиСредний
Время на прочтение8 мин
Количество просмотров4.4K
Автор оригинала: Jacob Stopak

Прошло два года...


… с тех пор, как я разработал и выпустил Git-Sim — бесплатный опенсорсный инструмент для визуализации команд Git непосредственно в репозиториях пользователя.

Самым важным выводом для меня стало то, что существует достаточно большой спрос на визуальных помощников в кодинге.

Через несколько недель после релиза я задумался… Визуализация и симуляция вывода команд Git при помощи удобных диаграмм — это, конечно, здорово, но стало понятно, что они помогают только тем, кто уже в той или иной степени знакомы с Git.

Например, визуализация команды git merge dev (показанная на сгенерированном Git-Sim изображении ниже) практически бесполезна для того, кто не пользовался Git раньше. Чтобы Git-Sim приносил пользу, пользователи должны иметь хотя бы базовое понимание предназначения каждой команды Git.


Я задался вопросом, а существует ли разновидность или расширенная версия Git-Sim, которой могли бы пользоваться кодеры с любым уровнем навыков и даже абсолютные новички; при этом этот инструмент должен быть более удобным для восприятия и интуитивно понятнее, чем Git-Sim.

И тогда у меня возникла мысль:

А что, если бы мы могли в буквальном смысле гулять по своему репозиторию Git, осваивая концепции Git более осязаемым образом?

Эта мысль стала фундаментом создания версии Git-Sim следующего поколения.

Сидя на диване


Несколько недель спустя я сидел на диване и размышлял, как же должна выглядеть «более удобная для восприятия» версия Git-Sim, и тут ко мне пришла ещё одна идея.

Что, если ветвь Git походила бы на коридор, по которому можно ходить? А комнаты вдоль коридора были бы коммитами, ID которых совпадал с номером комнаты? Что, если пользователь сможет заходить в эти комнаты, чтобы изучать связанную с коммитом информацию, например, изменённые файлы и изменённый в них код (то есть diff), авторов и данные меток времени?

Звучит странновато, но в то же время довольно круто.

В YouTube я наткнулся на туториал по созданию опенсорсного ремейка Doom во фреймворке Python Pygame

Я клонировал его код и изменил его так, чтобы он считывал данные репозиториев Git при помощи библиотеки GitPython и отображал их на разных поверхностях в игре. Затея была абсурдной. Результат выглядел так:

В первой половине видео показано то, что я объяснял выше — ветвь Git представлена в виде коридора, по которому можно ходить и исследовать данные коммитов в виде комнат.

Во второй половине видео показана большая комната, в которой можно симулировать большое количество команд Git, нажимая красные кнопки на стене. Они запускают Git-Sim, генерирующий визуальный образ воздействия команды на репозиторий Git.

Не буду врать — мне очень понравилось, как данные Git рендерятся в игре, и это вдохновило меня на большее.

Однако я подумал, что пользователям вряд ли понравится играть во что-то подобное. Doom — это пугающая, стрессовая игра, в которой надо отстреливать монстров, а Git — запутанный, стрессовый инструмент. Мне показалось, что скрещивать их опасно. Стрессовые факторы каждой из частей этой комбинации усиливают друг друга.

Я решил, что мне нужна расслабленная среда, контрастирующая с запутанной и иногда пугающей природой Git. Мне нужно было что-то более «дзен-буддистское».

Переходим в воксельный мир


Пару месяцев спустя автор туториала о Doom в Pygame выпустил ещё одно видео: туториал по опенсорсному воксельному миру, воссозданному в Pygame.

На всякий случай скажу, что «воксельный мир» — это мир, составленный из блоков, называемых вокселями; они сгруппированы в большие области, из которых состоит мир. Откровенно говоря, его можно было просто назвать «миром из блоков».

Как только я посмотрел видео, то сразу понял, что это мне идеально подходит, потому что отвечает всем нижеперечисленным пунктам:

  • Игра написана на Python с использованием фреймворка Pygame, который я хорошо знаю, потому что с детства делал на нём разные проекты.
  • Содержит ингредиенты для создания блочного мира, в том числе структуры для хранения состояния мира, 3D-графики, движения камеры, процедурной генерации островов и возможности добавления и удаления блоков игроком.
  • Потенциал создания расслабленного, тихого природного окружения, выставляющего Git и кодинг в доступном (а не пугающем) виде.
  • Бесплатная и опенсорсная игра (под лицензией MIT).

По сути, я использовал опенсорсную кодовую базу в качестве фундамента и каркаса для создания инструмента Git нового поколения.

Плюс мне показалось, что будет гораздо интереснее развить маленький проект, написанный одним человеком, чем использовать модные движки наподобие Unity, Unreal Engine или Godot.

То есть теперь мой визуальный инструмент Git будет выглядеть примерно так:

Как можно понять, в видео происходит staging неотслеживаемого файла в рабочей папке. Я назвал это «стеной рабочей папки».

Кому бы не понравилось прогуляться по пляжу, состоящему из своей истории коммитов?

А вот картинка целиком!

Оригинал трейлера на Youtube

Что понадобилось для реализации этого проекта?


Для меня создание геймифицированного инструмента Git было отчасти изучением технологий, отчасти — ностальгическим проектом, отчасти — проявлением безбашенного энтузиазма.

▍ Разбираемся с движком


Я начал с анализа внутренностей самого воксельного движка — это сложная, но хорошо структурированная комбинация Pygame и OpenGL, обрабатывающая основы загрузки групп блоков, движения игрока, процедурной генерации островов и добавления/удаления блоков из мира.

Само по себе это стало задачей на несколько недель: я исследовал конвейер рендеринга (совершенно новая для меня концепция), параллельно экспериментируя со структурой и механикой игрового мира.

Довольно много времени понадобилось на настройку параметров генерации островов, позволяющих получить острова нужного размера и формы. Не способствовало этому и то, что на этом этапе у меня не было чёткого образа того, как может выглядеть готовый проект.

Спустя множество проб, ошибок и замеров производительности я остановился на острове средних размеров, на котором будет достаточно места под отдельные области для визуализации таких концепций Git, как рабочая папка, staging-область, история коммитов и stash; при этом он должен быть не очень большим, чтобы не тормозил на относительно старом «железе» наподобие моего жалкого Intel Macbook Pro 2020 года.

▍ Добавляем базовые игровые механики


Далее мне нужно было реализовать основные игровые механики, в том числе гравитацию, границы мира, более чёткое перемещение игрока, возможность бегать и прыгать, распознавание коллизий и выполнять быстрые линейные интерполяции (LERP) между разными точками мира. Функция камеры LERP позволит привлекать внимание игрока к конкретной сцене мира при изучении какой-либо концепции Git.

▍ Интегрируем Git


Игре нужна интеграция с Git! Я добавил интерфейс Git при помощи GitPython, позволяющей реализовать все взаимодействия с репозиторием Git, в том числе получение данных Git для отображения в игровом мире и исполнение команд Git, влияющих на репозиторий.

Теперь данные Git нужно отрендерить в виде физических объектов игрового мира, поэтому для этого я выделил отдельную фазу проектирования (подробнее о нём в следующем посте).

Особенно я горжусь новой системой сохранения/загрузки, хранящей состояние блоков в мире (позиции, типы и другие данные конфигурации проекта) в репозитории Git (в скрытой ссылке Git), поэтому создаваемым и изменяемым миром можно делиться с друзьями, выполняя пушинг и пуллинг из общего репозитория Git. (На будущее я запланировал режим сетевой игры для реализации многопользовательского парного программирования в одном мире).

▍ Помогаем людям изучать Git


Следующим большим этапом стала реализация туториала Git с персонажами, позволяющая новичкам изучить самые важные команды и концепции Git. Я создал дизайн персонажей, нарративные скрипты, добавил систему меню, спроектировал UI для ознакомления игрока с Git и эффективного взаимодействия с туториалом.

▍ Наводим лоск


Дальше нужно было придать игре лоск. Я не особо хорошо рисую, поэтому совместно с очень талантливым игровым художником мы выполнили редизайн всех игровых ресурсов и создали новые, в том числе массив текстур для всех типов блоков мира, все элементы меню и UI, персонажа-гида для туториала, карту мира и бесчисленное множество других фишек.

Это достаточно общий список. На некоторые из пунктов понадобилась лишь пара дней, другие потребовали месяцев работы. Над некоторыми я всё ещё продолжаю работать. Было бесконечное множество мелких задач, списка которых я не могу составить… Вот если бы существовала какая-то возможность отслеживания изменений…

Спустя месяцы работы я достиг серьёзного прогресса… но так и не смог придумать название для этого инструмента!

Что в имени?


По вполне очевидным причинам изначально мне понравилось только одно название: Gitcraft. Настолько сильно, что я импульсивно купил за $2660,16 домен gitcraft.com (как скоро станет понятно, это был достаточно спорный шаг).

И в самом деле! Git + Minecraft… Что может быть лучше?

К сожалению, через несколько месяцев я вспомнил о том, что годом раньше услышал на конференции Git — юридическое лицо, занимающееся защитой авторских прав и торговой марки Git (Software Freedom Conservancy), не очень любит, когда в название других инструментов включают слово «Git». Это логично, учитывая количество инструментов, в названии которых используется «Git» (в том числе и мой Git-Sim): это вызывает вопросы, связаны ли эти инструменты с самим Git или просто касаются его экосистемы.

На случай, если вам интересно, приведу тот самый раздел политики о торговой марке Git, запрещающий это:

Кроме того, не допускается использование любой из Торговых марок в качестве слогов в новом слове или как части словослияния (например, «Gitalicious», «Gitpedia») в качестве торговой марки стороннего продукта или сервиса без письменного разрешения Conservancy. Чтобы избежать разночтений: это требование применимо даже к сторонним торговым маркам, использующим Торговые марки в качестве слогов нового слова или части словослияния, указывающих на использование кода Git продуктом или сервисом.

Это стало главным фактором, заставившим меня выбрать другое название, но были и другие. «Gitcraft» запоминается, но приклеивает к инструменту ярлык постоянной привязки к Git. Если выбрать более обобщённое название, которое позволит в будущем расширять или менять сферу использования инструмента. Мир разработки ПО очень обширен, так что хорошей идеей будет не ограничиваться чем-то одним.

В конечном итоге, потратив столько же времени на подбор названия этого инструмента, сколько и на выбор имени своего собственного ребёнка, я остановился на Devlands. Это название подошло идеально — из него понятно, что это геймифицированный мир для разработчиков, который в процессе разработки можно всячески видоизменять. К счастью, домен devlands.com можно было купить аж за целых… $10,46.

Но… что же это вообще такое?


По сути своей Devlands — это проект, над которым я начинал работать, чтобы проверить, можно ли в буквальном смысле прогуливаться по своей собственной кодовой базе внутри увлекательного мира. Я хотел превратить нечто абстрактное навроде Git во что-то физическое, в то, что можно видеть, осязать и исследовать, а не просто читать документацию, запускать команды в терминале и работать с GUI-меню.

Сейчас Devlands разделён на два «режима»:

  1. Туториал по Git с персонажем-гидом, позволяющий новым пользователям пройтись по всем основным концепциям и командам Git или же освежить свои знания по отдельным темам.
  2. Свободный режим, в котором можно блуждать по кодовой базе и взаимодействовать с ней. Файлы, коммиты, ветви и тэги становятся блоками игры, и даже stash можно найти где-то поблизости. Игрок может прямо из игры симулировать и выполнять команды, просматривать и редактировать файлы. Есть даже ИИ-инструмент, помогающий разобраться в непонятных частях кода.

Но я не просто хотел, чтобы всё заработало, я стремился ещё и помочь людям…

Освоение абстрактной темы


Основная цель Devlands — сделать Git и кодинг более понятным для обычного пользователя, даже если у него нет или почти нет опыта в кодинге.

Концепции Git и кодинга обычно очень абстрактны, поэтому возможность наблюдать за осязаемым воплощением этих идей помогает людям быстрее освоиться. Создание этой связи необходимо для ускорения и улучшения процесса обучения, а в некоторых случаях от этого может зависеть, начнёт ли человек карьеру в сфере разработки ПО, или сдастся.

Например, если объяснять Git так:

«Git — это система управления версиями, позволяющая разработчикам отслеживать изменения в их коде и заниматься совместной работой».

то человек заскучает.

А если я объясню Git так:

«Git — это как функция отслеживания изменений в Microsoft Word, но для кодеров».

то пазл у собеседника начнёт складываться.

Чтобы усвоить абстрактные концепции, людям нужно на что-то опираться.

Я надеюсь, Devlands позволит по-новому взглянуть на мир кодинга, обеспечив разработчикам интуитивно понятный способ взаимодействия с их кодом.

Telegram-канал со скидками, розыгрышами призов и новостями IT 💻
Теги:
Хабы:
+24
Комментарии6

Публикации

Информация

Сайт
ruvds.com
Дата регистрации
Дата основания
Численность
11–30 человек
Местоположение
Россия
Представитель
ruvds