Как готовить системных программистов
Если читают, например, операционную систему реального времени, то каждый студент должен написать программу: управление памятью, управление процессорами, управление временем. Преподаватель смотрит не только на результат, но и на то, как написана программа. По всем предметам есть лекции, практика и практикум.
У нас с этим слабее. Курсовые работы – раз в семестр, и часто они превращаются в фикцию. Трудно изменить эту ситуацию к лучшему, потому что нет соответствующих материальных ресурсов. Как обязать всех студентов по каждому предмету сделать самостоятельную работу, если мы не можем им обеспечить полноценный доступ к вычислительным машинам? Классы всегда перегружены. У нас не принято, чтобы студенты занимались без преподавателя: и вирус занесут, и что-нибудь украдут, и что-нибудь сломают. Самостоятельную работу очень трудно наладить. О тьюторстве я даже не мечтаю. Это прежде всего вопрос денег. У нас наверняка нашлось бы много хороших преподавателей, но для того чтобы обеспечить индивидуальное обучение, сколько надо преподавателей и какое потребуется финансирование? Хотя еще со средних веков известно, что обучение – это всегда работа мастера с подмастерьем с непосредственной передачей опыта. Единственная "живая" практика у нас – на пятом курсе, полугодовая преддипломная практика. И здесь тоже есть свои проблемы. Хорошо если практика была в известной фирме, которая успешно и продуктивно на современном технологическом уровне занимается программированием. Но так бывает не всегда.
Отсюда первый тезис – сегодня надо практику реально совместить с теорией. Формально говоря, все у нас есть. Студенты пятого курса полгода проходят преддипломную практику. И чем это кончается? Вот у меня толстая пачка отчетов по практике. Люди просто пристраиваются работать (например, программистами) в какую-нибудь малоизвестную контору, чаще всего я даже названия этой конторы не знаю. Они работают. С одной стороны, какие могут быть претензии? Человек полгода проработал, получал деньги, кому-то был полезен. Спрашиваю я как заведующий кафедрой: "Чему ты там научился?" "Вот, получил практический опыт программирования на Java или C++". "Как была организована работа?" "Никак. Начальник дал задание, я написал программу". "Как был организован коллектив? Какие были взаимоотношения? Как велось планирование, отчетность? Были ли еженедельные собрания? Была ли регулярная проверка качества? Были ли перекрестные чтения?" "Не было" "Так чему ты, милый, там научился?" "Программированию" "Почему тогда надо говорить, что ты заканчиваешь математико-механический факультет старейшего университета России?" Здесь явное несоответствие теории и практики.
Приведу другой пример. У нас несколько человек проходили практику в зарубежной фирме здесь, в Санкт-Петербурге. В этой фирме все хорошо организовано, но есть другая крайность: везде завеса секретности. Даже если дипломную работу студент написал там, ее в университете защитить нельзя. Надо защищать в фирме, организовывать ГЭК. Это целая проблема. Ладно, в конце концов, даже на военных работали, могли все организовать. Но ведь человек отрывается от коллектива, ничего не может обсудить. Самое главное в обучении – это беседа, разговор. А тут несколько человек проходят практику и даже со своими однокурсниками не общаются. Запрещено. Совершенно другая крайность. Очень высокий уровень работы, но слишком индивидуальный. Люди из этой фирмы, возможно, скажут, что я не прав, что у них есть и семинары, и регулярное обучение. Но я говорю о том, что вижу по результатам работы наших студентов.
Некоторые студенты проходят практику на предприятиях. Я требую, чтобы это была не только работа, но и обучение. Тоже возникают противоречия: "Мы – производственное предприятие, нам надо зарабатывать деньги, приносить прибыль, поэтому заниматься чисто учебными делами как-то не с руки. Нет-нет, мы понимаем, что надо готовить кадры, но все должны заниматься своим делом".
Еще раз повторю, поскольку для меня это важно: практика – это не просто работа "от забора до обеда", "переделал готовую программу" или "спаял электронную схему". Практика подразумевает некоторое исследование, обучение организационным формам, современным методам. Практика должна быть разнообразной. Например, электронщик должен не только спаять, но и спроектировать схему, спроектировать кристаллы, которые внутри. Он должен участвовать в отладке – и не просто участвовать, а сделать тестовое окружение. Электронщики должны программировать. Это все тесно связано.
Вас не удивляет, что я все время вспоминаю электронику? У меня есть целый отдел электронщиков, у них и руководитель отдела – математик, и многие сотрудники – математики. Сейчас электроника такая, что все равно надо программировать. Но приходят инженеры, которые не знают, как простейший тест написать. А как написать не один тест, а систему тестов для исчерпывающего тестирования, им даже объяснить невозможно. Практика должна включать в себя организационные аспекты, элементы дизайна, элементы разработки, и самое главное – доводку до результата. За полгода всегда можно получить результат. На эту тему можно говорить долго.
Тезис второй – чему учим? Вот передо мной лежит программа 35.15. По этой программе учится отделение информатики математико-механического факультета. Мы с сотрудниками нашей кафедры принимали участие в ее разработке. Для сравнения скажу: у нас отделение прикладной математики учится по специальности 01.02. Математическая статистика, моделирование, теоретическая кибернетика – это все замечательно. В дипломе написано: "Математик. Системный программист". Я обращаюсь к авторам этой программы: "Покажите, где здесь программирование". На первом курсе учат программированию на языке С, и все. Я же не говорю, что в программу включили лишний материал. Все нужные вещи: и моделирование нужно, и кибернетика нужна, и распознавание образов, и вопросы оптимизации. Но зачем пишут в дипломе "Системный программист"? Вот я заведую кафедрой системного программирования. Надеюсь, что я знаю, что такое системное программирование. Давайте я тоже буду учить программированию, а писать в дипломе "специалист по методу Монте-Карло". Кому это понравится? Конечно, все понимают, что надо привлечь людей, звучит название специальности хорошо, но не совсем соответствует содержанию курса.
Вернемся к тому, что я действительно считаю хорошим. Например, к специализации 35.15: математические основы информатики, информационные системы, технологии программирования, архитектуры вычислительных систем, сети. Далее: экспертные системы, теория оптимизации баз данных, Интернет и Интранет, инструментальные системы для С++, Java-технологии, инструментальные средства визуального программирования, инструментальные средства логического программирования, технология трансляции, языки и системы программирования, архитектура ЭВМ, программно-аппаратные комплексы, операционные системы реального времени, телекоммуникации и так далее.
Мы на кафедре подсчитали часы по этой программе, и все равно 50 % – это "чистая математика". Самый главный недостаток даже не в этом, а в том, что та половина времени, которая отведена на специальность, отнесена на конец. На первых трех семестрах – только 4 часа в неделю. Представьте себе: человек поступил на отделение информатики. Не на отделение "чистой математики", не на отделение астрономии или механики. И учится полтора года, три семестра, имея 4 часа программирования в неделю! В самых разных видах, все про все. Как можно его научить? Самое ценное время уходит. Я даже встречался с заместителем министра образования, обсуждал это все у нас в Университете, в УМО. Сценарий разговора всегда был таким: "На кого жалуетесь, вы же сами профессор, член УМО! Вот и вносите предложение, сократите то, добавьте это, для чего и создано УМО". Хорошо. Но как только я пытаюсь это делать, мне сразу говорят: "Как? Ты что? На факультете работают старые профессора, которые и тебя учили математическому анализу, алгебре, высшей геометрии... Если ты уменьшишь нагрузку, их надо будет сокращать. Неужели ты хочешь уволить старых профессоров-математиков?" Конечно, не хочу. Правила, установленные Министерством, предписывают, что количество преподавателей должно быть связано с количеством студентов. Если число студентов уменьшилось, соответственно уменьшается число преподавателей. То есть такая простая вещь как перераспределение часов, сталкивается с министерскими правилами, и никакой Университет, никакое УМО изменить это не может.
В нашей программе есть федеральный компонент, вузовский компонент (региональный) и компонент по выбору. Федеральный компонент: математический анализ – 4 семестра, количество часов в неделю: 8, 4, 6, 6. Алгебра и теория чисел – 3 семестра, часы: 4, 4, 4. Геометрия и топология – 3 семестра, часы: 4, 4, 4. Дифференциальные уравнения – 2 семестра, по 4 часа. Функциональный анализ – один семестр, 4 часа. Когда я был студентом, было два семестра. Уравнения математической физики – один семестр, но 6 часов. Теория вероятностей и математическая статистика – два семестра, 7 часов.
Когда я учился, вся теория вероятностей ограничивалась изучением меры Лебега. О том, что вероятность находит применение в нашей науке, я узнал лет через 15: оказывается, отказы вычислительной техники распределены по закону Пуассона. Так можно оценить вероятность отказа, но узнал я об этом, только когда столкнулся на практике. Мы сделали новую вычислительную машину, от нас потребовали расчет, я взялся за книги и с удивлением узнал, что теория вероятностей – полезная наука. Мне было уже под сорок. Ничему такому – предсказывать отказы, считать их интенсивность, ничему этому нас не учили. Одни интегралы, интегралы, интегралы. Конечно, из этих интегралов потом следуют и закон Пуассона, и все остальное, но мостика между мерой Лебега и еще чем-нибудь полезным нет.
Есть вычислительный практикум – три семестра по 2 часа, и есть программирование – три семестра, 3, 2, 2 часа. А здесь должны быть общепрофессиональные дисциплины (федеральный компонент): архитектура вычислительных систем компьютерной сети, операционная система оболочки, структура алгоритма компьютерной обработки данных, базы данных и СУБД, компьютерное моделирование, компьютерная графика, теория формальных языков и трансляций, спецкурсы по выбору, спецсеминары. Но против всего этого – пустые клетки.
Посмотрим на третий курс (пятый-шестой семестр). Десять часов в неделю. Как можно за такое время научить чему-либо студентов? И только на 4–5 курсе начинают учить "по специальности". Но на пятом курсе уже преддипломная практика, там только спецкурсы, и то понемножку. То есть мы можем учить практически только четвертый курс. Разве так можно? Вот где проблема. Причем не могу сказать, что у меня есть решение.
Тезис третий – необходимость теории. Один мой бывший однокурсник – сейчас профессор Западно-Берлинского технического университета. Я бывал у него, и он у нас бывал несколько раз. Я однажды его спросил, чему учат у них в университете. Выяснилось, что изучают и логику, и все остальное, но только формулировки теорем. Я его спросил: "Скажи честно, если я сейчас подойду к какому-нибудь вашему студенту и спрошу, что такое теорема Геделя о неполноте, он ответит?" "Нет, – говорит, – даже не вспомнит". "Тогда зачем так учить?" "Ну, положено. А зачем вам теорема Геделя?" "Хотя бы для того, – говорю, – чтобы молодой специалист имел представление о границах применимости теории. Теорема Геделя говорит о том, что корректность арифметики нельзя проверить средствами самой арифметики, и дает теоретические ограничения, предлагает искать какие-то метатеории, привлекать дополнительные возможности. Если человек об этом даже не подозревает, он будет в каких-то местах напрасно тратить время. У меня был случай, когда один выпускник кафедры математической физики, работающий у нас, должен был реализовать анализ потоков данных в программе. Он довольно быстро все реализовал. Самая мощная машина тогда была 486-я, и он на ней 4 часа тест из 20 строк гонял. Я посмотрел программу – простой перебор путей в графе. Я его спрашиваю: "Ты разве не знаешь, что число путей в графе растет экспоненциально относительно числа вершин?" "Не знаю. Подумаешь, экспонента! Машина железная, все посчитает". Я ему долго читал лекцию про актуальную бесконечность, о том, что если в программировании видишь экспоненту, то надо искать другое решение. Это не значит, что надо сдаваться. Я часто привожу студентам такой пример. На конференции, посвященной 1000-летию алгоритма, в Ургенче (на родине Аль-Хорезми), была представлена статья Ю.В. Матиясевича "Что нам делать с экспоненциально сложными задачами?" Вот это мне нравится, это конструктивный подход. Не просто "Все, сдаюсь, больше ничего сделать не можем". Всегда можно найти частные случаи. Есть и другая противоположность "теоретического" восприятия задачи. Другой не менее известный ученый меня мучил, когда я сдавал кандидатский минимум: что значит теорема Геделя о неполноте? И заставлял меня на экзамене (за две недели до защиты диссертации!) признать, что из этого следует, что машина не все может. Но это не так! Нет общего подхода – найдем частные.