LINUX.ORG.RU

Студенты пишут быдлокод (им это сходит с рук)

 , , , ,


3

3

Лор овцы, среди вас кто-нибудь преподавал будущим программистам? Допустимо ли ставить оценки за стиль и аккуратность кода? А вам самим в универе ставили?

А то домашние задания херачат как кот на клавиатуре повалялся. Функции на 5 экранов, переменные с названиями x, y, tmp1, tmp2, ошибки не проверяются. Некоторые даже отступы до сих пор для себя не открыли, так и фигачат. Сейчас это всё никак не оценивается: работы проверяются автоматической системой, скомпилялось, тесты прошли - домашка зачтена. Хочу им слегка повправить кое-че. Допустимо ли туда прикрутить стайл-чекер какой-нибудь? Какие есть разумные статические чекеры для C, C++, C#, Java и Pascal (сейчас разрешается любой из этих языков по выбору)? Как вообще оценивать общую адекватность кода - например, чтобы студент не срал временными файлами под себя, а аккуратно создал временный каталог через mkdtemp? Или всякие подводные грабли в плюсах: например, есть деструктор, но нет копирующего конструктора и оператора =. И тысячи подобного. Какой-нибудь софт умеет на такое ругаться?

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

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

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

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

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

AIv ★★★★★
()

в математике принято соращать и упрощать выражения

осообенно красивы методы неопределенных коэфф деление на многочлен функция комплексного переменного разреженные матрицы дифф геометрия белева алгебра численные методы теория чисел меры типа Лебега работы Ньютона Галуа Гаусса Эйлера Пуанкаре и тд

В математике быдлокод наблюдается в школьных учебниках

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

Я к тому клоню, что переменные в стиле x, y, z, a1, a2, a3, a4, b1, b2 ... не годятся во многих ЯП

Есть такие, но на них либо уже ничего не пишут, вроде старых бейсиков где нужно нумеровать строчки кода. Либо пишут мало или говнецо - это bash, m4, с/c++ препроцессор и прочий им подобный крап. Что у них плохого - один единственный, глобальный, неймспейс или культура кодинга с использованием глобального неймспейса.

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

как думаешь, почему от машинных кодов ушли к ассемблеру?

Не уходили, фактически всегда был какой-то аналог ассемблера.

Переменные вида a1, a2, a3 и т.д. не понятны, т.к. на больших и длинных алгоритмах, который нельзя полностью хранить в голове постоянно приходится вспоминать, а что же я храню в переменной а12?

Большой алгоритм не означает что его реализация тоже должна быть в виде одного большого монолитного куска гогна кода. Практически любой алгоритм в современных ЯП можно резать на небольшие логические части и часто даже с zero cost. Запутаться внутри такой небольшой ф-ий на десяток строчек трудно даже если использовать имена вроде aN.

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

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

Point dropPos = calculateDropPosition(throwForce, throwStartPoint, groundLevel);

Это избыточный символьный мусор на разбор которого мозг тратит энергию и время. Чем больше «внимания» тратится на мусор тем меньше его остаётся на саму суть.

Хорошо по этому поводу написано в «Linux kernel coding style»:

LOCAL variable names should be short, and to the point... If you are afraid to mix up your local variable names, you have another problem, which is called the function-growth-hormone-imbalance syndrome. See chapter 6 (Functions).

Functions should be short and sweet, and do just one thing. They should fit on one or two screenfuls of text (the ISO/ANSI screen size is 80x24, as we all know), and do one thing and do that well.

Another measure of the function is the number of local variables. They shouldn't exceed 5-10, or you're doing something wrong. Re-think the function, and split it into smaller pieces. A human brain can generally easily keep track of about 7 different things, anything more and it gets confused.

mashina ★★★★★
()

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

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

Иногда через чур.

Убивать. Убивать. Убивать. Убивать. Убивать. Убивать. Убивать. Убивать. Убивать. Убивать. Убивать. Убивать. Убивать. Убивать. Убивать. Убивать. Убивать. Убивать. Убивать. Убивать. Убивать. Убивать. Убивать. Убивать. Убивать. Убивать. Убивать. Убивать.

Выучи русский язык. Выучи русский язык. Выучи русский язык. Выучи русский язык. Выучи русский язык. Выучи русский язык. Выучи русский язык. Выучи русский язык. Выучи русский язык. Выучи русский язык. Выучи русский язык. Выучи русский язык. Выучи русский язык. Выучи русский язык. Выучи русский язык. Выучи русский язык. Выучи русский язык. Выучи русский язык. Выучи русский язык. Выучи русский язык. Выучи русский язык. Выучи русский язык. Выучи русский язык. Выучи русский язык. Выучи русский язык. Выучи русский язык. Выучи русский язык. Выучи русский язык. Выучи русский язык. Выучи русский язык. Выучи русский язык. Выучи русский язык. Выучи русский язык. Выучи русский язык. Выучи русский язык. Выучи русский язык. Выучи русский язык. Выучи русский язык. Выучи русский язык. Выучи русский язык. Выучи русский язык. Выучи русский язык. Выучи русский язык. Выучи русский язык. Выучи русский язык. Выучи русский язык. Выучи русский язык. Выучи русский язык. Выучи русский язык.

