четверг, 12 июня 2014 г.

Соображения о кружках по программированию

/* Это совсем выпадает из тематики блога, но ограничение на максимальный размер заметки в vk для меня слишком маленькое, а потому опубликованы мои соображения о кружках по программированию будут здесь */

В этом году, забрав "бразды правления" в группе C кружка СПбТЦ СПбГУ всецело в свои руки, я пытался на его базе воплотить в жизнь многие собственные соображения о том, каким должен быть "кружок моей мечты". О том, что получилось / не получилось / не успелось / удалось понять, по порядку.

Сразу лирическое отступление о собственном опыте, на который я и опираюсь:
- в качестве школьника в течение 4 лет я успел позаниматься на 6 кружках по олимпиадному программированию. Так что есть пища для сравнений;
- в качестве преподавателя два года (недавно закончившийся - второй) преподавал в группе C СПбТЦ СПбГУ, в ЛКШ.июль был младшим преподавателем в C.cpp;
- ещё до того в 10-м классе:
а) объяснял на переменках в школе двум одноклассникам разные алгоритмы. Как результат, с одним из них с декабря 2012-го (т.е. полтора года спустя) почти все командные олимпиады писал вместе. Не по дружбе (вернее, не только), а потому что вскорости он стал показывать ничуть не уступающие моим результаты. А зачастую и превосходящие. Ещё бы дома самостоятельно продолжал тренироваться так, как делал это на первых порах, вообще цены бы не было ;)
б) весной по предложению учительницы информатики два урока в неделю из трёх я в компании двух своих одноклассников-олимпиадников (об одном из них - пункт "а": причём ещё в сентябре он, действительно, почти ничего не умел) рассказывал остальным одноклассникам из "сильной" группы информатики о разных базовых алгоритмах;
- в 11-м классе описанное в пункте "а" продолжилось, но уже с другими одноклассниками. Были и те, кто заинтересовался решением олимпиадных задач и тем, что за этим стоит, после наших довольно неумелых рассказов весной;
В общем, опыт преподавания потихонечку накапливался, и далеко не с 1-го курса, а на два года дольше.

Отступление закончилось, перехожу к основной части:

1) Как бы не хотелось внутренне обратного, по всей видимости, успешным может быть только кружок с, так скажем, единоличной диктатурой в преподавательском составе. То, что все решения, касавшиеся программы занятий, принимал я, позволило:
- почти не тратить время на обсуждение того, что же мы делаем дальше;
- иметь одного человека в лице меня, который в курсе всего и вся, что происходит на кружке, даже в те разы, когда сам там отсутствует. Что, как не 100%-ная информированность, может помочь осуществлять оптимальное планирование следующих занятий?

Два примера обратного - аналогичный кружок прошлого года и наша C.cpp в ЛКШ.июль-2013. Оба раза мои более опытные коллеги активно слушали, в числе прочего, моё мнение, а, наверное, не стоило этого делать (хотя тогда мне это, безусловно, нравилось. А о том, что это косвенно наносит вред образовательному процессу, как-то совсем не думалось). В результате мнений, зачастую противоречащих друг другу, накапливалось много, драгоценное время тратилось на выбор лучшего из них и на убеждение каждого, что это, действительно, лучший шаг. А в случае с кружком всё равно всё могло пойти наперекосяк, потому что в отличие от ЛКШ часть из нас вела занятия в один день, часть - в другой, между ними же были лишь короткие обсуждения в vk.

2) Вечная проблема едва ли не каждого кружка: редко хоть кто-то из школьников посещает 100% занятий. Сегодняшнее занятие пропустил один человек, через два дня - другой... Плохо это, разумеется, тем, что если всем даётся один и тот же материал, то преподавателям приходится либо притормаживать, чтобы пропустившие успели нагнать остальных, либо мириться с тем, что какие-то содержательные вещи минуют часть ребят. 

Мне обе альтернативы не близки. Предлагаемое решение: есть один достаточно большой и по возможности логично построенный план: от задачек на умение программировать до содержательных, требующих к тому же знание какого-нибудь алгоритма. По первым занятиям и из бесед с ребятами несложно примерно определить для каждого, каким "суффиксом" изначального плана будет его индивидуальный план. Именно по этому плану он и двигается, никак не обращая внимания на остальных, отталкиваясь только от собственных возможностей, собственной частоты посещения занятий, объёмов собственной работы дома.

