Привет, Хабр. Меня зовут Дмитрий Демидов, я работаю бэкенд-разработчиком и поделюсь опытом создания курса-интенсива по основам программирования на Python. Я преподаю в Нетологии: начал с открытых занятий, потом стал вести лекции на курсах по Python и базам данных. Статья пригодится, если вы тоже хотите преподавать или даже разрабатываете курс. Даже если нет, просто загляните за кулисы создания образовательных проектов.
Как я дошёл до идеи сделать курс
Дмитрий Демидов
Разработчик в Яндексе и преподаватель Нетологии
Попробовать преподавание я хотел уже давно. Но меня всё время останавливали вопросы:
Что я вообще могу рассказать полезного?
Вдруг меня спросят о том, чего я не знаю?
Поэтому курса не было, а я вёл открытые занятия. Цель открытого занятия — рассказать большой группе участников про какой-то язык программирования или стек технологий, про профессию разработчика и положение дел на рынке труда. Сделать это нужно так, чтобы слушатели заинтересовались профессией, а в идеале — записались на большой курс.
Программа моего открытого занятия была примерно такой:
Какое место занимает Python в мире разработки.
Где используется Python.
Почему его любят разработчики из самых разных сфер.
Как начинать и строить карьеру в разработке.
С чего начать изучать программирование Python.
Чем занимаются веб-разработчики.
Сколько они зарабатывают.
Как учиться и не терять мотивацию.
Я старался давать максимум полезной информации, рассказывал о своём опыте и пути в профессию, давал ссылки, отвечал на все вопросы слушателей и усовершенствовал занятия в соответствии с реакцией аудитории.
Со временем программа утряслась, перестала сильно меняться от занятия к занятию, и я заскучал. Во-первых, мне стало неинтересно говорить одно и то же. Во-вторых, я хотел идти дальше, а именно попробовать преподавать: вести лекции и вебинары, давать знания.
Я стал думать, а как добавить к занятию больше именно образовательного контента. Конечно, за полтора часа сложно научить чему-то серьёзному. Но я попытался добавить небольшие блоки по основам программирования. Опыт был негативный, в эти моменты динамика явно проседала, и в отзывах участники отмечали, что это было не к месту.
В тот период я работал из дома и неожиданно для себя подсел на игровые стримы по Hearthstone. Со временем я заметил, что смотрю их не только для развлечения и убийства времени во время прокрастинации, но и учусь играть. Увидев какую-то фишку на стриме, я захотел зайти в игру и попробовать. Рейтинг в игре рос, я чувствовал себя всё более уверенно.
И мне пришла идея — а не сделать ли стрим с разработкой реального приложения в качестве открытого занятия? Стримы с программированием я тоже видел, и мне показалось, что это хорошая идея. С ней я пришел к Нетологии.
Какие задачи я ставил перед курсом
Я хотел не только попробовать новый вид деятельности — разработку и самостоятельное проведение курса — но и еще две вещи:
1. Создать курс, который я сам хотел бы пройти, когда только начинал заниматься программированием в качестве профессии
Основная проблема, которую я пытался решить — переход от теории к практике.
Я начал заниматься программированием в институте, записался на дополнительный курс по С++ на нашем факультете и так узнал некоторые основы. После института я работал в другой сфере, но продолжал в свободное время заниматься программированием: проходил курсы на только-только появившихся тогда образовательных сайтах, читал книги, зависал на Хабре.
В какой-то момент я решил сделать хобби профессией и начал готовиться к собеседованиям. Оказалось, что теория и задачи, которыми я преимущественно занимался, неплохо помогают для собеседований, но мало годятся для ежедневной работы.
Я знал основы SQL, но не знал, как подключиться к базе данных, чтобы ввести запрос.
Я знал, как сверстать простую HTML-страничку, но не понимал, что происходит от момента ввода адреса в адресную строку браузера до отображения этой самой страницы.
Я выучил структуры данных, даже список с пропусками однажды упомянул на собеседовании, но не понимал, для чего они используются в программировании и как вообще создаются программы.
Раз я не мог закрыть пробел между теорией и практикой, то, возможно, есть и ещё люди, которым это нужно. Эта идея стала основой курса. Он, кстати, бесплатный.
2. Подготовить студентов к большому курсу
На момент создания курса я уже преподавал на основной программе. Уровень студентов был разным, часто приходили люди совсем «с нуля». Конечно, им было сложнее разбираться с новым материалом. Мне же как преподавателю удобнее было работать с людьми, которые уже что-то знают.
Многие студенты курсов попадают на них именно с открытых занятий, поэтому у меня появилась возможность дать хотя бы части студентов знания, которые пригодятся им для более комфортного освоения большого курса.
Как я определил аудиторию
Первое, с чего я начал — понял, кто будет моим студентом. Я уже описал проблему, которую хотел решить с помощью этого курса. Из неё вытекал и примерный портрет студента:
Начал самостоятельно изучать программирование и уже что-то знает.
Смотрит курсы, но не может перейти к практике.
Не видит картины целиком— какая связь между задачами, которые он решает в процессе обучения, и программами, которыми пользуется каждый день.
Тут проявилась первая проблема. Аудитория открытых занятий максимально широкая. Мой курс планировался как альтернатива, а в последствии — замена открытых занятий, поэтому целиться только в один сегмент было нельзя. Пришлось добавить к аудитории ещё две группы потенциальных студентов и расширить материал для них:
Абсолютные новички. Никогда не занимались программированием, но хотят попробовать. Ищут курс, который поможет им стартовать.
Люди с опытом программирования на другом языке. Возможно, с не самым свежим: школа, институт, работа. Хотят посмотреть возможности Python и начать использовать его.
Конечно, такое расширение ЦА размыло материал курса. Просто серию стримов сделать не получалось, так как новичкам нужно было рассказать основы. Но и долго застревать на базовых моментах не хотелось. Во-первых, курс был не про это, во-вторых, опытные пользователи могли заскучать. Однако, от расширения аудитории были и плюсы.
Мы ввели такое определение программы: набор инструкций и данных, над которыми эти инструкции выполняются.
Для новичков мы добавили блок про то, что такое компьютерная программа и как текст на каком-то языке, похожем на человеческий, становится понятным компьютеру, который вроде как понимает только единицы и нули.
Этот блок оказался полезным для всех, и из него логично вытекала структура первой половины курса.
Далее сначала рассказали про типы данных, с которыми мы можем работать в Python, а потом более подробно рассказали об инструкциях. Подкрепили рассказ практикой на реальной программе. В реальности оказалось, что на этом этапе опытные пользователи активно помогают новичкам: отвечают на вопросы, дают ссылки на дополнительные материалы.
На что я ориентировался при создании курса
Конечно, на стримы.
Сам я смотрел и могу рекомендовать стримы Хекслета и Федора Борщева. В качестве образца, как нужно рассказывать теорию, я взял видео Тимофея Хирьянова. Я помню его старый курс на Stepik, который понравился мне логичностью и стройностью изложения материала.
Еще один курс, которым я вдохновлялся — fast.ai Я проходил его пару раз, и мне очень понравился их подход, основанный на практике. Студенты начинают писать код и даже обучать модели машинного обучения с первого занятия.
Последний курс-книга, аналогов которому я не встречал в Рунете, — Учебник по разработке Телеграм-ботов. Благодаря ему я понял, что разработать бота вполне по силам даже с минимальным набором знаний. Студентов курса с вопросами, которые выходят за рамки программы, я отправлял именно к этому учебнику.
Что я даю в блоке теории
Несмотря на то, что курс больше практический, теория там тоже присутствует. Мне кажется важным делать курс по теме, в которой ты точно хорошо разбираешься. Научить, чтобы разобраться. — не прокатит. Если в голове каша, то идти с ней к аудитории — провальная идея. Студенты поймут это сразу.
Именно поэтому для своего первого курса я взял только основы Python — языка, на котором пишу коммерческий код уже более восьми лет. Мы рассматриваем только базовый синтаксис языка:
ввод и вывод строк на экран,
условные конструкции,
циклы,
создание и использование функций.
Даже этого материала хватает, чтобы разработать простую программу. Но даже такой объём сложно уложить в несколько лекций так, чтобы студенты не плавали при написании программы.
Для каждого вебинара мы писали план, развернутый план и конспект лекции. Сначала это кажется избыточным. Но вскоре я понял, что представлять лекцию в голове, записать, что именно ты хочешь рассказать, а потом рассказать на камеру — это разные процессы.
Когда начинаешь фиксировать идеи, сразу замечаешь, что нужно поправить, где нет переходов между темами, что ещё нужно рассказать. Ну и конечно, чем подробнее план или конспект урока, тем проще коллеге-методисту понять, о чём идет речь, и дать обратную связь. Кроме этого, мы немного причесали конспекты, которые я писал для себя, и отдали их студентам, чтобы они могли вернуться к материалу, не пересматривая лекции.
Какие практические задачи я придумал
Курс максимально ориентирован на практику. В первой части курса мы разрабатываем простейшее консольное ToDo приложение. Оно позволяет добавлять задачи на определённую дату (даты никак не валидируются и хранятся в текстовом формате) и выводить список задач на определённую дату.
Начинаем с изучения типов данных: строки, списки для хранения задач на определённую дату, словари для привязки списков задач к датам. Программа должна взаимодействовать с пользователем, поэтому студенты изучают способы вывода строк на экран и обработку пользовательского ввода.
Уже на первом занятии мы получаем прототип нашей программы. Она запрашивает у пользователя задачу и добавляет её в список, а потом выводит этот список на экран.
Далее переходим к реализации различных команд, которые могла выполнять программа: добавить задачу, вывести на экран список задач, выйти из программы. Тут студентам нужны условные конструкции, которые мы подробно рассматриваем.
Теперь программа может выполнять разные команды в зависимости от пользовательского ввода. Но делает это всего один раз. Это приводит студентов к изучению циклов. Мы обсуждаем цикл while
, который позволяет организовать бесконечный цикл работы программы, и цикл for
, с помощью которого делаем красивый вывод списка задач на экран.
На следующем занятии обращаем внимание на то, что некоторые участки кода повторяются в программе. Оказывается, можно вынести эти куски кода в функции. Эта часть кажется необязательной, если мы хотим курс с минимумом теории, ведь программа уже готова. Но мы забегаем вперёд — функции понадобятся, когда придётся переносить функциональность программы в телеграм-бота. Обработчики событий там задаются именно с помощью функций. После этого студенты почти готовы перейти к разработке собственно бота.
Почему телеграм-бот?
Ответ очень простой — программа, самостоятельно написанная и запущенная на своём компьютере, приносит много радости и мотивации студенту. Но в разы больше мотивации и веры в собственные силы принесет то, чем сможет пользоваться не только он сам, но и его окружение. Проще говоря, здорово, когда есть возможность самому пользоваться тем, что ты сделал, и показать результат своей работы другим.
Можно было сделать веб-приложение. Но для этого нам пришлось бы познакомиться с вёрсткой. Даже если бы мы делали полностью server side рендеринг, основы HTML пришлось бы изучить. А в курсе не должно быть моментов, когда мы предлагаем ученику просто скопировать код, не объясняя, что происходит. Даже не изучаемые в курсе темы объектов и декораторов я отдельно разобрал, чтобы дать хотя бы приблизительное понимание того, что происходит, когда мы пишем, например:
@bot.register_handler(...)
Разработка ботов отлично подходит для знакомства с веб-разработкой.
Переход к телеграм-боту
Перейти от программы, написанной и исполняемой в онлайн-редакторе кода, оказалось не так просто. До сих пор мы ничего не говорили студентам об окружении, в котором исполняется программа. Сказали только, что программу исполняет другая программа, которая установлена на компьютере и умеет переводить команды на языке программирования в инструкции, понятные компьютеру — интерпретатор. Студенческая программа работала в этом интерпретаторе локально и никакие внешние ресурсы ей были не нужны.
Телеграм-боту же для работы нужны серверы Telegram. А что вообще такое сервер? На этот вопрос мы постарались ответить сразу после изучения базового синтаксиса и окончания разработки программы. Задача студентов — перенести функциональность программы в бота, а для этого нужно понимать, как устроены телеграм-боты и что они вообще такое. Для этого в свою очередь нужно понять, хотя бы примерно, как устроен интернет. Определив интернет как сеть связанных между собой компьютеров, между которыми можно передавать информацию, мы рассказали про модель «клиент-сервер» и объяснили, как по этой модели взаимодействуют приложения Telegram, серверы Telegram и программы ботов.
Мы объяснили только модель взаимодействия ботов с сервером long polling. Web hook гораздо сложнее, и конкретно Telegram, насколько я знаю, требует https для взаимодействия с ботами через вебхуки (что еще добавляет еще сложности).
Почему выбрали онлайн-редактор кода
Разработчики вряд ли используют онлайн-редакторы вроде replit.com для написания и отладки кода. Но такой инструмент обеспечивает важное свойство для массового курса — у всех участников одно и то же окружение. Значит, полностью исключаются вопросы и проблемы, связанные с установкой интерпретатора, запуска программ и так далее.
Telegram-бота в онлайн-редакторе запустить сложнее. Как только мы закроем вкладку браузера, бот прекратит работу. Нам нужен был хостинг. К хостингу было всего два требования: бесплатный и с онлайн-редактором кода.
С первым требованием проблем не возникло, а вот хостинг, где можно работать с кодом на Python, как в онлайн-редакторе, удалось найти не сразу. Обнаружили только один вариант — pythonanywhere.com. У него куча недостатков, даже я иногда путаюсь в его интерфейсе, зато там есть простенький онлайн-редактор кода.
Кто помогал мне сделать курс
Команда — это важно. Через несколько потоков студентов, я подумал: «А зачем мне вообще Нетология? Я же сам могу сделать такой курс, проводить его и даже, возможно, брать за него деньги». Эту идею я всерьёз обдумывал, но когда начал прорабатывать детали, увидел, как много зависит от команды.
Во-первых, это маркетинг и продвижение курса. Количество участников на потоках измеряется тысячами. Вряд ли бы у меня получилось самостоятельно привлечь такое количество студентов. Сомневаюсь, что смог бы найти хотя бы 10 учеников.
Во-вторых, работа методистов. Уверен, курс получился бы сырым, если бы не методисты. Эти люди гораздо лучше понимают, кто приходит на курс, что и в каком формате слушатели хотят получить. Хотя я постоянно спорил с тем, что добавлять в курс, все предложения методистов в результате оказались полезными.
Ну и наконец, часть рутинной работы. Вычитка конспектов, работа в чатах, техническое обеспечение и модерация вебинаров. Возможно, всё это по силам одному человеку, но лучший продукт получится, когда каждый занимается тем, что умеет.
Что я понял про собственный курс
Идеально сделать не получится
Причём ни с какого раза. Мы провели уже 14 потоков курса, и нам есть куда расти. Правда, менять курс стало сложнее, так как последние потоки полностью перешли в формат записанных видео.
Вебинары я люблю больше
Во-первых, они дают возможность максимально адаптировать материал под аудиторию. Во-вторых, с каждым потоком по вопросам и ошибкам студентов мы находим проблемные места и оперативно исправляем их. Но и проводить каждый поток вживую тоже накладно, как для бизнеса, так и для преподавателя. В качестве компромисса мы оставили один вебинар в конце курса, на котором отвечаем на вопросы студентов.
Детали важны
Я не зря говорил про формат вебинаров. Иногда во время лекции я отходил от программы и в обзоре домашнего задания или просто в объяснении темы давал дополнительный материал, исправлял заранее заготовленные файлы. Эти файлы с кодом потом получали участники следующего потока и недоумевали, видя незнакомый синтаксис или что-то, что на их потоке не разбиралось. Такие детали формируют мнение о курсе и об образовательном процессе в Нетологии вообще. Будь у вас хоть самый лучший курс — попробуйте опаздывать на вебинары или не отправлять обещанные материалы, и очень скоро люди не захотят его проходить.
Hatters gonna hate
Это правда. Находились люди, которые писали оскорбительные комментарии, основываясь на этих самых мелочах. Нужно смириться с этим. Конечно, хочется, чтобы были довольны все, но, похоже, так не бывает.
Самое главное на курсе — аудитория
И все же самое главное — это люди, для которых вы делаете курс, и искренняя заинтересованность в том, чтобы научить их чему-то, зажечь программированием, показать возможности. Самое приятное, конечно, получать сообщения с благодарностью, в которых люди рассказывают, как курс помог им. Ради этого стоит делать курсы, поверьте.
Что курс дал лично мне?
Я наконец-то попробовал себя не только в преподавании, но и в разработке образовательных продуктов. Причем прошел полный цикл от идеи до курса. Для меня один из главных критериев успешности — то, что я с удовольствием рекомендую курс своим друзьям и знакомым, которые хотят познакомиться с программированием.
Кроме этого я понял про себя, что у меня неплохо получается вести лекции и общаться с аудиторией, а вот продумывать планы и писать конспекты трудно, эти процессы забирают кучу времени и сил.