63
Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker Александр Гладыш CTO, LogicEditor

Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

  • Upload
    ontico

  • View
    150

  • Download
    5

Embed Size (px)

Citation preview

Page 1: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

Быстрое прототипированиебэкенда игры с геолокациейна OpenResty, Redis и Docker

Александр ГладышCTO, LogicEditor

Page 2: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

План доклада1. Кейс

2. Задача

3. Философия

4. План разработки

5. Docker

6. HTTP API

7. Устройство игрового мира

8. Демонстрация

9. Клиент

10. Итоги

11. Вопросы?

2 / 63

Page 3: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

Обо мне

• В разработке ПО с 2002-го,• большую часть этого времени — в геймдеве (разработка,проектирование, управление),

• вне геймдева — нагруженные интернет-решения, enterprise ПО и др.• Организатор meetup.com/Lua-in-Moscow

3 / 63

Page 4: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

Мобильные игры с геолокацией

4 / 63

Page 5: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

Цели прототипирования в общем

• Проверить ряд подходов к построению игрового процесса,• выработать новые идеи,• найти, в чём фан, а в чём — нет.

5 / 63

Page 6: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

Цели технологической части прототипирования

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

6 / 63

Page 7: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

Результаты

За два календарных месяца (менее 100 человеко-часов) разработан прототипсерверной части игры с геолокацией и рудиментарный клиент для неё.

Ведётся быстрое итерирование по вариантам построения игрового процессаи дальнейшая разработка технологической части проекта.

7 / 63

Page 8: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

О чём этот доклад?

• Доклад — технологической части проекта,• не о геймдизайне• и не о монетизации.

8 / 63

Page 9: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

Зачем этот доклад?

Делать игры с геолокацией сейчас проще чем когда-либо.

Я покажу с чего можно начать.

9 / 63

Page 10: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

Задача

• Максимально быстро написать сервер для быстрого прототипирования.• Параллельно с сервером реализовать минимальный клиент.• Проверять гипотезы уже во время написания, если возможно.• Выявить основные технические ограничения на проект.

10 / 63

Page 11: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

Стадии разработки

• Препродакшен• Продакшен• Поддержка

11 / 63

Page 12: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

Стадии разработки: Препродакшен

• Препродакшен• Поиск геймплея, эскизы, выяснение ограничений.• Более глубокая проработка удачных вариантов геймплея.• Подготовка к продакшену выбранного варианта.

12 / 63

Page 13: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

Продакшен: приоритеты разработки

• Восприятие проекта• Устойчивость ко взлому• Масштабируемость• Производительность• Стабильность• Гибкость• Скорость итерирования• Простота

13 / 63

Page 14: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

Препродакшен: время на вес золота

• Скорость итерирования• Гибкость• Простота• Восприятие проекта• Стабильность

• Производительность

• Масштабируемость

• Устойчивость ко взлому

14 / 63

Page 15: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

Фокус на скорость и лёгкость разработки

• Механизмы, а не решения.• Лучше быстро чем правильно.• Много коротких итераций.

15 / 63

Page 16: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

Лучше быстро чем правильно. Переориентацияперфекционизма

• Чем меньше кода тем лучше.• Плохой код лучше сложного.• Хаки в механизмах допустимы, хаки в решениях — нет.• Рефакторить нужно только то, что болит.

16 / 63

Page 17: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

Основные этапы разработки

• Выбор геймплея пилотного прототипа.• Выбор технологического стека.• Реализация минимального пилотного прототипа.• Итерирование с гейм-дизайнерами.

17 / 63

Page 18: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

Выбор геймплея пилотного прототипа: Задачи

• Максимально простой• но играбельный• повод реализовать все базовые игровые сущности и механизмыпрототипа.

18 / 63

Page 19: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

Геймплей первого прототипа

• Игрок, перемещаясь по карте, ищет расставленных на ней мобов;• найдя моба может попробовать его поймать с заданной вероятностьюуспеха;

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

19 / 63

Page 20: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

Критерии выбора технологического стека

• Что-то знакомое, на чём можно написать быстро,• или что-то интересное и зажигающее.• Главное не забыть вовремя выбросить весь код.

20 / 63

Page 21: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

Технологический стек

• Сервер:• Redis,• OpenResty,• Docker.

