🏆 Рейтинг ІТ-роботодавців 2018: вже зібрано більше 13 000 анкет. Оціни свою компанію!
×Закрыть

Code Marathon, или Как заинтересовать школьников программированием

Шел 22-й год моей жизни или же 2016, если считать по общепринятым меркам. Я уже больше 2-х лет занимался разработкой под Android, и это неплохо у меня получалось. Работал в компании Eastern Peak Software, только получил диплом бакалавра ХНЭУ по специальности, близкой к Computer Science, и готовился к поступлению на магистерскую программу двойного диплома.

Однажды летом мне передали, что учительница информатики Яна Валентиновна Ефимова (дальше просто ЯВ) просит провести несколько уроков информатики в моей родной школе — ОСШИ II-III ступеней «Одаренность» в Харькове. Целью занятий была подготовка школьников к олимпиадам по программированию (это когда нужно решать простые задачи на алгоритмы за определенное время). Предлагали вести 2 занятия в неделю на протяжении 2 семестров. Учительница обратилась ко мне, потому что у меня уже был опыт в этом деле: 2 года участия в школьных олимпиадах и 5 лет участия в университетских олимпиадах по спортивному программированию.

Честно говоря, раньше я бы отказался без раздумий, потому что времени у меня на такую активность просто не было. Но в тот момент, решил подумать и оценить свои возможности. Оказалось, что я все-таки могу выделить время на 2 урока в неделю и еще успевать на работу вовремя. Сама идея попробовать свои силы в преподавании меня увлекла, и я остался в школе почти на полтора года...

2016 учебный год

Первый год я занимался только с половиной 10-В класса, где ЯВ была классным руководителем. Что касается официального оформления в школе, то его, по сути, не было — я выступал в качестве тренера и мой труд оплачивался соответственно (у школы есть бюджет на этот случай).

Занятия проходили как обычные уроки (первые 2 урока по четвергам), но оценки я не выставлял и присутствующих не отмечал — это было мое пожелание, которому администрация школы не стала препятствовать. Как организовывать занятия и какие темы рассматривать, определял я сам — в основном это было именно олимпиадное программирование с использованием C++. Посещение было свободным, поэтому приходили только те, кому было интересно — большая часть класса и еще несколько учеников из других классов.

Некоторые дети уже имели опыт в программировании, как в обычном, так и олимпиадном. На первом занятии мы провели соревнование, чтобы оценить, кто что знает и умеет. В качестве площадки я выбрал ACMP. Суть соревнования была в решении 6 олимпиадных задач по сложности от совсем простых до более или менее сложных. Вот ссылки на них, чтобы вы могли оценить уровень задач:

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

Результатами соревнования я остался доволен: все решили хотя бы по одной задаче — базовые навыки работы с компьютером у школьников уже были. И только один человек решил все задачи — это значило, что мне есть, что рассказать ученикам.

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

Code Marathon 1.0

Посоветовавшись с ЯВ, я решил провести соревнование длительностью 3 месяца среди учеников. Для участия нужно было завести аккаунт на ACMP. Всех детей, у которых я вел занятия, я добавил автоматически — это около 15 участников. Позже присоединились еще люди из других классов. В итоге набралось 28 участников.

Суть соревнования была в том, чтобы заинтересовать детей олимпиадным программированием и удержать этот интерес длительное время. За 3 месяца можно было стартовать с нуля и, понемногу разбираясь в теме, нарешать нормальное количество задач и претендовать на призовое место. Итоговый рейтинг считался как разница рейтинга на ACMP на конец соревнования минус стартовый рейтинг. Все задачи были доступны сразу же, и их можно было решать в любом темпе.

Призовых мест было 6: 1 первое, 2 вторых, 3 третьих. Призы — фитнес-браслеты Xiaomi и флешки. Спонсорами стали я и ЯВ, призовой фонд — около $100.

CodeMarathon 1.0 начался 20 октября 2016 года и закончился 20 января 2017. На протяжении всего этого времени мы раз в неделю вывешивали листик A4 в кабинете информатики с первыми 6 участниками на текущий момент. Конкуренция была, но не сильная. Решили довольно много задач (в среднем по 25 на одного участника).

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

