ПОДГОТОВКА СТУДЕНТОВ-ПРОГРАММИСТОВ К ПРОФЕССИОНАЛЬНОЙ ДЕЯТЕЛЬНОСТИ ЧЕРЕЗ ПРАКТИЧЕСКИЕ ЗАНЯТИЯ - Студенческий научный форум

IX Международная студенческая научная конференция Студенческий научный форум - 2017

ПОДГОТОВКА СТУДЕНТОВ-ПРОГРАММИСТОВ К ПРОФЕССИОНАЛЬНОЙ ДЕЯТЕЛЬНОСТИ ЧЕРЕЗ ПРАКТИЧЕСКИЕ ЗАНЯТИЯ

Ковешников И.Н. 1
1ФГБОУ ВО «Уфимский государственный авиационный технический университет», Уфа, Россия
 Комментарии
Текст работы размещён без изображений и формул.
Полная версия работы доступна во вкладке "Файлы работы" в формате PDF
Подготовка студента в качестве эксперта-одиночки

Большая часть современных подходов направлена на то, чтобы превратить студента в специалиста, который самостоятельно может решить поставленную проблему или обладает достаточным уровнем компетенций для корректного и предсказуемого по времени решения задачи. Один из двух устоявшихся способов -- "накачка" студента фундаментальными знаниями и навыками, которая позволяет подготовить специалиста для работы в любой из областей информационных технологий. Другой способ оспаривает полезность мастеров на все руки и сосредоточен на подготовке более узкоспециализированных специалистов, но владеющих актуальными знаниями.

Мне довелось побывать с разных сторон баррикад рынка труда. И в качестве студента без опыта в поисках работы; и работодателя, принимающего и обучающего таких же студентов; и аспиранта, изучающего методики подготовки будущих специалистов. В результате этого у меня сформировалось своё мнение о методике подготовки специалистов в области программной инженерии.

Традиционный подход: фундаментальные знания – основа программиста

"Именно фундаментальные знания отличают техника от программиста.", "Всегда есть такой алгоритм, который может помочь решить задачу в несколько раз эффективнее.", "Нельзя расширить систему, не зная, как она устроена и по каким принципам функционирует." - все это девизы и основные посылы для подготовки студентов в направлении разработки программного обеспечения. И все они верны.

Как готовят программистов при традиционном подходе? Есть ряд дисциплин, обязательных для понимания и построения сложных алгоритмов: дискретная математика, теория графов, теория множеств, структуры данных, алгоритмы, операционные системы, компьютерные сети и т.д.. Большая часть дисциплин из списка - фундаментальные, и преподаются они достаточно традиционно: производится деление на лекционные и практические занятия. На лекционных занятиях студенты прослушивают теорию и обсуждают её, а на практических - учатся её применять.

Для дисциплин, больше приближенных к практике (например, алгоритмы или структуры данных), подход к практическим занятиям немного изменяется. Абстрактное задание по такой дисциплине сводится к воспроизведению материалов с лекций и потому имеет низкую ценность. Вместо этого подбираются задачи из других дисциплин (математики, физики, биологии, химии, экономики...), для решения которых необходимо применять новоприобретенные знания. Это позволяет выстроить связь теории с реальной жизни и учит студента выделять в задаче её математическую модель. Затем полученная модель декомпозируется на совокупность примитивов, для которых в рамках теории уже есть оптимальные решения. Следующий шаг -- реализовать решение для каждого из примитивов и объединить их в единую программу, которая решает поставленную задачу. Решение реализуется обычно на алгоритмическом языке или на одном из преподаваемых языков, традиционно это один из языков Pascal, Delphi, C/C++, реже – Java.

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

Сторонники подхода подошли к проблеме образования студентов так же, как сами и учат: выделили наиболее важные умения специалиста, наиболее важные знания и составили план по их достижению. Это очень действенный и эффективный подход, который выполняет свою задачу: подготовку высококвалифицированных кадров для научных и коммерческих предприятий. Большая часть именитых и влиятельных университетов подготавливают специалистов именно таким способом, успешные студенты MIT, Stanford, МФТИ, МГТУ без труда находят работу в IT-компаниях с мировым именем.

Новаторский подход: актуальные знания - залог успеха

Традиционные подход часто критикуется за то, что студенты не обладают достаточным набором практических навыков и в реальности сталкиваются с проблемами в поисках работы, а потом и в работе. Тот факт, что студенты ведущих вузов получают работу в ведущих компаниях, ещё ни о чем не говорит. Лучшие университеты притягивают лучших студентов. Лучшие студенты обладают некоторым специфическим набором качеств, профессиональных и личностных, но главное, что выделяет их из толпы - актуальные знания, которые получены где-то за пределами университета. Именитые богатые компании имеют достаточно ресурсов для приобретения специалистов, обладающих актуальными знаниями и имеющих огромную тягу к саморазвитию. Все вполне закономерно: лучшие студенты выбирают наиболее именитые вузы ради лучших перспектив, а богатые компании ищут сотрудников в самых известных вузах, так как там - лучшие студенты. Но даже студенты лучших вузов имеют проблемы с трудоустройством из-за недостатка актуальных знаний.

