Pull to refresh

GoSh! для путешественников — история одного домашнего проекта

Reading time11 min
Views4.3K

— Скажите, вы любите путешествия?


Уверен, что вы ответите "да", вряд ли в другом случае вы бы обратили внимание на эту статью :)


— Интересна ли вам тема мобильной разработки?


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


— А как насчет кроссплатформенной мобильной разработки?


Знаю, знаю, холивар, но, что поделать — будем спорить и рождать истины.


Так или иначе, в этой душераздирающей истории данные темы будут затронуты, так что — самое время закрыть статью, если вы ожидаете чего-то другого ;) Хотя, я постараюсь написать так, чтобы тут были не только технические детали.


Итак, небольшая предыстория


Как я уже рассказывал, я люблю путешествовать. Для меня это всегда драйв и приключения, которых хочешь и ждешь. Кроме того, несколько лет назад я попробовал в формате очерка описывать свои путешествия, и мне это понравилось. Не то, чтобы я стал каким-то популярным блоггером — нет, да и не было у меня такой цели. Но бложек я себе для путешествий завел — gromozeka07b9.livejournal.com, хотя бы друзьям показывать. Все было здорово, по-началу — мне нравилось, по возвращению домой я пару дней тратил на то, чтобы оформить все свои приключения в виде каких-то интересных историй. Но, через некоторое время я понял, что просто успеваю забыть часть интересных событий к моменту возвращения, и я решил прямо в поездке делать заметки. В различных электронных блокнотах, заметках и т.д. Это немного упростило жизнь, но все равно не было удобным, в итоге все равно много времени тратилось на сборку этого добра в рассказ. Еще чуть упростило жизнь оформление рассказа в виде канала в Телеграм, правда, со своими проблемами.


Рождение идеи


Вначале было… пицца. Сидим мы как-то с моей командой в пиццерии "Додо-пицца", говорим за жизнь и постепенно переходим к обсуждению небольшого стартапа, который бы помогал туристам при поиске достопримечательностей, интересных маршрутов, использовал квесты, даже некую форму монетизации придумали. Но, в процессе обсуждения у меня постепенно сложилось видение другого продукта — скорее, инструмента для путешественников, которым нужны как инструмент для блога, так и некий заметочник, ориентированный на личное пользование. У меня была боль, и я увидел способ ее решения :)


В итоге, вырисовалась концепция — для начала, это мобильное приложение, которое позволяет оффлайн создавать маршруты, отмечать точки, добавлять описание, фотографии, делиться им как с другими пользователями приложения, так и наружу — в различные Livejournal, Instagram, Facebook и т.д. Должна быть возможность работы именно оффлайн, поскольку путешествия не всегда проходят там, где есть сеть, но при этом должна быть возможность синхронизации данных в облака. Даже рабочее название было придумано — QuestHelper.


Это было программой-минимум. Кроме того, был еще один момент, который мне был интересен. Я интересовался мобильной разработкой, и мне очень хотелось попробовать сделать реальный продукт на новой платформе.


Собственно, все эти мысли пришли в голову в один вечер и уже на следующий день мы начали работу.


Пару слов о команде

Разработка на мне.
В качестве product-manager-а выступила моя жена Ольга.
Дизайн от моего сына Клима.
И бесценные советы от советницы-дочери Вероники :)


К делу!


Следующий день меня не покидали мысли о приложении. В голове уже рисуются макеты интерфейса и пилятся фичи. Реальность оказалась, конечно, сложнее. Чтобы хоть что-то сформулировать, мы несколько часов потратили на то, чтобы на бумаге сформулировать основной функционал и визуализировать принципы навигации в приложении, данные черновики в итоге перенесли в fluidui.com для того, чтобы можно было поэкспериментировать с макетом приложения. Это было крайне правильное решение, которое позволило потом кучу времени сэкономить — я не столько про fluid, сколько про то, что обязательно нужно макетировать интерфейс.


Макет позволил мне поставить уже конкретные задачи нашему дизайнеру и не объяснять на пальцах функционал приложения, а просто показать макет, из которого все это понятно.
А тем временем, в Visual Studio родился новый солюшен, на базе Xamarin.Forms — QuestHelper.


Почему Xamarin? Если интересно, заглядывайте под кат

Честно говоря, для себя, альтернатив я не видел тогда и не вижу сейчас. У меня мало опыта работы с Javascript, и заниматься изучением чего-то подобного React Native желания не было. С нативной разработкой так же — я на проекте единственный разработчик, изучать сначала Java, а потом Objective C или Swift — значит похоронить проект, меня одного на это просто не хватит.
Поэтому, я стал смотреть в сторону кроссплатформенных инструментов для мобильной разработки.


