Как мы выиграли соревнование для строителей и сварщиков
Есть такая международная организация WorldSkills. Она аж с 1947 года проводит соревнования между представителями разных профессий. Изначально предполагались сугубо рабочие специальности — станочники, строители, инженеры. Но список компетенций активно рос, и сейчас там уже все подряд: от айтишников до модельеров. Впрочем, как и следовало ожидать, русских в этой организации забанили с текущего года.
Росатом, где я работаю, по такой же методике проводит своё соревнование: AtomSkills. В этом году был уже седьмой раз. Как и у идейного вдохновителя, в AtomSkills всё начиналось с рабочих специальностей вроде сварщика и бетонщика, но впоследствии были добавлены компетенции других профилей.
Мероприятие закрытое, но не полностью. В основном участвуют предприятия Росатома и напрямую связанные с ним заводы, институты, производства. Но были и другие компании, которые занимаются масштабным строительством или научными исследованиями: РЖД, Ростех, СИБУР и т.д.
То есть, в основном концентрация вокруг дисциплин, близких к атомной отрасли, к науке или к промышленному строительству. Если вы сварщик в РЖД, то шансы попасть у вас были высокие. А если вы программист в Яндексе, то низкие, потому что сфера совершенно другая. Ещё прикольно, что участвовали, например, работники отдельных атомных станций, то есть не обязательно производство.
Начало
Мероприятие проходило в экспоцентре в Екатеринбурге. Думаю, по причине его близости к центру страны, потому что участники были из множества городов со всей России. Вся программа была рассчитана на 6 дней, не считая подготовки и застройки помещений: вступление, 3 рабочих дня, день проверки работ и день закрытия с награждением победителей.
Официально это была для нас рабочая командировка, поэтому работодатель оформил билеты, питание и проживание. Всё-таки в работе на огромную корпорацию есть немало плюсов :)
Команда
Четыре года назад в AtomSkills добавили компетенцию под названием «Программные решения для бизнеса». Это точный перевод английского названия аналогичной компетенции на WorldSkills — «Software Solutions for Business».
На деле компетенция посвящена энтерпрайз-разработке, об этом я скажу чуть ниже. Мы поехали втроём:
- Асатурян Степан — мой хороший друг и коллега, бэкенд-разработчик;
- Марголин Алексей — другой мой хороший друг и коллега, фронтенд-разработчик;
- И я, Пешехонов Денис — бэкенд-разработчик и капитан команды.
Как верно сказал мой начальник, здесь команда должна тремя людьми закрыть почти десяток айтишных компетенций. Поэтому на деле, например, Степан был не только программистом, но и автором документации, Алексей выполнял функцию дизайнера UI/UX, а я взял на себя менеджмент и DevOps. Ещё, конечно, все стали аналитиками, архитекторами и тестировщиками.
Первый день
Первый день на площадке для нас — участников — был посвящён знакомству с коллегами из других команд, экспертами и членами жюри, а также настройке рабочих мест. Но на самом деле перед этим организаторами была проделана колоссальная работа по застройке, установке, поднятию инфраструктуры. Мы приехали уже на готовенькое.
У каждого была одна рабочая станция с двумя мониторами, которую с помощью удалённого рабочего стола можно было подключать к одной из нескольких машин на разных операционных системах по выбору. Всё пространство создавалось в начале конкурса и стиралось после его завершения. Нужный софт участники ставили самостоятельно, работать на своих ноутбуках было запрещено.
Мы остановились на трёх средах под Windows для работы и двух средах под Debian для деплоя и тестирования. Рабочие места оказались удобными, простор окружающего зала ощущался очень приятно: с одной стороны ты не в закрытой каморке, с другой стороны никто не мешает и не отвлекает.
Мы заранее подготовили и принесли с собой так называемый Toolbox. Это официально включено в конкурс: у сварщиков тулбокс это маска, костюм, сварочные аппараты. У монтажников дрели и торцевые станки. А у программистов IDE, куски кода, шаблоны сервисов, файлы конфигураций. Напомню, что задание мы к этому моменту ещё не знали, поэтому просто брали всякое универсальное, например, конфиг для docker-compose, который сделали, когда готовились к состязанию.
Конечно, был интернет, и не было ограничений на использование библиотек. Но дополнительные очки давали за применение только OpenSource инструментов.
Кстати, с первых же минут мне пришлось поменять местами два монитора. Дело в том, что левый был подключён по VGA, и поэтому я мгновенно заметил нечёткость картинки и проблемы со сглаживанием шрифтов. К сожалению, у видеокарты не было двух HDMI-выходов, и, чтобы комфортно работать, пришлось переставить их местами. Иначе это бы меня постоянно отвлекало и напрягало глаза.
В общем, вроде ничего особо не делали, но потратили весь день на наладку. Сразу пришлось отказаться от пары подготовленных модулей, потому что их было слишком тяжело быстрым и простым способом задеплоить. Поначалу сомневались, но впоследствии выяснилось, что не зря.
Вечером была церемония открытия, но, честно говоря, народ был уставший, и на мой взгляд реагировал на происходящее вяло. Надо было, я думаю, открытие утром запускать, до работы.
Второй день
На обычных хакатонах дают сутки или двое, и в рамках этого времени нужно выполнить задание. Можно ходить спать, можно работать непрерывно. В основном спят люди очень мало, по 2-3 часа, если повезёт. Здесь же были 3 рабочих дня по 8 часов (с перерывами на обед и ужин). Причем, очень строго, шёл таймер. Если таймер останавливался, руки с клавиатур нужно было убрать.
Во второй день мы получили задание. В отличие от обычных хакатонов, здесь было похоже на работу энтерпрайз-программиста: описывалась подробная функциональность некоторого приложения, которое нужно сделать. Если на простых хакатонах говорят: «Сделайте что-нибудь, чтобы решить проблему длительного выполнения заявок», то здесь говорили: «Сделайте сервис по управлению заявками, который может вот это и вот это».
Да, нужно было написать CRM для некоторой вымышленной компании. В задании затрагивалось много направлений — работа с электронной почтой, с базой данных, с REST API, проектирование интерфейса, масштабируемость, деплой. Всё то, что должен хорошо уметь опытный современный энтерпрайз-разработчик.
Мы взяли свой обычный стек: C# на бэке и Vue на фронте. MongoDB в качестве хранилища (не потратив при этом лишний час на настройку схемы и миграций). Контейнеры, Docker и Docker Compose.
Можно было задавать вопросы экспертам, правда, не всё время, а только в некоторые периоды, но этого хватило.
Всего в номинации участвовало 9 команд, из них одна команда студентов НИЯУ МИФИ, а остальные — сотрудники различных дивизионов Росатома. От нашего Атомстройэкспорта было две команды.
Поехали
Запустили таймер, и мы взялись за работу. Поначалу задача казалась не слишком сложной. Но дьявол, как обычно, кроется в деталях. Функциональные требования к программе могли явно содержать какие-то мелочи, которые нужно было увидеть в задании и учесть. Но ещё и могли неявно содержать, что, впрочем, в итоге стало довольно спорным моментом, о чём я расскажу ниже.
Я сел за работу над почтой. Впервые в жизни подключался к IMAP-серверу, чтобы читать с него письма и менять им статус. Это была не слишком прозрачная работа с множеством подводных камней, но в итоге мы оказались одной из немногих команд, которые поддержали все нужные почтовые функции в полном объёме, за что получили много баллов.
Лёша набрасывал каркас интерфейса, Степан делал управление пользователями. Рабочее время летело очень быстро. Кажется, что 8 часов это прям много. Можно посмотреть почти целый сезон современного сериала (которые сейчас выпускают форматами по 8-10 серий в сезоне). Но вот ты накодил пару модулей, едва успел протестировать, и половины времени уже нет.
Еда
Каждый день обязательно нужно было уходить на обед. Ты мог не есть, если не хотел, но в течение часа не имел права работать. И иногда, если расписание смещалось, такой же перерыв делали вечером для ужина.
Кормила кейтеринговая компания прямо внутри экспоцентра, и, честно говоря, это моя самая большая претензия к мероприятию: порции очень маленькие. На фото не так заметно, но всего было с гулькин нос — столовая ложка салата, полторы ложки риса, булочка, маленькая котлета. Один раз мне накладывали ужин и даже выложили обратно чуть-чуть макарон, посчитав, что слишком много кладут.
Короче, если бы не чай/кофе с печеньками на площадке, помирать бы нам с голоду там. К счастью, этого добра, а также воды, было с запасом, за что организаторам спасибо.
Вечером мы пришли в отель и просто вырубились, не успев даже ничего обсудить. Хотя казалось, что идём хорошо, вроде успели немало.
Третий день
На третий день приехали рано, потому что автобус был подан раньше обычного (да, трансфер тоже за счёт организаторов, и это оказалось удобно, от отеля до экспо полчаса или 300-500 рублей на такси).
Пока наш таймер не запустили, я походил по площадке и порассматривал другие рабочие зоны. Три больших павильона по 10-15 компетенций в каждом.
Ходил с открытым ртом и кайфовал. Мне очень нравится, как рабочее место человека эволюционирует под его потребности, как создаётся специализированное оборудование, а люди учатся им владеть. Я люблю профессионализм, мне нравятся увлечённые люди с особыми навыками, меня восхищает ремесло, талант, какие-то способности, которых я сам лишён или которым никогда не обучался. А там было на что посмотреть.
Больше фоток можно глянуть в официальном сообществе AtomSkills ВКонтакте. Там снимали каждую компетенцию, есть очень необычные и интересные, которые я, к сожалению, своими глазами не увидел (например, радиационный контроль в скафандрах).
А у нас, тем временем, продолжалась работа. Всё шло не так быстро, как хотелось бы. В некоторых местах забуксовали, потратили больше времени, чем нужно было. Полностью был реализован только один большой модуль из трёх, второй только на подходе, за третий даже не брались.
Вечером в отеле поняли, что всё не так просто, как нам казалось, и завтра нужно выложиться по полной. Работать в перерывы между официальным временем, конечно, было нельзя. Но читать документацию или смотреть примеры реализаций каких-то вещей допускалось, так что мы чуть-чуть посидели, прикинули план действий и легли спать.
Последний рабочий день
На всех хакатонах качество кода выглядит примерно вот так:
Где по горизонтали текущее время. Чем ближе к дедлайну, тем больше появляется костылей, копипаста и каких-то очень поспешных решений. Это нормально, и хакатонный опыт позволял спокойно переживать подобные мысли.
Но мы не очень успевали. Например, по описанию задачи нужно было давать менеджеру компании аналитику по процессам разбора заявок в разных статусах, и мне почему-то показалось, что идеально в такой ситуации будет использовать диаграмму Ганта. Это было большой ошибкой: тяжёлый визуал не успели завести, а на какую-то альтернативу просто не хватило времени. В итоге два проверочных критерия мы не сделали вообще.
Ещё частью задания было написание документации. Потому что это не хакатон, а энтерпрайз-разработка. Тут нужна инструкция по деплою, по которой потом будут реально деплоить (если не сработает — ноль баллов за всё задание). Тут нужно руководство пользователя, которое реально будут читать и именно по нему что-то делать. А ещё презентация, техническая документация…
В итоге я уже делаю презентацию, а у нас ещё не готовы для неё скриншоты, потому что какая-то форма или нужный экран до сих пор не запущены.
К счастью, деплой мы продумали заранее очень подробно, и его подготовка не заняла много времени. Ещё к счастью нас было несколько, поэтому каждый мог доделывать что-то своё. Но часть сценариев осталась без надёжного тестирования, и мы могли только гадать, работают ли они без ошибок.
Закончилось тем, что я закинул последний файл в папку с результатами примерно за 5 секунд до остановки таймера. Реально как в голливудских фильмах про разминирование бомбы.
Презентация
Презентовать проект нужно было на следующий день. Готовиться можно было вечером и ночью в отеле. Я не взял с собой презентацию — слишком спешил и забыл об этом, она осталась на рабочем компе на площадке. Поэтому мне пришлось просто по памяти воспроизводить в уме слайды и читать как бы под них.
Здесь помог опыт: я очень много где выступал, научил себя не сбиваться с речи во время волнения (а волнуются все, даже опытные спикеры). А ещё оказалось важным внимательно читать задание (кто бы мог подумать). Например, в задании было прямым текстом упомянуто, что следует рассказать о том, какие решения в вашей программе помогут её вертикальному и горизонтальному масштабированию. Я сделал это аж двумя отдельными слайдами, а некоторые команды почему-то не сделали вовсе. Но за это давали дополнительные баллы.
Кстати, в хорошей презентации нет простыней текста. Там есть ключевые мысли, на основе которых вы рассказываете текст самостоятельно (не читаете с телефона или бумажки, а именно рассказываете). Слайд с текстом на весь экран редко будут читать, полезной презентационной нагрузки он не несёт.
У других команд тоже были интересные решения. По условиям не обязательно делать в вебе, поэтому одна из команд, например, представила десктопное приложение на Delphi. Просто потому, что на предприятии, где они работают, именно этот язык и используется.
Поясню для всех: Delphi это довольно старый язык. Его обновления выходят и сейчас, но из широкого употребления он фактически вышел по разным причинам. Однако на консервативных производствах, особенно где есть работа со станками или другим оборудованием, он ещё встречается. Обычно это происходит, когда руководство не осознаёт необходимость обновления стека, и в какой-то момент заканчивается плохо: например, лавинообразным ростом технического долга и невозможностью найти специалиста, способного поддерживать кодовую базу.
Но ребята молодцы, они держались очень хорошо и набрали в итоге не так уж и мало баллов, были около середины списка, если я правильно помню. И ещё они выиграли у себя довольно жёсткий отбор из шести команд, чтобы попасть на конкурс.
Местами были странные решения и заявления. О том, что народ не читал задание, я уже упомянул. Но было всякое: кто-то например сказал, что они используют Open Source в отличие от решений на C#, и в этом их преимущество. Хотя C# уже семь лет как Open Source. Сразу и преимущество пропадает и некоторая неосведомлённость о состоянии технологий всплывает.
Проверка
После презентаций жюри проверяли решения. И это вам не хакатон, где можно выиграть одной презентацией. У каждой команды:
- Деплоили решение согласно инструкции по деплою
- Настраивали согласно инструкции по администрированию
- Читали руководство пользователя
- Проверяли каждый из десятка сценариев: логин, создание заявки, уведомления о статусе на почту, фильтрация списка и так далее
Проверка была публичная, все команды могли видеть на мониторах, что происходит у жюри. Но нельзя было говорить что-то, подсказывать. Если в инструкции не сказано, то комиссия самостоятельно пыталась найти решение на основе здравого смысла и надписей в интерфейсе.
Это очень круто. Такая проверка исключала вечную проблему большинства хакатонов — победу хорошей презентации при плохом продукте. Но комиссия сидела, без шуток, до 3 часов ночи.
Мы успели съездить в отель поспать и вернуться. Перед нашей проверкой была встреча с президентом АСЭ Александром Марковичем Локшиным. Разрешали любому высказаться как угодно, что порадовало. Я про еду говорить не стал — постеснялся — но пару других предложений высказал.
Когда дошло до нашей проверки, нам сказали, что мы не прошли уже часть сценариев, например, не сделали редактирование заявки. Я нашёл в задании этот пункт и показал, что указанная формулировка исключает редактирование в том смысле, который имеется ввиду. Я хорошо запомнил этот пункт и мы умышленно сделали не так, как было бы привычно и ожидаемо, потому что были уверены, что это одна из тех мелочей, на которые при проверке будут обращать внимание. Но оказалось, что нужно было делать привычно и ожидаемо, а формулировка просто очень неаккуратная.
По результатам дискуссии члены жюри засчитали нам этот пункт, но снизили баллы за UX. Так что помимо очень внимательного чтения задания нужно ещё и не очень внимательно читать задание, как-то так :) Может быть такое, что вы читаете слишком внимательно, и это плохо.
Были и не слишком очевидные моменты. Например, в задании было указано, что работа над заявкой идёт только в рабочее время. Не просто в рабочие дни, а, дословно, в рабочее время.
Это значит, что, если заявка принята в понедельник в 17:00 (считаем стандартный рабочий день с 9 до 18), и её обработка занимает 10 часов, то отдать её могут только в среду. Мы это учли, но все остальные команды посчитали по рабочим дням (то есть такие заявки у них закрывались во вторник). И этот момент не проверяли — проверили действительно по дням. В итоге мы потратили время на то, что лично мне казалось обязательной мелочью, которую будут учитывать согласно формулировке задания, но оказалось иначе.
Или, например, можно было выгружать на фронт все записи и выполнять сортировку фронтом. В реальной жизни так не делают с данными, число которых может исчисляться сотнями и тысячами (а заявки точно могут). Мы сделали сортировку и фильтры на бэке, как положено, но на фронте тоже засчитывали, а сделать такую было бы существенно быстрее.
В общем, даже в очень детальном задании есть много неоднозначностей и субъективности.
Проверки закончились. Мы наблюдали за проверками некоторых команд, но не знали точных результатов. У двух команд решения вообще не запустились. Ещё у одной было сделано очень мало. Команда с приложением на Delphi хоть и выполнила сценарии, отстала по деплою, масштабированию и ещё паре параметров. В итоге по-настоящему серьёзная конкуренция была между четырьмя командами.
Финал
Результаты не знали даже члены жюри, и вот почему: когда-то полгода назад они составили критерии оценки, и каждому критерию назначили вес. Потом это было занесено в систему. А уже на конкурсе они просто про каждую команду записали в систему, прошла команда тот или иной сценарий или нет. В итоге алгоритм там что-то по весам внутри себя умножил, но конечные баллы не вывел специально, чтобы сохранить интригу.
С точки зрения эмоциональности это сработало: мы были на нервах до самого момента объявления.
По каждой компетенции награждали отдельно. Были индивидуальные компетенции — там на сцену выходили участники-победители, а также их эксперты (то есть менторы в данном случае). Это у нас было так, что эксперт выполнял задание, а в других номинациях нет. Тем не менее, экспертов-менторов тоже награждали за победу их участников, и это мне кажется очень правильным.
Дошли до «Программных решений для бизнеса». Объявляли с конца, сначала бронза — её взяли наши коллеги из параллельного проекта в АСЭ. Фактически одни из наших основных конкурентов — тоже очень опытные ребята с богатым бэкграундом в разработке.
Серебро досталось команде из «Русатом Инфраструктурные Решения» — это дивизион, ведущий, в числе прочего, цифровые и интеграционные разработки по нескольким направлениям.
Мы понимали, что, возможно, не вошли в тройку вообще — это было бы очень обидно. Но потом начали читать имена участников, взявших золото, и это оказались мы. На сцену уже бежали радостные.
В итоге разница по баллам оказалась совсем небольшая: 69.17 баллов у нас, около 66.78 у второго места и 65.33 у третьего. Девятое место 15 баллов. Кстати, одна из команд, у которой решение запустилось, набрала меньше баллов, чем другая команда, у которой не запустилось. Если результат не запускался, оценивали только презентацию и документацию. Так вот можно было только на презентации и документации получить больше, чем даже с готовым решением (в котором не проходятся нужные сценарии).
Резюме
По правилам, раз мы взяли золото, в следующем году участвовать нельзя. И хорошо. Мероприятие вышло довольно изматывающим, если не физически, то эмоционально точно. Но при этом нереально крутым. Мне очень понравилась атмосфера — она не такая, как на хакатонах, ощущения шире и богаче. Мне понравилась организация за исключением некоторых моментов. Все проблемы решались быстро, всё было хорошо и качественно подготовлено. Мне понравилось задание: оно всё ещё даёт развернуться собственной мысли и собственным навыкам, но не позволяет просто сломать систему и выиграть на софтскиллах (хотя они тоже были важны).
Не знаю, будем ли участвовать через два года. Или, например, пойдём в жюри? Это тоже было бы интересно, я до этого только на одном хакатоне в жюри был, небольшом совсем.
В общем, это был классный опыт. Спасибо организаторам за конкурс, а вам, что дочитали до конца. Буду рад подписке на мой Telegram-канал, где я пишу в основном о технологиях и гиковых штуках, но и немножко о жизни.
