Представитель Шуры Люберецкого в ЖЖ (brat_luber) wrote,
Представитель Шуры Люберецкого в ЖЖ
brat_luber

Что такое “образовательные стандарты”

Продолжая разговор о том, как должно выглядеть “высшее программистское образование”, попробую изобразить что-то наподобие “идеального учебного плана” по специальности, например, 220400 – “Программное обеспечение вычислительной техники и автоматизированных систем“.

Для начала – что же, собственно, изучение этой специальности предусматривает? Во-первых, “общие гуманитарные дисциплины” – иностранный язык, физическую культуру, отечественную историю, культурологию, политологию, правоведение, психологию и педагогику, русский язык и культуру речи, социологию, философию и экономику. ВУЗ имеет право из этих дисциплин оставить только иностранный язык, физическую культуру, историю и философию, а остальные реализовывать по своему желанию. Я бы добавил к ним разве что экономику, а для особо интересующихся – правоведение, причем желательно – параллельно с курсом логического программирования :)

Также в стандарт включены “общие математические и естественнонаучные дисциплины” – алгебра и геометрия, матанализ, дискретная математика, математическая логика и теория алгоритмов, вычислительная математика, тервер, некая “информатика”, физика и экология. Здесь все достаточно понятно, относительно просто, и, видимо, полезно – за исключение разве что экологии. Кроме того, я затрудняюсь понять суть “информатики” в процессе обучения инженеров-программистов. Все дальнейшие предметы полностью покроют проблематику этого предмета.

Перейдем к общепрофессиональным дисциплинам. Тут как раз и начнется “специальность” (правда, и ненужной лажи будет прилично) – а именно, предлагается изучать инженерную и компьютерную графику, электротехнику и электронику, метрологию и стандартизацию, безопасность жизнедеятельности, организацию и планирование производства, программирование на языке высокого уровня, основы теории управления, организацию ЭВМ и систем, операционные системы, базы данных, сети ЭВМ, методы и средства защиты компьютерной информации. Почти все логично, почти все имеет отношение к будущей специальности.

Теперь – непосредственно “специальные дисциплины”. Для рассматриваемой 220400 это будут: структуры и алгоритмы обработки данных, функциональное и логическое программирование, объектно-ориентированное программирование, теория языков программирования и методы трансляции, теория вычислительных процессов, архитектура вычислительных систем, технология разработки программного обеспечения и человеко-машинное взаимодействие.

Все это можно разбить где-то на 40 “семестровых”, по 150-200 часов, “курсов” (собственно, трехсеместровые тут только физра и матан, да и тот, по-хорошему, нужно сократить до “левого предмета уровня МИСиСа” в один-два семестра). Набор курсов достаточно адекватный и в принципе, покрывает всякие “что должен знать программист 6 разряда” – но заметно шире этих списков, прежде всего, благодаря “гуманитарным” и “общеинженерным” дисциплинам. Тут я согласен с [info]ailev, который объявил “computer science” лишь одной четвертой частью “верхнего образования инженеров-программистов“.

Впрочем, реальность куда хуже – отечественные “инженеры-программисты” с дипломом по специальности обычно ничего выдающегося из себя не представляют, а их “багаж знаний” ограничивается PHP+Delphi. Но я берусь изобразить некое подобие рабочего плана по специальности 220400, которое, надеюсь, покажется читателю вполне адекватным, а кто-то – чем черт не шутит – решит опробовать его в действительности :).

Итак, первый семестр. Включим в него следующие предметы:

- матан (стандартный вузовский курс, тут ничего нового за последние 100 лет не придумано)
- алгебра и геометрия (всякие уравнения прямой и плоскости, линейные и аффинные преобразования – в общем, математический минимум для геймдева)
- иностранный язык (английский, пусть даже в духе “говорить вам не с кем, а читать со словарем научим”)
- физра (куда ж без нее?)
- программирование на языке высокого уровня (рискну предложить “порезанную на части” SICP – первую-третью главы с кусочком пятой, о регистровых машинах)

В этом семестре ничего удивительного, матан должен будет “выстрелить” в следующем, при оценке сложности алгоритмов, а линейная алгебра позволит нормально поговорить об одном из наиболее интересных циклов задач из второй главы SICP. “Вводный курс” на основе MIT-овского учебника, кроме того, поставит в равное положении как “нулевого школьника”, так и “самоучку” с “ПТУшником”, учившихся по программе ребе [info]theiced :)

