В минувшие выходные Clojure-сообщество испытывало огромные волнения в силе. За 48 часов требовалось ни много ни мало написать любое веб-приложение. Команды вплоть до 4-х человек, весь код (помимо библиотек, конечно), дизайн и ассеты должны создаваться с нуля в течение соревнования.
Страница соревнования: http://clojurecup.com/
Правила
Жюри планирует оценивать проекты с точки среднего интернет-пользователя — классность, завершенность, работоспособность. То есть, вникать во всю красоту кода или полезность библиотеки для разработчика они не хотят — в основном потому что красота кода это вещь субъективная, заявок много, вникать долго.
Это и упрощает жизнь, и усложняет — понятно, к чему стремиться, однако сделать завершенный продукт куда сложнее, чем сделать базовую версию какой-то библиотеки. Грубо говоря, в идеале надо доделать не только первые 80%, занимающие 20% времени, но и последние 20%, занимающие 80% времени.
Организация
И хотя организация начиналась как нечто полумаргинальное, событие очень быстро набрало обороты. Почти все заметные деятели Clojure коммьюнити были зазваны в жюри, почти все известные Clojure-компании подключились спонсорами.
Участникам был предоставлен полный фарш сервисов: production-сервер на DigitalOcean (1GB / 1 CPU Droplet), репозиторий и проект на Deveo и чатопочта на FlowDock. Забегая вперед, скажу, что выглядит это всё круто, но наша команда почти ничем не пользовалась на полную катушку — не было времени, поэтому оставили привычный skype group chat, git, dropbox shared folder и ручной запуск через nohup на сервере. Если бы не жесткое давление времени, я бы обязательно все хотел пощупать и настроить.
Все огранизованно достаточно слажено и по-максимуму автоматизировано — во время соревнования была спец. страница для участников, на которой отмечалось флажками, какие из обязательных этапов setup пройдены, на общем списке приложений автоматически обновлялись скриншоты и было видно, у кого как примерно выглядит landing page.
Кстати, любопытный факт: как подсчитали организаторы, source control repository type stats: Git 100%, Hg 0%, SVN 0%.
Призы
Организаторы подошли к теме призов с юмором. И если можно понять, зачем программистам Raspberry Pi Board или One O'Reilly e-book, то скажем One print copy of How to Solve It или One La Siesta Colombian organic Single Hammock Isleña (гамак!) за первое место — это отсылки к культовым докладам Рича Хики, в частности, Hammock-driven development. Кстати, за первое место дают среди прочего One Leap Motion Controller, per member (все призы per member). Полный список всего можно посмотреть здесь: clojurecup.com/prizes.html
Подготовка
Традиционно для таких соревнований, все обещают себе подготовиться и не готовятся. В нашей команде было три программиста, сколько-нибудь серьезный опыт Clojure был у меня, и как самый ответственный подготовился тоже только я. А именно, накидал небольщой прототип приложения заранее, чтобы представить, как будет организован код, dataflow, какие проблемы придется решать. Это серьезно помогло, код переиспользовать было нельзя, но многие важные решения на старте проекта я уже знал как принимать. То есть, не было вот этой вот аморфной каши «а как же мы будем делать-то», а просто было ясно как нужно делать, оставалось только сделать.
В ретроспективе я понимаю, что, например, такую вещь как редактор спрайтов можно было бы найти или сделать заранее. Достаточно универсальная вещь, чтобы ее можно было заопенсорсить и использовать самим. Команда WarMagnet, например, сделала такое с Clojure биндингами к React-у (см. github.com/piranha/pump).
Забег
Основные два дня соревнования были, в общем, обычными программистскими буднями. За тем лишь исключением, что мы уложили в них недельный объем работы как минимум, получили кучу острых ощущений, почуствовали себя живыми, попробовали кучу нового и необычного. Например, спрайты и фон в нашей игре сделаны из обработанных наших же фотографий. Звуки, хоть их почти не слышно, но тоже :)
Мы использовали clojure + clojurescript, dommy на клиенте, обычный стек (compojure, ring, http-kit) на сервере. Клиент-серверная логика присутствует только в lobby, основной код работает на клиенте.
Статистика:
ClojureScript 8 files, 729 loc Clojure 2 files, 116 loc
Немного, но, напомню, это работающий файтинг на двух игроков, с тремя персонажами, коллизиями, редактором спрайтов, лобби, взаимодейстивем с twitter api и системой частиц.
И Clojure, и ClojureScript прекрасно себя показали как инструменты. Код очень быстро писать, он очень компактный, прямолинейный и без лишних абстракций. Всегда есть возможность спуститься в interop с платформой, то есть дергать какие-то нативные функции Java/JavaScript-а.
Для любителей конкретных цифт — очень пришлось в тему недавний прорыв в скорости инкрементальной компиляции, весь на cljs проект пересобирался за 0,2 секунды. Сгенерированный продакшн js-файл занимает 46кб, что, я считаю, победа и более чем разумная плата за такую богатую платформу, как Clojure, в браузере.
Ошибки
Очень не хватало 48-часового профессионального дизайнера. Я совмещал, мне очень сильно помогла жена, но в итоге пострадала и программерская часть, и в дизайне мы сделали далеко не все. Кое-чем я доволен, но почти все остальное требует если даже не скилла, то тупо больше времени на проработку.
Распланировать проект заранее тоже было бы очень кстати. Это позволило бы нам выделить отдельные части (редактор спрайтов, twitter api возможно), с которыми можно прийти на соревнование готовыми.
Победы
Мы усиленно сдерживали настрой попробовать все вкусное, что появилось в Clojure в последнее время (datomic, core.async, frp), в пользу того, чтобы сосредоточиться на выполнении задачи. ClojureScript был и без того достаточно новым для нас, и чтобы не множить риски, тащить все подряд мы не стали. Фан мы получили в любом случае, а вот лишнего времени на затупы с новыми незнакомыми вещами не просадили.
Результаты
Из 93 заявок к финишу хоть как-то дошли 35. Среди них 6 todo листов, 11 игр и 18 других приложений. Полный список есть здесь.
У нас получился файтинг между двумя произвольными твиттер-персонажами. Кого хочешь, того и ставь. Выглядит примерно так:
Вот тут автор книги The Joy of Clojure дерется со своим соавтором и пишет об этом в твиттер:
А вот один из рабочих моментов:
Поиграть можно тут: kick.clojurecup.com (не судите строго за качество, мы сейчас ничего фиксить не можем по правилам конкурса).
Работает только в Chrome (увы, как понимаете, не до QA было, счет шел на минуты), кнопки нигде не подписаны, чтобы создать ощущение старых sega игрушек — «ух ты, а как ты это делаешь, какую кнопку нажимаешь?»
Проголосовать за нас, честно и бескорыстно, можно и нужно вот тут: clojurecup.com/app.html?app=kick.
Спасибо моим коллегам за прекрасно проведенное время! Это ystrot, Александр Поплавский и Юля Прокопова.
Если будет возможность — я хакатоны всячески рекомендую.
Автор: tonsky