Несколько недель назад, блуждая на просторах интернета, я наткнулся на анонс курса “Продвинутая разработка микросервисов на Go” от экспертов Озон. Исходя из описания данный курс рассчитан для разработчиков уровня middle и выше (но возможны исключения) с опытом разработки от 2 лет. Учитывая свой позитивный в техническом плане опыт общения с данной компанией, я решил поучаствовать в отборе(люблю разминать свой мозг таким образом), а может быть заодно и прокачать свои знания в Go. Что из этого вышло читай ниже.

В ожидании соревнования (режим ждуна On)

После регистрации на сайте я получил письмо о том, что моя заявка принята и о том, что за неделю до даты соревнования я получу ссылку на пробное этап на платформе All Cups, где и будет проходить сам отбор на курс. В качестве обратной связи(для вопросов/ответов) было предложено использовать Telegram-канал. Помимо этого я нашел болталку(которая исчезла за пару дней до отбора), где прошлые/будущие участники делились опытом/планами и т.д. Проанализировав все ресурсы, я прикинул, что предстоит весьма конкурентное соревнование из-за большого количества желающих, но это лишь подогрело мой соревновательный дух. Коротко говоря, было видно, что Озон потратил очень много сил и ресурсов для организации этого мероприятия, которое должно было пройти на высоком уровне…

Пробное соревнование (песочница) или БДСМ для пользователя leetcode

Как и было обещано, за неделю до основного тура я получил ссылку на пробный этап на платформе All Cups. Зайдя на него сразу же оценил приятный интерфейс, на этом, лично для меня, плюсы закончились. Перейдя на задачи, я понял, что они представляют собой типичные алгоритмические задачи, замаскированные под реальные бизнесовые кейсы(к примеру скрытая комбинаторика под предлогом вечно забывающего ПИН-код Афанасия). Справедливости ради, отмечу, что данный прием давно широко применяется Яндексом, однако, мне, как человеку с техническим бэкграундом, хотелось бы видеть более формальное описание задач. Тем более у составителей таких задач далеко не всегда получается корректно и доходчиво сформулировать требования или условия. В соревновательной среде неоднозначность условия может сыграть решающую роль. Тем не менее, если данное замечание можно считать делом вкуса, то необходимость работы со стандартным потоком ввода/вывода на платформе для решения задач вызывает лишь недоумение… К тому же код необходимо писать не в онлайн редакторе, а загружать файл, формат которого также нужно знать. После загрузки файла,  я(+было много жалоб в болталке) заметил, что время выполнения и тестирования кода занимает не меньше 15-20 минут и если какие-то тесты не были успешными, то не всегда вы получите адекватный лог ошибки (возможно, зависит от теста). 

Одним словом, выбор данной платформы вызвал у меня недоумение, однако, абсолютно правильным решением было познакомить конкурсантов с данным “поделием”, дабы не шокировать в день соревнования. Прорешав все задачи тренировочного раунда, я даже немного привык к странным для меня подходам этой платформы.

Час X, он же Отборочный Раунд - момент когда сломалось абсолютно все

Перед описанием всего “Армагеддона” важно озвучить правила турнира:

  1. Предполагалось 2 раунда, 1 - отборочный, по результатам которого можно было получить доступ ко 2 основному раунду.

  2. Время проведения 1 раунда: 12:00-13:00; второго - 14:00-18:00.

  3. В каждом раунде представлены задачи на алгоритмы (можно использовать практически любой удобный для вас ЯП), задача на написание bash-cкрипта, задача на SQL.

Опираясь на данные правила я провел серьезную подготовку: выгнал почти все живое из дома(благо выходной день позволял), а то что не смог - временно деактивировал. 

Приближалось время старта… Далее часть событий будет описана с временными метками.

12.00 Захожу на страницу первого соревнования и получаю 502 ошибку.

12.04 Продолжаю обновлять страницу, попутно пишу в саппорт канал в Телеграмме.

12.05-12.30 С переменным успехом открываются условия задач. Чтобы не терять в будущем времени, делаю на всякий случай скрины условий задач. Попутно пытаюсь скачать файл .sqllite необходимый для решения задачи по sql, скачивается только с 3 попытки(возможно из-за немаленького размера в 1Мб). 

Понимаю, что часть времени потрачено впустую, поэтому решаю начать с более сложных задач, дающих наибольшее количество баллов. Одна из них - написание sql-скрипта с использованием агрегирующих функций и группировки. С помощью онлайн редактора на другой платформе разворачиваю бд и пишу скрипт. Пока платформа работает не стабильно(местами не работает совсем) - ничего не загружаю. Перехожу к следующей задаче на написание bash-скрипта, которая равноценна SQL-задаче. Решается очень просто в одну-две строки (если не знаешь, то гугл практически сразу помогает), ловлю первый диссонанс.