Eddy_Em ☆☆☆☆☆
()

У нас на курсе по Java преподаватель использовал автоматическую систему тестов, которая проверяла и стиль, однако быдлокод был в большом количестве тк не проверялся

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

Ах вот в чем дело...

Один мой одногруппник не разделял пробелами ничего в своих программах (писали на С++). Да и на новую строку он переходил только когда предыдущая заканчивалась. Код его, и вид его кодящего был совершенно фееричен...

Вот не знаю, стал ли он программистом;-)

AIv ★★★★★
()

Видел у своих одногруппников отступы в коде «в обратную сторону».

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

Либо пишут мало или говнецо - это bash, m4, с/c++ препроцессор и прочий им подобный крап. Что у них плохого - один единственный, глобальный, неймспейс или культура кодинга с использованием глобального неймспейса.

Автору известен подход чем заменить например глобльный нейм баша на баш с пространствами имен? Питон пытались пропихнуть как ооп замену перлу и шельным процессорам. Разве не?

Если не хватает текущих воможностей, скорее всего что то делается не так.

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

Ахтунг, С-сласмисты в трэде!;-)

ЗЫ. Навеяло - Никлас Вирт приехал в Италию и спросил - «любите ли вы паскаль?» - «Си, сеньор!» сказали итальянцы. Вирт обиделся и больше в Италию не ездил...

AIv ★★★★★
()
Последнее исправление: AIv (всего исправлений: 1)
Ответ на: комментарий от AIv

И поделом паскуалию. А вообще, я не понимаю, зачем такой зоопарк ЯПов напридумывали: на сях можно сделать абсолютно все! Зачем еще ЯПы?

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

Вот не знаю, стал ли он программистом;-)

Очевидно, он стал грузчиком. Его талант в идеальной упаковке.

rupert ★★★★★
()

надо давать такие задания

написать реализацию hello world на языках которые понравились или понятны знакомы интересны проще

задания номер два написать известные концепции и парадигмы в терминах hello world

например хэлло в терминах интерфейсов и апи

допускаются решения типа emerge world ;) тоже хелло своего рода

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

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

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

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

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

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

Есть утверждение, что любую задачу можно решить на любом ЯП;-)

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

Очевидно, он стал грузчиком. Его талант в идеальной упаковке.

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

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

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

Зачем еще ЯПы?

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

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

Сам учи по учебникам 18-го века. А в современном русском языке за такое написание надо убивать, убивать, убивать, убивать, убивать.

anonymous
()

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

goroskob
()

Скажу так. Учусь на втором курсе универа.

У меня дикая попаболь по поводу того, как мои однокурсники пишут код. И как они его распространяют. Потому что они не понимают, что такое indentation. Вместо того, чтобы использовать github, который дает офигенные плюшки для студентов, они используют ВК, причем копируют код прямо в окно чата (УБИВААААТЬ!!!!). Они не используют в большинстве случаев заголовочные файлы... когда, скажем, нужно написать программу, которая выделяет числа из строки, кто-то пишет «src[0] > 48» и все в таком духе. Ужасно. Все ужасно...

p.s. зато я неосилятор математики (сложной)

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

При чём тут гениальность?

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

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

Не уходили, фактически всегда был какой-то аналог ассемблера.

А когда-то давным давно даже ассемблера не было.

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

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

this_is_my_very_useful_variable
Но у студентов, которым лень жать на клавиши, как я помню другая проблема, все переменные и иногда даже функции они стараются называть используя 1 или 2 символа. твой пример
Point dropPos = calculateDropPosition(throwForce, throwStartPoint, groundLevel);
Надо переделать так:
Point dropPos = calcDropPos(throwForce, throwStartPoint, groundLevel);
Может даже короче, заменив throwStartPoint на throwStart, а groundLevel на level, зависит от ситуации и того смысла, который ты вкладываешь в функцию.

Либо пишут мало или говнецо - это ... с/c++

Это на c пишут мало и говнецо? Вот на всяких lisp/rust/vala/erlang пишут мало, а на perl - говнецо (один однострочник чего стоит ;) ). У C нет адекватной и более хорошей замены в занимаемой нише. Хочешь - дерзай и делай новый велосипед, но предупреждаю, что C самый популярный язык программирования.

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

А на ASM-е можно сделать всё что на C и даже лучше. Зачем придумали C? Да затем, что С более высокоуровневый ЯП и писать на нём проще, также как и на каком-нибудь питоне писать проще, чем на C. Но за всё надо платить, да, вот и платят производительностью.

peregrine ★★★★★
()

те кто не может оформлять код и пусть пишут на mk61 Бз 34 ;)

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

