Как мы проиграли в Салехарде, но остались довольны
В конце октября мы частью уже устоявшейся хакатонной команды поехали на Ямал в город Салехард. Там проводился Хакатон на Полярном Круге, в ходе которого местная администрация хотела получить себе различные цифровые решения для социально-культурной сферы, за что предлагали организацию и награды.
Сама организация шла при поддержке Russian Hack Team: это ребята заядлые хакатонщики, которые сначала сами съездили на десятки подобных мероприятий, а потом создали соответствующую сборную.
Подготовка и треки
Изначально в хакатоне было 3 направления по 3 задачи в каждом. Мы с Алексеем и Григорием выбрали две задачи, которые вписали в анкету. Но уже перед самым хакатоном оказалось, что заказчики исключили две задачи…и обе как раз те, которые выбрали мы. В итоге остались вот эти:
Треки в первой категории касались работы волонтёров и помощи бездомным животным. Во второй — помощь мамам отслеживать местоположение ребёнка, ну и трек культура был о событиях в регионе и городе.
В итоге по случайному распределению нам достался трек «ПроСветление», мы там и остались.
«ПроСветление»
Знаете ли вы, что зима на Ямале длится порой и 9 месяцев, и половина этого времени - в условиях полярний ночи. Света - крайне не хватает, потому любое ПроСветление спасает от погружения в «тёмные» будни. Однако, массовики-затейники сталкиваются с тем, их приглашение провести вечер культурно тонет в информационном потоке виртуальной реальности. Как повысить посещаемость культурных событий и максимально упростить процесс выбора - вопрос для «культурных» участников хакатона.





Хакатон предполагал 4 приза по 150 000 рублей, поэтому ехать туда большим составом лично я не видел смысла: делить эти деньги на пятерых или шестерых было бы грустно даже в случае победы. Да, мы разбалованные питерские программисты, зажрались.
Напрасно называют север крайним
Организаторы с самого начала взялись за процесс очень ответственно. Билеты были куплены ещё за месяц до мероприятия (в отличии от того, как это произошло на Цифровом Прорыве). Нам мгновенно отвечали в Телеграме на все вопросы, оперативно формировали нужные документы и таблицы и так далее. Поэтому не составило никакого труда просто прибыть в нужный момент в аэропорт и сесть на самолёт.
Салехард находится почти на самом краю земного диска. Добраться туда по земле могут только олени, поэтому мы шли по воздуху. Весь полёт занимает около 3.5 часов со сдвигом по времени на 2 часа вперёд, наш утренний старт к моменту прибытия превратился в почти поздний вечер.
На месте нас встречали волонтёры от организаторов. И это были не какие-нибудь скучные люди с табличками: было видно, что нас действительно ждут, как гостей. Нам задавали вопросы, снимали нас на фото и видео, в целом общались с большим энтузиазмом и охотой.



Затем погрузили в предоставленные организаторами микроавтобусы и повезли на место. Мы должны были сразу прибыть на хакатон и провести следующие две ночи на рабочей площадке.
Место и старт
Расположили нас в местном торговом комплексе «Полярис» в самом центре города. Комплекс был закрыт для обычных посетителей и целиком предоставлен в наше распоряжение, что уже само по себе довольно круто. Забегая вперёд скажу, что мы могли вдоволь пользоваться всеми благами, в том числе, например, душевыми в раздевалках фитнес-центра внутри этого ТЦ.



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