У меня уже был небольшой опыт работы с Xamarin.Android — я писал переводчик, который работал в виде чата, получилось вполне удобно, я сам им до сих пор пользуюсь:
Это было в далеком 2016 году, когда Xamarin был вполне даже платным и это доставляло большие проблемы, в основном из-за того, что проект изначально задумывался только как ознакомительный, без какой-либо монетизации.


Примерно в тот же период, Microsoft покупает Xamarin и делает его бесплатным, как минимум, для моего сценария, что снимает у меня одну головную боль.


Как я уже говорил, новый проект я изначально задумал сделать именно на Xamarin.Forms — как минимум, чтобы познакомиться с технологией, понять перспективу. Все-таки заманчиво иметь один код, работающий на нескольких платформах.


Если вы мало что слышали про Xamarin, то примерно ситуация такая:


  • Есть подход Xamarin.Classic (или Xamarin.Native). Смысл в том, что в таком подходе вы разрабатываете в одном проекте общую бизнес-логику (работа с БД, сервисами и т.д.), и в отдельных проектах — нативный UI, который использует один проект с этой логикой. Грубо говоря, в солюшене VS у вас три проекта:
    • BL (Бизнес-логика, общая для всех платформ)
    • Native Android UI
    • Native iOs UI
  • Подход Xamarin.Forms. В таком подходе у вас общий проект не только с бизнес-логикой, но и UI. Это накладывает свои ограничения на UI, он становится унифицированным для разных платформ, но позволяет использовать один и те же формы, описанные на XAML.

Слово за слово, строчка за строчкой баг за багом.


Так и родилось некое подобие "hello world" приложения на Xamarin.Forms, которое в начале не умело ничего, кроме как показать карту с точками из локальной базы данных. Постепенно проект меня все больше увлекал — ведь это была не только возможность знакомства с технической платформой, но и использование продуктовых практик, которые позволяют попробовать думать как владелец продукта. В частности, был хороший опыт, когда мы с командой и друзьями собрались на небольшую встречу в коворкинге и попробовали составить Customer Journey Map. Я не скажу, что получилось все прямо так, как хотел, но я получил много новых мнений и мыслей, на тему развития продукта. Как оказалось, у людей боли вообще на мои оказались не похожи :)


Осторожно, заразно!


Постепенно, мой энтузиазм начал передаваться команде.


Это было здорово, когда мы, вместо просмотра какого-то сериала, всей семьей собирались на кухне и рисовали CJM, экраны приложения, обдумывали способы монетизации, формировали бэклог. В какой-то из таких вечеров, я уже не помню кому, пришла в голову мысль — название QuestHelper какое-то скучное, к тому же, заточенное на квесты, о которых мы в самом начале думали. Даешь новое название!


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


В итоге, на семейном командном совете было решено, отныне наш слоган:


  • I go.
  • I share.
  • I live.

Так и родился GoSh! (Когда у меня будет штат маркетологов и бренд-менеджеров, я обязательно дам им задание придумать, где в GoSh! часть "I live" :)


Тогда же появилась версия логотипа, в основе которого идея пиктограммы "Share":




Первое практическое использование


К августу 2018 года я лихорадочно пишу говнокод веду разработку фич, которые позволят мне использовать GoSh! в реальных условиях, в походе по Камчатке. Самое главное, что на тот момент мне было нужно — это возможность без сети создать маршрут, отметить интересующие места, добавить фото и текстовые заметки к этим местам.


Последний до вылета коммит был сделан за пару часов до выезда в аэропорт. Это был тот еще драйв! Какие же были радость и удовлетворение, когда я на практике использовал то, что сделал своими руками! Все две недели похода я вел записки в GoSh!, и что немаловажно, мне показалось это очень удобным. Без косяков, конечно, не обошлось — ошибок было полно, и первый практический опыт пополнил бэклог продукта как новыми фичами, так и вереницей багов. Кстати, данный маршрут и сейчас доступен в GoSh! — вы можете и сами посмотреть.


Так что же GoSh! такое и чем он может быть вам полезен?


Сейчас GoSh! представляет собой мобильное приложение под платформу Android, работающее с облачными сервисами для синхронизации данных. Основные функции приложения такие:


  • Создание маршрута
  • Отметка точки маршрута
  • Добавление в точке маршрута фото, аудио, текстового описания
  • Распознавание текста из вашей аудио-записи через сервис Yandex SpeechKit
  • Импорт точек в маршрут из Google Maps, Yandex maps
  • Возможность поделиться маршрутом с другими пользователями GoSh!
  • Авторизация как своя, так и через Google
  • Полная синхронизация ваших данных с облачным хранилищем