• Клиент:• Одностраничное веб-приложение в браузере,• HTML5.

21 / 63

Page 22: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

Почему не что-то готовое?

Not Invented Here Syndrome?

И да и нет.

22 / 63

Page 23: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

Redis

• Надёжное, хорошо зарекомендовавшее себя решение.• Работа с координатами из коробки:

• GEOADD key longitude latitude member• GEORADIUS key longitude latitude radius m

• Достаточно удобный набор примитивов для хранения игровых объектов.• Хранимые процедуры на Lua.

23 / 63

Page 24: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

OpenResty

• Дистрибутив nginx с поддержкой Lua, Redis и многим другим из коробки.• Очень быстро работает, достаточно дружелюбен, хорошоподдерживается.

• Пригоден как для быстрого прототипирования, так и для продакшена.

24 / 63

Page 25: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

Docker

• Воспроизводимая кроссплатформенная среда для разработки.• Хорошо снимает боль по настройке окружения разработчика.• Окружение разработчика можно быстро превратить в прототипсерверного окружения.

• Требует обновления до достаточно свежей версии.

25 / 63

Page 26: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

Браузер, HTML5

• На начальном этапе сервер важнее.• Бои в augmented reality и прочие рюшечки делать не нужно, можнопредставлять в голове.

• На HTML5 можно быстро написать дёшевый и сердитый клиент.• Есть ограниченный (но достаточный) доступ к данным геолокации.

26 / 63

Page 27: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

Docker: как установить на Ubuntu

• В Ubuntu, традиционно, старая версия.• За wget | sh больно бьём по рукам.• docker и docker-machine устанавливаем из apt-репозитория докера.• docker-compose устанавливаем через pip install.• Про установку на других платформах читаем официальнуюдокументацию.

27 / 63

Page 28: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

Docker на машине разработчика

Клиент

localhost:8080

OpenResty

Redis

28 / 63

Page 29: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

docker-compose.yml для разработки: Redis

version: "2"services:redis:

image: redisvolumes:- ./redis:/data

command: redis-server --appendonly yesopenresty: <...>

29 / 63

Page 30: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

OpenResty: интересные места nginx.conf (в сокращении)

error_log logs/error.log notice;http {include resolvers.conf;lua_package_path "$prefix/lualib/?.lua;;";lua_code_cache off; # TODO: Enable on production!server {

listen 8080;include mime.types;default_type application/json;location / { index index.html; root static/; }location = /api/v1/ { content_by_lua_file 'api/index.lua'; }

}}

30 / 63

Page 31: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

OpenResty: Dockerfile

FROM openresty/openrestyCOPY bin/entrypoint.sh /usr/local/bin/openresty-entrypoint.shCOPY nginx/conf /usr/local/openresty/nginx/confCOPY nginx/lualib /usr/loca/openresty/nginx/lualibCOPY nginx/lua /usr/loca/openresty/nginx/luaCOPY nginx/static /usr/loca/openresty/nginx/staticENTRYPOINT /usr/local/bin/openresty-entrypoint.sh

31 / 63

Page 32: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

OpenResty: entrypoint.sh

#!/bin/shgrep nameserver /etc/resolv.conf \| awk '{print "resolver " $2 ";"}' \> /usr/local/openresty/nginx/conf/resolvers.conf

/usr/local/openresty/bin/openresty -g 'daemon off;' "$@"

32 / 63

Page 33: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

docker-compose.yml для разработки: OpenResty

<...>openresty:

build: .ports:- "8080:8080"

volumes:- ./nginx/lualib:/usr/local/openresty/nginx/lualib:ro- ./nginx/api:/usr/local/openresty/nginx/api:ro- ./nginx/static:/usr/local/openresty/nginx/static:ro

links:- redis

33 / 63

Page 34: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

Вызовы API

• Пользовательские вызовы:• / состояние игрового мира,• /go/:go-id/ состояние игрового объекта,• /go/:go-id/act/:action-id выполнение действия.

• Системные вызовы:• /register создание пользователя,• /reset сброс базы в исходное состояние,• /patch апгрейд базы до текущей версии.

• NB: Админку (бэкофис) не делаем, используем внутриигровые механикидля администрирования игрового мира.

34 / 63

