Общие вопросы (FAQ) по курсу

Что это за курс?

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

Что за странный формат? Что за занятия в лицее 40?

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

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

Для не-нижегородских школьников занятия, конечно, чисто заочные. Хотя если вы окажетесь в Нижнем Новгороде и захотите зайти ко мне на занятие — заходите, я буду рад вас видеть. Только предупредите меня заранее.

Чему тут учат?

Основное направление — это алгоритмическое программирование. Начиная с основ программирования, и далее в алгоритмы и структуры данных. Это то, что по-английски называется Computer Science. С существенным уклоном в сторону олимпиадного программирования (в первую очередь по линии Всероссийской олимпиады школьников), тем более что задачи на олимпиадах — это как раз задачи на алгоритмы и структуры данных.

Чему тут НЕ учат?

Мы не будем специально заниматься "техническими" вопросами:

  • Созданием пользовательских интерфейсов, кнопочек, окошек и т.д.
  • Программированием под конкретные платформы: созданием web-приложений, программированием под Android, iOS и т.п.

Мы будем изучать алгоритмы, которые лежат в основе многих таких программ (мы не будем обсуждать, как сделать кнопку "сортировать по алфавиту", но будем обсуждать, как реализовать сортировку, когда список объектов для сортировки уже есть).

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

Вы действительно будете учить?

И да, и нет. Формат заочного курса подразумевает, что существенную часть материала вы будете изучать сами. Я буду скорее направлять вас, советуя, где можно посмотреть тот или иной вопрос, на каких задачах отладить навыки, а также буду довольно активно комментировать ваши программы. Кроме того, вы всегда можете со мной связаться (контакты на главной странице курса) и задать любой вопрос.

Какой язык программирования?

Сложный вопрос, точнее вопрос с длинным ответом.

Если вы только еще начинаете программировать, то я рекомендую использовать Python 3. Теоретические материалы для начинающих я буду подбирать именно по Python.

Еще один популярный вариант — C++, но я настоятельно не рекомендую его выбирать, если вы только начинаете учиться программировать. Если же вы где-то уже научились неплохо писать на C++ (контрольный вопрос: какой тип данных вы используете для работы со строками и насколько это для вас сложно), то можете писать на C++. Теории по C++ на начальных уровнях нет, но если вы его где-то уже изучили, то она вам не нужна :) Если же вы неуверенно знаете темы уровня 1, то лучше учите питон по материалам на сайте.

Раньше был довольно популярный вариант — Паскаль. Раньше я его рекомендовал, но в современном мире единственная причина учить паскаль — если вас в школе учат на паскале, вы уже неплохо его знаете, и не хотите распыляться на два языка. На самом деле, даже в этом случае я рекомендую вам изучить питон и заниматься в этом курсе на питоне, но в принципе, если хотите, то можете заниматься и на паскале. Теории по паскалю на сайте нет, но если вы его изучаете в школе и неплохо его знаете, то теория вам не нужна :) Если же вы неуверенно знаете темы уровня 1, то лучше учите питон по материалам на сайте.

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

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

Если у вас возникают вопросы, то свяжитесь со мной.

Что от меня требуется для занятий?

От вас требуется, в первую очередь, желание заниматься. Я не ваш школьный учитель, не ваш родитель, я не могу чего-то требовать от вас; ваше присутствие здесь — дело добровольное. Я не буду вас торопить, или ругать вас, если вы ничего не делаете неделями. Но при этом понимайте, что каких-либо результатов можно добиться только регулярными занятиями; если вы хотите конкретных цифр по тому, сколько времени надо выделить, то я бы считал, что как минимум два раза в неделю часа по 2-3 выделить надо, а лучше больше. (Для школьников, которые ходят ко мне на очные занятия, я рекомендую, в добавок в 2-3 часовому очному занятию, еще примерно столько же заниматься дома.) Но следите за этим сами, я не буду стоять у вас над душой. (Родителям и учителям: если вы хотите контролировать успехи ваших детей, см. отдельный документ в разделе "О курсе", и/или напишите мне.)