Одно это уже позволяет использовать GoSh! для ведения путевых заметок.


И, к слову, я за собой заметил, что практически перестал просто снимать фото на смартфоне — я теперь снимаю фото только через GoSh! Это не столько реклама, сколько говорю о удобстве для себя — припарковал автомобиль где-то, отметил точку в личном маршруте "Парковки", теперь не забуду :) Или, например — посещая митапы или конференции создаю маршрут, например "Agile days" — в него скидываю все, что на конференции меня заинтересовало, текст, аудио, фото. Теперь они не потеряются в ворохе других материалов, а при желании я поделюсь ими с другими пользователями.


Лучше один раз увидеть, чем сто раз услышать

Экран загрузки приложения:
image


Первый экран инструкции по использованию:
image


Пример списка маршрутов:
image


Пример списка точек маршрута:
image


Визуализация маршрута:
image


Пример отображения точки маршрута:
image


Так что же дальше-то?


Свою проблему я частично решил, но пришли мысли о том, что возможно, идея такого тревел-заметочника будет и другим интересна, поэтому, хорошо бы попробовать разобраться с тем, что нужно людям. Как общение показало, не так много людей интересует ведение заметок или создание маршрутов, это вообще интересно оказалось единицам в моем окружении. И в основном, людям интересно пощелкать фото и выложить их в свой уютный инстаграмчик.


Поэтому, в основном сейчас бэклог строится на социальных вещах, типа:


  • Конечно, добавить экспорт маршрутов в Facebook/Instagram/VK и т.д.
  • Добавить возможность просмотра маршрутов не только в GoSh! но и через галерею на сайте
  • Добавить возможность в GoSh! находить и просматривать опубликованные другими пользователями маршруты
  • Добавить возможность комментирования и лайки
  • Локализация — добавление интерфейса на английском языке
  • Возможно, более удобный функционал планирования маршрутов

А что прямо сейчас происходит?


Ну, кроме того, что я решил немного рассказать о проекте вам, прямо сейчас наш бессменный дизайнер (мой сын Клим) разрабатывает лендинг на Тильде, чтобы можно было что-то людям показать без установки приложения, плюс, небольшая реклама конечно не помешает.


Вот так лендинг выглядит сейчас: Лендинг GoSh!
Не судите строго, это первый наш опыт :)


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


Итак, что же мы узнали за год?


Первое.


И самое важное — должен быть кто-то, кто будет "драйвить" проект.


В данном случае, это я. Когда из меня прёт энергия, никому отсидеться дома в уголке уже не получается, все вынуждены вовлекаться :) Когда меня отпускает немного — отпускает всех. И такими периодами подъема и спуска мы и работаем. Хотя я благодарен своему семейству за помощь — реально, одному совсем было бы тяжело. Так же я периодически мучаюсь от того, что не могу больше времени уделить проекту, тупо времени не хватает, хотя, когда работаю над ним, я просто кайфую и наслаждаюсь. Иногда встаю в 5 утра, чтобы до 8 утра (пора и на основную работу) успеть что-то полезное сделать. И 2х-недельный отпуск в месте, где есть интернет — это повод выпустить с десяток ночных релизов :) Когда видишь результат своей работы, причем не отложенный по времени, а прямо сейчас можешь им воспользоваться — это заряжает.


Второе.


Понимание этого пришло постепенно. Сначала, у нас были идеи уровня "космические корабли бороздят просторы большого театра". Постепенно, они начали приземляться, и когда появился минимальный продукт, который можно "пощупать" — стало понятно, насколько тяжело развивать продукт. Это реально работа — выясни потребности рынка, боль людей, найди конкурентов, пойми, чем же ты от них отличаешься, причем еще объясни это аудитории… В конце-концов, заинтересуй людей хотя бы установить себе приложение чтобы посмотреть — и то это проблема, даже в ближнем круге людей, не говоря уже о том, чтобы незнакомые люди поставили себе что-то, да еще и обратную связь дали. Но, всё равно спасибо многим друзьям и родственникам, кто сделал это, без вас я бы наверное все давно бросил.


Третье.


Я часто слышу — "ну ты что, надо было делать MVP действительно минимальным и проверять на публике". Я согласен. Одно "Но" — надо четко понимать, а зачем, какая у тебя цель? Ты реально хочешь выпустить востребованный продукт, или может быть, ты что-то другое хочешь? И мой опыт мне показал — как минимум, год я потратил не на то, чтобы выпустить реальный продукт, а на то, чтобы познакомиться с технологической платформой. Этой цели я добился, и сейчас появилось понимание, что хорошо бы уже подумать и над развитием, собственно, полезного людям продукта, а не очередной, интересной только для меня, фичи. В общем, пришла пора подумать не только о себе, но и о том, что нужно вам :)


