Назад

Хакатон. Как это было

Наш Java-разработчик Павел Колбасов рассказывает, как его команда участвовала в хакатоне «Цифровой прорыв».

Осенью мы с командой участвовали в хакатоне конкурса «Цифровой прорыв». Свои цели выполнили с запасом. Мы заняли второе место в своем кейсе по всей России, получили 150 000 рублей на команду и право участвовать в гранд-финале в декабре. В итоге мы выбрали направление LifeTech, так как ожидали, что в FinTech будет слишком много задач на блокчейн. Это, кстати, не оправдалось. Задача на блокчейн была только одна. Крупные компании уже в него наигрались.

Почему выбрали этот кейс?


В LifeTech было 7 кейсов и при выборе мы исходили из возможностей команды (кейсы на анализ данных (ML) и блокчейн нам не подходили). Для выбора оставалось два кейса: Соцзащита и Добро детям. В рамках кейса Добро детям предполагалась разработка социального маркетплейса помощи воспитанникам детских домов. Задача по технической части понятная, а по сути основана на идеях и своем видении, как сделать жизнь воспитанников детских домов лучше. Для этого нужны были горящие глаза, эмпатия, эмоции, сопричастность, чего у нас был явный недостаток. Плохо, конечно, но мы это осознали. Прикинули, что победит команда с идеей, и не стали ввязываться. Так что свой кейс Соцзащита выбрали скорее по остаточному принципу, потому что могли его сделать за отведенное время. Технически он предполагал формирование единого реестра данных по соцзащите из разнородных источников данных, т. е. задачу, которая часто встречается в повседневной работе.

Как проходил хакатон


Как только мы выбрали кейс — стали делать заготовки под него. По бэку нужна была предполагаемая архитектура решения, способ хранения данных, ручки, что-то отдающие вовне. По фронту точно нужен был UI и тепловая карта. Это сыграло свою роль.
По бэку получилась вот такая архитектура и кое-какие заготовки по коду (см. фотографию ниже). Все это в сильно урезанном и замоканном виде было криво и косо реализовано в процессе хакатона.

24 сентября, пятница, 18:00


Только кончилась работа, а хакатон официально начался. Стали видны дополнительные материалы и задание. Начали с командой их смотреть и думать, что делать, чтобы до первого чекпоинта подготовить вопросы к кейсодержателю и трекерам.
24 сентября, пятница, 21:00


Первый чекпоинт. Задали вопросы. Поняли, что наша первоначальная задумка неверна. Взяли час, чтобы каждый подумал, что делать.
24 сентября, пятница, 22:00


Обсуждали всякое. Уходили куда-то в частности. Так 2 часа. В итоге договорились, когда встречаемся и что делаем. Много проговорили, накидали идей, но мало зафиксировали. Усталость после рабочего дня уже давала о себе знать. Договорились встретиться за час до второго чекпойнта.
25 сентября, суббота, 00:30


Пошел спать. В этот день так и не удалось покодить, благо заготовка под бэк была.
25 сентября, суббота, 06:30


Встал и начал кодить. Понял, что при всем желании такую архитектуру не забабахаем. В итоге весь оставшийся кодинг — это разработка интерфейсов и реализаций, возвращающих моковые данные в попытках показать изначальную архитектуру, и наступление на горло своему перфекционизму. В ход шли наиболее быстрые и тупые реализации. Изначально планировались разные поднятые моковые сервисы, которые содержат разный набор полей. Мы их поднимаем, реально их опрашиваем. Что-то делаем. А в итоге пришлось сделать одну реализацию, которая просто отдает массив 6 разных социальных профилей, содержащих все нужные нам поля.
25 сентября, суббота, 12:00


Как и договаривались, встретились за час до второго чекпоинта. Подбили, что есть. Бэк вроде работает, но наружу ничего не торчит, Фронт и Мобилка делает UI на заглушках, то что нужно. Презентация сделана наполовину. Вроде сделано много. У нас было 2 сценария: один — от лица человека, обращающегося за помощью, он делался на мобиле. Второй — для сотрудника соцподдержки, web.
25 сентября, суббота, 13:00


Встреча с трекерами прошла успешно, Показали чуть-чуть UI. Демостенд у нас был сделан давно и торчал наружу. Показали заготовку презентации, обсудили, что там лучше всего показать. Третий чекпойнт в 19:00.
25 сентября, суббота, 13:30


Обсудили, кто что будет делать, накидали, как будет выглядеть API. К этому моменту другой разработчик сделал уже какие-то обработчики http-запросов (ручки). Я начал делать задачу по выкладке бэка на демостенд. Вроде ничего сложного, сделал dockerfile, проверил его локально, в докере же запустил монго. Убедился, что бэк видит MongoDB, и все работает. При раскатке на демостенд начались проблемы. Бэк и MongoDB не видели друг друга. Эту проблему я решал часа четыре. Так и не смог — мозг уже отказывался думать. Призвал коллег, и стало понятно, что проблема с правами. При локальном запуске монго подкладывался специальный файлик, где было описано создание тестового пользователя и тестовой БД. На стенде он почему-то не работал. В итоге опять же сделали самую простую реализацию: использовали название БД, логин и пароль суперпользователя. Так взлетело. На пустом месте было потеряно часов 8 двух разработчиков.
25 сентября, суббота, 19:00