Что ещё помогает исправить такой подход?
- осенью приходят совсем по-разному подготовленные ребята. В частности, они могли закончить в ЛКШ D, могли C, а могли вообще не слышать, что такое ЛКШ. Если балансировать на уровне несуществующего среднего школьника, то рухнуть рискует всё: сильным будет неинтересно, слабым - сложно, а мотивация ходить уменьшится и у тех, и у других. При этом если дробить существующие в Питере кружки на ещё большее количество уровней, то необходимое число преподавателей рискует сравняться с числом школьников, а эффективность не вырастет...;
- в наши ряды можно было влиться хоть весной, что некоторые и делали. Их индивидуальный план был в чём-то похож на тот, что получали в октябре все, кто был с нами в начале года. Конечно, они не нагнали остальных (это и не представляется возможным), зато они понимали, что происходит (чего бы не произошло, если бы им предлагались те же темы, что и тем, кто занимается весь год), а потому получали пользу от занятий;

Что требует дополнительно такой подход?
- больше преподавателей. Не зря осенью нас зачастую было по трое на 6-8 школьников. Это вызывало предельное непонимание со стороны коллег-преподавателей [других кружков], писавшиих студенческие тренировки в то же время в том же месте, но этот шаг позволял сделать жизнь преподавателей чуточку проще, а возможности школьников чуточку шире;
- больше беготни и прочей активности со стороны преподавателей. И ещё умения быстро переключаться между темами. Мне кажется, справиться получилось, но было тяжело. Тяжелее, чем в любом из прошлых случаев в моём не очень богатом опыте. Впрочем, стоило получше подойти к организации процесса: тогда между темами переключаться бы не пришлось, потому что в зону ответственности конкретного преподавателя попадали бы ребята с одинаковыми или очень близкими темами. А ещё, если идти преподавать на кружок, то уж выкладываться на все 100%. Так что и неважно, что временами усталость после занятия значительно превышала усталость после, например, 4 пар в университете (во всяком случае, на себе я это хорошо чувствовал).

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

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

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

3) Многие школьники ничего не решают дома / на каникулах, и ничего с этим не сделать. Во всяком случае, такое мнение сложилось у меня. Уже активно обсуждалось.

Я произносил, произношу и буду произносить перед ребятами слова о том, как важно тратить дома время на практику. Но, как бы я не старался, чтобы призыв вышел как можно более пламенным, всё равно часть ребят не дорешивает вообще. И я, к сожалению, близок к уверенности в том, что с этим ничего не сделать. Человек либо сам поймёт, что ему это нужно/интересно, либо ему это не нужно / скучно.
Можно, конечно, в качестве контраргумента к "Нет времени" носить с собой ведомость с собственными оценками за 11 класс (особенно хорошо должно действовать на тех, кто знает, что такое учёба в ФМЛ 239) и перечень задач, которые я успел решить за тот учебный год, но... вы, в общем, поняли, что это была не самая удачная попытка пошутить, потому что так делать совсем непедагогично и вряд ли действенно... К большому сожалению, не в каждом впечатление от чужих результатов вызывает понимание, что и он так может.

4) Внезапный психологический момент: даже те ребята, кто активно задаёт вопросы на занятии, в большинстве своём стесняются задавать вопросы по почте / в vk вне занятий. Хотя на занятии в явном виде говорится: если что-то будет не получаться, когда будете дорешивать, не тяните до следующей недели, задавайте вопросы в Сети, мы будем вам помогать! И я не понимаю, как изменить ситуацию.

Есть ещё один момент, корни которого, наверное, там же: обращение на "Вы", которое для некоторых так и не вытеснило обращение на "ты". Хотя я в начале года намекал, как лучше. 

Но если в том, что к тебе обращаются на "Вы", как бы тебе не хотелось обратного, в сущности, нет никакой проблемы, то в том, что школьники не задают вопросы вне учебной аудитории, проблема есть!

