Российского образования псто

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

Как я уже говорил, описаний “делай раз, делай два” для триангуляции Делоне в Интернете практически нет. Есть книга А. В. Скворцова, есть несколько разной подробности описаний на сайтах американских университетов, например, из курса CS 294-5 Университета Беркли. Но я пишу этот пост не оттого, что хочу пожаловаться на жизнь – изобретателю велосипедов так делать нельзя, он сам себе злобный Буратино. Я хочу предложить уважаемой публике сравнить программу курса в Беркли с “Практикумом по компьютерной геометрии“, который с 2009 года включен в программу мехмата МГУ.

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

Итак, на первом курсе сей предмет называется “Программирование и работа на ЭВМ” и предполагает сдачу двух зачетов – в осеннем и весеннем семестрах. Твердо установленной программы нет, все зависит от преподавателя, но подразумевается, что два сданных зачета доказывают умение студента писать программы на языке Си. Говорят, что иногда разрешают писать чуть ли не на Паскале. Занятия проходят попеременно в виде занятий за компьютерами и “обычных” семинаров, где препод рассказывает о том, что считает нужным. Например, А. Г. Кушниренко рассказывал про индуктивные функции, про некоторые нюансы языка Си типа арифметики указателей и правильного хранения двумерных матриц, а также – про своих (разумеется, тупых) американских студентов. Кроме того, он пугал нас тем, что на госэкзаменах мы забудем, что такое функция. К сожалению, мне на госах такой вопрос не задали, а я готовился :) Для получения зачета достаточно сдать три-четыре задачи из некоего списка (после этого преподаватель обычно убежден в том, что и остальные задачи студент сдаст, и больше не докапывается). Задачи простые (вот, например, список чего-то подобного), при минимальном знании Си решаются за полчаса каждая (и то время взято с большим запасом). У меня, например, от этого сложилось ложное впечатление, что и дальше все будет так просто.

На втором курсе было уже что-то похожее на вводный курс по Computer Science (с экзаменом в весеннем семестре и все тем же названием). Как всегда, было намешано все и сразу. В два семестра “у нас” запихнули четыре “американских” семестровых курса (вводный курс по C++, алгоритмы и структуры данных, формальные языки и грамматики, и понемногу, для общего знакомства – из курсов по операционным системам и компьютерным сетям). Все это прочитать за указанное время невозможно, поэтому реально программа несколько сокращается. Из лекций (их у нас читал В. В. Борисенко) я помню рассказ про машинную арифметику и стандарт IEEE 754, немного – про вызов функций с передачей параметров через стек в языке Си и ему подобных, было что-то про Register Transfer Language компилятора gcc, про “классические” алгоритмы и структуры данных, типа сортировок, разнообразных стеков, очередей и деревьев, кроме того, студентов развлекали байками о том, как горят в грозу сетевые карточки, и как отличить толстый Ethernet от тонкого. Формально для получения оценки нужно уметь решать задачи из опубликованного в Интернете списка и уметь отвечать на вопросы по программе, реально – надо решить по одной-две задачи из каждой темы или, допустим, найти ошибку в классе, реализующем арифметику произвольной точности (это приравнивается к решению соответствующей задачи). Этого достаточно для того, чтобы получить “пятерку” досрочно, а что происходит на основном экзамене – я не знаю. Говорят, что безбожно списывают, и положительные оценки получают даже полные “нули” по предмету.

В самом начале 2000-х на втором курсе пытались преподавать Java, но в итоге поимели кучу жалоб от студентов, от которых на третьем курсе внезапно потребовали знания Си или Фортрана. Борисенко говорил, что ничего “такого”, что есть только в Си, использоваться не будет (а общее подмножество Java, Си и Фортрана осваивается в режиме “не приходя в сознание” за пять минут), но отечественный студент прекрасно умеет пользоваться фразой “а нас этому не учили!“.

Кстати, нельзя не упомянуть матчасть. Нет, это уже не старенький VAX, которому даже посвящен специальный сайт, сейчас мехмат полностью перешел на относительно современные персоналки. Ничего старше Pentium III я уже не застал. Гораздо интереснее софт. Стараниями К. Ю. Богачева на этих компьютерах стоит хитро настроенный Linux, запортить который студенты не могут. Чтобы жизнь малиной не казалась, задачи надо сдавать, используя хитро настроенный gcc (его еще называют “компилятор Богачева”). Там включена опция -Werror, приравнивающая предупреждения компилятора к ошибкам. В результате те, кто пишет дома в более лояльно настроенных компиляторах, сталкиваются с тем, что их программы просто не работают (в частности, компилятор матерно ругается на отсутствие пустой строки в конце файла, или на функцию main, возвращающую нецелое значение).

На третьем курсе начинается “Практикум на ЭВМ”. Когда-то давно надо было писать на Фортране под СМ-4. Теперь, когда СМ сдана на цветмет, люди пишут на Си на тех же персоналках. Правда, говорят, что некоторые преподаватели принимают задачи и на Фортране. Не знаю, у нас этого никто не пробовал. Сей практикум растянут на четыре семестра, обо всем по порядку.