В этом же году один из школьников (Коваленко Юра) занял 3-е место на Всеукраинской олимпиаде по информатике в г. Ровно.

2017 учебный год

В 2017 году, договорившись на работе об одном дополнительном выходном каждую неделю (за свой счет), я смог посвятить весь этот день преподаванию в школе. Таким образом, у меня было 6 уроков по четвергам, а также я еще иногда оставался после уроков, чтобы просто пообщаться с учениками.

Ученики были с разной подготовкой. С одной половиной 11-В я уже занимался в прошлом году (это были в основном олимпиадники), поэтому с ними мы разбирали довольно сложные алгоритмы и структуры данных. Со второй группой 11-В (которые были вроде как не очень расположены к программированию, именно так изначально поделились группы) мы довольно быстро прошли весь базовый синтаксис C++ и тоже под конец перешли к олимпиадным задачам. С 9-А у нас было в 2 раза меньше времени, поэтому с ними мы успели пройти только синтаксис С++. Но и там были отдельные люди, которые быстро перешли на онлайн-курсы и сами смогли освоить Python (необходим для длинной арифметики) и STL в С++ (нужен за счет всех плюшек vector, set, map, sort).

На уроках мы в основном решали контесты, созданные на базе тестирующей системы DOTS, разработанной и поддерживаемой Арзубовым Николаем Алексеевичем. Это тренер по олимпиадному программированию для школьников в Харькове, учитель информатики в гимназии № 45, руководитель МНО «Q-BIT». Система действительно очень удобная, на ней же проходят областные олимпиады в Харьковской области.

Code Marathon 2.0

Вторая версия Code Marathon должна была учитывать интересы сразу как и продвинутых олимпиадников, так и совсем начинающих. При этом нужно сохранить конкурентный и образовательный моменты. Хотелось сделать что-то действительно классное, что понравилось бы школьникам.

Первые шаги

Результаты на листе А4 раз в неделю? Конечно, нет. Нам определенно нужен был сайт с обновлением результатов онлайн. Поскольку я мобильный разработчик, то создание сайта вызывало у меня много вопросов. А время поджимало, поэтому я решил, что пора начинать регистрацию на соревнование, а уже потом по ходу делать сайт. Форму для регистрации я сделал на Google Forms с сохранением этого всего добра в Google Sheets. Для того, чтобы иметь доступ к этим данным с любого устройства, я решил использовать БД на Firebase. Для синхронизации я использовал сервис Zapier, который дергает Cloud Function из того же Firebase. В итоге все данные после регистрации оказываются на Firebase в удобной для работы форме.

Для решения проблемы с разрывом в уровне подготовки было решено разбить участников на 2 дивизиона. Div1 — для опытных олимпиадников, Div2 — для остальных. Но 9 классу было морально тяжело соревноваться с 10 и 11, поэтому для них был добавлен еще Div3. При этом, если было желание, они могли регистрироваться и в Div2, и в Div1.

Для подсчета текущего рейтинга было необходимо для каждого участника стягивать его страничку ACMP, доставать из нее данные и отправлять их на Firebase. Для этой цели я написал небольшое консольное приложение на Kotlin, которое каждые 10 минут выполняло описанную выше процедуру. Поначалу все это работало у меня на ноуте, поэтому работало не постоянно. Это было явной проблемой, поэтому я искал варианты, где бы это запустить. Бесплатные сервера типа Amazon EC2, Google Cloud Engine у меня по какой-то причине поднять не получилось (возможно, из-за отсутствия опыта). В итоге в голову мне пришла идея запустить мой скрипт на Raspberry PI — оставалось только ее раздобыть...

Поскольку в соревновании теперь было целых 3 дивизиона, то и призовых мест соответственно должно было быть больше в 3 раза. Я решил поискать дополнительных спонсоров среди своих друзей. К нам присоединились моя девушка Алла Дубовская и сокомандники по спортивному программированию Дмитрий Смерчинский и Виталий Обидейко. Благодаря им призовой фонд вырос до 6000 грн, и мы смогли позволить себе приобрести Raspberry PI Model 3B в качестве приза за первое место в Div1. Полный список призов можно посмотреть здесь.

