Эссе "Язык Си и начальное обучение программированию"

Этот текст представляет собой мой ответ на вопрос, почему язык Си категорически недопустимо использовать в качестве языка начального обучения программированию.

Комментарии приветствуются. При распространении просьба по возможности сохранять исходный формат файла (PDF).

Спасибо всем, кто указал на опечатки. В версии 02 они исправлены. В версии 03 сделана более полная аннотация, исправлены ещё несколько опечаток и стилистических погрешностей.

P.S. Я совершенно не понимаю, кому понадобилось так распиарить текст, исходно предназначенный довольно узкой аудитории. Но на всякий случай, задабы снизить уровень информационного шума, отмечу, что комментарии на этом сайте премодерируются, и видимыми я делаю только те из них, которые мне так или иначе интересны. В частности, по рассматриваемому вопросу мнение людей, не имеющих серьёзного опыта преподавания, мне в большинстве случаев не интересно совсем.

Прикрепленный файлРазмер
anti_c_v03.pdf227.19 кб

Опечатка

На третьей странице — s/типаов/типов/

Все правильно!

Полностью поддерживаю автора! Корень проблемы в том, что Си НЕВОЗМОЖНО
объяснить так, чтобы НЕПОДГОТОВЛЕННЫЙ студент все понял и разобрался.
В свое время Никлаус Вирт сказал, что он придумал Паскаль потому, что
ему надоело преподавать языки, которые невозможно объяснить логически
(за точность цитаты не ручаюсь). Прошло 40 лет, и мы радостно
отступаем назад!

К примеру с "Hello, world" могу еще добавить, что запросто найдется
какой-либо нахватанный студент, который спросит, а можно ли вообще
опустить #include? Что ему говорить? "Вообще-то можно (врать-то
нельзя! - действительно можно), но не нужно!". Любой студент сразу
заподозрит, что его где-то дурят! Так можно или нельзя? Предложения
типа: "Можно, но я вам запрещаю это делать, так как это нехорошо. А
почему нехорошо, не скажу, это вы пока не поймете" хороши в детском
саду, но не в университете. Начинать же изучения с разговорах о
прототипах функций (а что такое функция?), о предварительных
объявлениях переменных и типов (а что такое переменные и типы?) просто
глупо, об этом автор написал хорошо.
Еще раз поддерживаю позицию автора6

Насчет

Насчет опускания включения как раз объяснить легко: правите программу на printf(2753329); и пробуете откомпилировать в обоих случаях.

По поводу текста

Андрей,

Просто частное мнение, без претензии на что-либо.

С текстом согласен, но если его цель -- кого-то в чём-то убедить, то стоит его получше структурировать. Было бы неплохо, чтобы основные аргументы излагались в тезисном виде в предисловии, а затем резюмировались. В противном случае немногие дочитают текст до конца, а дочитав, в многообразии высказанных автором пунктов, идей и предложений забудут основное: ответ на вопрос "почему не надо?". Ибо даже если есть миллион причин не делать чего либо, стоит акцентировать внимание на главных: иначе читатель, опровергнув наименее убедительные, таки сделает то, что не надо.

Вы отлично поработали и действительно нашли много хороших "против". Если планируется аргументированно спорить с методическим советом, то стоит отфильтровать просто хорошие, выбрав бронебойные. Например, с "Hello, world" -- совсем неубедительный пример, поскольку предлагается взять "исторически сложившуюся" методику обучения, а затем показывается, что она дурацкая. Ну и что? Значит, нужна другая методика, подумает читатель.

Мне кажется, наиболее веские аргументы непригодности С для начального обучения с методической точки зрения изложены в 6 разделе. Возможно, хватило бы его + соответствующего введения и выводов.

С уважением,
Константин Савенков.

Очень

Очень интересное мнение. Сам всегда удивлялся, почему паскаль не заменят, теперь начинаю понимать, что судил уже с точки зрения человека умеющего программировать. Так же согласен с введением UNIX, это дает более широкий кругозор. Программирование под Windows хорошо бы было отдельным курсом, на базе C#. И отдельные небольшие курсы по "экзотическим" языкам (Lisp, SmallTalk, Haskell) на более старших курсах естественно. Тогда у студента был бы выбор, широкое понимание выбранной профессии.

<--ОШИБКА--> Итак,

<--ОШИБКА-->
Итак, среди первокурсников есть прослойка тех, кто умеет программировать (в той или иной степени), но эта прослойка, во-первых, малочисленна, и, по-вторых, как раз эти студенты в услугах преподавателей (по программистским предметам) нуждаются меньше всего.

Однозначно -

Однозначно - Паскаль. Он в целом более логичен и интуитивно понятен, нежели С.

В блок-схеме

В блок-схеме похоже ошибка, YES и NO в условии местами перепутаны (EOF YES ведет в тело цикла, а должно завершать).

Thanks,

поправил, сейчас буду выкладывать

Статья

Статья понравилась, сам задавался вопросом, зачем нас обучали pascal вместо C. Теперь все понятно. Хотелось бы увидеть статью того же автора, рассматривающую python в качестве языка для первоначального обучения. Ну или "почему для первоначально обучения можно pascal и нельзя python".

Опечатка

На 12й странице - s/времением/временем

Здоров!

Привет, Крокодилий!

Ничего так расписал. Единственное что смущает меня, как среднего читателя Хабра, обилие деталей про ВМК МГУ. Но, как я понимаю, основная целевая аудитория эссе все же внутри факультета.

И еще одно IMHO и один вопрос:

IMHO. Разделение студентов на "программистов" и "ламеров" наряду с разделением по уровню знания английского существенно усложнило бы линейную структуру групп. Гораздо разумнее на этом фоне выглядели бы факультативные лекции и семинары, зачет/экзамен по которым заменял бы страндартный зачет/экзамен по "Алгоритмам и алгоритмическим языкам" на первом курсе (включая при этом проверку знаний из базового курса).

Вопрос: действительно ли есть потребность отдельно готовить студентов для работы с суперкомпьютерами? В чем особенности?

Cheers,
VSol

А в стенфорде

Я смотрел лекции Стенфордского университета, курс CS106A. Это начальный курс программирования. Так вот они начинали с Java. Но не с самого языка, а с программирования алгоритма для робота Карела, который бегал по экрану. У нас по-моему тоже было что-то такое, "Кукарача" или типа того. Так вот, обьяснить 4 команды Карела было легче простого. А про объявление public static void main сказали, что пока просто примите это, the way it is. А через 5 занятий всех студентов прозрачно перевели на Java. Потому что синтаксис простого и понятного Карела был почти идентичен Java.

Сегодня, я думаю, реально паскаль мало кому нужен. И полагаю, что в Стенфорде не дураки сидят, и не просто так начинают обучение с ООП языка. Дальше у них по программе, кстати, С++, Python, Ruby. И я искренне жалею, что я учился на паскале, Fox Pro, 1C и т.п. Лучше бы я Питон учил в универе.

Ну, учить на FoxPro

Ну, учить на FoxPro и 1С - это вообще за гранью добра и зла, прямо скажем.

Дальше, кто сидит в Стэнфорде - это вопрос интересный. В MIT до недавнего времени единственным рабочим языком был Лисп, это я понять вполне готов, но то я (с моим опытом реализации Лиспа), а то все остальные. Начинать же с ООП, я бы сказал, глупо - потому что "зачем нужно ООП", может понять человек, написавший (самостоятельно) хотя бы одну программу хотя бы на пару тысяч строк. Ну ладно, на тысячу. Но среди нынешних студентов преобладают те, что свою первую (и последнюю) мало-мальски длинную программу пишет уже в рамках дипломной работы, и не раньше.

Ой жесть. Foxit

Ой жесть. Foxit Phantom падает с крэш репортом при попытке открытия файла :)))

Файл выплюнут

Файл выплюнут pdflatex'ом. Кто из них неправ - фиг разберёт.

первый язык программирования

возможно все-таки имеет смысл в качестве первого языка программирования использовать Python ?

аргументы "за" это решение можно легко найти в интернете, тем более, что устаревшие языки программирования
Fortran, Algol и Pascal - сейчас практически нигде уже не используются в production, и не имеют поддержки
современных методов программирования, в том числе "объектно-ориентированного программирования".

ООП - это вообще

ООП - это вообще очень интересный вопрос. Я бы сказал, что попытки объяснить ООП человеку, ни разу не написавшему программу ну хотя бы на пару тысяч строк - это как глухому пытаться объяснить, что такое соната и чем она отличается от кантаты. IMNSHO, ООП вообще не место в основных курсах. Только спецкурсы, и только для тех, кто умеет и хочет программировать.

У Python есть еще

У Python есть еще одна проблема с точки зрения начала обучения - отсутствие строгой типизации, без нее, как мне кажется, тяжело объяснить понятие типа, которое крайне важно в программировании.

В последствии перейти с языка со строгой типизацией на язык без нее значительно легче, чем в обратную сторону.

А ещё в Питоне нет указателей

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

Re: А ещё в Питоне нет указателей

Так понимание сути указателей всё равно даёт не Паскаль, а ассемблер. А к моменту изучения Си ассемблер уже пройден.

Ни фига он не

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

Тут нужен именно Паскаль (или что-то вроде, но Оберон и прочее GC не предлагать) - чтобы привыкнуть к тому, что есть переменные, а есть ещё указатели. И односвязный список со всей сопутствующей техникой навроде указателя на указатель (это когда надо из списка вычеркнуть все элементы, удовлетворяющие условию) проще всего демонстрировать именно на Паскале.

