Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
В ноябре 2021 года Яндекс.Практикум запустил курс «Go-разработчик» для программистов, которые хотят добавить Go в свой стек. На курсе не рассказывают о базовых вещах, а сразу объясняют студенту, как переложить его знания в парадигмы Go.
Меня зовут Алексей Полевой, я продакт-менеджер курса. В этом посте мы с командой расскажем, почему не обучаем программированию на Go с нуля, зачем даём два учебных проекта на выбор и насколько важен обмен опытом с ментором — действующим сеньор-разработчиком.
Зачем нужны курсы по Go
Go — один из набирающих популярность языков программирования, который разрешён в Яндексе наравне с Bash, C++, Java, JavaScript, Kotlin, Objective C, Python, R, Swift и TypeScript. Он относительно молодой, появился 12 лет назад, но активно развивается авторами и сообществом и всё чаще используется для бэкенда, консольных утилит и DevOps-инструментов.
Именно в этой нише растёт спрос на специалистов уровня мидл и сеньор. Мы решили выпустить курс, который закрывал бы эту потребность рынка и мог передать программистам экспертизу, накопленную Яндексом в сфере Go-разработки.
В англоязычном сообществе разработчиков есть много материалов по Go, но на русском языке качественного и хорошо структурированного контента не так много. Поэтому важной мотивацией для нас было внести свой вклад в русскоязычное сообщество Go-разработчиков и снизить порог вхождения в язык.
Также для нас важно делать продукты, которые дают качественный пользовательский опыт — то есть опыт, который позволяет студенту добиться тех результатов на курсе, которые максимально совпадают с его запросами. Это касается не только уровня теоретических знаний, но и повторения и закрепления этих знаний на практике, взаимодействия студентов с платформой, менторами и сокурсниками. Перед тем как приступить к разработке курса, мы изучили потребности рынка, провели интервью и проанализировали основные запросы аудитории.
Почему мы поделили контент на три части
Пожалуй, самый важный вектор, который мы для себя обозначили, — делать курсы для тех, у кого уже есть опыт в программировании.
Курсы для новичков, которые мы называем рескиллингом, то есть обучением навыкам другой профессии, похожи в одном: на эти курсы приходят люди, которые ничего не знают о программировании. Их опыт в разработке чаще всего нулевой, следовательно, программа проектируется из расчёта, что все эти люди учатся с одинаковой скоростью и приобретают одинаковый уровень экспертизы. Они получают похожий студенческий опыт, и их образовательные результаты на выходе тоже примерно одинаковые.
На программы апскиллинга, то есть направленные на развитие карьеры и уже имеющихся навыков, приходят люди с совершенно разным опытом и запросами. Например, есть те, кто уже пишет бэкенд, но не на 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» готовится к запуску. Все курсы предварительно проходят бета-тестирование.
Почему перед обучением нужно пройти входной тест
Важно, чтобы учиться было не слишком сложно и не слишком легко. Иначе говоря, курс должен соответствовать навыкам студента. Чтобы убедиться, что к нам приходят люди с нужными скиллами, мы добавили входной тест. Если студенты набирают нужное количество баллов, скорее всего, они справятся с программой курса. Мы хотим, чтобы они делали осознанный выбор.
Что должен знать студент, чтобы пройти входной тест
Входное тестирование состоит из двух частей: первая проверяет знание основ бэкенд-разработки, вторая — знание синтаксиса 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-инфраструктура.
Исследование компании JetBrains
Поэтому мы решили дать студентам на выбор два практических трека: условно мы назвали их «веб-разработка» и «DevOps». Трек — это направление, которое объединяет все инкременты проекта. Теория на платформе одинакова, а сервисы, которые пишут студенты, отличаются.
На первом треке они пишут приложение для сокращения URL, на втором — систему сбора метрик и алёртинга. Треки не одинаковы по сложности: для сервиса сокращения URL студент пишет только сервер, а для сервиса сбора метрик и алёртинга — сервер и клиент. Сейчас мы видим, что две трети студентов выбирает сервис сокращения URL.
В конце основного курса студентов ждёт выпускной проект, рассчитанный на месяц: нужно написать систему начисления баллов лояльности для интернет-магазина. Выпускной проект можно делать самостоятельно или в команде с другими студентами. Для командной работы есть дополнение — написать систему расчёта баллов. В начале месяца студенты защищают план работ перед ментором, затем проходят два код-ревью: промежуточное и финальное.
Программа курса Go-разработчик» и задания по двум практическим трекам: на одном студенты пишут сервис для сокращения URL, на другом — сервис сбора метрик и алёртинга
Как мы создавали контент и зачем нужен его рефакторинг
Наш формат — текстовая теория с примерами кода, локальными задачами, которые студент выполняет у себя в IDE, и квизами. На платформе чередуются теоретические уроки и уроки с заданиями по инкрементам. Каждый урок занимает своё место в системе образовательных результатов курса и доносит знания и навыки, необходимые для написания инкрементов и выпускного проекта.
Чтобы исключить однобокость и субъективность изложения, мы выстроили многоступенчатый процесс обработки контента. Каждый урок проходит несколько стадий: декомпозицию, написание текста, рецензирование двумя другими авторами, ревью и постредакторское ревью от методиста, лида авторов и двух техлидов. Когда текст вычитывают несколько человек, легче найти слабые места.
Команда нашего курса
Но на этом приключения контента не заканчиваются. Он отправляется на бета-тест — это первое «столкновение курса с асфальтом реальности». Бета-тест спроектирован так, чтобы команда могла оценить релевантность контента для целевой аудитории, эффективность выстроенной системы сопровождения, а также измерить реальное время прохождения, адекватность распределения и посильность когнитивной нагрузки. И, разумеется, найти и пофиксить баги.
Нашей задачей было дать бета-тестерам учебный опыт, идентичный тому, который получат студенты. Мы благодарны всем 60 участникам бета-теста как нашим полноправным соавторам. По итогам бета-теста мы собрали большой массив данных, при анализе которого получили планы рефакторинга каждого урока и изменения системы сопровождения.
Забавный момент: когда мы писали курс, то опасались, что студенты скажут: «Что за ерунду вы пишете? Это же гуглится на первой странице». Мы старались сделать курс насыщенным, с большой плотностью материала. Но наши опасения были напрасны: реакция оказалась совершенно противоположной. Бета-тестеры сказали, что материал сложный, поэтому нам пришлось давать больше пояснений, примеров и ссылок на сторонние источники для дополнительного изучения. Одной из самых удачных идей было спрашивать у бета-тестеров, что именно они гуглили в процессе прохождения темы. Это позволило нам выделить частотные запросы и закрыть все лакуны в уроках.
Во время рефакторинга у нас работает система ротации авторов: текст писал один автор, рецензировал другой, а переписывает третий. У каждого автора есть сильные и слабые стороны, экспертиза в определённой сфере. За счёт ротации авторы могут посмотреть на написанные уроки с разных точек зрения, учитывая разный бэкграунд и восприятие. Благодаря этому контент становится глубже, профессиональнее.
Иллюстрация из курса к теме про сжатие данных
Тот вариант курса, который сейчас представлен на платформе, — это результат многоступенчатого рефакторинга. Некоторые темы прошли его до трёх раз, прежде чем попасть к первым студентам. Мы постарались оптимизировать нагрузку, чтобы студент не перегорел на первых двух спринтах, а также разделили крупные блоки информации на более мелкие, сделав их доступнее. Ещё мы поработали над практической частью, добавив микрозадания: помимо основных практических инкрементов мы включили в уроки мелкие квизы, которые позволяют закрепить только что изученный материал. Как оказалось, это значительно повышает общую динамику прохождения.
Рефакторинг — это непрекращающийся процесс. Другими словами, наш курс — живой. Мы постоянно собираем обратную связь, и команда ежедневно работает над контентом, вносит правки и дорабатывает недоработанное. Недостаточно просто взять и написать курс, выпустить его и обучать людей, ничего не изменяя и не улучшая.
Кто помогает студентам учиться
Самое ценное, что предлагает курс, — экспертиза менторов. Как правило, это сеньор или лид-разработчики из Яндекса и других компаний. Кстати, с ними можно познакомиться на странице курса. Ментор общается со студентом на протяжении всего обучения — в 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