Сказ о маленькой стажировке в маленькой компании [Часть II]
Это вторая часть истории о маленькой стажировке в маленькой компании. В этой части рассказываю про то, как прошла стажировка 2013 года в действительности относительно разработанного ранее плана, здесь собраны наблюдения и результаты.
Первую часть можно прочитать по этой ссылке.
Вступление
Предыдущая часть статьи была чисто теоретическая. Результатом теоретических измышлений стал план стажировки. Далее нужно было расставить дедлайны готовности каждого из пунктов и воплощать план в жизнь:
- Готовим тексты объявлений для поиска (к середине мая).
- Запускаем объявления по всем выбранным каналам (в середине мая).
- Немного ждём (все заявки обрабатывает HR в кратчайшие сроки, начать приглашать на собеседования планировали, когда наберётся некоторое количество заявок).
- HR проводит телефонные собеседования (до середины июня).
- В середине июня проводим очные собеседования (за неделю-две до начала стажировки).
- Отбираем по результатам собеседования стажёров (за неделю до начала стажировки).
- Разрабатываем план лекций с учётом технического уровня стажёров (к началу стажировки).
- Придумываем практические задачки по каждой теме (в первую неделю стажировки).
- К началу стажировки готовим ноутбуки для новичков (за день до начала стажировки).
- Запускаем двухмесячную стажировку (с 1 июля).
- Следим за прогрессом стажёров (на всём протяжении стажировки).
- По необходимости разбираем некоторые темы подробнее (на всём протяжении стажировки).
- В начале сентября подводим итоги стажировки и проводим назначения в команду (в первую неделю сентября).
Подготовка стажировки
В этом разделе приведены результаты подготовки к стажировке вплоть до выхода стажёров. Для удобства изложения активности сгруппированы относительно пунктов плана, но с сохранением общего хронологического порядка (почти).
Тексты объявленийТекст печатного объявления в целом был похож на текст обычной вакансии с той лишь разницей, что мы предлагали оплачиваемую стажировку. В объявлении на матмехе УрГУ был сделан акцент на близости офиса к университетскому корпусу (пешком 2–5 минут).
Первые отклики выявили потребность студентов в обязательной производственной практике. В результате мы вынуждены были оперативно разбираться и согласовывать, что нужно с нашей стороны для закрытия такой потребности (этот вопрос был полностью делегирован HR'у). Получив ясность по этому вопросу, мы быстро заменили все объявления — в новых написали, что закроем практику для студентов.
Осознав, что студентам нужна обязательная практика, мы пришли в некоторое уныние. Попробуйте ответить на вопрос: кто будет искать себе практику на лето летом? Вероятно, вы представите себе последних раздолбаев. Так эту картину рисовали и мы. К счастью, спойлер, всё оказалось намного лучше.
Заявки на стажировкуЗаявки принимались с середины мая по середину июня. Если правильно помню, было много непрофильных заявок (иногородние, 1–2 курс, нетехнические специальности и прочее). Среди кандидатов было 16 человек, подходящих под профиль.
То, чего мы опасались, когда полностью делегировали телефонные собеседования HR, случилось: в ответах у нас появлялись новые принципы ООП наподобие «полимарксизма», новая топология «все не со всеми» и прочее. К счастью, простая постобработка ответов решала проблему.
Отбор на стажировкуСобеседования проводились примерно со сдвигом 3–7 дней, если считать от контакта с HR. На собеседования приглашали на основании данных из опросника и представленного резюме.
Неискушённые в собеседованиях студенты в своём резюме в ключевые навыки пишут вообще всё, что когда-либо слышали / видели / использовали вне зависимости от степени владения указанным инструментом. Так, если верить резюме, каждый второй пришедший студент обладал всеми этими навыками: HTML, CSS, JavaScript, jQuery, Perl, C++, C, Java, C#, Python, PHP, Assembler, SQL, MS SQL, MySQL, UML, Linux… После третьего собеседования мы поняли, что с этой целью в резюме можно даже не заглядывать.
Приглашение на стажировку или отказ мы давали в течение недели. Во-первых, мы хотели сперва собрать статистику, чтобы понимать средний уровень кандидатов. Во-вторых, хотели набрать наиболее крутых студентов, а до окончания набора ещё оставалось время.
Воронка отбораК середине июня мы определились с четырьмя будущими стажёрами. Так выглядела воронка отбора:
- ?? телефонных собеседований
- 16 заполненных опросников
- 10 очных собеседований
- 4 стажёра
- матмех УрГУ;
- окончили 3-й курс.
Из печального: к нам приходили кандидаты, которых не взяли на стажировку в другие компании. Вот поэтому и нужно успевать разбирать крутых стажёров раньше! А не как мы — в июне месяце!
Из позитивного: студенты не искали стажировку по двум причинам: думали, что надо выходить сразу после собеседования, а у них учёба-сессия; по каким-то организационным причинам студенты не знали про обязательную летнюю практику. Получилось, что благодаря такой неосведомлённости студентов, мы «подгадали» нужный момент.
- сколько минимально часов нужно будет работать после окончания стажировки;
- можно ли работать в выходные дни;
- можно ли частично работать удалённо.
Наибольшей эффективностью с точки зрения итогового результата оказался ВКонтакте + личные связи: один кандидат, выловленный через социальную сеть, порекомендовал ещё троих.
На втором и последнем месте оказались объявления на матмехе УрГУ — они привели ещё одного стажёра.
Подготовка рабочих местВ середине июня, когда мы определились только с четырьмя стажёрами, от нас потребовали точное количество будущих стажёров, мотивируя это тем, что мебель и технику нужно заказать заранее. Тут у нас возникла трилемма, поскольку было ещё три кандидата на два потенциальных места — выбор с тремя исходами: никого больше не возьмём, возьмём только одного, возьмём двоих. В итоге оформили заявку на пять рабочих мест — если бы взяли шестого стажёра, то думать над решением проблемы стали бы по факту.
В маленькой компании с ограниченными ресурсами важно заранее составлять план расходов — нельзя прийти к руководству и сказать, что завтра у нас будет N стажёров и для них нужны рабочие места.
Состав рабочего места стажёра:
- Разношёрстные ноутбуки с ОС Windows 7 и Windows 8 (не очень мощные процессоры до i-5, 3-4 ГБ ОЗУ)
- Монитор 19"
- Проводные мышь + клавиатура
- Офисный стол
- Офисный крутящийся стул на колёсиках
Если явно не указывать точные характеристики заказываемой техники либо не согласовывать выбранную технику, то в итоге можно получить совсем не то, что ожидалось. Нужно учитывать, что между вашей заявкой и её реализацией будет по меньшей мере два человека: один выбирает технику, другой — согласовывает смету, и оба они могут быть далеки от понимания потребностей разработчиков в мощности железа.
В принципе, полученных ноутбуков для обучения и сносной в плане удобства разработки было достаточно.
Стажировка
НачалоЧереда всяких случайностей, включая «внезапные» экзамены и неготовность рабочих мест, и «несдвигаемое» начало стажировки сдвинулось с первого июля на восьмое, а мы получили ещё одну неделю для подготовки лекций и практики на стажировку.
Настройка рабочего местаПолучив ноутбуки, стажёры первым делом принялись ставить и настраивать все инфраструктурные вещи. В общей сложности этот процесс занял один-два рабочих дня.
ЛекцииНам повезло, что все наши стажёры закончили шесть семестров матмеха, поскольку у всех у них были плюс/минус одни и те же «IT-шные» предметы. Все наши стажёры были знакомы с Java на уровне студенческого курса «ООП: Java».
Теоретическую часть решено было разбить на четыре блока:
- Инфраструктура
- Бэкенд
- Фронтенд
- Тестирование ПО
В своём проекте мы использовали следующие инструменты:
- Apache Maven
- Git / Git Extensions, gitolite
- Jenkins CI
- Nexus OSS
- Redmine
Большее внимание, конечно, было уделено Git:
- Назначение систем контроля версий, основные типы VCS
- Основные команды для работы с репозиторием
- Организация веток в проекте
Неполный список использованной литературы:
-
.
- Статья «Про Git на пальцах» от vitamin. и её перевод — «Удачная модель ветвления для Git» от zloddey.
- Статья Continuous Integration (Martin Fowler).
На бэкенде у нас был следующий стек технологий:
- Java 7
- Spring Framework
- Spring MVC
- Spring Security
- Hibernate
- Jackson
- FreeMarker
- Java: вспомнить всё!
- SOLID, DI и другие акронимы.
- JEE: не SE единым.
- web-app: сервер приложений, сервлеты.
- Spring Framework: основы.
- JPA: ормизация и хибернизация.
- Spring MVC: немного о главном.
- FreeMarker: шаблонизируй это.
- Spring Security.
На эту часть теории пришлось, что не удивительно, больше всего времени — больше двух недель. Чистой теории (без учёта практики) получилось около восьми рабочих дней.
Неполный список использованной литературы:
-
(James Gosling, Bill Joy, Guy Steele, Gilad Bracha, Alex Buckley). . . (Craig Walls). (Clarence Ho, Rob Harrop). (Madhusudhan Konda). (Marten Deinum, Koen Serneels). (Robert Winch, Peter Mularien). .
В клиентский стек входили:
- TypeScript
- AngularJS
- jQuery
- (Twitter) Bootstrap CSS
- Angular UI (Bootstrap)
- RequireJS
- Ещё некоторое количество библиотечек
- Инструменты для тестирования (о них в следующем блоке)
Таким образом, по фронтовой части были следующие темы:
- TypeScript vs JavaScript.
- AngularJS: основы.
- AngularJS: директивы.
- AMD и RequireJS.
На фронтенд-теорию потребовалось три рабочих дня.
Тестирование ПОС коллегой договорились о следующих темах:
- Функциональное тестирование
- Модульные тесты
- Интеграционные тесты
- Нагрузочные тесты
- Стресс-тесты
- Usability-тесты
- Smoke-тесты
- Регрессионные тесты
- JUnit
- Mockito
- SeleniumHQ
- KarmaJS
- Jasmine
Опытным путём было установлено, что теоретическая тема дольше двух часов подряд даётся стажёрам тяжело. Нужно либо разбавлять практическими задачками, либо дробить большую тему на части и делать перерывы между ними.
Практические задачиПрактические задачи были направлены на закрепление теоретического материала и выдавались либо после завершения темы, либо после целого блока.
В инфраструктурном блоке была задача освоиться с git — для этого каждому стажёру был предложен некоторый сценарий создания проекта, который нужно было воспроизвести на своём репозитории (ветки, коммиты, мёрджи, . ).
Для блока бэкенда, как я уже писал выше, был подготовлен репозиторий со скелетом приложения, на котором можно было поделать простые задачи: DI, взаимодействие с базой данных, REST API и прочее.
В качестве практики по Angular предлагалось пройти стандартный туториал, но с использованием TypeScript.
Финальная задача заключалась в том, чтобы создать полноценное web-приложение, соединив серверную и клиентскую части. Это приложение необходимо было тестировать с использованием изученных инструментов: JUnit + Mockito для серверной части и Karma + Selenium — для клиентской.
Сложно оценить суммарное время, потраченное на практику; кажется, что в сумме практика заняла две полные рабочие недели, то есть порядка десяти дней.
Не знаю, ошибкой это было или нет, но, имея некоторый преподавательский опыт за спиной, я подошёл к обучению с разделением на теорию и практику, по аналогии с университетскими парами. Со временем мне показалось, что в некоторых случаях лучше не разделять теорию и практику: рассказываешь что-нибудь, а в это же самое время стажёры решают связанную задачу у себя на ноутбуках.
Workflow-стажировкиДо начала стажировки в проектном таск-трекере был заведён подпроект «Стажировка», где наставники вели как собственные задачи, связанные со стажировкой (подготовка материалов и задач), так и задачи стажёров, где можно было отслеживать успешность выполнения задач и изучение материала.
Ведение задач стажировки в таск-трекере делает процесс прозрачнее для всех участников: стажёр видит свой прогресс и прогресс коллег, без дополнительного участия наставника может увидеть, где есть косяки; для наставников таск-трекер становится точкой синхронизации по всем стажёрам, когда можно без проблем восстановить контекст текущей работы каждого из стажёров.
Обратная связь от стажёровСтуденты привыкли на лекциях слушать, но не задавать вопросы. Поэтому призыв «задавайте вопросы, если что-то непонятно» редко находит отзыв.
Так пришло понимание, что нужно обязательно собирать обратную связь со стажёров, чтобы своевременно исправлять косяки в процессе и подстраивать работу под ребят.
Для сбора обратной связи использовались гугло-анкеты с вопросами по каждому наставнику:
- Оцените степень «понятности» лекций Имя_наставника_i (от 0 до 5).
- Оцените степень интересности лекций Имя_наставника_i (от 0 до 5).
- Дайте общую оценку лекций Имя_наставника_i.
- Оцените помощь Имя_наставника_i в разрешении возникающих вопросов (от 0 до 5).
- Комментарии о Имя_наставника_i.
В первом и третьем случае ничего интересного — никаких выбросов. А вот по второму идём в комментарии к лекциям:
- «Мне показалось, что лекция началась с середины».
- «Материал был интересен, но сама лекция была немного скомкана».
- «Лекции Имя_наставника_2 интересны, но он не всегда может четко высказать свои мысли =) Видно, что он знает, о чем речь, но не всегда может передать эти знания нам».
Решение: дополнительно разобрали часть вопросов на практических задачах.
СпециализацияСтуденты, приходя на стажировку, часто заявляют о выбранной ими специализации. Например, уверены, что хотят стать backend-разработчиком. При этом лишь единицы по-настоящему понимают, что стоит за выбранной специализацией, и могут объяснить свой выбор. Лишь практические задачи, приближенные к проектным, или непосредственно проектные задачи позволят понять свои возможности и мотивацию.
Спустя месяц стажёров можно было разделить на три группы — backend (2), frontend (2) и QA (1).
ПроектСтажёры были готовы начать работу над задачами проекта со второй недели августа. Для них был выделен целый модуль разрабатываемой системы со своими server- и client-side.
С этого момента они покинули песочницу «Стажировка» нашего таск-трекера и влились в работу над основным проектом: начали принимать участие в проектных митингах, вникать в детали проекта, общаться с менеджером проекта и аналитиками.
А мы тут, это, в отпуск собралисьКто-то из стажёров заговорил об этом в конце июля, кто-то — в начале августа. Перед началом учебного года 4/5 наших стажёров захотели в конце августа уйти в отпуск.
У стажёра, в отличие от сотрудника, принимаемого на испытательный срок, есть несколько особенностей: он не привык работать по полгода (а то и дольше) пять дней в неделю, у него есть учёба, приоритет которой выше, часто он рассматривает работу в компании, как источник опыта, а потом уже — денег.
Не скрою — для нас было очень важно удержать студентов после прохождения стажировки, поэтому мы понимали, что нужно поддерживать их лояльность как к нам (наставникам), так и к компании. К счастью, мы смогли это донести до руководства компании, поэтому все стажёры благополучно ушли по отпускам. Дополнительным условием с нашей стороны стало автоматическое продление стажировки на две недели.
Иногда они уходятНезадолго до окончания стажировки в день выхода из отпуска нас покинул один из стажёров. Просто пришёл и без объяснения причин сообщил, что уходит навсегда.
Вообще говоря, причина такого исхода может быть либо в рабочей плоскости:
- проблема в компании;
- проблема в нас (наставниках);
- проблема в стажёре;
Необходимо выстраивать работу со стажёрами таким образом, чтобы не случалось сюрпризов (внезапные расставания, отпуска и прочее): строить планы работ на месяц-два, интересоваться собственными планами стажёра, поддерживать непрерывное общение.
Работа в командеНаиболее распространённый способ вовлечения неопытного разработчика в командную работу — это работа в паре с опытным коллегой. Такой подход имеет существенный недостаток, когда очевидным образом инициатива находится на стороне опытного сотрудника.
В нашем случае не хватало опытных на всех неопытных, поэтому все стажёры были объединены в общую группу для работы над целым модулем системы. В каком-то смысле это было вынужденной мерой, но давало положительные результаты: стажёры учились принимать решения, брать инициативу на себя, формировать свою зону ответственности. При этом наставники контролировали общую работу, верифицировали принимаемые группой решения и проводили code review.
Со временем стажёры научились разбиваться на пары для работы над отдельными частями модуля. Например, один стажёр отвечал за бэкенд какой-либо функциональности, а второй делал для неё фронтенд, при этом совместно работали над разработкой API, рисовали картинки на доске, решали вопросы интеграции с другими частями системы.
Из рук в рукиСамым большим моим косяком за время стажировки была ситуация, когда я выдал задачу стажёрам со всеми сопутствующими материалами и отлучился на несколько дней. По возвращении выяснилось, что стажёры сами с задачей не справились, а наставники толком в ней не разобрались.
Важно правильно передать всю необходимую информацию от одного наставника другому на случай длительного отсутствия первого: постановку задачи, все имеющиеся материалы, договорённости по работе и прочее. После возвращения наставника эту же процедуру необходимо проводить в обратную сторону.
Итоги стажировки
Четверо из пяти стажёров успешно прошли стажировку и всех их нам удалось сохранить в команде — как мне кажется, это успех!
В общей сложности у нас вся стажировка заняла 5 месяцев:
- 0,5 месяца на согласование и планирование
- 1,5 месяца на поиск стажёров и подготовку
- 1 месяц теоретического обучения и не связанных с проектом задач
- 1 месяц командной работы над модулем системы
- 0,5 месяца на стажёрские отпуска
- 0,5 месяца на подведение итогов, планирование дальнейшей работы.
Выводы
Как показала практика, можно вот так собраться и организовать хорошую стажировку. Для этого нужен самый главный ресурс — время, а главное условие для успеха — мотивация наставников. Мотивация может быть любой: научить ребят чему-то хорошему, подготовить кадры со схожими взглядами на разработку и, в конце концов, просто не облажаться.
Все так называемые «наблюдения» являются небольшими выводами сами по себе. Теперь их можно учитывать при планировании. Это здорово уменьшит энтропию. В общем, советы для тех, кто хочет всё держать под контролем.