?

Log in

Для любых вопросов

Хотите что-нибудь спросить у меня на произвольную тему? Спрашивайте! Этот пост специально для этого. Если я сочту вопрос корректным — отвечу. И даже против анонимных вопросов ничего не имею.

Вообще-то у меня есть аккаунт на formspring.me (http://www.formspring.me/xoposhiy), но, как выяснилось, он косячный :)

Теги:

В четверг 23 мая в 16:10 будет заседание кафедры информатики УрФУ, на котором мы представим план действий по нашему новому курсу ЯТП.
Мы расскажем общую концепцию, покажем план на семестр и расскажем для примера одну лекцию.

Вход свободный :)
Сбор у КИПУ в 16:10.

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

Теги:

Первая часть тут: http://xoposhiy.livejournal.com/123652.html

Итак, собрались мы и поняли, что ЯТП нужно реформировать. Собственно, как?


ЯТП — первый программистский курс на матмехе. Его задачи? На наш взгляд они такие:

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 и принять окончательное решение. Как-то так.

Теги:

z_b7d3dffc[1]
Языки и технологии программирования — это самый первый и самый базовый курс по программированию в ИМКН УрФУ. Многие студенты, поступая на специальность "Компьютерные науки" не особо умеют программировать, и цель этого курса — научить новичков и структурировать и заполнить пробелы у остальных, чтобы всякие умные вещи, рассматриваемые на следующих курсах попадали на подготовленную почву и лучше усваивались.

Главное, что должен делать самый первый программистский курс — это заинтересовать и заинтриговать студента. Так, чтобы ему хотелось научиться писать программы. А уж с заинтересованной и мотивированной публикой можно что угодно потом делать.

Между прочем, первокурсники — это бывшие школьники, у которых началась новая жизнь, без биологии и географии, с новыми загадочными предметами, с программированием! А ИМКН — это место, где круче всего учиться программировать в Екб. Мотивации у такой публики должно быть полные штаны. Надо ее попытаться не погасить, увеличить, углубить расширить и максимально продлить :-)

Так вот у ЯТП сейчас с этим конкретные проблемы.
Читать дальше...Свернуть )

Теги:

Голосование закончилось. Протокол публичный, можно самостоятельно подводить итоги!

Расшифрованный файл с протоколом я выложил сюда: https://github.com/xoposhiy/cvk2012/tree/master/protocols/protocols (файл decrypted.csv)
Как его расшифровать самостоятельно, если вы программист, можно поглядеть тут: https://github.com/xoposhiy/cvk2012/blob/master/protocols/protocols/Program.cs

Если не очень, то можете попробовать тут: https://github.com/shipilev/cvk2012-decrypt
(там же кстати много милых слов разработчикам, так затейно зашифровавшим протокол ;)

UPD: оказывается расшифрованный протокол есть тут: https://election.cvk2012.ru/

Там есть ряд артефактов, пугающих и вводящих в ступор обычных людей. О них и речь. То что известно мне:

1.
Номера кандидатов в самом протоколе отличаются от номеров в файле options.csv на единичку. В options.csv все номера на единицу больше. Это какая-то странная техническая особенность платформы. :\ Если ее не учитывать, рождаются вопросы типа вот этого из твиттера:
@xILYAVIKINGx @leonidvolkov @xoposhiy Леонид, какому протоколу верить и что делать с тем что мои голоса не совпадают на 99%?


2.
Даты в файле с протоколом американские (месяц/день/год). Если открыть этот файл в Excel (csv-файл по умолчанию открывается именно им, если стоит Office), то часть дат интерпретируется неверно: 1 октября превращается в 10 января, например. Будьте осторожны! Это уже привело к серии постов вида "А-а-а-а! Они вбрасывали телефоны в базу ещё в январе!!!" Вот, например: http://roissiavperde.livejournal.com/909236.html — осторожно по ссылкам нашизм головного мозга! Судя по количеству нашистиков в комментах, не исключено, что статьи не по глупости, а по заказу.

3.
В протоколе есть какое-то количество дублей. Они возникли во время каких-то пертурбаций на серверах в процессе защиты от DDOS. Полагаю они возникали как-то так: у площадки голосования не получалось достучаться до api, она повторяла несколько раз запрос, а api из-за какой-то рассогласованности принимала все эти запросы. Есть около 100 человек, у которых голосов более 45, но у каждого уникальных голосов не более 45 (то есть все лишние голоса — это повтор того, за что он уже голосовал). SELECT DISTINCT или uniq спасет датамайнера, если вы понимаете о чем я.

4.
В протокол не вошли люди, которые не выбрали ни одной галочки, но при этом проголосовали (нажали кнопку голосовать) хотя бы по одному списку. Это тупо недоработка SQL запроса (в написании которого даже я немножко приложился). Ох уж эти OUTER/INNER/LEFT JOIN-ы, если вы понимаете о чем я.

5.
Итоговые результаты не включают голоса принужденных МММщиков. Принужденным МММщиком называется тот, кто был зарегистрирован позже 16 октября 2012 12:00 (где-то в это время Мавроди начал блокировать личные кабинеты, принуждая регистрироваться), и при этом проголосавали точно по финальному списку Мавроди из 38 кандидатов (и возможно ещё 7 голосов от себя). Все остальные голоса учитывались. Итоги без выкидывания МММщиков подвел Ден: http://users.livejournal.com/_denplusplus_/190505.html