5) В этом году мы сказали: "Нет!" - зачёту в конце года. Вместо зачёта случилось чаепитие ;) 
Почему я считаю, что я прав:
- кружкам очень не хватает того, что есть в ЛКШ, что есть во многих дружных школьных классах. Общения. Какого-то микроклимата, уюта от того, что ты там находишься. А этот микроклимат - причина того, что новые знания усваиваются лучше и принимаются с большим желанием. Во время занятия особо о том о сём не поболтаешь, а за чашечкой чая не об алгоритмах же общаться? Кроме того, это отличная возможность получить обратную связь, услышать какие-то соображения ребят по поводу того, что происходит на занятиях. Так и мы на последнем занятии сели в круг, чтобы каждый по очереди сказал, что он думает о времени, проведённом на кружке, что ему понравилось / не понравилось, что хотелось бы изменить. В общем, устроили что-то вроде типичного для каждого вечера в питерском физлагере огонька. Разве что вместо свечки в центре круга стояла коробка с пирожными ;)
- конец года - и так нервное для школьников время: у кого годовые контрольные, у кого ГИА или внутришкольные экзамены. Ясно, что даже если о зачёте предупредить, готовиться как следует никто не будет, ибо не до того. Зачёт без подготовки - уже не очень хорошо. А ещё зачёт - это всегда волнение. Ну и зачем лишний раз заставлять замечательных ребят волноваться, когда у них и без того проблем хватает?

При этом я, разумеется, не считаю, что абстрактный зачёт - что-то ненужное. Зачёт - крайне полезное мероприятие, если проводится в правильное время. Полезное для каждого из сдающих, чтобы лучше понять свои слабые стороны; чтобы уяснить какие-то детали, которые не удалось уяснить ранее, получив верные наводящие вопросы от принимающих, и т.д. (всё это, конечно, при условии, что принимают зачёт правильно, но желающими "завалить" без пользы для школьника кружки ведь в среднем не отличаются?) 

В этом году с проведением зачёта, скажем, в марте, не сложилось. Ничего, всё впереди. А ещё можно случайно на первом занятии кружка "зачёт" по ранее изученному устроить. Идеи в процессе разработки ;)

6) Я решил, что стоит сказать: "Нет!" - стекам, декам, очередям, быстрым сортировкам, хипам... 
Да, это, наверное, сто раз непедагогично. Но напрашивается несколько наблюдений:
- сколько раз человеку нужно рассказать, скажем, стек или дек, чтобы тема была понята? Очень сильно удивлюсь, если больше одного. Так этот один раз случится в ЛКШ. А если человек по каким-то причинам не ездит в ЛКШ, то:
а) он неправ ;)
б) вряд ли он что-то потеряет от незнания того, как называются две интуитивно устроенные структуры данных;
- мы готовим к олимпиадам или даём фундаментальные знания в области алгоритмов? В моём понимании это отнюдь не одно и тоже. Фундаментальные знания ещё успеют прийти к ребятам в том или ином качестве в университете. Или, захотят - хорошие книжки почитают на досуге. А на олимпиадах:
а) Хип бесполезен, когда есть set, который, к тому же, умеет значительно больше (и пусть set до поры до времени будет просто множеством, магически работающим за log). Умение писать быструю сортировку (а также понимание того, как она работает) бесполезно, когда есть sort (тут я, конечно, не до конца прав: я хорошо помню, что идеи MergeSort и QuickSort используются и в не имеющих на первый взгляд никакого отношения к сортировке задачах, но такие задачи не очень-то и часты на контестах, чтобы сильно беспокоиться о том, что школьники уровня параллели B-C не умеют решать именно их, а не сотни других не менее содержательных, но более популярных на олимпиадах задач).
б) Стек бесполезен до тех пор, пока человек не понимает те идеи, где используется эта структура, достаточно глубоко. Я уверенно писал работоспособный dfs и произносил слова "стек рекурсии", но до определённого момента ни на секунду не задумывался о том, причём тут стек и какое отношение он имеет к рекурсии. Потом как-то раз понадобилось построить в одной задаче эйлеров цикл без рекурсии... тут-то я и ощутил всю пользу самой концепции стека. Случилось это на 1-м курсе на Харьковских сборах, тогда как про стек мне рассказывали в 8-м классе, потом в 9-м, и так далее. Мне кажется, значительно содержательнее дать, например, на одну сравнительно нестандартную задачу на бинпоиск по ответу больше или разобрать на один несложный пример пугающего на первых порах большинство ребят ДП больше, чем прочитать "лекцию" о стеке и предложить его реализовать: в головах большинства школьников это ещё долго будет оставаться "темой ради темы".
в) Отчего бы не рассказать очередь вместе в bfs'ом, когда настанет черёд последнего? Выносить в отдельную тему рассказ о массиве и двух переменных не кажется верным шагом.
г) Зачем на достаточно раннем этапе говорить про КМП, Z-функцию, если почти все задачи на строки (до тех, что требуют суфф.структур, автомата Ахо-Корасик, и т.д.) решаются хешами?
д) <вставьте своё предложение>

