4-5 минут чтения
История перемещений
Как отказ от маршрутов закрыл три ограничения.
Предпосылки
Родительская фича — из тех, что мы строили после разворота с молодёжи на родителей, следом за геозонами.
Спрос подтверждали три источника:
- родители просили историю на интервью;
- просьбы приходили в отзывах;
- фича была в старом приложении и работала плохо, но метрики показывали, что ей всё равно пользуются.
Проблемы
Родителю история показывает режим дня ребёнка: во сколько вышел из школы, дошёл ли до секции. Той же детализацией в паре или дружеской компании люди начнут друг друга подозревать, что может приводить к конфликтам.
В старом приложении на карту ложились точки и треки, в шторке шёл список координат со временем. Сопоставлять текст из списка с картинкой на карте пользователь должен был сам — когнитивно сложно.
Треки привязывались к графу дорог и магнитились к проезжей части, даже когда ребёнок шёл дворами. Ложный маршрут давал родителю повод для тревоги на ровном месте. Лечится частотой опроса устройства — ценой заряда детского телефона.
Второй риск — выбросы: ошибочные координаты, разовые или из зон глушения БПЛА, где GPS подменяет спуфинг.
GPS-спуфинг
Поиск решения
Черновую идею я задокументировал ещё в «Мой Поиск». Тогда её отклонили из-за сложности реализации.
Интерактивный сегментный график — таймлайн вместо списка точек
Переделал круговой график в линейный под интерфейс нового приложения, добавил таймлайн и пометки. На этом прототипе защитил решение перед стейкхолдерами и снимал технические требования с разработчиками.
Первая итерация
Здесь я узнал про неточность привязки к графу дорог и стал искать, как отказаться от треков. Подсказку дал Яндекс: на одном из тарифов такси маршрут не рисуется — заранее непонятно, каким он будет, — и две точки соединяет стрелка.
Примерил к себе: выделяешь сегмент передвижения в шторке — на карте подсвечивается отрезок.
Вторая итерация
Механику подсказали часы разбора с разработчиками и аналитиками. Как по сырым данным отличить стояние от перемещения? Сошлись на пороге 20 минут: не покидаешь место дольше — отрезок становится точкой стояния. Порог опирался не только на GPS, данных из смежных источников хватало.
Добавлены подсказки, оформился период «стояния»
Решение
День делится на отрезки двух типов. Стоял — точка на карте. Перемещался — стрелка между точками с длительностью.
Каждому отрезку отвечает сегмент таймлайна в шторке. Пользователь переключает даты, тапает сегмент и видит на карте подсвеченную точку или стрелку. Сопоставлять список мест с картой больше не нужно.
Дальнейшая доработка
Ложная точность: маршрут по графу дорог выглядит достовернее, чем есть. Ребёнок шёл дворами — линия покажет проезжую часть. Стрелка не претендует на знание пути и не врёт.
Детализация безопасна между родителем и ребёнком и токсична в паре. Вместо разных правил для разных типов связей мы огрубили детализацию для всех: точки и стрелки отвечают, где человек был, но не каким путём шёл. Родительский сценарий закрыт, повода для конфликта в остальных нет.
Батарея: точный трек требует частого опроса устройства. Маршрут не рисуем — частоту держим низкой, телефон ребёнка живет до вечера.
Одно решение вместо трёх компромиссов.
Выбросы
Спуфинг видно по поведению данных: валидные координаты держатся кучно, подменённые разлетаются по радиусу глушения. Бэкенд сравнивает расстояния внутри пакета и ещё несколько параметров. Из двух десятков координат хватало трёх валидных, чтобы определить верную точку.
В интерфейс приходила очищенная картина. Где выбросов нет — устройство опрашиваем реже, плюс экономия заряда.
Результаты
Выпустили MVP в бете. Функцией пользовались в среднем ~12% MEU — для вторичного сценария, не завязанного на core job, это подтверждение спроса.
Собрали бэклог итераций. Я предлагал выводить на таймлайн геозоны: видно, какие зоны контакт посещал внутри дня, — две функции связались бы в единый сценарий. До этих итераций не дошли, приложение закрыли.
Спасибо за внимание! ♥︎