Независимо повторенный итоговый протокол есть тут: https://github.com/xoposhiy/cvk2012/blob/master/protocols/results.txt
UPD: Добавил в тот же файл после первого списка ещё и второй — в котором очень жестко банятся все, кто похож на МММщика (все ответы из списка Мавро и ответов больше 10 ИЛИ более 15 совпадений со списком Мавро)
UPD: Оказывается я сам при построении итогового протокола не удалял дубли! Исправил. Спасибо товарищу DroNE за внимательность.

Код, который его повторяет с учетом всех артефактов тут: https://github.com/xoposhiy/cvk2012/blob/master/protocols/protocols/Program.cs

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

Теги:

Кандидаты на выборы в координационный совет оппозиции объединяются в блоки.

Вопрос, который сегодня будет нас интересовать — насколько ответы в политическом компасе коррелируют с решением объединяться в блоки. Другими словами, на сколько важным является консенсус кандидатов внутри блока по вопросам из компаса?
Читать дальше...Свернуть )

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

Теги:

flounderflaunder

Продолжаем исследовать "рыбку" кандидатов.

Предыдущая серия
Первая серия


На этот раз я попробовал визуализировать не только близость ответов разных кандидатов, но и характер самих ответов. Забегая вперед, скажу, что получилось на мой взгляд очень круто! :-D

Корреляция ответов


Если посмотреть как коррелируют ответы на один вопрос с ответами на другой, то несложно выявить некоторую закономерность. Оказывается есть две группы вопросов такие, что:
1. Кандидаты склонны отвечать одинаково на вопросы из одной группы (положительная корреляция)
2. Кандидаты склонны отвечать противоположно на вопросы из разных групп (отрицательная корреляция)

Для тех, кому интересно, подробности про корреляцию и выделение групп можно поглядеть в Excel-файлике на гитхабе.

Я пока намеренно не буду говорить, что это за вопросы. Сначала чистая математика :)

Назовем первую группу вопросов "зеленой", а вторую "красной". Тогда можно посчитать цвет каждого кандидата так: сумма ответов (ответ — это число от -2 до 2) на все вопросы в первой группе минус сумма ответов во второй группе. Так, например, у максимально зеленого кандидата эта величина будет большой положительной (он ответит положительно на все вопросы первой группы, и отрицательно на вопросы второй), а у максимально красного — большой отрицательной. Тех, кто и не зеленый и не красный будем обозначать желтым цветом.

Теперь "рыбку" можно раскрасить!

и что же мы увидим?Свернуть )

Теги:

Теперь всё живет тут: https://github.com/xoposhiy/cvk2012.
Выложил туда все начальные и промежуточные данные, а также результат. Кода не выложил, просто потому что его нет. Все делалось в дикой комбинации shell, perl, Octave, EmEdit, Excel и Gephi. Если кто-то автоматизирует весь этот процесс — он будет супер-молодец. Но, кажется, это буду не я :)

Люди умеющие делать дата-майнинг — подключайтесь! Раздаю права и на право, и на лево, и даже националистам :)

Заняло минут 30 времени, после того, как я понял, что хочу сделать, и ещё часа два экспериментов с визуализацией в Gephi.

Дальше будут красивые, но большие картинки и таблички.

Приглашаю под катСвернуть )

Все красивые картинки можно поглядеть тут: https://github.com/xoposhiy/cvk2012/tree/master/results

Что ещё посчитать? :)

UPD: продолжение

Теги:

ЦВК 2012 и теория графов!

1. Скачиваем результаты заполненного "политического компаса" у кандидатов (119 кандидатов на момент анализа). Для каждого кандидата получаем 25-мерный вектор, координаты которого в диапазоне -2..2
2. Считаем матрицу расстояний между соответствующими векторами.
3. Рассматриваем полный взвешенный граф похожести кандидатов.
4. Оставляем топ-1000 самых сильных связей (связь тем сильнее, чем более похожи кандидаты).
5. Рисуем граф в Gephi, выделяем кластеры цветом и раскладываем граф.

Результат под катомСвернуть )

Теги:

Маленькие зарисовки с БГЕ 2012 в категории Сфинкс. Считайте это попыткой продемонстрировать ход наших мыслей. Что-то мне подсказывает, что поймут только те, кто играл :)

1.
— Какие у нас вообще есть в городе традиции?
— День города...
— Шествие РТФ...
— Нет, надо какие-то традиции с тематикой. Чтобы каждый год тематика менялась. Города побратимы там всякие, или фестивали какого-нибудь кино...
— А куда, кстати мы идем завтракать?
— Я предлагаю в мама-биг-хаус на площади 1905 года.
— ОК.
[смотрят вперед]
— Или вот [смотрит вперед, по направлению к площади 1905 года] ледовые городки строить — тоже традиция...
bingo!

...

...а тема позапрошлого детского ледового городка... Э-э-э... Вишневый сад?!? OMGWTF...

Читать дальше...Свернуть )

Теги: