Зачем участвовать в ICFP Programming Contest?
Олимпиады по программированию, многим кажутся не интересными и нудными. Там надо решать алгоритмические задачи, да еще и очень быстро их решать. Зачастую выигрывает тот, кто знал алгоритм заранее и просто быстро его напечатал и адаптировал под входные данные, и нужный выходной формат.
Соревнование по программированию, где есть интересная задача и можно использовать многое из твоего профессионального багажа, мне нравятся намного больше. Одно из таких соревнований – ICFP Programming Contest. Здесь есть и алгоритмы, и команда, и сроки не сильно сжаты.
Что такое ICFP?
Международная Конференция по Функциональному Программированию (ICFP – International Conference on Functional Programming) – ежегодная академическая конференция в сфере компьютерных наук. В центре события находится функциональное программирование и смежные области – языки программирования, логика, компиляторы и общие вопросы разработки ПО. Особый интерес вызывает соревнование по программированию, которое проводится, начиная с 1998 года, как мероприятие, приуроченное к конференции.
Тип этого соревнование не похож на то, c чем доводилось сталкиваться: городские олимпиады, облаcтные олимпиады, ACM олимпиады, KPI Open или Google Code Jam. Основное отличие заключается в задаче, которая далеко ушла от простого алгоритма или обычной проблемы.
Интересная задача – это важно
В задачах, которые предлагаются на ICFP, обычно содержится целый букет проблем и целый букет технологий, с которыми вам придется столкнуться. Решать это дело можно как вам вздумается. Язык программирования вы можете выбирать тоже любой, главное чтобы не возникло проблем с запуском вашего решения на тестовой машине.
Среди задач прошлых лет такие как: муравьи (2004), роботы и полицейские (2005), универсальная машина (2006), восстановление ДНК для друга пришельца (2007), возвращение марсохода на базу (2008).
Было дело
Команда Stanfy в 2008 году приняла участие в соревновании и помогала марсоходу вернуться на базу. При этом нельзя было падать в кратер и быть съеденным злостным марсианином.
Знали мы об этом ивенте заранее, поэтому заведомо планировали работу таким образом, чтобы можно было с головой уйти в задачу.
Мы разместились в одной из комнат и следующие три дня были погружены в эту задачу целиком и полностью. Нам пришлось создать инфраструктуру для работы над проектом, организовать автоматический запуск сервера для каждого члена команды, спроектировать архитектуру приложения, написать модуль управления марсоходом, реализовать несколько алгоритмов, визуализировать все происходящее с марсоходом, сгенерировать тестовые карты и, конечно же, сделать сборку нашего приложения в требуемом формате.
Один из наших алгоритмов в действии.
Наше решение было реализовано на Java, визуальное отображение поездки марсохода сделано на Flex, сборка проекта на Ant, а сервер для тестирования использовал Unix Shell скрипты и Java прокси.
Подробнее о том, что мы сделали, а также другие видеоролики и картинки можно посмотреть в отчете.
И в такие вот моменты ты можешь оценить себя. Насколько же ты воин? Насколько ты быстро способен сообразить, вспомнить или изучить все то новое, что необходимо для такой непростой задачи? Да еще и в условиях и программном окружении, которое ты не выбирал.
Чему можно научиться?
Этот експириенс помог мне понять, что базовые принципы работы над разработкой софта всегда остаются неизменными.
Командная работа
Слаженная работа группы людей над общей задачей – не простая задача. Но она необходима для работы над более или менее большими проектами.
Задача многогранная и сложная. В ней можно выделить несколько подсистем и поделить их между членами команды. А потом это надо еще и собрать. Или же сразу организовать проект таким образом, чтобы проблем со сборкой не вылезло потом, в конце. Когда, ой, как пора уже комитить результат, а что-то никак не хочет собираться.
Кроме деления на подсистемы, еще надо уметь подчиниться решению большинства и ставить общий результат выше своих личных достижений или удовлетворения, как минимум на некоторый промежуток времени. Это очень важно, когда кому-то приходится работать над “неинтересной” частью или разрабатывать “неинтересный” механизм. Надо понимать, что ты делаешь очень важную работу, которая приближает команду к цели.
Технологии
Чем больше технологий ты знаешь, тем больше у тебя шансов на успех.
В своей повседневной практике человек-программист обычно использует узкий спектр технологий. Но как на практике, так и в соревновании, случаются моменты, когда надо быстро решить задачу, которая находится вне твоих повседневных технологий. Здесь приходит на помощь опыт предыдущих задач или увлечений, благодаря которому все решается очень быстро. Если бы не он, пришлось бы возиться долго и нудно.
Структура проекта
Проект должен иметь понятную всем структуру и иметь единые средства сборки.
Все должны использовать одни и те же механизмы для сборки и запуска приложения. Это позволяет уменьшить эффект “магической машины”, когда написанное вами, работает только у вас на компьютере (Интеграционный сервер я не рассматриваю, так как в рамках этой задачи мы его не использовали по назначению).
Инфраструктура
Тестирование и тулзы для организации работы над проектом.
Ну, конечно же, минимальный джентльменский набор. Система контроля версий, баг трекер. Еще мы создавали общий механизм, для независимого тестирования написанных алгоритмов, что позволило нам сэкономить массу времени на цикле исправление-тест-исправление-тест.
Алгоритмы
Алгоритмы надо знать и постоянно делать гимнастику для мозгов.
Бизнес приложения и интернет-проекты бывают разные. Но алгоритмически сложными бывают единицы. Пытливый и натренированный ум, плохо себя чувствует в роли овоща. Также как и спортсмен, неважно себя чувствует в роли посиделки. Очень приятно ощущать себя уставшим от выворачивания мозгов, особенно когда давно этим уже не занимался. И минуло время дипломов и защит различных работ в университетах.
Вывод
Для чего это все? И стоит ли оно вашего времени?
Для студента
Я закончил КПИ и получил степень магистра компьютерных наук. И я точно знаю, что студентам негде научится всем тем вещам, которые необходимы для полноценной разработки ПО для реальных задач. Студентам практически не дают возможности работать командой над проектом. Им не рассказывают как должен быть организован проект, какие средства для этого можно использовать. Не учат использовать систему контроля версий, даже если лабораторная делается на Турбо Паскале. А сколько проблем, возникает с запуском лабораторных работ на компьютерах в аудитории?
Для работающего программиста
По работе, мне приходиться проводить собеседование программистов. Я столкнулся с тем, что не все умеют работать в команде. Кто-то не работал вообще, а кто-то работал по правилам, которые далеки от понятия командной работы. Некоторые практикующие программисты не уверены, зачем им нужна структура проекта и почему сборка проекта организована именно таким способом. Зачем надо тратить время, на настройку проекта на интеграционном сервере. Все это сильно зависит от того, в какой коллектив человек попал работать. Какие ценности и подходы в его компании ставятся на первое место. Какой начальник правит балом, и правит ли вообще.
И что же
Попробовать свои силы в мероприятии подобного рода, конечно же, стоит. Можно получить массу эмоций, драйва и научиться чему нибудь новому.
А для себя я решил – каждый год организовывать активистов нашей компании для участия в этом соревновании. Надо становиться лучше и постоянно развиваться. Такие ивенты именно для этого и созданы. Для того чтобы становиться лучше.






Kilew
в 23:03, 26.01.2009>> и сроки не сильно сжаты
Это, ты, Паша, так пошутил, да? )
3 дня 100% загрузки мозга ;))
Роман Мазур
в 20:53, 27.01.2009Надзвичайно цікаве та захоплююче змагання. Коли проходять ці 3 дні, жалкуєш, що вже все…
Сергей Tirael
в 14:01, 13.03.2009Я с удовольствием поучаствую.
На 3 дня или на неделю загрузить мозги на 200% – это круто!