Осенняя стажировка: преподаватель-разработчик vs студенты-программисты
В прошлой статье мы поделились организационной составляющей нашей стажировки, в этой, как и обещали, расскажем про опыт обучения с точки зрения сотрудника/преподавателя, который проводил эти занятия.
Сергей Кремнёв
Senior Backend developer
  • Зачем я вызвался?
  • Мой вклад в проведение стажировки.
  • Ключевые решения, повлиявшие на успех.
Зачем мне это?
Хотелось поучаствовать в развитии компании, вспомнить основы программирования и попробовать себя в чем-то новом. У меня не было опыта преподавания на тот момент, да и вообще я очень редко выступаю перед аудиторией, поэтому это решение было своеобразным вызовом самому себе.
Было ли волнение перед лекциями? Да.
Пожалел ли я об этом решении? Нет.
Понравился ли мне такой опыт? Точно да, оно того стоило.
Как проводилось обучение?
Напомню, обучение длилось почти 2 месяца и состояло из нескольких этапов: обработка всех заявок, собеседование, тестирование.

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

Я решил, что мне и самому стоит взглянуть на претендентов, ведь программисты – люди с особенным складом ума, от них не стоит ожидать красивых оборотов речи в описании себя и своих навыков на собеседовании, поэтому кто, как не программист (то есть я), сможет более точно проанализировать перспективы ученика?

Как оказалось, я был прав. Некоторые студенты, которые недостаточно раскрылись на этапе предварительного отбора, в дальнейшем показали себя очень хорошо.
Тестирование
Один из наших преподавателей подготовил список логических задач, а я написал тест на знание различных областей программирования. Изначально мы поделили преподавателей по разным направлениям: фронтенд, бекенд, тестирование и дизайн. На этом этапе я предложил делать тесты по всем сферам программирования, а не только по одной его составляющей, причём каждый из разделов содержал в себе вопросы от самых базовых до достаточно сложных: в bash были вопросы от ls до xargs, в vim - от :wq до замены подстрок в файле, в sql - от select до join-ов и индексов, в php - от синтаксиса до принципов
Это определило еще одну важную идею, которой я придерживался: обучать сразу всему и давать задания на порядок сложнее, чем ожидаемый уровень студентов.
После проведения тестов мы сформировали окончательный список стажеров и разделили их по направлениям. Я считаю, что это разделение не принесло нам никакой пользы, но позволило студентам выбрать лекции по тем направлениям, в которых они больше заинтересованы.
Лекции
Наша компания заинтересована в поиске близких по духу людей, которые не просто умеют писать код, но и могут быть полноценной частью команды разработчиков. Стандартные тесты при таком подходе к поиску сотрудников не помогают, поэтому на лекциях и практических занятиях я пытался создать ситуацию, в которую попадают junior разработчики: «всего много, всё непонятно и надо как-то быстро во всём разобраться».

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

- Да, кривое и неэффективное.
+ Но оно работает.


Имея перед глазами реальный пример в виде своего собственного приложения, вопросы типа "А почему здесь так плохо работает?" или "Как это сделать лучше?" становятся более эффективными, потому что студент заинтересован в поиске ответов и решений. А уже на эти вопросы можно отвечать лекциями об основах и принципах программирования.

План лекций я составил на основе mind map задач, которыми обычно занимается junior разработчик. Это список тех моментов, с которыми он может столкнуться, работая на проекте.
Лекции фокусировались не только на программировании, но и на инженерной культуре. Например, одна из самых полезных лекций была о софт скиллах.
Практика
Следуя идее "от реальной практики к основам программирования", я написал план занятий и задание, которое студенты должны были выполнить за один месяц занятий. А именно:

- Установить linux
- Разобраться в bash
- Установить и немного разобраться в git
- Установить nginx
- Установить php7
- Установить postgres. Разобраться в базовых SQL запросах
- Почитать про RestAPI
- Развернуть Angular проект
- Написать бекенд на PHP, который позволит объединить всё установленное в одну цепочку. Запрос из Angular - nginx - php - postgres и обратно. То есть получить что-то в Angular приложении из БД.

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

Встретил проблему попробовал разобраться за полчаса-час
→ не получилось → написал мне.
Фокус на общении преподаватель-студент был одним из ключевых факторов, который в дальнейшем не только дал нам множество положительных отзывов, но и отсеял тех стажеров, которые не смогли наладить контакт с преподавателями, а значит, не вписывались в наше видение сотрудников, которые должны не только кодить, но и быть близкими по духу нашей компании.
"А вдруг человек просто стеснительный и пока не открылся?"

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

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

После первого месяца обучения я провёл с каждым студентом беседу о его текущем прогрессе, проблемах и успехах. Такие беседы - копия наших обсуждений в Roowix, которые проводятся раз в месяц. Обычно в IT компаниях эти встречи называются one-to-one, personal retrospective и т. п.

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

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

А Roowix получил YouTube канал и четырех junior разработчиков, которые весной продолжили обучение на внутреннем проекте компании.
Ключевые моменты:
Лояльный первичный отбор. Каждого потенциального студента стоит рассмотреть всем заинтересованным лицам, прежде чем отказать ему в дальнейшем обучении.
Обучение в одном узком направлении создает ситуацию, когда это направление вроде бы сделано хорошо, но на практике слабо применимо, так как отсутствуют знания в смежных областях программирования. Нет смысла делать фронтенд, если ему некуда обращаться. Нет смысла писать бекенд, если некому запрашивать данные.
Проведение стандартного тестирования дает стандартные результаты. Придумайте разные по сложности задачи, и обучающиеся смогут проявить себя лучше, чем вы этого ожидаете.
Изучать теорию и применять её в конце курса, когда начало уже давно забыто - неэффективно.
Практические задачи в первую очередь должны выполнить вы сами, чтобы быть максимально компетентным в вопросах и сложностях, с которыми столкнутся ваши ученики.
Постарайтесь создать ситуацию, приближенную к реальности, и привяжите обучение к тем качествам, которые должны быть у ваших сотрудников. Если необходимо уметь спрашивать и учиться у других, то занятия должны быть организованы таким образом, чтобы у студентов была не только возможность спрашивать, но и острая необходимость это делать.
Лекции онлайн прокачивают собственные ораторские навыки, помогают уже действующим сотрудникам познакомиться с еще неизвестной для них темой, спасают студентов, которые не смогли очно посетить лекцию, а также хорошо работают на узнаваемость бренда.