Я понимаю, что необходимость объяснять большинство таких тем оправдывается тем, что каждый алгоритм - содержательная идея, которая развивает способность нетривиально мыслить. Но достаточно взять задачу C-div2/D-div2 какого-нибудь случайного раунда Codeforces, и лежащие в основе её решения идеи с большой вероятностью окажутся ничуть не менее содержательными (речь, напомню, о школьниках уровня параллелей B/C ЛКШ). Разве что алгоритма "Решение задачи такой-то с такого-то раунда Codeforces" в природе не существует. Зато размышление над такими задачами создаёт условия, лучше приближенные к "боевым". Поэтому если выбирать: задача на ДП / бинпоиск / два указателя / ещё какую-нибудь популярную идею или редко нужный на практике алгоритм, - я уверен, нужно выбирать первое. А выбирать приходится: мы же не каждый день по несколько часов занимаемся с ребятами; в результате ресурс времени, имеющийся у нас, слишком мал.

7) Почему никогда не акцентируется внимание на тесных связях между некоторыми темами? Связях не в том, на что направлены темы (то есть, например, не между алгоритмом Форда-Беллмана и алгоритмом Дейкстры), а в том, какие идеи эти темы используют? Абстрактные примеры: почему Форд-Беллман не рассказывается в связке с ДП, почему не рассказать суффиксный массив за N log^2 N сразу же после хешей тем, кто знает слово sort и умеет писать двоичный поиск (фактически, в качестве задачи/упражнения)? Какую сложность представляет ДП по подмножествам для тех, кто понимает идею, лежащую в основе ДП, и имеет представление о битовых операциях? А если принцип ДП уже понят, то в комплекте с dfs может идти ДП по поддеревьям. 

Отступление про ДП: вечная проблема - как его на начальном уровне объяснять. Мне категорически не нравилось, когда про ДП мне рассказывали на нескольких шаблонных примерах, затем я сдавал задачи, представлявшие собой похожие примеры, и, как результат, не имел ни малейшего представления, почему ДП по подмножествам/поддеревьям/профилю/подотрезкам вообще так называется и что общего между поиском кратчайшего гамильтонова цикла и задачкой о числе различных битовых последовательностей без трёх нулей подряд. 
Я пробовал рассказывать динамику через граф состояний и переходов. Не сказать, что мне это показалось особенно эффективным способом, но когда человек, недавно закончивший C/C', одолевает буквально в октябре стандартное ДП по подмножествам (а никакого псевдокода не даётся, даётся только та составляющая идеи, что касается битмасок, объяснённая на совсем простых примерах), это всё же радует.

Утопическая идея №1: составить орграф, в каждой вершине которого пары - тема/типичные задачи на тему. Рёбра ведут в вершину из вершин с pre-requisites (как это адекватно в 1-2 слова выразить по-русски?..): так, из типичного примера на ДП и из задачи на работу с битмасками ведут рёбра в типичный пример на ДП по подмножествам... Возможно, объяснить не удалось. В таком случае, объясню вторым способом: прототип для моей идеи - tree view списка задач на "биотимусе" (rosalind.info), только одна вершина может содержать несколько задач, а задачи на любую алгоритмическую тематику.

8) Едва ли не самая страшная для меня проблема: как объяснять тем, кто находится на совсем начальном уровне? Кто пришёл к нам хотя бы после С' ЛКШ, с большой вероятностью уже достаточно хорошо умеет приспосабливаться к разным преподавателям, рассказывающим об алгоритмах. А если опыта ещё меньше? Нет, безусловно, если преподаватель очень хороший, он сумеет объяснить так, чтобы было понятно всем. Объяснить, не проглотив попутно какую-то важную деталь, которую сам осознал уже давным-давно, а оттого стал считать предельно очевидной. У меня, увы, далеко не всегда так получается. А дальше проходит час-другой безуспешных попыток школьника воплотить в код только что рассказанную идею, ты заглядываешь к нему и... осознаёшь, что он-то понял тебя совсем не так, как ты хотел. 

