YtYt - платформа для обучения программированию без инфоцыганства и вебинаров

Онлайн-образование может быть качественным. Двухчасовые вебинары, на которых лектор монотонно пересказывает документацию, можно заменить на небольшие текстовые уроки, насыщенные интерактивными примерами и практическими заданиями. Именно с этой мыслью я начал работу над проектом YtYt в начале 2021 года.

Так выглядят уроки на <a href="https://api.vc.ru/v2.8/redirect?to=https%3A%2F%2Fytyt.ru&postId=442168" rel="nofollow noreferrer noopener" target="_blank">YtYt</a>
Так выглядят уроки на YtYt

Три актуальные проблемы онлайн-курсов по программированию

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

  • Дорого (от 100 до 200 тысяч рублей за курс);
  • Неудобное время/сроки обучения;
  • Поверхностная обратная связь от код-ревьюеров, не приносящая особой пользы. Это следствие того, что квота времени, выделяемая на каждого студента, довольно мала.

У этих проблем есть следующие решения:

  • Вместо регулярных однотипных вебинаров заранее готовим качественный текстово-графический контент. Добавляем в него интерактивные примеры кода. В каждый урок добавляем много самостоятельных упражнений с решениями и юнит-тестами. За счёт этого снижаем нагрузку на программистов-преподавателей, а значит, снижаем переменную себестоимость;
  • Вместо фиксированного графика даём возможность заниматься в удобном темпе и в удобное время. Уроки никуда не убегут, поэтому нет нужды подстраиваться под темп других учеников и время проведения вебинаров;
  • Вместо поверхностной проверки большого количества заданий фокусируемся на глубоком код-ревью ключевых проектов. Небольшие промежуточные задания покрываем юнит-тестами и даём студентам заранее подготовленные эталонные решения с пояснениями.

Все эти идеи были реализованы, и вот что получилось в результате:

  • Полная стоимость обучения не превышает 80 000 рублей, при этом вся учебная программа разбита на 7 блоков, каждый из которых можно оплачивать отдельно по мере необходимости;
  • Учиться можно хоть 0.5 часа в день, хоть 12 часов в день. Если понадобится перерыв, то академический отпуск выпрашивать не нужно;
  • Код-ревью ключевых проектов проводится максимально глубоко, в несколько итераций. Разбираются не только имена объектов, стилистика кода и прочие базовые вещи, но и алгоритмы, и декомпозиция задач, и масштабируемость выбранного решения.

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

Теория должна быть чётко структурирована

Одна из ключевых проблем, с которой сейчас сталкиваются новички в программировании - это переизбыток информации. Тысячи видеороликов, книг и статей, десятки языков и фреймворков - всё это находится на расстоянии 1 клика мышкой. Здорово, правда? Но на практике такая доступность информации приводит к тому, что начинающие хаотично мечутся между разными языками и технологиями, потому что в прошлом месяце человек начал учить Python, а в этом месяце ему попались несколько статьей о том, что Go - это язык будущего, и учить нужно именно его.

Поэтому было принято решение создать чёткий пайплайн, по которому студент будет двигаться от "Ура, я умею в helloworld!" до "Вот мой репозиторий с пет-проектами, здесь Flask, а здесь Django, возьмите меня на работу".

...но это оказалось очень непросто

Рассказывать ли об исключениях во вводном курсе "Основы основ"? Если да, то насколько глубоко? Стоить ли упоминать об объектной модели в отрыве от классов? Можно ли называть print() встроенной функцией до того, как было введено понятие "функция"? Показывать ли сразу, как работает WSGI-сервер, или сначала полностью разобраться с клиентской стороной?

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

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

Сначала списки, потом функции, потом словари, потом файлы. Функции сгруппированы со словарями и файлами. Множества при этом вообще пропущены. Всё логично :)
Сначала списки, потом функции, потом словари, потом файлы. Функции сгруппированы со словарями и файлами. Множества при этом вообще пропущены. Всё логично :)

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

Практика и код-ревью

Из-за нехватки опыта новички обычно пишут довольно несуразный код, который сложно читать. К тому же ни книги, ни видео, ни экспресс-курсы на Stepik или Udemy не прививают навыки написания чистого кода, перекладывая эту задачу на плечи работодателей. А работодатели тоже не горят желанием делать это за свой счёт, предпочитая при прочих равных брать того, кто умеет писать аккуратно и чисто.

Так как цель проекта - обучать разработчиков под ключ, то решать эту проблему пришлось именно на нашей стороне. Самый очевидный способ - это проводить код-ревью. Больше, чаще, дольше. Но всё упирается в деньги, потому что час разработчика, которому можно доверить ревью, стоит не менее 1000 рублей. То есть бездумно ревьюить всё подряд физически невозможно, экономика проекта не сойдётся.

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

После того, как студент сам напишет код, а потом сравнит результат с эталонным решением, он понимает, что конкретно можно было улучшить. Такой опыт куда сильнее закрепляется в памяти, чем абстрактный код, написанный кем-то другим. В результате количество грубых ошибок, выявляемых на ревью, снизилось раза так в 2 - 2.5 (субъективная оценка, учёт не ведётся). И теперь на ревью можно уделять больше внимания алгоритмам, декомпозиции и структуре программы, а не названиям переменных и прочим базовым вещам.

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

Социализация и геймификация

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

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

Обратная связь от вас очень важна

Любая критика, которая поможет проекту стать лучше, нереально важна на текущем этапе. Если вы вдруг решите зайти к нам на огонёк и заметите какие-то недочёты, то пожалуйста, поделитесь ими в комментариях или напишите на timur@ytyt.ru. Дадим людям и качественное образование, и удобный интерфейс :)

Спасибо за внимание!

44
7 комментариев

Вроде, выглядит здорово - удачи с проектом)

Может, и сам бы присмотрелся, но смотрю куда-то в сторону Java.

1
Ответить

Спасибо, Кирилл)

Если стартуете с полного нуля, то въезжать в Java будет значительно сложнее, чем в Python. Даже если итоговая цель звучит как "обязательно изучить Java", то я бы порекомендовал всё-таки начать с Python, освоить на нём базовые концепции, общие для любого языка, а потом уже переключаться на Java. Образно говоря, сначала научиться "программировать в общем", а потом уже целенаправленно изучать суровый энтерпрайз-язык.

Ответить

Другого четырехбуквенника не нашли чтоль?

Ответить

CUYS был уже занят, к сожалению :(

Ответить

А ну да точно, я ж с 2007 года закупил пачку из 500 3-х и 4-х буквенников.

Ответить