12.30 Отписывается поддержка. Говорит о том, что время отборочного раунда будет продлено пропорционально потраченному. Проверяю работоспособность платформы - работает. Загружаю свой sql-скрипт, на котором валятся практически все тесты с неведомой ошибкой. 

“Wrong number of elements in the line 6 - 3. Expected 2”. Ничего не понимаю…

12.30-12.40 Проверяю условие задачи, свое решение, формат вывода данных. В конце концов понимаю, что отсортировал по убыванию, вместо возрастания, но как-то ошибка компилятора не выглядит коррелирующий с ошибкой скрипта. На всякий случай загружаю скрипт с исправленной сортировкой, все тесты проходят… Также гружу bash-скрипт, все тесты проходят (2 самых дорогих задачи решены, не все потеряно).

12.40-12.55 Решаю задачу на удобном мне ЯП. Очень много времени трачу на разбор условия(типичная проблема со слишком замудренным описанием “бизнес-части” и туманным описанием математических требований). Решаю с использованием рекурсии, попутно не понимая как данная задача может быть дешевле двухстрочного bash-скрипта. Пока тесты идут, в спешном режиме переключаюсь на самую “дешевую” задачу.

12.55-13.00 Пытаюсь решить оставшуюся задачу, попутно проверяя статус тестов. Тесты проходят успешно. Оставшаяся задача все еще не решена, но есть надежда на доп.время, обещанное поддержкой.

13.00 Снова вижу 502 ошибку. Через некоторое время, страницы начинают загружаться и я вижу, что отборочный этап окончен и условия задач скрыты. Анализирую кол-во набранных баллов - 80/90, полагаю, что в сложившихся условиях этого будет достаточно для прохождения на следующий этап. Довольный собой иду за ковшом кофе…

X?^@)?

14.00 Обновив страницу contest, ожидая допуска в основной раунд, вижу сообщение о том, что отборочный раунд будет открыт в 14.30. То есть гипотетически, если участник(как я) заскринил условия задач, то он имел возможность их решить в спокойном темпе и потом, в условных 30 продленных минут, отправить решения. Победив возмущение, решаю вернуться к почти нетронутой задаче (скрины то имеются). 

14.30 Отправляю решение (как позже выяснится) не совсем корректное и пока проходят тесты, замечаю, что открыт доступ к основному этапу, также замечаю что он доступен до 23.59 (WTF???). Начинаю изучать задачи из основного раунда.

14.47 На почту приходит письмо с объяснением. Оказывается, что организаторы турнира решили открыть основной раунд для всех до 23.59. Решение о зачислении должно приниматься на основании 2 раундов…

14.47 - 15.00 Нахожусь в экзистенциальном кризисе.

15.00 - 16.20 Борюсь с 2 задачами на написание sql-скриптов. Снова встречаю странные формулировки вида “'В первой колонке должны быть Id трека, отсортированные в порядке возрастания, а во второй колонке - количество проданных копий трека, отсортированных в порядке убывания” (понимаю, что нужно отсортировать результат по кол-ву проданных копий, и если кол-во равно то уже применить сортировку по trackId, однако, может показаться, что порядок указанный в условии сначала требует сортировку по trackId, а затем по кол-ву (что бессмысленно, так как trackId уникальны). Не отправляю свое решение на проверку слишком много раз, так как количество попыток ограничено до 5 в SQL и до 30 в алгоритмических задачах. Кстати, данную задачу я так и не смог победить(проходила ровно половина тестов).

16.20-16.30 Пишу 2-строчный bash-скрипт, который в этом раунде дает немалое количество очков.

16.30-17.30 Решаю алгоритмическую задачу. Не проходит часть тестов: по тексту ошибки понимаю, что на вход подается число выходящее за границу условия задачи. Пишу в поддержку.

17.43 Поддержка присылает корректное граничное условие (однако не пишет напрямую, что в условие допущена ошибка и не благодарит за внимательность).

17.43-18.00 Добиваю данную задачу. После отправки решения, замечаю что условие поправили и кол-во отправки решений для каждой задачи выросло с 5 или 30 до 100… 

18.00 Все временно устраненные и деактивированные предметы начинают возвращаться и требовать внимания.

18.00-18.45 Сражаюсь с оставшейся алгоритмической задачей, отправляю решение(не все тесты проходят). Принимаю волевое решение закончить с данным турниром(хотя соревновательный дух был потерян в момент расширения организаторами временных рамок, однако я стал заложников эффекта “ждущего автобус”).

23.58 Во время написания данной статьи захожу проверить “как там”. В момент окончания турнира(23.59) снова вижу 502 ошибку, наверное это фича…

Выводы

То, что было хорошо

  • Развитое комьюнити для желающих попасть на курсы.

  • Возможность познакомиться на практике со специфической платформой(All Cups) за неделю до соревнования.

  • Проведение live-сессии с деканами направлений за несколько дней перед турниром.

  • Во время турнира поддержка в телеграмме старалась как могла.

