Технологии в Контуре
6.71K subscribers
1.36K photos
121 videos
4 files
742 links
Канал tech-команды Контура о технологиях, инженерном опыте и мероприятиях.

Наш сайт: tech.kontur.ru
Гитхаб: https://github.com/skbkontur
Хабр: habr.com/ru/company/skbkontur
Youtube: youtube.com/@KonturTech

По всем вопросам пишите в сообщения канала.
Download Telegram
Немного триллера, как и положено в заметках об ICFPC. Организаторы опубликовали результаты первого (https://goo.gl/MmnzxY) и второго раунда полного, 72-часового соревнования. В первом раунде участвовало 120 команд, которые играли четвёрками на небольших картах. Мы посмотрели на результаты и расстроились: наш бот набрал всего 70 очков. При этом лучшая команда набрала 122 очка, а медиана — 81,5 очков. Это значит, что наша команда вылетела из соревнования.

Это был «удивительно плохой результат» на фоне 1 и 2 места после 24-часового соревнования. Поэтому мы пошли смотреть записи игр и разбираться, где накосячили.

Сначала выяснили, что наш бот плохо играет в ситуации, когда ему активно противостоят на картах с низкой связностью. Например, в одной игре (https://goo.gl/XF8uBh) красная команда блокировала каждый наш ход — в итоге сама заняла последнее место, а нас утащила на третье, не позволив заработать зачётных очков. Мы обсуждали, что такое поведение противников возможно, и осознанно не учили бота противостоять ей. Такая стратегия может работать только на небольших картах, где низкая связность и мало противников. На средних и больших картах, где много «обходных путей» в графе и больше 4 команд, повредить нашему боту этой стратегией почти невозможно. Много очков мы на этом не потеряли, поэтому продолжили поиски.

Выяснили, что наш бот теряет много очков на конкретной карте — «треугольнике». Это экстремальный пример маленькой карты: всего три «шахты» и очень низкая связность. Если не оставить за собой подходы к шахтам в самом начале, следующими ходами их займут другие команды. Есть игры, где это хорошо видно (https://goo.gl/Nw7pHW). Мы обсуждали отдельную стратегию для таких карт: сделать полный перебор позиций и использовать критерий минимакса. Осознанно не стали этого делать, чтобы не усложнять бота. Были готовы потерять немного очков, чтобы «дождаться» средних и больших карт, где минимакс уже бесполезен.

Эти находки объясняли, почему мы потеряли около 10 очков. Куда делись ещё 50? И тут мы увидели СТРАШНОЕ. В куче игр (например, https://goo.gl/NxW8fD) наш бот делал несколько ходов и начинал неистово пасовать. Поэтому занимал последнее место и получал ноль очков. Страшно было то, что наш бот не умел и не мог пасовать. Мы не программировали такого поведения.

Это означало одно — у нас баг. Довольно быстро выяснили, что бот пасует только на картах, где можно делать особые ходы — options. Их разрешили в середине соревнования, поэтому бот из 24-часового зачёта ничего о них не знал. Мы добавили поддержку options в последнюю ночь перед окончанием ICFPC и всё утро дебажили. Наш инструмент для сравнения стратегий показывал, что стратегии с использованием options получаются эффективнее. Мы даже посчитали, какую долю от разрешённых options-ходов нужно делать (примерно половину), чтобы стратегия получала наибольший прирост эффективности (см. последнюю колонку):
Догадались, что наш бот пасует тогда, когда хочет сделать options-ход. Пошли читать исходники и нашли дурацкий баг в Data Transfer Object для сделанного хода. Вот как он фиксится:
Когда бот делает options-ход, мы теряем информацию об этом в самый последний момент — перед сериализацией и передачей организаторам. Мы написали класс GameplayOut в первые часы соревнования и по необъяснимой причине не поменяли в конце, когда добавили поддержку options. А между собой и в онлайне во время соревнования наши боты играли без сериализации ходов, поэтому этот баг не проявлялся. (Splurge-ходы мы тоже теряем, но наша стратегия не использует их.)

«Ну, в общем, факап. Тестов-то не написали на протокол. Это в первый раз такое. Раньше протокол всегда качественно тестировали». Так закончился разбор бага в нашем чатике.

Самое обидное, что мы вылетели из соревнования не из-за слабой стратегии, а из-за ошибки во вспомогательном коде. А узнать, насколько наша стратегия хороша в 72-часовом зачёте, мы всё равно хотим. Не зря ж в 24-часовом так высоко поднялись. Поэтому мы написали организаторам: попросили взять нашего бота с фиксом и позволить ему участвовать вне зачёта. Оказалось, что мы не одни накосячили по мелочи — организаторы пообещали (https://goo.gl/9gX1CA), что устроят дополнительный неофициальный раунд. В нём боты с фиксами сразятся с победителями 72-часового зачёта и между собой. Результаты будут после конференции ICFP, то есть после 9 сентября. Спасибо организаторам за это.

А мы грустим, но продолжаем следить за результатами. К сожалению, WILD BASHKORT MAGES тоже вылетели в первом раунде 72-часового зачёта. Будем болеть за AIM Tech, они держатся молодцом :)
Сегодня — впервые не о прошлом или настоящем, а о будущем.

13 сентября мы едем в Пермь на митап Perm Tech Talks. Будет пять докладов о промышленной разработке от инженеров из Контура, рассказ о пермском IT-сообществе от Ильи Шлыкова из Xsolla и свободный микрофон. Ждём Ивана Лобанова из GDG Perm.

Темы и тезисы докладов — на TimePad (https://goo.gl/quz1J5). Почему-то там сразу два доклада про кодогенерацию.

Вряд ли среди читателей этого канала много разработчиков из Перми. Но теорема о диаметре графа знакомств не подведёт, я уверен :)
Ведущие подкаста DevZen (http://devzen.ru) пригласили нас рассказать об участии в ICFPC. Начнём записывать выпуск 0157 завтра, в субботу в 22:30 (МСК).

Иван Дашкевич и Павел Егоров будут беседовать с ведущими в прямом эфире, а Игорь Луканин будет общаться со слушателями в Gitter-чате подкаста (https://gitter.im/DevZenRu/live).

В DevZen общаются с гостями в первой половине выпуска, а во второй обсуждают темы слушателей. Если будете слушать, то предлагайте свои темы (http://devzen.ru/themes-0157/), чтобы выпуск получился интереснее.
Через 5 минут будем рассказывать про участие в ICFPC в прямом эфире подкаста DevZen. Слушайте нас тут: http://devzen.ru/live/
Ваня Дашкевич, Паша Егоров и бинарный кот в студии:
3, 2, 1... Поехали!
Сейчас вся жизнь, кроме прямого эфира, происходит в Gitter-чате подкаста: https://gitter.im/DevZenRu/live
Вчера ведущие подкаста DevZen опубликовали две записи с нашим участием. Сначала Паша Егоров и Иван Дашкевич примерно час рассказывали об участии в ICFPC в основном эпизоде подкаста (http://devzen.ru/episode-0157/), а Игорь Луканин развлекал читателей Gitter-чата ответами на вопросы, ссылками и фотографиями (https://goo.gl/XTTUSi).

После окончания эпизода Игорь заменил Ивана у микрофона, и мы ещё час общались с ведущими в послешоу (http://devzen.ru/episode-0157a/). Поговорили о любви и ненависти разработчиков к платформам .NET и JVM. Обсудили, насколько полезны подкасты на технические темы и что вредит таким подкастам. Рассказали о жизни разработчиков в Контуре и поделились парой лайфхаков.

Пишут, что послешоу получилось даже интереснее основного выпуска, а мы — «энерджайзеры». А вот звук у нас был не очень качественный, простите. Мы не настоящие подкастеры, но скоро научимся.
Вчера вечером наконец стали известны победители ICFPC 2017. В 24-часовом зачёте лучшей стала команда The $ound of .\, а язык OCaml назвали «весьма подходящим для быстрого прототипирования». В 72-часовом зачёте победила команда Frictionless Bananas, а язык C++ назвали «прекрасным инструментом для различных применений». Забавно, что команда-победитель состоит из одного участника — Джереми Совики (http://sawicki.us/icfp/).

Наша команда kontur.ru заняла третье место в 24-часовом зачёте. Команда AIM Tech (привет, @y2rrr!), за которую мы обещали болеть, заняла 8 место в 24-часовом и 14 место в 72-часовом.
В твиттере почти случайно нашлась фотография с доклада на ICFP о победителях контеста. А видеозапись доклада организаторы потеряли, что прекрасно дополняет их светлый образ :) Поэтому Алексей бесконечно прав: https://twitter.com/asafrnv/status/905318461601189891. Однако неидеальная организация — неотъемлемая, но вполне терпимая часть ICFPC. Не за это мы его любим. А в следующем году точно будет лучше :)