Интересная статья, пачка комментариев.

Очень хорошая статья, думаю уместно будет ее напечатать и положить на кафедре, где я работаю, для ознакомления других преподавателей. Особенно она была для меня интересна из-за того, что я недавно начал обучение школьников программированию практически с нулевого уровня. И начал как раз с С++. Чтобы обойти сложности понимания некоторых моментов, я сказал им, чтобы #include, int main и прочее воспринимали просто "так надо" и заранее, до начала лекций по языку дал им краткий справочник, описывающий базовые языковые конструкции (например, объявление, присваивание, ветвление, циклы, прочее). И настаиваю на том, чтобы они как можно быстрее пробовали писать. после получения минимального начального опыта написания программ им легче уже будет понять формальное описание языка. Насколько это даст эффект - посмотрим через пару месяцев. Аудитория, кстати, у меня имеет разный уровень и возраст (6-8 класс). Вывод им показываю через библиотеку iostream, что избавляет от необходимости передавать указатель на переменные и указывать тип вводимых данных.
Что же касается преподавания языка Си на первом курсе. Очень во многом автор прав, хотя некоторые приемы преподавания, как мне показалось, несколько утрированы. Я бы сделал такие дополнения:
1. В школах есть учителя, умеющие и программировать, и учить. Я лично знаком с такими. Но, к сожалению, их очень мало.
2. Автор прав в том, что не стоит преподавать Си для студентов, имеющий близкий к нулевому уровень навыков программирования.
3. Я бы поставил под сомнение уверенность автора в том, что надо преподавать Паскаль. На роль учебного языка вполне может подойти например Ява или C#. Если говорить ою обучении будущих профессиональных программистов, то на первых курсах им надо обязательно давать ООП и современные инструменты. ООП лучше как раз показывать на вышеуказанный мною языках. Из этих соображений и можно их сразу дать на первоначальное обучение. Минус - придется объяснить что такое функции. Плюсы: студенту необходимо за первые пару лет учебы выучить на один язык меньше; проще плавно перейти к изучению ООП; указанные мной языки современнее, студент сразу сможет их смело использовать для написани лабораторных работ по другим дисциплинам, написанию программ к курсовым работам.

Джава и С# - это

Джава и С# - это сначала инструменты завоевания мира, и лишь потом языки программирования. В университете им не место вообще. То есть никак, ни в каком виде. Роль университетской среды в том, чтобы противостоять коньюнктурщине, а не продвигать её.

имхо, Java и C#

имхо, Java и C# являются языками для лёгкого и быстрого написания программ, но никак не для обучения ООП и принципам программирования. из личного примера - друзья из МИФИ писали калькулятор на C#, я на чистом C - у МИФИ это заняло 1 вечер и 20 строк чистого рукописного кода, у меня - неделю и порядка 300 строк рукописи. по-моему, нужно сначала объяснить все принципы программирования, и лишь потом показывать, что всё то, что ты можешь написать сам, есть в неких сторонних библиотеках. уж извините, но научить в нужном месте вставлять нужные функции большого ума не надо

Добрый

Добрый день.
Внимательно прочитал статью.
1 Суть обучения заключается в том, кого мы хотим получить на выходе - специалистов по рисованию окошек, "готовых PM-ов" и т.д. либо людей, которые досканально знают материал и любят это дело, находясь при этом с открытым сознанием и способностью принимать новые идеи. Способностью анализировать свои знания, способностью к самостоятельной постановке и решению задач.
2 Обучение в университете, в большей части рассчитано на средние знания по больнице, и принимая во внимание огромную загруженность во время обучения рассчитывать на доп обучения не стоит.
3 Либо уже на первом курсе необходимо делать выводы о том, что тебе важно и забивать на оставшиеся предметы.
4 Что невозможно при нынешней системе оценки знаний, и существующей системе высшего образования.
5 Либо успевать везде.

По поводу int main() - рекурсивность обучения, (само)образования в том и заключается, что ты постоянно возвращаешься в начало, я бы сказал, что язык С не настолько сложный (как вы описываете), но он может потребовать особого устройства мозга.

Вообще говоря,

Вообще говоря, основной продукт университетского образования - это учёные и преподаватели. Программисты - побочный продукт, хотя и полезный.

Но главное тут даже не в том, что МЫ хотим видеть на выходе. Мы можем хотеть много чего, реальность же такова, что сделать программиста (то есть вот такого специалиста, который будет писать программы и получать за это деньги) в рамках учебного заведения невозможно. Все программисты, кого я спрашивал, говорят, что программировать они или сами научились, или их научили уже коллеги по фирме. И со мной самим, естественно, была такая же история.

Максимум, что мы можем сделать в рамках университета - это научить думать и самостоятельно извлекать знания из окружающего мира. С этим университет справляется.

А Си, конечно, не сложный, и этого я не утверждал. На втором курсе Си объяснить - задача проще пареной репы. Я лишь утверждаю, что даже если наша цель - научить студента писать на Си, то проще и быстрее сначала научить его на Паскале, а потом перейти на Си.

Если получение

Если получение высшего образования - осознанный выбор, то человек и будет самостоятельно получать знания. А вот свободный выбор факультативов с углубленным изучением, вкупе с не очень большим набором обязательных предметов, дал бы возможность перекрестного опыления знаниями еще в процессе обучения.

Увы, для

Увы, для большинства студентов на младших курсах высшее образование - это неизбежное зло, которое приходится преодолевать, чтобы получить корочку. То, что всё это вообще-то желательно ещё и знать, народ просекает на четвёртом-пятом курсе, когда уже поздно.

А про факультативы я полностью согласен. Я вообще предпочёл бы систему, принятую в западных университетах, когда можно самостоятельно выбирать курсы, просто у каждого курса есть пререквизиты, то есть курс можно слушать, только уже прослушав определённый набор других курсов.

Ну а раз так, то

Ну а раз так, то действительно учить С - незачем.
Я в свое время осознанно начинал именно с Си, но до этого был бейсик, паскаль и тупо машинные коды, просто была возможность учиться играя с третьего класса.

Вообще-то я не согласен

Видимо, вы вообще не читали обсуждаемый здесь текст. Я никогда не говорил, что Си учить "незачем" или не нужно. Напротив, Си - язык в процессе обучения необходимый: и арифметика указателей, и работа со стоками на нижнем уровне, и программирование на уровне системных вызовов - всё это опыт, без которого невозможно понять, что такое программирование.

Я лишь утверждаю, что всему своё время. Си не может быть первым языком программирования. Вторым - запросто.

Почему нельзя учить на Java

Вот статья для тех, кто предлагает начинать обучение с Java, Pyton и других языков высокого уровня.
Опасности обучения на Java

Хотя в ней предлагается начинать обучение с Си ;)

Огромное спасибо!

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

ada

А что вы думаете об замене Паскаля языком АДА изначально, ведь АДА имеет паскалеподобный синтаксис, плюс в конце курса можно дать параллельное программирование?

Гм

Ну, для начала синтаксис (точнее - лексика, потому что синтаксис там совсем не похож на Паскаль) тут вообще ни при чём. Если сравнивать Си и Паскаль, то применение в Паскале begin и end вместо сишных фигурных скобок будет вообще последним, о чём я вспомню. Ибо какая нафиг разница.

А что до Ады как таковой... гм. Аду95 я, каюсь, не знаю и даже издали не видел. А Ада83... э... мммм... Моим первым поползновением было сказать, что она слишком сложна даже для профессиональных программистов, но лучше я не буду этого говорить. Вполне возможно, что Ада допускает постепенное введение в себя. Для ответа на этот вопрос нужно знать Аду лучше, чем я её знаю, ведь я на Аде никогда не писал. Это надо, например, Рыбина спросить, смог бы он прочитать Аду первокурсникам, не знающим, что такое функция и тип переменной. Если скажет "смогу", то попробвать уговорить его или ещё кого-то это проделать. В порядке эксперимента. На одну группу. Если получится - замечательно.

Касательно Ады

Касательно Ады могу вспомнить семестровый спецкурс Рыбина, прослушанный мной то ли на втором, то ли на третьем курсе. Это все очень интересно, но порог вхождения получался там очень высоким: написать на Аде что-то работающее я тогда смог бы разве что глядя в свой же конспект хотя бы за первую половину курса.

на 2м курсе, насколько я помню. точно не на 3ем.

вот +1.
и я не уверена, что если занятий по Аде будет больше, чем одно в неделю, результат будет сильно лучше.
Хотя.. смотря что из Ады запихнуть в курс

Неточность

В последнем абзаце девятой страницы стоит заменить "регулярные автоматы" на "регулярные выражения" или "конечные автоматы".

Мне кажется, у

Мне кажется, у нас на факультете вообще непозволительно много времени уделяют изучению инструментов в отрыве от практики. Синтаксис того же сферического паскаля в вакууме зачем-то дается на лекциях в виде блок-схем и БНФ по книжке Трифонова. Зачем? По большинству современных языков написаны вылизанные сообществом методички, которые любой студент в состоянии освоить за несколько занятий.

Хорошо всё уметь, ага

Глайдер, ну-ка, погоди, любой студент? Даже такой, который не понимает, что такое побочный эффект? Да какой там побочный эффект, мне на втором курсе попадались люди, не понимающие, что такое вложенный цикл.

С небес на землю шагом марш. А лучше бегом. Зная твой уровень, рискну предположить, что ты на момент поступления на ВМК программировать уже умел. Я специально в обсуждаемом тексте упоминаю людей из этой прослойки и - увы нам! - тот факт, что ориентироваться на уровень этой прослойки мы не можем, ибо она чрезмерно тонка.