Что можно сделать лучше

  • Не использовать сторонние мало протестированные платформы для проведения весьма нагруженного мероприятия. Согласно описанию курса, одна из его целей -  научиться создавать распределенные высоконагруженные системы, хороший пример такой системы - платформа для турниров.

  • В тестах на задачи предоставлять более говорящие ошибки.

  • Внимательнее проверять условия задач. Также было бы неплохо оценивать уровень доступности изложения условий у фокус-группы отличной от составителей условия. 

  • Продумывать заранее план B. На мой взгляд, решение допустить всех на 2 раунд и продлить время  раундов на 6 часов не выглядит справедливым для участников, которые планировали свое время и рассчитывали на соревнование с жесткими временными рамками. Однако, если цель данного отбора - найти сотрудников вечно работающих в firefighting-режиме, способных отодвинуть все запланированное на задний план, то да, данное решение - вполне работающий план. Также не выглядит справедливым в финальном решении учитывать баллы из 2-х раундов (хотя может быть придуман какой-то понижающий коэффициент для  задач из первого раунда). Я понимаю, что команда Озон всячески пыталась решить проблему, но в данном случае решение не выглядит справедливым (оглядываясь назад, мне кажется что правильнее было бы вовсе перенести турнир на следующие выходные, но опять же я не знаю чего это бы стоило компании).

  • В конце турнира требуется заполнить анкету. В ней есть требование предоставить ссылку на резюме, хотя это весьма неудобно людям, не хранящим его в открытом доступе. Поэтому нужно предусмотреть альтернативные методы загрузки.  

  • Перестаньте переоценивать Bash скрипты!!! Серьезно. Давать за 2-х строчный баш скрипт больше, чем за полноценную алгоритмическую задачу - это уже слишком.

TL;DR

         В завершении ко всему вышеописанному хочется отметить то, что команда Ozon tech вносит свой вклад в обучение и развитие разработчиков, предоставляя различные курсы(Mobile, Frontend, C#). Однако, на мой взгляд, отборочный этап на этот курс можно считать провальным. Виноват ли в этом Озон? Хотя All Cups, насколько мне известно, не является разработкой Озона, ответственность перед участниками за проведение турнира лежит на Озоне. 

Также я понял, что наверное, уже слишком стар для подобных турниров и хакатонов, где условия меняются на ходу. Видимо, стоит поискать другие способы для проведения досуга…

Комментарии (5)


  1. C14H20N6O5S
    04.04.2022 10:34
    +7

    Сапожники без сапог, как говорится. Люди, у которых не получается отобрать специалистов чтобы сделать нормально работающую систему, предлагают организационные и технические решения для отбора специалистов. :-)


  1. k8shi
    04.04.2022 11:48

    выводы: Командой Озон были успешно внесены правки в прод (участники соревнования, думали что выполняют задания для поступления на курс )


    1. alexdesyatnik
      04.04.2022 23:42
      +2

      Да нет, там были типичные олимпиадные задачки, бесконечно далёкие от реальной разработки.


  1. AnastasiaGutor
    05.04.2022 14:26

    Спасибо за развернутый отзыв. Нам важно получать обратную связь от пользователей платформы ИТ-чемпионатов All Cups – какой бы она ни была.
     
    В этот раз мы действительно не справились с огромным потоком участников. Ответственность за все сбои во время соревнования полностью лежит на команде All Cups.
     
    Обещаем, что мы учтем все пожелания и комментарии и в будущем мероприятия на нашей платформе будут проходить без сбоев.


    1. arkashaErema Автор
      05.04.2022 16:42
      +2

      Добрый день. Я согласен, с тем что All Cups не выполнил свои обязательства перед Ozon, не выдержав нагрузки. Однако, решения о проведении контеста любой ценой и со странными правилами, как мне кажется, принимал не All Cups: я искренне уверен в том, что более честным решением было бы вовсе отменить проведения турнира в тот день, нежели проводить его со странными не озвученными ранее правилами (понимаю что Озон понес бы репутационные потери, однако, в любом случае, потери и так были). К тому же совершенно не представляю как сейчас Озон сформирует списки зачисленных, поэтому проведение данного контеста любой ценой выглядит для меня тем самым "выстрелом в ногу"
      Также в статье затронуты проблемы, которые, как мне кажется, не связаны с All Cups:

      • неочевидных формулировок задач

      • ошибок в условиях задач

      • странных ошибок в тестах на задачи

      • бального ранжирования задач (переоцененность задач на Bash)

      • анкеты, заполняемой в конце состязания (ссылка на резюме, которого может не быть в открытом доступе, возраст...)

      В любом случае, надеюсь, что обе компании получили бесценный опыт и сделали очень важные для себя выводы.

      Ozon Tech Также для ребят, прошедших на курс, думаю будет интересным и полезным разбор постмортема о случившемся на All Cups (хотя, думаю, всем участникам турнира это было бы интересно).