Третий курс в основном посвящен реализации алгоритмов из книжки “Методы решения линейных систем и нахождения собственных значений” все того же К. Ю. Богачева. В первом семестре надо написать две программы по 300-400 строк. В первой надо обратить матрицу размера около 1000×1000 (или решить аналогичных размеров линейную систему, это задачи равноценные), во второй – найти собственные значения той же матрицы. Пишутся они совершенно бездумно, простым переписыванием из книжки. Кстати, с точки зрения “справочника рецептов”, написана она очень неплохо. Если преподаватель – не К. Ю. Богачев, то этого будет достаточно. Богачев требует несколько большего – а именно, ускорения этих методов в два-три раза. Правда, он еще и объясняет, как это сделать. После того, как сдана “практическая” часть – следует “теоретический” зачет. Всех студентов, сдавших программы, загоняют в аудиторию 14-08 и раздают письменное задание. Необходимо изложить три-четыре метода из книжки, если не полностью – то хотя бы в устраивающем Богачева объеме. Второй семестр – примерно то же самое, только книжка другая. На этот раз – “Методы приближения функций”.

Я не буду говорить ничего про Н. Н. Ченцову, которая вела у нас эти занятия, желающие могут составить представление о ее методах обучения, почитав один из околомехматовских форумов.

Четвертый курс несколько забавнее. Например, такого исчерпывающего руководства по всем вопросам, как методички Богачева, больше нет. Кроме того, надо написать не только программу, но и отчет – связный текст на 5-6 страниц, описывающий метод решения и убеждающий преподавателя в его правильности. Конкретные задачи зависят от “препода”. Например, кто-то вычисляет интегралы всякими там “методами трапеций” или решает методом Ньютона нелинейные уравнения. У И. С. Григорьева задачи поинтереснее – решение дифференциальных уравнений методом Рунге-Кутта с автоматическим выбором шага и применение принципа максимума Понтрягина в задачах оптимизации (то есть сведение задачи оптимизации, которую человечество в целом решать не умеет, к “решабельной” системе дифференциальных уравнений). Сам Илья Сергеевич регулярно выигрывает некие международные соревнования по решению задач оптимизации и вообще, любит эту тему. Правда, с точки зрения программирования тут все довольно просто и “концептуально” не отличается от, скажем, метода Ньютона решения тех же дифференциальных уравнений. Если имеется “рыба” отчета, то программа вместе с отчетом пишутся за 5-6 часов (а их надо две штуки). Эта простота развращает, но благодаря ей я все-таки увидел Е. А. Лапшина, которого “надо бояться“.

Во втором семестре так же незамысловато решаются уравнения в частных производных. Все еще проще. Собственно, происходящее на третьем и четвертом курсах не имеет никакого отношения к тому, что на Западе называют Computer Science. Это просто практикум по численным методам, но, надо сказать, неплохой – если повезет с преподавателем. У вышеназванной Ченцовой, например, интересных задач не будет – зато будет много геморроя со сдачей отчета. Сегодня она не хочет брать его в руки, потому как “жалко, такой чистый”, а завтра будет – “противно, такой грязный”. На программу она даже не смотрит, кое-кто даже сомневается в том, что она знает Си.

Кстати, четвертый курс занимается в так называемом “классе Эйч-Пи” (я специально не пишу HP, чтобы не путали с русскими буквами). Это аудитория во “Втором гуманитарном корпусе” (хотя гуманитарность его ставится под сомнение наличием там ВМК и оккупацией мехматом нескольких этажей), где когда-то давно стоял миникомпьютер HP-810 (возможно, название неправильное, так его обозвали на страничке “Компьютеры, которые выбираем не мы“) с пятнадцатью терминалами. Сейчас там стоят обычные персоналки с Windows XP производства, кажется, того же Hewlett-Packard. Так как студенты таскают программы на дискетках, перед тем, как засунуть что-то в компьютер, надо это что-то дать на проверку специально обученной тетеньке, сидящей у входа в класс и умеющей пользоваться Dr. Web с безбожно устаревшими базами и пасьянсом “Косынка”. Как нетрудно догадаться, вся зараза первым делом попадает на компьютер с антивирусом, откуда разносится по классу. Систему там переустанавливают по три-четыре раза за семестр. Впрочем, пора бы заканчивать с ностальгическими воспоминаниями.

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

Я уже упоминал, почему в американских ВУЗах программа курса строится не по принципу “меньше тройки не получишь”, а исходя из того, что может/хочет рассказать преподаватель. Они могут позволить себе такую роскошь, как заваливающие экзамен 3/4 слушателей, у нас этого просто не поймут. Зато троечникам напрягаться не надо.

UPD http://shura.luberetsky.ru/2011/08/05/neobkhodimye-poyasneniya/ – я отвечаю на некоторые вопросы.

