С 3 по 5 мая в офисе одесской компании Provectus IT прошел международный Haskell-хакатон — OdHac. Событие уникальное для наших краев — впервые Haskell-хакатон такого уровня проводится в Восточной Европе.
История Haskell-хакатонов
Первый Haskell-хакатонсостоялся в 2006 году в Портленде (США). Его целью было привлечь новых разработчиков к работе над главным компилятором Haskell, GHC. GHC — большой и сложный проект, и, несмотря на детально комментированный код, новичку может быть сложно в нем разобраться. Поэтому Simon Marlow и Simon Peyton Jones, главные разработчики GHC, провели экскурсию по внутренностям GHCдля участников хакатона.
Идея всем понравилась, и с тех пор хаскельные хакатоны проводятся регулярно — в среднем по
OdHac
Нет какой-либо организации или группы людей, которые отвечают за организацию хакатонов. Хакатон состоится, если есть кому заняться организацией, и есть те, кто хотят на него приехать.
В этом году мне захотелось организовать хакатон в Одессе. Причин было несколько. Во-первых, я хотел показать западным коллегам свой родной город. Во-вторых, хотелось познакомить местную тусовку с западной, показать нашим ребятам драйв хакатона. Ну и наконец, просто интересно было попробовать себя в роли организатора.
В итоге, на хакатон приехало 27 человек из Украины, России, Англии, Швейцарии, Голландии, Венгрии и Бельгии.
Формат
Хакатоны в Украине были популяризированы командой ДОУ под именем ДОУ хакатонов. Интересно сравнить форматы ДОУ- и Haskell-хакатонов.
Haskell-хакатон длится не два дня, а три. Это связано с тем, что участники преодолевают большие расстояния чтобы попасть на мероприятие, и хотят получить больше отдачи за потраченное время и деньги. Многие остаются еще на один день до или после хакатона, чтобы познакомиться с городом, в котором он проходит.
Мы не пытаемся работать ночью. На OdHac мы начинали работать около девяти утра, и заканчивали в пол-восьмого вечера. После «рабочего дня» мы шли в один из одесских пабов, чтобы ближе познакомиться, обсудить проекты и планы на следующий день. Социализация — важный элемент хакатона, и она лучше происходит за бокалом пива, чем за компьютерами. Ближе к полуночи мы расходились по отелям и домам, чтобы на следующий день приступить к работе с новыми силами.
Проекты, над которыми работают на Haskell-хакатоне, отличаются не только языком программирования, но и целью. На ДОУ хакатонах основная масса проектов — это продукты, веб-приложения. На Haskell-хакатонах мы стараемся работать над open source библиотеками и инструментами для Haskell. Не всегда это — «клевые» штуки, которые можно продемонстрировать в красивых демках. Это может быть долгожданный рефакторинг кода, фикс багов, написание документации. Одним словом, задачи, которыми сложно заставить себя заниматься в свободное время. Но на хакатоне все меняется — есть время, есть цели, и, самое главное, есть очень сильная поддержка коллег.
Наконец, на Haskell-хакатонах нет соревновательного элемента. Нет голосования и призов. Нет даже переживания, что кто-то не успел закончить начатое на хакатоне — главное получить заряд энергии, импульс, который позволит продолжать работать над проектом и после хакатона.
Проекты
Hakyll
Hakyll — популярный среди хаскелистов генератор статических сайтов. Hakyll в основном используется для блогов и персональных страниц, хотя подходит и для более сложных статических сайтов.
Идея Hakyll в том, что сайт описывается на Haskell. Hakyll предоставляет комбинаторы (т.е. функции высших порядков), которые превращают Haskell в DSL для описания сайтов.
На хакатон приехал Jasper Van der Jeugt — автор и главный разработчик Hakyll, который и возглавил команду Hakyll-хакеров на OdHac.
Иван Веселов реализовал поддержку teasers — коротких отрывков постов, которые показываются на главной странице блога и ведут к полным текстам постов. По ходу дела он также добавил в шаблонизатор Hakyll поддержку условных операторов.
Антон Дубовик реализовал pagination — разбивку контента на страницы.
Павел Поух работал над автоматическим обновлением контента в браузере с использованием WebSockets.
Ребята также исправили несколько багов в Hakyll, связанных с производительностью, разрешением зависимостей и работой под Mac OS X.
Jasper написал о работе над Hakyll на OdHac в своем блоге.
Fay
Сегодня доступно большое число языков, компилирующихся в JavaScript. Это и новые языки (CoffeeScript, TypeScript, Dart), и JavaScript-бекенды для существующих языков (ClojureScript, Opal, pyjs).
Haskell не отстает от тренда. Уже несколько лет существуют JavaScript-бекенды для компиляторов UHC и GHC. Но они используют JavaScript как ассемблер, в следствие чего сгенерированный JavaScript-код трудночитаем и объемен.
Fay — это более «интеллектуальный» компилятор Haskell в JavaScript. Он старается по возможности транслировать Haskell в похожий по смыслу, идиоматичный JavaScript.
Команду Fay на OdHac возглавил Adam Bergmark, один из главных разработчиков и текущий мейнтейнер Fay.
Наибольшей популярностью пользовались проекты по созданию байндингов для Fay к существующим JavaScript-библиотекам. Так, Андрей Лелеченко занимался связыванием с Raphael.js, Макс Талдыкин — с Knockout.js, Алексей Леван — с Backbone.js.
Дмитрий Вьяль и Александр Лебедев экспериментировали с функциональным реактивным программированием (FRP) на Fay.
Сергей Бушняк начал работу по портированию Fay с собственного резолвера имен на haskell-names.
Cabal
Cabal — инструмент для сборки Haskell-пакетов и приложений. Это один из ключевых элементов инфраструктуры Haskell. К сожалению, количество человеко-часов, уделяемых Cabal, не соответствуют его важности для сообщества.
На хакатоне образовалась группа энтузиастов, желающих поработать над Cabal и сократить число открытых багов: Dominic Steinitz, Bram Schuur и Александр Манзюк.
Cabal-команда сделала прогресс по около 12 багам. Dominic детально задокументировал работу команды в своем блоге.
Bram также реализовал очень полезную фичу для тестирования Haskell-пакетов. Пакет может указать минимальную совместимую версию для каждой зависимости. Поскольку, как правило, пакеты компилируются с относительно свежими версиями зависимостей, нижние границы редко проверяются и, как следствие, устаревают. Bram добавил опцию сборки --lowest-dependencies
, которая пытается скомпилировать пакет с минимальными версиями всех зависимостей и таким образом протестировать актуальность ограничений на версии.
Halberd
Halberd — новый проект, начатый на OdHac. Его идея в том, чтобы автоматически импортировать необходимые модули, если текущий файл содержит неопределенные идентификаторы.
Например, если в программе встречается не определенное ранее имя try
, Halberd найдет его в модуле Control.Exception
и добавит в начало файла строчку
import Control.Exception
Со временем Halberd будет интегрирован в основные редакторы, используемые для Haskell, такие как vim и emacs.
Над Halberd на хакатоне работали Erik Hesselink и Simon Meier, используя библиотеку для разрешения имен haskell-names, написанную автором этой статьи.
Другие проекты
Martijn van Steenbergen и Sjoerd Visscher работали над json-grammar — комбинаторами для построения сериализаторов и десериализаторов в/из JSON. Главное отличие этой библиотеки от аналогов состоит в том, что у пользователя есть возможность описать свой собственный JSON-формат, но при этом парсер и принтер описываются одновременно, и автоматически будут совместимы друг с другом. Библиотека основана на частичных изоморфизмах и использует идеи из стекового (concatenative) программирования.
Sebastiaan Visser и Tom Lokhorst экспериментировали с представлением абстрактного синтаксического дерева (AST) Haskell, в надежде сделать Haskell-код более удобным для программного редактирования.
Владимир Кириллов разбирался с внутренностями GHC с целью добавить некоторые фичи из Erlang — такие, как сбор статистики (например, использование памяти) по потокам. В настоящее время такая статистика доступна только для процесса в целом.
Jasper Van der Jeugt помимо руководства командой Hakyll еще работал над своим дипломным проектом. В Haskell широко используется foldr/build fusion — оптимизация, которая позволяет превратить цепочку преобразований списков в одно преобразование, тем самым избегая создание промежуточных списков. На данный момент эта оптимизация применяется только лишь к преобразованиям, которые выражены через высокоуровневые комбинаторы, такие как map или filter. Идея Jasper’а состоит в том, чтобы делать эту оптимизацию для функций, написанных в рекурсивном стиле.
Заключение
Хакатон в Одессе был, вероятно, самым масштабным Haskell-мероприятием, которое когда-либо проводилось в Украине.
Мы очень благодарны компании Provectus IT, которая приютила хакатон в своем замечательном офисе.
Возможно, кто-то после прочтения этой статьи заинтересуется языком Haskell. Odessa Haskell User Groupпроводит встречи каждый месяц. В Киеве тоже проходят встречи функциональщиков, но менее регулярно (они обычно анонсируются в «Событиях» на ДОУ). Наконец, в конце месяца состоится конференция HotCode, где будет отдельный поток, посвященный функциональному программированию.