Для любых вопросов
Вообще-то у меня есть аккаунт на formspring.me (http://www.formspring.me/xoposhiy), но, как выяснилось, он косячный :)
By logging in to LiveJournal using a third-party service you accept LiveJournal's User agreement
Итак, собрались мы и поняли, что ЯТП нужно реформировать. Собственно, как?
ЯТП — первый программистский курс на матмехе. Его задачи? На наш взгляд они такие:
1. Самая главная. Заинтересовать студента так, чтобы ему хотелось в этом разбираться самостоятельно, делать домашку, пробовать, экспериментировать.
2. За первый курс студенты должны написать много кода, набить руку на простых задачках, освоиться с необходимым подмножеством английского языка, научиться быстро нажимать на английские кнопки, в конце концов.
Благодаря правильно подобранным задачам, привыкнуть мыслить алгоритмически.
Благодаря общению с преподавателями практики, выработать хороший стиль кодирования.
Все это должно служить основой для следующих более сложных курсов.
3. Достигать первые две цели желательно через знакомство с основными алгоритмами, структурами данных, приемами программирования и концепциями.
Ещё раз подчеркну, в первую очередь все должно быть подчинено главной цели — заинтересовать.
Для этого мы собираемся немного перекроить программу, лучше подобрать задачи на практику, сместить кое-где акценты и реализовать ещё несколько интересных задумок. Но один из важных пунктов — поменять лектора. Без этого вряд ли что-то существенно можно изменить. Обычно это бывает так: новый лектор смотрит на текущую программу и методику преподавания свежим взглядом и решает что-то в программе переделать. Поменять лектора — вопрос сложный. В конце концов окончательное решение за заведующим кафедрой. Поэтому мы не долго думая, позвали его к себе в команду :-)
Собственно, команда
Сейчас в нашей “команде” 5 человек:
Потенциально из всей этой братии лекторами готовы быть Юрий и я. Сам бы я предпочел бы, чтобы лектором был Юрий — компетенции по преподаванию должны оставаться на людях, сильнее связанных с университетом, чем я со своим совместительством. Тем более когда речь идет о таких базовых курсах. И сейчас речь идет о том, чтобы нашу новую программу обкатать на маленьком потоке из двух групп (ФИИТ и ПИ, если это вам что-то говорит).
Язык
Итак, главная идея реформы — сделать курс интересным для студентов! И хотелось бы в первую очередь обсуждать именно это — как делать курс увлекательным, за счет чего студенты полюбят программировать и т.п. Но кажется, сейчас есть более спорный и острый вопрос во всей этой затее — на каком языке учить программировать. Хорошо, значит нужно его поскорее закрыть, чтобы приступить к главному!
Кратко — сам по себе язык не так принципиален. Есть языки проще, есть сложнее, у некоторых накоплен багаж неудачных решений, другие более стройные и удачные. Но основные строительные блоки алгоритмов у всех одинаковые. У всех есть if, while, for, массивы, типы данных. Везде есть рекурсия, везде есть возможность создавать свои структуры данных и везде некоторые структуры данных уже есть в языке. А именно со всем этим и предстоит познакомиться и интенсивно поработать студентам в рамках ЯТП. Если не брать в расчет сильно иные функциональные ЯП, то все оставшиеся, с точки зрения пригодности для курса ЯТП плюс-минус одинаковые.
Но так получилось, что два потенциальных лектора лучше всего знакомы с языком C#, поэтому почти автоматически было решено, что и курс будет разработан под этот язык. Подсознательно нам казалось это вполне удачным выбором, но оказалось, что есть много людей с другим мнением.
Мы получили порядком отзывов вида “C# — это слишком рано, нужно Си, чистый Си”.
Посмотрим на языки Си и C# с точки зрения цели “заинтересовать”.
Сразу предупрежу, что я тот ещё специалист по Си, поэтому если я где-то что-то переврал — поправьте, только чур не тыкать в меня пальцем, у-лю-люкая ;)
Плюсы Си, они же минусы C#:
1.
Си довольно простой язык, необходимое подмножество которого может легко рассказать первокурсникам так, чтобы они его поняли и освоили. Он не заставляет иметь дело с концепциями, ненужными для маленьких программок (с которыми первокурсники и будут иметь дело первый год).
В минимальном HelloWorld на C# присутствует очень много лишнего для ЯТП: классы, статические методы, пространства имен, оператор “точка”.
class Program {
static void Main(){
System.Console.WriteLine(“Hello”);
}
}
Придется как-то выкручиваться, типа “Вырастишь, поймешь”, либо придумывать какие-то очень простые объяснения. В первом приближении получается не очень красиво.
С другой стороны в Си тоже есть небанальные места в самых базовых штуках. Чего стоит scanf с его шаблонами и так рано появляющимися указателями. А если взять какую-нибудь библиотеку, то можно обнаружить общий префикс у всех функций этой библиотеки — по сути эмуляция пространств имен, отсутствующих в языке.
2.
Си демонстрирует работу с железом без всяких там дополнительных уровней абстракции. Работа с памятью — без сборщика мусора. Работа с процессором — без виртуальной машины.
Я честно говоря не очень понимаю как конкретно студента отдаляет от железа сборщик мусора и виртуальная машина. Ассемблерный код не посмотреть? Так они ж ещё и не знают ассемблера. GC непредсказуемо замедляет программу? Так по честному и malloc непредсказуемо замедляет.
А слова про сложность алгоритма, про количество инструкций и т.п. абсолютно необходимо говорить в любом случае.
Кроме того, дальше в программе существуют курсы АСВТ и Ассемблер, задача которых как раз заполнить разрыв между языками высокого уровня и железом. Кажется более логичным немного разгрузить начальный курс от нижнего уровня и строже требовать этого от специализированных курсов. Скажем, не говорить ни про ассемблер, ни про кэши и регистры в ЯТП, ограничившись лишь интуитивным пониманием того, что является константной операцией для процессора, а что нет.
3.
Люди ссылаются на статью Joel Spolsky (http://www.joelonsoftware.com/articles/ThePerilsofJavaSchools.html) , который жалуется, как упало качество выпускников, когда Си заменили на Java. В общем-то статья вовсе не про превосходство Си над Java, а про то, что вместе с заменой языка несколько очень сложных и фундаментальных тем пропали, будучи замененными на более простые и менее строгие около ООПшные темы. Вместо тонкостей работы памяти, студентов начали учить инкапсуляции и полиморфизму. В этом ключе, я с автором вполне согласен — такого просто нужно не допускать, только языки тут не при чем. И рекурсия, и понимание того, как работает память должны у студентов остаться. И обязательно будет соответствующая лекция в курсе на C# про работу памяти.
Другое дело, что в Си память работает несколько иначе, чем в C# и других языках высокого уровня и это разнообразие немного жалко и немного страшно терять.
Есть ещё несколько крайне спорных аргументы за Си:
“4.”
Есть мнение, что если сначала выучить язык высокого уровня, вроде Python или C#, то потом очень сложно заставить человека выучить местами более корявый (легаси же!) Си. Внятных мыслей и аргументов про этот пункт у меня нет. Я вообще не уверен, что это правда, но аргумент такой пару раз слышал от разных людей. Я бы на такие высказывания внимния не обращал.
“5.”
Есть мнение, что убрав Си мы погубим АСМ. Нет, это не так. На локальных соревнованиях есть C# и ещё куча других языков. А на глобальные соревнования едут такие люди, которые вполне способны выучить Си без всякого там ЯТП.
“6.”
Есть мнение, что отсутствие в языке строгих проверок воспитывает в студентах аккуратность и развивает самоконтроль. В эту ерунду я никогда не поверю. Если язык будет карать студентов за неаккуратность многочасовой отладкой, он будет порождать только одно — ненависть к программированию и к этому языку в частности.
Минусы Си, они же плюсы C#
1.
В Си из коробки нет нормальных строк. В результате в банальных подзадачах приходится задаваться “низкоуровневыми” вопросами: сколько памяти выделить, как проконтролировать, что ее хватит. А что если неизвестно заранее, сколько нужно? Как бы вычислить длину строки за константу по времени? Не использовать ли Pascal-строки вместо ASCIIZ?
Во всех нормальных языках уже давно есть встроенный тип данных “строка”. В C# они вполне себе канонически реализованные. Исходники строки в C# доступны, их можно поизучать, а на лекциях можно и нужно разобрать то, как они устроены внутри.
2.
В Си в принципе сложнее работать с памятью. Если мы говорим про чистый Си, то (поправьте меня, если я ошибаюсь) никаких ссылок там нет, но ряд неприятных моментов остается. Трудно отлаживать выход за границы памяти. Нужно учиться дисциплине ручного освобождения памяти, не возвращать из функций указателей на стек и т.п. Это в общем не плохо, просто я очень не уверен, что на первом курсе можно научить чему-то осмысленному в этой дисциплине. Надо бы на алгоритмах и структурах данных сосредоточится, а тут ошибки с управлением памятью...
3.
В Си нет нормального типа bool. (Точнее есть, но костыль). Это просто плохой изначальный дизайн языка Си. То, что это плохо и почему плохо придется рассказать студентам, то как обычно устроены правильные языка рассказать тоже нужно. Но когда ругаешь изучаемый язык, это не очень способствует поддержанию интереса к нему.
4.
IDE. Диагностические сообщения компилятора у C# несколько лучше Си. Учитывая, что для многих это первый опыт программирования, факт важный. Аналогично с Intellisense в Visual Studio. Полезная для освоения стандартных библиотек возможность — “переход к определению” в Си часто дает шокирующий результат для неподготовленного читателя:
__DEFINE_CPP_OVERLOAD_STANDARD_FUNC_0_1(char *, __RETURN_POLICY_DST, __EMPTY_DECLSPEC, strcat, _Inout_updates_z_(_String_length_(_Dest) + _String_length_(_Source) + 1), char, _Dest, _In_z_ const char *, _Source)
В библиотеках C# тоже достаточно тяжелого для понимания кода, но все же даже близко не на столько!
5.
Отсутствие стандартной библиотеки контейнеров. Списки, строки, стеки, деревья, ... Всего этого, на сколько я понимаю, в чистом Си из коробки просто нет, в то время как во всех современных языках — это обязательная составляющая.
6.
Кажется, C# более... discoverable. Понятно как для него объяснить студентам общий “алгоритм” поиска нужных функций: поставить после объекта точечку и изучить подсказку intellisense — очень естественное действие. Как находить то, про что ты ещё пока не знаешь в Си, кроме как с помощью гугла? В ту же копилку - более понятные имена методов в C#. Никаких fscanf и strcpy и прочих шифровок.
Кто что ещё может дополнить?
Итог
Скажем прямо, все эти минусы Си можно преодолеть, перетерпеть и снизить их негативное влияние теми или иными педагогическими приемами. Но я хочу вспомнить постановку задачи: у нас есть два потенциальных лектора, хорошо знающих C#, и крайне поверхностно Си. Вот мы увидели, что у языка Си как первого языка программирования есть своя нехилая такая пачка недостатков. И вот сейчас ещё раз вопрос, вы действительно считаете, что нужно упереться и все же делать ЯТП на Си? Чтобы его вели люди не имеющие опыта обращения с языком? Точно?
А ещё я вот совсем не уверен, что мы возьмемся за разработку курса на Си. Все же на мой взгляд это должны делать люди, имеющие на нем достаточную промышленную практику. Да и наша вера в то, что С# — это чуть более правильный выбор, чем Си тоже никуда не делась.
И вот вам ещё один вопрос. Вы готовы настаивать на том, чтобы ЯТП был именно на Си, даже если после этого наш коллектив свернет все работы и по факту отложит реформу ЯТП минимум на год? Точно? Или может быть вы готовы сами взяться за это дело, прорабатывать новый курс, тратя на это десятки часов своей жизни, общаться с кучей народу согласовывая детали, решать политические вопросы? Да? Ну, тогда я на вас очень зол за то, что вы почему-то этого не делали ранее!
Что дальше?
Прямо сейчас мы немного приостановили обсуждение курса по разным личным причинам и планируем вернутся к теме через 1-2 недели.
Мы планировали вынести на обсуждение тему С# сначала виртуально, а через некоторое время встретиться лично со всеми активными участниками, чтобы расставить точки над i и принять окончательное решение. Как-то так.
@xILYAVIKINGx @leonidvolkov @xoposhiy Леонид, какому протоколу верить и что делать с тем что мои голоса не совпадают на 99%?
![]() | ![]() |