Окей, вопрос

Окей, вопрос снимается. Я в основном в данном случае говорил про Python, но в его тьюториале тоже английским по белому написано про то, что необходимо знание C/C++ :( С Go, похоже, та же история.
Я навскидку вообще могу назвать более-менее один тьюториал действительно для нубов -- Why's Poignant Guide to Ruby (http://mislav.uniqpath.com/poignant-guide/book/chapter-1.html), но он, увы и ах, тоже GC. Лично мне, правда, это препятствием не кажется: в том же Лиспе вообще нету никакой явной аллокации памяти, а, поди ж ты, учат и на первом курсе, и даже раньше (вон, Эльман в школе умудряется детей Лиспу учить).

Лисп - не

Лисп - не императивный, сиречь не фоннеймановский. Если мы от базового вычислителя (машины фон Неймана) отходим настолько далеко, что готовы не обращать внимания на мусор (добавив GC), то тогда нет смысла оставлять присваивания, циклы и прочие исходно противоестественные концепции, навязанные именно что машиной фон Неймана.

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

Правильная статья

В целом всё правильно. Но! Скажу с точки зрения человека, который "умеет программировать на 1м курсе". Моим первым языком был Си, а ОСью - *nix (Linux Slackware). Изучал я это всё по ОС UNIX А. Робачевского и K&R Си. Кстати, очень быстро всё понимается, если включать отладочный вывод. Где адрес, где значение итд.Так вот, обладая некоторым запасом знаний в области программирования и Юникса, отработав несколько лет в должности сис. админа юникс-серверов, очень неприятно сталкиваться с мнением преподавателя "Да ваш Си - фигня, а юникс - отстой. Я пишу на дотнете (программирую мышкой) и я знаю, чему вас надо учить".
Да и программисты из тех, кого учат таким образом, выходят аховые. Итого - человек учился программированию, но всё, что он умеет - расставлять кнопки по формам и копипастить код из примеров. Зачем такое обучения?

Надеюсь, не в мой огород булыжник?

На всякий случай - я с 1998 года предпочитаю об винду не мараться :-)

Мой ответ

Я позволил себе написать ответ. :)

http://avchernov.livejournal.com/312.html

А ничего, кстати, текст

... мне даже местами понравилось, особенно про бумажки.

Если по существу, то, во-первых, блажен кто верует. В данном случае - в 25-30 процентов. И в пользу от ЕГЭ по информатике.

На самом деле, я с твоими тезисами готов согласиться почти во всём (даже несмотря на исходные посылки, излишняя оптимистичность которых для меня очевидна) -- кроме одного: собственно перехода на Си. Этот переход, как ты сам отмечаешь, никоим образом из остальных твоих тезисов не следует.

Хотя нет, вру, есть ещё один момент. Если написание машин Тьюринга и алгоритмов Маркова убирать из практикума, то нужно будет придумать отдельно семинары в поддержку курса АиАЯ. Потому что уметь решать эти задачи необходимо.

Хорошее эссе

Я долго не понимал, почему преподают "мертвый" паскаль, вместо живого С. Потом, когда на 2 курсе объяснял С раздолбаям из группы, понял почему :)

Но почему бы не Python? интересный язык, несложный в освоении и понимании.

Работу указателей, лично я понял после того, как начал интересоваться ассемблером :) после него как-то очень быстро дошло, что это такое и как ими пользоваться :)

Pascal и мое негодование

А ведь и серьезно, без паскаля врядли бы писали программы наши блондиночки :) я сам то как сейчас помня свое негодование и ненависть к паскалю, ведь я писал на пхп, ц, визуальном беисике и так далее перед тем как поступил на информатику. А сейчас я это понял, и деиствительно хорошо что был такой курс ;)

с точки зрения недавнего студента

Позволю себе высказаться с точки зрения не преподавателя, а студента.
Когда на первый курс приходишь с знанием си, то "стандартный паскаль", особенно в группах, в которых заставляют "строго" его придерживаться, доставляет уйму негативных эмоций. Это, конечно, мелочи с точки зрения высоких материй и долгосрочных перспектив, и года через 3-4 начинаешь понимать зачем и почему было именно так. Но раз уж речь зашла о преобразованиях, даже если не удастся сделать отдельные группы для более/менее подготовленных(это, всё же, совмещено с немалыми административными и практическими сложностями), то, в качестве небольшого изменения, было бы очень приятно, если бы просто разрешили писать домашние задания и задачи на экзамене не только на паскале, а скажем на паскале/сях/схеме. На выбор.
И ещё, конечно, всё правильно про перевод процесса на UNIX. Правда, при этом, очень хотелось бы, что бы один-два семинара посвещались курсу молодого бойца про шелл, vim, gdb и прочие необходимые вещи. Сейчас считается, что студент должен узнавать это сам, если не узнал --- сам виноват. Но раз уж тут зашла речь о том, что студенты бывают не только идеальные и вакууме, то, мне кажется, минимальное введение в инструментарий разработчика было бы очень полезно и многие бы проблемы из области непонимания элементарных вещей могло бы устранить.
Хотелось бы, проходя мимо мз2 видеть не чуть не плачущих первокурсниц вглядывающихся в синие экранчики 25*80 и отчаянно копипастящих 30-ый writeln, а что-нибудь более соответствующее 201х году.

Про курс молодого бойца

Не знаю, где это "считается", что не надо рассказывать vim и gdb. Я своим группам на втором курсе это рассказываю. Даже вон книжку написал: Операционная среда ОС Unix для изучающих программирование

Когда на первый

Когда на первый курс приходишь с знанием си, то "стандартный паскаль", особенно в группах, в которых заставляют "строго" его придерживаться, доставляет уйму негативных эмоций.

Вот да, когда на письменном экзамене по курсу "Алгоритмы и алгоритмические языки" ставят - ну ладно четвёрки - но тройки! - за не стоящую в конце строки ; - это...

чё?

Уж не хочешь ли ты сказать, что лично знаешь человека, которому за безупречную письменную работу, единственным недостатком которой была пропущенная точка с запятой, поставили тройку? А можно подробностей? Учебный год, группа, фамилия?

NB: прежде чем лезть на эту амбразуру дальше, припомни, как ты мне как-то раз пыталась объяснить, что одна студентка (не будем называть её фамилию) из моей группы пишет программы самостоятельно, при том что она даже основ синтаксиса не знала.

(отъехала назад)

Ок, ты прав, подробностей не помню.
Учебный год 2000-2001, разумеется. Группа 113 и вокруг. Народ жаловался, что оценки снижают - это я помню. Наверное, действительно не до троек, а до 4-к. Всё равно.

