Привет всем, меня зовут Дима, я бэкэнд-разработчик на Avito.ru. Я участвовал во множестве хакатонов: малых и больших, российских и международных, внутренних и внешних, удаленных, распределенных и классических. Хочу рассказать, как они помогли познакомиться со стариком в Омске, заразиться криптобактериями, запустить виртуальный космический корабль во вселенную Эрланга и спасти человечество от вымирания.

Я начал посещать хакатоны как PHP-бэкэнд-разработчик с некоторым опытом фронтенд-разработки. Совершенно очевидно, что на хакатонах я писал на чем угодно, только не на PHP: Python, Rust, Go, Erlang и других javascripts с реагирующими абстракциями. Мне очень повезло с командой - ребята были сильными профессионалами и очень хотели сделать что-то нестандартное. С первого хакатона мы выработали главный критерий оценки идеи. Это не более круто, чем безумно. Осуществимость, применимость в реальной жизни, возможность монетизации - это для нас не очень важно.

Проект можно сделать еще более безумным, например, используя редкие или нестандартные инструменты. Или неожиданным образом использовать стандартные инструменты. Обсуждая проект, мы постарались довести степень сумасшествия до 100%. Оценка производилась членами команды на основе безумия предложенных компонентов и решений.

Прошли годы, у меня новая работа, я переехал в другой город и сменил сообщество хакатонов. Но акцент в выборе идей по-прежнему делается на безумие. Здесь я расскажу о некоторых проектах, над которыми я работал на внешних хакатонах.

Проекты

ndrctl

Произносится «косвенно». Многопользовательская двухмерная игра в открытой вселенной. Космические корабли летают, атакуют друг друга и космические объекты. В планах - торговля и прочие приятные мелочи. Но этого недостаточно. А что, если мы сделаем управление звездолетом косвенным (отсюда и название проекта)? Допустим, вы не можете просто отправить корабль налево. Но мы можем поставить два двигателя слева и справа и позволить игроку контролировать их тягу. Хотите лететь налево? Поверните корабль в правильном направлении, контролируя тягу обоих двигателей, затем дайте полный газ. +10 очков сумасшествия. Как сделать еще веселее? Управление кораблем с использованием кода. Какой-то тривиальный код PHP или Python. Еще +10. Так работала шкала безумия. Как видите, в существующем виде идея еще не была достойна воплощения.

В то время мы создавали среды разработки на работе. Это были безумные дни, Docker только зарождался, ребята из Google еще не думали о Kubernetes, готовых решений не существовало. У нас были насущные проблемы с виртуализацией и контейнеризацией, изоляцией, быстрым развертыванием снапшотов. Очевидно, вся эта инфраструктура использовалась для создания игры.

Каждый космический корабль представлял собой lxc-контейнер, защищенный набором правил apparmor. Двигатели, радары и другие узлы монтировались как блочные устройства. Код, загруженный игроком на корабль, мог взаимодействовать с устройствами, и это был единственный способ взаимодействия со вселенной. Вы хотите знать, где находитесь - прочтите данные датчика. Вы хотите отправить корабль в определенную точку - вы управляете тягой двигателя. Поскольку корабли были контейнерами, игрок мог писать код на любом языке.

А вселенная была в Эрланге. Он генерировал тики, определял физику, рассчитывал положение кораблей по тяге двигателя, распределял показания датчиков. Это был Erlang, потому что руководитель нашей команды в то время интересовался функциональными языками программирования.

Визуализировали в html5, svg. На демонстрации пытались загрузить фрагмент кода, который заставлял корабль летать по кругу. Но он упорно вращался и летел по спирали в открытое пространство. Так мы написали первую в жизни игру, в которой проиграли.

криптобакт

Устройство пользователя (ноутбук, телефон, планшет) заселено бактериями. Они едят, регенерируют, атакуют врагов. Многопользовательская игра в практически реальном мире.

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

Пользователи одной сети Wi-Fi могут с определенной вероятностью обмениваться штаммами своих бактерий. В то же время колония бактерий, поселившаяся на чужом устройстве, может начать атаковать вражеские бактерии. Или ассимилироваться с ними. Или могут быть убиты ими.

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

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

go-android-rpc

На одном из распределенных международных хакатонов было решено создать первое в мире приложение для Android, полностью написанное на Go. В то время уже можно было создавать приложения OpenGL на Go. Но это все треугольные сетки. И мы хотели использовать SDK с кнопками и текстовыми полями, чтобы не рисовать все самостоятельно. SDK находится на Java. Пишем в Go. Никаких проблем не ожидалось.

Мы настроили RPC-сервер на Java, и Go действовал как клиент, отправляющий команды, которые были переведены в команды Java. Мы проанализировали документацию SDK и сгенерировали зеркальные вызовы для Go. Команда Go была отправлена ​​на Java, результат был отправлен обратно. Нам удалось создать кнопки, вызвав соответствующие методы SDK.

Проблема в том, что методы SDK часто принимают объекты. Нам не удалось найти способ связать структуры Go с объектами Java. Итак, нам пришлось ограничиться теми методами, которые принимали скаляры. Этих методов хватило, чтобы создать текстовый квест-катастрофу космического корабля в духе 80-х.

апизал

