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

Для кого я это пишу? Для тех, кто подумывает стать мобильным разработчиком, кто почитает про мои неудачи и сможет избежать «хождения по граблям».

С чего всё начиналось

Я большой любитель послушать аудиокниги, в особенности российскую фантастику, фентези, ужасы, постапокалипсис. Пока двигаешься на работу, идёшь в магазин, разбавляешь серость окружения погружением в виртуальные реальности. Но не все книги одинаково интересны, я как правило слушаю пару глав, понимаю, что мне не нравится и отправляюсь на поиск другой аудиокниги. С таким подходом покупать, каждый раз продукт, который не используется нерационально (и очень накладно — в день по паре аудиокниг). В итоге я пришёл к тому, что стал зависать в соответствующем разделе рутрекера, скачивать, закидывать на телефон, слушать в приложении. Естественно, такой алгоритм неудобен, отправился на поиски приложения, которые бы автоматизировало этот процесс, но такого приложения не было. И тут пришла мысль «я со школьных лет увлекаюсь программированием, неужели не смогу разобраться и сделать приложение?».

Ошибка: Идея не обдумана. Загорелся и стал сразу делать.

Правильный подход: Перед тем как начинать работу над проектом, хорошо подумайте, что Вы хотите сделать, и к чему это может привести.

Первый шаги в программировании под Andoid

Какой лучший источник информации, придумало человечество? Книга. Но мне нужна простая подача и быстрый переход к практике, так я нахожу «Android App Development For Dummies» (Android разработка приложений для чайников). Читаю, начинаю набираться базовых знаний, узнаю что есть такой язык Kotlin — более продвинутая версия Java, соответственно читаю «Beginner's Guide to Kotlin Programming» (Гайд по программированию на Kotlin для начинающих). Дело идёт медленно, информация плохо стыкуется с реалиями установленного Android Studio. Для примера, в книжках я научился использовать DataBinding для наполнения интерфейса данными, а в начальном шаблоне Android Studio используется более современный ViewBinding для того же. Соответственно мозг закипает, получается адский говнокод из намешанных костылей.

Прорыв случается, когда я натыкаюсь на «Google Codelabs», по нашему «лабораторные работы». Прям как в универе: в начале немного теории, потом последовательная серия заданий, выполняя которые приходишь к результату. Обучение пошло в гору, начало что-то получатся. Но не всё так радужно, часть «лабораторок» давно не обновлялась и в итоге я учился «плохим», устаревшим приёмам, снова приходя к «коллизии головного мозга».

Ошибка: Учится классическим способом. Мобильная разработка слишком динамично развивается и старые подходы к обучению не применимы.

Правильный подход: Начните с Google Codelabs, обращайте внимание, когда обновлялась лабораторная работа, старые — игнорируйте.

Первые версии, публикация в Google Play

Итак, гибрид из браузера, торрент-клиента и аудио-плеера готов. Библиотека Retrofit отправляет запросы к форуму, преобразует данные в классы, которые сохраняются в sqlite3 базу (для кэширования). Версия Libtorrent для Android скачивает аудиокнигу через механизм WorkManager. Exoplayer создаёт виджет и отвечает за проигрывание. Казалось бы простая комбинация готовых решений, но чтобы это всё заработало ушла уйма нервов и времени.

Мой радости нет предела, идея воплощена, всё работает и аудиокниги я уже слушаю через своё приложение. Название выбрано незамысловатое «Аудиокниги — Торрент». На волне оптимизма решаю публиковать приложение в Google Play. Оказывается для этого нужно заплатить порядка 20 долларов для создания аккаунта разработчика. Не беда, проплачиваю аккаунт, начинаю заполнять формы. Решаю сделать 2 версии платную и бесплатную («спасибо» прочитанным книжкам), с рекламой и без соответственно. Рекомендуется делать это с помощью «product flavors», что добавляет дополнительной путаницы. Загружать приложение тоже не просто, надо подписывать ключами, делать appbundle, хочется загрузить уже по-быстрее, а тут «всякие усложнения». После страдания с заполнением форм в Google Play, приложение уходит на модерацию.

Естественно что ни с первого, ни со второго раза модерация не пройдена. Где-то не правильно заполнены данные, где-то я использовал чужую картинку. В конце концов все проблемы исправлены и приложение опубликовано.

Снова моей радости нет предела, приложение можно скачать в магазине приложений.

Ошибка: Торопится быстрее опубликовать приложение. Использовать product flavors.

