Мой опыт проведения курсов по Java для новых сотрудников +2


Всем привет!

Сегодня практика ведения курсов перед трудоустройством достаточно распространена во многих компаниях, я и сам когда-то начинал свою карьеру с прохождения обучения, но мне всегда было интересно попробовать себя в качестве преподавателя. И этой весной я узнал, что в нашей компании весной-летом пройдут курсы по итогам которых команды пополнятся бойцами по ряду направлений: Android, Java, Javascript и QA. По предложению руководителя отдела, мне и моим коллегам выпала возможность провести курсы по направлению Java. О деталях этого увлекательного мероприятия я и хотел бы рассказать дорогому Хабру.

Отбор кандидатов




Что требуется от потенциального сотрудника в нашем отделе? В кратце, мы используем достаточно типичный стэк технологий: Java 8, Spring Framework, Hibernate/MyBatis, PostgreSQL. Следовательно необходимо коснуться всех ключевых элементов перечисленных выше, но т.к. уровень соискателей будет невысоким, кому-то возможно впервые придется столкнуться с рядом наименований, поэтому курсы предполагались (так и вышло) достаточно плотными по своему содержанию. Единственно, нам не хотелось затрагивать совсем детские темы вроде типов данных, разъяснения ключевых слов class, interface, циклов, операторов ветвления, поэтому на первом этапе наши кадровые сотрудники организовали дистанционное тестирование с двумя простейшими задачами, которые должны были убедить нас в том, что человек хоть как-то умеет программировать. Заявок на наше направление Java пришло около 150, в основном студенты старших курсов или недавние выпускники. Встречались и совсем экзотические представители вроде 40-летних менеджеров-предпринимателей или студентов из Африки. При проверке вступительных заданий я уделял больше внимания тому, как человек относится к оформлению своей работы, а не к тому, насколько изощренно человек «проходит циклом по массиву». В задачах уровня Hello World разбег для этого не слишком большой и пытаясь выделываться можно встретить от проверяющего недоуменный вопрос «Зачем так сложно?». В общем, кто-то присылал скриншоты из среды разработки, кто-то вставлял куски кода в документ Word, а кто-то, что порадовало, присылал ссылку на github. За сим перейдем ко второму этапу, когда письма счастья с новостью о зачислении разлетелись по своим адресатам.

Программа курсов


Базовые темы мы обозначили как Java Core:

Занятие 1.

Введение. Краткий рассказ об истории языка, немного о работе JVM и кроссплатформенности, принципы ООП (три кита, SOLID, KISS, YAGNI) и инструменты современного Java разработчика (IDE, CI, VCS, багтрекер).

Комментарий: темы достаточно разноплановые, но они, по нашему мнению, дают неплохой «заход в тему». От себя добавлю, что часть про ООП достаточно трудна на первом занятии, но её наличие позволяет в дальнейшем ссылаться на неё при проверке домашних заданий или будущих лекциях.

Занятие 2.

Исключения, потоки ввода-вывода, сериализация.

Комментарий: здесь все темы неплохо дополняют друг друга, можно продемонстрировать закрытие потоков в «классическом стиле» в блоке finally и показать аналог с try-with-resources. Потоки-обёртки вроде DataInputStream и DataOutputStream являются простым и наглядным примером паттерна Декоратор, поэтому здесь появляется возможность для отсылки к первому занятию.

Занятие 3.

Коллекции.

Комментарий: все, кто хоть раз проходил техническое собеседование, знают, что без коллекций не обойтись, т.к. здесь лежит целая кладезь нюансов позволяющая определить уровень знаний специалиста на уровнях Junior-Middle-Senior. Отдельно от внутреннего устройства структур данных рассматриваются такие темы как: классическое сравнение ArrayList vs LinkedList, «ключевые» проблемы HashMap (как можно потерять значение, виды разрешения коллизий), виды итераторов (fast-fail vs fast-safe), спецколлекции вроде EnumSet. Во время лекции часто ссылаюсь на посты tarzan82, очень нравится наглядность и последовательность изложения.

