воскресенье, 29 июня 2014 г.

Как я возвращался к шахматам

За последние две недели я, не участвовавший в официальных шахматных турнирах на протяжении почти шести лет, принял участие сразу в двух. О том, зачем и почему, можно было прочитать раньше. Теперь об ощущениях и впечатлениях.

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

Часть для любителей длинных текстов



Белые ночи - 2014, или первый рейтинг-турнир за 6 лет - 17-25.06

  • В стартовом листе, в котором участники упорядочиваются по рейтингу (а безрейтинговые - по алфавиту), я был 22-м из 49 участников. Закончил турнир я на 24-й позиции. В общем, примерно в соответствии с рейтингом.
  • Это мой 6-й рейтинговый турнир в жизни (предыдущие были в 2007-2008). Предыдущие пять я начинал с поражения, а этот - с победы. Причём, как вы сможете увидеть во второй части, в первом туре исход партии стал ясен по прошествии (!) 7 ходов.
  • Самый младший мой противник родился в 2004-м, самый старший - в 1938-м. А среди участников турнира был и мастер ФИДЕ 1927 г.р. (с которым я году в 2006-м один раз чудом сыграл вничью). Преклоняюсь перед такими людьми: шахматы на уровне подобных турниров требуют настолько напряжённой работы мозга, что немногие в этом возрасте продолжают играть так, что после 4-го тура идут со 100%-ным результатом, а завершают турнир на 6-й позиции.
  • Во 2-м и 3-м туре партии с моим участием становились самыми продолжительными партиями тура. Личный рекорд ;) Кстати, я так и не пришёл к выводу, что проще: 4-часовая партия или 5-часовой контест. Партия, безусловно, намного более волнительное предприятие (во время контеста, если и начинаешь сильно волноваться, то уже ближе к последнему часу; здесь же может статься, что напряжение придёт в самом начале и не отпустит до конца, чем бы этот конец не ознаменовался), но и за контесты есть свои трудноформулируемые доводы.
  • В 8-м туре я первый раз за 12 лет сыграл в турнирной партии e2-e4, вместо того, чтобы выдвинуть ферзевую пешку, выбор в пользу которой делал неизменно если не с 3-го, то со 2-го разряда уж точно. Результат - победа.
  • Начиналось всё очень позитивно: 2,5 очка после 4 туров (что стало повторением личного рекорда в рейтинг-турнирах). Потом случился провал в 5-м туре (см. ниже). Возможно, из-за него, возможно, и нет, следующие две партии я проигрывал, получая к середине игры существенно большие шансы на победу, чем противник, а затем умудряясь растерять добытое. Зато закончить удалось на победной ноте: в 8-м и 9-м туре я выигрывал, причём выигрывал ровно так, как мне нравится!
Итого: 4,5 очка из 9. 50%. Рейтинг чуть упадёт. Так бы я подводил итоги 6 лет назад. Но 6 лет назад у меня отсутствовала любовь к тому, чтобы делиться с общественностью подробностями того, что со мной происходит, а потому никаких итогов я не подводил. А сегодня итоги будут такие: 
  • Мне очень понравилось. Вот моё видение причин:
    • ничто и никто теперь уже не давит на меня, спонтанно решившего поиграть в шахматы, а для самого процесс в данном случае намного важнее результата;
    • и процесс однозначно удался, потому что стиль игры у меня такой стал. Отдав предпочтение рискованной атакующей стратегии игры и временами попросту пренебрегая обороной, я открыл для себя те стороны шахмат, с которыми почти не соприкасался за 7 лет занятий. Посмотрел на картину вновь, и вдруг она заиграла такими яркими красками!
    • кроме того, не боясь за результат, я не боялся и экспериментов. Эксперименты касались дебютного репертуара. За 6 туров удалось разыграть 6 разных дебютов! Оставшиеся три партии виной моих противников начинались одинаково (с Кg1-f3, c2-c4, и т.д.), но приводили к приятной мне игре. Вообще, никогда не возражал, когда белые добровольно лишают себя инициативы первыми же ходами ;)
  • Мне могут сказать, что я зря теряю время. Особенно, если результат меня особо не беспокоит. Но нет, не зря!  Даже глубокий расчёт вариантов однозначно положительно влияет на мышление. Но шахматы - это не один расчёт вариантов! Одним расчётом вариантов партии не выигрываются. Да и все варианты (вернее, все хоть сколько-нибудь разумные) попросту не посчитаешь! В одной книжке по шахматам, которую я недавно листал, вводился очень хороший термин - мышление схемами (кажется, и название у книги такое). Если добавить к излагаемым там идеям приходящий мне в голову образ, то получится спрут, щупальца которого - ваши фигуры, а мозг - вы сами. Одновременно управлять всеми этими щупальцами, чтобы сделать их взаимодействие как можно более эффективным, - залог успеха, но при этом очень сложная задача, требующая и образного мышления, и интуиции. Как то, так и другое, есть у каждого из нас, но имеет бесконечный потенциал для развития. А развивается именно так, на практике. Пользу же несёт, разумеется, не в одних только шахматах. Вообще, перечислять условия успешной игры в шахматы можно долго: к уже названному нельзя не добавить, скажем, психологическую составляющую.