Правильный подход: Хорошо протестируйте приложение, сначала сами. Обзаводитесь разными телефонами, опробуйте на них приложение. Уговорите знакомых попробовать Ваш продукт, получите обратную связь. Внимательно заполняйте формы в Google Play. Лучше если у Вас будет всего одна версия, проще поддерживать, платные функции можно сделать подпиской или разовой оплатой.

Первые пользователи, первый негатив

У приложения стали появляться первые пользователи, и естественно у многих приложение не работало, вылетало. Большинство пользователей не пользовались VPN и у них ничего не открывалось. Начался процесс отлова и исправления багов, пришлось сделать backend, арендовать сервер и vpn, приложение начало приносить убытки.

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

Оценки у приложения пошли вниз, на почту полетели сообщения о проблемах. Доработка приложения и backend стала отнимать всё свободное время, волны негатива стали портить нервную систему. С рекламы приложения капали сущие центы ( до 10 центов в день).

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

Ошибка: Позволять задевать за живое негативным отзывам. Торопится закрыть все баги.

Правильный подход: Игнорировать негатив, планировать свою работу над ошибками, не позволять вгонять в себя в депрессию.

Наконец светлая полоса, но ненадолго

Серия обновлений, наконец привела к тому, что приложение стало работать более менее стабильно, количество пользователей росло. Спустя год приложение набрало порядка 1300 официальных пользователей (не официальных раза в 3 больше), реклама стала приносить доход, порядка 3х долларов в день, наконец приложение стало прибыльным, а не убыточным. Тенденции стали позитивными, Google Play стал активно предлагать приложение к установке. Время на доработку приложения сократилось и я наконец немного расслабился.

И тут как гром среди ясного неба прилетает письмо со следующей темой «Action Required: Your app is not compliant with Google Play Policies (Аудиокниги — Торрент)» (Требуется действие: Ваше приложение не соответствует политике Google Play).

Литрес отравил жалобу, указав что через приложение можно скачать их аудиокнигу Стивена Кинга. Гнев, отрицание, желание пожаловаться на то, что через Google Chrome я могу скачать ту же аудиокнигу. Вобщем поделать ничего нельзя, так как приложения через которые можно нарушать авторское право не допускаются в Google Play.

В расстроенных чувствах, я публикую «pro» версию на 4pda, добавив кнопку «поддержать» в меню (донат через qiwi), в надежде на то, что поддержка людей позволит оплачивать сервак и VPN для backend и приложение продолжит жить.

Ошибка: Как и писал в начале статьи, надо было крепко подумать перед тем, как начинать что-то делать.

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

Погружение во Flutter, возвращение к аудиокнигам

Мне понравилось программирование для мобильных устройств. Проанализировав все предыдущие ошибки, я решил сделать оригинальное развлекательное приложение для «всего мира». Моя жена художник и мы решили начать с простого — сделать приложение для создания аватарок, её рисунки мой код. В это же время я проникся Dart и Flutter — это оказалось просто манной небесной, все фишки из современных языков программирования, единая платформа для сборки. Например можно делать версию приложения на рабочем компе под x86, а потом просто собрать его для Android. Никакой мороки с эмуляторами, всё быстро и по современному. По началу естественно было сложно переключится на Flutter так как там всё по другому (если сравнивать с разработкой Android/Kotlin), снова напряжение мозгов, преодоление «затыков», связанных с примерами для старых версий фреймворка. Но теперь я уже учился по Codelabs, что сильно ускоряло процесс. В результате мы выпустили два генератора аватарок в Google Play: Anime Waifu Avatar Maker и Anime Cutie Avatar Maker. Названия понятно, что подобраны под целевую аудиторию :)

Всем кто желает попробовать мобильную разработку, я рекомендую хотя бы попробовать Dart/Flutter. Для меня это стало просто манной небесной. Такое же чувство я испытал будучи школьником, когда попробовал писать на C++ после Pascal :)

Все эти новые навыки связанные с Flutter, показали мне, как плохо я сделал своё приложение по аудиокнигам. Захотелось сделать версию и для ПК (я работаю на Linux но иногда и сижу на компьютере с Windows). В какой-то момент это стало навязчивой мыслью и вместо того, чтобы отрубить backend для приносящим убытки Аудиокниги — Торрент, я засел за новую версию на Flutter. Самая большая сложность возникла с торрент клиентом, была древняя библиотека torrent_task но она не совместима с современной версией Dart. Сделал форк и начал переделывать, доделывать. Дело не простое, но в итоге всё заработало (если Вам нужен торрент клиент на Dart можете использовать мой форк на github). Несколько месяцев упорного труда и приложение готово.

