С недавнего времени я преподаю в ЮУрГУ у 4-го курса на кафедре Информатики. Через меня уже прошли 4 группы очников и 4 группы заочников. Я веду дисциплину, которая загадочно называется Технология программирования. У меня появился некоторый опыт работы со студентами, здесь я бы хотел рассказать о нем, услышать мнение других преподавателей по этому поводу.
Цель
Для меня, как для преподавателя, очень важно понять набор навыков, которыми должен будет обладать студент. Тогда я смогу понять, добился я своей цели или нет.
Тема обсуждалась в гугл-группе в топике Перечень знаний для выпускника профильной специальности, где я предложил набор навыков, который считаю обязательным, для выпускника нашей специальности:
- Понимание алгоритмизации и работы автоматов
- Понимание ООП (желательно понимание других парадигм)
- Знание как минимум двух языков: строго типизированного и динамического (желательно добавить функциональный)
- Понимание шаблонов проектирования
- Понимание принципов проектирования
- Понимание разных процессов разработки
- Умение управлять рисками
- Умение организовывать свое время
- Умение быть частью команды/процесса
- Умение доводить начатую задачу до конца
- Умение формулировать свои мысли письменно и устно
- Умение самостоятельно искать информацию и саморазвиваться
- Навыки разработки, как минимум: веб-приложений и десктоп (желательно мобильные устройства, веб-сервисы и т.д.)
Другими словами студент должен быть готов влиться в реальную команду разработчиков, которые производят Enterprise-решения.
Как этого добиться?
Мне дают 4-й курс на два семестра. Обучение я разбиваю на два логических шага.
Первый семестр - каждый сам за себя
Каждый студент придумывает себе проект и занимается его самостоятельной разработкой. Проект должен быть ни большой, ни маленький. Подойдет аналог сайта по сокращению ссылок или несложный антивирус. Проект разрабатывается на .NET Framework, поэтому в начале семестра есть вводные лекции по .NET/C#.
Разработка проекта у среднего студента занимает около семестра. Моя задача, как преподавателя, в период разработки помочь студенту закончить проект (это очень важно) и показать основы рефакторинга, применение шаблонов для UI. На первом шаге для понимания процесса работы с реальными задачами не нужны VCS, CI, Big Upfront Desing с помощью UML и т.п. накрутки, не нужны знания про процесс разработки Waterfall/RUP/Agile.
Цель первого шага - студент должен самостоятельно выбрать себе проект, который ему интересен, сделать его от начала и до конца и увидеть применение best practicies.
На этом же шаге я объясняю ООП с примерами из проектов студентов. Показываю на ошибки и показываю к чему эти ошибки могут привести. Таким образом, закрепляя теорию ООП на практических примерах.
Некоторые студенты уже на этом этапе начинают интересоваться модульными тестами, ORM, берут хорошие книжки. К тестам подвести совсем не сложно. Когда в очередной раз я прошу поменять что-либо в проекте, студент меняет и сидит в дебаге, вопрос "А как повысить надежности системы при внесении изменений?" возникает сам собой. И тут я могу показать что такое тесты и что значить рефакторинг.
Заканчивается этот семестр зачетом, допуск к зачету: работающая система. Сам зачет проходит в устной форме, в виде беседы, плюс я прошу порисовать схемы и накидать немного кода, чтобы я убедился, что студент действительно понимает материал. Вытянутый билет - это только повод для начала разговора, а совсем не граница для моих вопросов.
Второй семестр - командная разработка
Сначала проходит сбор идей, которые можно реализовать. Каждый пишет 5-6 идей, после этого "продает" свои идеи другим студентам. Обычно остается по одной идее на человека. Дальше голосуем на одну, которую будет реализовывать во время семестра. Один из студентов становится менеджером проекта. Допуск до экзамена для PM'а - реализованная командой идея и наличие списка рисков, их анализ. Для команды - вклад в общий проект (легко посмотреть по коммитам), покрытие тестами от 50%, правильная архитектура.
На этом этапе для самих студентов становятся актуальными практики управления проектами, настройка CI, VCS, Bug Tracker и т.п. Опять же вопросы возникаю сами собой: "А как мы будем одновременно писать код?". На что у меня есть готовый ответ в виде Google Code и Hg.
Содержание и порядок подачи тем очень похож на программу в SkillTrek.
Кроме того, много внимания я уделяю отношению к проекту. Обязательно рассказываю про позицию Жертвы и позицию Автора, как уже делал на AgileDays. После такой лекции уже никто не пытается применить фразы типа "А я весь семестр с Hg не мог разобраться, так что извините :)".
Дополнительно менеджер проектов составляет список рисков по шаблону, который предложен в книге Вальсируя с Медведями: управление рисками в проектах по разработке программного обеспечения.
Второй семестр обычно вызывает бурю эмоций. Студентам достаточно тяжело и необычно работать в команде. Этот процесс приближает их к реальной разработке, т.к. нужно взаимодействовать друг с другом, а раньше они отвечали только за себя. Был случай, когда девочка PM со слезами кричала, что ее никто не слушает и никто не хочет делать проект. В результате проект сделали, но история осталась :)
Заканчивается этот семестр экзаменом. Экзамен проходит в устной форме, иногда с вопросами по написанному коду.
Результат
Для меня результатом являются готовые проекты студентов и их положительные отзывы. Я вижу, как в течение 2х семестров они улучшают свои навыки разработки ПО. Заочники приходят ко мне и делятся новостями, о том как они на своей работе внедряют то, что изучили.
Если вы видите, что можно добавить или изменить в этом подходе, поделитесь со мной, пожалуйста, в комментариях.