Полный призовой фонд

Соревнование стартовало 2 ноября 2017 года. Пора было приниматься за сайт. Немного погуглив, я наткнулся на очень простое решение — сделать сайт на основе примера на Node.js от Heroku. Табличка с результатами была готова в течение 3 часов и залита на тот же Heroku.

Для того, чтобы усилить конкуренцию и поощрить общение между участниками, я создал чаты в Telegram, по одному на каждый дивизион. Кроме этого я сделал простенького Telegram-бота, который каждые 10 минут писал о том, кто и какие задачи решил и сколько рейтинга набрал. Если посмотреть на графики набранного рейтинга по дням (c 10 по 20), то 2 эти действия определенно сильно повлияли на активность участников чемпионата.

Суммарный набранный рейтинг по дням (X — день соревнования, Y — рейтинг)

Разработка

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

Я разослал приглашение по чатам и стал ждать — откликнулось 8 человек. Думаю, что желающих было больше, просто побоялись, что не справятся :) Контингент был абсолютно разный — кто-то умел только немного С++, кто-то умел Git и JS.

То есть, по сути, это была команда, в которой один опытный разработчик (это я о себе так скромно говорю) и 8 стажеров. Процесс работы мы организовали в стандартном виде — таски на GitHub, митинги раз в неделю, общение в чате Telegram и в живую, Git, Git flow и остальные серьезные штуки.

Часть задач выполненных во время марафона

Под конец марафона все школьники освоили базовые команды консольного Git, умели запускать сайт на Node.js локально, верстали на HTML/CSS, немного писали на JS и Kotlin. Полный список разработчиков можно посмотреть здесь.

Итоги

Второй чемпионат проходил на протяжении 81 дня. За это время зарегистрировалось 56 участников — 54 из них решили хотя бы одну задачу. В сумме школьники решили более 4000 задач, набрав при этом более 85 000 рейтинга. Максимальный набранный рейтинг — 8259, для сравнения мой текущий рейтинг на ACMP — 12836, а всего можно набрать — 28753.

По завершении Code Marathon 2.0 был проведен опрос, в котором приняло участие 26 респондентов. Вот несколько интересных графиков:





И напоследок несколько ответов на вопрос «Что вам больше всего понравилось в Code Marathon 2.0?»:

  • Сама задумка марафона как такового, стимул в виде призов, много участников — много тех, кто интересуется программированием.
  • Ваще норм тема.
  • Вывод твоих личных результатов в сравнении с другими участниками марафона. То есть прослеживается твоё развитие в программировании в соотношении с остальными.
  • Наличие официального сайта, а также лекции на полезные темы по решению задач.
  • Появляется стимул больше программировать и изучать новые алгоритмы.
  • Крутой сайт, телеграмная беседа и боты хорошие, много участников и дополнительные баллы.
  • Возможность участвовать в разработке системы, которой сам пользуешься.

Были, конечно, и негативные моменты, такие как читерство, нездоровая конкуренция. Но эти проблемы тоже были решены. Например, вопрос с читерингом решался короткой личной беседы с просьбой объяснить 3 задачи на мой выбор из решенных участником. К сожалению, не все прошли этот этап. Но надеюсь, что в итоге все остались довольны.




Выводы

Я проработал в школе 3 семестра. Работал бы и дальше, но пришлось уезжать во Францию, чтобы закончить обучение в университете. За это время я получил очень много нового опыта, который сложно передать словами, но я попробую:

  • Очень умные, талантливые и перспективные ученики, которым можно указать путь развития, помочь определится с будущей профессией. У меня было несколько учеников, которые считали себя неспособными к программированию, а в итоге поднялись на уровень с лучшими программистами класса. В этот момент чувствуешь, что поменял чью-то жизнь к лучшему и от тебя есть хоть какая-то польза.
  • Опыт организации занятий для большого количества участников (15-20) так, чтобы всем было интересно и полезно.
  • Пространство для творчества и применения своих навыков программирования в реальной предметной области.
  • Ревью кода — это на постоянной основе. Смотришь на код ученика и думаешь, как такое можно было написать :) А нужно разобраться и помочь сдать задачу — ты же учитель. А потом проходит несколько месяцев, и этот человек пишет уже хороший, понятный и даже красивый код. И ты понимаешь, что в этом есть и твоя заслуга.
  • И, конечно, когда готовишь и проводишь уроки, сам лучше разбираешься в предмете.