2NB: Угу, мне свойственно (как оказалось) до последнего тащить утопающих учеников наверх. А потом иногда разочаровываться, да. :-( Похоже что зря, но разве ж я об этом знала 6 лет назад?

Это были самые первые дети, которых я чему-нибудь пыталась учить, кажется. Вряд ли это сойдёт за оправдание того, что мне хотелось бы, чтобы они всему научились, впрочем.

Вот ни фига не всё равно

Насколько я знаю положение вещей, пятёрку на экзаменах ставят отнюдь не за сто процентов решенного. То есть пятёрку можно получить, даже вовсе не решив одну, а то и две задачи из предложенных. Следовательно, если оценка была снижена до четвёрки, то, значит, точка с запятой там была не единственным недочётом.

Иной вопрос, что лично я всегда считал и продолжаю считать, что проведение экзаменов в письменной форме недопустимо. Решение задач - это ещё не весь предмет, а знание теории письменной работой не проверяется.

Опечатка

"будет ложным с случае" стр. 9

Психологический аспект

Насколько я помню свой первый курс (15 лет назад), принудительное изучение Паскаля вызывало у большинства студентов негативные эмоции. Язык - мертвый, никто не понимал, зачем на это тратить время. Да, с высоты прошедших 15 лет можно понять, зачем и почему это было, про академическую ценность и прививание навыков. Но важно учитывать чисто психологический аспект: студент, считающий изучаемый предмет бесполезным, в любом случае вынесет из него намного меньше пользы, что нивелирует все академические преимущества. Конечно, прежде всего негативные эмоции возникают у "продвинутых" студентов, которые и так знают многие вещи из начального курса. Но если учесть, что в таких учебных заведениях, как ВМК, продвинутых студентов очень много, то пренебрегать их интересами никак нельзя.

Вообще, в такой области, как программирование, важно просто заинтересовать студента, и эффект превзойдет все ожидания. Поэтому подброшу автору провокационную мысль. Возможно, идеальным в качестве первого языка программирования будет JavaScript в сочетании с HTML и какой-нибудь библиотекой типа jQuery. Совершенно неакадемический язык, но очень простой и красивый, своего рода Бейсик в стиле Си. Самое главное - он позволяет сразу же делать довольно много интересных и полезных вещей, в нем легко заинтересовать как начинающих, так и продвинутых студентов. Конечно, с его помощью не изучищь указатели и типизацию, но зато он прекрасно демонстрирует функциональное программирование и базовые концепции ООП, с его помощью легко освоить алгоритмы и структуры данных, наконец, с него легко пересесть на Си благодаря похожему синтаксису. Мне кажется, для начала более чем достаточно.

Вы вообще с какой луны свалились?

Не знаю как сейчас, но 15 лет назад (ну угораздило же вас именно тогда учиться на первом курсе) я на этом "мёртвом" Паскале писал коммерческие программы и за это деньги получал. Причём ровно на той его реализации, которая до сих пор используется на вмкшном практикуме. У меня дома на полке всё ещё стоит оригинальная коробка с Borland Pascal 7.0, купленная в 1994 году - единственный раз в жизни, когда я официально платил деньги за программу. В те времена я ещё писал под Windoze и верил в копирайты.

Нынче, конечно, turbo/borland'овская реализация мертва аки египетская мумия, и то же самое можно сказать про MSDOS, под который до сих пор зачем-то пытаются писать на нашем первом курсе. Но назвать мёртвой реализацию по имени Free Pascal у меня язык не повернётся. Кроссплатформенный компилятор, переносимость на уровне исходников (включая, что приятно, графику), тонны документации, регулярные релизы новых версий - это вы называете мёртвым языком? Я, как можно заметить, сам весьма и весьма за слезание с мертвечины, я видел, что со студентами делает работа на живой платформе, когда в Ташкентском филиале прочитал "Архитектуру ЭВМ", использовав для разнообразия 32-битный NASM под Linux. Вы можете себе представить, как в девять вечера десяток студентов приходится выгонять из дисплейного класса, где они какие-то игрушки писали... на чём?! На ассемблере! Вот уж на чём точно никто не пишет, если только не ядро операционки и не микроконтроллер. Но - живая платформа с развитой культурой консольных приложений. Программа получается "как настоящая".

А теперь по поводу JavaScript. Язычок, может, и симпатичный, хотя на первом курсе такой не годится, потому как надо научить работать с указателями и без сборщика мусора, чтобы не делать этого потом на Си. Но дело не в этом. За использование любого client side scripting'а на сайтах следует уёбразработчикам отрывать руки нахрен и ссылать их на рудники. А за обучение этому студентов, в этом я глубоко убеждён, нужно по меньшей мере четвертовать. Или сажать на кол. Чтобы было неповадно.

И так веб чёрт знает во что превратили, так вы ещё этих ублюдков предлагаете прямо на ВМК плодить? Дудки. Сопротивляться буду до последнего.

Луна как луна, круглая такая

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

Что называть мертвым языком - вопрос определений. Я назвал Паскаль мертвым не в том плане, что под него нет средств разработки (помимо FP, есть Delphi, которое и сейчас живее всех живых), а в том смысле, что его рыночная доля колеблется в районе процентов, и она продолжает снижаться (см. http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html).

Указатели в языках типа JavaScript/Python присутствуют в виде объектных ссылок, для начинающих это самое то. Что же касается работы без сборщика мусора, то для студентов начального уровня это не главное, пускай сначала освоят хотя бы алгоритмические азы, потом указатели проще пойдут.

Что же касается client side scripting, то, конечно, для обычных информационных сайтов он скорее вреден. Но без него невозможно обойтись в области веб-приложений, таких как Google Mail/Docs/Maps и аналогов, а также многочисленных бизнес-приложений, которые все более популярно писать при помощи веб-технологий. Это замена различных GUI-библиотек и должна рассматриваться именно в этом ключе, не понимаю причин для ненависти. Те самые 15 лет назад, кстати, многие точно также не любили графический режим, потому что ДОС и консоль - наше все. В данном случае переход на веб должен скорее порадовать юниксоидов старой школы тем, что позволяет избавиться в бизнес-среде от жесткой привязки к Windows.

Про мёртвые языки и монструозные браузеры

Я бы сказал, что рыночная доля в районе процентов - это дофига. Если бы рыночная доля "колебалась в районе", скажем, тысячных долей процента - это было бы, может быть, мало. А "мёртвый язык" - это такой язык, на котором мы не смогли бы писать, даже если бы хотели, и это бывает только в одном случае: при отсутствии поддерживаемых реализаций приемлемого качества. Сходу разве что Planner приходит в голову, мир праху его. Даже для PL/I недавно обнаружился gcc frontend.

Теперь по поводу client side. Если на сайте имеется Java, JS, MM flash или ещё что-нибудь подобное, для пользователя это означает, что в момент просмотра сайта на компьютер пользователя незаметно для него самого будет загружена программа для алгоритмически полного исполнителя, и не только загружена, но и исполнена. Создатели всего этого мракобесия предполагали, что виртуальные машины, исполняющие соответствующий код, будут ограничены в возможностях настолько, что исполняющийся код ничего страшного с компьютером пользователя сделать не сможет. Практика, разумеется, показала прямо противоположное. Года не проходит, чтобы в интерпретаторах JS и/или MM flash не нашли очередую уязвимость, причём как правило это сразу remote code execution. Если взглянуть на проблему реально, получится, что создание полностью защищённого тьюринг-полного интерпретатора - это задача, превышающая возможности человека. Есть алгоритмическая полнота - будут и эксплойты. Таким образом, используя на своём сайте client side, в особенности если сайт без них работать не может, разработчик сайта принуждает своих пользователей к включению в браузере интерпретаторов JS и прочего, то есть к компрометации безопасности их компьютеров.

На основании вышесказанного я заявляю, что все веб-разработчики, создающие такие сайты, которые невозможно просматривать с отключённым в браузере интерпретатором JS и/или MM flash и других подобных примочек - безответственные ублюдки, ни в грош не ставящие интересы своих пользователей, и это моё окончательное слово по данному вопросу.

Но что меня особенно порадовало, так это ваше предположение насчёт юниксоидов. Парадигма "браузер как платформа разработки" превратила программы, исходно предназначенные для просмотра гипертекста, в монструозные поделья, сложностью превосходящие иную операционную систему, а ресурсов требующие на уровне самых распухших и тормознутых игрушек. Я вот тут подумываю насчёт расширения объёма памяти в моей основной рабочей машине, при этом единственное, что тут тормозит - это браузер. Если б не этот грёбаный файрфокс, мне бы имеющихся 128Mb хватило ещё надолго. Не то чтобы мне было денег жалко на дополнительную планку памяти, мне скорее жаль своего времени на то, чтобы найти память подходящего типа, учитывая, что это всё ради идиотского браузера, даже OpenOffice не такой распухший оказался - ему в 128Mb не тесно ни разу. С точки зрения common sense всё это, пожалуй, ещё хуже, чем Windows.

А от жесткой привязки к Windoze нас вскоре спасёт сам мелокософт. С Вистой они уже очень неплохо обделались, если также пойдёт и с "семёркой", винде хана. Винде, впрочем, хана по-любому, нынче операционная система - это не такая вещь, которую может сделать и поддерживать отдельно взятая контора, пусть даже такая толстая.

обучение на 1м курсе

У нас в университете начали с Си и то непонятно было преподавали Си или С++. использовали вперемешку эти iostream'ы cout и printf. Подключали зачем-то conio.h. Хотя при запуске в консоли это не нужно. Подключали еще кучу ненужных библиотек и не понимали зачем они нужны. Некоторые студенты запускали приложения через иконки! Знаком с людьми у которых при упоминании языка Си или Си++, вызывает отвращение.
Я согласен с автором эссе, что первое изучение не должно начинаться с подобных языков.

Раз уж пошла такая пьянка...

Почему бы ради эксперимента не опробовать язык Go в качестве первого языка? Его механизм сборки мусора позиционируется как большой плюсег) Да и что-то я не припоминаю, чтобы на первом курсе в процессе написания учебных программ на паскале кто-то заботился об очистке памяти.

Go

Цитирую сайт golang.org. Первая фраза туториала:

This document is a tutorial introduction to the basics of the Go programming language, intended for programmers familiar with C or C++.

Собственно, этим всё сказано. Не зная C и C++, тут делать нечего. Да и страшен он, язык этот: почти всё, что сказано в моём эссе против Си, будет применимо и к Go.

Кроме того, как я уже говорил, garbage collected - это (для императивного языка) однозначный дисквалифицирующий фактор. Или уж начинать с Лиспа (что, кстати, может быть не так уж плохо, только где взять преподавателей), или, если учим императивному программированию, то принцип "забрал ресурс - отдай обратно" необходимо показать с самого начала.

О назначении языков

Любопытная дискуссия, тема которой мне близка и очень интересна.

Несколько месяцев назад пытался отыскать потенциальные замены Pascal как первого языка для обучения программированию. В данном качестве рассматривались языки python и Go. Первый был отвергнут почти сразу из за динамической типизации, отсутствия указателей и управления памятью, второй был отставлен в сторону после обсуждения его с автором эссе (основной недостаток заключался в gаrbage collected).После чего я попытался подойти к проблеме более простым путем.

Очевидно что различные языки можно рассматривать как инструменты. Эти инструменты имеют различные назначения, которые были заложены в них ещё при создании.

Так, насколько я понимаю, язык C создавался, чтобы написать на нем ОС UNIX.

Основное назначение языка Pascal - обучение программированию.

Если положить эти два утверждения как постулаты, то вопрос очевидно разрешим. Если вопрос остается, то значит один из постулатов не верен. Возможно присутствует и исключённое третье.

Я не еще не прочитал, но одобряю

В жж предложили попинать автора, однако тезис верен даже до приведения аргументов.

Шелл на замену Паскаля

Добрый день! Скажите, а как Вы относитесь к изучению шелла в качестве самого первого шага? Смысл таков, что объяснить студенту/школьнику понятие команды вполне реально. Потом добавляем аргументы. Показываем, что это не эфемерные команды, а вполне конкретные программы с такими именами, лежащие в $PATH. Посвящаем в суть stdin/out/err. Рассказываем, что шелл - это тоже программа, которая обрабатывает ввод пользователя; на этом этапе можно продемонстрировать базовый шелл-скрипт как средство автоматизации (сначала просто последовательность команд, потом добавить условия и циклы). А дальше уже приступать к изучению C и инструментария.

