LINUX.ORG.RU

[C][образование] Нужна критика программы курса про Си

 ,


3

3

Хотелось бы увидеть желающих предметно покритиковать программу курса про Си для профильной специальности.

Рабочая версия программы: http://dev.iu7.bmstu.ru/trac/workbook_c_iu7/wiki/plan

Особенно интересует мнение по: http://dev.iu7.bmstu.ru/trac/workbook_c_iu7/wiki/plan#Лабораторныеработы

★★★★★

Ответ на: комментарий от DeVliegendeHollander

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

Картина маслом: «обезьяна с гранатой».

Manhunt ★★★★★
()
Ответ на: комментарий от sv75

XCB/Xlib бери.

Это несколько муторно в случаи винды.

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

anonymous
()
Ответ на: комментарий от siberean

Тогда, видимо, аналогичная книжка. Хотя по приметам похожа: и раздел об использовании getopt_long() с примером кода, и пример кода диспетчера динамической памяти в приложении, да и вообще - я много полезного в ней прочёл в своё время.

DeVliegendeHollander ★★
()
Ответ на: комментарий от Manhunt

Это не специфицировано. Где компилятор захочет, там и хранит.

Это что же - в каких-то компиляторах я могу вместо «stack overflow» получить «heap overflow» чтоли?

нет, стэк функции есть _стэк_ функции

siberean
()

Заставь их программировать микроконтроллеры на С - вот где хардкор. Тут и про выравнивание по адресам вспомнят и bit sets понадобятся )

LongLiveUbuntu ★★★★★
()
Ответ на: комментарий от Manhunt

Я не буквоед, к буквам не придираюсь. Приду, посмотрю в K&R, там скорее всего есть. И в других книгах скорее всего есть. По-крайней мере по Таненбауму, по которому нас учили - точно есть.

siberean
()
Ответ на: комментарий от siberean

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

Ненавижу этот язык почти так же сильно, как с++.

Manhunt ★★★★★
()
Ответ на: комментарий от siberean

Приду, посмотрю в K&R

Можешь им подтереться.

Manhunt ★★★★★
()
Ответ на: комментарий от Manhunt

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

Ненавижу этот язык почти так же сильно, как с++.

Ненавидь дальше. А код, написанный на си, продолжает работать, не подозревая о наличии Manhunt'а. (И как частный пример: мой скромный код, написанный много лет назад - как мне говорили, ещё работает, и тоже не знает о твоих проблемах)

siberean
()
Ответ на: комментарий от quantum-troll

Оберон специфичен и малоизвестен, я перечислил достаточно распространённые ЯП.

Думаешь, схема распространена сильнее оберона? :)

Manhunt ★★★★★
()
Ответ на: комментарий от siberean

А код, написанный на си, продолжает работать, не подозревая о наличии Manhunt'а.

Золотые слова. Присоединюсь, пожалуй.

DeVliegendeHollander ★★
()
Ответ на: комментарий от siberean

А код, написанный на си, продолжает работать, не подозревая о наличии Manhunt'а.

Пафосно. Я очень хотел бы, чтобы говнокод, написанный простачками много лет назад, всегда работал на новых компиляторах и не требовал с моей стороны шаманств с опциями сборки. Увы, it's not the case.

Manhunt ★★★★★
()
Ответ на: комментарий от Manhunt

Она определённо более известна, чем оберон, хотя бы из-за MIT с его SICP.

quantum-troll ★★★★★
()
Ответ на: комментарий от Eddy_Em

Какой же там хардкор? Хардкор - контроллеры на ассемблере программировать...

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

Говорят, настоящие программисты загрузчики и программы наизусть в цифрах знали. У меня матушка сама перфокарты побитово пробивала, правда это уже алгол68 с фортраном были, т.е. уже быдлопрограммисты, по сравнению с теми, первыми.

siberean
()
Ответ на: комментарий от Manhunt

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

anonymous
()
Ответ на: комментарий от siberean

Говорят, настоящие программисты загрузчики и программы наизусть в цифрах знали.

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

DeVliegendeHollander ★★
()
Ответ на: комментарий от DeVliegendeHollander

Товарищ с ереванского завода-изготовителя

с того самого завода, который в те ещё времена выпустил машину-анекдот с более 100 регистрами ?

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

