Я преподаю программирование в университете с 2000 года. Когда-то я был зеленым преподом, который побаивался заходить к студентам, потому что нужно было выглядеть умным, все знать, уметь отвечать на каверзные вопросы. Потом я понял, что набор каверзных вопросов ограничен и, слушая их из года в год, я знал на все такие вопросы ответы. Но история не об этом.
Кроме преподавания я сам активно занимался (и занимаюсь) программированием. И преподавание в университете для меня сейчас хобби, которое в материальном плане скорее убыточно, т.к. за то время, которое я трачу на студентов, я бы заработал больше, чем мне платит университет. Но и не об этом данная история тоже.
А хочу я поделиться тем, как, на мой взгляд, стоит строить обучение программированию.
Не знаю как в других университетах, но в нашем программированию учат так. Есть теоретические лекции, где рассказывают о языках программирования и о базовых алгоритмах и структурах данных (сортировки, связанные списки, стеки, очереди и т.д. и т.п.) Есть практические занятия, где студенты выполняют одинаковые лабораторные работы. Их обычно от 3 до 5 за семестр. Вроде бы все хорошо. Есть теория и есть практика. Учись и набирайся опыта. Но, на мой взгляд, практика не совсем та. Каждый студент варится в своей каше, пишет маленькие проекты и опыта набирается крайне мало.
А теперь к сути поста! Попалась мне группа очень толковых студентов. Еще со школьных времен они умели неплохо программировать. И я решил с ними отказаться от классического подхода. Тогда они учились на первом курсе. Я предложил им не делать лабораторные работы, а разработать один большой совместный проект. Часть из них отказались и стали делать обычные лабораторки, а большинство согласились. Я предложил им написать клиент-серверное приложение для организации математических вычислений (умножение матриц, символьное дифференцирование и т.д.) На сервере будет заложена математика, а клиент – это просто визуальный интерфейс для задания входных данных и отображения результата. Сервер один, а клиентов может быть масса. Общение через TCP/IP. Напоминаю – это были студенты первого курса. Результат вышел не самый лучший, но прототип даже работал! Пусть работал с ошибками и даже падал, но, на мой взгляд, это был достойный результат!
Прошел год. Ребята перешли на второй курс. Преподавание программирования продолжается. Они уже не были удивлены, когда я предложил вместо скучных лабораторок снова разработать совместный проект. На этот раз был следующий проект. Необходимо было разработать платформу для проведения соревнований виртуальных роботов. Т.е. был лабиринт (многоэтажный). У роботов было оружие. Был разработан свой язык программирования (оказался очень похожим на Pascal) для задания логики поведения роботов. На сервер заливались алгоритмы роботов. Запускался движок. И на клиентских приложениях визуализировалась баталия роботов. Это лишь поверхностное описание задачи. Я хочу показать, что проект был далеко нетривиальный.
И тут работа закипела. Сначала мы коллективно составляли ТЗ. Я для ребят поставил Mediawiki. Там они редактировали ТЗ. Потом пошла реализация. Активно использовали SVN. Графика на OpenGL. Был разработан интерпретатор языка программирования для задания поведения роботов (кстати, это сделал один из студентов единолично). В процессе разработки выделились лидеры, которые активнее всех принимали решения по архитектуре. Иногда дело доходило чуть ли не до драки. Периодически более активные «пинали» тех, кто тормозил с реализацией своей части. Я просто ловил кайф, наблюдая за этим процессом. Такой опыт значительно полезней, чем лабораторные работы, написанные в одиночку. Хочу обратить внимание, что ребята действительно были толковые, и на выполнения лабораторных работ они бы потратили на порядок меньше времени, чем на участие в совместном проекте. Но им это тоже было по душе.
Если честно, то я потратил на эту группу тоже значительно больше сил и времени, чем если бы я проводил практические занятия по обычной схеме.
А что дальше, спросите вы? А дальше ребята проявили себя следующим образом. Трое из группы собрали команду (еще один участник команды учился не у меня) и вышли в международный финал Microsoft Imagine Cup (не в этом году). Двое из них сейчас уже работают в США. Очень хочется верить, что мой эксперимент с преподаванием хоть чуток, но помог им добиться такого результата.
А что я? Я сейчас не преподаю программирования на первых курсах и подобные эксперименты больше не ставлю. И, наверное, зря. Если этот пост прочитают преподаватели программирования – задумайтесь… Может быть стоит иногда отходить от классических канонов?
Вывод: Всегда приятней и легче получать знания и опыт, если процесс интересен. Не спорю, что мне попались изначально толковые студенты. Но я лично наблюдал, как умные ребята делают за пару часов лабораторную работу так, чтобы просто получить зачет. Не вкладывают в процесс душу и полученный опыт близок к нулю. Если вы преподаватель и видите в глазах студентов искорку — не дайте ей угаснуть!
P.S. Не исключено, что мои студенты узнали себя в этом посте. Прошло уже несколько лет, и я мог что-то перепутать. Не стесняйтесь написать мне – я поправлю.
Кроме преподавания я сам активно занимался (и занимаюсь) программированием. И преподавание в университете для меня сейчас хобби, которое в материальном плане скорее убыточно, т.к. за то время, которое я трачу на студентов, я бы заработал больше, чем мне платит университет. Но и не об этом данная история тоже.
А хочу я поделиться тем, как, на мой взгляд, стоит строить обучение программированию.
Не знаю как в других университетах, но в нашем программированию учат так. Есть теоретические лекции, где рассказывают о языках программирования и о базовых алгоритмах и структурах данных (сортировки, связанные списки, стеки, очереди и т.д. и т.п.) Есть практические занятия, где студенты выполняют одинаковые лабораторные работы. Их обычно от 3 до 5 за семестр. Вроде бы все хорошо. Есть теория и есть практика. Учись и набирайся опыта. Но, на мой взгляд, практика не совсем та. Каждый студент варится в своей каше, пишет маленькие проекты и опыта набирается крайне мало.
А теперь к сути поста! Попалась мне группа очень толковых студентов. Еще со школьных времен они умели неплохо программировать. И я решил с ними отказаться от классического подхода. Тогда они учились на первом курсе. Я предложил им не делать лабораторные работы, а разработать один большой совместный проект. Часть из них отказались и стали делать обычные лабораторки, а большинство согласились. Я предложил им написать клиент-серверное приложение для организации математических вычислений (умножение матриц, символьное дифференцирование и т.д.) На сервере будет заложена математика, а клиент – это просто визуальный интерфейс для задания входных данных и отображения результата. Сервер один, а клиентов может быть масса. Общение через TCP/IP. Напоминаю – это были студенты первого курса. Результат вышел не самый лучший, но прототип даже работал! Пусть работал с ошибками и даже падал, но, на мой взгляд, это был достойный результат!
Прошел год. Ребята перешли на второй курс. Преподавание программирования продолжается. Они уже не были удивлены, когда я предложил вместо скучных лабораторок снова разработать совместный проект. На этот раз был следующий проект. Необходимо было разработать платформу для проведения соревнований виртуальных роботов. Т.е. был лабиринт (многоэтажный). У роботов было оружие. Был разработан свой язык программирования (оказался очень похожим на Pascal) для задания логики поведения роботов. На сервер заливались алгоритмы роботов. Запускался движок. И на клиентских приложениях визуализировалась баталия роботов. Это лишь поверхностное описание задачи. Я хочу показать, что проект был далеко нетривиальный.
И тут работа закипела. Сначала мы коллективно составляли ТЗ. Я для ребят поставил Mediawiki. Там они редактировали ТЗ. Потом пошла реализация. Активно использовали SVN. Графика на OpenGL. Был разработан интерпретатор языка программирования для задания поведения роботов (кстати, это сделал один из студентов единолично). В процессе разработки выделились лидеры, которые активнее всех принимали решения по архитектуре. Иногда дело доходило чуть ли не до драки. Периодически более активные «пинали» тех, кто тормозил с реализацией своей части. Я просто ловил кайф, наблюдая за этим процессом. Такой опыт значительно полезней, чем лабораторные работы, написанные в одиночку. Хочу обратить внимание, что ребята действительно были толковые, и на выполнения лабораторных работ они бы потратили на порядок меньше времени, чем на участие в совместном проекте. Но им это тоже было по душе.
Если честно, то я потратил на эту группу тоже значительно больше сил и времени, чем если бы я проводил практические занятия по обычной схеме.
А что дальше, спросите вы? А дальше ребята проявили себя следующим образом. Трое из группы собрали команду (еще один участник команды учился не у меня) и вышли в международный финал Microsoft Imagine Cup (не в этом году). Двое из них сейчас уже работают в США. Очень хочется верить, что мой эксперимент с преподаванием хоть чуток, но помог им добиться такого результата.
А что я? Я сейчас не преподаю программирования на первых курсах и подобные эксперименты больше не ставлю. И, наверное, зря. Если этот пост прочитают преподаватели программирования – задумайтесь… Может быть стоит иногда отходить от классических канонов?
Вывод: Всегда приятней и легче получать знания и опыт, если процесс интересен. Не спорю, что мне попались изначально толковые студенты. Но я лично наблюдал, как умные ребята делают за пару часов лабораторную работу так, чтобы просто получить зачет. Не вкладывают в процесс душу и полученный опыт близок к нулю. Если вы преподаватель и видите в глазах студентов искорку — не дайте ей угаснуть!
P.S. Не исключено, что мои студенты узнали себя в этом посте. Прошло уже несколько лет, и я мог что-то перепутать. Не стесняйтесь написать мне – я поправлю.