1 разработчик. 2 приложения. 3 года
Всем здравствуйте! Давно уже собирался написать историю своего проекта на Хабр, более того, даже обещал. И тем не менее, этот момент откладывался на потом: когда выйдет новый релиз, когда закончится обновление дизайна, когда все заработает, как задумано. Причина одна — лень, прикрывающаяся отсутствием времени.
Но вот конкурс одной компании на тему разработки заставлял меня возвращаться на их подборку вновь и вновь в ожидании новых статей. А потом я плюнул и решил не дожидаться чужих трудов, а достать свой когда-то начатый опус, отредактировать переписать заново и поделиться с вами.
Запаситесь кружкой горячего молока и печеньем. Ну или пивом с крекерами, что вам ближе.
Этот пост о моем опыте мобильной разработки. Я новичок в этом деле (и как разработчик и как писатель) и, возможно, кому-нибудь мой опыт покажется смешным или незначительным. Обычно обозревают свои результаты или инди-разработчики игр, или матерые разработчики кроссплатформенных приложений для своих сервисов. У меня все проще — небольшое мобильное приложение под Android, изначально задуманное в помощь себе, оказалось востребованным несколько большей аудиторией, нежели ожидалось.
Дисклеймер
Здесь вы не увидите хитрого велосипедостроения или забивания гвоздей микроскопом. Я не переоткрывал очевидные вещи и не ставил задачи написать сугубо-техническую статью. Я хочу показать, как можно разработать самостоятельно востребованное приложение (500К+ установок) и при этом получить чуть больше, чем просто удовольствие.
В своей категории приложений приложение уверенно держится во второй десятке платных, получило бесплатное упоминание на 4PDA в подборке лучших и текущее суточное количество установок 300–900 в сутки. Иногда до 2500. И кстати, я не прибегал ни к какому продвижению — ни рекламы, не обзоров на тематических ресурсах — нигде, никак, вообще. Считайте, что срываю покрова.
Я не думаю, что можно отнести мои результаты к success-story — но, когда хобби-проект начинает приносить месячный доход больше основного, есть повод задуматься.
Предыстория
Смеркалось… нет, ну если честно, был уже поздний вечер. Начитавшись на Хабре успешных историй по мобильной разработке, задумался — чем я хуже? У меня есть свободное время (по поздним вечерам и иногда выходным), есть ноутбук, есть доступ к сети. Даже несколько Android девайсов найдется.
Верно говорят, что вновь создаваемый софт должен решать существующие проблемы, а не надуманные. Мое желание «написать что-то» укрепилось и детально сформировалось, когда взгляд упал на стопку чеков с автозаправки. Ну есть у меня некоторая слабость — следить за авто в том числе и через уровень его расхода топлива. Эти чеки собирались в бардачке, а чуть позже, набрав критической массы, перебирались в дом и неспешно вбивались в Excel. В общем я решил написать программу по расчету расхода топлива. Как показал беглый поиск в Google Play (кончалась холодная зима 2013-го), конкуренты присутствуют. Ну как конкуренты, не такие, на результат которых смотришь и опускаются руки, понимая, что невозможно тягаться в одиночку. Сразу возникло желание сделать лучше, со своими… (здесь обычно любят писать что-то про куртизанок и карточные игры) преимуществами, вот.
Вопросов под какую платформу писать не было — только Android, только native. К моему удовольствию в сети ну до безобразия множество уроков по установке, настройке и использованию средств ADT (тогда Eclipse — наше все). Многие из них повторяются, но несколько ресурсов с количеством уроков, переваливающим за сотню, мне очень помогли.
Я — недавний выпускник-инженер без опыта коммерческого программирования. Мои познания ограничивались Pascal/Delphi из первых общеобразовательных курсов университета и… все. К чему я это — если задаться целью научиться писать под Android, это легко достижимо. Никому не верьте. Иногда даже кажется, что моя кошка может проводить code-review моей писанины. Ее попытки предотвратить охлаждение ноутбука холодными вечерами своей тушей вряд ли прошли для нее впустую.
Около месяца я урывками выполнял простейшие уроки по Android. Вначале очень кропотливо, потом бегло, последние вообще пропускал, просмотрев по диагонали. Этот поверхностный обзор позволил мне понять те базовые примитивы Андроида, которыми я располагаю, как хранить данные, как их отображать и что с ними делать.
Спустя два месяца у меня был прототип.
Alpha-тест
А как еще можно гордо назвать приставание ко всем друзьям и коллегам, имеющим личный автомобиль? Я вкратце обрисовывал, что программа делает и просил ее «попользовать» при мне. Все замечания записывал. Такого количества дельных советов я не получал ни до (кошка со всем была согласна) ни после. Причем большинство замечаний были справедливы и вызывали желание почесать затылок и вопрошать: «И как я сам не додумался?». Отсюда напрашивается еще один капитанский вывод — почаще отдавать свое творение на внешний непредвзятый суд.Beta-тест
Прошел еще месяц. Как только все указанные косяки были устранены, я задумался о релизе в Google Play. Было несколько тревожно — вот сразу так взять и начать раздавать свое ПО. До конца месяца оставалась почти неделя и я решил вначале выложить свою программу на 4PDA. Не зря. На удивление, первые пользователи были даже тактичнее моих друзей и список доработок/улучшений был небольшим. Я приготовился к релизу.
Здесь следует сделать лирическое отступление и обрисовать те задачи, которые я ставил перед собой, и тезисы, которыми руководствовался:
- Приложение полнофункционально, бесплатно и без рекламы.
- В случае успешности (не помню, какие ставил цели) добавляю несколько дополнительных опций и выпускаю параллельно платную версию.
- Качество приложения на первом месте, стараться решать все проблемы в кратчайшие сроки.
С этими идеями я опубликовал приложение 1 июля 2013 года (черт как же давно это было).Релиз
Сейчас нашел скриншоты первых версий программы, проронил скупую мужскую слезу. Правда так и не понял, то ли от умиления, то ли от стыда.
Как это выглядит сейчас
Сейчас мне очевидна следующее правило — при работе над собственным проектом необходима неделя перед релизом для последних проверок и неделя после для ответов на отзывы, решения возможных проблем, которые вылезут однозначно.
В играх есть правила. Правила эти придуманы разработчиком игры, и ему просто отбиться от недовольных, назвав баги своих кривых творений особенностями геймплея. В приложении, имеющем дело с деньгами и точными цифрами, так не прокатит — все должно совпадать до копейки/миллилитра. Мое приложение для автовладельцев, что автоматически добавляет возрастной фильтр к моей аудитории — 18+ (отсылка к КДПВ). Так как желание контролировать финансы говорит о практичности и аккуратности пользователя. Можно сказать, что у меня идеальная аудитория — взрослая, обеспеченная, расчетливая.
Опять же я отвлекся. Конечно были замечания, было много замечаний. Я почти каждую неделю выпускал обновление. И с нетерпением дожидался вечера, когда обновлялись счетчики скачавших.
В Google Play есть деление по категориям, одна их которых — Транспорт, куда я и попал. Внутри категорий есть деление по Топам — Бесплатных/Платных/Новых Бесплатных/Новых платных.
Первые 30 дней после публикации я могу быть в Топе новых бесплатных. На 10-й день я там и оказался. Количество скачиваний в день резко подскочило и держалось так до конца месяца. Согласитесь, для нишевого приложения — для взрослых дядек, которые имеют авто и собирают чеки на заправках — более полутора тысяч скачек в день, хороший показатель. Целый месяц я упивался графиками и показателями. Судите сами:
Справедливости ради стоит отметить, что количество удалений тоже подскочило и составляло около 50–80%. Я связываю это опять же с особенностью приложения.
Прошел месяц и количество дневных установок упало. В пять раз. Было 1500, стало 300. Более того, количество удалений еще некоторое время отставало по темпам и вскоре тоже упало, оставив естественный прирост 40–50 пользователей в день. Сказать, что я был удивлен — ничего не сказать. Впрочем, просветление настигло почти сразу — приложение из Топа новых бесплатных уже вылетело-то. Кстати я подметил интересный способ продвижения некоторых трешевых приложений — каждый месяц перезаливаться и висеть в новых. Причем такие находил и в авто-приложениях, и в играх, и в утилитах.
PRO — Релиз
Спустя пару месяцев (ноябрь 2013) я наконец понял, какую функциональность можно вывести в отдельное приложение, ничем не обидев существующих пользователей:
- добавление более одного автомобиля (если государство собирается вводить дополнительный налог для автовладельцев нескольких авто, чего мне стеснятся)
- расширенные виджеты.
- углубленные отчеты по расходу топлива.
Казалось бы, вот оно — есть хорошее приложение с неплохим для приложения органическим трафиком (200–300 установок в сутки). Pro опубликовано, на форуме единомышленников об этом написано, жду. Честно говоря, ночь в ожидании статистики была беспокойной — как минимум раз пять лез проверять, не обновилась ли статистика. И…
В первые сутки программу установило 14 человек, потом 6, потом 5, спустя 2–3 месяца в лучшем случае через день другой проскакивала покупка. Спустя три месяца на счету Google Play болтались около $95. Казалось бы, чего еще ждать — бросай проект, вставай на лыжи. Пробуй что-то новое. Но мне же обидно, мне же стыдно перед кошкой, которой я рисовал картины счастливого недалекого будущего. Я проанализировал поведение пользователя (ну в смысле крепко задумался при взгляде на диаграммы переходов Google аналитики в приложении), шлепнул себя по лбу и понял очередную прописную истину — пользователь, может и желающий отблагодарить автора приложения, попросту не знает о такой возможности. Я, как очень вежливый разработчик, нигде не досаждал пользователю само-рекламой и это было моей ошибкой. Большей ошибкой было бы только то, если бы я все же досаждал.
Я переделал несколько элементов. Если раньше при обновлении у меня всегда был список изменений «Что нового», то теперь полноценный диалог — похвалить/пожаловаться/посмотреть историю разработки/обновится до про/чай/кофе, если желаете.
Хвастаясь списком того, что сделал, не стыдно, а попутно можно и предложить отблагодарить, поддержав проект.
Ситуация немного выправилась.
Количество ежедневных покупок увеличилось до 5–8, а ежемесячный профит увеличился с $20–30 до $140 — 170, вполне подлежащих переводу на карту. Я понял зависимость и стал с новыми силами готовить обновления, чтобы удивлять пользователей не списком излеченных багов, а количеством новых фич.
Поговорку про пришествие аппетита во время еды, наверное, все знают. Мое приложение — универсальный калькулятор расчета расхода. Я смог совместить все известные подходы к расчету расхода топлива, научился прогнозировать выбег и остаток в баке. Со временем пользователи совсем от рук отбились и стали требовать все больше и больше возможностей, которые не могли быть в такой программе концептуально. Учета всех расходов на авто захотели. Я задумался…
Релиз нового проекта — учет всех расходов автомобиля
Умудренный собственным опытом я не кинулся в разработку тут же и с головой. Я начал проводить исследования. Блин, оказывается мою сумбурную подготовительную деятельность можно обозвать так верно и точно. Что я предпринял:
- Я скачал все приложения схожей тематики, все запустил, настроил, попутно выписывал список минимального функционала и интересных идей, которые не постесняюсь позаимствовать. Выбор между удобством использования и собственными велосипедами к счастью пал на первый вариант.
- Также я вел (и веду) тесную переписку с активными пользователями (почти последователями) приложения. Я задавал вопросы им — что хотят увидеть, что хотят делать в приложении.
- В оригинальной теме первого приложения я начал дразнить скриншотами нового, попутно приводя перечень заявляемого функционала и отслеживая мнения.
- Я даже спрашивал у иностранных пользователей о наиболее подходящем названии.
В конце концов к моменту старта написания кода я подошел полностью подготовленным — все таблицы данных для БД, все переходы между экранами были задокументированы и выверены. Конечно, я не все предусмотрел, и позже структура БД претерпела изменения, но потрясений, требующих переустановку приложения с нуля, не было.
Однозначно, пришествие Material Design пошло на пользу последним версиям приложения
Функционал, который я изначально задумал для приложения и который к настоящему моменту реализован на 80% — всеобъемлющая солянка из лучшего, что можно только придумать. Я рискую навлечь на себя гнев НЛО, приведя здесь список фич, но без него моя история была бы неполной:
- Составление категорий трат и доходов
- Составление шаблонов (подкатегорий) с различными настройками периодичности и учета в содержании.
- Учет остатков по списку собственных запчастей.
- Составные траты (к примеру — ТО, включающее ряд работ)
- Гибкая настройка учета трат как содержания (ОСАГО размазываем на год вперед, а налог на года назад, ТО на 15 тыс. км после и т.д.)
- Куча разнообразных графиков (мне повезло подружиться с одной библиотекой).
- Гибкая настройка интерфейса с просто гигантским набором карточных отчетов.
- И конечно модуль двух-топливного учета расхода топлива, пришедший из первого приложения с прогнозированием остатков и выбега
Вся эта функциональность потребовала почти полтора года постепенной работы и интеграции. Тема на форуме нового приложения исчисляется в 2200+ сообщений. Монетизация приложения необходима хотя бы для того, чтобы иметь оправдания перед женой за истраченное свободное время. Не мудрствуя лукаво, в новом приложении я добавил один восстанавливаемый In-App, разблокировывающий все возможности базового приложения (учет нескольких ТС, виджеты, статистика, шинный калькулятор).
Каннибалам на заметку
Если выпускаете приложение, включающее функционал другого хотя бы частично будьте готовы увидеть уменьшение аудитории первого приложения в пользу второго.
Отдельно я бы хотел осветить несколько моментов в своей разработке, которые могут быть полезны другим.
Хранение и передача данных пользователя
В программах, работающих с данными пользователя всегда стоит вопрос их хранения локально, удаленно на сервере или смешанный режим, производящий синхронизацию между устройством и сервером. Первый способ хорош полной автономностью приложения и независимостью от связи с сетью. Трафик в конце концов тоже денег стоит. Организация хранения и синхронизации на сервере помимо явных преимуществ (платформо-независимость, возможность самостоятельной правки данных пользователя) добавляет кучу задач и проблем, которые не потянуть в одиночку. Как вы уже поняли, я выбрал первый способ, более простой и предсказуемый. С ним я столкнулся со следующими проблемами:
- Удаленная отладка. Для помощи пользователю с его данными необходимо ему объяснить, как достать и отправить мне данные. С первыми релизами я добавил импорт/экспорт данных в csv файл, и сейчас при написании письма из приложения всегда автоматически прилепляю последний автобэкап.
- Синхронизация. Со временем я добавил синхронизацию данных посредством Dropbox API. Использовать в обмене между устройствами текстовый файл и каждый раз его разбирать при синхронизации — как-то «попахивает», не так ли? Поэтому я гоняю по сети весь файл SQLite и файл настроек и просто их подменяю при наличии более свежих в облаке.
На ранних этапах развития экспорта/импорта данных, я пошел на встречу некоторым пользователям и добавил парсер данных из других приложений — какие-то перестали поддерживаться, какие-то просто кривые, причины были разные –, но желание одно: стать пользователем моей программы и сохранить всю историю из других приложений. Но вот незадача: если я не только сделал формат файла экспорта наиболее простым, но и подробно его описал на сайте проекта, то другие разработчики увидели в этом свою уязвимость и быстро спрятали из публичного доступа все инструменты экспорта, поменяли формат. Вроде все правильно, но осадочек остался. Ну, а я зарекся добавлять подобный функционал в будущем :)
Дабы не застрять в описании всех и так уже всячески описанных аспектов мобильной разработки, постараюсь свой опыт и советы изложить тезисно. Отдельно отмечу, что многие советы применимы только для одинокого разработчика. Для команды, где роли программиста, дизайнера, локализатора и службы поддержки разнесены, возможно, советы будут даже вредны.
1. Отнесись к пользователю так, как хотел бы, чтобы относились к тебе
Жена открестилась от пирожков такой странной формы и отрицает причастность к таким кулинарным произведениям.
Все картинки нарисованы самолично прям на телефоне и не всегда могут раскрыть изначальный художественный замысел.
Как давний пользователь Android телефонов, я уже заранее знаю, какие приложения могут у меня задержаться — или незаменимые или удобные и красивые (часто это совпадает).
Незаменимых приложений нет — это был удел первопроходцев в далеком 2009 году, когда ОС только обживалась и пыталась потесниться с iOS, WinMobile и Simbian. Остается два взаимодополняющих критерия — удобство и «дизайн» приложения.
2. Сообщество бета-пользователей очень ценно. Дорожите ими.
Я имею две группы пользователей, активно участвующих в тесте и разработке программы.
4PDA
С самого начала я открыл тему на форуме и честно признался в своих намерениях и планах. И до сих пор текущий список задач пополняется в первую очередь оттуда. Большая часть участников темы — искушенные пользователи мобильных приложений, регулярно пополняемые перебежчиками из других приложений. Они приносят гору опыта и требований по функциональности. Естественно за темой надо следить и отслеживать все новые сообщения. Случайной невнимательностью очень легко обидеть человека, который абсолютно бескорыстно участвует в проекте, который тебе приносит доход.Google+
Осенью 2013 Google представил возможность создания групп бета-пользователей для получения раннего доступа к предрелизным версиям программы. Я разместил ссылку на эту группу на 4PDA и количество подписчиков медленно пополняется. Честно, я этим не пользуюсь.
Тех. поддержке на заметку
Наиболее лояльные пользователи самые привередливые.
3. Не откладывать проект дольше, чем на пару дней
Если долго не возвращаться к проекту, он может склеить ласты. Отслеживание новых веяний в мобильном дизайне, грамотная функциональная конкуренция, тех. поддержка
4. Отвечать на письма в течении трех суток
Иначе пользователь может отчаяться дождаться ответа и попросту забудет о приложении, как некой досадной случайности.
5. Отвечать на плохие письма в течение одних суток
Тут еще важнее ответить или сразу с решением проблемы, или с планом действий — что предпринять, что пояснить. Часто бывает, что из одного письма «Нихрена ничо не работает! Что вы нагородили?» можно вытащить зацепку к проблеме, проявляющейся только в определенных условиях и у конкретного пользователя.
6. Переводите приложение на как можно больше других языков
После первых релизов я практически сразу добавил самостоятельный английский перевод всех строковых ресурсов на английский язык. Конечно, это был корявый результат Google-переводчика, требующий правок и вычитки. В течение последующего года я получал письма о просьбе перевести программу на их родной язык, некоторые предлагали помощь. Не особо изучая готовые предложения для совместной локализации, я изобрел свой велосипед, подробно описанный в моей статье из песочницы. Если кратко — все строки для всех возможных языков я свел в одну большую Google-таблицу, сделал ее доступной всем, разрешив правки и добавление языков. Перед релизом я просто качаю полученную таблицу, разбираю ее собственным парсером (без велосипеда не обошлось), и на выходе аккуратная папочка с ресурсами, разложенными по языкам. Небольшим разработчикам очень рекомендую дать возможность помочь вам с переводом. Более того многие пользователи будут только рады это сделать и получить программу с качественным переводом, в котором они поучаствовали.
7. Лучший тестер программы — вы сами. После вашей кошки. Потом жена.
Надо об этом помнить всегда. Очень сложно делать продукт, которым не пользуешься, не имеешь собственного опыта работы с ним. Все данные, которые были мне присланы для анализа, те к, которые особенно сложные или большие (история авто за 12 лет, 3000 записей за полгода и т.п.) поселяются на моих тестовых устройствах и при подготовке нового релиза обязательно используются. Кстати кошка действительно нашла мне одну ошибку. Приложение, оставшись в фоне, что-то предприняло (считало, считало, да и похоже, зациклилось). Android медленно, с толком, с расстановкой подъедал батарею лежащего на столе телефона. И только определенная настойчивость кошки уложить свою наглую морду поперек телефона — выдало аппарат, превратившийся в мини-печку.
Бывают после нахождения сложного интерфейсного решения показываешь жене два вида одного и того же экрана. Ответное «И в чем разница?» сразу заставляют задуматься, а тем ли ты занимался предшествующие три часа. И так всегда — без стороннего, незамыленного взгляда и мнения очень сложно потерять фокус и сбиться на пути разработке. А потому показывать свое детище нужно всем. Кто на это легкомысленно согласился.
8. Конкуренты — наше все.
Ничто не вечно под луной. Рынок программного обеспечения привлекает своей кажущейся простой выхода на него. Тысячи новых разработчиков, миллионы новых приложений все время подбадривают, не давая остановится на месте. Если не идти вперед, однозначно кто-то тебя обойдет функционально, интерфейсно, эргономически. Вариться в собственном соку могут позволить себе только те, кто верят в свои позиции. Но история развития того же Windows Phone доказывает обратное. Нужно всегда смотреть по сторонам. Что изобретают, что добавляют конкурирующие предложения. И сделать лучше, или добавить новую доселе невиданную, но исключительно полезную функцию.
Вот до моих приложений никто не предлагал учета двух видов топлива, только сливать в общий бак. После моего релиза уже есть попытки и у других приложений закрыть этот вопрос. Не было у других учета расходов, и они зашевелились. Проморгал, не подметил нового тренда в твоей отрасли, и ты уже все, записан в догоняющих.
9. Если крепкие нервы и намечается небольшой отпуск без определенных планов.
Можно добавить себе седых волос — выпустив релиз с большим количеством нововведений не в мягком поэтапном режиме (где можно управлять количество обновляемых в сутки устройств — 1%, 2%, 5%, 10%…), а сразу и внезапно. Незабываемые часы общения на тонну писем вам обеспечены. Даже если вам повезет, программа будет оттестирована и выверена, однозначно вылезет очень противный баг и все вам испортит, заставляя несколько часов кряду вначале добиваться проявления этого бага, а потом его лечения.
А если нововведения не кардинальные — просто разомнетесь легким чтивом в форме вопросов и ответов. Когда некоторые вопросы стали повторяться, и я уже стал путаться в заготовленных шаблонах для ответов в почте — я создал сайт-FAQ для проекта, куда вывел все подробные инструкции и подсказки. Более того, один пользователь из Германии помог мне перевести основные статьи и на английский, и на немецкий. Побольше б таких пользователей!
Ах да, самые интересные графики и цифры я приберег напоследок.
Общий график установок первого и второго приложения.
Количество дневных установок
По динамике последних месяцев особенно сильно виден отток пользователей от первого приложения ко второму. Как я уже отметил, «продвинутые» пользователи уже выросли из просто учета расхода топлива, им уже этого мало. Да и моя более активная деятельность в тестировании последних бета-сборок именно на базе второго приложения (с меньшей аудиторией) не добавляет мне популярности.
Профит, который получил мой сосед за точно такие же приложения (включая 30% комиссии). Вроде тот же сосед, что и у PapaBubaDiop.
На текущий момент чистый ежемесячный доход соседа около $350–450. С текущим курсом это весьма приятная дополнение к основному заработку, который зачастую ниже. В разработку и продвижение не было вложено ни копейки, более того не использовались никакие даже бесплатные каналы для продвижения. Суммарные 500К установок, 70К активных пользователей, 4К уникальных посещения ежедневно. 400 — 1000 дневных установок.
По мере приближения приложений к идеалам, нарисованным в воспаленном воображении, все больше чешутся руки предпринять более конкретные действия:
- Вплотную заняться аналитикой, которая сейчас используется не более как для сбора отчетов по ошибкам и статистики наиболее популярных мест приложений.
- Опубликовать несколько обзоров в тематических блога (видеоблогах?), просмотреть отдачу.
- Создать несколько мини-приложений на авто-темы для внутренней рекламы основных приложений.
Но это будет совсем другая история…