Мы приняли участие в тематическом хакатоне, посвященном услугам для города. Мы создали сервис, который принимает GPS-трек в качестве входных данных для поиска интересных мест на маршруте и отображает их в виде HTML-страницы. Этакий генератор отчетов для ленивых блогеров.

Внутри него мы решили реализовать конвейер а-ля unix. Одна часть анализирует wikimapia, другая анализирует треки gpx, третья сглаживает углы в маршруте, четвертая формирует отчет. Детали заменяются и комбинируются. Может быть написан на любом языке, если реализован данный интерфейс.

moov

Мы продолжили развивать представление о маршрутах и ​​достопримечательностях. Цель заключалась в том, чтобы в режиме реального времени получать информацию о том, что можно увидеть в этом районе. И попробовать родной отреагировать. Мы создали приложение с картой достопримечательностей, расположенных поблизости. Это был обширный план, позволяющий добавить планировщик маршрута, прикрепить социальные элементы (кто из ваших друзей недавно путешествовал и что они видели), создать отчет, используя apisal из записанного трека. Но нас интересовала реакция родных.

воскресить эволюцию

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

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

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

Забавные факты

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

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

- Кто там?

- Мы живем в общежитии.

- Какое общежитие? Я тебя не знаю, я тебя не впущу.

- Ой, извините, я думаю, это неправильное здание.

- Действительно? Выходи с тобой!

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

Как выяснилось на другом хакатоне, туалеты в здании технопарка иногда забиваются. А галерея в другую часть здания на ночь закрыта. В Новосибирске холодно. И снег. Охранник в соседней части дома очень удивился, когда среди ночи стая сонных айтишников бросилась в тапочках по снегу в уборную.

На один из хакатонов мне пришлось проехать 20 километров на велосипеде. После двух почти бессонных дней мне пришлось ехать обратно поздно вечером. На небольшом участке дороги не было уличных фонарей, и у меня не было фар на велосипеде. К счастью, ночью там мало машин. Во время езды я пытался закрыть глаза. Оказалось, никакой разницы нет - все равно ничего не видно, а все равно сразу чувствуешь, что едешь по обочине.

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

На другом хакатоне одному из членов жюри понравился наш проект, и он порекомендовал друга, оплатившего наш полет, на хакатон в Москве.

На одном хакатоне мы столкнулись с проблемой перенаселения. Когда мы искали место, где можно было бы поработать в тишине и покое, оказалось, что все занято, и мы могли получить только половину стола на троих. Затем мы спросили, есть ли у них комната. Ответом было уверенное «нет». Мы не заблудились и спросили, есть ли у них этаж. И оно у них было! Мы провели два дня на почти пустом этаже красивого московского бизнес-центра «Арма», бегая за солнцем, наблюдая рассветы и закаты.

Тактика

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

Перспективным направлением является поиск новых подходов к знакомым вещам. Хороший пример - Tinder. Службы знакомств существуют уже много лет, и этим ребятам удалось найти новую механику, которая понравилась многим.

Вы можете сделать саморазвитие своей главной ценностью и на хакатоне ставить цели, основываясь на тех инструментах, которые хотите изучить. Если вы всегда мечтали изучить Rust - пора это сделать. У моих коллег есть положительный опыт в этом.

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

Выгода

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

Решения, протестированные на хакатонах, часто пригодятся в работе. Есть примеры реализации инструментов, разработанных на хакатоне.

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

Отличный бонус - возможность провести несколько бессонных ночей в офисах разных IT-компаний - многие из них проводят хакатоны, что дает возможность посмотреть изнутри. Вы можете путешествовать по разным городам и даже странам - некоторые хакатоны проходят в несколько этапов, а победители этапов приглашаются принять участие в финалах в столицах или за рубежом.

Подготовка

Главное на любом хакатоне - тапочки. Два дня напряженной работы требуют концентрации. Ничто не должно вас отвлекать. Создайте максимально комфортные условия для работы.

Заранее продумайте, как вы будете спать. Хардкорная альтернатива - вообще не спать. Я пробовал это, работает. Но с возрастом становится сложнее. Если вы решили поспать, убедитесь, что другие участники могут продолжать работать без вас, и вы легко вернетесь к работе, когда проснетесь. Решение - распараллеливание задач и замораживание интерфейсов в ключевых точках.

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

Обдумайте идею заранее. Это самый трудоемкий процесс. Выбрав идею, определитесь с технологиями, которые вы хотите использовать, поищите на GitHub и в Интернете подходящие инструменты. Прочтите документацию, найдите сообщения, примеры.

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

Послесловие

Хакатоны - это хороший опыт. Этот вывод следует прямо из того факта, что у них есть несколько плюсов, а не один минус. Хакатон стоит отложить другие ваши планы и провести несколько десятков часов с коллегами и немного кода.

Такие мероприятия имеет смысл устраивать внутри среднего бизнеса и крупных корпораций. В контексте малого бизнеса вы можете присоединиться к единомышленникам и посетить внешний хакатон в составе одной или нескольких команд. А поскольку хакатоны настолько полезны, а Avito - большая корпорация, мы решили проводить внутренние хакатоны. Фактически, недавно мы провели восьмой хакатон.

В следующем посте я расскажу вам о внутренних хакатонах Avito. Немного об организации, Технической и Большой Пакете, в которую направляется Centi-Code, и много о проектах, которые мы разработали - полезность для внутренней работы и сообщества разработчиков открытого исходного кода.