Второй семестр устроим интереснее:
- матан-2 (ничего удивительного)
- тервер с матстатом (потому что в курсе “алгоритмов” есть и “вероятностные” оценки)
- все тот же английский
- физра
- структуры данных и алгоритмы (тут выбор адекватных учебников невелик – книжка Кормена)
- организация ЭВМ (регистровые машины из курса программирования превращаются в “настоящие” железки, что-то вроде курса по MIPS, который рекламирует [info]panchul)

В каждом из “компьютерных” предметов вводим новые языки программирования. От Scheme и нескольких DSL на ее основе в первом семестре – к, скажем, Паскалю в курсе алгоритмов и VHDL – в практических работах по “организации ЭВМ”.

Те же тенденции продолжим и в третьем семестре, добавив, скажем Matlab и C:
- матан-3 (на этом закончим)
- вычислительная математика (с “практикумом” – то есть действительно “вычислительная”)
- английский (да и его пора “убрать”)
- безопасность жизнедеятельности (надо же с ней когда-то разделаться?)
- физра
- операционные системы (разработка и реализация – короче, книжка Таненбаума, See MIPS run Linux и что-то подобное)

“Разрабатывать и реализовывать” ОС предлагаю на тех же процессорах, которые лепили в прошлом семестре – и неоднократно помянутый MIPS для обеих задач вполне подходит.

В четвертом семестре предлагаю все же вспомнить, что математика – это отнюдь не “наше все”. Например, сделаем так:
- философия (с упором на “прикладную философию” – то есть онтологию и теорию познания)
- математическая логика и теория алгоритмов (всякие машины Тьюринга, лямбда-исчисление и т. п.)
- физра (на этом все)
- технология разработки ПО (прежде всего методологии – разнообразные RUP, SCRUM, Getting Real и прочие buzzwords, ГОСТы 19 и 34)
- функциональное и логическое программирование (остатки SICP, PAIP Питера Норвига и прочие классические учебники по AI)
- правоведение (как источник “знаний” для логического программирования, и для галочки :) )

Наконец появляются “инженерные” дисциплины. Технология разработки ПО – прежде всего методологии и best practices, без описания конкретных инструментов. Предполагается, что с системами контроля версий “вживую” студенты уже познакомились.

В пятом семестре окончательно разделаемся с математикой – причем тут же ее и применим.
- экономика (как ни крути, а полезная штука – пусть даже и в виде “экономикса”)
- дискретная математика (всякие коды Хэмминга и прочие радости)
- сети ЭВМ (тут дискра рулит и педалит)
- методы и средства защиты компьютерной информации (и тут тоже)
- организация и планирование производства (мы же инженеров готовим)

“Программирования” тут, как такового, нет – хотя никто не мешает, скажем, изучать TCP/IP на примере работающего стека из какой-нибудь ОС.

Вернем это благородное занятие в шестом семестре:
- ООП (в духе все той же “прикладной философии” – и не забываем, что П здесь – это скорее “проектирование”, и не заменяем предмет на “изучение особенностей C++”)
- базы данных (и тут вспоминаем про понятие “отношения” и его отличие от “сущности”)
- инженерная и компьютерная графика (а тут можно использовать какую-нибудь “объектную” графическую библиотеку – да хоть Qt)
- архитектура вычислительных систем (именно систем – чтобы не путать это с “организацией ЭВМ”)
- электротехника и электроника (тоже из “общеинженерного”)

Здесь вспоминаем “прикладную философию” из четвертого семестра. “Программирование” вытаскиваем в курс машинной графики.

Впрочем, чем дальше, тем меньше программирования. Кому надо – тот хоть в опенсорсном проекте может на кнопки давить. В седьмом семестре предлагаю обойтись следующими предметами:
- физика (просто для “естественнонаучного мировоззрения”, да и надо же ее хоть когда-то изучить)
- история (тоже подбиваем хвосты, на этот раз гуманитарные)
- метрология и стандартизация (”общеинженерная”, никому еще не помешала)
- теория языков программирования (почему все языки делятся на Lisp и Fortran, как написать компилятор и так далее)
- человеко-машинное взаимодействие (всяческое usability)

“Программирование” здесь превращается в “производство средств производства” – но Dragon book прочитать когда-то все же надо.

Восьмой семестр – еще проще, “добиваем” гуманитарные и естественные науки, окончательно разделываемся с программой:.
- физика-2
- экология
- информатика (так вот чем мы четыре года занимались!)
- основы теории управления (это о всяких математических моделях и прочих прикладных вещах)
- теория вычислительных процессов (семантика, верификация и прочая теория)

В общем, с некоторой степенью убедительности показано, что программу по “программистской” специальности можно разложить на восемь семестров (норма для так называемого “бакалавриата”), причем с некоторой степенью взаимоувязанности между предметами. Естественно, что это не гарантирует какого-то “качества” выпускников – можно же все свести к PHP+Delphi, как и делается в отечественных ВУЗах. Правда, некое представление об “идеальном” содержании курсов я попытался дать в скобочках – в виде указаний на книжки, например.