Ссылки

Мои контакты: LinkedIn, GitHub, Instagram.

LinkedIn

10 комментариев

Подписаться на комментарииОтписаться от комментариев Комментарии могут оставлять только пользователи с подтвержденными аккаунтами.

Спасибо Вам за нужное иблагородное дело!

А главное зачем?

Помочь определиться с тем, чем они хотят заниматься в будущем?

Подскажите плз в чем разница между Олимпиадным и спортивным программированием?

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

Это одно и тоже по сути. В школьных олимпиадах участвуют обычно лично, каждый сам за себя. В университете — командами по трое. Насчет полезности — во время решения таких задач тренируется логика и умение придумывать решения сложных жизненных ситуаций. А этот механизм нигде лишним не будет. Кроме этого во многих компаниях — алгоритмы и структуры данных составляют чуть ли не первый этап собеседования. Для школьников же такие задачи, это самое простое с чего можно начать, потому что не приходится въезжать в кучу фреймворков и настроек для запуска какого-нибудь докера) В таких задачках нужен только сам язык и компилятор.

Спасибо за ответ. 1)но ведь для коммерческого программирования и нужно научится быстро "

въезжать в кучу фреймворков и настроек для запуска какого-нибудь докера

" ? — не получается ли , что а) у школьника-студента не идет спортивное программирование, он разочаровывается — мы теряем потенциального программиста б) у школьника-студента хорошо идет спортивное программирование — он тратит время на него вместо "

въезжать в кучу фреймворков и настроек для запуска какого-нибудь докера

" — потом слишком долго, не слишком удачно идет в коммерческое програмиирование, а прийдя — разочаровывается? 2) уместна ли будет аналогия смежду «спортивныи программированием и коммерческим программированием» , как между отжиманием и боксом? Т.е. боксеру желательно отжиматься, обязательно быть способным физически отжиматься, но не обязательно уметь ставить рекорды по гиннесу по отжиманиям. Ведь только умея суперски отжиматься, боксером не станешь. (а если перефанатеешь на отжиманиях, то можешь наоборот немного закрепоститься") понятно, что я имею в виду обычного школьника , потолок которого городские соревнования... Талантливый человек, с математическим складом ума, умеющий ставить цели полюбому сможет прийти в программирование, а если он выступал на международных соревнованиях и занимал там призовые места — то может и получал какие-нибудь офферы...

1) Я не знаю, как было у Вас, когда Вы начинали заниматься коммерческим программированием, поэтому расскажу на своем примере. В первый день моей стажировки, как Андроид разработчика, я с трудом смог запустить Android Studio и запустить проект, а потом с очень большим трудом залить все это на GitHub. Если бы мне за это не платили и я бы не боялся того, что меня попрут со стажировки, то я бы забил после первого часа этого мучения. Это то что я имею в виду под «сложно въехать». В олимпиадном программировании в основном предстоит решать небольшие (в плане количества кода и настроек) задачи, поэтому нет этого ада с предварительными настройками и кучей всего нового и не понятного. И так получается, что продвигаясь в олимпиадном программировании, люди интересуются и коммерческим попутно и исключительно по своей воле разбираясь с гитом, графическими фреймфорками, ООП. В данном случае олимпиадное выступает в качестве движущей силы.

2) Что-то в этой аналогии определенно есть :) Но ведь не умея отжиматься и записавшись в нормальный боксерский клуб получишь по лицу так, что больше никакого бокса не захочется?) Определенно одним отжиманием дело не исправишь — нужно еще кардио, выносливость, умение держать удар и другое. Здесь тоже самое — нужно смотреть на профессию разработчика шире и не вдаваться сильно глубоко.

Not all heroes wear capes.

Тот случай, когда хочется рыдать, потому что у тебя в школе о том и не мечтали, и одновременно радоваться, что в Украине есть школы, где это происходит. Ура Евгению и конечно Яне Валентиновне :)

Подписаться на комментарии