Третий чекпойнт. Выполнили его требования. Заполнили тизер и выложили ссылки на репозитории и тестовый стенд. Спрашивали уже больше по презентации, что и как лучше делать. После чекпоинта собрались и стали думать, как нам интегрироваться, и что мы успеем показать. На этот момент был стенд, и фронт показывал какие-то свои хардкодные сгенеренные данные. Мобилка тоже. В общем у каждого что-то было, но никто с друг другом не общался. Договорились, какие методы нужны, и что бэк выдаст постман-коллекции. С этого момента я больше не касался бэка, его доделывал другой разработчик. А я сконцентрировался на визуале, чтобы хорошо показать наш результат. И вообще пребывал как в тумане, знал, что я могу сделать, чтобы было полезно, но особо не вникал, как дела на фронте и мобиле. Не было сил. Сделать бы то, что понятно.
25 сентября, суббота, 21:00


Начал делать красивую архитектурную схему взаимодействия, но не получалось, призвал проджект менеджера, которая у нас была за дизайнера в том числе. Я объяснял, что надо делать, а она говорила: «‎Ткни сюда, выбери эту стрелку"‎. В итоге с трудом перенес то, что было накорябано на листочке в draw.io. Уже мало соображал, всё с трудом давалось. А потом уже она сделала офигительно красиво.
25 сентября, воскресенье, 00:00


Ушел спать. Договорились что в 7:00 встанем и продолжим делать. Все устали. В 11:00 уже стоп-кодинг. После этого коммитить в репозиторий уже запрещается, это проверяют. Но есть время до 13:00, чтобы допилить презентацию и подготовить текст.
26 сентября, воскресенье, 06:00


Встал. Начал править readme и писать комментарии в проекте. Парни параллельно допиливали фронт и мобилку, внедряли кое-какие фичи. Делал скринкаст решения. Записал видеообзор получившегося UI и функционала. С третьей попытки получилось. Все это заняло время до 11:00. В итоге у ребят последние коммиты были за 2 минуты до стопкодинга. Едва успели.
26 сентября, воскресенье, 11:00


После стопкодинга узнали время нашей защиты, в 13:00. Мы выступали первыми, не у кого было подсмотреть. Выступал проджект менеджер (она же дизайнер, она же фасилитатор), как более опытная в презентациях. После тестовых прогонов презентации, оказалось, что жестко не успеваем в тайминг. Выходило 10 минут, а надо было уложиться в 5 минут. Пришлось много обсуждать и урезать текст.
26 сентября, воскресенье, 13:00


Выступление. Волновались, но всё прошло хорошо. Можно отдохнуть и послушать выступление других команд. В ходе прослушивания выяснилось, что у нас не так уж всё плохо и даже хорошо. В это не особо верилось. Объявление результатов было запланировано на 19:00. Можно было отдохнуть, чем все и занялись.
26 сентября, воскресенье, 16:00


Позвонили организаторы, сказали, чтобы мы присутствовали во время объявления результатов в зуме. Стало понятно, что в десятку мы точно вошли.
26 сентября, воскресенье, 19:00


Стал смотреть объявления победителей других кейсов. Они были чуть раньше нашего. Сделано было очень круто. Сначала объявляют десять команд. Потом оставляют пять команд. Объявляют третье, второе и первое место. До самого конца сохраняется интрига, какое же место ты занял.

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

Но речь так и не понадобилась. Её толкает команда, занявшее первое место, а жаль. Но второе место было неожиданно и приятно.
27 сентября, понедельник


Прошел в приятных хлопотах. Анализ наших результатов: где было хорошо, где плохо. По итогам чек-пойнтов мне выдали ассасмент — как я проявил себя на чекпойнтах по мнению жюри. Заполнению документов на получение денежного приза. На команду 150 000 рублей.
Что помогало и мешало во время работы?

Помогало:

  • Поддержка сокомандников, что-то вроде парного программирования или парной работы над задачей. Под конец дня из-за усталости начинаешь тупить на ровном месте. Тогда призываешь коллегу — объясняешь, чего хочешь добиться, и он находит причину или простое решение.

  • Опыт командной разработки вообще и опыт коммуникации в распределенных командах.

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

  • Большая подготовительная работа до старта хакатона.

  • Большой опыт и самодостаточность сокомандников. Это напоминало сказку про глухих, которые говорили друг другу не то что надо, но в итоге как-то всё в последний момент сынтегрировалось и заработало.

Мешало:

  • Излишний перфекционизм и энтерпрайзность. Было стыдно, хотелось нормально назвать переменные, отрефакторить код, сделать по уму.

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

  • Недостаток фасилитирования. Мы много обсуждали, уходили в частности, прежде чем к чему-то прийти. Потратили много время на разговоры.

  • Отсутствие опыта участия в хакатонах. Тут как в голодных играх — надо понравиться жюри)
Что было самое сложное на хакатоне?

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

Лично я хочу раз в 3 месяца участвовать в следующем году. Это:

  • челлендж для себя, выдержу или нет

  • мотивация что-то изучить к дедлайну

  • способ увидеть, что сейчас нужно IT-индустрии

  • способ увидеть свои сильные и слабые стороны, узнать свой текущий предел

  • способ получить обратную связь

  • способ заявить о себе, получить плюсы в резюме

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

Мне кажется, любому программисту или айтишнику. Из-за тех причин, что я описал выше. Даже если не выиграете — вы многое узнаете о себе. Не надо бояться. Большинство участников хакатонов — это студенты. И именно студенческой команде мы проиграли в своем кейсе. Они взяли за счет идеи и более хорошему соответствию желаниям и чаяниям кейсодержателей. Мы больше сконцентрировались на бэке, а они — на визуальной и аналитической составляющей.

Как часто? Надо смотреть по себе. Это довольно тяжело физически, по крайней мере мне. Я восстанавливался две недели. Чаще чем раз в три месяца я не потяну. Каждому надо попробовать, посмотреть на свои ощущения.
Специалист по внутренним коммуникациям
Кристина Колесникова