Возможно. Я про это почти ничего не знаю (кажется, что-то про это ес-ники упоминали), поскольку не в ЕС-подразделении работал, а в том, где «Электроники» (которые СМ, они же PDP) были основным «оружием». А на «уникального товарища» мы пришли из чистого любопытства поглазеть. :)

DeVliegendeHollander ★★
()
Ответ на: комментарий от DeVliegendeHollander

Тогда, видимо, аналогичная книжка. Хотя по приметам похожа: и раздел об использовании getopt_long() с примером кода, и пример кода диспетчера динамической памяти в приложении, да и вообще - я много полезного в ней прочёл в своё время.

Arnold Robbins. «Linux. Programming by Example».

siberean
()
Ответ на: комментарий от anonymous

Многопоточность точно не сюда (до поддержки всеми С11 threads.h, как минимум), пункт 7 опасен (у нас все под расширениями С понимаю С++ и managed C++), IDE с отладчиком — это будет родовая травма (впрочем, они её уже получили ранее).

SVN и Trac у нас уже изучены до начала курса. Остальное почти всё есть.

sv75 ★★★★★
() автор топика
Ответ на: комментарий от LongLiveUbuntu

Заставь их программировать микроконтроллеры на С - вот где хардкор.

Это есть в другом курсе, позже.

sv75 ★★★★★
() автор топика
Ответ на: комментарий от Manhunt

Давай, найти тут слово «stack»:

Поэтому у меня есть пункт, что стандарты рассчитаны на совсем абстрактную ЭВМ ))

sv75 ★★★★★
() автор топика
Ответ на: комментарий от anonymous

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

Вот боюсь п. 1 и п. 2 не очень совместны.

sv75 ★★★★★
() автор топика
Ответ на: комментарий от siberean

Нас муштровали с пойнтерами так, что были задачки типа «пойнтер на функцию, возращающую пойнтер на функцию, принимающую пойнтер ... возвращающую ...» (и так построки исписаны) и надо было эти синтетические примеры правильно парсить.

У меня есть ощущение, что это, возможно, мастурбация. Хороший код на Си должен быть понятен.

sv75 ★★★★★
() автор топика
Ответ на: комментарий от anonymous

#define list_entry(ptr, type, member) ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))

Я кстати не понял, что это. Если это offsetof, то почему он с минусом и не канонический?

sv75 ★★★★★
() автор топика
Ответ на: комментарий от sv75

Да, фактически это смещение, взятое в обратную сторону. Напомню, что оно нужно для упрощения работы со списками: в юзерской структуре указатели *prev, *next хранятся не напрямую, а спрятаны в стандартизированную подструктуру hlist_node, по которой и идет поиск. А макрос нужен для вычленения адреса самого элемента по найденному hlist_node.

По ссылке говорят, что списки в ядре сделаны именно так, в свое время не было причин не верить. Правда, как теперь оказалось, сейчас на месте этого макроса сидит container_of, с той же идеей, но с более ясной реализацией, как раз через offsetof.

Как ни удивительно, но ровно этот же пример с container_of дан на странице http://en.wikipedia.org/wiki/Offsetof .

anonymous
()
Ответ на: комментарий от sv75

почти все есть.

Одно из двух. Или у вас действительно умные студенты и преподаватели, или же в наличии учебная промашка. Если есть все, и оно рассказано подробно, то получается очень немаленький объем. А вот если студенты не светочи, и курс рассказывается в общих чертах, то все не так радужно: базовую инфу студент может и из K&R или гугла выудить, а вот за тонкостями придется ходить в темноте по граблям : пока по лбу не стукнет, смекалка не сработает. Потому и за IDE агитирую – меньше обслуживающих движений, дальше полет мысли по основному курсу. Тем более, если народ уже травмировался.

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

Так что стоит подумать, нельзя ли по максимуму урезать все, не относящееся к низкому уровню, программированию и отладке. Например, выкинуть стандарты, CLI, проектную работу, переносимость. И в освободившееся время рассказать о набитых неочевидных шишках, и, если уж придется к слову, мельком упоминать, что мол, есть такая вещь, как стандарт, в курсе мы на него забили, но вот на практике вылезли вот такие косяки:…

В общем, практика, практика, и еще раз Арктика.

anonymous
()
Ответ на: комментарий от Eddy_Em

латех можно начать изучать с Львовского и Балдина