В результате лично я пытаться объяснять некоторым попросту боюсь... Во всяком случае, когда есть кто-нибудь, кто лучше меня подходит на роль объясняющего. А так было почти всегда: осенью нас, преподавателей, было четверо, причём по опыту участия в олимпиадах / продолжительности обучения алгоритмике в той или иной форме (школьные кружки / дискретка в университете) мы все друг от друга отличались, и достаточно сильно. Именно поэтому почти всегда я мог попросить рассказать такому-то школьнику такую-то тему человека, который сам сравнительно недавно познакомился с этой темой и у кого не стёрлись в голове, как, увы, стёрлись у меня, очень-очень важные связи, именно на которых и нужно расставлять акценты при рассказе новичку.

Есть и другой выход - предлагать более опытным школьникам с того же кружка делиться опытом с менее опытными товарищами. На себе проверено неоднократно ещё в школьные годы: чем больше пытаешься поделиться своими знаниями с кем-то, тем больше обнаруживаешь в них пробелов, а ещё тем лучше они укладываются в голове. Docendo discimus (Обучая, учишься сам) - писал ещё Сенека. Эта фраза будет актуальна всегда.

К слову, первый раз с реализацией этой идеи на практике я столкнулся на замечательных уроках геометрии в ФМЛ 239. На них мы осваивали огромный блок теории "коллективно": каждый разбирался с одной небольшой темой (для некоторых темы совпадали, но в целом же тем было много), а дальше происходил обмен знаниями по следующей схеме:
- разбиться на пары;
- рассказать соседу по паре свою тему и послушать, как он расскажет свою. Задать все возникшие вопросы;
- моя тема := тема, которую я только что слушал;
- повторить предыдущие пункты много раз;
Работало безотказно. В случае кружков по программированию это не совсем то, что нужно, потому что больших блоков теории, в сущности, нет, а все полученные знания нужно тотчас отрабатывать на практике, но идею можно и переосмыслить под изменившиеся потребности.

9) Я, кстати, категорически против стандартных хоть сколько-нибудь продолжительных лекций как системы обучения на кружках. Лекция - это такой несложный для преподавателя способ выдать сразу огромный набор знаний, а дальше - сами разбирайтесь / задавайте вопросы. А то, что если лекция покрывала несколько тем, то и так уже немалая часть материала потеряна, т.к. процент запомненного с любой лекции для любого школьника (да и не только школьника) явно не соответствует 100, как бы никого не волнует. И хорошо ещё, если потеряно не самое важное.

Предлагаемые альтернативы:
- см. предыдущий пункт. Рассказываем тему одному-двум школьникам в личной беседе (подмечено: они в таком случае и вопросы охотнее задают!), направляем обременённых новым знанием к тем, у кого его ещё нет, и запускаем "машину взаимообразования". А ещё это идёт в соответствии с идеей пункта 2 об индивидуальных планах: тому, кто впереди всех расскажешь тему, а тем, кто его будет догонять, расскажет уже он сам;
- если почему-то совсем не хочется давать школьникам слово (хотя почему так может быть?), но зато соотношение преподаватели/школьники на кружке не катастрофически маленькое (скажем, хотя бы 1/5 или ещё больше), то можно и самостоятельно рассказать несколько раз одну и ту же тему в маленьких группах. Заодно потренироваться излагать одно и то же по разному, чтобы самому не скучно было. А маленькие группы лучше и тем, что можно попутно задавать вопросы по пониманию школьникам, если сами они никак не дают знать, понятно ли им;
- если лекция покрывает много маленьких подтем, то стоит, мне кажется, очень часто прерываться и давать 10-15 минут на отработку только что полученного знания на практике. Опробовано на базовой вычислительной геометрии в декабре. Конечно, успелось как обычно раза в два меньше, чем хотелось успеть, но процесс шёл динамично, никто не засыпал, а это главное. И это лучше, чем рассказать всё с начала до конца, а потом дать 15-20 задач на формулы и if'ы людям, некоторые из которых первый раз об аналитической геометрии услышали только что и у которых в голове невообразимая каша от обилия материала, который на них свалили в один подход.

Ещё по последней идее:
У нас на кружке язык по умолчанию - C++. Но не предполагается, что пришедшие к нам в сентябре с ним знакомы. Поэтому на первом занятии пришлось довольно долго рассказывать основы (хотелось минут за 15, но вряд ли в час удалось уложиться. Это был своеобразный первый блин, который известно как выходит...), а вот дальше хотелось, чтобы знание языка совершенствовалось в фоновом режиме. Так и сделали: каждое занятие устраивалось несколько пятиминуток, в течение каждой из которых рассказывалось про какую-нибудь одну фишку языка или про что-то напоминалось. А иногда и простые теоретические идеи давались в той же форме: прерываемся буквально на 5 минут, а затем каждый возвращается к тому, что решал перед тем, как прерваться. Опять-таки, мысль в том, что если можно блок теории разбить на подблоки, стоит делать именно так, а не перегружать школьников теорией за один раз.

