Ермаков И. Е. Проблема подготовки ИТ-профессионалов
30.04.2007 г.
Разрыв между тремя «китами» ИТ — теорией, образованием и индустрией — на сегодняшний день весьма серьезен. Образование зачастую не имеет понимания специфики промышленной разработки ПО (проектирование и реализация крупных систем, организация жизненного цикла ПО, вопросы надежности ПО, командная работа и т.п.). Индустрия, не получая грамотных кадров, не владеет или намеренно пренебрегает теоретическими концепциями, работает «на ощупь», производя продукты низкого качества. Научное сообщество предлагает ряд концепций для построения надежного ПО и борьбы со сложностью больших проектов, но в силу слабой подготовки многих ИТ-практиков они используются в индустрии крайне ограниченно.
В ИТ устоялось разделение (хотя и несколько условное) на прикладных и системных программистов. Системное программирование подразумевает под собой решение собственных, технических проблем ИТ. Прикладное программирование — это разработка ПО для внешних по отношению к ИТ проблемных областей. Однако и в том, и в другом случае актуальные на сегодняшний день задачи имеют высокую сложность и накладывают требования на компетенции выпускников ВУЗа — человек с дипломом как системщика, так и прикладника обязан быть готовым к участию в разработке крупных программных систем по всем правилам грамотной инженерии — с системным анализом, проектированием архитектуры, документированием, верификацией и т.п. Однако в типичном случае в ИТ-образовании обучение системному и прикладному программированию существует в форме двух крайностей: понятие «системное» подменяется понятием «низкоуровневое» — изучаются соответствующие средства Ассемблера либо Си вкупе с программными интерфейсами какой-либо ОС; понятие «прикладное программирование» подменяется понятием «разработка графических интерфейсов» - «кидание» кнопок на формы в средах быстрой разработки.
Таким образом, подготовка программиста по большей части сводится к изучению конкретного языка/среды, в том числе — их многочисленных недостатков («темных углов» и «подводных камней») и способов борьбы с ними. Однако реалии таковы, что простое знание языка программирования сегодня уже не является профессией, и тем более — предметом для высшего образования; по самой высшей планке это — уровень техникума 1). Обучение программированию необходимо довести хотя бы до уровня, принятого в других вузовских инженерных специальностях — до изучения принципов проектирования и конструирования технических систем. Опираясь в учебном процессе на принцип «а какую функцию использовать для того или иного полезного эффекта», подготовить ИТ-профессионала невозможно.
Как справедливо отмечают многие специалисты, связанные с научной и практической информатикой, на сегодняшний день пагубное влияния на ИТ-образование оказывают «чума» и «холера»: «Холера — это распространение С-образных языков. Чума — это циничный маркетинг корпорацией Микрософт своего варианта языка Бейсик в системе образования» 2). Если отвлечься от такого недостатка С/С++, как неудачный синтаксис, провоцирующий ошибки, то есть и более серьезная проблема — язык не поддерживает в явном виде важнейших концепций архитектуры ПО. Например, для атомарных данных в С слабо воплощена даже такая ключевая концепция, как тип данных: если выделять три уровня типизации — технический (представление данных в памяти), математический (тип как множество допустимых значений и операций) и абстрактный (тип как спецификация содержательной роли данных), то типизация в С остановилась где-то между первым и вторым уровнем. В С/С++ отсутствует модульность, а ведь это - концепция-аксиома для любой инженерной отрасли! ООП в С++ реализовано в «замусоренном» варианте. В целом, вместо языка, на котором можно выражать проектные решения, имеется свалка слабо связанных друг с другом средств 3).
Однако столь ли важно, на каком языке обучать, если обучать не языку, а концепциям? Действительно, богатый практический опыт наставника может компенсировать недостатки используемого языка. Но люди, совмещающие серьезную работу в индустрии с преподаванием, встречаются нечасто — а это значит, что большинство преподавателей изучает концепции ИТ в основном по возможностям того же языка, на котором учат. Если на примере языка прийти к некоторым концепциям нельзя, то они так и остаются далеко за бортом образования. Трудно переоценить роль учебного языка как «корсета» для постановки правильного мышления, правильной техники программирования. Без «корсета» либо наставника-эксперта обучение не будет успешным.
В итоге имеем то, что имеем — 5 лет изучая программирование на конкретном языке(ах), научившись бороться со множеством его изъянов и особенностей, студент не владеет ни одной ключевой концепцией построения программных систем. Вместо инженера-конструктора получаем всего лишь инженера-эксплуататора конкретных продуктов. Увы, таковы сегодня требования существующего рынка труда — но должен ли ВУЗ идти на поводу у этих требований или должен сам формировать профиль соответствующих отраслей индустрии? Сложившаяся ситуация объясняется общим падением культуры и качества производства на постсоветском пространстве, которое затронуло и сферу ИТ. Здесь точно также, как и во всей экономике, произошел откат от высокотехнологичных разработок к «сырьевому» (в виде оффшора) и сборочному (в виде сопровождения западных систем) производству. На сегодняшний день у нас практически нет ни своих операционных систем, ни компиляторов и инструментария. В российском ИТ оказался выхолощен потенциал европейской и советской школ программирования (Э. Дейкстра, Н. Вирт, А.П. Ершов). Оказались забыты начавшие распространяться Modula-2 и Ada, вместо этого прижились «решения» массовой американской индустрии, со всеми их концептуальными изъянами. Так и не сложилась единая система обучения программированию в школах и ВУЗах, задел которой положил А.П. Ершов (эта система задумывалась как эквивалент созданной в СССР уникальной единой системы обучения математике, которую некогда заложил Колмогоров). Трудно переоценить ту роль, которую занял в этой зарождавшейся системе язык Паскаль (по ряду причин прижилась реализация Borland). Сегодня действует проект Информатика-21[1], продвигающий единую систему обучения программированию на основе Компонентного Паскаля и среды BlackBox. Почетный консультант проекта — Н. Вирт, участники – преподаватели ВУЗов и школ СНГ (в том числе автор этой статьи).
Спецкурс «Программное конструирование» разработан автором статьи и читается для студентов физмата ОГУ с сентября 2006 г. Этому предшествовали 2 года преподавания спецкурса для старшеклассников лицея №1 «Основы программирования и дискретной математики». «Программное конструирование» было задумано как эксперимент по комплексной подготовке студентов к разработке программных систем. С учетом описанных выше проблем, характерных для российского ИТ-образования, было задумано закрыть основные дыры в подготовке программиста, а именно: сформировать профессиональную эрудицию, систематически изучить ключевые принципы программирования «в малом» (грамотное алгоритмирование), «в среднем» (проектирование модулей и типов данных, использование средств языка программирования для выражения проектных решений) и «в большом» (архитектура программных систем). При этом спецкурс не требует наличия какой-либо подготовки в области программирования за пределами школьной. Семестр преподавания вскрыл интересный парадокс: излагаемый материал является на 70% новым даже для студентов 3-4 курса специальности «Прикладная математика и информатика», но при этом интересным и доступным даже для способных старшеклассников (три ученика 10 класса лицея №1 посещают занятия спецкурса). Столь общий, интегральный характер спецкурса является вынужденной мерой — реалии таковы, что даже у студентов ИТ-специальностей отсутствует устойчивая система понятий и концепций, на которую можно было бы опереться как на отправную точку, такую систему приходится закладывать уже «на марше». Это еще раз подтверждает, что преподавание информатики в России требует серьезнейшего усовершенствования — необходима единая базовая система обучения программированию («второй грамотности» по А.П. Ершову) в старших классах школ и на младших курсах ВУЗов.
Основным языком для обучения является Компонентный Паскаль — модифицированный Оберон-2, а средой разработки — BlackBox Component Builder. Для использования в образовании BlackBox на сегодняшний день вне конкуренции (см. [1], [3]). Язык Оберон позволяет ясно показать все ключевые концепции программирования: алгоритмизацию, структурное программирование, статическую и динамическую типизацию, модульность, объектно-ориентированное и компонентное программирование, поддерживает автоматическое управление памятью и метапрограммирование. При этом описание языка умещается на паре десятков страниц; он обозрим и изящен, не имеет «подводных камней» и изъянов в синтаксисе. Среда BlackBox удобна в использовании, компактна, пригодна как для образования, так и для промышленной разработки ПО. Однако цель курса - не изучение конкретного языка и среды. Оберон выбран по причине того, что является идеальным базисом, «общим знаменателем» для обучения современному программированию, но во всех темах постоянно приводятся ссылки на возможности других языков (при этом симпатии отдаются концептуально чистым и «академическим» языкам). Часто затрагивается язык Ada.
Спецкурс состоит из нескольких разделов. На данный момент прочитан следующий материал: История языков и технологий программирования (Эволюция абстракций ЯП. Основные вехи ЯП — Фортран, Лисп; Алгол, Си, Паскаль, Модула, Ада; Смолток; Пролог; Оберон. Модульные ЯП. ЯП и ОС «Оберон» - компонентное программирование. Современные компонентные технологии - Java, C#-.NET, Component Pascal-BlackBox. Функциональная парадигма программирования). Основы алгоритмизации (Алгоритмические паттерны. Базовые принципы, которых не знает подавляющее большинство программистов: понятие о пред/пост-условиях и инвариантах циклов; основы формального математического вывода и доказательства алгоритмов). Введение в архитектуру ПО (Понятия под-/над- системы, сервисов, модулей как «черных ящиков», интерфейсов. Операции проектирования: декомпозиция, абстрагирование, инкапсуляция. Разделение ИТ на спецификации и реализации, понятие конформности. Источники спецификаций: международные, национальные, корпоративные стандарты; проектная документация. Понятие об открытых системах. Проектирование, основанное на контрактах. Контракт, как спецификация на сервис: предусловия, постусловия, инварианты. Отображение иерархий систем, спецификаций, интерфейсов и контрактов в конструкциях Оберона). Типы данных (ТД) и их применение (3 уровня типизации в программировании: техническая, математическая, абстрактная. Математические атомарные ТД в Обероне. Абстрактные атомарные ТД в Ada. Записи Оберона как математические ТД; как абстрактные ТД; как расширяемые объектные ТД. Объектно-ориентированные интерфейсы. Концепция родовых шин сообщений). Далее будут рассмотрены возможности BlackBox Framework: перманентные объекты и сериализация, разработка графических объектов и контейнеров, построение GUI на основе идеологии составных документов.
Основная часть спецкурса длится один год. В следующем году планируется дополнительная часть, с большим количеством практикумов по разработке учебных программных систем.