Как мы НЕ выиграли внутренний хакатон JetBrains
Вступление
В прошлые выходные компания JetBrains устраивала хакатон у себя в офисе. Оказывается, они делают что-то подобное каждый год, но предыдущие разы могли участвовать только сотрудники, а сейчас достаточно было, чтобы как минимум один человек в команде был сотрудником.
По правилам можно было делать что угодно, никаких ограничений. У нас в команде было аж трое бэкенд-разработчиков, двое из которых с фронтенд-опытом, и один чистый фронтендщик.
Поскольку хакатон проводили JetBrains, было понятно, что следует сделать что-то, связанное с компанией или её продуктами. В дополнение я решил не отступать от своего правила: на каждом хакатоне обязательно пробовать новую технологию, с которой я раньше не работал или работал очень мало.
Таким образом мы решили делать TowerDefence-игру для изучения программирования на Kotlin, в которой игроку нужно было решать задачки на этом языке, чтобы отражать атаки вражеских кораблей на… остров Котлин :) Ну и на каком языке мы писали бэкенд вы тоже, думаю, уже догадались.
Начало
Компания выделила нам отдельный большой кабинет, четыре дополнительных монитора и полное спокойствие и свободу. Идеальные условия для работы.


Проблемы начались с неожиданной стороны. Первые 20 минут я собирался потратить на настройку контейнера для быстрого деплоя, а потом заниматься основными задачами. Мы писали на Kotlin, где основной системой сборки и управления зависимостями является Gradle, и тут наш ждал сильный облом:
- Проект, созданный на одном компьютере, не собирался на другом.
- Контейнер, собирающийся на одной операционной системе, вылетал на другой.
Мы в итоге потратили около 5 часов на борьбу с призраками в машине, в том числе сходили в другой корпус к разработчикам Kotlin и специалистам по Gradle. Кстати, довольно интересный опыт, когда ты сидишь на хакатоне и используешь технологию, разработчики которой сидят в соседнем здании, и ты можешь пойти и спросить их что-нибудь.
Помочь нам смогли ограниченно, мы придумали костыль, которым и стали пользоваться. К сожалению я, разбалованный удобством и простотой работы .NET, не ожидал такой подставы, хотя у всего, что касается Java, есть много консервативных ушей, торчащих со всех сторон и усложняющих программистам жизнь.
Сам Kotlin, кстати, оставил скорее приятные впечатления. Если бы не ужасная и перегруженная сущностями система организации проектов от Java, которая ведёт себя непредсказуемо и требует ручной настройки, можно было бы даже взять его, как один из основных языков для различных бэкенд-проектов. Но нет.




Однако, язык очевидно сделан людьми для людей а не как C++, и очень многие вещи создают удобство из коробки. В целом, язык заимствовал идеи из C#, а некоторые даже развил: секвенции и генераторы, array-хелперы, extension-методы и прочие классные плюшки, которые делают код не только лаконичным, но и визуально изящным.
Организация
Офис JetBrains — одно из самых комфортных мест, в которых я был когда-либо в жизни, и это не преувеличение. Каждый квадратный метр сделан с какой-то мыслью и вкусом. Когда идёшь по коридорам, постоянно создаётся впечатление: «О, вот место, где клёво сидеть с ноутбуком. А вот место, где клёво общаться с людьми. А вот место, где клёво просто отдыхать, чтобы никто не мешал.»



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



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


Работа и продукт
Обстановка нас расслабила, к тому же один из участников в середине второго (основного по рабочей нагрузке) дня вынужден был улететь в другой город. И ещё мы плохо распределили роли: много задач легко на одного человека, который делал фронтенд. В итоге мы все к нему подключились, но было уже поздно, не успели делать много фич, которые запланировали.


Получилась браузерная игра: на форт основа Котлин нападают враги. Когда таймер достигает нуля, они выпускают торпеды, которые будут снимать с форта жизни. Но у вас есть программируемые орудия, а разведка выяснила, что торпеды будут запущены в определенном порядке (каждая торпеда это какое-то число).
Вам нужно написать программу, которая генерирует такую же последовательность. В область видимости в программу приходит N — общее число торпед, и метод fire(), который позволяет стрелять. Например, если разведка доложила:
1 2 3 4 5 6 7 ...
То вам нужно написать:
for(i in 1..N) {fire(i)
}
Со временем задачи усложняются, к тому же, вражеский саботаж выводит из строя различные участки оборонительной системы, поэтому мы не можете пользоваться какими-то конструкциями (например, знаком деления, циклами, условиями итд).
Допустим, вам нужно сгенерировать вот такую последовательность:
1 1 1 1 1 1 ....
N раз, но нельзя пользоваться числами, никакими! Слабо?
Попробовать игру можно по ссылке: https://kotlinforts.justanother.app
Ложка дёгтя и конец
Мы почти дописали ещё две интересные фичи, но уже не успели к дедлайну, поэтому решили их не доделывать. После чего были презентации продуктов, и тут возникла одна из двух моих претензий к организаторам хакатона. Проектов было очень много: всего 55. Люди в зале были очень уставшие после хакатона и быстро расходились. Тем, кто выступал первыми, досталось очень много внимания, а тем, кто последними — очень мало. 55 презентаций по 5 минут подряд это крайне тяжело, особенно после того, как ты двое суток писал код почти без перерыва. Очевидно, нужно было бить демонстрацию на категории и запускать параллельно. Да, не все увидели бы все проекты, но и так большинство не увидело все проекты, и вообще не было способно их воспринимать.
Конкретно у нас не очень получилось продемонстрировать сильные стороны проекта. Мы не попали с временем геймплейного видеоролика, всё было в спешке, питчер немного волновался, и в целом, на мой взгляд, мы почти не показали проект так, как он должен был быть представлен.
Выбор проводился коллегией жюри по номинациям, и отдельной категорией шло голосование зрителей. Мы не взяли ни то, ни другое, и тут у меня есть ещё одна претензия к организаторам, но она не такая, как вы могли бы подумать: «Ааа, мы не выиграли, всё обман!». На самом деле я хотел бы почитать отзывы жюри и голосовавших на наш проект, понять, что сделали не так, где не дожали, что можно было бы улучшить. Хочется увидеть, как проводилась оценка, чтобы, например, участвовать в следующем году более релевантно.
Голосование было очень спешное, на него сотрудникам давалась пара дней, и причем рабочих дней. За такой срок вживую оценить 55 проектов — почти нереально. Я бы рекомендовал организаторам в следующий раз этот срок расширить хотя бы до недели.
В голосовании лидерами стали проекты, связанные с JetBrains, корпоративной жизнью, офисом и продуктами компании. А в выборе жюри победили проекты, которые лучше презентовались и были более понятны, к тому же успели сделать некоторый дополнительный пиар по внутренним каналам.
Персонально я вижу некоторые наши ошибки, но абсолютно уверен, что игра не получила должного внимания, и её по факту довольно мало посмотрели (в том числе из-за того, что мы не смогли заинтересовать презентацией, и ещё из-за того, что не успели сделать какой-то более понятный вход с обучением). Например, игра, которая заняла первое место в нашей категории, является клоном существующей сетевой викторины под телефоны, только с другим контентом, и уступает нашему проекту как визуально, так и технически, но зато на презентации авторы предложили всем оставшимся к этому моменту зрителям в неё сыграть, и она запомнилась.
В любом случае, было интересно и полезно, дни прошли не зря, а опыт обязательно пригодится в дальнейшем :)