10) К сожалению, отсутствует какая-либо связь между кружками/сборами/ЛКШ. Да и даже между тремя кружками СПбТЦ СПбГУ как таковой связи нет.
В качестве результата имеем то, что школьники получают за несколько лет одну и ту же задачу по 4-5 раз. А принцип Repetitio est mater studiorum работает только тогда, когда нет более удачных альтернатив. Альтернативы же есть! Если дать человеку n задач на одну и ту же идею, больше вероятность, что он разглядит эту идею на олимпиаде и решит (n+1)-ю задачу, если n достаточно велико, а не равно 1. И менять нужно подборку задач именно на кружках: как минимум, это проще. Я старался это делать, пусть и не всегда получалось. 

Утопическая идея №2: создать перечень задач, которые есть в Полигоне в ЛКШ (и поддерживать в случае добавления новых!), хранить его в публичном доступе и не давать эти задачи на кружках/сборах! 

Да, а задачи брать с codeforces, timus'a, acmp.ru, codechef'а. Да хоть с TopCoder'а: потратить половину занятия на знакомство с не самой интуитивной системой сдачи задач - я считаю, достойное вложение времени, которое потом окупится с лихвой. Скинуть в публичный доступ ссылки на задачи и радоваться жизни. Если вам вдруг принципиально собрать из задач контест и видеть сводную таблицу, vjudge (или любой аналог) решит ваши проблемы в считанные секунды (не работает с acmp и TopCoder'ом, но отлично подходит во всех остальных случаях).

Вышеописанный подход должен устроить всех, кто решал/решает много задач на разных OnlineJudges. Мне зачастую достаточно увидеть название или первые строки легенды решённой несколько лет назад задачи, чтобы вспомнить, о чём она была. Нас таких, наверное, большинство среди преподавателей кружков. Остальным же нужен перечень ссылок на задачи, упорядоченный по темам. Кажется, пока это можно назвать утопической идеей №3. Тем не менее, я (и не только я) планирую/ем улучшить ситуацию в этом направлении в ближайшем будущем. Очень хочется написать: ждите новостей.

Возвращаюсь к кружку...
Итак, мы за этот год ни разу не тратили время на несодержательную часть подготовки контестов, отделяющую готовый перечень задач от готового контеста. И, знаете, мне понравилось ;)

Если есть лишнее время, лучше подготовить, например, какой-нибудь тест. Скажем, у нас была парочка тестов по знанию языка (мы принудительно обучаем на C++ (точнее, "Си с STLем") ), нацеленных на то, чтобы, дав большую часть неправильных ответов, при разборе школьники осознали свои слабые места, чтобы они узнали о некоторых тонкостях языка не на олимпиаде, где высока цена ошибки, а тогда, когда ошибаться в чём-то даже полезно.
Идея с тестами совсем не моя (и на мне самом она хорошо работала ещё тремя годами ранее). Я привнёс одно изменение: удобным показалось делать тесты в качестве опросов в Google Docs, чтобы дальше у меня была возможность мгновенно получить таблицу для сравнения результатов ребят и понять, на что требуется обратить особое внимание.
Для примера один из тестов.

Утопическая идея №4: объединить усилия, делать тесты на какой-нибудь единой платформе (желательно, ещё более удобной), делиться ими среди преподавателей и использовать плоды совместных трудов. Понятно, что речь не только о тестах по языку программирования: например, в ЛКШ в C.cpp мы готовили (в печатном виде) тесты по алгоритмам. И не одни мы этим занимались, но хочется консолидации усилий.

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

За те годы, что сам занимался на кружках, видел по несколько вариантов и со сводной таблицей, и без неё. Меня она, пожалуй, мотивировала больше решать дома. По меньшей мере, до того момента, когда были те, кто решил больше, а такие почти неизменно были. Но в хвосте таблицы были люди, решившие раз в 10 меньше лидеров, что не мешало им после демонстрировать ничуть не уступающие последним результаты на олимпиадах. То есть, мотивирующий эффект сводной таблицы ограничен. А ещё может быть и демотивирующий, о чём нельзя забывать, работая со школьниками...

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