После обеда организаторы представили менторов, сказали несколько слов о хакатоне и задачах, а затем началась работа. Площадка была построена в большом зале в центре комплекса, где разместили сцену с огромным экраном и круглые столы. За каждым столом сидело по две команды. Чисто практически мы не испытывали никаких неудобств из-за этого, но при прочих равных хотелось бы всё-таки быть с командой отдельно.
Идея и первый день
Я сразу хотел попробовать рискованный вариант (и риск, как вы уже понимаете, оказался не оправдан). На всех других хакатонах мы делали веб-приложения, у которых был интерфейс и какое-то яркое представление, визуальные элементы, кнопки, иконки. Соответственно, в команде всегда были фронтенды, иногда дизайнер. Здесь решили сосредоточиться только на бэкенде, потому что трёх человек не хватит, чтобы качественно сделать фуллстек за два дня (если вы, конечно, не используете какие-то шаблоны или конструкторы, что, впрочем, сразу видно на скриншотах и презентации).
Поскольку у нас не было представления и предполагался интересный бэкенд, мы решили сделать навык в Алисе с распознаванием естественной речи. Идея была в том, чтобы по относительно произвольной фразе на русском языке предлагать человеку релевантные культурные события в ЯНАО. Например, если человек скажет «Танцы в Салехарде на следующих выходных», то навык в ответ выдаёт ему все карточки с танцевальными событиями в Салехарде на следующих относительно текущего дня выходных.


В итоге Лёша занялся написанием парсера для сайта Министерства Культуры, который выбирает события и складывает к нам в базу, Гриша занялся движком Алисы, а я занялся словоформами и векторным словарём для контекстного поиска.
Тут надо сказать, что часть работы я проделал такую, которую для показа демки можно было не делать: я начал портирование морфологического словаря на .NET, на котором мы всё пишем. Уже есть существующий pymorphy2, который просто можно было взять и использовать для той же самой задачи. Но стоит учесть несколько нюансов:
- У нас с Гришей уже были модели для объектов Алисы на .NET, а делать приложение из двух частей на разных языках не хотелось.
- Писать на C# во много раз приятнее, чем на Python. Да простят меня питонисты, но мы все понимаем, что вы просто вынуждены там сидеть из-за большого количества библиотек.
- Словарь в pymorphy2 старый, да и сама его поддержка приостановлена. В теории можно загрузить новый, но документация в этой части настолько плохая, что проще не. У меня есть словарь 2019 года, превышающий по количеству словоформ тот OpenCorpora, который взят там.
- В моём словаре есть ударения, со временем я добавлю их поддержку в свою библиотеку, а в pymorphy2 нет.
- Мне подтвердили заявку на грант от государства (об этом напишу позже когда получу), и в числе работ по гранту входит морфология на C#.
В общем, я решил считерить и сделать работу, которая полезна в дальнейшем, а не только на хакатоне. Возможно, возьми мы готовое решение, то не проиграли бы, потому что потратили бы время на что-то другое.


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



Мы разместились с этими спальниками в детской зоне торгового центра, что было весьма удобно, тихо, тепло, и позволило выполнить необходимый по сну норму для хакатонов (примерно по 3 часа в каждую из двух ночей). В общем, около половины седьмого утра я ушёл чуть-чуть вздремнуть, потому что мозг уже отключался.
Второй день
После завтрака в 10 утра мы продолжили работать. Я скачал готовые векторные модели из интернета, но занимали они неприлично много места (почти по гигабайту каждая), а ещё при запросе мы не могли никаким образом быстро провести сопоставление. В модели был записан некий виртуальный вектор в 300-мерном пространстве для каждого слова, но положение этого слова относительно других нужно было бы вычислять каждый раз.
В итоге мы пришли к решению предпосчитать всё это и записать для каждого словарного слова топ-20 лучших и топ-20 худших совпадений. И тут ждала подстава: вычислительной мощности не хватало. Компьютер делал около ста миллионов умножений в секунду, а всего слов было 160 тысяч в двух словарях (на каждое нужно порядка 20 миллионов операций). Понятно, что позволить себе считать модели сутки мы не могли. В итоге я сидел и оптимизировал вычисления под параллельность и многоядерность, а в конце этого процесса мы запустили программу одновременно на четырёх компьютерах: трёх наших ноутбуках и моём удалённом сервере.



