Всем привет!

Сегодня практика ведения курсов перед трудоустройством достаточно распространена во многих компаниях, я и сам когда-то начинал свою карьеру с прохождения обучения, но мне всегда было интересно попробовать себя в качестве преподавателя. И этой весной я узнал, что в нашей компании весной-летом пройдут курсы по итогам которых команды пополнятся бойцами по ряду направлений: 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. Если судить по количеству вопросов, то наибольшую трудность вызывали параллельное программирование (максимальное количество) и ООП (минимальное — нет вопросов). С первым все понятно, тема очень глубокая и ей нужно заниматься отдельно. В голову попадает сразу большой объем информации, в которой очень много нюансов, сразу переварить не удается. Со вторым, интереснее, т.к. в большинстве своем принципы объектно-ориентированного программирования выражены в предложениях рекомендательного характера, на простом человеческом языке, без привязки к чему-то конкретному, то, по моему мнению, при первой встрече студенты не относятся к ней слишком серьезно и стараются дождаться материала с листингами кода, где по их мнению есть видимая практическая ценность. Правда как только доходит дело до практики — именно здесь наибольшее количество проблем.

Комментарии (17)


  1. AEP
    17.09.2017 16:50
    +7

    Тема не раскрыта. Содержание статьи — это введение, программа курса и частичное обоснование, почему темы разбиты по занятиям именно так. Для раскрытия темы «опыт проведения курсов» надо, как минимум, рассказать о следующем:

    • местах, вызывавших наибольшее непонимание и затруднения;
    • методах проверки домашних заданий;
    • методах работы с группой (чтобы сильные не скучали, а слабые не терялись).


    1. nzeshka Автор
      17.09.2017 17:54

      Спасибо за комментарий, дополнил.


  1. Sad_Bro
    17.09.2017 19:14
    +3

    кто нибудь из 'экзотических' после курса получил офер? У нас такая же есть практика в компании с курсами. Были желающие чуть за 40, которые качественно выполняли дз и проявляли сильную заинтересованность. Но в итоге никого не позвали.


    1. nzeshka Автор
      18.09.2017 00:19
      -1

      Вышло так, что с нашего направления они отсеялись на этапе отбора заявок, однако, тот кандидат, которому было за 40, прошел в группу по Javascript, отходил, но до собеседования дело вроде бы не дошло.


    1. MaxLich
      18.09.2017 12:43
      +1

      возрастная дискриминация?)


      1. nzeshka Автор
        18.09.2017 12:44

        Нет, ни в коем случае. Решение принималось исходя из объективных признаков.


        1. MaxLich
          18.09.2017 12:55
          +1

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


  1. MinGW
    18.09.2017 12:42

    Спасибо, очень познавательно!
    А скоро ли планируется повторять подобный «набор с обучением»? :-[


    1. nzeshka Автор
      18.09.2017 12:43

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


  1. Mordog
    18.09.2017 12:45
    +1

    Было бы интересно узнать, почему хибернейт изучается до SQL Basic.


    1. nzeshka Автор
      18.09.2017 12:49

      Вы правы, забыл указать в комментарии, что в лекции с Hibernate есть «интро» о JDBC подходе и само собой там приводятся краткие примеры с SQL.


  1. Portnov
    18.09.2017 12:49

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


    1. nzeshka Автор
      18.09.2017 13:42

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


  1. MaxLich
    18.09.2017 12:59

    Что-то непонятно, каких кандидатов берут? Какие знания от них требовались? На каком языке им надо было написать тестовое задание? Не на джаве что ли? Да и то, что всего пару занятий даётся на кор — это странно. То ли занятия большие по времени и объёму, то ли это какое-то повторение.

    ЗЫ А в каком городе это проводилось? Я, допустим, изучил кор джавы, но ее-шные вещи знаю довольно плохо, и рад был бы пройти курсы/стажировку по этому самому (но пока ничего не нашёл). Если кандидат уже знал кор, вы его в любом случае брали на курсы?


    1. vlanko
      18.09.2017 14:13

      А Спринг за 1 занятие вас не удивляет?


      1. nzeshka Автор
        18.09.2017 14:28

        Моя позиция следующая, 70% студент должен взять засчет самостоятельного обучения, моя задача — подсказать где читать и что осваивать. За 10 занятий просматривается все, что необходимо для выполнения практических занятий и немного сверху. Даже если бы здесь было 40 лекций, все равно научится чему-то только тот, кто захочет чему-то научиться. На первом же занятии я стараюсь вселить уверенность в том, что магия «выучи Х за Y дней» не работает. Нужно долго и усердно трудиться, чтобы был результат.


      1. MaxLich
        18.09.2017 15:20

        я плохо знаю спринг, поэтому об этом ничего не могу сказать.