Занятие 4.

Многопоточность.

Комментарий: данное занятие дает основы написания многопоточного кода, знакомит с наиболее популярными проблемами (livelock, deadlock, starvation), а также с условно «нижнеуровневым» (Thread, Runnable) и «верхнеуровневым» параллельным API (java.util.concurrent), с синхронизированными и потокобезопасными коллекциями.

Занятие 5.

Новшества Java 8.

Комментарий: так как на проектах активно используется Stream API, лямбда-выражения и функциональные интерфейсы, то есть необходимость рассказать о нововведениях и современных подходах по обработке данных в тех же коллекциях.

Занятие 6.

Подведение итогов Java Core блока.

Комментарий: в этот блок попадают Generics, Reflection API, Enum и все, что упоминалось, но не обсуждалось подробно на предыдущих занятиях. Формат больше в виде «вопрос-ответ».

Занятия 7 и 8.

Spring Framework и Hibernate.

Комментарий: краткий обзор в стиле Get Started с полезными ссылками и рекомендациями по изучению, особой глубины за 1 занятие достичь здесь не удастся при любом желании. Каждый фреймворк достоен отдельного курса.

Занятия 9-10.

SQL Basic.

Комментарий: в заключительных занятиях рассказываются основы написания SQL запросов, объясняются алгоритмы соединения (hashjoin, merge-sort join, nested loop), как писать запросы более эффективно.

Итог


Желание вести курсы выразили еще двое коллег, поэтому за право вести ту или иную тему мы тянули соломинку. Параллельно лекционным занятиям всем обучающимся выдавалось задание (desktop приложение и веб-приложение на базе Spring). По итогам курсов некоторых ребят мы рекомендовали к собеседованию, так у нас появилось три новых Junior Java Developer, которые успешно вкатываются в проект.

Дабы тема была до конца раскрыта, опишу ряд проблем, с которыми мы столкнулись:


1. Изначально группа насчитывала 18 человек, основное время обучения выпало на июнь, когда у студентов проходит сессия. С одной стороны время не самое лучшее — те, у кого есть проблемы с учебой не смогут уделять должного времени курсам, с другой — дополнительная нагрузка служила естественным фильтром от лентяев. Ведь где гарантия, что после трудоустройства проблемы с учебой не заставят сотрудника так же забивать на работу? Вопрос о времени проведения очень дискуссионный, от меня и других преподавателей это не зависело. Весь курс проходил в режиме 2 занятий в неделю.

2. Проверка домашних заданий проходила по ряду критериев:

  • Соответствует ли написанное тому, что есть в задании. При этом свобода реализации оставалась за самим студентом, т.е. описывается необходимый функционал и некоторый набор технологий, который рекомендуется применить. Как и что с чем использовать, студент должен разобраться самостоятельно. Естественно были бонусы за оригинальность.
  • Насколько хорошо студент понял объектно-ориентированный подход. Часто начинающие Java разработчики тянут из Pascal/C++ процедурный стиль выражающийся в обилии статических методов, все лишь бы не создавать объект.
  • Соответствие Java Code Conventions. Увы, но на первых порах приходится уделять этому много времени, иначе от чтения кода дергаются веки.
  • Срок сдачи. Здесь мы были достаточно лояльны, т.к. сами еще недавно были студентами, но тем, кто сдал раньше были преференции.

Студенты присылали задание на почту, далее я или мои коллеги писали небольшое сопроводительное письмо в ответ, в котором сообщали вердикт (принята работа или нет) и давали ряд комментариев по недочетам. Таких итераций на одно задание максимально доходило до 3, каких-то пределов мы не ставили. Было выяснено опытным путем, что даже если вы уделите особое внимание на лекции некоторой распространенной ошибке или покажете best practice, то все равно будет группа людей, которая это пропустит мимо. Таким образом, презентация по лекции становилась удобным справочником, в который можно тыкать носом отправлять провинившихся для просвещения.

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




К сожалению, не доступен сервер mySQL