В конце-концов словарь работал неплохо, но хуже, чем я от него ожидал. Скорее всего, корпус текстов недостаточно объёмен, а модель не понимает, например, однокоренные и составные слова. Вообще, я удивлён, что плохо решена задача извлечения из слова корня, нужно будет ей заняться.
Проект и питч
В конце-концов, покрутив коэффициенты, я добился хорошей работы контекстного поиска, который даже иногда удивлял нас (например, на запрос «Роботы» предлагал научный кружок, а на запрос «Котики» выставку с названием «Хвостатые и пушистые»). Хотя, стоит признать, что на некоторые запросы он выдавал не слишком релевантные результаты.
Остальные же части работали ещё лучше, впрочем, поиск дат был основан на моей библиотеке, сделанной до хакатона, а со словоформами и Алисой у нас было очень много опыта.
Питчили почти в самом конце. Во время презентации один из членов жюри попробовал навык и сказал, что у нас упал бэкенд. Это было невозможно, потому что бэкенд спроектирован способным восстанавливаться после сбоев. Впоследствии оказалось, что речь шла об отсутствии обработки одного вида нажатия, и это, конечно, был облом: дело в том, что мы с Гришей используем Алису каждый день, я дома делаю это в основном с Яндекс.Станции, у которой нет дисплея, и мы стараемся проектировать все голосовые приложения максимально непохожими на обычных чат-ботов, которые требуют нажимать кнопки на экране. Сам я вообще топлю за отказ от кнопок в голосовых навыках, как это сделано, например, у Amazon Alexa. В итоге мы не дотестировали самый банальный сценарий: что обычный пользователь будет по привычке пытаться нажимать на плашки на экране. А Яндекс, как оказалось, обрабатывает некоторые виды нажатий очень непредсказуемым способом, отображая визуально совсем не то, что происходит в действительности.
В общем, стали заложниками собственного опыта.
Проекты в целом на высоком уровне. Человека, который возьмёт спецприз, я угадал сразу: он выступал последним с весьма запоминающейся презентацией, в приложении были интересные привлекающие внимание фишки, да ещё и в команде был всего один, что само по себе очень необычный прецедент.
Следует отметить, что работе демок уделялось особое внимание. Некоторые команды, в том числе нас, позвали на повторную демонстрацию членам жюри, и это очень круто. На многих хакатонах есть проблема, что выигрывает красивая презентация, а не продукт. Тут же такой вариант был исключён, хотя значимость презентации всё ещё крайне высока.
Результаты
Я сразу понял, что мы не выиграли. На мой личный взгляд помимо проблемы с нажатиями причина в высокой конкуренции: из-за накладки с треками кто-то конкурировал с двумя командами, а кто-то почти с десятью. Наш проект был неплох, но ему не хватило масштаба, чтобы буквально стать лучшим среди сильных проектов, во многих из которых было полноценное веб-приложение с множеством функций, сделанное четырьмя-пятью людьми. Позже в таблице результатов стало видно, что разница между победителями и проигравшими составляет десятые доли балла при шкале от 0 до 14.
Позже нам говорили о том, что можно было дотянуть питчем, но я, честно признаюсь, не заметил однозначной разницы между питчами победителей и питчами проигравших. Почти все презентации были хорошими, никто не запинался, не забывался на сцене, всё рассказывали чётко и по делу. Уровень участников это ещё один плюс в копилку к организаторам.
В общем, мы отнеслись к задаче недостаточно серьезно, рискнули поехать небольшим составом, рискнули делать в некотором смысле нишевый проект, недосмотрели накладку с нажатиями, попали в конкурентный трек.
Однако, как я уже упоминал, часть проделанной работы мне будет нужна в будущем, да и обучаться можно только на опыте поражений, а не на опыте побед. В этом смысле проиграть было полезно.
Афтерпати в зимней хате
К счастью, организаторы сделали всё возможное, чтобы горечь поражения отравляла участников не слишком долго. Сначала нас свозили в деревню оленеводов, где провели мини-экскурсию и покормили ужином из местных блюд прямо в чуме!





