Как Литрес сделал из меня Flutter разработчика

9f12a714c2793bfb83618ec285c1a3fa

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

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

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

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

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

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

Первый шаги в программировании под 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 (Аудиокниги — приложение) в надежде собрать аудиторию приложения там. Решил размещать на бусти версии для ПК (для подписчиков), а в телеграмм для Андроид.

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

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

© Habrahabr.ru