Электричка слева — Аэроэкспресс — теперь тоже добавлена в приложение.
В день расписание у нас просматривают 600 тысяч человек, поэтому каждое маленькое изменение имеет эффект большого масштаба. Я хочу немного отчитаться о том, что мы добавили в приложение электричек по просьбам сообщества. И сказать спасибо всем, кто давал нам обратную связь, и показать, что мы меняли.
Первая важная фича — это офлайн-режим. Мы его долго не вводили, потому что смысл расписания — как раз в постоянных изменениях. И если уж ты уехал за пределы сотового покрытия, то лучше обновиться, чтобы не прибыть к отменённому поезду.
Как выяснилось, не делать его — идея так себе, потому что:
- Многие хотят посмотреть расписание «в целом», а не по текущей ситуации.
- Открылся совершенно необычный способ использования приложения: с эскалатора. А на эскалаторах обычно какой-нибудь 3G-LTE-интерконнект или просто смена базовой станции. В час пик ещё и «растянутая» между абонентами сота. И вообще в метро часто так бывает, что интернет как бы есть, а коннекта по факту нет.
Спасибо OVAV: мы начали детектировать такие ситуации. Сейчас модель действий такая: если есть быстрая связь, то всегда грузится актуальное расписание. Если связи нет — показывается офлайн-версия (это из локального кэша фактически), на ней — метка времени, когда это было актуально. По мере просмотра мы можем успеть получить обновление (пакеты очень лёгкие) и сразу показать его прямо в интерфейсе «на лету». Тогда метка про офлайн-режим будет убрана.
В офлайн-режим автоматически добавляются избранные маршруты и просмотренные расписания (история). Причём это не загрузка вручную и не просто кэш — мы проходим по всем вашим маршрутам после обращений к нашим серверам и обновляем всё для офлайн-режима. Можно годами не открывать избранные маршруты, но там всегда будет свежая версия с того момента, когда у вас последний раз был Интернет при открытом приложении. История же кэшируется на те дни, на которые вы уже смотрели расписание.
Поскольку пакеты очень лёгкие (там XML-данные по паре килобайт на маршрут), то всё это очень быстро.
Прогнозирование опозданий
Электрички по API транспортной системы дают статус с запозданием на шаг графика (10 минут), и статус будет за последние 10 минут. То есть в 14:22 можно получить фактическую картину движения поездов на 14:12. А в 14:12 она будет собрана с фреймом 10 минут, то есть в худшем случае отставание будет 19-20 минут, в лучшем — 10. Мы немного пошаманили с матмоделями и историческими данными и научились сокращать это окно до двух минут по прогнозированию движения остальных поездов. То есть если электричка опаздывает не из-за внезапной аварии, а из-за тактического изменения расписания, то мы узнаём об этом очень достоверно на 8–18 минут раньше фактических данных.
Юзабельность
Больше всего к нам было вопросов по юзабилити. Да, год назад у нас не открывался сразу тот экран, который вам был нужен: уходил лишний клик на расписание. Спасибо airy за поднятый тикет.
Сейчас открывается последний поиск сразу на стартовом экране. Причём мы следим за половиной дня: если вы открываете приложение после обеда, то переставляем станции отправления и назначения местами.
Нашли очень красивый баг, который сами же и заложили несколько лет назад. Причём так оказалось, что искал его тот же человек, который внёс. В общем, когда-то давным-давно нам нужен был момент, когда на железной дороге наступает завтра. Полночь не подходит. Дело в том, что у планеты сутки заканчиваются в полночь, а у людей — в другое время. И когда ты смотришь электрички на сегодня, то ждёшь, что после той, что в 23:50, будет показана 00:20 без переключения дат.
Вопрос был в том, где поставить границу: показывать до часа ночи, до двух, до трёх, до пяти утра?
Поскольку мы математики, то смоделировали потоки и учли распределение рейсов. Поскольку больших данных тогда не было, ограничились константами. Для Москвы вывели волшебное время — 2:52, именно в этот момент было удобнее всего сменять сутки.
Примерно пять лет это уходило всё глубже и глубже в код. Дальше была пара тикетов про то, что пропадают электрички на сегодня: это определённые запросы поиска между 00:00 и 2:52 (считали, что сегодня — это вчера). А вчера все электрички ушли.
В итоге мы разделили на более понятные категории, как и должны были бы сделать изначально, если бы не гонялись за оптимизацией в те годы (а мы гонялись).
Посыпались жалобы на светлую тему: говорят, ночью невозможно смотреть расписание. Сделали ещё тёмную, это сейчас модно. Что характерно: пока это не стало модно, никто таких тикетов не писал.
Иногда сыпались тикеты на то, что «у вас пропадают электрички». Это они не у нас пропадают, а у ЦППК и других перевозчиков (в расписании). Стандартная модель поведения — когда поезд уходит из расписания, он просто растворяется в эфире. Пользователи, которые его помнили, думают, что как-то не так ищут, и нервничают. Ощущают потерю контроля. Теперь мы сделали призрак поезда: строчка в расписании с меткой «Отменён». Людям стало спокойнее, а нас не считают злыми разработчиками, ворующими поезда у честных граждан.
Промах мимо станции. Есть несколько мест, где электрички на одной станции железной дороги находятся в двух разных местах. Например, в бэкенде расписания Москвы Курской две штуки: одна — Курского, вторая — Горьковского направления. Это две независимые станции с общими координатами. Проблема оказалась в том, что можно построить маршрут с одной из них до привычного пункта напрямую, а можно промахнуться в интерфейсе и выбрать другую точку старта, построить маршрут с четырьмя пересадками на два часа дольше, но до того же пункта. Люди жаловались. Мы соединили такие места в одну точку и автоисправляем вводы в ряде случаев.
Вторая похожая фича — есть очень много станций с похожими названиями. Явно спрашиваем пользователя, что именно он имел в виду, когда высока вероятность коллизии.
Много мелких доработок с геолокацией: теперь подсказка по вводу станции зависит от вашего примерного положения, мы показываем ближайшие к вам.
Karpion написал много пожеланий к тому, как должно выглядеть приложение в связке с другими видами транспорта. Мы думали, что доделали, потом столкнулись с вычислительными сложностями, потом опять думали, что доделали… В общем, там получилось где-то совсем другое, где-то лучше, а где-то есть тупики. После стабильного релиза мои коллеги расскажут детальнее.
Пока же могу сказать, что мы провели исследование, насколько это вообще нужная штука — скрещивать автобусы с электричками. Оказалось, что нужная. Но, поскольку мы любим данные, в процессе исследования нарылась ещё одна важная вещь. Мы сравнили направления по Москве, где удобнее автобусом, а где — электричкой.
Вот смотрите, мы выделили направления, где это имеет значение (или где можно напрямую проехать автобусом там, где на электричке нужны пересадки). Сортировка по популярности направления. Так что если у вас в этих городах живут родственники, то, возможно, им будет интересно это сравнение.
Направление |
Цена, автобус |
Цена, электричка |
Пересадка на электричку |
Москва — Можайск |
257 |
276 |
нет |
Москва — Обнинск |
269 |
284 |
нет |
Москва — Ступино |
264 |
279 |
нет |
Москва — Волоколамск |
273 |
322 |
нет |
Москва — Егорьевск |
275 |
276 |
нет |
Москва — Переславль-Залесский |
285 |
- |
- |
Москва — Кубинка |
94 |
161 |
нет |
Москва — Петушки |
253 |
337 |
нет |
Москва — Воскресенск |
213 |
230 |
нет |
Москва — Суздаль |
605 |
- |
- |
Москва — Рязань |
379 |
462 |
нет |
Москва — Зарайск |
336 |
- |
- |
Нижний Новгород — Муром |
591 |
- |
- |
Москва — Алексин |
484 |
658 |
да |
Москва — Озёры |
286 |
368 |
да |
Москва — Гусь-Хрустальный |
517 |
701 |
да |
Москва — Ясногорск |
385 |
388 |
нет |
Москва — Зубцов |
436 |
- |
- |
Москва — Лакинск |
275 |
421 |
нет |
Великий Новгород — Сольцы |
200 |
- |
- |
В целом около 50% направлений электричек (по которым у обеих станций есть привязка к городу) есть альтернатива из автобусного расписания. При этом с поездами дальнего следования пересечение небольшое, около 7 %.
Сделали очень крутую (для нас) штуку: фича «платформа и путь». Это на 50 самых популярных станциях мы стали прогнозировать, куда подадут электричку на основании истории её подач и движения поездов. При этом пассажиры приложения могут голосовать за платформу отправления. То есть вы пришли, сели в свою электричку и нажали вот так:
Если голосов достаточно — путь и платформа показываются всем пассажирам. Если мы вам доверяем (а мы доверяем после нескольких правильных голосований), то у вас становится более весомый голос. 15 лет назад нам звонили неизвестные люди сказать, что где-то отмена, а мы вносили в расписание (потому что была только бумага). Ещё тогда мы запомнили, что пассажиры рады помогать друг другу. Думаю, сейчас мы поймём, как сделать это лучше, и будем дальше смотреть в эту сторону.
Ну и ещё пока мы пилили разные фичи для удобства, заодно сделали модель населённости поезда. Она помогает прогнозировать, стоя или сидя вы будете ехать в разных электричках. Пока обкатываем её, возможно, дальше расскажу, чем закончилось.
Мы продолжаем пилить самое точное расписание в Рунете, остаёмся на связи и готовы к тому, что вы скажете, что ещё можно и нужно сделать. Не всегда мы нужные вещи делаем быстро, но точно всегда прислушиваемся. Поэтому поругайте или похвалите нас, пожалуйста: это полезно.