Отрицательно

Shell, в принципе, можно рассказывать в качестве первого языка и даже что-то на нём показывать - но человек, знающий только Shell и не знающий больше ничего, к восприятию Си не готов. Пардон, и Си, и Shell - языки, слепленные на коленке и состоящие из хаков. Начать с Shell'а ещё можно, поскольку на нём всерьёз писать всё равно никто не станет и будет исходно понятно, что это не настоящее программирование. Изучать Си, не зная ни одного "правильного" языка программирования - значит, на выходе получится как максимум хакер (не тот, который взламывает, а тот, который пишет программы write only).

Когда поступал

Когда поступал - тоже с пренебрежением и снобизмом смотрел на Паскаль.
Для справки - в школе в 7-8 классах учил Паскаль, в 9-Си.

Паскаль мы проходили в школе дооолго... и еле доползли за 2 года до структур.
Потом сменил школу - продолжение истории мне неведомо.

Изучение Си в школе было скорее похоже на какой-то кошмар с постоянным ощущением, что я что-то проспал.
Набор магических правил вывода и необходимость лезть в библиотеки за функциями с весьма специфичными заголовками просто выводили из себя.

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

Настало время третьего семестра и, соответственно, изучения языка Си.

Я честно скажу - я ничего(!), кроме библиотек не открывал и не смотрел, про Си мне больше не говорили и писать на нём не учили.

Это было уже не нужно, прошло время и у меня всё само собою уложилось на полки.
Однозначно, большой вклад в это "чудо" - это практика на Паскале.

В классе у нас адекватно писал на Си только один человек - но это явно не заслуга преподавателя.
//Вообще в 10м были попытки вести Си++ - это уже был просто кошмар на постном масле. //
//Алгоритмика и структуры данных тоже были в 10м классе, их мы без труда освоили "на пальцах", но вот реализация на Си давалась очень трудно //

А вот насчет групп с усиленным изучением - не протолкать Вам этот проект. Никак.
Вообще оглядываясь на первые 2 курса я понимаю, что мог спокойно узнать раз в 5 больше и даже бы не напрягся.
Как и некоторые другие ребята - если бы мне было интересно.

Вместо интереса у нас - учебный план - пусть неплохой, но он раздражает.
Раздражает именно эта предопределенная линейность, когда ты катишься по прямой и никуда не денешься от Си и тд и тп.
Ну и отчетности по программистским предметам... ладно, молчу.

Немного об обучении программированию

В свое время, еще когда я учился в школе (к тому времени я уже программировал на Basic, Pascal, Delphi), у меня созрела идея о том, что программирование преподается несколько "непонятно". Мне повезло тем, что у меня отец был программистом, и книжки по программированию попадали ко мне после его контроля. Это исключило значительную часть книг типа "Для чайников", в которых понимание самого программирования и построение соответствующей модели мышления приносится в жертву простоте и понятности описания.

После десяти лет программирования (из них 5 лет - профессионально) я пришел к окончательному выводу, что строить модель нужно начинать ДО знакомства с языком программирования. Сюда относятся первичные знания о системах счисления, железе, физическом представлении памяти, логическом линейном представление памяти (здесь самое место для объяснения указателей), принципа "Разделяй и властвуй", из которого потом легко пояснить построение файловой системы, модульности и т.д. По-логике это должно идти в курсе информатики. Раз ее не дают (или очень слабо дают) в школе, в университете имеет смысл в первом семестре ставить именно азы информатики, критичные для понимания принципов программирования.

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

Еще пару слов о мотитвации. Есть очень много школьников и студентов, у которых уже отбили желание учиться. Для таких "трудных" кадров имеет смысл провести небольшую презентацию. Она должна состоять из порядка 10 шагов, которые показывают, как с помощью программирования можно создавать готовые приложения. Когда они понимают, что у них есть инструмент, и что с его помощью можно сделать что-то существенное (а не просто какое-то там консольное приложение), а также то, что многие вещи уже сделаны за них, то обучать их становится намного проще.

P.S. Хоть у меня и нет опыта преподавания в аудитории, в свое время я занимался репетиторством, в том числе и по программированию. Результаты применения вышесказанного таковы, что уровень понимания студентов поднимается с тройки до пятерки (рассматривая уровень неспециализированного ВУЗа).

Здесь есть одна сложность.

Если человек не представляет, что такое программирование и как выглядят программы, то при попытке впихнуть в него "предварительные" знания он, не зная, зачем это всё, просто не примет вливаемую в него информацию.

Впрочем, в математике это творится с младших классов до старших курсов - никто не объясняет, зачем потом понадобятся заучиваемые сейчас теоремы. Результаты мне кажутся печальными, но никто ничего с этим делать не пытается - может быть, это только мне так кажется?

Это уже рассмотрено

См. четвертый абзац, про презентацию. Главное при этом - на пальцах объяснить, что откуда берется.
Пример (сжато): Программа - часы. Чтобы стрелка двигалась, нужно считать угол. Чтобы впринципе что-то рисовалось - необходимо создать окно, а также каким-то образом считать секунды. Для этого существует набор инструментов (библиотечные функции, но лучше называть "набор инструментов", т.к. это понятнее), которые нам любезно предоставляет система (ОС, но лучше называть "системой"). Для того, чтобы пользоваться инструментами, существует специальное соглашение, называемое программным кодом. Оно позволяет в текстовом виде записать то, чего вы хотите от системы. Чтобы все это запускалось, необходимо перевести программный код в вид, понятный компьютеру (машинный код, но лучше опять же так не говорить). В итоге видим последовательность простых шагов (простых = понятных аудитории), которые позволяют проследить, для чего нужно написание кода.
Если возникнут вопросы "а зачем вообще нужен программный код, нельзя ли было сделать какн-ть понятнее?", то не нужно вдаваться в пространные объяснения об ограничениях. Достаточно привести аналогию с жизнью, например, так: "Когда вы кому-то звоните, вы же набираете телефонный номер. Это тоже вид подобного соглашения."

Ну и?

Всё это никак не снимает моего возражения. Если человек не понимает, о чём вообще идёт речь (а некоторые люди, вообще говоря, не понимают, что "кнопки" в GUI на самом деле вовсе не кнопки, а лишь изображение на экране -- я таких людей своими глазами видел), то все ваши рассуждения влетят ему в одно ухо и, не задерживаясь, вылетят из другого. Так, конечно, произойдёт не со всей аудиторией, и некий feedback от слушателей может создать впечатление, что всем всё понятно - вот только слушатели, создающие этот feedback, составят несколько процентов аудитории.

И, кстати, я настаиваю на том, что в начале курса окошкам и рисованию не место. Алгоритм - это преобразование входных данных в выходные, так что только консольные приложения. В противном случае на выходе как максимум PHP-кодер получится, причём посредственный.

Касательно математики

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

Я не имел в виду

Я не имел в виду "зачем всё это нужно в жизни" -- уж тригонометрия и раскрытие модулей в неравенствах никому "в жизни" не понадобится точно, а начала анализа пригодятся только будущим инженерам и математикам, которых не так уж много -- но это совершенно не повод прекращать изучать математику. Я имел в виду другое: зачем исследование того или иного направления потом нужно в самой математике. Кроме того, никто не объясняет ученикам, зачем на самом деле нужны доказательства, а сами доказательства если вообще даются, то даются так, что из них для себя ничего не извлечь. То есть, иначе говоря, математика преподаётся так, что от ученика ускользает внутренняя структура предмета. Школьники поголовно уверены, что доказательства в математике нужно изучать, чтобы автор учебника нас не обманул - и, более того, так считает большинство студентов, а ведь это совершенно не так.

Просто несколько примеров. В школе вводится Основное Тригонометрическое Тождество (аж прямо вот так, с трёх больших букв, чтоб уважали, наверное), его предлагается просто зазубрить. Я ещё не видел школьника, которому бы на уроке математике сказали, что никакого такого отдельно стоящего, да ещё Основного, тождества на самом деле нет, а есть просто теорема Пифагора, записанная для треугольника в тригонометрическом круге.

Другой пример из школьной программы - решение квадратных уравнений. Смотрите, дети, это Дискриминант, Великий и ужасный!!! Когда я показываю старшекласснику, как на самом деле просто выводятся эти формулы (выделением полного квадрата) и в какой момент там вылезает этот вот дискриминант, для школьника это натуральное открытие -- и какого, простите, дьявола это ему учитель не скажет?

Парочка примеров уже из высшей математики. Я помню, как на первом курсе бился лбом об стену, пытаясь понять, откуда берётся и почему работает определитель матрицы. В одном учебнике он вводился рекурсивно через миноры, в другом - через сумму всевозможных произведений, но ни то, ни другое не давало понимания, почему же с помощью этой штуки можно решать СЛАУ, а соответствующее доказательство было таким заковыристым, что проследить его мне тогда не удалось. Никто почему-то не сказал мне, что определитель - это просто объем параллелепипеда, натянутого на векторы-строки. Ну, по правде, не совсем просто, поскольку может быть и с минусом. Но если бы мне это сказали, просто так, в качестве примечания, а потом уже вернулись к своим способам введения оного детерминанта и строгому изложению курса, я бы всю эту механику понял на первом курсе, а не на пятом.

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

Нет общностей без частностей