Турнир по быстрым шахматам, посвященный Дню города Пушкина (Шестой этап Кубка МО г. Пушкин) - 28.06

Рапид, или шахматы с контролем времени по 15 минут человеку на партию, - одна из трёх дисциплин, в которых существует установленная ФИДЕ (международной шахматной федерацией) система рейтингов. Кроме рапида, к этой тройке относятся классические шахматы (в среднем 90 минут на партию + 30 секунд в качестве добавки за каждый ход. Но бывает и больше!) и блиц (5 минут на партию). Я в рейтинг-турнирах по блицу и рапиду никогда не участвовал. И не потому что не было желания (хотя, наверное, его и не было), а потому что рейтинги в этих дисциплинах появились сравнительно недавно, уже после того, как я "завязал" с шахматами.

Ко всему, за свою шахматную "карьеру" я провёл не один десяток партий с контролем по 25 минут на партию, 15 же оказалось почти в новинку.

15 минут - это очень-очень мало, но:
  • это возможность сыграть целый турнир за один день;
  • это шахматы, где главным образом полагаешься на интуицию, а не на расчёт вариантов, как в классике;
  • это проверка нервной системы на прочность в условиях, далёких от боевых (если результат не первостепенен).
Итак, что принесли мне 7 туров:
  • 7 разных дебютов! Пора было уже наигрывать кое-какие схемы, которые пригодятся мне на Heart of Finland всего через неделю с небольшим. Конкретные схемы дают больше перспектив для комбинационной игры, комбинационная игра доставляет настоящее удовольствие!
  • 3 очка. А набирались они так:
    • в 1, 3, 5 и 7 (то есть во всех нечётных) турах я играл белыми, и мне попадались безрейтинговые противники [закономерность #1]. И в первых трёх случаях одолеть их не составило особого труда: с самого начала партии мне удавалось создать условия для уничтожающей оборонительные ряды оппонента атаки. А к 7-му туру я попросту очень сильно устал...
    • во 2, 4 и 6 турах (то есть во всех чётных) мне попадались местные тренеры, а играл я все эти разы чёрными [закономерность #2. Подозрения, что что-то тут нечисто, живы во мне до сих пор ;)]. Рейтинги у каждого из них были значительно выше моего. А ещё, первый из них - мастер спорта и тренер Максима Матлакова - международного гроссмейстера, на данный момент третьего по рейтингу среди петербургских шахматистов; а третий - международный мастер. А теперь учимся видеть в поражениях позитивное ;)
      • вчера я впервые в жизни сыграл с международным мастером;
      • в первых пяти турах я неизменно атаковал, пытался плести кружева комбинаций самостоятельно, а не дожидаясь ошибки противника;
      • я уверен, что во 2-м и 4-м турах, несмотря на силу моих противников, у меня были шансы на победу, но, к сожалению, стиль игры оппонентов вынуждал тратить на обдумывание ходов значительно больше времени, чем в нечётных турах. В результате во 2-м туре я попросту просрочил время.
    • и разочарование дня: последним ходом в 4-м туре в уже проигранной позиции (к которой привела пара допущенных из-за нехватки времени оплошностей) я отдал ферзя. Отдал умышленно, но, к сожалению, чуть ошибся. Подвинь я фигуру всего на одну клетку дальше, и результатом партии была бы ничья: после единственного вынужденного хода моего оппонента, несмотря на его преимущество в две ладьи и "толпу" пешек, на доске стоял бы пат. Но (!) 2 секунды до "падения флажка" (анахронизм в то время, когда даже блиц и быстрые шахматы играются с электронными часами) мою ошибку объясняют сполна.
Редкая фотография на тему "Шахматы и я" :)
А ещё во время 6-го тура начался матч 1/8 финала ЧМ по футболу Чили - Бразилия. По просьбам ряда участников в соседнем помещении включили трансляцию :) После окончания последнего тура трансляцию включили и в игровом зале, и награждение проходило на фоне футбола на большом экране) А передо мной два участника турнира по шахматам решили обсудить сборную России по футболу. Перед ЧМ читал в чьём-то интервью: "Не выйдут - скажут: потому что Дзюбу не взял". Угадайте, какую причину плохого результата нашей сборной я услышал вчера на закрытии шахматного турнира?)

