Hack. Sleep. Repeat

в 9:59, , рубрики: Блог компании Avito, Хакатоны

Привет. Меня зовут Дима, и я бэкенд-разработчик в Avito. Мне довелось поучаствовать в кучке хакатонов: мелких и крупных, российских и зарубежных, внешних и внутри компаний, удалённых, распределённых и классических. Хочу рассказать, как они помогли познакомиться с омским дедом, заразиться криптобактериями, запустить виртуальный космический корабль в эрланг-вселенную и спасти человечество от вымирания.
Hack. Sleep. Repeat - 1

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

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

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

Проекты

ndrctl

Название произносится как “indirectly”. Многопользовательская двухмерная игра в открытой вселенной. Космические корабли могут летать, атаковать друг друга и космические объекты. В будущем — торговать и прочие прелести. Но это всё недостаточно упорото. А что если сделать управление кораблём опосредованным (отсюда название проекта)? Предположим, что нельзя просто отправить корабль лететь влево. Но можно поставить два двигателя слева и справа и разрешить устанавливать тягу каждому из них. Хочешь лететь налево? Разверни корабль в нужную сторону, управляя тягой обоих двигателей, затем газ в пол. Плюс десять упоротости. Как сделать ещё веселее? Управлять кораблём можно с помощью кода. Обычного такого, пхп или питонячьего. Ещё плюс десять. Примерно была устроена шкала упоротости. Как видите, в текущем виде идея ещё не была достойна реализации.

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

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

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

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

Hack. Sleep. Repeat - 2
Фото: FB HackdayRussia

cryptobact

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

Hack. Sleep. Repeat - 3
Фото: hackaphone.ru

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

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

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

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

go-android-rpc

На одном из распределённых зарубежных хакатонов решили создать первое в мире приложение для андроида, полностью написанное на го. На тот момент уже была возможность создавать OpenGL-приложения на го. Но там же треугольнички. А мы хотели использовать SDK со всеми этими кнопочками и текстовыми полями, чтобы не рисовать самим. SDK на яве. Мы пишем на го. Вроде ничего не останавливает.

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

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

apisal

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

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

Hack. Sleep. Repeat - 4
Фото: pvsm.ru

moov

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

resurrect-the-evolution

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

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

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

Ситуации

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

***

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

— Кто там?
— Мы в хостел.
— Какой ещё хостел? Я тебя не знаю, я тебя не впущу.
— … ой, кажется, мы корпусом ошиблись.
— Да? Ну тогда пошёл на фиг!

***

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

***

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

***

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

***

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

***

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

***

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

Тактика

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

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

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

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

Польза

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

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

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

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

Подготовка

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

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

Hack. Sleep. Repeat - 5
Фото: hackaphone.ru

Лучше всего регулировать длительность сна можно газировкой. При достаточном количестве выпитого не было ещё ни одного проспавшего больше часа. Алкоголь категорически не подходит: очень спать хочется, а думается сильно труднее. На распределённом хакатоне работали дома у товарища. Была возможность варить ядрёный кофе. Отличная штука для борьбы со сном. И выясните вопрос с кормёжкой. Походы за едой могут отнимать очень много времени. Газировку и еду при необходимости приносите с собой.

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

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

Hack. Sleep. Repeat - 6
Фото: hackaphone.ru

Послесловие

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

Есть смысл организовывать такие события внутри средних и больших компаний. В компаниях поменьше можно найти единомышленников и отправиться на внешний хакатон одной или несколькими командами. А раз от хакатонов сплошная польза, а Avito — большая компания, мы решили проводить внутренние хакатоны. Уже в эту субботу в Avito пройдёт четвёртый по счёту хакатон.

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

Автор: pik4ez

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js