Как мы писали свой курс по Go и почему в итоге их получилось три

image-loader.svg

В ноябре 2021 года Яндекс.Практикум запустил курс «Go-разработчик» для программистов, которые хотят добавить Go в свой стек. На курсе не рассказывают о базовых вещах, а сразу объясняют студенту, как переложить его знания в парадигмы Go.

Меня зовут Алексей Полевой, я продакт-менеджер курса. В этом посте мы с командой расскажем, почему не обучаем программированию на Go с нуля, зачем даём два учебных проекта на выбор и насколько важен обмен опытом с ментором — действующим сеньор-разработчиком.

Зачем нужны курсы по Go


Go — один из набирающих популярность языков программирования, который разрешён в Яндексе наравне с Bash, C++, Java, JavaScript, Kotlin, Objective C, Python, R, Swift и TypeScript. Он относительно молодой, появился 12 лет назад, но активно развивается авторами и сообществом и всё чаще используется для бэкенда, консольных утилит и DevOps-инструментов.

Именно в этой нише растёт спрос на специалистов уровня мидл и сеньор. Мы решили выпустить курс, который закрывал бы эту потребность рынка и мог передать программистам экспертизу, накопленную Яндексом в сфере Go-разработки.

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

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

Почему мы поделили контент на три части


image-loader.svg

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

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

На программы апскиллинга, то есть направленные на развитие карьеры и уже имеющихся навыков, приходят люди с совершенно разным опытом и запросами. Например, есть те, кто уже пишет бэкенд, но не на Go, а на другом языке. Есть люди, которые проходили онлайн-курсы, но не работали в продакшене. Есть те, кто приходит в программирование из смежных областей. Есть опытные разработчики, которые хотят полностью перейти на Go из другого стека, систематизировать знания и закрыть пробелы. Поэтому нашей задачей было сделать продукт, полезный максимальному количеству будущих гоферов. Мы решили делать курс апскиллинговым, потому что Go — нишевый язык, и чаще всего на него переходят люди с PHP, Python и С++.

Когда мы проектировали программу, возникла концепция уровней знания Go — от начального до продвинутого. Всего их четыре: Basics, Must Have, Nice to Have, Expert. На первом уровне человек осваивает основные понятия и синтаксис языка. Второй уровень — это набор знаний и навыков, которыми должен обладать любой Go-разработчик: писать HTTP-сервер, REST API, тесты, подключать БД, логирование. Уровень Nice to Have — это навыки более высокого класса: построение архитектуры кода, профилирование, повышение производительности. И наконец, уровень Expert, для настоящих мастеров — низкоуровневая оптимизация кода на Go.

Дальше встал вопрос: как сделать так, чтобы дать разным студентам тот уровень знаний, который им нужен? Из этого родилась идея разделить курс на три продукта:

  • Основы Go — уровень Basics. Курс рассчитан на студентов, у которых есть базовые знания в области бэкенд-разработки и желание изучить синтаксис Go.
  • Go-разработчик — уровень Must Have. Это основной курс. На нём студент обучается тому, что должен знать каждый Go-разработчик.
  • Продвинутый Go-разработчик — уровни Must Have и Nice to Have. На расширенном курсе студент получает навыки мидла.


На курсы «Go-разработчик» и «Продвинутый Go-разработчик» можно записаться уже сейчас — они запущены в продакшен. Бесплатный курс «Основы Go» готовится к запуску. Все курсы предварительно проходят бета-тестирование.

Почему перед обучением нужно пройти входной тест


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

image-loader.svg
Что должен знать студент, чтобы пройти входной тест

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

В зависимости от того, насколько хорошо студенты знают синтаксис Go, они распределяются на курсы «Основы Go», «Go-разработчик» или «Продвинутый Go-разработчик». Сразу попасть на вторую часть «Продвинутого Go-разработчика», то есть уровень Nice to Have, не получится, потому что это продолжение основной программы.

Что входит в программу курса «Go-разработчик»


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

Студенты читают теорию на платформе Практикума, решают задачи и проходят тесты. Уроки объединены в темы, а темы — в спринты. В основном курсе мы разбираем работу HTTP, базы данных, кодирование, декодирование, шифрование, сжатие данных, ну и, конечно, многопоточность.

В каждой теме есть отдельные уроки с заданием по кодовым инкрементам. Концепция инкрементов предполагает итеративную разработку проекта: расширение функциональности, оптимизацию и усложнение кодовой базы. Для проверки работоспособности кода после изменений мы предлагаем студентам прогнать его через автотесты. В конце спринта студенты отправляют код на ревью ментору. Автотесты и код-ревью студенты проходят на GitHub.

Начиная с первого инкремента студенты пишут полностью рабочий сервис с минимальными знаниями Go, которые они приобрели за 3−4 урока. Дальше, по мере того как студенты узнают новые фишки языка, они постепенно улучшают и усложняют свой код.