После сытного ужина и экскурсии нам предоставили отличные номера в отеле, чтобы выспаться и помыться. Некоторых поселили в один номер с кем-то, но мне достался индивидуальный.
Кстати, тут я впервые выложил весь мерч от организаторов, и он достойный: футболка, бутылка для воды, надувная подушка (такая же, как на Цифровом Прорыве), много разных наклеек, сумка.


Отдельно выдали сертификаты о пересечении Полярного Круга. Но для меня это не первый опыт, т.к. я был на горнолыжном курорте под Мурманском. Тем не менее, даже такая формальная мелочь очередной раз подчёркивает уровень гостеприимства и качество приёма нас в этом отдалённом участке Земли. Всё это было очень приятно и неожиданно, за что и организаторам и встречающим огромное спасибо.
Какие-то команды ещё пошли гулять и тусоваться, но я слишком стар я не понимаю, как и зачем они это делали. Меня вырубило почти сразу после такой адовой напряжёнки.
А утром нас отвезли на завтрак. Хотя формально хакатон уже закончился, организаторы выполнили все свои обязательства, и тут уже нас можно было отдать на произвол судьбы до рейсов.
Салехард
Мне нравятся маленькие городки концептуально, но в России с этим всё плохо: в маленьких городках нет денег, а у людей недостаточно воли и энтузиазма, из-за чего очень часто гулять по таким городкам неприятно, вокруг очень много некрасивых старых домов, неубранных улиц, нет и намёка на урбанистику.
В Салехарде дела совсем не так. Дома очень красивые, современные. У людей явно есть вкус и желание заниматься городом. Гулять очень приятно, глаз радуется.









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






После библиотеки взяли экскурсию в местном музее. Любопытно, что музей был основан иегуменом И. С. Шемановским на основе мысли о том, что для продвижения какой-то идеологии в народ нужно сначала познать собственную идеологию этого народа (то есть, например, чтобы продвинуть христианство среди язычников, нужно в том числе познакомиться с их языческими обрядами).





В музее тоже видна рука дизайнера, многие решения любопытные и смотрятся свежо (посмотрите, например, на стиль оформления экспозиционных стёкол на последней фотографии). Всё обёрнуто в современные технологии: QR-коды, сенсорные экраны, аудиогиды. Сейчас таким не удивишь, конечно, просто Салехард — будем честны — не самое туристическое место, однако в поддержку культуры и просвещения тут вкладываются активно.
Итоги
Ложкой дёгтя можно назвать уже упомянутый дисбаланс конкуренции и довольно плохую работу вайфая: подключились мы не сразу, для аплоада приходилось переключаться на мобилу, а местный промежуточный узел своим антивирусом блокировал ngrok, из-за чего для тестирования приходилось каждый раз деплоить на сервер. При крайне плохом аплоаде, да.
Но даже при этом всём организация на высочайшем уровне. Это касается и той части, которая, собственно, формировала сам хакатон, и той, которая выступала площадкой. Первые применили все свои знания о хакатонах и дали участникам именно то, что им было нужно: комфортные условия, душ и место для сна, приятный мерч, интересные задачи, справедливое судейство, огромный качественный презентационный экран. Вторые встретили с отличным уровнем гостеприимства, прекрасным настроением и энтузиазмом, всех разместили и возили, предлагали классные развлечения.
Впечатления остались самые положительные, несмотря на проигрыш. Лучший хакатон из тех, где я был.
Прочитать про другие хакатоны, в которых я участвовал:
- Как мы выиграли самый большой хакатон в мире
- Как мы НЕ выиграли внутренний хакатон JetBrains
- 100% винрейт: как мы выиграли Цифровой Прорыв и ушли без приза
- Победа на VK Hackathon 2018