Предполагая, что мы с автором учились в советских школах примерно в одно и тоже время, не соглашусь с тем, что математика преподавалась так извращенно: синусы/косинусы вводились как отношения катетов к гипотенузе и тождество именно доказывалось; тоже самое было с квадратным уравнением: сначала изучался квадратный трехчлен, выделение полного квадрата, и только потом закономерно выводились общие формулы; ...

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

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

Кстати, а зачем по-вашему нужны доказательства? Лично мне доказательства помогали запомнить условия теорем, но основное их назначение именно в том чтобы выявлять правильные утверждения (ну да еще и тренироваться логически мыслить).

Про доказательства

Вопрос про доказательства лишен смысла вне контекста. Если продолжать рассматривать доказательства в контексте обучения математике, то они нужны для проникновения в предмет - иначе говоря, для постижения взаимосвязей между понятиями. Или, говоря ещё проще, именно доказательства отвечают на вопрос "почему так" и позволяют собрать весь изучаемый предмет в единую картинку; без этого предмет так и остаётся набором странных утверждений, которые надо зазубрить, что опускает математику на уровень гуманитарных предметов и даже ниже (там хоть какая-то системность есть).

"Для выявления правильных утверждений" доказательства тоже нужны, но совершенно в ином контексте - а именно, в работе профессиональных математиков, строящих новые теории. В школе и ВУЗе такой цели (отличить правильное от неправильного), вообще говоря, нет, поскольку в школе и в большинстве ВУЗов от всей математики рассматриваются только хорошо изученные и многократно вдоль и поперёк перепаханные разделы, в которых и так известно, что правильно, а что неправильно.

Относительно всего остального вашего текста я вообще не понимаю, к чему он, поскольку сказанному мной никак не противоречит, но, впрочем, и не усиливает -- он просто вообще про другое. Я говорил совершенно не о том, что в школе недостаточно или наоборот слишком сильно обобщают предмет, я говорил лишь о том, что в школе математика преподаётся (сейчас) так, что на выходе у школьников (даже весьма сильных) о математике как предмете создаётся крайне странное впечатление, а саму математику, в том числе и элементарную, школьники на выходе не знают, даже когда умеют решать задачи.

Так случилось, что я преподаю С первым языком

Добрый день,

Спасибо за статью, нечасто в сети можно встретить взвешенное и адекватное изложение проблем начального преподавания программирования на конкретном языке.

Так получилось, что мне как раз приходится преподавать C как первый язык (в Новосибирском ГУ), и свои мысли по поводу того, как это мне кажется правильным делать, я хотел написать в комментарии, но в итоге оформил отдельным текстом: http://info.fenster.name/misc/teaching_c.pdf

Ни о чём

Во-первых, мой текст вы, видимо, если и прочитали, то понять даже не пытались, так что считать вашу статью "ответом" на мой текст невозможно.

А во-вторых, вы сами в своём тексте исходите из предположения, что у ваших студентов уже есть какой-то опыт программирования, то есть строите изложение на предположении, что Си - уже не первый язык для ученика. Я бы сказал, это лишь подтверждает моё утверждение о том, что Си не имеет права быть первым языком.

Если у вас там нет часов на полноценное обучение программированию, то мне представляется по меньшей мере странным ваше стремление во что бы то ни стало научить студентов промышленному языку. Ведь программиста вы всё равно ни из кого из них не сделаете (может, кто-то и станет программистом, но сделает это сам, скорее вопреки своему образованию, нежели благодаря ему).

И, кстати, ещё одна мысль. Мой опыт показывает, что в аудитории всегда есть люди, не имеющие никакого (совсем никакого!!!) опыта программирования, это верно даже в том случае, если у них уже были программистские курсы. Я, как уже говорилось, на втором курсе ВМК встречал людей, не понимающих, что такое вложенные циклы. Из этого я делаю однозначный вывод, что форма отчётности по тому курсу, который вы читаете, не позволяет оценить действительный уровень подготовки -- точнее, позволяет студенту, не зная и не понимая ничего точка совсем, тем не менее как-то проскочить (списать, купить программу за деньги у старших товарищей, а потом сдать, etc).

На самом деле, действительная картина становится ясна лишь тогда, когда с отстающим студентом приходится заниматься в индивидуальном порядке, но нам на ВМК это всё-таки проще, 18 групп на курсе, три лекционных потока, то есть можно давать частные уроки студентам других групп и других потоков, не опасаясь потом встретиться с этим студентом на зачёте или экзамене. При этом сам студент, зная, что этому преподавателю ничего сдавать не придётся, не склонен скрывать свой действительный уровень знаний, и вот тут-то всё и становится понятно.

Короче, рекомендую спуститься с небес на землю.

Даже страшно...

Даже страшно... Никогда не писала никаких комментариев в форумах, но нужно же когда-то начинать. Прочитав эссе и ответное эссе господина Чернова, не могу на согласиться с Андреем Викторовичем, которой в заключительном разделе просто озвучил многие мои мысли. К огромному сожалению на факультете основная проблема - кадровая проблема. Многие из тех кто преподает программирование совсем не умеют преподавать, некоторые хорошие программисты, на деле никудышные преподаватели, другие в прошлом не плохие педагоги, неспособны воспринимать новое, некоторое число преподавателей работают на результат (результатом они считаю подготовку студентов к сдаче экзаменов... экзамены по программированию на факультете ВМК отдельный больной вопрос), а большинство просто прибывает на парах, студенты от их присутствия ничего не получают. Мне все кажется, что целью программистских курсов является опускание студентов преподавателями или преподавателей студентами, а не обучение программированию. Некоторым преподавателям необходима подготовленная аудитория, они смогли бы с ней работать, а работать с теми кто к ним приходит они в принципе не хотят (опять же отдельный вопрос почему не предоставить им такую аудиторию?) Но, если уж им достались те кто программировать не умеет, почему бы не спуститься на землю и немного поучить этих "бездарей". Снобизм по отношению к студентам меня просто поражает. Рассуждения о том, что бы нужно было преподавать и все здравые идеи на этот счет, к сожалению, как всегда утонут в этом болоте. Какой такой Питон, что это за зверь такой, проведите тестирование преподавателей... многие знают только то, что им поручено вести, да и то знают они это не очень хорошо, вот я удивлюсь если их заставят выучить ассемблер под UNIX... или Питон! Зачем!? Ведь так приятно ловить студентов на недоделках MSDOS... или нестандартном использовании некоторых директив...

Э...

Ассемблер под UNIX "учить" не надо, там вся разница - что регистры называются с буквой e и становятся четырёхбайтными, и нет идиотических "сегментов" (которые вовсе и не сегменты), а ещё в исполнительном адреса можно сочетать регистры как угодно, не нужно запоминать "разрешённые" регистровые пары.

Меня другое смущает. 32-битку у нас может и примут, в смысле от MSDOS откажутся, но вот как бы они не сделали ЭТО под Windows 8-()

Спасибо!

С этим эссе согласна на все 100%. Изучала на первом курсе Паскаль. На втором на первых лекциях по СИ вообще ничего не понимала. Смеялась над текстом, да да... именно так чувствует себя студент... чувство, что меня хотят обмануть, что сейчас это не понятно, а как дальше станет все на свои места - вообще не укладывались в моей голове!

Все бы преподаватели так относились к своей дисциплине!

ФЯП

Слышал точку зрения, что изучать программирование следует с функциональных языков, ибо они более понятны человеку, далекому от программирования. Приводили пример про операцию присваивания: выражение типа b = b + 1 для человека, знакомого со школьным курсом математики кажется бессмысленным, пока не объяснить, что знак равно в данном случае - не равенство в математическом смысле, а инструкция "поместить в переменную результат вычисления выражения, стоящего справа". По-моему - пример надуманный, поскольку это уже детали синтаксиса: в том же Паскале, если мне не изменяет память, операции присваивания соответствует лексема ':='. С другой стороны - прелесть функциональных языков языков в том, что они гарантируют отсутствие сайд-эффектов там, где необходимость их наличия явно не задана.

Давно известная точка зрения

... и я даже поддержал бы её, будь мир идеальным. Даже мой собственный преподавательский опыт показывает, что нефоннеймановское программирование для многих людей проще в освоении, нежели фоннеймановское, то есть им проще получается начать программировать на функциях и рекурсиях, а потом уже осознать понятие побочного эффекта и перейти к императивному программированию. У меня была минимум одна студенкта, относительно которой на младших курсах сложилось мнение, что из неё уж точно ничего не выйдет, и так продолжалось, пока она в поисках халявы не распределилась на кафедру, где весь практикум построен на "альтернативных" языках - сначала Рефал, потом Лисп, в довершение Пролог. Каково было моё удивление, когда на этих языках она вдруг начала программировать. Потом, как и следовало ожидать, она освоила и то, что не могла освоить на младших курсах - традиционную императивщину. Сделала вполне приличный диплом, вроде бы сейчас даже по специальности работает.

Проблема тут в том, чтобы обеспечить 18 групп (т.е. 36 подгрупп) первого курса ВМК преподавателями, способными грамотно провести введение в программирование на основе функциональных языков (причём это не Лисп, Лисп практически императивный - нет, тут нужен скорее Haskell). Практически неразрешимая задача, столько функциональщиков у нас нет и не предвидится.

Опечатка

Спасибо за статьи, обнаружил опечатку anti_c.pdf стр.3 Если начинать рассказ о программировании... операций, ТИПАОВ...

Уже исправлено

уже в v02 этой опечатки нет, в v03 - тем более. Но всё равно спасибо :)

Мои 5 коп