Что такое делают студенты, которые почти не имеют проблем с трудоустройством? И что их отличает от сверстников? Ответ прост - свои проекты. В них студент решает какую-то свою мелкую проблему и в результате познает современные технологии, которые востребованы на рынке. Решил одну - берётся за другую. И вот к концу учёбы студент написал несколько сотен строк кода, да ещё и с использованием востребованных технологий, что делает его куда более опытным по сравнению с одногруппниками. Почему этим занимаются не все студенты? Потому что быть программистом -- призвание только для небольшой доли студентов, остальные будут просто достойными представителями профессии, не всем же быть гениями. А все личные проекты студентов, по большей части -- самостоятельное решение проблемы, _уже_ решённой другими. Далеко не всем нравится решать проблемы, которых в общем-то и нет.

Если посмотреть на проблему поиска новых кадров с точки зрения бизнеса, то получается опять же не радостная картина. Программисты нужны очень разные, информационные технологии -- это не одна сфера деятельности, а целый набор. Разработка приложений для персональных компьютеров кардинально отличается от разработки web-сайтов и оба этих направления имеют мало общего с разработкой встраиваемого программного обеспечения. Да, в основе своей это программирование и общие подходы к разработке - одни и те же, но набор актуальных знаний различается настолько, что на рынке труда есть несколько типов профессий и работодатели ищут программистов только с определёнными навыками, программистов нужного _типа_. Существует серьёзное экономическое обоснование такого деления программистов. Это стоимость обучения нового сотрудника. Прежде чем новый сотрудник начнёт приносить пользу, а значит и деньги работодателю, проходит от двух до четырёх месяцев, за это время сотрудник знакомится с бизнес-процессами, с проектом, его целями, задачами и способами их достижения. Все это время сотрудник получает зарплату, тратит время обучающих его коллег, но не приносит пользы. Если программист не обладает набором актуальных знаний, которые требуются для выполнения подобной работы, то время обучения может увеличиться в несколько раз, а качество последующей работы будет ниже, чем у более опытных конкурентов.

В этом и есть недостаток традиционного подхода. Студент овладевает фундаментальными знаниями, но в начале карьеры они ему почти не пригождаются, оказывается, что любой язык программирования имеет свой набор подводных камней и лучших практик, тоже касается операционной системы, проекта, над которым работает компания, сфера её деятельности и так далее. Только некоторые фундаментальные знания начнут требоваться на 3-5 году карьеры, когда они уже забыты. При этом на работодателя перекладывается бремя подготовки специалиста, востребованного на рынке. Хуже, если работодатель не может подготовить квалифициронного специалиста, что нередко для компаний, где программисты - непрофильный актив. Получается курьёзная ситуация: при большом дефиците программистов студентов неохотно берут на работу. Такая ситуация вредна всем участникам рынка: студентам, университетам, работодателям. И сильнее всего на неё могут повлиять именно университеты.

Для того, чтобы изменить ситуацию надо давать больше актуальных знаний студентам. Профессиональные преподаватели всю или большую часть карьеры простроили в вузе и не имеют опыта работы в коммерческих компаниях. Сторонники подхода призывают преподавателей обратиться к рынку и учитывать актуальные требования к соискателям, чтобы дать больше возможностей своим студентам к трудоустройству. Необходимо напрямую обращаться к нескольким крупным компаниям, способным трудоустроить большую часть студентов и адаптировать учебные планы к потребностям этих компаний. Ещё лучше - задействовать сотрудников заинтересованных компаний в процессе обучения как консультантов для корректировки учебных планов или даже в качестве преподавателей.

Учебная деятельность в этом случае меняется в сторону увеличения доли практических занятий к лекционным. Программа фундаментальных предметов сокращается до необходимого минимума. При изучении языков программирования предпочтение отдаётся тем, которые наиболее востребованы работодателями.

Подход часто и критикуется. Качество фундаментальных знаний студентов ухудшается, а практические знания в части вузов уже не актуальны или никогда и не были таковыми. Подход требует очень высокой квалификации преподавателя: нужно внимательно следить за развитием рынка, предугадывать его движение, каждый год корректировать учебный курс, синхронизировать и планировать все предметы курса. Завкафедры должен быть не просто лучшим или самым опытным учёным, а менеджером, в руках которого управление трудоёмким производством такого продукта, как кадры. Очень мало преподавателей способны обеспечить такое качество работы, особенно, если система образования этого не предусматривает.