Вот с Балдина не надо. Если у Львовского последовательно и с разложением по пополочкам, то Балдин пишет в стиле: взял такую фенечку; повтыкал, повтыкал - не понравилось, фтопку ее, но можете потыкать еще. И так про все пакеты на CTAN...

anonymous
()
Ответ на: комментарий от anonymous

Ну так Львовский - основа, а Балдин - мини-введение по пакетам.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от hibou

Это после школы сразу вот с этого начинать? С регистров процессора и MMU? Детей пожалей, блин! У них только вчера слово Божие закончилось.

- в мемориз

mio ★★
()
Ответ на: комментарий от sv75

У меня есть ощущение, что это, возможно, мастурбация. Хороший код на Си должен быть понятен.

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

siberean
()
Ответ на: комментарий от sv75

Это не мастурбация, такое и на практике встречается. Видел я typedef'ы, похожие на процитированную выше фразу, которые приводили меня в восторг. :)

DeVliegendeHollander ★★
()
Ответ на: комментарий от anonymous

Ох, я забыл простые вещи.

sv75 ★★★★★
() автор топика
Ответ на: комментарий от siberean

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

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

sv75 ★★★★★
() автор топика
Ответ на: комментарий от sv75

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

Во-первых, надо всё уметь - если написано что закончил курс Си. Нас учили и как отлаживать (это уже на практике было), дебаггер был gdb, только хардкор, но можно было пользоваться и графическим дебаггером (Борланд C 2.0 в то время, на дискетах), что и делали.

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

siberean
()
Ответ на: комментарий от unsigned

А, я уже привыr к queue.h, где обошлись без containerof.

sv75 ★★★★★
() автор топика
Ответ на: комментарий от siberean

Ну нас тоже учили сразу пользоваться отладчиклм. Итог --- игнорирование мною модульного тестирования следующие лет 10.

sv75 ★★★★★
() автор топика
Ответ на: комментарий от siberean

А поддерживать кто будет?

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

Я участовал в очень большом и старом проекте на Си. Возможно мне повезло, но ничего ужаснее «#define x (p->y->z)» я там не припомню.

sv75 ★★★★★
() автор топика
Ответ на: комментарий от Eddy_Em

Та ну хватит этого жиробаса кормить!

gear ★★★
()

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

после частичного изучения Concepts Techniques and Models of Computer Programming, основной вопрос такой, на примере какой математической модели будет рассказываться семантика языка Си?

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

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

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

dimon555 ★★★★★
()
Ответ на: комментарий от dimon555

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

sv75 ★★★★★
() автор топика
12 августа 2012 г.

Симпатично. Жаль, что я уже закончил. Не многовато для одного семестра? На два было бы проще.

gadfly ★★
()

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

Советы нижеследуют:

Переместить весь препроцессор в пункт:

Препроцессор: «в нашем языке почти ничего нет, но вы можете генерировать файлы на нашем языке».

Он достаточно компактен, чтобы его можно было охватить весь примерно за 10±5 мин, но существенен для дальнешего обучения.

Пункт «Объектные и исполняемые файлы. Библиотеки» - убрать, про образ процесса и прочее - самый минимум. На всё это в нормальном объёме не хватит времени, и вообще оно должно идти в курсе по ОСам.

Пункт «история/стандарты» - с него лучше начать как с обзороного, заодно подготовить народ к многообразию компиляторов и сред выполнения. Тем более, если они пребывали в блаженном царстве паскаледельфей.

Не вижу пунка про двоичную арифметику. Если раскрыт на паскале, то ок, но если не - проклясть препода паскаля и раскрыть в «типах данных». Я про арифметику с плавающей точкой в первую очередь.

Почему в Си обычно не используют typedef для структур.

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

Лабы.

Без календарного плана не понятно, как они соотносятся с лекциями/семинарами. Видно, что списки/строки/массивы идут последними в перечне, тогда как в плане лекций/семинаров они (как и должны) идут сначала.

ГТК и прочее - убрать, требует хорошего понимания контекста, и всё равно не хватит времени.

Инфраструктура.

Под венду есть Code::Blocks, Codelite и Pelle's C - первые два имеют готовые сборки с mingw, последние два (про Code::Blocks - не знаю) генерируют и опираются во время сборки на make-файлы. Все три реализуют С99/С11 в достаточном объёме для обучения, так что загонять студентоту палкой на убунту с geany реальной нужды нет. Ну и гуёвые отладчики им совсем не помешают.

LamerOk ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.