Имея свой опыт в целом согласен с автором эссе anti_c_v03.pdf.

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

Если взять ЕГЭ, то характер распределения способностей по программированию не сильно различается по сравнению с другими дисциплинами - 10-15% отличников (понятное дело, что кривая составителями примерно под это и подбирается), для поступления на ВМК нужно набрать примерно 320 из 400, в ЕГЭ нет многих вещей (типа процедур), поэтому сито по информатике пропустит довольно много людей, не знакомых с нужными для C вещами. "Отрезая" от Гауссиана (точнее, почти Гауссиана) хвост (x>x_0) мы получим распределение, плотность которого падает сильнее, чем экспоненциальное (радиоактивный распад), поэтому средний уровень будет "очень близок" к началу, и "далек" от конца.

Отдельный вопрос - ученики СУНЦ и аналогичных школ. У них распределение будет несколько иное, но если брать именно СУНЦ, то основная масса идет на МехМат, а на ВМК - порядка 10 человек, т.е. погоды не сделают (или надо идти туда преподавать и агитировать).

P.S. зверская CAPTCHA :)

про капчу

чтоб она была не зверская, туда надо подложить TTFовые шрифты, а мне, естественно, лень разбираться, где их берут и как туда подкладывают :)

А я согласен с

А я согласен с Вашим эссе!

Да, кстати, а проводился опрос среди первокурсников на тему преподавания программирования в школе?

Неточности

Андрей,

рассказываешь истины, но хорошо, что рассказываешь :)

Хочу отметить, что
1. пример с побочным эффектом допустим и в Pascal, поэтому это плохой аргумент против С
2. совершенно не понятен неожиданный переход на рассуждения вокруг ассемблера в заключении :( Навреное, это больше относится к "мегавыводу" - давайте все программисткие курсы переведем под UNIX

может, и допустим

В Паскале много чего допустимо (хотя присваивание всё же оператор, а не операция, так что вот прямо так - не получится). Но в целом речь не о том, что там допустимо, а о том, что там стимулируется.

Насчёт второго - я эссе писал для совершенно конкретной аудитории, в контексте совершенно конкретных событий, происходящих в совершенно конкретном месте - на факультете ВМК. Кабы я знал, что его так распиарят, я бы его и писал совсем иначе.

о целесообразности начала обучения с Си в академии "Шаг"

Моя дочь- 9-классница второй год посещает занятия в Академии "Шаг" Полтава. Мы, родители, отдавали ее в данное учебное заведение желая углубить ее первоначальные знания в сфере применения компьютера в быту. Занятия проводились в целом нормально-интересно для дочери. Но вот в конце второго года обучения она стала изучать программирование в Си. Занятия, годовые контрольные, подготовка к экзаменам в школе и освоение программирования у нее сразу не пошли. И все же поверхностные знания о программировании следует иметь. С чего начать....
С уважением, военный пенсионер, врач СпецНаз ВС СССР.
Юрий Яковлевич.
.

Как можно

Как можно заметить, я считаю, что даже в ВУЗах профильного направления Си не может быть первым языком программирования. Что же касается попыток научить программировать на Си школьников - то за такое, и я в этом глубоко убеждён, следует лишать права профессиональной деятельности в области образования. Так же, как и за обучение бейсику.

Что касается "с чего начать" - то среди императивных языков я не вижу альтернативы Паскалю. А ещё - не надо делать это под Windows, если не хотите закрепить привычку ставить в конце программы операцию чтения, не задумываясь о том, зачем она нужна.

К чему такое обучение реально приводит или гладко было на бумаге

Позволю себе высказать точку зрения как преподаватель, который не один год находился в системе, сильно похожей на предлагаемую автором: сначала студенты учат Паскаль, который на дальнейших предметах сменяется на Си (со 2-го учебного семестра).

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

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

Мой однозначный вывод из этой ситуации: для слабых студентов лучше систематически учить на младших курсах ОДИН язык (какой - второстепенно), чем изучать Си после Паскаля или любую другую смесь (что по мнению автора должно даваться гораздо легче, а на деле легко дается только небольшой прослойке относительно умных). В принципе можно и Паскаль, для преподавателя учить на нем основам программирования проще, но поскольку большинство более старших курсах требуют знание Си то стратегически практичнее все-же Си. Гораздо важнее научить студентов грамотным методам отладки, научить осмысленно связывать инструкции с состоянием переменных, выдаваемых отладчиком и подавить попытки отладки методами "ожидания озарения" и "тыка", а также научить систематически подходить к разработке программы, а не кидаться сразу в редактор исходного кода. А это все очень перпендикулярно к рассматриваемым темам и выбору языка.

Немного по конкретным аргументам: реальных проблем с первоначальной "недообъясненностью" #include или указателей в scanf на практике почти не встречал, здесь выручает обычный принцип инкапсуляции: если ты знаешь интерфейс (правило как вызвать scanf) то детали реализации (указатели) знать не требуется. Те самые "средние" студенты об этом даже не особо задумываются и полноценных объяснений сразу не требуют - их внимание поглощено проблемами другими, куда более реальными. С вопросами "а можно ли без #include" и т.д. вылезают как раз особо умные, которые и сами разберутся (ну а любому грамотно программирующему преподавателю поставить их на место труда не составит). И в "хаки" лезет тоже самое грамотное меньшинство, у середнячков на это просто времени и сил не остается и имея трудности они легко принимают принцип "не понимаешь - не используй". А если уж эти проблемы так действительно необходимо обходить, так способы вполне корректно сделать это были предложены еще в стэнфорде в 1992 году (ой) - см. http://j.mp/d4Xn8I Приводить всерьез эти проблемы даже не возражая против методов, использованных в данной статье довольно странно и может рассматриваться лишь как полемический прием, рассчитанный на незнакомство читателей с нею.

Теоретически изложенная здесь концепция очень привлекательна. Практически в условиях ограниченного учебного времени и слабых студентов она не работает. Да, преподавание начал программирования на Си тоже имеет массу проблем и не до конца отлажено, но оно имеет и свои плюсы. Использование Паскаля с переходом на Си нивелирует большую часть этих плюсов, при этом реальное достижение декларируемых ей преимуществ не подтверждается практикой ни нашего ВУЗа, ни в других мне известных случаях. Если у вас есть другие данные о результативности данного подхода (на практике, а не в теории), пожалуйста приведите их - они будут говорить лучше всяких теоретических аргументов.

P.S. Интересно, пройдет ли этот коммент модерацию?

Хотелось бы уточнений

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

Второй вопрос тут будет вот какой. Я тут недавно был вынужден одному из своих коллег (то есть человеку, ведущему занятия уже несколько лет) объяснять, какой тип имеет выражение m, если его описать как

int m[10][20][30];

и почему это вовсе не int*** и тем более не int* и даже не совместимо с ними. Объяснил, конечно, хотя он мне и не сразу поверил. Но он-то программировать давно умеет, в том числе и Паскаль изучал, ему словосочетание "указатель на массив" ухо не режет, а фраза "куда по-твоему должно указывать выражение (m+1) и как этого простыми звёздочками добиться" оказалась достаточно убедительной. Вопрос вот какой: многие ли из тех студентов (тем более не слишком умных, как вы говорите), начавших обучение с Си (читай - без полноценной системы типов, и не говорите, что в Си она полноценная), не то чтоб даже знали ответ на вышеописанный вопрос, а, скажем, были хотя бы способны понять правильный ответ на этот вопрос?

P.S. Модерацию коммент, как видите, прошел.

Уточнения

Речь идет о ВУЗе областного центра, конечно до столицы нам далековато и прежде всего по качеству студентов, но в своем городе мы считаемся наиболее жестким ВУЗом с наиболее насыщенной программой (конечно, мне, как преподавателю, кажется что все распущено, но объективно сравнивая с тем что происходит в других ВУЗах города это действительно так). Направление "Информатика и вычислительная техника" естественно, бакалавриат в нашем ВУЗе во многом общий, так что и Паскаль и Си читаются на потоках всем специальностям направления (собственно, разделение по специальностям происходит на втором курсе как раз после окончания базовых курсов по программированию). На изучение Паскаля отводится один семестр (осенний первого курса), около 30 часов лекций (за вычетом других тем), 16 часов семинаров (без ЭВМ) и 16 часов лабораторных работ (на ЭВМ). Теоретически они заканчивают курс сдавая достаточно большую программу, на практике многие не могут программировать элементарных вещей после этого. Си мы начинаем изучать в весеннем семестре первого курса.

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

Я, собственно, взял паузу для того чтобы провести опрос студентов (лучших) и преподавателей по поводу вашего второго вопроса - как тех, кто учился до введения Паскаля на первом курсе, так и тех кто изучал его. Никакой корреляции между изучением Паскаля и характером ответов на вопрос я не заметил: и среди тех, и среди других встречаются как понимающие вопрос, так и не понимающие, примерно в равных долях (опрос студентов показывает, что изучая Паскаль они не слишком старались разобраться с указателями, даже наиболее умные не выходили за рамки того, что им задавали - конкретно они стали работать с ними лишь на Си, поскольку там они видели практическую целесообразность их использования). Лично для меня ключом к этому вопросу в свое время послужила передача многомерных массивов Си в функцию - тут и выяснилось, что в виде указателей так просто их не передашь, так что я полез в reference-раздел справки, 15 минут почитал про работу цепочки квадратных скобок - и все стало ясно (Паскаль не учил в учебных заведениях никогда, начинал в свое время с Бейсика на Радио-86РК/Агатах/различных компах на базе Z-80, об IBM PC в то время никто и не мечтал ни в школе, ни дома).

Учитывая этот второй вопрос, надо все-таки разобраться что мы с вами понимаем под НАЧАЛЬНЫМ обучением программированию. С моей точки зрения этот вопрос выходит далеко за его рамки. Если бы к концу первого курса все студенты были способны обработать двумерный массив (чисел или символов), создав и вызвав при этом собственную функцию, я был бы очень рад. С моей точки зрения НАЧАЛЬНОЕ обучение должно концентрироваться на алгоритмической стороне дела, а не на тонкостях языка. Паскаль с этой точки зрения смотрелся бы и лучше, если бы студенты могли продолжить дальнейшее обучение на нем. Но поскольку они не могут и идея о том чтобы к середине второго курса они самостоятельно доучили Си является утопической (с нашими студентами по крайней мере), а последующие курсы требуют знания Си - я бы остановился на Си. Насколько я наблюдаю (на экзаменах), даже лидеры групп по программированию к концу первого курса слабо ориентируются в таких понятиях как ассоциативность операций в выражении, например. Реально структуру и тонкости языка студенты начинают понимать курсе на 4-м, когда изучают трансляцию и разрабатывают собственные компиляторы - вот тут уже они начинают вникать и в тонкости системы типов, и в выражения (с реальным пониманием приоритета, ассоциативности и побочного эффекта) и прочие особенности языков программирования. Так что я бы сказал что язык начального обучения программированию второстепенен - хоть Е-практикум с его удобными исполнителями, главное чтобы до хорошего усвоения алгоритмической стороны программирования он не менялся. Когда она наступает - зависит от уровня приходящих в ВУЗ студентов, здесь у вас явное преимущество.

Вопрос о необходимости полноценной системы типов (не буду спорить по поводу Си, т.к. у нас нет определения какую систему типов считать "полноценной") для НАЧАЛЬНОГО обучения программированию остается открытым - некоторые ведущие западные ВУЗы вообще начинают с Python с его динамической типизацией, хотя я не сторонник таких крайностей. Большинство же проблем, которые вы указываете в статье либо
а) носят чисто технический характер и легко обходятся при желании - Си очень гибкий язык и его можно приспособить к любой методологии преподавания, вплоть до #define program void main(void) или int readInt(void) {int res; scanf("%d",&res); return res;} если вам так в начале удобнее (а позже, когда соответствующие темы пройдены, показать как это все устроено);
б) носят принципиальный характер и полностью обойдены быть не могут - насколько я помню, Паскаль не дает гарантии отсутствия побочных эффектов в условии, например, если используются функции.