На курсе «Go-разработчик» 14 инкрементов. Это значит, что код проекта изменится 14 раз и в конце будет совершенно не похож на то, чем был в начале. Если студент хочет продолжить обучение на курсе «Продвинутый Go-разработчик», он доплачивает разницу в стоимости курсов, ему засчитывается прогресс основной программы и он пишет ещё 10 инкрементов.

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

Зачем на курсе два практических трека


Мы проанализировали, в каких сферах больше всего применяется Go, и выяснили, что в первую очередь это веб-приложения, утилиты и IT-инфраструктура.

image-loader.svg
Исследование компании JetBrains

Поэтому мы решили дать студентам на выбор два практических трека: условно мы назвали их «веб-разработка» и «DevOps». Трек — это направление, которое объединяет все инкременты проекта. Теория на платформе одинакова, а сервисы, которые пишут студенты, отличаются.

На первом треке они пишут приложение для сокращения URL, на втором — систему сбора метрик и алёртинга. Треки не одинаковы по сложности: для сервиса сокращения URL студент пишет только сервер, а для сервиса сбора метрик и алёртинга — сервер и клиент. Сейчас мы видим, что две трети студентов выбирает сервис сокращения URL.

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

image-loader.svg


Программа курса Go-разработчик» и задания по двум практическим трекам: на одном студенты пишут сервис для сокращения URL, на другом — сервис сбора метрик и алёртинга

Как мы создавали контент и зачем нужен его рефакторинг


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

Чтобы исключить однобокость и субъективность изложения, мы выстроили многоступенчатый процесс обработки контента. Каждый урок проходит несколько стадий: декомпозицию, написание текста, рецензирование двумя другими авторами, ревью и постредакторское ревью от методиста, лида авторов и двух техлидов. Когда текст вычитывают несколько человек, легче найти слабые места.

tncgzhovvstwt4k9lvxu6ixspdm.jpeg
Команда нашего курса

Но на этом приключения контента не заканчиваются. Он отправляется на бета-тест — это первое «столкновение курса с асфальтом реальности». Бета-тест спроектирован так, чтобы команда могла оценить релевантность контента для целевой аудитории, эффективность выстроенной системы сопровождения, а также измерить реальное время прохождения, адекватность распределения и посильность когнитивной нагрузки. И, разумеется, найти и пофиксить баги.

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

Забавный момент: когда мы писали курс, то опасались, что студенты скажут: «Что за ерунду вы пишете? Это же гуглится на первой странице». Мы старались сделать курс насыщенным, с большой плотностью материала. Но наши опасения были напрасны: реакция оказалась совершенно противоположной. Бета-тестеры сказали, что материал сложный, поэтому нам пришлось давать больше пояснений, примеров и ссылок на сторонние источники для дополнительного изучения. Одной из самых удачных идей было спрашивать у бета-тестеров, что именно они гуглили в процессе прохождения темы. Это позволило нам выделить частотные запросы и закрыть все лакуны в уроках.

Во время рефакторинга у нас работает система ротации авторов: текст писал один автор, рецензировал другой, а переписывает третий. У каждого автора есть сильные и слабые стороны, экспертиза в определённой сфере. За счёт ротации авторы могут посмотреть на написанные уроки с разных точек зрения, учитывая разный бэкграунд и восприятие. Благодаря этому контент становится глубже, профессиональнее.

image-loader.svg
​​Иллюстрация из курса к теме про сжатие данных

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

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

Кто помогает студентам учиться


Самое ценное, что предлагает курс, — экспертиза менторов. Как правило, это сеньор или лид-разработчики из Яндекса и других компаний. Кстати, с ними можно познакомиться на странице курса. Ментор общается со студентом на протяжении всего обучения — в Slack, на вебинарах и сессиях один на один. Студенты учатся в группах по 10−15 человек.

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

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

Еще раз проговорю фишки наших курсов по Go-разработке:

Модульная структура, где каждый может получить то, что ему больше подходит: Basics для основ, Must Have для необходимого набора навыков Go-разработки и Nice to Have для углубления полученных знаний.

Практические треки, которые определяют область применения Go, — веб-разработка и DevOps. Студент выбирает сам, что ему нравится больше, и создаёт большой проект по этому направлению. Это намного полезнее, чем решать кучу мелких несвязных задач.

Два проекта на выходе — учебный и выпускной. Их смело можно положить в портфолио и показывать на собеседованиях. На продвинутом курсе у студента будет три проекта.

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

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

Каких результатов уже удалось добиться


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

У нас много планов на будущее. Мы завершили тестирование бесплатного курса «Основы Go» и переходим к обкатке «Продвинутого Go-разработчика». На очереди — модуль Expert про низкоуровневую оптимизацию, а также навыковые курсы по очередям, оркестраторам, контейнеризации и микросервисной архитектуре. Самое интересное ещё впереди.


Изображение Go gopher, которое используется в курсе, является модификацией изображения маскота, созданного Renee French, и лицензируется на условиях CC BY 3.0

Habrahabr.ru прочитано 7007 раз