В Tutu.ru с самого начала были отдельные приложения для разных видов транспорта: для поиска и покупки авиа, железнодорожных и автобусных билетов. Нам требовалось объединить всю функциональность в одном приложении, дать путешественникам максимум пользы, чтобы пользователь в одном месте сразу смог увидеть, сравнить и купить билеты на любой из трех видов транспорта.
Решение объединить все и выпустить единое приложение было окончательно принято в октябре и до самого пика поездок и покупок билетов в декабре оставался всего месяц. Можно ли за это время выпустить полноценное рабочее приложение? Да, если работать правильно и основываться на правильной архитектуре и управлении проектом.
Постановка задачи
У заказчика были «продуктовые» приложения для каждого вида транспорта. И хотя у них существовал свой индивидуальный функционал, по структуре и алгоритмам работы они были схожи.
До начала работы над новым приложением мы уже длительное время работали с Tutu.ru — делали приложение «Автобусы».
Идея создания нового проекта требовала длительного внутреннего обсуждения и согласования. Когда компания все же четко сформулировала свое видение нового приложения, сроки уже вовсю поджимали. В ситуации, когда нужно все делать четко и быстро, коллеги из Туту всегда обращаются к нам.
Задача по созданию приложения к нам поступила в конце октября и срок реализации от получения первых вводных до сдачи проекта на приемку не должен был превысить месяца. Мы управились за три календарные недели — первый релиз состоялся 23 ноября 2017.
Первый релиз Единого приложения
На главном экране пользователь выбирает направление и дату. Это было во всех остальных приложениях, но мы как раз добавили новый функционал по выбору типа транспорта. Для этого необходимо было доработать логику отправки одновременных запросов на все виды транспорта:
После выбора направления пользователь получает результаты поиска с датами. Новый вид выдачи строился с учетом всех видов транспорта, на общей вкладке предлагались самые выгодные предложением с указанием типа:
Экраны рейсов с детализированной информацией о каждом рейсе:
Рейс выбран, пора переходить к покупке. Во многом это самая важная часть любого приложения для покупки билетов, для ускорения работ нам пришлось реализовать ее в виде веб-страниц, встроенных в приложение.
У этого есть свои плюсы и минусы, но для пользователя это было практически незаметно, а нам позволило использовать уже готовые компоненты.
В виде нативных экранов также были реализованы экраны помощи (FAQ и контакты), адаптированные под три вида транспорта, а экран дополнительной информации («Другое») был реализован ссылками на другие приложения.
Так у нас получился минимально необходимый набор для покупки билетов.
Разработка
Какие этапы в разработке мы прошли:
На основе «Автобусов» мы создали единую архитектуру нового проекта с возможностью в дальнейшем поддерживать развитие всех приложений сразу.
До реализации проекта, в приложениях использовался разный подход к проектированию архитектуры, и если ЖД и «Автобусы» были во многом схожи, то в Авиа был реализован совершенно иной подход. Необходимо было производить рефакторинг кода, чтобы обернуть его в единую архитектурную стилистику нового приложения.
Кроме того, в приложениях использовался и разный стек технологий, различные библиотеки при работе с сервером и с данными, их необходимо было встроить в приложение с решением конфликтов и удалением дублирующих компонентов.
Наконец, требовалось объединить и структурировать существующие данные для использования на единых новых экранах.
Таким образом, в единую архитектуру был адаптирован существующий код продуктовых приложений, имеющих разную стилистику и свою независимую архитектуру.
Далее для получившегося кода была реализована верстка под новый дизайн и логику новых функций.
Модули
Новая архитектура позволяет разбить любое приложение на модули и развивать их отдельно, используя в нужном месте готовый код. В первом релизе модульность мы реализовать не успели, но всю архитектуру строили с учетом их дальнейшего использования. Разбиение приложения на высокоуровневые компоненты позволяет упростить и значительно ускорить разработку, особенно если, как в случае с Туту, речь идет о работе сразу над несколькими похожими приложениями.
Личный кабинет
Личный кабинет у пользователя единый на все виды транспорта — наша задача была реализовать универсальный отдельный модуль авторизации, который в дальнейшем можно будет подключить во все приложения, включая единое и продуктовые по покупке билетов отдельно на Авиа, ЖД и «Автобус».
Авторизация в приложении позволяет просматривать статусы и детальную информацию по заказам, совершенным пользователем не только в приложении, но и на сайте или в других приложениях Туту, в том числе оформлять возврат или скачивать билет.
Модуль авторизации был разработан с учетом возможности конфигурировать элементы под корпоративные цвета всех приложений, также в зависимости от приложения настраивается получение заказов по определенным видам транспорта. Для единого все три вида, соответственно.
Также модуль включает в себя стандартный функционал по регистрации пользователя или восстановлению пароля в случае ошибок при авторизации.
Создание отдельного, общего модуля позволяет более оперативно вносить изменения в функционал. Достаточно доработать код в одном модуле и далее в приложениях только обновить его версию.
Логирование событий
Запись событий (тапы, просмотры экранов, ввод данных) позволяет получить статистические данные о действиях пользователей и их поведении в приложении. Такая аналитика помогает в определении «проблемных» мест в работе приложения и позволяет оптимизировать его для следующих доработок.
При использовании стандартных аналитических инструментов можно столкнуться с тем, что не все события обрабатываются корректно или они могут вообще не учитываться в статистических данных. По этой причине от Туту к нам поступила задача — реализовать модуль логирования, позволяющий хранить события в очереди. При отсутствии интернета или при наличии ошибок в отправке/получении данных они будут сохраняться в очереди, а при появлении связи — отправляться на сервер.
Такая запись событий работает в отдельном от приложения процессе, что предоставляет возможность:
- Получить больший приоритет по сравнению с обычным сервисом, меньше шансов, что система убьет сервис данного модуля.
- Увеличивает количество памяти для работы модуля, что позволяет минимизировать эти затраты для самого приложения.
- При возникновении критических ошибок, приложение продолжает работать в штатном режиме.
Модуль логирования также был реализован универсальным, с возможностью встраивать его в любое приложение Туту на платформе Android. Параметры для «очереди» можно настроить индивидуально под каждый проект: количество событий для их отправки в пакете (максимальное и минимальное количество), время для принудительной выгрузки событий, период времени между попытками отправки, количество попыток, отправка отчета об ошибке при неудачной отправке после последней попытки. Также есть возможность указать список названий пакетов приложений для проверки, установлены ли данные приложения на устройстве.
Что позволило нам уложиться в срок
Конечно, в этом есть некая доля лукавства, ведь мы исходили из уже существующих наработок. И все же три недели для создания приложения — это очень мало, и практически все это время мы работали в режиме аврала (это неправильно, но иначе к праздничному сезону было не успеть). Но все же, я могу выделить несколько пунктов, которые позволили нам сократить время разработки:
Готовая архитектура — у нас была готовая архитектура одного приложения (на основе «Автобусов»). Фактически, ее надо было расширить для нескольких видов транспорта — на основе одной нашей платформы мы объединили три разные кодовые базы в одну.
Мы не просто писали код, а привнесли в проект свою бизнес-экспертизу — наши разработчики активно участвовали в обсуждении функционала, с целью оптимизировать разработку и выпустить приложение в нужные сроки.
Параллельное тестирование функционала — сразу после разработки определенной функции мы могли отдать ее в тестирование и продолжить работу над следующей задачей, не ожидая окончания тестирования текущей.
Собрать самую качественную команду — над проектом работало всего три разработчика и два тестировщика. Известное правило: «то, что один программист может сделать за месяц, два могут сделать за два» — сработало и для нас. Маленькая качественная команда, пусть и небольшого размера, работает быстрее и лучше, чем большая и неповоротливая.
Проблемы и их решения
При тестировании нужно было предусмотреть множество дополнительных кейсов, связанных со спецификой рейсов всех типов транспорта. Объединение автобусов, самолетов и поездов не прошло даром и количество вариантов, которые требовалось протестировать, увеличилось на порядок.
В самом начале у нас было продуктовое видение на основе существующих приложений, и было более-менее понятно, чего ждать, но все же часть изменений вносились прямо в процессе разработки. Например, заказчик в процессе решил изменить первоначальный дизайн (была запущена рекламная кампания с новым дизайном), и потребовалось оперативно вносить изменения. Так случается во многих проектах, и мы уже научились гибко подходить к таким вопросам, оперативно решая их.
В адаптации других видов транспорта нам необходимо было провести рефакторинг, удалить/заменить много лишних зависимостей для оптимизации работы приложения.
Как компании-заказчику подготовиться к срочной разработке
- Продумать функционал, от которого можно отказаться — написать список фич и ранжировать их по важности, максимально отсечь то, что не нужно в первой версии.
- Продумать и подготовить максимально подробный и законченный ТЗ.
- Подготовиться к максимально быстрому согласованию всех изменений и предоставлению информации.
- Спланировать работы
- Приготовиться к овертаймам и на своей стороне.
- Понять, что при таких сроках важно сделать максимально качественно, а не максимально красиво
- Приготовиться к тому, что будет накоплен технический долг, который необходимо будет устранять после релиза.
Выводы
Новое приложение в Google Play скачали более 500 000 раз. Пользователи отлично приняли его, и оценка в магазине стремится к пяти баллам, растет количество продаж.
Такой срочный проект стал успешным кейсом для нас, хорошим бизнес-решением для заказчика, примером того, что даже небольшая команда при правильной подготовке может создать работающее приложение за минимальный срок.