Помимо того, что вчера я впервые поучаствовал в рейтинговом рапиде, я также отлично погулял по Пушкину в первой половине дня. Не сказать, что мне очень понравилось там (я побывал в Пушкине всего во второй раз, а первый был так давно, что и этот выглядел словно первый; и возможно, мои полуслучайные блуждания с периодическими взглядами на карту приводили меня совсем не туда, куда нужно), но в районе двух часов дня, когда город проснулся, я даже успел проникнуться атмосферой праздника (Дня города).

В общем, день удался на славу! И даже погода не подвела :)

Часть для любителей шахмат


Важно:

  • если вы не видите ниже интерактивные доски для просмотра партий, вам нужно:
    • зайти на страничку Security в Java Control Panel;
    • поставить Security Level для Java Content in browser на минимальный уровень (который почему-то называется Medium);
    • добавить в исключения два адреса
      • chessstuff.googlecode.com;
      • chessstuff.googlecode.com/svn/deployChessViewer.js;
      • Правильнее было бы сказать, что добавить надо только один из них, но я не стал тратить время, чтобы определить опытным путём, какой, после того, как добавил изначально оба.

      • и по всей видимости, перезагрузить компьютер. Перезапуск браузера лично мне не помог.
    • По умолчанию в нижней части доски открыта вкладка Games, а вам предлагаю открыть вкладку Annotations: там иногда встречаются мои комментарии.



    Так началось для меня возвращение к рейтинг-турнирам :)


    Провал на середине дистанции. Одно из самых быстрых моих поражений в качестве кандидата в мастера. Противник - 2002 г.р. Но рейтинг у него заметно выше, а среди шахматистов до 16 лет он 128-й в мире. И главная неприятная новость: он очень быстро делал ходы. А когда противник почти не тратит своего времени, это означает, что у тебя его фактически в два раза меньше... Не зря в блице и рапиде его рейтинг ещё выше.


    И моя победа в заключительном туре. Наполненная комбинациями игра (которая мне так нравится), несмотря на рано начавшийся эндшпиль.

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

    понедельник, 2 июня 2014 г.

    Kivy App Contest 2014

    Ещё вчера днём в "Итогах мая" писал о том, что жду трёх результатов, непосредственно связанных с тем, на что я потратил большую часть последнего месяца весны. В двух случаях было, к тому же, непонятно, когда же станут известны итоги. Вчера вечером остался лишь один такой случай. О другом - оставшаяся часть поста.

    Совершенно случайно наткнулся в марте-апреле на анонс конкурса по разработке приложений (помнится, гуглил тогда что-то конкретное по связке Python + GUI).

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

    О конкурсе


    • собственно, страничка соревнования;
    • обязательным условием являлось написание приложения на фреймворке Kivy для Python'а (поддержкой этого фреймворка и занимаются организаторы). Фреймворке, насколько я понял, не пользующемся большой популярностью. Причём, наверное, не пользующемся ей от недостаточной раскрученности. А конкурс - отличный повод расширить круг тех, кто знает, что такое Kivy, и им пользуется, а заодно увеличить количество публично доступных и способных завлечь новых разработчиков приложений;  
    • конкурс проводился во второй раз. Первый имел место в 2012. Я тогда знать не знал обо всём об этом (да и на Python'е написал к тому моменту лишь несколько олимпиадных задач суммарно строчек на 50). И не один я не знал: всего 11 человек поучаствовало в тот раз. Это при не менее способствующей творчеству теме "Игры". Планшет за третье место при таком числе участников смотрелся многообещающе. А при ближайшем рассмотрении достаточно слабенького на мой вкус проекта-победителя - так и вообще...
    • на разработку отводился месяц (начиная с середины апреля). Тема конкурса (Education) была анонсирована с началом этого периода;
    • участвовать можно было как в одиночку, так и командами;

    О фреймворке

    • Kivy App устроено так: программе на Python'е сопутствует файл *.kv, позволяющий средствами очень удобного языка (kvlang'а) описать GUI и графические примитивы. Вынесение графической части за пределы кода, отвечающего за основной цикл работы программы, и описание её на другом, лучше соответствующем цели языке, чем-то напомнило html / каскадные таблицы стилей, живущие независимо от JavaScript'а, хоть и тоже на стороне клиента.
    • Эти "каскадные таблицы стилей" (возможно, это только моя ассоциация, а вам kvlang их и не напомнит), как и Python, "вынуждают" программиста оформлять код легкочитаемым и унифицированным образом: отступы играют здесь ту же роль, что и в Питоне;
    • В описании графики (аналогия с Java Script Canvas, но в данном случае можно обойтись и без Python'а, воспользовавшись только разметкой на kvlang'е) замечены вкрапления элементов, знакомых мне, в первую очередь, по OpenGL: translate/rotate/scale/что-то вроде стека модельно-видовых матриц, и тому подобное.
    • Он просто шикарно документирован! Вы это слышите из уст человека, который ещё осенью поносил документации на MSDN (нравящиеся, во всяком случае по моему впечатлению, среднестатистическому программисту) на чём свет стоит! Документация Kivy представлена в двух вариантах: как в превосходно собранной 1000-страничной pdf-ке, которую было очень удобно читать с планшета в транспорте, так и на сайте. Плюсы (обоих вариантов): 
      • "связность" по ссылкам внутри документации зашкаливающая, так что информацию о любой упоминающейся детали можно быстренько уточнить; 
      • документация богато снабжена скриншотами, примерами работоспособного исходного кода;
      • оформление (цветовыделение, курсив, и тому подобное) позволяет быстро выхватывать из контекста то, что действительно важно.
    • Кросс-платформенный. Один и тот же код, обещают нам, можно будет собрать в работоспособное приложение и под Android, и под iOS, и под MacOS, и под Windows. Одна неожиданность: чтобы собрать приложение под Android, нужно воспользоваться Linux'ом, а вот под, собственно, Linux приложение не собрать.
    • Больше ничего писать не буду, посмотрите и попробуйте сами: мне кажется, фреймворк того стоит!

    О моём проекте

    Вначале предлагаю посмотреть, что у меня получилось:


    Замечания насчёт видео:

    • FPS в реальности не настолько плохой: в движении рывками виноват Screencast-O-Matic, при помощи которого я делал это видео. Там подходящих настроек не обнаружилось; тратить время на поиски другой программы не хотел, раз одна уже была когда-то установлена. Кстати, посоветуйте что-нибудь удобное и качественное для создания скринкастов;
    • но, когда "на сцене" появляется много колбочек, FPS всё же резко падает. Ниже о том, почему;
    • вы видели обучающий уровень 0 и начало уровня 1. В текущей версии есть ещё уровни 2 и 3, а также простая и задокументированная возможность добавлять какое угодно количество пользовательских уровней. Все они устроены одинаково:
      • на конвейере могут появляться только вещества из специального списка 1 (для каждого уровня список свой);
      • цель - получить в ходе реакций любые X различных веществ из Y, представленных в отдельном списке 2 (для каждого уровня список свой);
      • можно пополнять базу веществ (и в частности, задавать им цвет) и реакций (таким же простым, понятным рядовому пользователю, догадавшемуся открыть readme.txt, способом. К слову, после прохождения третьего уровня приложение само посоветует пользователю сделать это). Допустимо сколько угодно конечных продуктов реакции.

    Несколько слов о процессе разработки:

    • Вначале, когда я только-только узнал о том, что вскоре начнётся конкурс, и принял решение поучаствовать, я думал, что он вновь будет посвящён разработке игр. Первая мысль: нужен художник-дизайнер! К сожалению, на мой призыв один хороший знакомый, подходивший под описанное в предыдущем предложении желание, ответил, что время выделить не может... А тут подоспел и анонс темы конкурса, после которого я решил, что самостоятельно постараюсь справиться: Education App вам не игры. Но, конечно, с художником было бы лучше. Например, был бы какой-нибудь фон на околохимическую тему на дальнем плане. А ещё мне бы колбочки нарисовали по-человечески. А так, колбы, которые вы видите, представляют собой по 4 кривые Безье с подогнанными мной параметрами, ну и ещё пару линий.
    • Занятный момент: вы видели, что в каждой колбочке находится "жидкость". Так вот, чтобы она удачно заняла пространство, хотелось запихнуть внутрь колбы прямоугольник со скруглёнными углами. И вот незадача: примитив "многоугольник со скруглёнными углами" добавлен в версии 1.8.1 фреймворка Kivy, а последняя поддерживаемая Windows версия, - 1.8.0... В результате подгонял самостоятельно из обычных эллипсов ;) 
    • Торможение, по всей видимости, вызвано использованием большого количества NumericProperties. Каждая колбочка - это виджет, описанный в *.kv-файле. Чтобы задавать положение колбы python'ом, нужно сделать его [положение] этим самым NumericProperty. Чтобы задавать надпись на колбе, StringProperty. Чем больше properties в программе, тем медленнее работа, - говорят лучше знакомые с фреймворком люди. Наверное, этот недочёт должен обходиться более адекватным способом, нежели отказом от большого числа виджетов, но я слишком поздно понял, что все силы стоит бросить именно на то, чтобы понять, как его обойти.
    • Раз сказал про надписи, упомяну как нельзя лучше подошедшую мне особенность фреймворка: внутри label'ов поддерживается упрощённый html, благодаря чему отображение индексов в формулах, разноцветных надписей, выделение главного полужирным/курсивом не создаёт никаких проблем. Помню, почти 7 лет назад, когда я делал свои самые первые шаги в программировании, мне аналогичных возможностей очень не хватало в Borland Delphi 7.
    • Занимался проектом примерно две недели. Иногда тратил на него буквально по часу, а иногда и весь день. Спектр возможностей фреймворка изучал, читая документацию в метро и одновременно обдумывая, как (и можно ли? стоит ли?) интегрировать каждую новую возможность, о которой только что узнал, в свой проект.
    • Закончил, как обычно, в последние минуты... :) Не получается пока по-другому ни с чем!.. Последний коммит - за 19 минут до дедлайна, описание и скриншоты - в оставшиеся 19 минут (а за окном в тот момент - 3 часа ночи...).
    • Да, у вас есть возможность посмотреть код, но не делайте этого, пожалуйста! Я знаю, что текущая версия лечится только двумя способами:
      • рефакторингом,
      • а то и вообще переписыванием проекта с нуля. Благо < 1200 строк суммарно на Python и kvlang это не так уж и много для слова "переписать".
    Я также знаю, что "плохо" - слишком мягкое слово для двух файлов с кодом на весь проект... Подождите, я ещё не сказал, что работа от начала до конца велась в Far Manager'е?) 
    В общем, привычки олимпиадника давали о себе знать, но в июне-июле непременно этот проект поправлю и больше так не буду: мне самому не понравилось каждые 5 минут в последние часы перед дедлайном искать среди 900+ строк main.py ту, которая нужна мне в настоящий момент.
    • Основная причина плохой структуры кода - то, что он разросся раза в два за последние три дня написания. И было в те часы уже не до того. Равно как и перебраться из Far'а в какую-нибудь IDE, а также разнести код по разных файлам - хорошие начинания, требовавшие вложений времени, которые рисковали не успеть себя оправдать. В общем, начинать надо было, не отталкиваясь от Far'а и одного файла, тогда бы и в конце проблем было бы на порядок меньше.
    На тему того, почему выше вы видели видеоролик, а не ссылку на работоспособное приложение:
    • В 20-х числах мая я пытался собрать приложение под Android, вчера попытался сделать это же под Windows. На данный момент оба начинания не увенчались успехом: что *.apk, что *.exe у меня есть (только *.apk пока не умею скидывать кому-нибудь, не подключив его устройство к своему ноутбуку с Ubuntu), но оба они вылетают с ошибкой при запуске. Пока что разбираюсь, что не так. Как будет, чем поделиться, непременно поделюсь. 
    • А чтобы запустить проект из исходников, требуется предварительно слишком много всего установить, чтобы я предлагал этим кому-нибудь заниматься :)
    На тему того, почему конкурс начался в середине апреля, закончился в середине мая, а пишу я о нём только в начале июня:
    • Анонс результатов должен был появиться 20-го мая (по GMT, то есть не позже 3 ночи 21-го мая в нашем часовом поясе). Я с нетерпением ждал этого момента. 
    • Тем не менее, вечером 20-го мая на сайте появилась следующая запись (обратите внимание на орфографию в двух последних предложениях: кажется, писавшие это долго не спали, пытаясь успеть к ими же поставленному сроку :)
    • Потом орфографию всё же поправили) 
    • И наконец, 1-го июня результаты были опубликованы.

    Мои ожидания


    • В середине апреля я поставил себе цель (одну из тех самых X целей на год) - взять один из 8 ценных призов (одно из трёх первых мест либо победа в одной из пяти специальных номинаций: см. сайт). Информация сейчас куда-то пропала, но призы были солидные: так, за одно из трёх первых мест участник получал смартфон/планшет (не на выбор ;), а в зависимости от места) из линейки Google Nexus, бесплатный онлайн-курс английского/французского с инструктором (а вот тут на выбор ;), и мой был бы очевиден, достигни я результата-мечты), привилегии на год на GitHub'е и что-то ещё. 
    • Ставя эту цель, я ориентировался на прошлый конкурс с 11 участниками, когда, ко всему прочему, даже проект-победитель отнюдь не впечатлял. 
    • За сутки до крайнего срока внесения изменений в проект я, в числе 177 участников (да, электронные адреса в массовых рассылках в наши дни скрывать становится всё менее и менее модно...), получил deadline reminder. "177 участников" - ключевое словосочетание в предыдущем предложении :) Ожидания сразу приуменьшились, хотя я ещё грезил номинацией Best App Idea: расширяемость под нужды конкретного пользователя, имеющего своей целью запомнить конкретные хим.реакции, должна была быть высоко оценена.
    • Приза мой проект удостоен не был, то есть цель, формально говоря, не выполнена, но я всё равно доволен! Доволен невероятно 
      • тем, что поучаствовал (как писал выше, впервые участвовал в чём-то подобном), 
      • тем, что на сей раз я сам ставил себе задачу, а не выполнял кем-то навязанное задание. Границ для творчества практически не было, и это прекраснее всего!
      • тем, как шёл процесс разработки,
      • тем, чему научился за это время, 
      • тем, что в результате многое, пусть далеко не всё, что задумывалось, получилось. 
      • И ощущаю себя причастным к конкурсу, объединившему участников from over 56 different countries, как гласит страничка соревнования.
    • Да и не совсем с пустыми руками останусь: любимый приз программиста-олимпиадника - футболка - не обошла меня и в данном случае: моё приложение среди 53 valid entries that could be scored and used for the contest. 53 человека пополнят свой гардероб новой вещью. Будет забавно, если на ней будет изображён этот логотип: с ним есть риск привлекать слишком много внимания ;)

    А закончу пост в обычном стиле: делитесь идеями, соображениями, знакомыми художниками и опытом участия в подобных мероприятиях: не один же я в них участвую!

    P.S. Традиционный хронометраж: на написание (вы не подумайте: не приложения, а лишь этого поста) затрачено ~ 3h30, разбитые на вчера и сегодня.


    воскресенье, 1 июня 2014 г.

    Итоги мая

    Pre Scriptum. По-хорошему, судя по тому, что гуглится, я должен был написать "Prae Fatia", но согласитесь, что Pre Scriptum выглядит понятнее?
    Друзья, как и всегда, призываю вас активнее участвовать в обсуждении! Не просто так прошу: ваши идеи способствуют тому, что мои собственные расцветают, обретают новые формы! И не говорите, что у вас нет идей: не поверю! ;)

    Основная часть

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

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

    • по 3.05 - coursera, см. предыдущий пост;
    • по 15.05 - python + kvlang;
    • по 24.05 - французский;
    • по 31.05 - биоинформатика;
    Подробности, касающиеся трёх последних периодов, будут, как только будут результаты. А будут они, соответственно:
    • непонятно когда, т.к. должны были быть опубликованы 20-го мая, а теперь отложены на неопределённый срок. Это и была та самая вторая цель, которая должна была быть раскрыта в мае, как я писал в "Итогах апреля";
    • "может, через месяц; может, через два";
    • 25.06;
    А в перерывах находилось время и на CS центр, и на соревнования по программированию, и на многое другое (многое другое, в свою очередь, не имело никакого отношения к программированию). Всё-таки разнообразие в видах деятельности способно увеличить продуктивность в разы и заодно не дать забыть, что такое энтузиазм!

    Выдержка из того, чем ещё запомнился мне май 2014-го:
    • первой вылазкой в музей с декабря;
    • эмоциями от достижения первой из поставленных на год цели;
    • первым в жизни очным общением с французом;
    • первым визитом к стоматологу за ~ 6 лет;
    • первыми оценками в весеннем семестре Computer Science Center'а;
    • первым в жизни экзаменом по французскому (никак не пересекается с первым общением с французом: то случилось раньше);
    • последним занятием нашего кружка по программированию в этом учебном году. За год накопилось столько мыслей, что все они непременно будут собраны воедино, отшлифованы и заключены в отдельную заметку. Я в процессе, это быстро не сделается :)
    • первой футболочкой Google Code Jam, с 4-й попытки наконец-то взятой;
    и не только.

    А ещё я почти перестал следить за спортом. И если вам меня не понять, то, наверное, не понять и насколько это прекрасно: получить столько времени и не тратить эмоции по сомнительным поводам. Я, скажем, не имею ни малейшего понятия о том, как вчера сборная России по футболу сыграла со сборной Норвегии. Неплохо было бы ещё и не знать о том, что они вообще играли вчера. Ведутся работы и в этом направлении ;) Чемпионат мира по хоккею (с очень сомнительными по силе составами едва ли не всех топовых сборных за исключением (да и то с натяжкой) сборной России. Опять-таки, детали, которые было бы неплохо и не знать вовсе) я пропустил целиком и полностью. На очереди ЧМ по футболу! Что-то, конечно, посмотрю, но верю, что "что-то" не перекроет половину всех игр, как это случалось раньше, и даже не имеет теоретических шансов к ней приблизиться.

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

    Перехожу к статистической составляющей:



    Комментарии. Их, как всегда, много:

    • новая область, которую я предлагал в "Итогах апреля" угадать по значку, носит гордое имя "Здоровье". Значок - попытка изобразить что-то похожее на эмблему "Всемирной организации здравоохранения", но сама область включает в себя отнюдь не то, о чём можно было бы после такого начала подумать. В ней ежедневные физические упражнения, прогулки, в ней будет бег (верю, что не так уж долго осталось по нему скучать), будет и многое другое. Поскольку физическую активность следует поощрять, потолок сравнительно высок, а баллы набираются не так сложно/долго, как в некоторых других областях;
    • перевод упражнений в баллы, а также изменённый способ пересчёта результатов дня по ТЕД в CSS, безусловно, сыграли свою роль в том, что теперь хотя бы положительных сумм за день стало намного больше, чем было раньше. Но заслуга в этом и у того, что месяц в целом был проведён заметно продуктивнее предыдущих;
    • по "потолкам", да и по баллам в целом, должны бы неплохо выделяться два последних обозначенных в начале поста периода;
    • до сих пор затрудняюсь придумать для ряда занятий адекватный эквивалент результату в баллах. Временами доходит до 0,01 балла за строчку кода... Вроде, бóльшую чепуху придумать надо ещё постараться, но как ещё связать друг с другом плотную работу над проектом (тот самый период "python + kvlang") и систему начисления баллов? Я, кстати, открыт для идей и предложений ;)
    • отдельный разговор о сне (бонус, левый верхний угол). В начале месяца мне казалось, что я добился своего: я стабильно ложился в 21-23, вставал в 6 (по будильнику, но без проблем и без желания подремать ещё). Потом случился один вынужденный срыв, когда я лёг не то в 6, не то в 7 утра... Вроде, удалось выправиться, и тут ещё раз - 4! Оба вышеупомянутых случая примечательны тем, что я пробовал на себе двухфазный сон, потому что на непродолжительное время встать требовалось через час после отбоя. Вторая фаза длилась оба раза в районе 3 часов, и, надо сказать, что 1+3 часов для сна мне оба раза хватило с лихвой (и ощущения были не хуже, чем после обычных 7-9 часов сна). Сегодня, если удастся заснуть днём, случится третья попытка: уже по всем канонам, с фазами, разнесёнными друг относительно друга почти на полдня. А вы когда-нибудь пробовали двухфазную/многофазную схему сна? Если да, хочется впечатлений/ощущений/выводов насчёт того, стоит ли игра свеч.
    • отдельные слова про ТЕД:
      • аж 5 строчек без единой галочки я насчитал. Да, это очень плохо... 
        • Но только от одной из этих строк я откажусь на июнь. Речь, как ни странно, о французской лексике (вторая сверху строка): имеющаяся на данный момент в Anki (вкратце, это "метод воронки для ленивых". На подробности когда-нибудь отведу целый пост) база слов не выдерживает никакой критики: там столько всего лишнего и при этом не хватает такого количества слов, которые нужны, но вечно забываются в самый неподходящий момент... Один из "слонов" (это, кстати, антоним к слову "лягушка" ;) Как всегда, отсылаю вас к "Тайм-драйву") на июнь - навести порядок в базе.
        • Остальные четыре будут просто светиться зелёным в первый месяц самого зелёного времени года. Вот увидите!
      • рекорд месяца только в 4 галочки за день не впечатляет. Наверное, это обратная сторона изменений, внесённых в процесс пересчёта баллов.

    От комментариев к майским таблицам переходим в таблицам июньским.

    Suomi vastaisku! (надеюсь, все слова правильно употребил...). Новая загадка: откуда я взял глагол? (в словарь не смотрел, есть конкретная привязка к финскому варианту одного очень многим известного названия)

    Думаю, по подписи вы заметили основное отличие таблиц на май и июнь. Потолок по возвращённой области поднят на 3 балла относительно февраля-марта, планы гигантские!


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

    Что поменялось?
    • количество пунктов. Ну, вы сами видите ;)
    • кроме отдельных пунктов, есть сгруппированные по блокам. Имена блокам - биоинформатика, шахматы и французский. Последний - следствие нескольких традиций (точнее, пока ещё "надеюсь, традиций"), сформированных по итогам упомянутого выше периода 16-24 мая;
    • столбик, озаглавленный "-$" (к слову, не имеющий никакого отношения к валюте :) Лишь расшифровка - долг), отныне будет перед началом каждого месяца содержать информацию о балансе сделано / нужно было сделать. Такие же показатели будут вычисляться по итогам месяца и венчать таблицу. Сравним - сделаем предметные выводы;
    Не побоюсь снова выделить основные области на наступивший месяц. Это:
    • шахматы,  совсем скоро (17-25.06) играю в первом за почти 6 лет рейтинг-турнире, впервые за ещё больший срок появившись в спортивной школе, где занимался с 2001-го по 2008-й;
    • финский, немногим больше месяца до момента, когда его можно будет попробовать применить; 
    • французский и биоинформатика достаются в наследство с прошлого месяца. Я вошёл во вкус :) 
    За сим всё. Делитесь опытом и соображениями, отгадывайте загадки! Генерируйте и воплощайте в жизнь свои идеи, творите!

    P.S. На написание затрачено чуть менее 2,5 часов. Неплохо для тех же двух с половиной часов сна. Спокойного вам июньского дня. А у меня сиеста (или вторая фаза сна, как вам угодно) до очередного раунда Codeforces.
    P.P.S. Вы не думайте, что 2 часа сна - это норма. Нормой будет 4-5 часов ночью + 1-2 днём, если смогу приучиться спать в светлое время суток и не будет противоречий с распорядком дня. Сегодня же во всём виноват yandex.contest :)