Page 35: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

Игровой объект

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

35 / 63

Page 36: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

Цепочка прототипов

• Игровой объект может иметь прототип.• Игровой объект — прототип в свою очередь также может иметьпрототип.

• Игровой объект наследует характеристики и действия своих прототипов.

36 / 63

Page 37: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

Характеристики

• Характеристика — именованное численное свойство игрового объекта.• Если у игрового объекта нет какой-то характеристики, её значениеберётся у ближайшего прототипа по цепочке (если не нашли — 0).

37 / 63

Page 38: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

Действия

• Действие на игровом объекте — идентификатор из таблицыобработчиков действий.

• Действие может быть инициировано игроком, если у него достаточно наэто прав.

38 / 63

Page 39: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

Моб: Зелёная Жаба{id = 'proto.mob.collectable';chrs = { respawn_dt = 10 * 60 };actions = { 'mob.collect' };

};{id = 'proto.mob.toad.green';proto_id = 'proto.mob.collectable';chrs = { escape_chance = 0.25 };

};{id = 'fa2eb7bca46c11e6be447831c1cebc82';proto_id = 'proto.mob.toad.green';geo = { lat = 55.7558, lon = 37.6173 };

};39 / 63

Page 40: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

Действие: поймать мобаACTIONS['mob.collect'] = function(target, initiator)if

math.random() * initiator.chrs.collect_skill >target.chrs.escape_chance

then-- Inc number of catches for this mob typego_inc_chr(initiator.id, target.proto_id, 1)go_schedule_action_initiation( -- Schedule respawntarget.chrs.respawn_dt, 'mob.spawn',{ proto_id = target.proto_id, pos = target.pos },initiator.id

)go_remove(target.id) -- Mob is caught, remove

endend

40 / 63

Page 41: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

Выполнение отложенных действий

local timestamp = os.time()local action_ids = redis:zrangebyscore('da', '-inf', timestamp)for i = 1, #action_ids do-- Execute action_ids[i] action

endredis:zremrangebyscore('da', '-inf', timestamp)

41 / 63

Page 42: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

Игрок

{id = 'proto.user';chrs = { vision = 100, reach = 50 };

};{id = 'user.1';geo = { lat = 55.7558, lon = 37.6173 };chrs = { collect_skill = 0.5 };

};

42 / 63

Page 43: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

Предмет: Админская шапка

{id = 'proto.item.wearable';actions = {

['item.don'] = { enabled = true };['item.doff'] = { enabled = false };

};}{id = 'proto.item.admin-hat';proto_id = 'proto.item.wearable';grants = { 'user.admin' };chrs = { collect_skill = 0.25 };

};

43 / 63

Page 44: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

Выдадим админскую шапку пользователю

local hat = go_new('proto.item.admin-hat')

assert(go_get('user.1').stored[1] == nil)

go_store('user.1', hat.id)

assert(go_get('user.1').stored[1] == hat.id)

44 / 63

Page 45: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

Хранение (”storage”)

• Игровой объект может ”хранить” другие объекты.• Хранимые объекты не ”видны” извне хранящего объекта.• Пользователю доступны действия непосредственно хранимых имобъектов.

• Характеристики хранимых объектов никак не влияют на характеристикихранящих их объектов.

45 / 63

Page 46: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

Действия на админской шапке

ACTIONS['item.don'] = function(target, initiator)go_unstore(initiator.id, target.id)go_attach(initiator.id, target.id)go_disable_action(target.id, 'item.don')go_enable_action(target.id, 'item.doff')

end

ACTIONS['item.doff'] = function(target, initiator)go_attach(initiator.id, target.id)go_store(initiator.id, target.id)go_disable_action(target.id, 'item.doff')go_enable_action(target.id, 'item.don')

end

46 / 63

Page 47: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

Прикрепление / надевание (”attachment”)

• К игровому объекту могут быть ”прикреплены” другие объекты.• Прикреплённые объекты видны извне родительского объекта.• Пользователю доступны действия прикреплённых непосредственно кнему объектов.

• Характеристики прикреплённых объектов прибавляются кхарактеристикам родительских объектов.

47 / 63

Page 48: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

Предмет: Спавнилка зелёных жаб

