Рынок IT стремительно растет, охватывая смежные направления и привлекая все больше людей. Одновременно с ростом возникает дефицит квалифицированных специалистов, который пытаются заполнить новичками и слушателями различных онлайн-курсов. Оплата труда растет, а средняя квалификация специалиста падает. Компании сталкиваются с дилеммой: либо долго искать готового специалиста (все более редкого и дорогого), либо самим заниматься обучением кадров.
В этой статье поговорим про второй вариант. А именно – про то, какие параметры нужно учитывать, разрабатывая корпоративные курсы и программы стажировки.
Автор статьи – Виктор Гуменный, специалист, разработчик медицинских алгоритмов, исследователь социальных инноваций. Автор книги «МИГРАЦИЯ: социально-экономические противоречия и их разрешение».
Итак, типичная ситуация: новичок-студент приходит на стажировку. Он уже освоил какие-то онлайн-курсы или учил какой-то язык программирования в вузе, даже решил отборочные тесты. Сотрудник выдает ему рабочее задание. С его выполнением возникает множество трудностей: студент либо отвлекает программиста кучей вопросов и просит показать, как выполнить то или иное действие, либо пытается разобраться самостоятельно и тратит на это много времени. «Затыки» возникают на пустом месте и многократно повторяются – конечно, если новичок не понял принципа решения, а лишь повторил конкретное действие «тут делай вот так».
Все это длится месяцами, после чего новичок либо «прозревает», либо уходит. Ну, а компания вынуждена тратить значительные ресурсы, чтобы ввести в должность хотя бы одного специалиста.
Если новичок спотыкается при решении выданных задач, значит он не понимает какой-то промежуточный узел, который опытный специалист даже не замечает, проходит на автомате.
Каждое задание состоит из нескольких «слоев» навыков. Пытаясь выполнить их, наш герой последовательно спотыкается об каждый. Поэтому нельзя просто выдать рабочее задание и тут же ожидать готового решения. Каждый «слой» требуется отработать по отдельности. Можно, конечно, завалить новичка литературой по программированию, но мы стремимся не столько сформировать у него фундаментальные знания, сколько научить пользоваться функциональными (более подробно об этом разделении см. лекцию А. А. Рыжачкова «Быстрый вход в новую тему»).
Итак, рабочее задание можно дробить по двум критериям: (1) этапы выполнения и (2) области компетенций.
Далее – поверхностный набросок тех областей, на которые у меня распределились задания по разработке ПО.
[Я занимаюсь разработкой ПО для анализа медицинских данных и обработки сигналов. Для этого исследования я отобрал и проанализировал 25 учебных проектов по программированию и столько же проектов из своей предметной области. Выводы и рекомендации, о которых написано далее, апробированы с группой студентов 1-4 курсов.]
Основная мысль таблицы следующая: даже если человек изучил какой-то язык программирования, это лишь означает, что он освоил одну компетенцию из множества необходимых.
Вместо одного сложного задания мы получаем группу более простых. При этом степень упрощения и детализации целиком зависит от конкретных проблемных мест, на которых зависает новичок. Можно ориентироваться на следующие условные уровни сложности:
1 уровень. Упражнения – одноразовые примеры, которые надо решить, запомнить и выбросить. Как правило, сводится к написанию одной функции. Часто используются на собеседованиях и массовых курсах, в онлайн-тренажерах по написанию кода. Так обычно преподают материал в книгах и мануалах: абзац текста – пример на 10 строк кода – абзац текста – и т.д.
2 уровень. Задачи – минимальная полезная программа из нескольких элементов. Например: схема БД + интерфейс, обработка данных + сохранение результатов, прочитать данные + показать на графике и т.д.
3 уровень. Проекты – готовый прототип приложения, который решает проблему. Компонуется из множества элементов.
Мне удалось протестировать семь основных форматов выдачи заданий, от более простых – к более сложным.
1-й формат. Копирование, повторение инструкции. Переписать за учителем, переписать код из видеоинструкций или лекций, переписать код из текста учебника.
2-й формат. Копирование + изменение. Упражнения с «затравкой»: дается рабочая система, и нужно изменить, добавить или убрать один элемент.
3-й формат. Простые упражнения на потоке. Есть масса онлайн-тренажеров, в которых начинающие программисты решают шаблонные упражнения. Для обучающего курса или для стажировки такой формат можно брать в качестве подготовки или отсева на входе. Также можно устраивать соревнования, выдавая за баллы за правильные решения.
4-й формат. Совместный разбор с преподавателем: описание → схема → псевдокод.
• Описать домен: выделить объекты и функции, дать определения объектам через другие объекты.
• Описать шаги выполнения программы: основные этапы (инициализация, перерисовка кадра, рисование и т.д.), функции внутри этапов.
• Ход выполнения задачи = цепочка промежуточных решений (программа-1, программа-2, …).
5-й формат. Проект + несколько итераций разбора с преподавателем. Ученику выдается типовой проект на минимальное полезное приложение. Если он чего-то не понимает, можно быстро объяснить, но при этом преподаватель тратит свое время. «Точки непонимания» = кандидаты на пополнение списка упражнений в пункты 1-3.
6-й формат. Проект – воспроизвести техническую статью с описанием алгоритма. Ученику выдается индивидуальный проект. Прежде чем писать код, он изучает статью и составляет ТЗ: выписывает требования к решению и прикидывает структуру проекта (4-й формат), – и затем реализует проект, согласно предыдущему пункту.
7-й формат. Парное программирование.
Слабый вариант: взаимные проверки по одному и тому же пройденному материалу + вопросы друг другу. Отдельный вопрос: что делать, если оба не понимают темы?
Сильный вариант: каждый реализует собственный проект по п. 5, потом объясняет материал напарнику и добивается, чтобы тот воспроизвел решение с нуля.
Многих может остановить сложность, связанная с тем, как организовать и оформить курс, затраты на проверку заданий, либо дорогое оформление полноценного онлайн-курса. По опыту, для первых нескольких итераций (сессий) эти затраты минимальны. Вот некоторые принципы, на которые стоит обратить внимание, чтобы сократить затраты времени на подготовку и ведение группы.
• Организуйте работу через систему контроля версий (github или github classroom). Смотрите дельту каждого изменения файлов или просто дату изменения. Активность участника видна по дням недели.
• Автоматическая проверка подходит для простых упражнений. Напишите тесты для проверки или ограничьте время выполнения.
• Обратная связь вместо устных вопросов. Можно комментировать результат выполнения (написанный код). Общайтесь с учеником через вычитку кода – так он сразу привыкает работать в производственной системе.
• Используйте шаблон под конкретные задачи: «Вставь свой код после этой строчки». Так ученик не тратит время на настройку и промежуточные операции. Нужно отрабатывать инфраструктуру – элементы «каркаса», на который уже можно натаскивать обучаемых. Они принимают вид эталонных решений, тестов, утилит, примеров использования, упражнений и т.д. Это должны быть объекты домена с жестким представлением в языке программирования.
• Групповая работа: все участники работают в одном репозитории и видят активность друг друга. Онлайн-редактор – все участники одновременно работают в одном и том же документе.
Читатель может задаться вопросом, в каких случаях стоит применять те или иные форматы. Чтобы на него ответить, приведу список распространенных ошибок, связанных непосредственно с ведением курса, – и соответствующих направлений решения.
✖ Онлайн-лекция = молчание ягнят. Ученики забывают материал, даже если по их текущему проекту нужно решить аналогичную задачу. Они не видят связи между лекцией и практикой.
✔ Пункт лекции → самостоятельное действие. Давайте ученикам ряд упражнений по каждому пункту содержания лекции.
✖ «Затык» на инструкции, когда возникает проблема, не описанная в ней. Ученики не понимают мелочей: откуда открыть консоль, куда нажать, чтобы создать новый файл, как добавить коммит и т.д.
✔ Покажите им, как начинать работу буквально с рабочего стола. Вместо инструкций давайте им памятки или способы поиска ответов на вопросы (как использовать справку, поиск и т.д.). Подойдут даже короткие видеоролики по основам и мелочам, которые достаточно повторить.
✖ Студенты виснут на базовых операциях. Например, как прочитать файл или откуда взять данные. Отсутствует техника работы с синтаксисом, с редактором. Учитель предполагает более высокий уровень подготовки ученика → приходится снижать требования к уровню решения или тратить время на объяснения → задача решается только в присутствии преподавателя.
✔ Начинайте с упражнений базового уровня. Используйте интерактивные упражнения: выполнил и увидел результат. Давайте готовую кодовую базу, заточенную под конкретные проекты. Студент не только пишет свой код, но и изучает качественный образец от составителей курса.
✖ Ошибка – грузить студентов непонятными терминами из языка, заставлять их учить по мануалу переменные, структуры, типы (примитивные, абстрактные), функции и т.д. Они не воспринимают, зачем это нужно, поскольку не видят от этого конкретного результата.
✔ Прорешивайте группу однородных упражнений. Показывайте знакомые объекты, например, из программы обучения. Темы, которые студенты проходят в вузах. Игровые задания (боты, анимация, звуки, управление механизмами и т.д.).
✖ Как заставить работать? Из больших групп можно исключать двоечников. Непонятно, что делать с малыми группами.
✔ Автоматизация контроля – см. предыдущий раздел. Фильтры и жесткие правила – за первое невыполнение предупреждаем и ставим метку, второй раз удаляем.