Ну, тогда всё понятно

У нас и лекций вдвое больше (весь курс, насколько я помню, 64 часа, ну там ещё машина Тьюринга и алгоритмы Маркова, остальное - Паскаль), и семинаров - еженедельно две пары, сентябрь-октябрь это обычно занятия в аудитории, потом раз в неделю выход на машину, второй раз - аудиторное занятие, так что тоже получается семинаров 64 часа (считая и аудиторные, и машину). Понятия "лабораторной работы" у нас, к счастью, нет.

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

Если причина только в том, что какие-то там последующие курсы зачем-то требуют Си - то это повод переделать эти курсы. Не более того, но, впрочем, и не менее. А так у вас получается, что студентам один язык толком освоить не дали и уже начали переучивать на другой. Разумеется, на выходе будет каша и сумбур, и толку от такого изучения Паскаля никакого. Опереться на Паскаль в своих занятиях по Си я могу лишь благодаря тому, что студенты (после Паскаля) _действительно_ знают и понимают, что такое указатели и списки, _действительно_ умеют пользоваться var-параметрами, и т.д.

Теперь несколько мелких комментариев.

По поводу ассоциативности операций - я бы сказал, что это и не нужно. Есть некоторое количество знаний, которые нужны только создателям трансляторов. Я вот, например, всю жизнь писал и пишу на Си, а про точки гарантированных вычислений узнал только когда начал вести занятия, причём далеко не в первый год.

По поводу полноценности системы типов: простите, о чём вообще идёт речь, когда в Си нет массивов, но при этом есть указатели на массивы (именно на массивы, а не на их элементы), причём без них невозможно обойтись?

Ну а что касается мнимой (именно мнимой) гибкости Си, то превращение Си в непойми что средствами макропроцессора - это путь в никуда. Массивы-то от этого в Си не появятся. И var-параметры тоже. А begin/end или фигурные скобки - вот это как раз совершенно безразлично. Ну а ваш (и, например, стенфордский) вариант readint, не позволяющий обрабатывать ошибки ввода - это, я бы сказал, скорее уведёт студентов от правильного пути, нежели наоборот.

Не все так просто

Или начальное обучение программированию редко происходит для идеальных сферических студентов в вакууме.

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

Переделывать последующие курсы на Паскаль нереально. Это проблематично с технической точки зрения: как прикажете изучать курс "Операционные системы", например, используя Паскаль? Это абсолютно нереально с политической точки зрения: потоковый курс начального программирования обеспечивает 4 специальности факультета электроники и ВТ, ведомые тремя кафедрами, и согласовать такие изменения практически невозможно: пока мы преподаем Си основная трудность ложится на нас, поскольку дальше уже на С#/Java/PHP/etc студентам перейти гораздо проще, чем с Паскаля (к тому же одна из специальностей непосредственно связана с низкоуровневым программированием). Все-таки Си не только низкоуровневый язык, но и хорошая стартовая база для изучения многих современных языков.

Точно оценить, сколько людей становятся проф. программистами сложно (тем более границы этого термина очень размытые, особенно в провинции). Большинство из тех, кто идет впоследствии на нашу специальность (выбор специальности происходит - или происходил до следующего года - после начального обучения программированию) профессионально программировать могут (единичные исключения на группу, конечно, бывают) - никакой мистики, просто остальные после начальных курсов программирования побаиваются к нам идти. Но это только около 1/6 от общего количества студентов. Знания многих других оставляют желать лучшего - но, честно говоря, проблема там не только в отсутствии учебного времени, но и серьезном отсутствии дисциплины и мотивации к обучению.

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

Мелкие комментарии:
Честно говоря, сколько я программировал на Си, для меня (и практически всех знакомых мне программистов) указатели на массивы относятся к тому же классу, что и точки гарантированных вычислений - "нужны только создателям трансляторов". На практике никогда не применял сам, и не встречал в API операционных систем, например (как и других публичных API), так что мне совсем непонятно, почему "без них невозможно обойтись". Разобрался тоже только в процессе преподавания, и не в первый год.

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

Отзыв быдлокодера

Благодарю за статью.
Прямо экскурс в историю, когда на своей шкуре в 11 классе прочувствовал, что такое С.
Это был какой-то тихий ужас. Непонятно было абсолютно все (как мне казалось на тот момент).
Если добавить к этому отсутствие свободного доступа к компьютеру (только на занятиях и по 3 человека за машиной), то неудивительно, что меня бросало в дрожь при очередной контрольной (на листочках). При этом я очень был предрасположен к дисциплине "Информатика", но методика преподавания меня убивала. Точно не помню, кажется, на годовой контрольной списал чужой вариант, и получил натянутую 4 по предмету.
Какое-же было блаженство, когда на первом курсе нам преподавали Паскаль (тот самый знаменитый Турбо Паскаль 7.0).
Программы писались на ура. Никаких значительных затруднений при изучении языка не возникало.
Я не профессиональный программист, у меня другая специальность.
Но, применительно к своей профессии, я использую программы, написанные мной именно на Паскале (точней, сейчас уже на Дельфи).
Спасибо автору статьи, теперь я получил логическое объяснение того, что понимал на интуитивном уровне ...надцать лет назад.

Блестящее эссе!

Увы! Представление молодежи о программистской профессии сейчас формируют потоки мутных поучений «программеров-самоучек» (зайдите на любой такой форум). Очень рад, что весомое слово сказано авторитетным преподавателем авторитетного факультета. Литературный стиль замечателен, надеюсь, что это не последнее слово автора. Такие вещицы надо разбрасывать, как листовки!
Положение с программированием в школе действительно швах! Это и побудило меня приложить свои скромные силы в этом направлении (книга «Песни о Паскале» - выложена на моей личной странице).

А как насчет

А как насчет Scheme?

Scheme

В смысле "насчёт Scheme"? В качестве первого языка? Ну, я-то очень даже за, только где столько схемеров набрать, вот в чём проблема. А так -- основам алгоритмизации на нём учить можно очень даже неплохо. Да и на любом Лиспе, в сущности.

Программист без Си

"программист без знания Си вообще мог найти работу" - это конечно перебор :) Знаю многих кто работает на Delphi, на Java и на ассемблере. Очень много таких. И ничего, программируют. Delphi конечно провоцирует забить на ООП и писать абы как, но это на любом языке так можно.

Минуточку, вы читать умеете?

То есть что, они не просто "работают на чём-то там", а при этом НЕ ЗНАЮТ СИ? Вы уверены, что так бывает?

Прграммистов, которые пишут чёрт знает на чём, я и сам много знаю. Но я не знаю ни одного такого, который при этом не знал бы Си, даже если он на Си не пишет. Ну, пэхапэшники всякие не в счёт, конечно - эти вообще, как правило, ничего не знают.

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступны HTML теги: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <pre>
  • Строки и параграфы переносятся автоматически.

Подробнее о форматировании

CAPTCHA
Проверка на бота
Image CAPTCHA
Copy the characters (respecting upper/lower case) from the image.