Как можно попреподавать программирование
Егор СуворовКонтекст
Рассказывать я буду про свою ситуацию и около: преподаю C++ на одной из топовых бакалаврских программ в России. Здесь лояльная администрация, очень высокая интенсивность и нагрузка для вообще всех студентов (не должно быть скучно даже победителям международных олимпиад, в хорошем смысле), если кто-то не справляется с требованиями — отчисляется/переводится на раз-два, долги не накопить. Сейчас обитаем в питерской Вышке (как и положено, около-IT пост двухлетней давности уже частино устарел).
Это довольно сильные отличия от места вроде такого или такого. В частности: аудитория не очень сильно сегментирована (особенно после 1-2 курса), кто не знает массивы/переменные/циклы или кому "не упал" какой-нибудь предмет — вылетает, студенты приучены сдавать домашки регулярно (поначалу, правда, в день дедлайна) или хотя бы забивать на них из тактических целей по минимизации долгов. При этом студентов стараемся уважать, входить в положение, любить, регулярно опрашивать про преподавателей и платить неплохую стипендию. Не понимаешь, зачем предмет — подробно расскажем, пролил кофе на ноутбук за два дня до дедлайна — можно перенести.
Дальше речь конкретно про людей из индустрии в ВШЭ в Питере, мы клёвые. Не путать с ФКН в Москве, как абитуриенты — у них тоже крутая программа, но другая специфика, мы тоже не вчера появились.
Некоторые штуки в районе преподавания даже оплачиваются, хотя, конечно, зарплату питерского сеньора целиком через преподавание не получить. Много чего можно делать онлайн из любой точки мира, необязательно в Питере. Если что-нибудь заинтересовало — спрашивайте тут или в личке. Кстати, от бумажной работы стараемся максимально преподавателей ограждать, заполнять матрицы компетенций или бегать с обходным листом точно не надо.
Самый простой способ познакомиться с конкретно нашими студентами — это прийти и послушать их защиты проектов/НИРов/дипломов. В прошлом году были онлайн, в этом году надеемся очно в Питере (но трансляцию тоже можно обсудить). Обычно есть итерация в июне и в декабре/январе (тут точно не помню). Можно и нужно задавать неудобные вопросы — вам потом с этими товарищами потенциально работать. Или можно почитать их причёсанные описания проектов у нас в блоге на Хабре. Там сейчас в основном первый курс и четвёртый (бакалаврские дипломы).
Дальше — что можно поделать.
НИР ("научно-исследовательская работа")
Это проект студента на полгода. Обычно 3 курс, но на 1-2 тоже особые энтузиасты иногда берут. Нужно предложить содержательный проект в теме, где вы шарите, и помочь конкретному студенту правильно в ней прокопаться в течение полугода, получить результат и защитить его в конце. Целенаправленно учить и давать домашки необязательно. Тонкости: просто дать пофиксить багов/раскатать прод на кластер или закодить тривиальную перекладывалку JSON'ов нельзя, надо что-нибудь хоть немного новое для этого мира. Хотя бы: "придумайте, как именно переложить JSON удобно и быстро, эти десять существующих инструментов нам не подходят потому-то".
Самое то поэкспериментировать руками студента, если до какой-то интересной задачи всё руки не доходили. Но, опять же, осторожно: нельзя просто так выдвинуть требование "пишем на Rust", надо технически аргументировать, причём чем старше курс — тем выше уровень аргументации. Плюс нужно быстро адаптироваться, если окажется, что задача уже на самом деле решена. Представьте, что студенту в идеале нужно честно описать проект и получить хотя бы +20 на Хабре, плюс разумно ответить на все ехидные комментарии.
Направления бывают очень разные. Смысл для студентов — в разнообразии. Я вот руководил проектом по Software Engineering (рисовалка для отладки графовых задач в Visual Studio, сделанная до появления Debug Visualizer для VSCode), но почему-то гораздо больше проектов из ML.
Если задача большая, можно взять несколько студентов, но защищаться они должны независимо друг от друга. За результат отвечает студент, но с руководителя спросят в середине в конце семестра: "как дела у студента?".
Проекты презентуются два раза в год: сентябрь и январь-февраль. После ярмарки студенты могут подаваться на проекты, им можно устраивать собеседования и выбирать себе падавана. В Питере пул проектов у ВШЭ, Computer Science Center и ещё пары мест пересекается. Чем-то похоже на летние стажировки (но это не full-time работа для студента + надо больше обосновывать некую научность/инженерную сложность) или Google Summer of Code.
Дипломная работа
Hard-версия НИР: идёт год, в конце студенты должно быть не стыдно показывать проект ни своим потенциальным коллегам, ни комиссии, которая умеет ходить по первым ссылкам из гугла прямо на защите и задавать неудобные вопросы. Множества, кстати, пересекаются :) Рекомендуется сначала всё-таки попробовать формат НИРа.
Командные проекты на 1-2 курсах
Чем-то похоже на НИР, но другой формат и цели: студенты работают в командах по 3 человека, фиксированный основной язык (C++ на 1 курсе, Java/Kotlin на 2 курсе), тема любая на усмотрение команды. Задача ментора (это уже не "научный руководитель") — помочь команде сформулировать себе реалистичную задачу и тему, поставить milestones, вовремя попросить помощи у преподавателей и гугла, чётко рассказать на защите "что получилось и почему приняли такие технические решение".
Для многих студентов это первый опыт работы над кодом а) вместе с кем-то; б) когда код живёт дольше двух недель. Первый вкус legacy, merge conflicts, отсутствия документации и кривой архитектуры. Поэтому техническая сложность тут не нужна, нужно сделать что-нибудь типичное, но непростое и, по возможности, прикольное.
Так что язык и технические навыки для ментора непринципиальны, а вот soft skills как раз важны, чтобы помочь команде не сгинуть. В НИРах на старших курсах — наоборот: студент сам про себя всё знает, а научрук помогает открыть новую область.
Code review домашних заданий
На 1-2 курсе есть годовые предметы "C++" и "Java" соответственно (я уже говорил, что никому не должно быть скучно даже на первом курсе? :). Хочется дать не просто синтаксис, но и красоту, идиоматичность, читаемость и вот это вот всё. До своей ОС, кластеров и архитектурам не доходим (это к спецкурсам, см. ниже), а вот знать и уметь в свой язык программирования надо (любить необязательно).
Я больше знаю про C++, поэтому расскажу про этот предмет.
Помимо лекций и сложных домашек все обязательно проходят code review. Хотя бы дважды на каждый код. Вот этим и нужно заниматься (хоть целиком онлайн): на входе — условие домашки, сколько-то работ студентов, их вопросы по проверке, на выходе — оценки и комментарии для студентов, ответы на вопросы. Оценка ставится в том числе по субъективному ощущению проверяющего. Из-за этого проверяющих ищем хотя бы на половину семестра ("модуль" в терминах ВШЭ), а лучше — семестр или целый год, чтобы у студенты был шанс привыкнуть к требованиям.
Сейчас вот у меня студенты первого курса за две недели написали std::vector с placement new, move-семантикой и строгой гарантией исключений, а я задолбался для этого делать автотесты. Да, велосипед, а для не-велосипедов есть НИРы и проекты.
Нагрузка регулируется: в идеале взять группу целиком (~18 человек), но можно и меньше. Поначалу на одного человека может уходить вплоть до 45 минут, а дальше можно навостриться и подобрать баланс, чтобы уходило минут 5-10 на привычном задании.
Проведение практик
Также по предметам есть "практики"/"семинары". Один преподаватель, ~18 студентов близкого уровня, одна пара в неделю для передача мудрости. Лектор (он же главный по курсу) обычно как-то руководит практиками, чтобы там происходило что-нибудь полезное для понимания лекций и выполнения домашек.
Например: на первой паре по C++ надо добиться, чтобы у всех заработал компилятор, отладчик, санитайзеры, а также получилось создать какой-никакой Pull Request на GitHub. Около домашки "распарсите BMP" полезно показать hex dump какого-нибудь файла и распарсить его глазами. Возле placement new можно выдать всем тесты на std::optional, ходить по аудитории и убеждаться, что все страдают по делу и чему-то учатся, а не потому что забыли переключить раскладку. Или в конце модуля (половина семестра) может быть полезно устроить разбор. Всегда важно отвечать на вопросы студентов по домашкам и языку в целом.
Сейчас пока онлайн, но в апреле (4 модуль) выходим в оффлайн в масках. Вроде как некоторым преподавателям при желании можно и онлайн остаться.
Проведение предметов
Спецкурсы
Hard-level. Они же "предметы по выбору". Возникают на 3-4 курсах. Тема — на ваш вкус (обычно по программированию), длительность — обычно 1-2 модуля (каждый по 6-10 недель). Вы рекламируете свой курс, на него записываются студенты (в зависимости от узости области может быть от пары человек до несколько десятков), вы проводите курс и в конце ставите оценки студентам. А студенты, соответственно, вам.
Например: "программирование в ядре Linux" (был такой), "Scala и Kotlin" (регулярно есть такой), "DevOps и как выбрать клёвый цилиндр" (не было и близко).
При этом спецкурс — это не доклад и не десять докладов. Доклады студенты могут и так посмотреть, абстрактные ответы для system design interview могут нагуглить, а вот пощупать руками под руководством и получить опыт — вот что важно. Хороший курс, мне кажется — это фундамент для некоторой области, состоящий из хоть как-то структурированной теории (пусть субъективно!) и упражнений, которые можно а) сделать; б) хотя бы бинарно оценить. Хотя и чисто теоретические или обзорные курсы, конечно, бывают.
Базовые предметы на первых курсах
Ultra-level: теперь в ваших руках базовый предмет целиком и больше полусотни студентов младших курсов. Это отдельный жанр, там больше студентов, ответственности, плюс обязательно надо управлять преподавателями-практиками.
В других вузах и не-вузах
Ситуацию "в вузе программирования нет вообще, но мы хотим, приходите и учите наших студентов хоть чему-нибудь" я не рассматриваю: опыта у меня тут ноль. По стереотипам, делать там надо примерно всё с нуля (в том числе воодушевлять студентов, которых раньше не особо трогали), это прорва работы.
Про вариант "делать один хороший курс в случайном месте" я тоже ничего не знаю. Вероятно, пост Павла Новикова из начала статьи — как раз про это.
А ещё есть школьники. Про них я тоже знаю мало, но всё же:
- Есть школы: совсем обычные, с углубленной информатикой, топовые (вроде 239 и ФТШ в Питере, СУНЦ МГУ в Москве). Вроде обычно школы хотят преподавателей на весь год, хотя в Летово в Москве вообще какая-то своя атмосфера чуть ли не с лабораториями и кафедрами.
- Есть всякие центры кружков, в том числе при школах (Аничков Дворец/СПбГДТЮ и ДОД 239 в Питере). Уровень очень-очень базовый, темп низкий. Мероприятия массовые, но по сравнению с обычным школьным классом остались только энтузиасты (или притворяющиеся ими). Я как раз в таких кружках начинал учиться программировать сам. На их базе можно делать какие-нибудь небольшие экспериментальные группы для энтузиастов, которые готовы аж полгода/год заниматься одной темой пару часов в неделю. Например, мне лет пять назад предложили изучить Android (я тогда про него ничего не знал) и провести ребятам курс по базовым Java+Android+OpenCV+управление LEGO-роботом сначала на неделю в летнем лагере, потом то же самое на полгода в городе (занятия-то один раз в неделю и домашек нет). Получилось неплохо, год-другой, потом ещё пару лет кружок жил без меня.
- Есть всякие онлайн-курсы, MOOC'и, Фоксфорды и прочие. Про них не знаю, но подозреваю, что основная цель — подготовка к ЕГЭ. Если что-то ещё, то курс просто на широкую аудиторию, а не на школьников.
- Частные летние лагеря. Я знаю только про одно культовое (для олимпиадников) место — ЛКШ (Летняя Компьютерная Школа). Обычно там только про алгоритмы и олимпиады, но с некоторого момента есть параллель P. Плюс наверняка можно приехать и провести небольшой вечерний клуб или спецкурс почти в произвольном формате.
- Есть Сириус в Сочи. Это федеральный лагерь, там проходят тематические смены для топа со всей страны, как туда попасть — увы, знаю только путь через вуз.