При огромной конкуренции цифровых продуктов и высокой скорости запуска новых необходимо быстро и дёшево проверять жизнеспособность продуктовых идей. В этой статье я расскажу об опыте создания MVP собственными силами, т.е. фактически силами одного iOS-разработчика. О том, как я искал баланс при создании MVP, об инструментах, сложностях и их решении. Если вы планируете воплотить в жизнь первые проекты в мобильной разработке или хотите добавить новую ветку функционала в уже существующий продукт, то эта статья точно для вас.
![image](https://habrastorage.org/r/w780q1/webt/nf/sy/gz/nfsygzlftwqg_y6rp0x6uuo1t7c.jpeg)
Давайте сначала вспомним, что такое МVP.
MVP (minimum viable product — минимально жизнеспособный продукт) — продукт, обладающий минимальными, но достаточными функциями для удовлетворения первых потребителей.
Главная задача MVP — получить обратную связь, чтобы сформировать гипотезы дальнейшего развития и в целом оценить его целесообразность. Т.е. это должно быть максимально дёшево в случае неудачи и при этом жизнеспособно при положительном сценарии. Поэтому основную задачу можно свести к пресловутому поиску баланса на каждом этапе разработки.
![](https://habrastorage.org/r/w1560/webt/mj/xd/c3/mjxdc30ciw0mkply_oagmn4ujvk.png)
Итак, мне нужно было сделать мобильное приложение со следующим набором основных функций:
Минимальные ресурсы для этого проекта — один iOS-разработчик и 2 месяца на разработку и тестирование. Больше похоже на челлендж. Но без паники! Конечно же, я использовал уже готовые наработки. В MVP точно не стоит заниматься разработкой своих библиотек. Так что закладываем несколько дней на подбор готовых решений и необходимых опенсорс-проектов.
Одной из не самых очевидных вещей из минимального набора для MVP является дизайн. Кажется, что для него достаточно перечислить названия экранов и за что они отвечают. Но в действительности же тщательно проработанный интерфейс значительно ускоряет процесс, позволяя разработчику избавиться от многих неопределённостей в работе. Проработка дизайна на ранних этапах даёт более чёткое понимание user flow, позволяет убрать лишнее и сконцентрироваться на минимально достаточном функционале для первой реализации проекта.
Конечно, фокус не должен смещаться в сторону сложных анимаций, но ведь первое впечатление можно произвести только один раз! Поэтому простой, но приятный интерфейс и понятный туториал — то, что нам нужно.
В моём случае финальный дизайн приложения был практически готов к старту разработки.
Наверное, несложно догадаться, что я работал над iOS-клиентом, и это та часть, которую нужно было сохранить и развивать далее в этом проекте. Поэтому закладываем добротную архитектуру и выделяем в модули те самые минимально жизнеспособные части, которые будут заменены на следующих этапах разработки.
Исходя из этих требований также ясно, что приложение нуждается не только в клиенте, но и в базовой логике на backend. Т.е. нужна авторизация, логика присоединения и выхода из них, формирование и менеджмент контента, отправка пуш-уведомлений.
Один из необходимых инструментов — облачная БД. Для этого я сравнил несколько самых популярных вариантов.
![](https://habrastorage.org/r/w1560/webt/np/ec/bk/npecbkuo-aormwfoqlp9zplce7s.png)
Из таблицы выше понятно, что Firebase — это отличное комплексное решение от Google, способное покрыть большинство потребностей разрабатываемого приложения.
Такие решения позволяют держать все элементы управления в одном месте: учётные записи пользователей, список комнат и их настройку, аналитику и информацию о крашах. А в этом случае ещё и можно управлять комнатами и их контентом через админку Firebase — очень удобно. В какой-то момент можно даже подумать, что это реклама, но мне действительно очень понравился и, главное, помог этот набор инструментов.
К тому же сервис бесплатный (при соблюдении лимитов), и для MVP их должно хватить с запасом. Хорошая документация, есть уже куча статей и туториалов по всем сервисам, вплоть до собственных видеоуроков на YouTube, — они просто не оставляют шансов не разобраться.
В итоге из Firebase я взял:
Так выглядит авторизация:
![](https://habrastorage.org/r/w1560/webt/xt/o0/ug/xto0ugbgfj-oyros0krjejamlpc.png)
Для поставленных задач было достаточно упрощённой анонимной авторизации, когда пользователю присваивается только уникальный ID.
Так выглядит настройка пуш-уведомлений на клиенте:
![](https://habrastorage.org/r/w1560/webt/kj/92/fh/kj92fhepj1og-4w9c562vw7uyrc.png)
Понадобится всего несколько строчек. Нужно подписаться на определённый Topic, на который, в свою очередь, отправляются пуши с бэка.
Так выглядит отправка на TypeScript(JavaScript) через Firebase SDK:
![](https://habrastorage.org/r/w1560/webt/i_/_3/zb/i__3zbawpsl24zbizd92dp0iv4q.png)
Оставалось только найти дешёвое решение для голосовых конференций, но тут всё оказалось не так очевидно. Firebase, к сожалению, не может покрыть этот функционал.
Основные требования — это кроссплатформенность и простая интеграция. Тут небольшая подборка из подобных инструментов.
Внимание привлёк Jitsi — это опенсорс-проект с поддержкой iOS/Android, аудио и видеочатов на WebRTC. Для начала достаточно их бесплатного хостинга, а в дальнейшем можно переехать. Также сами конференции можно протестировать непосредственно в веб-версии, что очень упростило отладку звонков.
![](https://habrastorage.org/r/w1560/webt/uu/8r/m4/uu8rm4cktu7okssjorpyvzr5dna.png)
В Jitsi очень простая интеграция и запуск самой конференции. Но после начала звонка конференция управляется уже непосредственно через Webview, программно можно только закончить разговор. На этапе выбора этого инструмента и мысли не возникло, что с помощью доступных из кода методов нельзя, например, сделать mute/unmute. Поэтому пришлось доработать и добавить эти методы в библиотеку, а также настроить взаимодействие с элементами управления. Ещё пришлось подкрутить некоторые параметры под себя. Конечно, ушло чуть больше времени — понадобилась дополнительная неделя, но это всё ещё в разы меньше, чем ушло бы на написание своего решения.
Через полтора месяца приложение было готово, добавили необходимую аналитику для замера интересующих продуктовых показателей. Две недели понадобилось на тестирование и последующие доработки. Таким образом, на разработку ушло 2 месяца, как и планировали. Отмечу, что даже на небольших проектах кажется, что можно ещё что-то поправить, попробовать найти решение лучше. Эти желания уводят от главной задачи MVP.
К сожалению, нужных метрик компания не получила, и это означало закрытие проекта. Но ведь это и есть один из результатов: мы проверили гипотезу, а самое главное — быстро и дёшево.
И ещё раз напомню об основных моментах, которые нужно держать в голове при разработке MVP-приложения под iOS:
![image](https://habrastorage.org/webt/nf/sy/gz/nfsygzlftwqg_y6rp0x6uuo1t7c.jpeg)
Давайте сначала вспомним, что такое МVP.
MVP (minimum viable product — минимально жизнеспособный продукт) — продукт, обладающий минимальными, но достаточными функциями для удовлетворения первых потребителей.
Главная задача MVP — получить обратную связь, чтобы сформировать гипотезы дальнейшего развития и в целом оценить его целесообразность. Т.е. это должно быть максимально дёшево в случае неудачи и при этом жизнеспособно при положительном сценарии. Поэтому основную задачу можно свести к пресловутому поиску баланса на каждом этапе разработки.
Функционал приложения
![](https://habrastorage.org/webt/mj/xd/c3/mjxdc30ciw0mkply_oagmn4ujvk.png)
Итак, мне нужно было сделать мобильное приложение со следующим набором основных функций:
- авторизация;
- голосовые конференции;
- админка и небольшая серверная часть;
- загрузка контента юзерами;
- синхронный просмотр контента;
- базовая аналитика.
Время и человеческие ресурсы
Минимальные ресурсы для этого проекта — один iOS-разработчик и 2 месяца на разработку и тестирование. Больше похоже на челлендж. Но без паники! Конечно же, я использовал уже готовые наработки. В MVP точно не стоит заниматься разработкой своих библиотек. Так что закладываем несколько дней на подбор готовых решений и необходимых опенсорс-проектов.
Дизайн
Одной из не самых очевидных вещей из минимального набора для MVP является дизайн. Кажется, что для него достаточно перечислить названия экранов и за что они отвечают. Но в действительности же тщательно проработанный интерфейс значительно ускоряет процесс, позволяя разработчику избавиться от многих неопределённостей в работе. Проработка дизайна на ранних этапах даёт более чёткое понимание user flow, позволяет убрать лишнее и сконцентрироваться на минимально достаточном функционале для первой реализации проекта.
Конечно, фокус не должен смещаться в сторону сложных анимаций, но ведь первое впечатление можно произвести только один раз! Поэтому простой, но приятный интерфейс и понятный туториал — то, что нам нужно.
В моём случае финальный дизайн приложения был практически готов к старту разработки.
Архитектура
Наверное, несложно догадаться, что я работал над iOS-клиентом, и это та часть, которую нужно было сохранить и развивать далее в этом проекте. Поэтому закладываем добротную архитектуру и выделяем в модули те самые минимально жизнеспособные части, которые будут заменены на следующих этапах разработки.
Исходя из этих требований также ясно, что приложение нуждается не только в клиенте, но и в базовой логике на backend. Т.е. нужна авторизация, логика присоединения и выхода из них, формирование и менеджмент контента, отправка пуш-уведомлений.
Поиск решения
Один из необходимых инструментов — облачная БД. Для этого я сравнил несколько самых популярных вариантов.
![](https://habrastorage.org/webt/np/ec/bk/npecbkuo-aormwfoqlp9zplce7s.png)
Из таблицы выше понятно, что Firebase — это отличное комплексное решение от Google, способное покрыть большинство потребностей разрабатываемого приложения.
Такие решения позволяют держать все элементы управления в одном месте: учётные записи пользователей, список комнат и их настройку, аналитику и информацию о крашах. А в этом случае ещё и можно управлять комнатами и их контентом через админку Firebase — очень удобно. В какой-то момент можно даже подумать, что это реклама, но мне действительно очень понравился и, главное, помог этот набор инструментов.
К тому же сервис бесплатный (при соблюдении лимитов), и для MVP их должно хватить с запасом. Хорошая документация, есть уже куча статей и туториалов по всем сервисам, вплоть до собственных видеоуроков на YouTube, — они просто не оставляют шансов не разобраться.
В итоге из Firebase я взял:
- авторизацию ‘Firebase/Auth';
- облачную БД ‘Firebase/Firestore’;
- бэкенд ‘Firebase/Functions’;
- хранилище ‘Firebase/Storage’;
- аналитику ‘Firebase/Analytics’;
- репорт крашей ‘Crashlytics’.
Так выглядит авторизация:
![](https://habrastorage.org/webt/xt/o0/ug/xto0ugbgfj-oyros0krjejamlpc.png)
Для поставленных задач было достаточно упрощённой анонимной авторизации, когда пользователю присваивается только уникальный ID.
Так выглядит настройка пуш-уведомлений на клиенте:
![](https://habrastorage.org/webt/kj/92/fh/kj92fhepj1og-4w9c562vw7uyrc.png)
Понадобится всего несколько строчек. Нужно подписаться на определённый Topic, на который, в свою очередь, отправляются пуши с бэка.
Так выглядит отправка на TypeScript(JavaScript) через Firebase SDK:
![](https://habrastorage.org/webt/i_/_3/zb/i__3zbawpsl24zbizd92dp0iv4q.png)
Оставалось только найти дешёвое решение для голосовых конференций, но тут всё оказалось не так очевидно. Firebase, к сожалению, не может покрыть этот функционал.
Основные требования — это кроссплатформенность и простая интеграция. Тут небольшая подборка из подобных инструментов.
Внимание привлёк Jitsi — это опенсорс-проект с поддержкой iOS/Android, аудио и видеочатов на WebRTC. Для начала достаточно их бесплатного хостинга, а в дальнейшем можно переехать. Также сами конференции можно протестировать непосредственно в веб-версии, что очень упростило отладку звонков.
![](https://habrastorage.org/webt/uu/8r/m4/uu8rm4cktu7okssjorpyvzr5dna.png)
В Jitsi очень простая интеграция и запуск самой конференции. Но после начала звонка конференция управляется уже непосредственно через Webview, программно можно только закончить разговор. На этапе выбора этого инструмента и мысли не возникло, что с помощью доступных из кода методов нельзя, например, сделать mute/unmute. Поэтому пришлось доработать и добавить эти методы в библиотеку, а также настроить взаимодействие с элементами управления. Ещё пришлось подкрутить некоторые параметры под себя. Конечно, ушло чуть больше времени — понадобилась дополнительная неделя, но это всё ещё в разы меньше, чем ушло бы на написание своего решения.
Итоги
Через полтора месяца приложение было готово, добавили необходимую аналитику для замера интересующих продуктовых показателей. Две недели понадобилось на тестирование и последующие доработки. Таким образом, на разработку ушло 2 месяца, как и планировали. Отмечу, что даже на небольших проектах кажется, что можно ещё что-то поправить, попробовать найти решение лучше. Эти желания уводят от главной задачи MVP.
К сожалению, нужных метрик компания не получила, и это означало закрытие проекта. Но ведь это и есть один из результатов: мы проверили гипотезу, а самое главное — быстро и дёшево.
И ещё раз напомню об основных моментах, которые нужно держать в голове при разработке MVP-приложения под iOS:
- экономим на всём, но не на качестве;
- готовый дизайн сильно ускорит процесс;
- бэкенд для MVP можно реализовать на бесплатных платформах;
- комплексные решения сохранят время и минимизируют риски.