Четвертое.


Команда. Нужны единомышленники, у кого ты можешь учиться, может быть, сам кого-то сможешь научить. В конце-концов, если хорошая команда — вы будете друг друга мотивировать что-то делать. Да и с практической точки зрения — мне, например, зачастую стыдно, на свой код смотреть :) Вначале были и тесты, и код старался более-менее аккуратно писать, но, вследствие того, что времени совсем впритык, тесты полетели первыми, да и на качество кода начал забивать. Если бы в команде были еще разработчики, эти отмазы бы не прокатили :) Ну и конечно — команда, это новые идеи, новые взгляды на решения.


Технические подробности


Никакой философии, все по делу

Итак, C#, Visual Studio 2017, Xamarin Forms.


Разработка как на PC (дома), так на Macbook (в дороге), в студии для мака.
На данный момент публично доступна только сборка для Андроид, в гугл плей. Для iPhone сборки в начале делал, но сейчас бросил эту затею — нет времени на то, чтобы разделять внимание на две платформы, ведь как бы там ни было, корректировать UI все равно приходится, плюс ко всему, в некоторых случаях используешь нативные контролы — например, работа с картой, и фактически то же самое придется делать для iPhone.


В качестве локального хранилища использую проект Realm (на Translate Helper использовал SqlLite, ничего плохого не могу сказать — Realm скорее появился из любопытства, чем из практической необходимости).


Что касается сервера. На сервере хранятся все маршруты и медиа-файлы, которые использует пользователь при работе в GoSh!, это нужно, как минимум для того, чтобы в принципе была возможность поделиться маршрутами. Сервер написан на .Net Core, поначалу хостился в Azure, пока у меня была подписка BizSpark, но, пару-тройку месяцев назад подписка кончилась, и я переехал на linux хостинг в reg.ru, благо переписывать практически ничего не пришлось. Из плюсов — сильно скорость доступа к данным выросла, а из минусов — потерял возможность использования Application Insigths. БД на сервере — MySQL.


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


Статистика работы приложения вся попадает в appcenter.ms, благо он бесплатен для моего уровня. Очень удобно почти в реальном времени видеть и ошибки, и статистику по действиям пользователей.


Пожалуй, это все по технике, если что-то интересно будет — спрашивайте в комментариях, я расскажу.


Что я хотел бы сказать вам напоследок.


Я уверен, эта история не закончена.


Мне нравится то, что я делаю, надеюсь — вам тоже понравится! Хотя я прекрасно понимаю, многие из вас, кто поставит себе приложение, столкнутся и с ошибками, и нестыковками, и где-то неудобством интерфейса — да, к сожалению, все это есть, из MVP проект, по сути, пока не вылез.


Друзья, я буду рад услышать ваше мнение, возможно, даже рассказы про ваши заботы в путешествиях, для которых, может быть, рано или поздно у меня найдется решение :)
А уж если вы еще и в Google Play добавите свое мнение — да я вас обниму! :)


Для начинающих, кто только думает о том, чтобы создать свое первое мобильное приложение — обращайтесь, я поделюсь тем, что знаю по Xamarin. Это не так много, как хотелось бы, и в основном, по Андроид, но — я буду рад вам помочь, вместе мы что-нибудь полезное точно сделаем!


Так же меня можно найти здесь: Facebook


А где же котики!?

image


UPDATE (вечер дня публикации статьи):
Сегодня был удивительный день, такого драйва давно не было!
После публикации статьи на Хабре у людей появились и вопросы, и предложения, вообще клёвые ощущения, когда есть те, кому не все равно! Спасибо вам за поддержку! Но еще, интересно было добраться до дома вечером, и посмотреть статистику по установкам, входам в приложение и конечно, просмотрам альбомов. Ожидаемо, количество скачек взлетело в два раза. Но, когда я посмотрел, чем же народ интересуется, какие альбомы смотрит — я был, мягко сказать, удивлен. Мы с женой, еще весной, готовили альбомы маршрутов, приводили их в приличный вид, чтобы не стыдно показать было: фоточки-описания. И что вы думаете? Альбом "Камчатка" — почти не смотрят. "Байкал" — почти не смотрят. Другие туристические альбомы — да там же, примерно. Но зато маршрут, в котором жена выкладывала фотки с выставки картин Фриды Кало — в топе по просмотрам. Заходите и вы :)

Tags:
Hubs:
Total votes 25: ↑19 and ↓6+13
Comments19

Articles