пятница, 6 июня 2008 г.

ОПК по-нашему

Я уже писал, что занимаюсь обучением студентов программированию (вот только что закончился мой 12-й семестр в роли «препода»).

Все это творится на физфаке НГУ, на кафедре АФТИ. Все первокурсники, желающие стать не просто физиками, а физиками-информатиками (нечто среднее между чистыми физиками и программистами), попадают к нам. В большинстве своем студенты уже что-то умеют, некоторые даже участвовали в олимпиадах. Это очень большое подспорье, потому что дает возможность заниматься интересными вещами, а не месяцами учить синтаксис языков программирования.

Сам курс называется «Основы программного конструирования» и имеет ту же аббревиатуру, что и «Основы православной культуры», введенные недавно в школах — ОПК. Довольно забавное совпадение :)

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

Сейчас все происходит примерно так. Первый семестр посвящен изучению основных «священных коров» — двоичного представления данных, основных структур данных (списки, деревья, хеш-таблицы), алгоритмов сортировки, модульного подхода к разработке. В конце семестра студенты делают проект, сдают теоретический экзамен и получают итоговую оценку, включающую в себя все.

На первом курсе мы используем Python. Это новация последнего учебного года. Раньше использовали Паскаль, а когда-то совсем давно — Modula-2.

Второй курс начинается с изучения MIX-машины Д.Кнута и примерно месяц студенты пишут на MIX. Потом мы переходим на C. В конце семестра вкратце изучается многопоточное программирование и примитивы синхронизации; семестровый проект должен обязательно включать в себя взаимодействие между потоками. Кроме того, нужно сдать задание по MIX.

В общем, получается довольно интенсивно, но интересно.

Надо сказать, что из всех нововведений в курс (когда я сам проходил его 10 лет назад, в 1-м семестре изучался просто Паскаль, во 2-м — просто C) самым удачным оказалось добавление MIX. При всей кажущейся архаичности MIX-машины, она дает неплохое представление, как все крутится на уровне процессора. При изучении у студентов возникает начальное отторжение, но потом большинству даже нравится.

А вот Python оставил двоякое впечатление. С одной стороны, алгоритмы на нем выразительнее (за счет мощных базовых типов данных), а с другой стороны, когда дело доходит до C и MIX, удар «об стенку» больнее — ведь все вкусности махом пропадают.

Возможно, мы выкинем Python и перераспределим нагрузку между C и MIX. Это еще и высвободит массу лекционного времени, что позволит уделить больше времени всяким интересным темам типа конструирования компиляторов :)

Я сам к скриптовым языкам пришел с позиции «я все это могу написать на C/C++, но нет смысла тратить время». Соответственно, когда я пишу на Python или Ruby, то довольно хорошо представляю, что происходит при исполнении программы.

Есть другая позиция, получающая все более широкое распространение: «использовать работающий инструмент, не задумываясь, как он работает».

Наш подход ближе к первой позиции, но вторую позицию полностью отбросить не получается. Может быть, нужно просто набраться храбрости. :)

2 комментария:

Unknown комментирует...

Oleg, privet!

nachitavshis' tov. Joel'a (www.joelonsoftware.com), ya vot hochu pointeresovat'sya - vy ne sobiraetes' vvodit' [Lisp] ili [Scheme] v kachestve dopolneniya k [C] i [Mix]? U menya svoi shkurnye soobrazheniya -- lyudi, ponimayuschie [Lisp], legko pishut na yazyke [Mathematica], a nam takie nuzhny ;) Sam ya iz nashego opyta na AFTI s funkcional'nym programmmirovaniem, uvy, nichego ne vynes. (Ya znayu o praktikume Grozina po Mathematic'e, no on idet pozdnovato - lyudi uzhe bol'shie, i v nem malo prakticheskogo programmirovaniya bol'shih zadach).

a
p

Олег Дашевский комментирует...

Про Лисп (скорее Scheme) я думал, но тут есть несколько проблем.

1. Ни у кого из нас нет практического опыта в использовании Лиспа для решения реальных задач.

2. Интеграция Scheme в существующее пространство будет непростой. Сейчас получается (примерно), что C - это низкоуровневый Питон, а MIX - низкоуровневый C. А Scheme где-то сбоку стоит.