Обновленный Codebattle: игра для программистов
Привет, Хабр!
Три недели назад мы (дружная команда образовательного проекта Хекслет) опубликовали пост про наш новый проект — игру для программистов Codebattle. Напомню, идея игры очень простая: вам и сопернику дается задача, вы решаете ее на выбранном вами языке. Вы видите код соперника в реальном времени, результаты запуска тестов и можете общаться с ним и зрителями в чате. Кто первый решит задачу (удовлетворит тестам) — тот победил.
После публикации статьи у нас был веселый день :) Легли под хабраэффектом и обнаружили несколько багов. Когда буря успокоилась, на арене снова закипела жизнь. В течение следующих двух недель мы решали три главные проблемы: производительность, борьба с читерством и возможность быстрого добавления новых языков. И решили их!
Встречайте — обновленный Codebattle! Вкратце:
- Хабраэффект нам по страшен (тьфу-тьфу-тьфу)
- Читерить больше не получится (нельзя подогнать решение под тесты)
- Добавлять языки стало проще (сейчас уже есть clojure, ruby, js, python, php, java, erlang)
Подробности под катом →
Почему лежали и как решили
Мы работали через поллинг, что генерировало тысячи запросов в минуту. Теперь все переписали через websockets. Еще нашелся баг в библиотеке nkdocker.
Читерство и языки
В предыдущей версии была такая система:
- Пишем задание и тесты на Clojure
- Транслируем на целевые языки нашей библиотекой multicode.
- Показываем сгенерированные тесты игроку
Естественно, нашлись люди, которые просто подгоняли код под тесты не решая саму задачу. К тому же, такая схема усложняла добавление новых языков.
В обновленной версии другая схема: мы просто работаем через стандартные потоки ввода/вывода stdin/stdout, и не привязываемся к конкретному языку. Теперь мы генерируем тесты при проверке и не показываем их игроку. Система стала намного проще: мы просто подаем в вашу программу сгенерированные данные и смотрим на stdout. Это же позволило упростить добавление новых языков, мы успели добавить Clojure, Java и Erlang.
Из мелочей: добавили кучку новых заданий, обновили описание во всех заданиях, обновили расширение для Хрома.
Как добавить новое задание
Хотите добавить новое задание в базу и прокачаться в Clojure? ;-) В нашем репозитории с задачами есть подробное README и наглядные примеры.
В нашем Слак-чате есть специальный канал #codebattle, где можно обсудить игры, проблемы и идеи.