Про историю матклассов

Вот, собственно, ссылочка про то, как из чисто «средне-специального» образования по специальности «оператор ЭВМ» сделали матклассы:

http://www.polit.ru/article/2010/09/29/matheducation/

Цитирую:

Хрущев ввел процентные нормы: сколько нужно принимать в вузы выходцев из рабочих, заявил, что нужны рабфаки, что нужно гнать в вузы рабочих. А в школах ввели 11-летнее обучение, и два дня в неделю ученики должны были проходить практику на производстве. И вот Кронрод вдруг говорит: Мы можем воспользоваться этим моментом, чтобы создать математические классы. И мы объявляем, что должна быть производственная специализация – «программирование», и мы будем преподавать математику. Два дня в неделю в таких классах было отдано только математике и программированию.

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

Продолжая разговор о том, как должно выглядеть «высшее программистское образование», попробую изобразить что-то наподобие «идеального учебного плана» по специальности, например, 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, возникает не из-за учебных планов самих по себе, а из-за их реализации конкретными учебными заведениями.