Разработка
February 14, 2021

Онлайн-хакатон с поездкой в другой город

Я регулярно участвую в хакатонах и конкурсах для разработчиков. При всей прелести основной работы, в ней частенько не хватает творческой активности, поэтому меня спасают конкурсы с относительно свободными задачами. Там можно не только выиграть ценные призы, но и поделать что-то нестандартное. А это и приятно само по себе и полезно для программиста, как источник новых знаний и нового опыта.

В этот раз мы с командой приняли участие в хакатоне от Яндекса и Великого Новгорода. Цель была такая: создать навык (то есть голосового чат-бота) для «Алисы», который будет интересен гостям и жителям этого города.

Давай зачётку

Хакатон проходил в удлинённом обучающем формате. Нечто подобное делали ВКонтакте со своим VK Fresh Code, а вот теперь и Яндекс — в течение месяца для участников проводили лекции и семинары по разработке голосовых приложений. Было даже домашнее задание, которое проверяли.

Надо сказать, что разработка голосовых ботов отличается от разработки обычных текстовых, и важно это отличие уловить. Так, если вы задаёте пользователю закрытый вопрос, в обычном боте у вас, как правило, есть просто кнопки «Да/Нет», но голосом вместо «Да» вы можете получить ответы: «Давай», «Ок», «Хорошо», «Ладно» и другие подобные. Это лишь один нюанс из многих, а с открытыми вопросами ситуация становится сложнее. Так что даже искушённым программистам некоторый обучающий материал необходим, если у них нет опыта именно в голосе. На финальном тесте навыков команда Яндекса проверяла многие вещи, о которых прямым текстом говорилось на лекциях и семинарах.

Кажется, один из самых главных слайдов — чек-лист для определения ситуации, в которой нужен голосовой бот вместо обычного кнопочного

Было заявлено, что для победы требуется участие во всех лекциях и семинарах, но в реальности мне неизвестно, проверялось ли это. Могу лишь сказать, что из 54-х пришедших команд до конца дошли 26, что лично мне кажется неплохим показателем.

Команда и идея

Участвовать с собой я позвал уже проверенных в бою ребят. Сам я занимался бэкендом на C#, мой друг и коллега Григорий Французов делал нам контент-менеджмент, тестирование и кастдев, а другой мой друг Андрей Столяров проектировал игровую механику и писал сценарии. Да, мы сразу решили, что хотим делать что-то игровое. Да и в примерах тем были викторины и квесты — поэтому участие в команде профессионального геймдизайнера не только казалось логичным, но и сыграло, как мне кажется, важную роль в нашей победе.

Яндекс предоставил участникам новую функцию — доступ в навыках к геопозиции телефона. Сначала мы с ребятами пообсуждали штуки вроде классического квеста по точкам, но потом поняли, что такой бот будет мало использовать как геопозицию, так и голос, поэтому решили делать кое-что более необычное: игру «горячо-холодно» в масштабах города.

Так мы описали идею организаторам хакатона, на что получили одобрительный отзыв

Мысль такая: навык предлагает вам начать игру где-то в окрестностях Новгородского Кремля. Где-то недалеко от вас (не более 500м) выбирается точка интереса: памятник, граффити, скульптура и т.д. И далее навык предлагает вам двигаться и периодически обращаться к нему, в ответ на что говорит фразы вроде:

— Холодно, но становится теплее

— Очень горячо и всё горячее

— Тепло, но становится холоднее

Давая, таким образом, понять, как далеко вы от цели и правильно ли двигаетесь. Вблизи цели он даёт дополнительную подсказку: «Ищи что-то высокое», «Нам нужна большая скамейка» и так далее. А на месте задаёт короткий вопрос и рассказывает любопытный факт о точке. По итогу мы дали навыку забавное название «Новгородский Фланёр».

Поехали

Люблю ко всему подходить серьёзно, с максимальной отдачей. Это увеличивает время, которое я трачу на всякие конкурсы, но в итоге вложения почти всегда окупаются. Так что довольно быстро было принято решение высадиться небольшой десантной группой в Великий Новгород на один день, погулять, посмотреть, собрать материалы для будущей разработки.

Что мы и сделали: поехали на автомобиле из Петербурга, а на месте долго гуляли, отмечая интересные точки. Первоначально взяли пул потенциально интересных точек из OpenStreetMap, хотя некоторые встретили просто по пути.

Коптер — незаменимая вещь в любых туристических поездках
Этот пафосный мужик — Сергей Рахманинов
Одна из точек, на которые в итоге наткнулся Яндекс при тестировании

В итоге собрали таблицу из 18 интересных мест, которые выстраивались в непрерывный пеший маршрут. Между любой парой последовательных точек ходьбы не более десяти минут, а весь маршрут суммарно займёт около 3-4 часов.

Техническая сложность раз

В теории всё звучало гладко, и мне даже относительно быстро удалось запрограммировать основную часть. Проблема в том, что функция геопозиции находится в статусе беты, для неё ещё не сделаны никакие инструменты тестирования. Мы ездили в Великий Новгород, когда навык ещё только разрабатывался, поэтому уже готовую программу протестировать там не могли. А ехать второй раз не было возможности. Пришлось выкручиваться: я сделал виртуальную карту, в которой можно было ставить точку, и эта точка заменяла собой настоящую позицию у заданного пользователя на телефоне.