Больше всего вопросов возникло, с тем, как сделать это приложение не убыточным. Я вижу по нагрузке на backend что пользователей много (тысячи), но доходов нет (суммарно с донатов я получил порядка 1000 рублей за полгода). В итоге сделал канал в телеграмм и на boosty (Аудиокниги — приложение) в надежде собрать аудиторию приложения там. Решил размещать на бусти версии для ПК (для подписчиков), а в телеграмм для Андроид.

Пока не знаю где именно я сделал ошибки на этот раз. Может стоило в самом деле всё отключить и не тратить время и деньги на бесперспективное программирование.

Жду от Вас, обитатели Хабра, указаний на мои ошибки, советов, что делать в комментариях (заранее спасибо!).

Комментарии (15)


  1. SozTr
    18.05.2023 21:12
    +4

    Больше всего вопросов возникло, с тем, как сделать это приложение не убыточным. Я вижу по нагрузке на backend что пользователей много (тысячи)
    Убрать бэкенд, сделать обработку ошибок и выдавать ошибку — поставьте VPN. Кто не ставит, сам себе ЗБ.

    Несколько месяцев упорного труда и приложение готово.

    Это основные затраты — посчитайте сколько стоит эта разработка (например количество часов * $20/час), ужаснитесь и забудьте про монетизацию.

    Плюс если приложение будет хоть сколько нибудь популярное — обязательно за пиратство притянут.

    Так что если только прёт от этого — то ок, денег так не поднять. Лучше устроиться в тёплую конторку и стричь свои купоны.


  1. Roma_letchik
    18.05.2023 21:12
    +2

    Ожидал что после этого вас взяли в Литрес.


  1. dancheg
    18.05.2023 21:12

    Так держать бро! Если вдруг будет желание освоить еще и разработку на flutter под линукс (можно делать очень крутые линуксовые клиенты), то пиши, расскажу, тг: @dancheg97


    1. Sazonov
      18.05.2023 21:12
      +1

      А почему именно под линукс? Флаттер изначально разрабатывался как кросс-платформенное решение.


  1. Tarakanator
    18.05.2023 21:12

    желание пожаловаться на то, что через Google Chrome я могу скачать ту же аудиокнигу

    Хм... а почему нет? Меня реально интересует где граница, при которой запрещают инструменты, с помощью которых можно нарушать закон.
    Или всё как в России. Свистки попадают под определение сигнального оружия, но никто оружием не считает потому что здесь так принято.


  1. DustCn
    18.05.2023 21:12
    +6

    Литрес это еще то мудачье.


  1. debug45
    18.05.2023 21:12
    -2

    Как-то всё же не клеятся у меня в голове понятия «Flutter» и «мобильный разработчик»…


    1. psycura
      18.05.2023 21:12

      А можно поподробнее? Почему не клеятся?


  1. PackRuble
    18.05.2023 21:12
    +1

    Интересная история. С радостью прочту статью о применяемых либах в flutter приложении -- менеджер состояния, архитектура проекта, хранилище :)


  1. out0f0rder
    18.05.2023 21:12

    Приложение то огонь! Прям то, что я всегда искал!

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

    И с навигацией по библиотеке как то все не очевидно. Запуская закачку книги, обратно так просто уже не вернёшься. А мне прям сходу захотелось скачать несколько книг по одному поисковому запросу.


  1. psycura
    18.05.2023 21:12

    Правильный подход: Перед тем как начинать работу над проектом, хорошо подумайте, что Вы хотите сделать, и к чему это может привести.

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

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

    И такие остановки, чтобы подумать, нужно делать почаще.


  1. psycura
    18.05.2023 21:12

    И тут как гром среди ясного неба прилетает письмо со следующей темой «Action Required: Your app is not compliant with Google Play Policies (Аудиокниги — Торрент)» (Требуется действие: Ваше приложение не соответствует политике Google Play)

    Я правильно понимаю, что ты создал своего рода агрегатор торренов для аудио книг?

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

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

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


  1. psycura
    18.05.2023 21:12

    А вообще статья хорошая!

    И твой посыл очень правильный.


  1. Georrg
    18.05.2023 21:12

    Dart проигрывает Kotlin во всем по синтаксису, пожалуй кроме mixin. Среды как таковой для платформы нет, лишь стремные плагины для AS, VS и т.д. Пишу и на том и на том, и имхо flutter полное дно в сравнении с нативной разработкой. Если бы не мультиплатформенность из коробки, выбросил бы его в окно, но увы деньги для меня важнее радости писать на чистом котлине ;)


  1. Georrg
    18.05.2023 21:12

    В остальном конечно автор молодец, так держать)