12) Я незадолго до начала года открыл свою страничку в vk, и очень правильно сделал: мне имели возможность (и несколько раз ей пользовались) писать и родители ребят. Если речь идёт ещё о классе 7-8, школьник, конечно, будет в первую очередь делиться своими успехами и неудачами, своими впечатлениями с родителями. Даже если родители плохо представляют, что такое олимпиадные задачи по программированию (или даже вообще "программирование"), всё равно они, а не преподаватели, будут первыми, кто узнает от школьника, что тот думает. Если преподаватель объяснил путано и совершенно непонятно, увы, далеко не каждый школьник наберётся смелости на это намекнуть. Тем не менее, преподавателю важно об этом узнать и как-то скорректировать свои действия.

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

Чем может быть чревата обратная ситуация? Вот вам пример из жизни: в 8-м классе я первый раз пошёл на кружок по олимпиадному программированию. Ввиду очень слабой математической подготовки да и почти отсутствующих навыков программирования (чего стоил мой год с лишним почти самостоятельного обучения программированию, если я даже с массивами работать не умел?), мне было, конечно, очень сложно. Уже в октябре-ноябре я, приходя с занятия домой, честно и откровенно говорил, что понимание у меня было первые минут 10. Дальше - как в тумане :) Разумеется, в ответ мне советовали отложить кружки такого рода на будущие годы. Меня спасли упрямство, а также невероятное везение, пришедшее через год с небольшим. Упрямство не дало поставить крест на посещении кружка (и позволило по крупицам набирать те знания, которые я мог выхватить из общей канвы. Лекции были и в целом прекрасными, но я к осознанию их содержания был не готов. А поднять руку и сказать: извините, ничего не понимаю - это, сами понимаете, большая, почти никого не обходящая проблема; а также постепенно решать задачи, изобретая для каждой свои велосипеды. До сих пор помню и своё вычитание длинных чисел на добрую сотню строк, и подсчёт компонент связности при помощи упрощённого подобия СНМ-а с линейным временем работы), а везение в 9-м классе принесло диплом призёра на РОИ, не особо заслуженный, но заставивший поверить в себя и поставить новые, более высокие цели. Беда в том, что в общем случае упрямство не особо похвальное качество. Поэтому диалог преподавателя с родителями призван объяснить, что ребятам не стоит ждать результата сразу, не стоит расстраиваться из-за плохих результатов, но стоит продолжать трудиться, потому что труд будет вознаграждён. Иначе рискуем потерять потенциально талантливого человека из-за первых неудач.

13) Интересно, привлекал ли кто-нибудь до нас к преподаванию на кружках самих школьников (разумеется, более опытных, чем те, кто занимается на кружке)?
Меня, кстати, привлекали один раз в 9-м классе. Но ты был кружок по web-программированию, поэтому аналогия неуместна. А ещё я тогда ну совсем не справился...

Мы попробовали, ухватившись за единственную возможность не прерывать занятия: в конце января я только-только выбрался из больницы, а из теоретически остававшихся 6 человеко-занятий в реальности в нашем распоряжении было 2-3. И если 2, то в один и тот же день на неделе, а кружок-то два раза... 

Эксперимент стоит признать удавшимся! Просто огромное спасибо Никите Подгузову, Пете Смирнову и Севе Степанову! Без них хорошее начинание заглохло бы в середине. Учитывая, что писали мне о занятиях как сами школьники, посещавшие кружок, так и их родители (см. предыдущий пункт), справились они отлично! И даже централизованность системы удалось не нарушить: процессом по-прежнему руководил я, излагая содержание грядущих занятий новоиспечённым коллегам в vk / по телефону, а после занятий в ответ получая подробнейший рассказ о том, как всё прошло. Подробный вплоть до того, что про каждого школьника я знал, какие задачи он пытался сдавать, какие сдал, какую теорию узнал.

Продолжаю раздавать благодарности :)

Спасибо Олегу Давыдову, также поучаствовавшему в спасении нашего кружка.

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

Спасибо Владе Рау, Альбине Езус и Гоше Новикову, составившим вместе со мной изначальный коллектив преподавателей кружка. И осенью мы все отлично справлялись! Очень жаль, что обстоятельства оказались против того, чтобы всё так же отлично и продолжилось. Но задел был сделан хороший, и до конца довести начатое, благодаря помощи вышеупомянутых замечательных людей, удалось.
Уже писал в п.2 и п.8, почему нас было так много. Дополняю: четыре человека - это четыре взгляда для происходящее и четыре источника идей, часть из которых удалось взвешенно рассмотреть и внедрить в процесс.