Яндекс-браузер со встроенной Алисой очень помогает при тестировании

Тем временем, Яндекс предложил командам взаимно потестировать навыки друг друга и дать обратную связь. Это очень полезное и ценное мероприятие, которого в полной мере лишены большинство разработчиков, делающих конечный продукт. Всегда тебе кажется, что интерфейс и какие-то другие вещи очевидны, потому что ты знаешь собственную программу вдоль и поперёк, но на практике происходит, как в анекдоте:

Тестировщик заходит в бар и заказывает: кружку пива, 2 кружки пива, 0 кружек пива, 999999999 кружек пива, ящерицу в стакане, –1 кружку пива, qwertyuip кружек пива. Первый реальный клиент заходит в бар и спрашивает, где туалет. Бар вспыхивает пламенем, все погибают.

У нас такой тест прошёл очень плохо, потому что мы пытались симулировать ходьбу по городу с помощью режима Панорам в Яндекс.Картах (это когда по дорогам проехал автомобиль с 360-камерой и всё снял).

Отважный коллега из другой команды пытается пробиться через неудобство тестирования

Вторая команда вообще не смогла добраться до сценария, потому что даже сам процесс подготовки такого теста требует некоторых компьютерных навыков.

Техническая сложность два

Но самая главная подстава нас ждала уже за день до финала. Заточив навык под тестирование с фейковой картой, мы было уже расслабились. В последний день я решил выйти погулять и попросил Гришу сделать мне точки вокруг моего дома, которые должны работать так же, как точки в Великом Новгороде. Важно было, чтобы я сам не знал, где они находятся — нужно было понять, насколько действительно реально по навыку что-то найти.

И... навык абсолютно не работал. К сожалению, точность геопозиции, которая приходила на настоящее устройство, плавала с погрешностью до сотни метров, и обновлялась раз в минуту, что в нашем случае оказалось совершенно фатальным. Можно было уйти пешком на километр по неправильным подсказкам навыка. Я не смог найти ни одну из тестовых точек.

Кусок логов при тестировании, в которых видно accuracy (точность определения местоположения) 65 метров

Придя домой, расстроенный, я сделал две вещи:

  1. Немного обновил навык. Увеличил радиусы срабатывания всех точек, и, самое главное, добавил в него пеленг. Теперь при приближении к точке по касательной навык умел советовать повернуть сильнее вправо или влево.
  2. Разработал специальную схему тестирования, которая форсировала точность GPS-модуля (по крайней мере, на iPhone) и помогала передавать в навык действительно правильные координаты.

Надо сказать спасибо Яндексу за то, что они признали проблему на своей стороне (геопозиция передаётся приложением Яндекса в навык) и согласились тестировать с учётом этого факта и с использованием моей схемы.

Краш-тест и результаты

В финале команда Яндекса поехала большой съёмочной группой в Великий Новгород, чтобы протестировать всё на месте. Как это происходило, можно посмотреть вот тут:

Наш Фланёр начинается на 26:00

Ребята ходили два дня по улицам при температуре -20, отважно сражаясь с кривыми интерфейсами и действительно желая в каждом навыке добраться до core сценария. Все навыки оценивались по двум критериям с 10-балльной шкалой:

  • проработанность идеи
  • качество реализации

Мы получили 10 и 9 соответственно, что дало нам в итоге 2 место из 26. Каждый участник команд 1-3 мест получит Яндекс Станцию Макс — самую новую и самую навороченную колонку с Алисой. Когда она придёт, я напишу статью-обзор и порассуждаю о том, нужна ли вам умная колонка.

Итог

Это был любопытный опыт, результатами которого я почти полностью доволен. Жду обновления качества работы гео от Яндекса, чтобы выкатить навык в общий доступ, а также сделать что-то ещё с использованием этой функции.

Что понравилось:

  1. Полезные активности для разработчиков: даже если теорию вы уже знали, взаимотестирование командами очень помогло.
  2. Быстрая и отзывчивая команда из Яндекса, которая реально прислушивалась к тому, что спрашивали и просили участники.
  3. Интересная задача с новыми функциями платформы, мотивировавшая нас ещё и на классную туристическую поездку вживую.
  4. Подробная обратная связь для всех в виде краш-теста. Хорошая обратная связь — то, чего не хватает многим хакатонам. Вашу работу просто оценивают, но совершенно непонятно, за что, например, могут занижать баллы. Здесь же каждый мог посмотреть, как его навыком пользуются незнакомые с этим навыком люди, какие проблемы у них возникают.
  5. Призы каждому участнику команды, а не «Вот вам один ноутбук/телефон/пылесос на всех, делите как хотите».

Что можно улучшить:

  1. График работы над проектом оказался крайне несбалансированным: сначала нужно было за пару будних дней придумать целиком всё диалоговое дерево (читай полностью создать навык, только без программирования). А потом нужно было за несколько последних дней его закодить. При этом на второстепенные задачи вроде подготовки к интервью выделялось аномально много времени.
  2. Функциональность геопозиционирования выкачена очень сырая, причём известно это стало случайно. Можно было целиком положиться на её работоспособность и из-за этого крепко пролететь в финале во время тестирования.