С появлением у меня в первом классе Dendy вопрос кем я стану отпал сам собой буквально через пару недель — программистом конечно же. Я долго и упорно шел к этому, невзирая на отсутствие информатики в школе, работал в техподдержке известного всем регистратора параллельно с учебой в институте, но полноценная жизнь началась лишь в тот момент, когда меня наконец-то взяли хоть куда-то писать код.
Очень скоро я понял, что мало быть программистом, работающим от звонка до звонка и получающим за это деньги на карточку — всё самое интересное начинается, когда решаешь сам без всяких архитекторов, тестировщиков и тимлидов что-нибудь этакое написать и заставить работать. Желательно что-нибудь веселое и захватывающее. Игру, например.
Под катом лежат семеро очевиднейших (как мне сейчас кажется) граблей, неожиданно вставших у меня на пути, а потому способных с отличной от нуля вероятностью встать на пути любого, идущего дорогой разработки игр.
Всю свою жизнь я играл в компьютерные игры. Начал ещё в те времена, когда с десяток их помещалось на одной дискете 1.44 Мб. Никогда не понимал тех, кто говорит, что игры — это уход от реальности и повод для излишнего воображения о себе того, чего нет на самом деле. По-моему игры — это тренировка концентрации, разжигание жажды познания, практика в управлении ресурсами и тренажёр целеустремлённости. Неудивительно, что уже в первом классе я точно знал кем стану — программистом. И я им стал.
За те несколько последних лет, что я успел поработать по специальности, мне встретилось много интересных людей. Почему-то больше всего мне запали в душу два программиста, никак друг с другом не связанные; оба они пламенно мечтали изучить мобильные платформы, чтобы затем писать свои приложения. Как позже каждый из них честно признался, в игры ни один, ни другой никогда не играли, не играют, играть не собираются и вообще находят это занятие бестолковым, для малышей. На мой вполне резонный вопрос (заданный чуть ли не при первом знакомстве) что они собираются писать, когда наконец поймут, что готовы взяться за разработку собственного проекта под мобильные платформы, оба без тени сомнения заявили: «игры, конечно же».
Я тоже всегда мечтал выпустить собственную игру. И если бы кто-нибудь сказал мне 20 лет назад, что в будущем не надо будет иметь целый холдинг, чтобы делать это, я бы, наверное, меньше играл и больше занимался.
С момента появления рынка мобильных приложений прошло уже немало времени. Но пока я жил в подмосковье, у меня вечно находились более приоритетные занятия, нежели изучение этих самых мобильных платформ и выпуск приложения хотя бы для одной из них. Сначала я долго копил на телефон на android'е, параллельно заканчивая учёбу и не забывая поигрывать то в Starcraft II, то в Tropico 3; потом весь был поглощён трудом разработчика в разных не имеющих никакого отношения к мобильному рынку компаниях, а вечера неизменно просиживал за World Of Tanks. И вот однажды с моей семьёй случилось чудо, о котором мы давно мечтали — мы с женой и полугодовалым сыном переехали из подмосковья в карельский посёлок с населением в 3 тыс. человек, а работать стали удаленно. Высвободившиеся 4 часа времени, затрачиваемые ранее на дорогу, было решено на этот раз не тратить впустую.
Концепция
Конечно же я решил начать с чего-нибудь попроще, поэтому выбрал для своей затеи игральные карты — они являют собой чуть ли не идеальный тренажёр ООП. Java я к тому времени знал, а вот от любого C-языка меня почему-то воротило, поэтому приложение было решено выпустить под Android. Тем более, что эмуляторам я не очень-то доверял, а единственным моим физическим устройством был HTC Explorer с андроидом 2.3.3 на борту и 20 Мб свободной памяти.
Засучив рукава, я полез в маркет смотреть и сравнивать приложения конкурентов. Признаюсь, первое впечатление у меня было такое, что все эти игры делают те самые мои товарищи — люди, малозаинтересованные в играх. Ну или небольшие конторки, где директор имеет посторонний доход и чтобы капитал вращался, решил выпускать приложения, поскольку это сейчас в тренде — нанял программистов и, считай, готово. За редким исключением все игры выглядели даже на скриншотах как братья-близнецы — неизменный зелёный фон и заезженные картинки на картах точь-в-точь как на реальных.
Я прочитал несколько десятков статей на хабре о том как кто свои дебютные игры писал и заметил, что чаще всего сценарий начинающего игродела выглядит так: он (а в ближайшей перспективе — я) берёт себе какой-нибудь простенький проектик типа крестики-нолики или морской бой, коих в маркете и так навалом (ага, сказал человек, решивший делать очередную карточную игру), делает всё то же самое, что и у всех, поменяв цвета на оранжевый и салатовый (такого нет ни у кого!), затем постит приложение в маркете и вдруг обнаруживает, что его игра никому не нужна. Игродел недоумевает — он ведь потратил силы, ночей не спал, цвета подбирал и тайком даже позволил себе несколько раз перед сном, зажмурившись, подумать: «а может все-таки взлетит?» Он уже безвозвратно и страстно в свою игру влюблен (а как может быть иначе?), забыл о том, что хотел с самого начала выпустить что попроще, без претензии на мировое господство.
Мне в тот момент абсолютно некуда было торопиться, я спокойно работал на своей работе, а проектом решил заниматься по вечерам и на выходных. Я решил никаких прототипов «попроще» не писать, а сразу сделать игру, за которую будет не стыдно и которая даже если не взлетит, то в будущем, откопанная фанатами моей 10ой/79ой/133ей игры, сразу продемонстрирует тот факт, что я с первой же попытки пытался делать что-то особенное. Несколько недель у меня ушло просто на раздумья о том, что будет выгодно отличать мою карточную игру от других. Решение, когда я его нашёл, оказалось значительно проще, чем можно было себе вообразить — я просто решил сделать игру, в которую сам бы с удовольствием играл (кэп одобряет).
Я скачал себе кучу «Дураков» и хорошенько в них поиграл. Выглядело это так: Начинается новая игра. Кладём карты, берём карты, кладём, берём, кладём, берём, изо всех сил стараемся выиграть. Победил — ура! Проиграл — увы. Повторить до бесконечности.
Кто играл в WoT знает, что очень быстро там сам бой отходит на второй план, уступая место игре в прокачку боевой техники. Радость наступает теперь уже не от победы в очередном бою (хотя и это бывает), а от покупки нового танка. Представим на секунду, что все танки в этой игре с самого начала доступны и выбирать можно любой. Интересно играть? Не думаю.
Так и тут — в того же самого «Дурака» ради самой победы хочется играть только первый десяток матчей, потом — надоедает. Вывод очевиден: за победы надо давать деньги. А вот куда эти деньги тратить — другой вопрос, который, кстати, мучает меня до сих пор и к которому я до сих пор нахожу новые и новые ответы.
Можно позволить человеку на эти деньги покупать новые рубашки для карт и новые фоны для карточных стычек. Интересно будет играть? Ну, не так скучно как на «просто так», но на хит пока ещё не тянет.
А что если я не в «Дурака» люблю играть, а в «Кинга»? Вот оно!
Я придумал сделать сборник карточных игр, в котором за каждую победу ты получаешь монеты и на эти монеты можешь открывать новые карточные игры. Запахло уже чем-то верным. Тем более что топовый сборник карточных игр именно так примерно и выглядит, только там новые игры надо открывать за реальные деньги.
Теперь надо было определить количество и состав игр. По крайней мере на первое время, до запуска приложения.
«Дурак», конечно же. Это самая распространенная, самая, по-моему, любимая в нашей стране игра. Мы в деревне частенько коротаем с друзьями вечерок за этой игрой и чайником зелёного чая.
«Кинг», конечно же. В неё мы тоже играем иногда. К тому же в детстве я упарывался в эту игру под MS-DOS, соперничая с героями «Союзмультфильма» (Вадим Владимирович, моё почтение).
Был ещё один пасьянс, в который я играл-не-мог-наиграться лет десять тому назад на каком-то забугорном флэш-портале. Он назывался «Пирамида», но официальные правила пасьянса с таким названием расходятся с той игрой, в которую играл я. В моей игре класть поверх текущей карты в колоде нужно карту из пирамиды старше или младше по значению на единицу, в результате чего при определённой сноровке и удаче можно снести полпирамиды в один ход. С той игрой десять лет тому назад была, кстати, одна крупная проблема: её логика обрабатывалась на стороне сервера и потому после каждого нажатия страница перезагружалась (сейчас у меня есть подозрение, что не флэш это был — засланец какой-то). Эта игра жутко меня тогда затянула, но так же жутко и раздражала тем, что на одну партию тратилось столько времени. Я пообещал себе в том нежном 17-летнем возрасте когда-нибудь написать себе такую же, но без тормозов. А гештальты, как известно, надо закрывать.
Я начал активно читать в Интернете самые разные материалы, посвященные карточным играм и самим картам. Подобрал тематики мастей для человечков на картах, попытался копнуть в историю самих карт и понять отчего же мне так стыдно кому-либо признаваться в том, что я делаю карточную игру. Я не знаю насколько это только у меня, но по-моему карточные игры считаются какой-то достаточно маргинальной забавой, присущей не самым успешным слоям нашего общества. Впрочем, об этом чуть-чуть и позже.
Почитав в википедии про «Дурака», я был восхищен количеством модификаций к нему (сейчас статью уже отредактировали, модификаций там больше нет, но было штук 50, не меньше). Я решил, что должен во что бы то ни стало сделать хотя бы самые интересные к нему. Я поискал аналоги «Дурака» в маркете, желательно с кучей википедьевских модификаций, но нашёл лишь одного такого «Дурака», и то модификации там были во-первых в большинстве своём платные, а во-вторых можно было активировать не больше одной модификации за раз. А ведь смешивать-то их между собой — самое интересное! Засучив рукава, я решил отобрать наиболее интересные правила (коих получилось больше 20), а также не преминул добавить и своих, чего стесняться-то. Покупать их планировалось, естественно, тоже за выигранные деньги.
Я вообще с самого начала решил, что не буду уподобляться тем, кто установил игры на пьедестал своего способа выживания и потому вынужден брать «за простой дождь — 100 лир, за проливной дождь — 200 лир, за дождь с громом и молнией — 300 лир.» Ведь когда писатель пишет книгу, он в последнюю очередь думает о том как он будет её монетизировать, для него (как и для меня в данном случае, ведь я прямо писатель получаюсь, да-да, творческий человек, вот справка) самое главное — это самовыражение и творческий порыв.
В такой ситуации можно было бы сделать игру и вовсе бесплатной — без рекламы и встроенных покупок, но в этом случае я бы лишил себя удовольствия покопаться в API встроенных покупок и межэкранной рекламы, а также обошёл бы стороной целый аспект разработки мобильных игр под названием «монетизация». Так что я постарался соблюсти баланс — играть должно быть вполне комфортно и без доната, но если вдруг кто-то хочет поддержать разработчика и купить что-то — я только рад. При этом в покупках никакого ограничения на функционал, исключительно экономия времени.
Одна особенность в виде наград за победы, — хорошо, а две — ещё лучше. Я не отказывал себе в удовольствии помечтать о том, что еще можно было бы изменить в карточных играх так, чтобы мне они нравились больше. Я пытался докопаться до самой сути удовольствия от этой интеллектуальной забавы и однажды, отыграв уже сотни партий с друзьями в деревне, я уселся играть за стол с бабушкой моей жены, живущей в Москве. Я был поражён тому насколько игра преобразилась. Вместо тёплой и дружной атмосферы чаепития, происходило какое-то соперничество не на жизнь, а на смерть, и каждая победа или проигрыш воспринимались буквально как триумф или оскорбление соответствено.
В тот момент я понял, что игра в карты это ещё и, как ни странно, общение. Не было бы такого изобилия наших вечерних посиделок, если бы мы не разбавляли поединки беседой и шутками, не ели параллельно фрукты и не слушали какую-нибудь музыку. Я сразу же вспомнил Mario's Game Gallery и Wild Board Games, где противники комментировали вслух происходящее на доске или столе. Что может быть приятнее возгласов жертвы, загнанной в угол?
Благодаря Марио, кстати, вспомнил я и ещё одну преинтереснейшую игру, в которую играл в его галерее — Go Fish! По-русски эта игра называется «Сундучки» и в нашей стране в неё играют несколько иначе. Суть этой забавы, если кто не знает, сводится к угадыванию наличия на руке у противника карт определенного значения. Угадал — получаешь их себе. Нет — очередь твоего противника. И в то время как за рубежом угадывают просто значение карт, у нас нужно ещё назвать их количество, цвет и масти.
Я решил, что в моей игре противники будут разговаривать, комментируя происходящее за столом. Такого уже не было ни у кого и тянуло на действительно исключительный продукт. Теперь настало время придумать — кто будут эти противники? Я начал раздумывать о том кто они обычно — люди, играющие в карты. Профессиональные картёжники. Пенсионеры. Шпана уличная. Студенты на лекции. Аристократы с сигаретами в мундштуке. Бездомные на лавочке в сквере.
Я хотел бы, чтобы у игры был смрадный и мрачный дух подпольного заведения, околонуарный стиль как в настольной игре "За бортом". А ещё я хотел меткое и броское название для своей игры, почти что торговую марку; название, за которое было бы не стыдно и которое я смог бы с гордостью произносить. И после нескольких дней мучительных раздумий я его нашёл — «Картёжный дом».
Объём этой затеи вызывал скепсис у тех, кому я пытался её в двух словах описать. Ведь если этого нет в маркете, значит это не так-то просто сделать, не так ли? «Да ты будешь годами свою игру писать» — говорили мне. — «Бросишь на полпути». Все эти беспокойства за меня и мою затею можно было понять. Мне же самому оставалось только повторять себе, что торопиться мне некуда, что у меня осадная тактика, что с работы я ради этого не увольняюсь, просто решил заменить ежевечерние покатушки в танчики разработкой.
Первая итерация наивности: никакой графики
Первая итерация наивности была у меня с первой версией игры, на которую ушло около двух-трёх недель. Работал я над проектом в свободное от работы и домашних дел время, а в условиях пока лишь только изучения платформы, работа шла и вовсе еле-еле. Хорошо если за вечер мне удавалось сделать хоть какую-то одну законченную игровую функцию.
Я, кстати, не умею рисовать. Вообще. Вдаваться в подробности, объясняя насколько всё плохо я смысла не вижу, поскольку так смотрю — у многих программистов есть эта черта. Вот я и решил, что напишу чистый функционал, а потом прикручу графику. Карты в руке стали у меня списком кнопок в виде LinearLayout, а всё происходящее — TextView с кратким описанием произведённых ходов.
Я понимаю, это глупость полнейшая и вряд ли у кого-нибудь хоть когда-нибудь хватит ума поступить так же — любой понимает, что надо рисовать хотя бы серыми картинками. С другой стороны, если у меня возникла в голове такая идея, то есть ненулевая вероятность, что то же самое произойдёт и с кем-то ещё. Вот мой совет таким людям, как я полтора года назад: не делайте так. Вам придётся переиначивать весь модуль управления, ловя куда нажал пользователь и определяя что он этим хотел сказать. Вам придётся вводить задержки между обработками ввода и выполнением соответствующего отклика, чтобы дождаться окончания анимации, которой у вас сейчас нет. Учитывая, что всё это придётся делать, разрывая и зашивая уже готовый код, поверьте мне, это будет болезненно.
Мне повезло осознать это достаточно рано и не переделывать куски уже существующего кода, а просто стереть всё и начать заново в тот момент, когда я понял, что в процессе нападения надо дать возможность ходить несколькими картами. Любое решение в этой ситуации в условиях карт в виде кнопок было бы обречено — в итоговый релиз оно бы не вошло, а время отняло бы.
Вторая итерация наивности: я сделаю всё идеально, а спорное — вынесу в настройки
Эта итерация на самом деле объединила в себе сразу две моих наивных точки зрения. Общее же у них то, что обе ошибки описаны в книге Алана Купера «Психбольница в руках пациентов». Поэтому наиболее общим советом было бы — читайте книги на разработческие и околоразработческие темы. Многие и многие ошибки, которые вы допускаете или собираетесь допустить, кем-то давным-давно обнаружены, надо лишь взять в руки книгу и позволить этому кому-то вас предупредить. К тому же — это отличное развлечение — внимать тем, кто понимает твои дрожащие руки и бессоные ночи в попытке создать шедевр.
Впрочем, обо всем по порядку.
Я не стал связываться с android-шаблонами, а решил делать всё на чистом canvas'е, разделив соответственно программу на два потока — поток управления и поток отрисовки. Свой выбор я могу объяснить тем, что мечтал (и так и не добрался до того, чтобы) ввести визуальные искривления в игре, а для подобного подхода стандартная приложеньевская разметка, как мне казалось, ну никак не подходила.
Когда с третьего раза у меня наконец-то начало что-то получаться, я нарисовал пустую карту и стал выводить текстом на ней её масть и значение. Мой успех вскружил мне голову. Я решил во что бы то ни стало сделать всё так, чтобы люди ахнули от удобства и идеальности моей игры. Я никогда к тому времени не держал в руках ни одно устройство от Apple, но слышал от нескольких людей, что там всё потрясающе удобно и органично. Решив сделать всё не хуже (и даже тайком мечтая о том, что люди будут переходить с буржуйского Apple на Android просто ради моей игры (ха-ха, ха)), я решил, что не нужно никаких кнопок «Взять» или «Бито». Достаточно просто потянуть карты на столе на себя или в сторону соответственно.
Я старался сделать игру максимально реалистичной — думал даже заставить проигравшего тасовать колоду руками и раздавать карты, но решил эту штуку отложить на потом. А вот что я действительно сделал, так это то, что карты клались в любое место стола. В результате, конечно же, возникала ситуация, когда более поздние карты ложились поверх уже побитых. Я долго отлаживал механизм запрета этого действия, но поняв, что компьютер рано или поздно всё равно может нечаянно так сделать (в том случае если двое сразу будут подкидывать карты, выбрав одни и те же конечные координаты анимации), добавил возможность нажать на любую карту, отчего та всплывала под каким бы количеством карт уже не находилась.
На такие мало что значащие мелочи у меня ушло достаточно много времени — около двух месяцев. Я пытался довести простейшего «Дурака» до состояния идеальности, прежде чем двигаться дальше, хотя впереди работы было ещё очень и очень много. От этого разрастался и код класса, отвечающего за отрисовку, и код контроллера управления со стороны игрока.
Позже я прочитал об этой особенности программистов у Купера. Он пишет, что если есть даже мизерно малая вероятность, что какое-то событие произойдёт, программисты всегда тратят время на то, чтобы сделать что-то для этой ситуации. Даже если вероятность события один к ста миллионам и оно не более чем мягкое неудобство, а время на то, чтобы разработать код специально для этого случая займёт две недели, разработчики всё равно стремятся покрыть все события, имеющие отличную от нуля вероятность.
Это, конечно, очередная глупость с моей стороны — недальновидная и упрямая упоротость. Учитывая, что мне предстояло навернуть ещё целую кучу модификаций на рисовалку и управлялку «Дурака», следовало сосредоточиться прежде всего на этих режимах, а уж потом на каких-то частных и редких случаях управления и отрисовки. Мой же подход противоречил в том числе и закону Парето, призывающему (в моей вольной трактовке) сосредотачиваться первым делом на наиболее важных аспектах. Как сказал Макконнелл в «Совершенном Коде»: «Скульптор всегда сначала создает грубую форму будущей скульптуры, а уж потом принимается за детали. Принимаясь же в первую очередь за детали, вы рискуете либо в ходе дальнейшей разработки выкинуть код, над которым трудились дольше, чем нужно было, либо — что еще хуже — оставить плохой код в проекте, пожалев его, ведь вы столько над ним работали».
Могли бы мои пользователи играть в «Дурака», если бы у них иногда нижние карты закрывались верхними? Могли бы. А могли бы они играть в задуманную мною игру, если бы в ней не было модификаций «Дурака»? Нет, не могли бы.
Поэтому третий мой совет себе и подобным мне (кэп гордится мною): сосредоточьтесь на главном, мелочи навернуть никогда не поздно. Если боитесь забыть про эту фишку или особенность — запишите себе куда-нибудь.
Сюда же, в эту же итерацию я положу и свою жуткую привычку, от которой почти уже избавился, — во всех спорных вопросах предоставлять выбор пользователю в настройках. В моём случае всё еще хуже, ведь любое раздвоение в трактовке модификаций я интерпретировал как новое правило.
Так, например, в Подкидном докладывать атакующие карты на стол должен первым делом атакующий, если же ему докладывать больше нечего, по часовой стрелке и в строгой очередности докладывают другие игроки. В жизни же я видел совершенно иные условия — карты на стол клали все подряд, не соблюдая никаких очередей. Кто успел, тот и съел. Какой вариант лучше? Да оба! Так появились «Подкидной» и субмодификация к нему — «Советский» (когда при подкидывании соблюдается строгая очерёдность). Однако это ещё не самый страшный случай.
Больше всего мне стыдно за «Пустого» «Дурака» (карты берутся из колоды только в том случае если карт на руках не осталось вовсе) и его субмодификацию «Фальшфеерный» (карты берутся сразу же как только закончились). Я просто не мог решить как лучше и не смог найти нигде информации о том в какой момент выдаются карты — сразу же по окончанию их в руке или в конце хода. «Ок, — решил я. — Разделим на две модификации». Стыд и позор.
Позже я прочитал об этом у Купера. Он утверждает, что любой спорный вопрос разработчики склонны выносить в настройки, но это в корне неверная позиция — если создатель программы не может решить как лучше, то уж пользователь точно не будет этот вопрос решать.
И я лишний раз убедился в этом, когда недавно обнаружил, что в классическом 2048, в настройках оказывается можно выбрать поле 5х5. Признаться, обычно я в любой игре первым делом лезу в настройки. Но в мобильных приложениях все настолько стремительно, так часто ты достаешь телефон на какие-то пять минут, пока ждешь чего-то, что не до настроек. Поэтому разработчики, не знающие как сделать лучше, и решающие сделать и так, и так, а выбор предоставить в настройках, вот мое к вам обращение: вы все равно делаете этот выбор, выбирая дефолтное состояние. Предоставлять альтернативу или нет — решать вам, но помните, что большинство людей до настроек и альтернативного варианта скорей всего просто никогда не доберутся.
Третья итерация наивности: я взялся сразу за самый крупный кусок
Прошло полгода, я закончил «Дурака» со всеми 40 модификациями и субмодификациями, которые для себя выбрал. Начался отпуск и весь его я просидел, отлаживая и доводя до ума эту каракатицу. При этом накопившаяся усталось давала о себе знать — иногда, если я видел ошибку, я просто вставлял ещё один if, не вникая в суть того, что здесь не так, так мне хотелось поскорее уж закончить. К тому моменту я что-то подотчаялся и собирался уже было выпускать одного только «Дурака» с модификациями.
К этому времени классы «Дурака» разрослись до неимоверных размеров, стали шаткими и нагромождёнными. Я подсчитал, что с учётом всех ограничений на сочетания модификаций, количество вариантов правил составляет более 11 млрд комбинаций. Естественно, что о тестировании всех вариантов не могло быть и речи. Поэтому известная парадигма «ладно, тут мы закончили, остальное поймаем на этапе тестирования» просто не работала. Мне приходилось умозрительно для каждой модификации перебирать в уме все остальные и думать где может возникнуть коллизия. Уверен, что абсолютно всё я так и не отловил, ведь мне следовало бы пройтись в том числе по всем сочетаниям, когда модификаций одновременно три, четыре, пять и так далее.
Надо отметить, что к моменту окончания работы над «Дураком» концепция этой игры на глобальном уровне претерпела значительные изменения. Я стал рассуждать о том что может подтолкнуть человека покупать новые модификации и пришёл к выводу, что ничего кроме как бонус к победным деньгами. Тут, конечно, многие мне могут возразить, что естественным двигателем является интерес к геймплею, а не приз, но начав перебирать модификации в уме, я первым делом прошёлся по тем из них что увеличивают количество карт в колоде и пришел к выводу, что сам ни за что не стал бы играть двумя колодами за те же победные деньги. Ведь заработок в этой ситуации, поделенный на время, уменьшился бы. Поэтому я постарался примерно оценить увеличение не только времени, но и сложности; как-то справился с тем, чтобы цена модификации соответствовала увеличению прибыли в процентном соотношении и внедрил эти коэффициенты повышения заработка. Однако в этой ситуации всплыла сложность: я не мог позволить игроку включать купленные единожды модификации, поскольку это в скором времени привело бы к бардаку со всеми одновременно включенными правилами и огромными заработками. Поэтому в качестве ограничителя я решил ввести жетоны. Один жетон — одно активированное правило (при условии, что оно куплено). Жетоны выдавались по одному за каждую победу в «Дурака» и в случае проигрыша все активированные правила сбрасывались (позже я счел такой подход слишком жестоким и немного изменил правила отключения модификаций при проигрыше, но это уже такие мелочи, до которых мы тут опускаться не будем).
«Дурак» по своей сути вывернутая наизнанку относительно победы игра. Суть её не в том, чтобы стать первым вышедшим из игры, а в том, чтобы не остаться в дураках. И по идее следовало бы не давать ничего вышедшему, у дурака же отнимать определенную сумму. Но лично я в этой ситуации, видя, что дело пахнет жареным, просто выходил бы из игры, избегая каждый раз наказания. Можно было бы считать количество прерванных игр и оценивать по ним степень честности игрока, но такой алгоритм имеет кучу дыр: начиная от ошибок в системе, при которых игра внезапно завершается, и заканчивая отключениями телефона из-за севшей батареи или высвобождения внезапно понадобившейся памяти. Поэтому было решено проигравшему не давать ничего, оставшимся вышедшим — давать монеты и жетон.
С покупкой модификаций все было тоже не так-то просто. Нельзя было — и я это понимал — просто дать линейный список модификаций и позволить покупать любые. Иначе человек купил бы все интересные ему правила, на остальные бы просто забил, изучив их суть и умозрительно сыграв партейку в них. К тому же меня всегда привлекали всяческие блок-схемы развития. В этом плане схема развитя техники в WoT мне всегда нравилась куда больше, нежели параллельная схема покупки уровней и техники в Hill Climb Racing. Поэтому я разработал схему развития модификаций, постаравшись объединить ветки по тематикам и засунуть в самый конец наиболее радикальные искривленя правил игры.
Однако если с модификациями все было еще куда ни шло, то вот с соперниками, аренами и рубашками было очевидно, что никто их покупать не будет. То есть будут, но только после того как исследуют все влияющие на игру изменения правил. Я бы по крайней мере именно так и поступил — сначала функционал, потом только красОты. И если с соперниками шанс еще какой-никакой был, ведь это новые фразочки, разбавляющие игру, то с рубашкам и фонами проблема была более чем очевидна. Один раз залезли бы посмотреть какие есть варианты и больше не возвращались. Поэтому я ввел такое понятие как «Лотерея» и начал разыгрывать не влияющие по сути на геймплей элементы в ней. «Лотерея» появлялась у меня после определенного количества побед. Таким образом в моей игре появились вещи, которые нельзя было просто купить за деньги — их можно было только выиграть путем длительной игры.
После третьего разработанного мною экрана — «Лотереи» — я наконец-то понял основные моменты, которые использовал на каждом из экранов и написал абстрактные классы, выполняющие все типичные действия. Работа над «Пирамидой», «Сундучками» и «Кингом» пошла значительно быстрее — на них всех ушло около 6 месяцев ежевечерних упражнений. К тому времени я и сам поднабил руку, выработав подход и решения для типичных задач вроде анимации или переключателей режимов отрисовки. Тем не менее, система продолжала предподносить сюрпризы.
Так например, я с ужасом обнаружил в какой-то момент, что механизм анимаций и отложенного выполнения у меня слишком уж тяжеловесный.
Я сразу решил, что проверять в потоке рисования долетела ли анимируемая карта, а потом вклиниваться в поток управления и выполнять какое-то логическое действие, неправильно. Поэтому я делал так — с одной и той же временной константой вызывал анимацию и запускал отложенное действие. Это отложенное действие наследовалось у меня от AsyncTask'а, в котором onBackground выполнялось Thread.sleep(), а onComplete — то, что мне нужно сделать.
Таких отложенных действий в каждый момент времени выполнялось у меня с десяток, основными потребителями были, конечно же, противники. Они думали какой картой пойти или какую подбросить; автоматически после каждого прикосновения к экрану они ждали, что уж это-то прикосновение последнее и ближайшие полчаса ничего происходить не будет, поэтому нервно поглядывали на таймер, чтобы с определенной минуты начать вопить: «Эй, ты где там?»; параллельно с этим они следили за тем на каком действии игрока игра застопорилась, чтобы крикнуть: «Эй, карты побей» или что-нибудь в этом роде. В результате, с ростом количества отложенных действий (и противников) система просто начинала жутко тормозить, а то и вообще отваливалась. Оказалось, что андроидовский AsyncTask в своем doInBackground действительно кушает ресурсы и эта функция там не просто так, в нее надо что-то запихивать — получение ли данных с удаленного сервера или какие-то параллельные вычисления, а не пустое ожидание. Поэтому отнаследованный от AsyncTask'а класс я переписал, после чего все проблемы с производительностью исчезли:
public abstract class Action {
protected int interval; // интервал, через который рванет
private boolean cancelled = false; // флаг отмены действия
public Action(int interval) {
this.interval = interval;
}
public void cancelTask() {
this.cancelled = true;
}
public void execute() {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
if (!cancelled) {
actionAction();
}
}
}, interval);
}
// непосредственно действие
protected abstract void actionAction();
// фабрика клонирования этого отложенного действия
public abstract Action copyForDelayedExecute();
}
Впрочем, я отвлекся.
Очевидно же, что начни я с «Пирамиды», к которой не предполагалось никаких модификаций, и опыт написания движка от начала и до конца был бы у меня куда раньше. Глядишь, и архитектруа «Дурака» была бы не такой грязной. Я бы успел узнать много нового о том как следует писать систему, а в случае чего мог бы без проблем «Пирамиду» впоследствии и переписать. Начав же с «Дурака», я нагородил в нем кучу ошибок по неопытности, но таки заставил его работать, подперев со всех сторон чем мог и теперь боялся на него дышать.
Поэтому еще одно правило, добытое кровью и потом, для всех, кто только начинает: среди подобных друг другу крупных элементов начинать надо всегда с наименьшего.
Прочти я этот совет с год назад, я бы сказал: «ну это понятно, только вот я хочу сначала справиться с самыми тяжелыми элементами, чтобы на потом оставить что попроще. Таким образом, когда я закончу с этим большим и разветвленным алгоритмом, до победного конца останется уже всего-ничего». Так-то это так, только вот с ненабитой рукой тяжеловесный и разветвленный алгоритм пишется хуже. «Дурака и „Пирамиду“ в этой последовательности в сумме я писал почти год. Начни я с „Пирамиды“ и общий срок составил бы всего каких-нибудь 7-8 месяцев.
К тому же, берясь за самое тяжелое с самого начала, есть шанс попросту отступиться, не справившись. И это будет куда хуже, нежели после уже созданного частично кода, наткнуться на непреодолимое препятствие. Совершенные к тому моменту подвиги подтолкнут к поиску компромисса, в то время как отсутствие успеха за спиной может заставить руки просто-напросто опуститься.
Четвёртая итерация наивности: полировка много времени не займёт
Чуть только я успел дописать последнюю, четвертую игру, как поспешил объявить семье и друзьям, что до выпуска осталось совсем чуть-чуть — каких-нибудь несколько недель. Этих друзей, посвященных в то, что я что-то пишу, было совсем немного, вопреки моей привычке всем обо всем рассказывать. Я с самого начала чувствовал, что треща налево и направо о том, что собираюсь сделать, я лишаю себя сил на то, чтобы делать это. Однако чем ближе был релиз, тем меньше мне требовалось моральных сил на то, чтобы закончить. Проект набрал вес и как снежный ком чуть ли не сам по себе катился к выпуску. Его по-прежнему надо было каждый вечер толкать, но выпуск был просто неизбежен.
Ради прикола я решил не стричься вплоть до выпуска игры. Учитывая нехилого размера лысину на моей голове, это решение было более чем поспешным. Зато у меня появился повод для разговора с односельчанами — каждый раз, когда меня спрашивали когда я уже постригусь, я говорил что когда выпущу свою игру. Большинство крутило пальцем у виска, но мне было все равно, я не лишен эксцентричности.
На полировку игры ушло ещё около двух месяцев. За это время волосы на моей голове успели разрастись до такой степени, что продавцы в магазинах вставали на защиту товара, когда я заходил в помещение. Я выглядел как бомж. Голова жутко чесалась особенно в жару, но в этом был и определнный плюс. Не раз и не два я, желая послать всё к чертям и лечь спать, видел свою тень или чесал свою ставшую уже уродливо волосатой голову и садился-таки программировать, напившись кофе, потому что понимал, что кроме меня некому закончить мое детище. А чем быстрее случился бы выпуск — тем быстрее я постригся.
Мотивация — вообще отдельная тема. Многие мои друзья и знакомые говорят мне, что не смогли бы полтора года изо дня в день делать какой-то проект после работы. Я их понимаю, но мне повезло с ментальными трюками, которые я понавыдумывал, чтобы успешно обхитрить самого себя.
Начнем с самого начала — первым делом я перестал играть в игры. Вообще. Я не начал программировать и на игры стало не хватать времени, а я именно целенаправленно перестал играть в игры. Эффект был похож на низкочастотный плотный гул в воздухе после выключения колонок, только что игравших что-нибудь жутко басовое. Мне действительно не хватало развлечений в жизни по вечерам. При этом каждый раз когда мне хотелось сесть и поиграть во что-нибудь, я говорил себе, что вот она — самая интересная игра в моей жизни — выпуск собственной игры. Весь этот самоменеджмент, продумывание архитектуры и смысла игры, борьба с багами в качестве потока нескончаемых квестов. И со временем, по мере того как начало получаться, я действительно начал втягиваться в разработку, она стала моей игрой. При этом, подобно разнице между жирным фастфудом и легким салатом с отварной курицей, игры создавали удовольствие здесь и сейчас, оставляя дурное послевкусие ничегонеделанья назавтра, разработка же поначалу может быть и не доставляла столько быстрого удовольствия, зато всю ночь после этого и следующий день я ощущал себя героем. Это было счастье куда более тонкое и долго тянущееся, более высшего порядка, если хотите.
Я заставил себя все мысли сводить к своей игре. Наверное когда-нибудь мой психоаналитик поцокает языком и покачает головой на эту мою затею, но я приучил себя всегда думать только о своем проекте, буквально повернулся на нем. Если я видел дорогие машины, то сразу же говорил себе что и у меня такие будут, надо только много работать, а для начала — выпустить собственную игру. Если видел зарубежные страны, то говорил себе, что обязательно побываю там, но только после того как выпущу свою игру и добьюсь этим чего-то. Если видел плотно сидящих людей, дружелюбно о чем-то беседующих, то убеждал себя, что сделаю и это, но сначала — свой проект.
Ни дня без строчки! Кажется, так называется эта методика. Я, правда, прочитал о ней совсем недавно на хабре, до этого же я нащупал ее как-то сам. Суть ее была в том, что после одного дня разработки пропустить следующий вечер не так уж сложно, а вот после недели ежедневного программирования нарушение этой традиции серьезно бьет по психике на следующее утро. Привыкший к одним и тем же рельсам мозг по привычке скатывается в „я тоже это сделаю/получу, когда выпущу свою игру“, затем вспоминает что вчера ничего сделано не было и происходит болезненный разряд мозгом в мозг. Я со временем стал бояться вечером не сесть за разработку. Потому что в этом случае весь следующий день жутко мучался совестью и болел, скатываясь на свои привычные рельсы „сначала проект“. Иногда, когда сил вечером совсем не было, я просо запускал Idea (в которой приноровился писать) и сидел перед ней пару минут, затем шёл спать. Так два или три раза мне удалось обмануть себя, избежав наказания.
Я очень быстро перестал вообще употреблять алкоголь, поняв, что не могу толком ничего разрабатывать под его действием, а в случае пропуска хотя бы одного вечера разработки на утро вместе с похмельем меня ждала мучительная моральная расплата. Я пробовал программировать рано утром, вставая на несколько часов раньше семьи, но тогда весь день я думал только о своём проекте, а не о работе. Такой вариант меня тоже не устраивал.
Наконец, чем ближе к выпуску, тем отчетливее я осознавал, что никто кроме меня этот камень в гору не вкатит. Жена помогала мне, рисуя картинки, но всю основную работу выполнял я сам и был этим очень рад. Наконец-то я нашел свое призвание и чувствовал себя на своем месте, ведь каждый день двигался на шажок вперёд; мозг мой при этом получал полный спектр удовольствия от решения возникающих квестов и выработки стратегии победы того или иного нововведения при вводе его в механику игры.
Вообще, конечно, мне повезло с самого начала настроиться на лад каменоломни огромной скалы киркой. Каждый день я делал малюсенькую часть всего огромного проекта. При этом оглядываясь на вчера и заглядывая в завтра, мне казалось, что я топчусь на месте. Однако в перспективе нескольких месяцев прогресс был виден. Я не торопился, не стремился во что бы то ни стало каждый день совершать подвиг. Тихо и спокойно, как сборщик риса, медленно, но уверенно, твердо маленькими шажками двигался вперёд.
Возвращаясь же к этой итерации моей наивности, я хотел бы отметить, что как бы хорошо не был написан каркас и основной код, доработка всяческих мелочей займет куда больше времени, чем вы предполагаете. Всегда.
Пятая итерация наивности: я думал, что хороший продукт сам себя продаст
Я старался читать множество материалов на перспективу, в том числе о продвижении. Знал о том, что пресс-релизы надо рассылать в день выпуска игры. Читал и о том, что надо практиковать выкладывание материалов по игре заранее, в том числе для того чтобы как можно раньше узнать отклик публики и если что вовремя сменить курс разработки. Однако все эти материалы казались мне какими-то не совсем соответствующими нашим отечественным реалиям.
Я ведь понимал, что выпускать англоязычную версию моей игры одновременно с русскоязычной просто не имеет смысла. За рубежом не играют в „Дурака“, а многочисленные фразочки моих героев сводили на нет попытки перевести игру самостоятельно. Я помню как сел и за пару дней написал в тетрадке кучу забавных возгласов. Затем я, пока только переписал их в файл текстовых ресурсов, потратил весь вечер. У меня получилось около 20 тысяч знаков чистого текста в игре — такое не под силу перевести самому, с моим-то английским.
При этом, будучи сам своим основным потребителем, я всё время задавался вопросами — было бы мне интересно почитать об игре, которая выйдет через полгода и которую нельзя скачать прямо сейчас? Да я бы забыл о ней тут же. Очень красноречивый комментарий был недавно к одной из статей на хабре по геймдеву — человек, ожидая в перспективе выхода своей игры, выложил схему её архитектурного решения. Единственный комментарий, который ему оставили: „где сама игра?“ Такова суровая реальность — трейлер к Fallout 4 кто-то с удовольствием посмотрит, переминаясь с ноги на ногу в ожидании выпуска; noname'овскую же игру, которая к тому же еще не готова, все будут в упор не замечать, как соловьем не разливайся. Если так уж и быть тебе повезет кого-то заинтересовать своей игрой, тащи его скорее в маркет, суй в лицо кнопку „Установить“, пока он не передумал или пока его мама не позвала есть щи.
Что же касается комментариев потребителей и смены курса, то тут очень уместна цитата Генри Форда: „Если бы я спросил людей, чего они хотят, они бы попросили более быструю лошадь.“
К тому же нельзя ведь надеяться, что человек, высказывающий своё мнение и ожидающий ответа разработчика, согласен с тем, что его предложение неуместно или портит общую концепцию. Даже на то, чтобы его предложение было поставлено в очередь он не очень-то согласен; здесь и сейчас, раз уж он поделился с тобой своими соображениями.
Они хотят, чтобы в Hill Climb Racing можно было кепочку менять и цвета машин; хотят, чтобы денег давали больше, а выиграть было проще. Кармические законы не позволяют мне проигнорировать неуместное предложение, оставив вопрос, заданный мне, висеть в воздухе. Врать же я не желаю все по тем же законам морали и потому считаю, что обратный отклик интереснее получать на уже сформировавшийся продукт, который в моем случае является скорее концептуальным произведением, нежели открытым для правок проектом, действующим по принципу „любой каприз, лишь бы вы скачали, поставили оценку, а лучше что-нибудь купили“.
По всем вышеперечисленным причинам о моей игре, ее названии и концепции вплоть до самой даты выпуска не знал никто, кроме жены. На финальной стадии подключился alexusPro и дал ворох ЦУ, по которым я быстренько изменил пару интерфейсных моментов, отложив выпуск еще на неделю. А так даже обращавшим внимание на мои патлы односельчанам я вынужден был отказывать в ответе на вопрос „о чем хоть игра?“.
И вот час икс настал. Я откладывал этот момент на неделю вперед трижды, понимая, что в сравнении с полутора годами, еще одна неделя — ничто. В одной из статей по маркетингу я прочитал, что вторник — плохой день для запуска, а пятница — самое оно. Поэтому если я не успевал к текущей пятнице, то переносил запуск на неделю вперед. Я понимал как легко запороть всё, выпустив свой проект, как школьник, лишь бы уже только выпустить, со скомканным концом или недоделанным багом, и потому каждый раз, когда голова моя чесалась, требуя выпуска немедленно, а я понимал, что не всё еще сделано, я говорил себе, что, видимо, не на этой неделе и переносил запуск.
Первым делом после выпуска я разослал новость о том, что выпустил свой проект по друзьям и знакомым в контакте, в скайпе и в hangouts. Личными сообщениями, только тем, кому это могло быть интересно. К моему удивлению, из тех, кто установил приложение и не промолчал (а таких было большинство), никто не сказал, что плохо, всем очень понравилось. Трое или четверо и вовсе сбились в плотный костяк тестировщиков и начали методично играть, забрасывая меня возникающими ошибками или предложениями по улучшению. Играют они в мою игру до самых нынешних пор (хотя пошла уже третья неделя с момента выпуска), непомерно удивляя меня этим. Многие люди из тех, кто, не стесняясь, может сказать в лицо человеку, что у него ничего не вышло, имеющие полное на то право и даже склонные к этому, почему-то тоже похвалили мою игру. Видимо, она получилась не такой уж и плохой.
Многие писали мне о том, что их жутко (как и меня в свое время) затянула „Пирамида“. Конечно же не обошлось без людей, которые спрашивали у меня то, что и так есть в инструкции (да кто их читает-то?) просто потому, что позвонить мне проще, чем разбираться самому. Очень быстро обнаружилось и 5-6 общих у всех проблем вроде непонятного момента с опусканием жетонов для активации правил или атакой сразу несколькими картами. Подобные вещи я старался выписывать в отдельный файлик и как можно быстрее исправлять.
Об ошибках-прям_ошибках я даже не говорю. Уже с год как к моей игре была прикручена ACRA, чтобы я мог не у компьютера тестировать игру и при этом отслеживать stacktrace ошибки. Заодно узнал у кого из друзей и подруг какой аппарат.
Всего с 40 разосланных сообщений я получил около 20 установок.
Я нашел в этой статье таблицу ресурсов, куда следовало бы написать о том, что я выпустил игру. Я, правда, был значительно ограничен в использовании этого списка, поскольку игру выпустил пока только в России, Беларуси и Казахстане. Тем не менее, это тоже дало определенный прирост установок, хотя и тут я умудрился налажать. Дело в том, что заветную кнопку „Опубликовать“ я нажал в пятницу вечером, 5 июня, и пока Google одобрил мой apk, проиндексировал игру и начал выдавать ее по поиску, прошло часов 12-14. То есть игра появилась в маркете утром в субботу. Естественно, что в этот момент большинство людей уже было на дачах и потому даже мои вялые попытки пропиарить игру на каких-то андроидных ресурсах разбились о тотально пустующий рунет. Когда же наступил понедельник, на том же trashbox'е прямо с утра вывалили такое количество новостей, что моя игра оказалась аж на третьей странице, куда, понятное дело, редкая птица долетит.
Есть два ресурса, которые бы я однозначно рекомендовал для публикации: androidpit.ru и android4all.ru. И там, и там на форумах есть либо специализированный раздел „Оцените мое приложение“, либо раздел „Игры“, куда не возбраняется написать о своей игре. В сумме два этих ресурса, ведущие учет просмотров страницы с игрой, дали мне около 200 (ого! неужели целых 200?) потенциальных посетителей — тех, кто узнал о существовании моей игры.
Я еще догадался запостить игру на двач, в раздел gd (gamedev), где меня быстренько облили дегтем за графику (как же без этого) и пуфнули перьями в меня. Тем не менее и там нашлись те, кому игра пришлась по вкусу.
И… всё. О существовании моей игры на данный момент знают около 300 человек, 500 — максимум. При этом у меня около 150 установок, из них около 60 активных. Пф, скажете вы? Ну да, не тысячи инсталлов. Но лично для меня мысль о том, что около 40 абсолютно незнакомых мне людей поставили себе мою игру и до сих пор не стерли, представляется прямо-таки чудом каким-то.
Я могу так легко прогнозировать количество людей, которые хоть раз видели мою игру, просто потому что в поиске кроме как по запросу „Картёжный дом“ мое приложение не представляется возможным найти. Даже по „Сборник карточных игр“ я ниже 120-го места, чего уж говорить о „Дураке“ или тем более „Кинге“. А чего я хотел с 100-500 установками? Ну, если можно, то я хотел бы, чтобы мой „сборник карточных игр“ был в первой десятке по этому запросу, поскольку сборников карточных игр в маркете не так уж и много. И, кстати, если набрать „Сборник карточных игр“ с кавычками (то есть искать фразу целиком, а не отдельные слова) то в первую 10ку я действительно вхожу.
Раз уж вы спросили, то я бы ещё хотел, чтобы установки в маркете нельзя было покупать, продвигая наверх списка в поиске не самые удачные игры. Но это опционно, кому-то наверняка такое положение вещей кажется вполне честным. В конце концов, если типичные предприниматели вынуждены вкладываться в помещение, сотрудников и оборудование, с чего я решил, что есть в мире такая сфера, где деньги и популярность делаются из воздуха с помощью компьютера и головы?
Так что вот мой очередной совет, делайте с ним что хотите: не думайте что ваше приложение кому-нибудь нужно. Серьезно. Многие из тех, кто сейчас читает эти строки, как и я полтора года назад, думают: „у меня особенное приложение, аналогов которому на рынке нет“. К сожалению, Google еще не придумал такую галочку, как „уникальное приложение“, а потому ваш труд скорей всего будут искать через поиск. Так вот, друзья, даже если вы придумали отличный конвертер размера колготок в количество килограмм картошки, помещающейся в них, и аналогов вашему приложению в маркете нет, то перед этим вашим ноу-хау в поиске все равно будут сначала все приложения про колготки, потом про картошку, потом про килограммы, потом про размеры и только в самом конце это самое ваше приложение, которое, повторяю, никому не нужно.
Я бы хотел сюда же еще заметить вот что: я не рассчитывал на быстрый рост установок, снова выбрав осадную тактику. Я знаю кто мой потенциальный пользователь — усатый 40-летний дядька, который только что купил себе первый планшет и из игр знает только домино и „Дурака“. К сожалению, на данный момент он мою игру в маркете просто не найдет вопреки тому, что я говорил себе все эти полтора года, мол, популярность приложения будет медленно, но верно расти.
Шестая итерация навиности: я думал, что отдохну после выпуска игры
Знаю-знаю, я много раз читал об этом — с выпуском игры всё только начинается. Люди начинают комментировать, баги надо править, статьи писать, а проект развивать, иначе очень скоро ты выпадешь из гонки, о тебе забудут. Расслабляться некогда.
Но лично для меня дело стало даже не совсем в этом. Я почти год кормил себя сказками, что жизнь поменяется, когда я выпущу этот проект. Что какие-никакие инсталлы пойдут и я смогу расслабиться и хоть раз спокойно прокатиться на велосипеде или поиграть в Mortal Kombat без острого жжения в груди от того, что теряю время, в то время как проект стоит на месте. Я выпустил проект и… катарсиса не наступило. Игра не появилась в маркете мгновенно, поэтому момент нажатия „Опубликовать“ я никак не могу признать тем_самым_моментом. Момент появления в маркете игры — тоже, поскольку у меня не было такого, чтобы только что игры не было в маркете и вот она появилась, а через несколько часов уже первый отзыв и первая сотня инсталлов.
Иногда мне кажется, что мне было бы значительно легче, если бы мои друзья и бывшие коллеги сказали, что все плохо и никуда не годится. Если бы о моей игре узнали 10 000 человек, из них 2 человека скачали бы, что говорило бы о провальной изначально идее. Или если бы из 1000 инсталлов у меня было бы 3 активных, что говорило бы о том, что игра просто сама по себе никуда не годится. Здесь же проблема в том, что о моей игре никто просто не знает. Это одновременно не дает мне успокоиться и хотя бы недельку не притрагиваться к проекту, и в то же время не отвечает на самый интересный для меня вопрос: „ну как?“ Запуск случился, но облегчения я не чувствую.
Совет тут очевиден: если вы долго над чем-то работали и вот-вот уже выпуск, а после выпуска вам хотелось бы отдохнуть, то как только готовы будете нажать кнопку „Опубликовать“, скажите себе „стоп“ и недельку отдохните, потом запускайтесь.
К сожалению, это не совсем честный совет, поскольку я сам месячной давности ему бы не последовал. Я сказал бы, что не могу больше ходить с этой отвратительной шевелюрой и должен во что бы то ни стало выпуститься прямо сейчас. Шучу. Я бы сказал, что всю эту неделю не смогу не трогать проект, что если я решу недельку отдохнуть, то всю эту неделю буду тестировать и допиливать, никакого отдыха не выйдет. Что ж, людям с подобной одержимостью я бы посоветовал постараться избавиться от компьютера физически хотя бы на пару дней и только потом выпуститься. Сил, обещаю, будет куда больше, когда посыпятся комментарии друзей и график установок поползет вверх. Это особенно актуально в том случае если в отличие от меня вас ждет успех и с тысячу инсталлов за первые сутки.
Седьмая итерация наивности: я слишком активно кормил себя иллюзиями
Эта итерация, что называется, to be continued... Ведь я и сейчас продолжаю кормить себя иллюзиями, как будто предыдущих шести штук мне мало. Например, продолжаю биться над тем, чтобы каким-то образом донести до широкой общественности факт существования моей игры, хотя очевидно, что реальное положение вещей не составляет и тысячной доли ожидаемого и мечтаемого мной положения. Хотя это уже моя проблема — сам себе намечтал, надо было быть скромнее.
Я был уверен, что у меня-то все будет как-то иначе, чем у других, кто рассказывает о своем опыте, что я-то уж все продумал и все предусмотрел. Что у меня получилось что-то большее, чем смена цветов на салатовый и оранжевый. И что стоит мне только дописать проект, как я смогу хотя бы некоторое время жить полной жизнью, пока он некоторое время спокойно живёт своей. Что у меня будет идеальная игра без единого сучка и спотыкашки. Наконец, что после выпуска игры все станет куда легче, ведь все, что нужно будет — это рекламировать свое приложение везде, где только найду, а инсталлы в это время будут нарастать.
С другой стороны, я не знаю что делал бы без этих иллюзий. Если быть, то быть лучшим; плох тот солдат, который не мечтает стать генералом и все такое. Пожалуй, именно иллюзии о том, что мой продукт какой-то исключительный заставлял меня биться и биться над ним все это время. И, вы знаете, я доволен результатом. Поствыпускная депрессия почти подошла к концу и кажется уже очень скоро я снова возьмусь за проектирование расширения проекта и написание кода для него, за отладку, оснастку новыми фичами, за выбор, наконец, дальнейшего пути развития. Ну, короче, я же говорю — шести итераций мне мало.
Любопытен разговор, который случился у меня в hangouts с alexusPro на второй день после выпуска, в воскресенье, когда никто с дач еще не вернулся. На тот момент у меня было всего около 25 установок, из них 24 активных, и несмотря на попытки публикаций в куче источников, каждый день инсталлов нарастало всего по 2-3. Я тогда сказал ему (история переписки хранит сей любопытный факт), что было бы у меня сейчас 100 инсталлов и каждый день нарастало бы штук по 10, я бы уже вовсю пилил дополнения и всячески развивал проект дальше. Думаю, в этом и есть суть человеческой жадности — сколько бы инсталлов не было, их всегда мало. Когда я наконец оправился от удара выпуском и взялся за планирование, то первым делом перечитал все переписки со всеми и вдруг обнаружил своё это опромечтивое высказывание. Это оказалось тем и интересно, что к тому моменту вот уже две недели как я нигде и ничего не постил, а инсталлы действительно продолжали расти, их было уже по 10 в сутки, общее же их количество составляло 106.
Вместо заключения
Итак, я потерял с полгода своей бодрствующей жизни (если слепить вместе все отрезки работы), а в результате получил 9 оценок, около 150 инсталлов и статью на хабре. Стоило оно того? Черт побери, да тысячу раз стоило!
Я научился проектировать архитектуру, узнал много нового о своей целеустремленности и умении управлять своим временем, прочитал кучу книжек, перелопатил охапку ресурсов по андроиду, положил готовый проект в свое портфолио, как следует получил от жизни с ноги, чтобы не казалось, что все хорошо и просто, как какое-нибудь лето или рассвет, как это у нас тут в деревне обычно случается.
Я самореализовался. Я теперь представить не могу как можно тратить свое свободное время на что-либо еще кроме разработки. Я узнал вкус часовой прогулки на свежем воздухе с семьёй после нескольких часов напряженного измышления перед монитором. Я вырос не только в собственных глазах, но и в глазах тех из моего окружения, кто видел мою игру. Познал радость неоплачиваемого труда just for fun и теперь собираюсь подняться после сокрушительного удара судьбы в виде отсутствия интереса к моему приложению и снова ринуться в бой.
Этот проект оказался действительно самой интересной игрой в моей жизни и, кажется, я прошел её синглплеер до конца, теперь только играть онлайн и ждать сиквела.
Так что с вашего позволения я все-таки назову всё это историей успеха. И пусть те, у кого инсталлов значительно-презначительнейше больше посмеются надо мной.