И, хоть я и поблагодарил всех ребят, кто был на последнем занятии, а также не преполагаю, что они это читают, спасибо нашим замечательным школьникам! Работать с ними в этом году было одно удовольствие! Даже те, кто почти не садился за программирование дома, на занятия приходили с желанием работать, а не засыпать и не заниматься чем-то посторонним. На стульях никто не катался, по Скайпу друг с другом через всю аудиторию никто не общался (вы не знали, что такое бывает? Зашли бы к нам в прошлом году...), и так далее. Уж не знаю, в чём кроется причина. Возможно, даже в не самом стандартном для кружка по программированию соотношению числа девушек к числу юношей (которое, бывало, существенно превышало 1): первые в среднем по личным наблюдениям ответственнее подходят к делу. Возможно, ещё в чём-то. Хотелось бы верить, в то, что заслуга и в разнообразии, которое мы вносили в учебный процесс, чередуя разные подходы, большая часть из которых описана выше.

14) Несколько слов по итогам года, который ребята провели на кружке.

Я уверен, что сейчас у каждого из тех, кто ходил к нам с осени, за плечами та теоретическая база, с которой можно добиться, как минимум, диплома призёра на РОИ. "Беда" в том, что диплом дают не за понимание разбора, а за самостоятельное придумывание и реализацию решений. Способность придумать решение здесь, разумеется, самое проблемное место, к тому же требующее больше всего практики. Этой практики традиционно не хватает нигде: ни на кружках, ни в ЛКШ, ни на сборах. А метод её набрать один (обязательно поправьте, если считаете по-другому) - брать подряд сравнительно непростые задачи, продолжительно ломать над ними голову, а затем при необходимости вникать в разбор. Ликвидировать нехватку практики такого рода, на мой взгляд, в условиях кружка могут только теоретические семинары, то есть "лекции", на которых предмет обсуждения не алгоритм, а содержательная задача, а говорят, в основном, школьники. Преподавателю же даётся роль усовершенствованного разбора, который не даёт узнать своё содержание полностью, а лишь наталкивает в нужные моменты школьников на верные мысли. Первый такого рода теор.семинар случился у нас только 30 апреля, то есть в первый раз, когда я появился на кружке во втором полугодии. Я не жалею, что не пытался опробовать такую форму обучения раньше, так как важно было вначале дать ребятам существенную теор.базу (например, некоторые из них теперь умеют писать дерево отрезков, почти все должны были реализовывать весной корневую, и т.д.), чтобы [почти] не отвлекаться на неё впоследствии (на самом деле, в голову не приходят темы, которые нужны, но не были рассказаны. Декартовы деревья, игры и потоки школьникам, у которых иногда возникают затруднения с B-div2 Codeforces, уж точно не нужны. Да и пока у них не будет стабильных 3-4 в div2, пока не будет способности быстро придумать и написать решения первых трёх задач каждого дня почти любой регионалки, какие декартовы деревья?). И то, что большинство пока не показало хорошие результаты ни на одной олимпиаде, не так страшно: как-никак 11-классники к нам не ходили. Теперь важно сделать акцент на идейной составляющей задач, ни на что больше не отвлекаясь и пользуясь подговтоленной алгоритмической базой, и результат придёт. Надеюсь, что моё желание продолжить начатое и работать в следующем году примерно с тем же коллективом школьников не встретит возражений, и тогда теор.семинары станут основным видом занятий. Благо, за задачами для семинаров мне, по-прежнему достаточно регулярно участвующему в контестах, "ходить" особо далеко не придётся.   

Если вы дочитали (в смысле, не пролистнули ;) ) до сюда, то: 
- в первую очередь, огромное спасибо!
- заранее ещё большее спасибо тем, кто оставит содержательные комментарии по теме. Я думаю, тем для потенциальных дискуссий я оставил немало. Дискуссии и мнения по вышенаписанному только приветствуются, вне зависимости от того, в разы ли у вас опыта больше, чем у меня, или же на порядок меньше.

P.S. Содержание этой заметки очень долго обдумывалось, но, к сожалению, начал писать я её сравнительно недавно. А раз идеи не фиксировал ровно в те моменты, когда они приходили ко мне, возможны апдейты. Ещё, возможно, в комментариях всплывёт какая-нибудь забытая тема, соображениями по поводу которой хотелось поделиться.

Комментариев нет:

Отправить комментарий