Подготовка студента как члена коллектива

Оба подхода имеют свои плюсы. "Фундаменталисты" обеспечивают лучшую подготовку талантливым студентам, а "новаторы" в лучше удовлетворяют потребности рынка. Минусы у подходов тоже есть, притом существенные. Я являюсь сторонником фундаментального подхода, но считаю, что нельзя готовить студентов в отрыве от анализа требований рынка. "Новаторский" подход, на мой взгляд, ставит во главу угла неверный приоритет. Нельзя строить обучение на нужных здесь и сейчас технологиях. Пусть даже мы можем предсказать развитие рынка на ближайшие 10 лет. Тогда студенты получат великолепное преимущество, первые пять лет они будут обладать знаниями, которые _нужны_ им и их работодателю.

Эта выгода иллюзорна. Как много компаний есть у вас в городе, готовых принять 20-30 новичков единовременно? А 10? Даже крупные компании не набирают столько специалистов одинаковой подготовки. И давайте не будем строить иллюзий, у крупной компании есть средства, чтобы привезти себе несколько специалистов из другого города, по-опытнее. Такие всегда найдутся. Значит нужно консолидировать требования от нескольких компаний при подготовке одной группы студентов. Либо надо делать группы меньше, либо все равно получаем специалистов, часть знаний которых будет не актуальна. Добавляем сюда малопопулярные вакансии, риски того, что студент захочет поменять сферу деятельности (у студентов нет чёткого плана на следующие 10 лет жизни). И получаем, что красивая теория с подготовкой узких специалистов проваливается.

При всем при этом, обучение студента после приёма на работу -- это стресс и для студента, и для работодателя, в этом "новаторы" правы. Это значит, что нужно проанализировать то, чему работодатель доучивает студента. Главное, с чем знакомится студент, -- профессиональная культура, нечто вроде техники безопасности: вечно забывают проинструктировать, не везде соблюдают, а ошибки заметны не сразу, но всплывают неожиданно и больно.

В первую очередь студента нанимают в коллектив и учат его коллективной работе. Коллективы бывают маленькие, где каждому приходится вносить вклад в продукт на всех этапах жизненного цикла ПО. Бывают большие, где у каждого есть своя роль с привязкой к жизненному циклу продукта, и чтобы работать в команде, этот жизненный цикл важно понимать. Теорию управления жизненным циклом студенты знают, но как она действует на практике -- не понимают.

Студенты склонны повторять следующие ошибки:

  1. "У меня все провильно, это клиенты не так пользуются!". Студент должен понимать, что балом правит клиент, он несёт деньги и он прав. Если программа была создана, следуя по другой логике, это стоит обсудить с ментором, чтобы понять причины и исправить поведение программы.

  2. Неопытным программистам свойственно высокомерие по отношению к тестировщикам, они ошибочно считают тестировщиков свои инструментом для поиска ошибок. На самом деле тестирование и ревью кода - это не методы поиска ошибок в коде. Передача кода коллегам для проверки означает, заявление исполнителя о корректности и логической целостности кода. Кроме того, программист обязан уметь тестировать код, в малых командах приходится совмещать несколько ролей.

  3. "И так сойдёт!". Это тоже заблуждение. Код пишется "в кредит": сколько бы времени не ушло бы на написание кода, на его поддержку уйдёт в несколько раз больше времени. Лучше сразу потратить время и сделать правильно, чем усложнять поддержку. в будущем.

  4. Пренебрежение системами контроля версий. Слаженная командная работа без них невозможна, это стандарт для отрасли, игнорируемый при обучении.

  5. Отсутствие качественной документации к коду.

  6. Неумение читать код. Вот этому в вузах не учат совсем. Программист большую часть работы читает чужой код, а на написание своего тратит очень мало времени.

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

Методика обучения студентов-программистов

Образование должно стремиться быть более фундаментальным. Пусть первые три-пять лет эти знания не пригодятся, зато потом восстановить их будет проще, чем изучать с нуля. Это не освобождает препродователей от ежегодной актуализации курсов: информационные технологии постоянно меняются, а значит курсы должны вбирать актуальные методы и подходы. Так же нужно завлекать коммерческие компании проводить мастер-классы по актуальным технологиям, а студентов всячески поощрять на посещение таких семинаров. Это единственный способ дать студентам ту подготовку, которую желает видеть работодатель.