Indent with tabs, align with spaces — это идиотский метод форматирования кода.

у тебя опечатка. Поправил. Или-или, по-другому никак.

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

надо чтобы стыдно было за быдлокод

А Линусу стыдно не было, когда его раскритиковал Таненбауэм, назвав троешником. Неужели простым погромистам будет стыдно?)

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

у тебя опечатка. Поправил. Или-или, по-другому никак.

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

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

Обоснуй.

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

Если и отступать, и выравнивать табами, перестаёт выполняться второе свойство (привет, код ядра).

Если и отступать, и выравнивать пробелами, перестаёт выполняться первое свойство (привет, грёбаные отступы двумя пробелами).

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 4)

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

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

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

профессор был сам изощренным быдлокодером и он испугался что это поймут другие а нападение как известно лучший способ защиты в неайкидо школах ;)

x что бы не было стыдно нужна идея фикс не без исключений конечно вышесказанное

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

неразличимых для человека символов

Так а на что нам редакторы? Кейт умеет выделять табы, а гит по дефолту предупреждает (можно научить reject-ить), если табы и пробелы перемешаны.

Согласен — минус есть — но устранимый.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от PolarFox

Почему? Инструменты как бы для того и существуют, чтобы упрощать человеку жизнь... И ещё, я исхожу из того, что код в основном «write once, read/fix many», поэтому вроде как усложнить написание, чтобы упростить чтение и правки — разумно.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от intelfx

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

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

Пробел-онли стандарты <...> в основном 4 пробела

Если бы... :) См. kdevelop

Таб-онли стандарты регламентируют не использование «точных» выравниваний

См. код ядра

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

Таки в чём проблема её запилить (путём замены редактора, если потребуется)?

Впрочем, я понял твой пойнт.

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

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

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

выравнивание пробелами отнимает слишком много внимания

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

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

Ограничение в 80 (или сколько-то там) столбцов никто не отменял. И опять же — при любом способе выравнивания будет одинаковый результат.

В общем, насколько я понял, ты против любого выравнивания, а не конкретно «align with tabs, indent with spaces»? Тогда мы друг друга недопоняли. Так-то каждый волен использовать тот стиль, который ему нравится.

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

выравнивание пробелами отнимает слишком много внимания.

Бедный. Попробуй сосредоточится на алгоритмах. А выравнивание сделает indent

ziemin ★★
()

Лор овцы, среди вас кто-нибудь преподавал будущим программистам?

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

Допустимо ли ставить оценки за стиль и аккуратность кода?

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

А вам самим в универе ставили?

Нет.

А то домашние задания херачат как кот на клавиатуре повалялся.

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

Функции на 5 экранов, переменные с названиями x, y, tmp1, tmp2

Функции могут быть на пять экранов. Если в задаче есть икс, то и в программе должен быть. А если переменная нужна на пять минут, чтобы вот тут в трёх строчках её заюзать — почему не назвать её tmp? Хотя если у вас там Си или Паскаль, всё, конечно, веселее. Я свои переменные комментировал.

ошибки не проверяются

Совсем?

Сейчас это всё никак не оценивается: работы проверяются автоматической системой, скомпилялось, тесты прошли - домашка зачтена.

А препод-то на что? Лел, я этого вообще не понимаю. Автоматическая система оценивает конкретную работу, а не навыки человека. А его навыки — в его коде. Наши программы преподы проверяли стоя над душой, саморучно вбивая и тестовые и рандомные данные. Если что-то не работает, открывали код, смотрели, на сдаче ничего не подсказывали.

Хочу им слегка повправить кое-че.

А ты кто ваще?

Допустимо ли туда прикрутить стайл-чекер какой-нибудь?

Нет. У них разовьётся представление, что это стандарт/закон/правило и во всех языках надо писать ВОТ ТАК. Майкрософт в своё время, чтобы приучить офисников к VB сделала там автоформатирование, это уродство у меня до сих пор перед глазами стоит. Я вотпрямщас пишу и всё ещё вижу эти табы на полэкрана, определения функций через одно место и пляску красных точек поперёк жёлтых полос.

Какие есть разумные статические чекеры для C, C++, C#, Java и Pascal (сейчас разрешается любой из этих языков по выбору)?
разрешается любой из этих языков по выбору

ШТОААА? Это ж блядь у семи нянек дитя без глазу.

Как вообще оценивать общую адекватность кода

Гм. Если пропустить филосовские предпосылки, то я скажу, что её не оценивать надо (это ничего, кроме самой оценки не даёт), а повышать.

например, чтобы студент не срал временными файлами под себя

Запрети их. Временные файлы — вообще зло. Научи их лучше grep, sed и awk.

Или всякие подводные грабли в плюсах

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

А собственно стиль кодирования допустимо наавязывать студентам?

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

Или это всё эстетство

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

а студентов просто готовят к реальному миру и суровому энтерпрайз-быдлокодингу?

Судя по тому, что я прочитал, их готовят получить бумажку.

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