Московский клуб программистов

Как обучать программистов

24.01.2019

Летопись » Как обучать программистов

Спортивное программирование

Евгений ведёт команду обнинского филиала МИФИ и готовит её к международному чемпионату ACM. Чемпионатов в мире много, ACМ самый крупный и самый известный.

Чем спортивное программирование интересно студентам? Если они толковые, им гораздо проще найти интересную работу после учёбы.

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

В чём заключается тренировка команды?

  1. Команда это 3 человека, соответственно, надо понять, кому какая роль подходит больше.
  2. Участник №1 это кодировщик. Он должен уметь быстро закодировать сортировку, красно-чёрное дерево, алгоритм Дейкстры. Он тренирует быстрое кодирование.
  3. Участник №2 это аналитик, который иногда замещает кодера. Его задача взять модель решения и представить её в виде алгоритмов: что и в каком порядке надо делать.
  4. Участник №3 это математик. Они придумывает высокоуровневые решения, которые затем надо детализировать до уровня кода. Его тренировка заключается в решении олимпиадных задач.

Главное же требование к членам команды — умение продуктивно общаться. Мало придумать алгоритм, надо быстро и доходчиво объяснить его другим членам команды, и этот навык тоже надо тренировать.

В России команды начинают принимать участие в 1/4 финала. В полуфинал могут попасть команды из разных регионов России. Но у нас проводится чисто российские игры, 1/8 финала. Это наше изобретение, чтобы на официальный тур попадали действительно сильные команды.

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

Поэтому в непечальных компаниях руководство поощряет профессиональное развитие сотрудников. Это выражается в том числе и в проведении внутренних соревнований. Задачки можно брать из прошедших чемпионатов.

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

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

Презентация в формате PDF.

Обучение

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

Есть ли золотая середина?

Мы поговорили о разных вариантах. Начали с того, чтобы выделили четыре категории обучающихся.

  1. Дети.
  2. Подростки.
  3. Студенты.

Дети

Дети, они же младшие школьники, скажем, 5–7 класс. В рамках общеобразовательной школы им надо дать представление о предмете. Тут всё, как с географией или историей — детям либо понравится, либо не понравится. Если понравится, они станут географами или историками, а нет, так просто будут знать, где находится Египет и в каком месяце декабристы устроили восстание.

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

Традиционно здесь хорош BASIC. Чуть менее традиционно — Racket.

На самом деле BASIC староват и недостаточно мощен для современных компьютеров. Двадцать лет назад ребёнка можно было увлечь рисованием линий и кружков, а сейчас нужны спрайты с альфа-каналом. Может быть даже трёхмерные примитивы.

Подростки

Мы говорим о подростках, которые уже попрбовали программирование, и решили, что им нравится. Чему их учить дальше?

Мы довольно быстро сошлись во мнении, что здесь мы говорим об уровне профессионального училища — ПТУ. Что нужно на этом этапе? Финтифлюшки уже не так важны, детишки уже не совсем детишки. Им предстоит выбор профессии, а внутри неё — специализации. Куда пойти учиться, на кого? — такие вопрос их интересуют. Значит, необходим обзор разных парадигм. Традиционно речь идёт немного о структурах данных и алгоритмах, о процедурном, структурном, объектно-ориентированном и функциональном программировании.

Языки надо давать разные, и желательно, чтобы по крайней мере один из них был востребованным и распространённым. Это может быть Python, JavaScript, C, Java, Go — что-то, с чем можно принимать участие в реальных проектах.

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

Студенты

Студенты уже выбрали и профессию, и уровень. Им нужно фундаментальное образование, потому что нигде больше они его не получат.

Важна математика для технических ВУЗОВ в классическом объеме, то есть линейная алгебра, аналитическая геометрия, матан, дискретная математика, теорвер. Это то, чему в существующих институтах должны учить первые два года.

Нельзя забывать про английский. Этот момент часто упускают, а основной поток профессиональной информации идёт на английском, причём не только в виде текстов, но и в виде подкастов, и учебных видеороликов.

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