Тот же принцип с моей стороны относится и к остальным вопросам: я лишь советую вам что-то, но не могу требовать. Если вы хотите выбрать определенный язык программирования вопреки моим рекомендациям — ну хорошо; и т.п.

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

А какие изначальные знания требуются? И каких классов могут быть школьники?

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

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

Я ожидаю здесь видеть школьников от 7 и до 11 класса. Если школьник сильный (участвует в олимпиадах или конкурсах по математике, или как минимум весьма хорошо знает школьную программу), то можно и 5-6 классы; есть успешные примеры когда школьники начинали заниматься и в 4 классе. Для сильных школьников чем раньше начать заниматься программированием, тем лучше. Со своей стороны я не ставлю никаких ограничений снизу по возрасту; я не буду возражать, даже если в курс запишутся детсадовцы (но и никаких скидок на возраст я делать не буду и дополнительно разжевывать материал не буду), хотя, конечно, для детсадовцев, скорее всего, от занятий особого толку не будет. Вообще, для начальной школы и, возможно, старших групп детского сада я бы лучше рекомендовал толковый кружок по математике.

Что надо сделать, чтобы начать заниматься?

Прочитайте документ "Инструкция для тех, кто здесь в первый раз" (ссылка в разделе "О курсе") и сделайте то, что там написано.

Когда можно начать заниматься? Когда "следующий набор"?

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

Единственное — во время праздников или летом у меня может быть ограничен доступ к интернету, поэтому я могу не так быстро отвечать на ваши письма, смотреть ваши решения и т.д. (Хотя стараюсь отвечать в течение суток, в крайних случаях — в течение 2-3 дней.)

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

— И как думаешь, Василич? Будет от этой работы толк?

— А вот поработаешь, Петр Николаич, увидишь!
(Лев Успенский. Сопка «Камянистка», или торжество науки.)

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

А кто вообще вы такой?

Я — Петр Андреевич Калинин, к.ф.-м.н., старший разработчик компании Яндекс, выпускник ВШОПФ ННГУ. Я в свое время активно участвовал в различных олимпиадах: бронзовый призер международной олимпиады школьников по информатике (IOI) 2001 года, золотой призер IOI 2002 года; в составе команды ННГУ дважды участник финала чемпионата мира по командному программированию ACM (ACM ICPC). Я много лет езжу преподавателем в Летнюю компьютерную школу, крупнейшую российскую летнюю школу по алгоритмическому программированию (хотя последние годы — довольно редко); я постоянный член жюри Нижегородской городской олимпиады школьников по программированию (с 2014 года — председатель жюри). С 2017 по 2019 год я преподавал в Школе анализа данных Яндекса. Я ученик В.Д. Лелюха.

В том или ином виде я учу школьников программированию с тех пор, как сам окончил школу в 2002 году (я ездил преподавателем в различные летние школы и т.п.); этот курс существует с 2013 года. Среди моих учеников — ряд участников и один победитель заключительного этапа Всероссийской олимпиады школьников по информатике (не считая моего брата Николая, в обучении которого я тоже принимал не последнее участие и который является абсолютным победителем заключительного этапа 2013 года и дважды — в 2013 и 2014 годах — золотым призером международной олимпиады школьников по информатике).

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

Вы всегда можете связаться со мной, контактные данные указаны в разделе "О курсе".

А что за сайт informatics.msk.ru?

Informatics.msk.ru — это сайт дистанционной подготовки по информатике, организованный Московским центром непрерывного математического образования (МЦНМО) и Московским институтом открытого образования (МИОО); он очень удобен для организации курсов подобных этому, и, как вы можете видеть на главной странице сайта, реально широко используется, но в первую очередь для организации очных занятий. Я не имею непосредственного отношения к этому сайту (хотя и знаком с людьми, которые его создали и поддерживают).

Этот курс строится на базе материалов с informatics и использует его в качестве тестирующей системы (а раньше вообще курс существовал только на informatics). Местами еще могли остаться ссылки на информатикс, если обнаруживаете такую, пишите мне.