Разработка
Как MTA закрыла мое приложение для пассажиров Пенсильванского вокзала
От идеи важного для пользователей приложения до его закрытия: разработчик Алекс Харламов поделился историей своего проекта TrackTrain.
От идеи важного для пользователей приложения до его закрытия: разработчик Алекс Харламов поделился историей своего проекта TrackTrain.
Бэкграунд
Когда я переехал на Лонг-Айленд, я начал совершать ежедневные поездки по железной дороге Лонг-Айленда (LIRR) на Пенсильванский вокзал (Пенн-стейшн) Манхеттена. Для тех, кто никогда там не был — вокзал кажется огромным, переполненным и ошеломляющим. Там работает три железнодорожных компании, над станцией находится Мэдисон-сквер-гарден, а также множество магазинов, баров, ресторанов и других мест. 650 тысяч людей проезжают через Пенн-стейшн каждый день — больше, чем через все аэропорты Нью-Йорка.
LIRR, Нью-Джерси Транзит и Amtrak ежедневно отправляют 1200 поездов по 21 пути. По многим причинам до последнего момента неизвестен точный путь, с которого отправляется поезд. Чтобы справиться с этой проблемой, в центре зоны вокзала расположен огромный экран, на котором показано расписание поездов. За десять минут до отправления поезда наконец-то появляется номер пути — и так вы узнаете, куда идти, чтобы добраться домой. К сожалению, и все остальные люди начинают идти в то же время.
Как только появляется номер пути для любого поезда, огромная толпа людей начинает бежать к очень узкой лестнице, ведущей к поездам. Если вы подождете, пока все пройдут, в поезде останутся только стоячие места (это касается часа пик, если вы едете в 3 часа ночи в Саффолк Каунти, то поезд будет почти пустым).
Идея
После нескольких дней я понял, что эта система неэффективна и начал думать о том, как её можно улучшить. Как раньше времени узнать нужный путь? Официальное приложение LIRR и сайт публиковали номер в то же время, как он появлялся на экране. Казалось, что остается только ждать вместе со всеми.
Однако через несколько недель я начал замечать определенные шаблоны. Во время часов пик поезда отъезжали от одного и того же пути каждый день. Чтобы проверить свою теорию, я решил отследить номер пути для разных поездов, на которых я ездил. Она оказалась почти верной: в обычные часы номера менялись, но во время пиковых часов номер совпадал в 95% случаев. Я начал спускаться к поездам до официального объявления и понял, насколько проще это делает жизнь — я был одним из первых людей в поезде, занимал любое место и не переживал насчет времени.
Я начал искать, как я могу поделиться своим знанием с другими людьми, и придумал мобильное приложение. Вы приезжаете на Пенн-стейшн, открываете приложение, смотрите номер пути и получаете хорошее место одним из первых в поезде.
Идея казалась довольно простой, но конкретный способ её реализации был вызовом. Мне нужно было сохранять данные каждый день, но что дальше? Я думал о создании формулы для определения возможного номера пути, но отверг эту идею — вычисления быстро стали сложными, и если бы приложение ошиблось несколько раз, пользователи бы потеряли доверие. Вместо этого я решил просто показывать номера путей за последние несколько дней и позволить пользователю принимать решение. Если они увидели, что поезд всегда уходит с одного и того же пути, они поймут, что он уедет с этого пути и сегодня — на практике так и происходило. Это решение было жизненно важным для мгновенного успеха приложения.
Технологии
Архитектура состояла из трех компонентов:
- Сервис хранения данных — получает данные от LIRR и хранит их в базе данных
- Мобильное приложение — для iOS с запланированным релизом на Android
- Сервер — отправляет данные в приложение через API
Для бэкенда я рассматривал новую технологию вроде Node.js/MongoDB, которую я хотел изучить, но передумал. Так как это не планировалось как одноразовый проект, я решил использовать технологии, которые я хорошо знаю. По этой причине я выбрал стек PHP/PostgreSQL. Я был доволен выбором, всё работало, и я нашел несколько полезных библиотек, которые сэкономили мне время.
Для мобильного компонента я исследовал технологии “JavaScript в нативной оболочке” вроде Phonegap/SenchaTouch. Но всё работало не так, как должно было, и поэтому я нанял разработчика-фрилансера для создания нативного iOS-приложения (Если у вас нет опыта в найме фрилансера, я не рекомендую вам это делать — это непросто).
Данные
Для начала я хотел посмотреть, возможно ли получить данные от MTA. Было бы отлично использовать API, но у них его не было. Единственный способ получить информацию о пути — извлечь её с их сайта. Это легко — номер пути появлялся в очень предсказуемом теге. Однако сложнее было придумать, как получать данные безопасно, без риска быть заблокированным MTA или обрушить их серверы.
Чтобы меня не заблокировали, мне нужно было сделать сложным идентификацию запросов, исходящих из моего скрипта. Знаком могло быть любое из списка ниже:
- повторяющиеся запросы от одного IP-адреса
- запросы одних и тех же URL в одно и то же время
- запросы с одного и того же браузера (пользовательского агента)
Решать это было весело. Вот что я сделал в итоге:
- я зарегистрировался на VPN-сервисе Private Internet Access, который рандомизирует IP-адреса сервера для каждого запроса;
- я рандомизировал время запросов, извлекая данные в разные промежутки времени;
- на каждый запрос я использовал разные случайные пользовательские агенты из списка, который я нашел (не могу найти оригинальный, но это — хорошая альтернатива).
После нескольких недель кодинга по ночам и выходным приложение начало выглядеть хорошо. Однако всё стало сложнее — внезапно MTA запустила официальный API! С одной стороны, я был рад таким новостям — я мог получить данные честно, без скрепинга. С другой стороны, я потратил много усилий, чтобы скрепинг работал идеально. В конце концов, я был не против — хотя мой код остался не у дел, сам процесс его создания был интересным. Я отправил запрос на ключ API и получил его через несколько недель.
Релиз
Хотя мне пришлось переписать бэкенд, чтобы задействовать официальный API, приложение было почти закончено. Я решил, что оно должно выглядеть максимально минималистично. Пользователи откроют приложение, выберут поезд и увидят номер пути для этого поезда за последние десять дней.
Я назначил цену в один доллар, назвал приложение “Track Train”, отправил его в App Store и всё завертелось!
Несмотря на нулевой маркетинг, приложение получило пользователей и хорошие отзывы. Люди писали мне, как долго они ждали подобное приложение. Скоро оно было в топе результатов поиска по ключевым словам, связанным с LIRR. Другие разработчики начали спрашивать, могут ли они использовать мой API для создания приложения на других платформах. Хотя денег было недостаточно даже для покрытия моих затрат, я был рад, что сделал что-то, что действительно хотели люди и начал планировать больше функций и расширение приложения на другие станции (Atlantic Terminal в Бруклине имел схожие проблемы).
Закрытие
Увы, этому не суждено было случиться. Спустя нескольких месяцев после запуска я получил письмо от MTA о том, что я использовал “неправильный API”. Хотя я получил официальный токен от MTA, API предназначался для приложений MTA, а не для стороннего использования. Я посмотрел на новый API и понял, что в нем нет самой главной функции — номера пути для поездов! Да, функция, вокруг которой было построено все мое приложение.
Я не собирался сдаваться без боя, поэтому я начал кампанию по упрашиванию MTA. Я общался с людьми разной степени авторитетности, просил добавить необходимые функции в новый API, пытался убедить их, что люди полагаются на мое приложение, но всё было впустую. Никаким образом нельзя было пробраться через бюрократию MTA, чтобы для меня сделали исключение, поэтому я не мог получить данные через официальные каналы. Они также прекратили публикацию номеров пути на сайте, поэтому даже к скрепингу нельзя было вернуться
После года работы и нескольких месяцев с момента запуска у меня не было выбора и я закрыл приложение. Я чувствовал себя ужасно, разочаровав людей, которые полагались на приложение при совершении своих ежедневных поездок, и предложил компенсацию всем, кто купил приложение.
Уроки
Несмотря на несчастливый конец проекта, я не слишком расстроился. Вот некоторые уроки, которые я вынес:
- Если ваше приложение полагается на большую негибкую организацию вроде MTA, вы можете получить плохой опыт. Когда MTA поменяла свое решение насчет доступности данных, я никак не мог их получить — поэтому у вас всегда должен быть запасной план.
- Для нового проекта логично использовать стабильные и надежные технологии. Если бы я использовал Node.JS и MongoDB, процесс занял бы в три раза больше времени.
- Сначала лучше создать простейшую версию, которая будет полезна пользователям. Создание механизма машинного обучения усложнило бы проект, и я сомневаюсь, что мне было бы так же интересно этим заниматься.
- Получите фидбэк от пользователей в самом начале. Как только у меня появилась идея, я обсудил её со знакомыми пассажирами LIRR, и они сказали, что они бы заплатили за такое приложение и использовали бы его. Я показал им макеты и первый прототип и получил полезные отзывы.
В целом, хотя мне и было жалко закрывать приложение, я рад, что создал TrackTrain. Это было моим первым приложением для iPhone, и я горжусь завершением и запуском проекта. Я узнал много ценных вещей и хорошо провел время. Мне стыдно перед пользователями, но я надеюсь, что скоро появится лучшее решение.
Однажды я планирую выложить в общий доступ данные о номерах из моего приложения — я уверен, что из них можно получить интересные выводы. Надеюсь, что однажды MTA и другие транспортные организации поймут, что должны быть дружелюбнее к разработчикам, если они хотят привлекать людей на свою платформу. А я вскоре присоединился к удивительному стартапу, который создает программы для более эффективной работы полицейских, и я очень рад этому.