– Привет, Хабр! Меня зовут Женя, и я – проектный наркоман.
– (нестройный ряд голосов) Привет, Женя!
После такого вступления обычно следуют упоминания работы до поздней ночи в будние дни и сутки напролёт в выходные, подсчёт килограммов съеденного джанк-фуда, красочные описания бессонных ночей перед дедлайном, а в конце та пустота и отрешённость, что наступают после окончания проекта… И всё это будет дальше по тексту, но сперва немного предыстории.
Я – разработчик в Dodo Pizza Engineering. Многие ребята из нашей команды участвуют в различных сайд-проектах. В прошлом году, например, это был телеграм-квест про курьера CMAN, который был приурочен к московскому DotNext 2018. В этом году мы решили продолжить традицию и сделать ещё одну игру уже к DotNext 2019. Итак, был сентябрь, до конференции оставалась пара месяцев, и нам срочно нужен был план.
Мы понимали, что повторить прошлогоднюю историю не получится. Во-первых, тогда был первый раз, а первый раз по определению неповторим. Во-вторых, и это, наверное, самое главное – тот проект разрабатывался несколько месяцев. А за несколько недель до мероприятия разработчики вообще ушли делать его на фултайм.
Что ж, наша цель была скромнее: у нас было меньше людей, короче сроки и слишком много основной работы, чтобы заниматься игрой в рабочее время. В совместном мозговом штурме кто-то предложил создать IT-вариацию популярной много лет назад игры «Алхимия».
Напомню вкратце для тех, кто не застал те времена: у игрока есть начальное количество элементов (обычно 4), комбинируя их можно собирать всё новые и новые, которые становятся всё сложнее. Задача игрока: открыть все элементы. В оригинальной «Алхимии» конечное число элементов доходило до нескольких десятков тысяч.
Скриншот той самой «Алхимии» 2013 года
Наша задумка казалась мне идеальным проектом на месяц по трём причинам:
Что нужно сделать в первую очередь, чтобы собрать жизнеспособный проект за месяц? Правильно – порезать скоуп! По сути, вся наша работа прекрасно делилась на четыре блока:
Наша основная концепция не отличалась от оригинала 2013 года: у игрока есть 4 базовых элемента, всего можно собрать ещё N элементов. У каждого элемента должны быть: название, картинка и художественное описание. Любой новый элемент собирается только из двух других ранее открытых.
Чтобы не допустить мошенничества, всю информацию по комбинациям элементов мы хранили на бэкенде. Клиент отправлял запрос из ID двух элементов, которые игрок пытался соединить, а сервер возвращал, успешно такое сочетание или нет. В случае успеха на клиент уходил ID нового элемента, его имя и описание. По имени клиент находил нужную картинку, и новый элемент появлялся у игрока. То есть все данные, необходимые для игры, хранил бэкенд.
Ещё мы запланировали таблицу рекордов для топ-20 игроков, которые получили призы, так как за каждый собранный элемент назначалось какое-то количество очков. Вот, собственно, и всё.
Естественно, в процессе многочисленных обсуждений в голову приходили самые разнообразные хотелки, от которых мы благоразумно отказались. Вот некоторые из них:
Что ж, мы великолепно порезали наши технические задачи, мы успевали чётко в срок, ещё и с запасом. Трудовые будни были спасены, ни один рабочий проект не пострадал (чего не скажешь о моих вечерах и выходных).
Мои ощущения до того, как я увидел, что у нас творится с контентом
Уверенность за техническую составляющую сыграла злую шутку в случае со вторым, творческим ингредиентом игры – контентом. Тут мы сделали две ошибки: не выбрали ответственного и взяли слишком большой круг тем для генерации пар слов, который не смогли прожевать. Детали:
Те самые бобы, а ещё киберпчела (!), любопытство и бревно. Что бывает, когда фантазия побеждает здравый смысл
Долго ли, коротко, но дней за десять до DotNext наша «IT-алхимия» начала превращаться в рабочий продукт. У нас наконец появились окончательные сочетания слов. Дизайнеру Тане не приходилось перерисовывать картинки по 10 раз. Бэкенд всегда был молодцом и уверенно шёл к намеченному функционалу, а следом за ним я дорабатывал и наш Unity-клиент.
Пришла пора начать публиковать наше приложение в сторы. Каких-то проблем с Google Play я не ожидал, у меня уже был опыт публикации полноценных приложений, а вот Apple Store, судя по рассказам коллег, начинал внушать опасения. И эти опасения оказались не напрасными.
Мы опубликовали тестовые сборки и для Android, и для iOS, сначала потестировали сами, а потом позвали ещё коллег. Практически все баги я отловил, ещё когда тестировал сам. Правда, была одна проблема со скоростью анимации на iOS устройствах, которую я долго не мог отловить, потому что на эмуляторе у меня всё работало хорошо. Но об этом я надеюсь рассказать во второй статье, посвященной технической части нашего проекта.
Большинство же того, что пришлось исправлять, касалось вёрстки – то «чёлка» на кнопку заедет, то неправильно растягивается окошко при различных соотношениях сторон экрана. Это была довольно муторная и не самая интересная часть работы, но в итоге мы привели дизайн в согласованность со всеми возможными экранами. К сожалению, мы уделили большую часть времени экрану игры и проглядели один большой косяк… Но он оказался настолько глупым и провальным, что достоин отдельного абзаца.
Итак, буквально за три дня до конференции у нас был набор из 128 слов, готовые бэкенд и клиенты, собранные под Android и iOS. Пора уже публиковать публичные версии. С Google Play всё прошло как по маслу. А вот с Apple Store нас ожидали непредвиденные сложности.
Тем временем в Apple: «Что бы еще придумать, чтобы не дать ребятам зарелизиться?»
Меня предупреждали, что выкладка в стор – это что-то страшное, но я не понимал насколько. Сначала нам предъявили, что мы азартная игра (gambling), затем нас реджектили с какими-то очень странными причинами: «Ваше приложение – это не приложение, а web view». После третьего или четвертого реджекта мы просто начали писать в ответ: «Нет, это не web view, нет, у нас есть контент и приложение делает что-то полезное».
Оставалась последняя ночь перед DotNext и последняя попытка всё-таки опубликовать приложение. Чудо, случись! Я плохо спал, примерно как в детстве перед Днём рождения. Хотелось проснуться, заглянуть в портал разработчика Apple и увидеть там зелёную галочку. Увы, чуда не произошло.
DotNext прошёл. Для Android игру скачало 146 человек. Еще 43 прорвалось через публичный beta-тест для iOS. Мы сделали чатик для игроков. Большинство поигравших остались довольны (мы не получили прям отрицательных отзывов), призы нашли своих победителей. Ну а на меня, как всегда, практически одновременно обрушились облегчение и опустошение.
Вот, спустя больше месяца, меня подотпустило, и я написал этот постмортем. Что ж, нам не удалось избежать факапов. Но мы добились своей цели – реализовали полноценный проект за месяц без отрыва от работы и удачно запустили его на конференции. Научила ли меня чему-то эта история? Может, пора остановиться и завязать с проектной работой? Сложно сказать, дождемся следующей конференции!
– (нестройный ряд голосов) Привет, Женя!
После такого вступления обычно следуют упоминания работы до поздней ночи в будние дни и сутки напролёт в выходные, подсчёт килограммов съеденного джанк-фуда, красочные описания бессонных ночей перед дедлайном, а в конце та пустота и отрешённость, что наступают после окончания проекта… И всё это будет дальше по тексту, но сперва немного предыстории.
Я – разработчик в Dodo Pizza Engineering. Многие ребята из нашей команды участвуют в различных сайд-проектах. В прошлом году, например, это был телеграм-квест про курьера CMAN, который был приурочен к московскому DotNext 2018. В этом году мы решили продолжить традицию и сделать ещё одну игру уже к DotNext 2019. Итак, был сентябрь, до конференции оставалась пара месяцев, и нам срочно нужен был план.
FYI: это первая часть статьи про «IT-алхимию». В следующей части будут технические подробности разработки игры.
План идеального проекта
Мы понимали, что повторить прошлогоднюю историю не получится. Во-первых, тогда был первый раз, а первый раз по определению неповторим. Во-вторых, и это, наверное, самое главное – тот проект разрабатывался несколько месяцев. А за несколько недель до мероприятия разработчики вообще ушли делать его на фултайм.
Что ж, наша цель была скромнее: у нас было меньше людей, короче сроки и слишком много основной работы, чтобы заниматься игрой в рабочее время. В совместном мозговом штурме кто-то предложил создать IT-вариацию популярной много лет назад игры «Алхимия».
Напомню вкратце для тех, кто не застал те времена: у игрока есть начальное количество элементов (обычно 4), комбинируя их можно собирать всё новые и новые, которые становятся всё сложнее. Задача игрока: открыть все элементы. В оригинальной «Алхимии» конечное число элементов доходило до нескольких десятков тысяч.
Скриншот той самой «Алхимии» 2013 года
Наша задумка казалась мне идеальным проектом на месяц по трём причинам:
- Технически понятные задачи: развернуть бэкенд-сервер, написать клиент для телефонов, нарисовать интерфейс и картинки элементов.
- Слова из IT-тематики так и просятся, чтобы их комбинировали друг с другом (хе-хе, если бы).
- Задача, которую я лично поставил для себя: делать игру только в свободное от работы время, в выходные, не сильно напрягаясь. Повторять прошлогодний опыт мы точно не хотели.
Правила сборки: успеть за 30 дней
Что нужно сделать в первую очередь, чтобы собрать жизнеспособный проект за месяц? Правильно – порезать скоуп! По сути, вся наша работа прекрасно делилась на четыре блока:
- Бэкенд-сервер. За нее отвечал Миша Кумачев (Ceridan), который проектировал бэкенд для CMAN.
- Unity-клиенты для Android и iOS. Эта часть была на мне, потому что у меня за плечами уже был десяток прототипов и две опубликованных игры в Google Play.
- Дизайн интерфейса и значков, этим занималась Таня Турманидзе.
- И… контент для игры. А вот у этого блока долгое время не было владельца. И это была, пожалуй, самая главная (и самая очевидная) наша ошибка.
Наша основная концепция не отличалась от оригинала 2013 года: у игрока есть 4 базовых элемента, всего можно собрать ещё N элементов. У каждого элемента должны быть: название, картинка и художественное описание. Любой новый элемент собирается только из двух других ранее открытых.
Чтобы не допустить мошенничества, всю информацию по комбинациям элементов мы хранили на бэкенде. Клиент отправлял запрос из ID двух элементов, которые игрок пытался соединить, а сервер возвращал, успешно такое сочетание или нет. В случае успеха на клиент уходил ID нового элемента, его имя и описание. По имени клиент находил нужную картинку, и новый элемент появлялся у игрока. То есть все данные, необходимые для игры, хранил бэкенд.
Ещё мы запланировали таблицу рекордов для топ-20 игроков, которые получили призы, так как за каждый собранный элемент назначалось какое-то количество очков. Вот, собственно, и всё.
Умерь свой пыл, преодолей соблазны делать лишнее
Естественно, в процессе многочисленных обсуждений в голову приходили самые разнообразные хотелки, от которых мы благоразумно отказались. Вот некоторые из них:
- Была идея добавить систему ачивок, когда игрок собирал какую-то ветку элементов, сложный элемент или набор. После того, как мы поняли, что с придумыванием элементов дела обстоят далеко не так радужно, как мы рассчитывали, от этой идеи отказались. Ачивки имели бы смысл на масштабе тысячи элементов, а в реальность у нас их оказалось сильно меньше.
- Кто-то предлагал выделять особым образом те элементы, которые уже нельзя использовать в комбинациях. Однако предварительные тесты показали, что такой необходимости нет.
- Технический момент. В финальной реализации все картинки зашиты внутри Unity-клиента. То есть, чтобы обновить или дополнить контент, необходимо обновлять сборку в сторах. Была мысль вынести картинки на CDN, чтобы клиент подтягивал данные с бэкенда, а картинки с CDN. Тогда это был бы практически «тонкий» клиент с симпатичным интерфейсом. Если бы мы успели это сделать, то игра была бы бесконечно расширяемой с постоянной возможностью догружать какие-то новые наборы элементов. Но мы отрезвляли себя тем, что игра создавалась на два дня… Соблазн был, но мы его успешно преодолели.
Что ж, мы великолепно порезали наши технические задачи, мы успевали чётко в срок, ещё и с запасом. Трудовые будни были спасены, ни один рабочий проект не пострадал (чего не скажешь о моих вечерах и выходных).
Мои ощущения до того, как я увидел, что у нас творится с контентом
Никогда не шути с контент-бобами
Уверенность за техническую составляющую сыграла злую шутку в случае со вторым, творческим ингредиентом игры – контентом. Тут мы сделали две ошибки: не выбрали ответственного и взяли слишком большой круг тем для генерации пар слов, который не смогли прожевать. Детали:
- После первого мозгового штурма мы решили, что элементы нашей Алхимии будут относиться к трём темам: IT, фудтех и что-нибудь из мира Додо. И от этой идеи мы отказались далеко не сразу. Слова и сочетания генерились одновременно по трём направлениям, и хотя это было весело, как-то не сразу пришло осознание того, что у всех трёх тем не так много точек пересечения. В какой-то момент мы всё же поняли, что получается что-то не то, отбросили футдех и оставили от Додо самое-самое (пиццу, разумеется). Уже после этого что-то начало выкристаллизовываться. Но тут сыграл свою роль второй момент.
- Выше я писал, что у процесса по составлению контента не было владельца. Первые слова придумывались различными группами людей, которые накидывали просто всё, что приходило в голову. Так в нашем списке оказались такие странные вещи как «школота», «бобы» или «сын маминой подруги». (И да, можно было притянуть «бобы» к JavaBeans, но… не надо так.) Уже в середине проекта, когда наше дерево слов так и не смогло прижиться на почве логики, появился оунер – Антон Бружмелёв, выкинул почти все придуманные ранее слова и составил новые, более логичные сочетания.
- Но два пункта выше привели к тому, что на придумывание контента оставалось слишком мало времени. В итоге у нас получилось всего 128 элементов. Правда, из наших добровольных тестировщиков в лице коллег, собрать все элементы за несколько дней смогла только одна девушка. Это нас успокоило. Но мы явно не учли степень упорства и решимости людей, которые боролись за призы на конференции.
Те самые бобы, а ещё киберпчела (!), любопытство и бревно. Что бывает, когда фантазия побеждает здравый смысл
Контент – это самая важная часть игры, именно он цепляет или не цепляет игрока. Работу над контентом можно и нужно начинать даже раньше технических работ. Ну и всегда должен быть ответственный, который своей безжалостной рукой отсечёт всё ненужное и оставит только то, что складывается в цельную картину.
So far so good или проблемы с Apple
Долго ли, коротко, но дней за десять до DotNext наша «IT-алхимия» начала превращаться в рабочий продукт. У нас наконец появились окончательные сочетания слов. Дизайнеру Тане не приходилось перерисовывать картинки по 10 раз. Бэкенд всегда был молодцом и уверенно шёл к намеченному функционалу, а следом за ним я дорабатывал и наш Unity-клиент.
Пришла пора начать публиковать наше приложение в сторы. Каких-то проблем с Google Play я не ожидал, у меня уже был опыт публикации полноценных приложений, а вот Apple Store, судя по рассказам коллег, начинал внушать опасения. И эти опасения оказались не напрасными.
Мы опубликовали тестовые сборки и для Android, и для iOS, сначала потестировали сами, а потом позвали ещё коллег. Практически все баги я отловил, ещё когда тестировал сам. Правда, была одна проблема со скоростью анимации на iOS устройствах, которую я долго не мог отловить, потому что на эмуляторе у меня всё работало хорошо. Но об этом я надеюсь рассказать во второй статье, посвященной технической части нашего проекта.
Большинство же того, что пришлось исправлять, касалось вёрстки – то «чёлка» на кнопку заедет, то неправильно растягивается окошко при различных соотношениях сторон экрана. Это была довольно муторная и не самая интересная часть работы, но в итоге мы привели дизайн в согласованность со всеми возможными экранами. К сожалению, мы уделили большую часть времени экрану игры и проглядели один большой косяк… Но он оказался настолько глупым и провальным, что достоин отдельного абзаца.
Итак, буквально за три дня до конференции у нас был набор из 128 слов, готовые бэкенд и клиенты, собранные под Android и iOS. Пора уже публиковать публичные версии. С Google Play всё прошло как по маслу. А вот с Apple Store нас ожидали непредвиденные сложности.
Тем временем в Apple: «Что бы еще придумать, чтобы не дать ребятам зарелизиться?»
Меня предупреждали, что выкладка в стор – это что-то страшное, но я не понимал насколько. Сначала нам предъявили, что мы азартная игра (gambling), затем нас реджектили с какими-то очень странными причинами: «Ваше приложение – это не приложение, а web view». После третьего или четвертого реджекта мы просто начали писать в ответ: «Нет, это не web view, нет, у нас есть контент и приложение делает что-то полезное».
Оставалась последняя ночь перед DotNext и последняя попытка всё-таки опубликовать приложение. Чудо, случись! Я плохо спал, примерно как в детстве перед Днём рождения. Хотелось проснуться, заглянуть в портал разработчика Apple и увидеть там зелёную галочку. Увы, чуда не произошло.
Про факапы и кота
- Стартовый экран и контрольный
в головуреджект от Apple.
Это моя персональная боль. Потому что недоглядел. Времена игр начала 2000-х, когда стартовый экран копировал полку с настольными играми или имитировал игровую комнату, давно прошли. Однако у нас был именно такой.
Экран старта получился перегруженным. И он полностью выбивался, как из стилистики игры, так и из своего прямого назначения – как можно скорее дать человеку возможность поиграть. Даже в логике нашей проектной работы игрок только один раз видел стартовый экран при регистрации. При повторных запусках открывался сразу основной игровой экран.
Сама картинка была замечательной, в ней были детали, в ней был котик… и ещё в ней было чересчур маленькое поле для ввода, в которое не все могли попасть пальцем. Не все желающие поиграть справлялись со стартовым экраном, поэтому мы потеряли уже на старте какой-то процент игроков.
Но самым неприятным фейлом стала причина, по которой Apple зареджектил нас в последний раз: на iPad (соотношение сторон которого гораздо ближе к квадрату, чем на всех других устройствах, что мы рассматривали) стартовая картинка масштабировалась так, что котик залезал на кнопку «ОК», и человек физически не мог на неё нажать.
Кот здорового человека и коткурильщикана iPad
Мы, конечно, совсем не рассчитывали, что наши игроки будут играть на iPad, но факт котовьей башки блокирующей старт игры был неоспоримым. Чтобы не отрезать часть аудитории, пришлось пойти более сложным путём: мы честно объявили, что у Apple драконовская политика, и они реджектнули нас, но предложили всем желающим зарегистрироваться на публичное тестирование и поучаствовать в игре таким способом.
Самое обидное, что практически всё время разработки я использовал простейший стартовый экран с чёрным фоном, большим полем ввода и кнопкой «ОК», которую ничто не блокировало.
Какая мораль из всей этой истории? В нашем случае мы затратили больше усилий и сделали всё только хуже. Лучше – проще. Ты направляешь энергию в правильное русло и получаешь нужный результат, а если начинаешь мудрить, то к тебе приходит вселенская карма и больно бьёт по голове.
- Второй факап случился с конечным количеством элементов в игре. Как я писал выше, только один человек из всех наших тестеров собрал за несколько дней все элементы. Но наши тестировщики играли урывками в перерывах между работой и немного по вечерам. А вот наши реальные игроки на DotNext были полны решимости завоевать призовые места, поэтому уже к середине первого (!) дня у нас определилась вся тройка финалистов. То есть эти люди, не щадя своих пальцев, протыкали все 128, а точнее 133 элемента.
Упс, откуда 133, если всё время до этого я говорил про 128? Как завзятому проектному наркоману, в последний момент мне захотелось впилить в игру что-нибудь эдакое. Поэтому дизайнер Таня нарисовала, а я в тайне от других участников проекта добавил ещё пять элементов-пасхалок про людей, которые так или иначе были связаны с разработкой игры. А общее число элементов, которое показывалось игроку, было для простоты захардкожено. В результате игроки собирали только 128 элементов (а это не максимальное количество очков) и думали, что это всё.
Великолепная пятёрка в виде пасхальных элементов
Вместо эпилога
DotNext прошёл. Для Android игру скачало 146 человек. Еще 43 прорвалось через публичный beta-тест для iOS. Мы сделали чатик для игроков. Большинство поигравших остались довольны (мы не получили прям отрицательных отзывов), призы нашли своих победителей. Ну а на меня, как всегда, практически одновременно обрушились облегчение и опустошение.
Вот, спустя больше месяца, меня подотпустило, и я написал этот постмортем. Что ж, нам не удалось избежать факапов. Но мы добились своей цели – реализовали полноценный проект за месяц без отрыва от работы и удачно запустили его на конференции. Научила ли меня чему-то эта история? Может, пора остановиться и завязать с проектной работой? Сложно сказать, дождемся следующей конференции!
В офлайн версию нашей «IT-алхимии», уже без таблицы рекордов и с исправленным стартовым экраном вы можете поиграть, скачав её в Google Play.