{id = 'proto.item.spawner.toad.green';actions = {

['mob.spawn'] = {requires = { 'user.admin' };param = { proto_id = 'proto.mob.toad.green' };

};};

};

48 / 63

Page 49: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

Права на действия

• Действие доступно для выполнения только если grants игрокасодержит все записи из requires действия.

• Прикреплённые к игроку (”надетые”) предметы добавляют ему своиgrants.

49 / 63

Page 50: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

Демонстрация

• Текущую версию приложения вы можете найти на geo.logiceditor.com.• Ссылка на репозиторий с кодом будет опубликована там же на этойнеделе, следите за анонсами в Twitter @agladysh.

• Самый первый клиент — всегда curl. API можно пощупать им, добавивк адресу приложения /api/v1.

50 / 63

Page 51: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

Как работает клиент?

• Инициализируются геолокация и гуглекарты.• Текущая позиция отправляется на сервер.• Сервер возвращает перечень видимых объектов с возможнымидействиями.

• Объекты помечаются маркерами на карте и выводятся под ней вёрсткой.• Ожидаем активации действия пользователем либо смены координат.

NB:• Для генерации имён жаб на основе их идентификаторов используетсяchance.js.

• Перерисовку лучше проводить по таймеру, вне зависимости от циклаобновления данных.

51 / 63

Page 52: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

Геолокация на HTML5

• navigator.geolocation.watchPosition(callback, options).• В Chrome пользуйтесь панелью разработчика Sensors для отладкигеолокации.

• В Chrome по соображением безопасности отключена геолокация дляпротокола HTTP (за исключением сайтов на localhost). ИспользуйтеHTTPS, например, с сертификатами от Let’s Encrypt.

52 / 63

Page 53: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

Google Maps

new google.maps.Map(assert(document.getElementById('map')), {center: new google.maps.LatLng(pos.lat, pos.lon),zoom: 18,mapTypeId: google.maps.MapTypeId.ROADMAP,disableDefaultUI: true,disableDoubleClickZoom: true,draggable: false,scrollwheel: false,styles: [ { featureType: "poi",

stylers: [ { visibility: "off" } ]} ]

});

53 / 63

Page 54: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

Проблемы проекта

• Шумные данные от GPS.• Крайне низкая точность геолокации в зданиях.• ...

54 / 63

Page 55: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

Проблемы Технические ограничения проекта

• Шумные данные от GPS.• Крайне низкая точность геолокации в зданиях.• ...

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

55 / 63

Page 56: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

Недостающие механизмы

• Самое крупное — система событий.• Много мелких функций, например счётчик пройденных метров.

56 / 63

Page 57: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

Ошибки

• Поздновато добавили геолокациию.• Поздновато добавили карту в клиенте.• Мало выходили на улицу чтобы тестировать.• ...• Найдите сами, сравнив код на слайдах с кодом в проекте.

57 / 63

Page 58: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

Итоги

• Относительно малыми усилиями• мы сделали крошечную мобильную игру с геолокацией• и заложили фундамент для быстрой разработки большого числанесложных прототипов

• для поиска удачных вариантов геймплея в этом жанре.

58 / 63

Page 59: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

Благодаря чему разработка быстрая?

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

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

59 / 63

Page 60: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

Векторы развития проекта

• Новые варианты геймплея• Новые функции и механизмы• Решение технических проблем

60 / 63

Page 61: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

Как работать с гейм-дизайнером на ранних этапахпрототипирования?

• Быстро итерироваться. В идеале — садиться рядом, кодить и сразуполучать фидбек. Пробовать самому иногда делать рутинную частьработы гейм-дизайнера, чтобы лучше понять, что именно мешает итормозит процесс.

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

• Если для новой геймплейной фичи нет механизма, добавлять его, хотябы в самой грубой форме, а не реализовывать решение в лоб.

• Все прочие задуманные изменения в коде, в том числе рефакторинг,реализовывать в порядке убывания боли от их отсутствия.

61 / 63

Page 62: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

Дорога к релизу

• Выбросить весь код и написать заново.• Создать новый проект и вдумчиво вручную перенести в него удачныечасти кода.

• Неудачные — переписать с нуля.

62 / 63

Page 63: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)

Вопросы?

@[email protected]

meetup.com/Lua-in-Moscow