Нужно предупреждать ошибки, свойственные студентам. Для практики чтения кода лучше всего подходит формат практического занятия: студенты получают на изучение (1-2 недели) относительно большой логически целостный кусок кода на 10-15 тысяч строк; далее в ходе практического занятия требуется обсудить со студентами, как они поняли предназначение кода, каждой функции, каждой строки, где есть ошибки, а где - неясная логика. Такие занятия должны быть постоянными в течении всего процесса обучения. В качестве кода для изучения лучше брать не абстрактные академические примеры, а популярные библиотеки с открытым исходным кодом, это поможет студентам понять, как мыслят профессиональные программисты и как они подходят к решению проблем.

Для тренировки всего набора умений в комплексе подходит следующая групповая самостоятельная проектная работа. Студенты делятся на пары: так студенты смогут обсуждать задачи и выдавать более взвешенные решения, а так же учатся работать в команде. Каждые три пары составляют рабочую группу: "заказчик" - "программисты" - "ревьюеры". Рабочие группы формируются таким образом, чтобы каждая пара студентов играла каждую из ролей ровно один раз. Проект все пары студентов начинают с равным числом очков. Преподаватель выступает арбитром в случае возникновения споров.

  1. Преподаватель разыгрывает среди "заказчиков" модели ситуаций. В них писано, какую компанию представляет заказчик и с какой проблемой он столкнулся. "Заказчик" должен согласовать задачу со своими "программистами" в течении одной недели. Общение ведётся по электронной почте, копия направляется преподавателю. Начиная с этого момента "заказчик" готовит программу приемо-сдаточных испытаний.

  2. В течении двух недель "программисты" должны реализовать решение поставленной задачи. К началу второй недели "заказчик" и "программисты" должны согласовать программу приемо-сдаточных испытаний. Отрабатываемые навыки: постановки задачи,

  3. В течении следующей недели "ревьюеры" читают задачу, решение "программистов", программу испытаний. Их задача -- оценить качество кода "программистов". "Программисты" в течении этой недели могут учесть замечания и запросить повторный анализ кода. Анализов может быть не более трёх. За каждую найденную ошибку "ревьюверам" добавляется очко, а у "программистов" – отнимается.

  4. Последняя неделя отводится на приемо-сдаточные испытания. "Заказчик" получает решение от "программистов" и проводит испытания в соответствии с методикой. Если "заказчик" сталкивается с ошибкой, то он получает балл, а "программисты" и "ревьюеры" - теряют. "Ревьюер" может сохранить свой балл, если докажет, что ошибка произошла из-за неисправленного "программистами" замечания. Допускается до 3-х попыток сдачи решения "заказчику".

  5. Преподаватель проверяет решения "программистов" по собственной методике. Если обнаружена ошибка, не обнаруженная "заказчиком", то "заказчик" теряет одно очко. Исходный код, написанный командой "программистов", просматривается и отмечаются ошибки реализации.

  6. По результатам проверки всех работ проводится семинар для обсуждения проблем и ошибок. Если "программисты" продолжают совершать уже проработанные ошибки, "ревьюеры" их пропускают, то они штрафуются на балл за каждую из ошибок. То же касается и "заказчиков" и из методики испытаний. За ошибки, которые не обсуждались в рамках семинарских занятий, студенты не штрафуются.

Система оценивания не используется для получения итоговой оценки за практическую работу. Студентам позволяется поменять накопленные баллы на некоторые привилегии при сдаче теоретического экзамена, например, получить +20% к оценке за экзамен, возможность поменять билет и т.п. Такой способ оценки будет стимулировать студентов на качественное выполнение работы, а ценные преференции снизят вероятность сговора между студентами для получения равно высоких оценок.

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

Литература:

  1. Насейкина Л.Ф. Методика формирования компетентности в области сетевых информационных технологий студентов-программистов в условиях уровневого образования [Электронный ресурс] / Насейкина Л.Ф. // Вестник Оренбургского государственного университета — 2013 – № 2(151). – Режим доступа: [http://cyberleninka.ru/article/n/metodika-formirovaniya-kompetentnosti-v-oblasti-setevyh-informatsionnyh-tehnologiy-studentov-programmistov-v-usloviyah-urovnevogo– (Дата обращения: 06.01.2017)]

  2. Попов А.И., Поляков Д.В. Проектирование содержания обучения при подготовке студентов вуза к разработке программного обеспечения [Электронный ресурс] / Попов А.И., Поляков Д.В.. // Научно-педагогическое обозрение — 2016 – № 4(14). – Режим доступа: [http://npo.tspu.edu.ru/files/npo/PDF/articles/popov_a._i._72_79_4_14_2016.pdf– (Дата обращения: 06.01.2017)]

  3. Это знает любой студент-программист [Электронный ресурс]. – Режим доступа: https://habrahabr.ru/post/123582/. – (Дата обращения: 06.01.2016).

Просмотров работы: 391