Теперь – о том, как этот “курс” соотносится, скажем с “все, что должен знать программист” за авторством [info]sharpc, или с программой [info]ailev, или же с программой [info]theiced.

Из первого списка он, в идеале, должен в достаточной степени полно покрывать пункты 2, 3, 4, 5, 6, 7, 8, 9, частично 10, 11, 12, 13, 14 – хотя бы на уровне понимания “что к чему”, 15, 16, 19, 23, 25, 26, 28, 31, 33. Пункты типа 18, 20, 21 должны осваиваться за счет “жестких” требований к коду во время обучения. Грубо говоря, если код нечитаем, то практическое задание не принимается. Кроме того, в “нашем” курсе есть гуманитарные и “общеинженерные” дисциплины – от философии (которую я рассматриваю как почти прикладную науку) до основ управления производством. Инженер-программист (в отличие от ПТУшника, то есть техника-программиста) должен не только уметь “кодить”, но и более глубоко понимать процесс разработки ПО в его “гуманитарных” аспектах (так как может выполнять и “организационные” работы).

Программа [info]ailev, наоборот, явно шире в “гуманитарной” части – от “грунтовки мозга”, включающей лингвистику и формальную семантику “в объеме, чтобы свободно читать теоретические статьи по computer science” до “инженерных компетенций” с “инженерным менеджментом” – последние в “нашем” курсе сведены до семестровых курсов экономики, технологий разработки ПО, организации и планирования производства и человеко-машинного взаимодействия. И наоборот, computer science у нас довольно много, вплоть до каких-то безнадежно узких (но традиционных для CS) областей, типа ОС или компиляторов.

У [info]theiced наблюдаем тот же недостаток, что и у [info]sharpc – отсутствие “общеинженерных” дисциплин, плюс – повышенное внимание к таким вещам, как разнообразные конкретные инструменты. Еще из недостатков, с моей точки зрения – явная изначальная ориентированность на императивное программирование. Да, на практике оно используется куда чаще, но черт его знает, что там случится через 5 лет – так что ставить функциональщину в положение редкой экзотики определенно не надо. Другое достоинство айседовской программы – огромное количество “производственной практики” – но и готовить он предлагает не инженеров, а “адовых метаклассов” – то есть скорее техников-программистов 6 разряда :)

Пара замечаний “общего” характера – курс “функционального и логического программирования” нельзя подменять изучением Prolog, а курсы типа “архитектура вычислительных систем” должны давать навыки построения этих архитектур, а не перечислять умные слова из описания специальности. К сожалению, описание специальности настолько расплывчато, что на него в наших родных ВУЗах натягивают “изучение Delphi и курсовые на Excel” – но одновременно эта “расплывчатость” превращается в возможность запихнуть туда реально качественный курс, пусть даже и компромиссный по отношению к предложениям [info]sharpc и [info]ailev.

Кстати, так называемые “матшколы” в свое время легализовались именно благодаря такой “расплывчатости формулировок”. Во времена Никиты Сергеевича Хрущева считалось, что выпускник общеобразовательной школы должен получить какую-то полезную в народном хозяйстве специальность. Специальность же “оператор ЭВМ” позволяла вставить в учебный процесс мощнейшую математическую подготовку (говоря словами [info]ailev, это “совершенствование“, доводимое почти до абсурда). В “навек родной писсят седьмой” от этой древней инициативы остался атавизм в виде “проекта” по информатике, сдаваемого в конце десятого класса. Это обычно довольно большая программа – типа IDE для Лого-подобного языка программирования или программы для игры в шашки с интерфейсом на OpenGL.

В общем, отвечая на вынесенный в заголовок вопрос, можно констатировать, что сами по себе существующие “образовательные стандарты” в области подготовки программистов вполне адекватны, и такое развлечение многих ЖЖ-юзеров, как составление “учебных планов” для мега-программистов, в целом лишено смысла – разве что позволяет понять, нужно ли автору высшее образование или же он пять лет протирал штаны в институте и мечтал о ПТУ :) Проблема же существования выпускников ВУЗов, владеющих исключительно PHP и Delphi, возникает не из-за учебных планов самих по себе, а из-за их реализации конкретными учебными заведениями.

Запись опубликована в блоге Шуры Люберецкого. Вы можете оставлять свои комментарии там, используя свое имя пользователя из ЖЖ (вход по OpenID).

Tags: программирование
Subscribe

Comments for this post were disabled by the author