12 комментариев

  1. [info]golergka пишет:

    ООП, паттерны, структуры данных, мультипоточность — отсутствуют вовсе?
    Пичалька.

    • > ООП

      Программа второго курса (изучается Java или C++).

      > Структуры данных

      Программа второго курса, у меня все четко написано.

      > Мультипоточность

      На втором курсе рассказывают про юниксовый fork(), на третьем некоторые пишут программу, работающую с использованием MPI (обращение матрицы, оно легко параллелится). Про более современный pthread и вообще специфику многопоточных программ речи не идет.

      > Паттерны

      Два соображения. Первое: мехмат не готовит программистов. Второе. Бессмысленно изучать понятия профессионального программирования (точнее, проектирования), если объем написанного кода составляет 500 строк в семестр.

    • Да, кстати, посмотрел программу курса, который сейчас читает Борисенко, там про threads есть, но по-моему, всерьез с ними не работают – дело в том, что для понимания механизма потоков желательно понимать то, как вообще работают программы в многозадачной ОС. Все в итоге довольно примитивно:

      http://math.msu.su/~vvb/2course/Borisenko/Threads.html

  2. gray-bird пишет:

    В западной системе обучения есть интересная фишка – студент сам выбирает набор предметов соизмеряя сложность получившегося курса и собственные силы. Утрированно, если есть деньги и время учиться лет 15 можешь хоть 1 предмет в семестр изучать, или наоборот набрать себе все возможные профильные предметы и совершенно охренеть от объема.

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

    • Я про это писал, правда, достаточно давно:

      http://shura.luberetsky.ru/2011/03/15/pro-vragov-unutrennikh/

      Если вкратце – учебные программы “заказывает” тот, кто за них платит. В России этим с ~1700 года занималось исключительно государство. Как следствие – система образования была расчитана на подготовку необходимых государству специалистов в необходимом количестве (допустим, 2000 математиков, 5000 физиков, и т. д.). При таком подходе, разумеется, говорить о возможности свободного выбора программы обучения и специальности “на выходе” (это нахывается Major – http://en.wikipedia.org/wiki/Academic_major ). Вообще, называть эту систему “западной” – тоже не совсем верно. Она распространена в США и Франции, в меньшей степени в Великобритании. В Германии ВУЗы больше похожи на наши.

  3. [info]dskrvk пишет:

    Не совсем понимаю, почему вы сравниваете программу математического факультета с программами CS-факультетов в США. И во-вторых, мне приходилось читать много жалоб от практиков (занимающихся финансовой математикой, например) в США на то, что PhD с непрограммистских факультетов умеют писать только на фортране и знать не знают про ООП.

  4. Pavel пишет:

    Можно узнать вашу специализацию/кафедру? Насколько я знаю, у “мат. логики и теории алгоритмов” (и другие дискретные кафедры) все иначе.

    • Я заканчивал ТФФА, но дело в том, что “Программирование и работа на ЭВМ” (к которому основные претензии) читается на первом-втором курсах, до распределения по кафедрам.

      http://shura.luberetsky.ru/2011/08/05/neobkhodimye-poyasneniya/

      • [info]aldanur пишет:

        “Работа на ЭВМ”, конечно, местами мрачная, но правильно товарищ выше говорит, что при желании можно было получить внятное CS-образование на мехмате (если самому искать правильных людей и спецкурсы), а сравнивать обязательные курсы мехмата с SICP и Корменом не очень корректно. Также см. https://plus.google.com/117057244766403027916/posts/MQXsmekEfxZ

        • > можно было получить внятное CS-образование на мехмате (если самому искать правильных людей и спецкурсы),

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

          С точки зрения потреблядства это вообще выглядит непристойно. Представьте себе такую картину: приезжаете вы в автосервис на ТО автомобиля (замена масла, тормозных колодок и т. п.). ТО делают, а вскоре выясняется, что масло не меняли, колодки прикрутили криво, а в ответ на возмущение вы слышите: “ну дык, надо механика на автосервисе правильного знать”. Кстати, это вполне реальная картина обслуживания на “авторизованном сервисе” российских автопроизводителей. Нравится?

          > сравнивать обязательные курсы мехмата с SICP и Корменом не очень корректно

          Естественно, что мехмат МГУ – это не факультет Computer Science в MIT, но ИМХО программа “Программирования и работы на ЭВМ” мехмата должна быть несколько более обширна. Например, на мехмате почти не идет речь о том, что компьютер можно использовать не только для численных вычислений, но и, допустим, для символьной арифметики (а это разбирается в SICP, наряду с другими вполне “мехматовскими” темами: http://shura.luberetsky.ru/2011/04/02/oshhushhayu-sebya-zhestoko-obmanutym/ ).

  5. Пух пишет:

    Спасибо, поностальгировал:) (заканчивал мехмат/вычмат в 1998).

    Про Ченцову ходила байка.
    Надо было что-то там посчитать и вывести среди прочего невязку. Невязка получалась безбожная и студент поделил ее не помню, на сколько, скажем, на 1000.
    Ченцова смотрит программу, видит это деление и спрашивает: «А это что такое?». «А это нормирование!» — отвечает находчивый студент.