Программист в большой компанииИсточник: dtf Дмитрий Долгов
Дмитрий Долгов Последние 9 лет я посвятил индустрии разработки компьютерных игр, пройдя путь от младшего программиста до начальника отдела программирования крупной компании. И большую часть этого времени сталкивался с проблемой поиска квалифицированных кадров. Я публиковал информацию о вакансиях, изучал присылаемые резюме, проводил собеседования и принимал новых программистов на работу. Одной из основных проблем, возникающих в процессе работы, стала проблема интеграции новых молодых специалистов в команду при практически полном отсутствии у них информации о правилах и принципах коллективной разработки программного обеспечения. Перейдя на работу в фирму "1С", я понял, что со схожими проблемами сталкиваются все, кто принимает на работу новых программистов - студентов или недавних выпускников ВУЗов. Если же речь идет о команде, которая целиком составлена только из молодых специалистов, последствия могут быть просто фатальными. Уже неоднократно приходилось проводить "экспресс-курсы" для молодых команд-разработчиков. Причем тот хаос, который творится в отделе программирования, часто пытаются выдавать за "нормальный рабочий процесс", хотя он на самом деле вызван отсутствием базовых знаний по методологии программирования. В этой статье, написанной по мотивам доклада на первой международной научно-практической конференции "Современные информационные технологии и ИТ-образование", я попробую проанализировать основные "белые пятна" в системе образования. Вообще, тема недостаточности подготовки молодых специалистов в области программирования - не нова. С завидной периодичностью на различных форумах (в том числе и на DTF) возникают бурные дискуссии на эту тему. К сожалению, большая часть этих дискуссий сводится только к двум вопросам: "нужно ли высшее образование как таковое" и "все плохо". Достаточно активная дискуссия по поводу подготовки новых кадров для игровой индустрии развернулась и на упомянутой выше конференции. Я очень надеюсь, что многие идеи, высказанные на заседаниях и круглых столах, найдут свое отражение в новых учебных планах и программах дополнительного образования для подготовки молодых специалистов в области игровой индустрии. К сожалению, большинство преподаваемых в настоящее время учебных курсов делают акцент не на методологии, а только на технических аспектах кодирования - языках, алгоритмах, стандартных пакетах. В результате студенты, приходящие на работу после завершения института (или еще во время учебы), оказываются в совершенно необычной для себя ситуации. В институте при решении учебных задач в первую очередь требуется результат - график, таблица, отчет. Сама программа здесь выступает не как цель, а только как средство решения задачи. Внутренняя структура программы, как правило, никого не интересует; после сдачи отчета программа отправляется в мусорную корзину. Такие программы я буду называть "лабораторными". Коммерческой программный продукт пишется командой программистов для сторонних пользователей. Программа должна работать на других компьютерах (с произвольной конфигурацией и объемом памяти), должна иметь удобный и интуитивно понятный интерфейс пользователя, не содержать ошибок, могущих повлечь за собой потерю данных. Как правило, коммерческая программа отчуждается от разработчика, то есть запускается на компьютерах, удаленных от места разработки. Соответственно, программа должна иметь инсталлятор и обновитель версий. При возникновении ошибок программист путем простого диалога с удаленным пользователем, анализа файла протокола и сообщений программы, должен иметь возможность локализовать и исправить ошибку. Если свести вместе все основные отличия лабораторных и коммерческих работ, получим следующую картину: Лабораторная работа
Коммерческая программа
Попробую кратко изложить идеи, которые несколько лет назад стали толчком к активному развитию методологических направлений на кафедре "Прикладная Математика" Санкт-Петербургского Государственного Технического Университета (бывшего Политехнического института). 11 лет назад, будучи студентом третьего курса, я впервые столкнулся с работой в большой компании. Японская фирма "Integra" начала разработку нового программного обеспечения, и часть работы была заказана специалистам из Польши и России (Москвы, Петербурга и Новосибирска). Разработку одного из графических модулей поручили мне. Задача заключалась в генерации списков пространственных вокселей, которые полностью или частично лежат внутри произвольно ориентированной пирамиды зрения. Несколько дней я изучал очень жесткие стандарты кодирования фирмы "Integra". Затем неделя ушла на обсуждение с заказчиками внешнего программного интерфейса, которым должен был обладать новый модуль. Потом мы долго обсуждали возможные алгоритмы реализации и делали тесты на производительность. И только после этого я приступил к кодированию. Смысл еще одного аспекта проводимой работы мне был тогда совершенно непонятен. За соседний компьютер посадили моего коллегу, который занялся реализацией альтернативного алгоритма. Его задача была проще - надо было написать самый простой, медленный, но надежный алгоритм генерации списков вокселей. Затем он подключил мой вариант библиотеки и начал запускать программу, сравнивая получаемые результаты. По условиям технического задания, быстрый алгоритм не имел права пропускать какие-то актуальные вокселы, но мог допускать не более 2% ложных (не принадлежащих пирамиде видимости) вокселей. Таким образом, надежный алгоритм генерации списков помогал тестировать мою версию. В итоге алгоритм был успешно реализован, оттестирован, прошел ревизию исходного кода у программистов основного филиала компании и был встроен в программный продукт. Но глубокий смысл всей этой работы я осознал только через несколько лет. Выводы:
После окончания института эти выводы легли в основу новых лабораторных занятий по предмету "Технология программирования" для студентов четвертого курса. Основные задачи в этом курсе сводились к следующему:
Фактически этот лабораторный курс был попыткой сымитировать работу в большой компании или работу "на заказ" для большого проекта в рамках обычных студенческих лабораторных работ - аналогично тому, как велась работа для компании "Integra". Были получены следующие результаты:
Кроме непосредственного теоретического и практического курса по технологии программирования, некоторые элементы методологии также включаются в программы других учебных курсов, начиная с самого первого семестра. Вот основные разделы, базовая информация по которым должна быть представлена в учебных программах: 1. Стиль программирования, комментарии, самодокументируемый код. Лекции рекомендуется проводить на первом курсе вместе с лекциями, посвященными любому из языков программирования. Две лекции по этой теме, проведенные на первом курсе в качестве эксперимента (при условии постоянного контроля на практических занятиях), привели к тому, что у всех студентов в течение нескольких недель сформировался грамотный и красивый "почерк" при написании программ для лабораторных работ. 2. Методики программирования, на примерах самых различных моделей жизненного цикла - от каскадной модели до экстремального программирования. Теоретический материал для студентов 3-5 курса. Вопросы его поддержки в лабораторном практикуме к настоящему моменту еще не рассматривались. 3. Принципы создания небольших компонент в рамках большого продукта. Может сопровождаться лабораторными работами по разработке COM-объектов и другими аналогичными задачами. 4. Архитектура программного обеспечения. Функциональная и структурная декомпозиция, принципы сокрытия информации и т.п. Базовые знания о правильном построении структуры программы должны даваться уже на первом курсе при изучении языков программирования. Более глубоко вопрос можно прорабатывать вместе с "Принципами создания небольших компонент". 5. Методология ошибок. Классификация, симптомы, методы поиска и предотвращения. Часть этой информации должна проходить красной нитью через многочисленные существующие курсы (начиная с самого первого семестра). Как отдельный предмет (или как набор систематизирующих и обобщающих лекций) может включаться в программу 3 или 4 курса. 6. Работа с системами контроля версий. Материал для студентов 3-4 курсов. Должен включать в себя рассмотрение наиболее распространенных систем (например, VSS, CVS, SVN), информацию о порядке работы с ветками (branches), метками (labels), списками изменений (changeset) и т.п. Нерешенный вопрос - как организовать лабораторный практикум по этой теме? 7. Начальные сведения об управлении программными проектами. Предположительно, материал для студентов пятого или шестого курсов, обучающихся по магистерской программе. Можно рассматривать этот материал как логическое продолжение курса, посвященного методикам программирования (пункт 2). Как я уже сказал, одним из ключевых вопросов по многим обозначенным направлениям остается вопрос лабораторного практикума для этого курса. В настоящее время рассматриваются различные новые варианты, например, проведение лабораторных работ, при котором каждый из студентов после разработки программы отдает ее на code review своим товарищам, и они пытаются проанализировать этот код на наличие ошибок, на читабельность и стилистику. Финальный code review осуществляется преподавателем и сравнивается со всеми остальными. Такой подход можно применять как на лабораторных работах по методологии программирования, так и в работах по другим предметам. Однако этот подход существенно увеличивает нагрузку, которая ложится на преподавателя. К сожалению, имеет место и тенденция к автоматизации процесса обучения (студент написал лабораторную работу - запустил - получил ответ - записал его в поле ввода в автоматической экзаменационной программе - получил зачет). Такая автоматизация исключает этап методологического осмысления программы и никоим образом не формирует у студентов правильную стилистику и структуру кода. И последнее. Я ни в коем случае не хочу, чтобы у вас сложилось мнение, что вопросам технологии программирования не уделяется внимания. Это не так. Во многих ВУЗах поставлены хорошие лекционные курсы. Но, судя по качествам молодых специалистов, они не поддержаны лабораторными или практическими занятиями, дающими навыки коллективной работы над большими проектами. На это следует обратить особое внимание. |