Pull to refresh

Comments 117

В баню такое «программирование», чтобы для других это было загадкой. (да еще языковая проблематика)
По «человечески» надо писать код, чтобы всем понятно было.
Правильно, чтобы самому не гадать, нужно ставить скобки везде, где может быть двусмысленность даже теоретически. Ведь язык может со временем измениться.
В данном случае даже со скобками — кривой код. Тернарный оператор больше одного раза в одном выражении принципиально не использую. По нормальному (в моём понимании) надо развернуть в if-else.
Это с учётом практики. Вместо true-false тоже ведь подвыражения будут.
Подписываюсь под каждым словом. И еще я вообще не понимаю, нахрена, даже при приеме на работу, себе и людям забивать голову такой пургой, далекой от нормальной практики.
Как был бы я рад, если бы похожих строк я не видел в исходниках. Хотя я видел их не так уж и много.
Возможно, кто-то и пишет такой код. Но тестирование адекватности разработчика через необходимость разбираться в говнокоде — думаю, не лучший способ представить его будущую производительность. Хотя, если компания априори нацелена на то, что у них там будет что-то подобное и это надо поддерживать… я бы поостерегся на месте разработчиков.
Специалист не должен мусорить, но разгребать мусор в нужной области он обязан уметь.
мне почему-то думалось что код надо писать оптимально для данного языка программирования, а не для того чтобы «всем» было понятно. конечно, с соблюдением сопутствующей языку правилами оформления читабельного кода для сведающего в теме программиста.
поддержываю)

когда-то написан хабрачеловеком AirWorker такой топик:
habrahabr.ru/blogs/php/22881/
вывод: не нужно страдать лишним вместо того, чтоб писать продуктивно.
Руки отрывать надо работодателям, которые дают такие тесты. А так же тесты вроде «каков результат выполнения такой программы в PHP версии 4 под Windows» и далее страница такого говнокода.
А что делать с преподавателями которые дают такие задачи на экзаменах? )))

Как вспомню аж вздрогну.
головоломки ведь интерестно щелкать, так и тут. ради забавы, но не ради навыков. хотя, с какой стороны взглянуть
ходить на занятия бля, а не косить под вундеркинда и прогуливать чтобы потом вот на хабралорах плакаться о том какие же плохие преподавателя, тесты и экзамены. на большинство, если не на все, такие вот уебанские вопросы ответы даются на практических занятиях. а кроме как попробовать партянку гавнокода на пхп4 под виннт4.0 и узнать результат особо вариантов нет.
Нам такие вопросы давали на бумажке. Какие такие — «практические занятия»?
Есть экзамены на проверку знаний и есть экзамены на — «проверку умения решать экзамены».
САБЖевый вопрос из второй категории.
Соискатель-мститель. Он ходит в маске по компаниям, проходит собеседования, а вскоре в самых неожиданных местах находят части тел работодателей, завернутые в распечатки тестов…
… в самых неожидианных местах находят части кода из задач на собеседовании.
спорный вопрос. знание тонкостей и опасных мест стандарта говорит хотя бы о том, что стандарт читали.
Определенный смысл в таких вопросах («каков результат выполнения программы..») есть, потому что часто в проекте *уже* есть некотрое количество (5-100%) говнокода, в котором так или иначе придется разбираться.

Но вопрос из топика это совсем запредельный пц, поэтому правильный ответ это, конечно, дать молотком по голове тому, кто такой код пишет.
Тоже никогда не понимал такого, когда на собеседовании дают подобные задания. Что за глупость? Они что, интерпретатор на работу принимают, или всё же человека?
Давать тестовые задания надо на знание архитектуры, паттернов проектирования. А такие задания — бред собачий.
> Они что, интерпретатор на работу принимают
В приеме на работу отказать из-за неподходящей версии :)
Во-во!!! Как будто от этого что-то зависит. Или уровень разработчика будто зависит от знания багов компиляторов различных версий. К решению задач это не имеет никакого отношения.
Ну смотря на каком языке вы это напишите :) В большинстве случаев вы правы.
Такое выражение изначально похоже на «Казнить нельзя помиловать»: лучше лишний раз при сомнительной операции проставить скобки, чем потом, почёсывая репу, искать ошибку и доказывать интерпретатору, что ты пишешь на PHP — и должно получиться не 7.
UFO just landed and posted this here
По-моему, пишется «трЕнарный», а не «тЕрнарный», набрал в Гугле «тренарный оператор» для проверки и ужаснулся, когда тот меня решил поправить «Возможно, вы имели в виду: тернарный оператор» и одна из первых ссылок на Хабр, но на другую статью. Хабр заполонила тотальная безграмотность. ;)
вовсе нет, он так и пишется тЕрнарный.
все таки он именно тЕрнарный
Значит это меня и часть инета заполонила тотальная безграмотность ;)
А мне, например, лингво на компе по запросу «тернарный» говорит «ternary», а по вашему — молчит.

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

Без скобок его, ИМХО, можно использовать только когда он не соприкасается с другими операторами.
Спасибо, интересный факт, я хоть и пишу на PHP — но в уме результат у меня вышел 6 :) ну да я просто свято чту завет мануала по PHP, который напрямую предупреждает что комбинирование тернарных операторов есмь зло :)
UFO just landed and posted this here
Видимо и я еще хреновый php программист потому что в уме у меня получилось тоже 6 :)
а если у меня получилось 5 — на чем я программирую?
)))
Я ответил 6.
Да, в основном программирую на PHP. Но имею опыт использования десятка языков.
Про неправильность тернарного оператора я и знать не знаю, потому что на первом курсе научили скобочки ставить :) Никогда не пишите «красивый код» с экономией в 2 символа, который сами потом будете читать как китайско-японский словарь — вот и всё.
UFO just landed and posted this here
UFO just landed and posted this here
Подобные тесты ничего не показывают. Они хороши, когда на работу берут кодера (который программу переводит с естественного языка в код). А сила настоящего программиста немного в другом. Она заключается в поиске решения поставленной задачи, когда из «я хочу, чтобы было во!» получается сначала алгоритм ее решения, а потом и собственно решение.

Что же касается этого примера, настоящий программист не поленится расставить скобки, если он сомневается. Или полезет в документацию, разберется и оставит подробный комментарий «для потомков» к этому месту. А конструкции типа «true? false? 5: 6: true? 7: 8» будут вызывать в нем стойкое желание переписать этот фрагмент кода. Уж больно неэстетично он выглядит.

ИМХО, конечно.
UFO just landed and posted this here
Как я и говорил, это весьма сокращённый пример. Хотите знать как полностью выглядело это задание?
Чему будет равно значение переменной $c после выполнения следующего кода:
$c = ($a == $b || $a <= 2) ? ($a == 2) ? 1 : 2 : ($b > $a && $a > 2) ? ($b > 2) ? 3 : 4 : ($a < 5 || $b < 2) ? ($b == 4) ? 5 : 6 : (1 == 1) ? 7 : 8;

Ну хоть условия в скобках — и то хорошо…
Ну условия в скобках не имеют таких особенностей, как тернарный оператор в PHP, с ними всё просто и понятно.
Ну просто если еще и в условиях убрать скобки, то получится совсем уж дикая мешанина из говнокода :)
Капец, взрыв мозга! Не стыдно такие задания давать?
Ну вы всегда могли ответить, что-то вроде «Наверное я ошибся и это собеседование на должность обфускатора» или «Допишем print $c; и запустим, выведенное значение на экран и будет искомым».
Необходимо уточнить, что до вывода переменной $c будет показано несколько предупреждений, что переменные $a и $b не инициализированы :)
UFO just landed and posted this here
Люблю Perl за его смайлики, Lisp тоже неплох.
Я периодически пописываю на AutoLisp'e брату(автоматизирую построение всяких полочек и проч досок) и вот по мне вот за такой синтаксис (+ (- a b) c (* d e)) всегда возникает желание оторвать комуто руки. Но это сугубо мое личное…
Идиологически верный синтаксис и со временем можно привыкнуть. Правда еще в лиспе принято переносы расставлять для наглядности )
(и (Зато все скобки всегда на месте) (части кода отделены друг от друга))
я бы ответил «удар клюшкой от того, кто сабмиттид код».
Да ладно вам, прикольное мысленное упражнение.

Конечно, при приеме на работу такое давать не верно, если человек таких вещей не знает — это вовсе не значит, что он плохой программист. Другое дело, что если он такие вещи всё-таки знает — значит имеет солидный опыт программирования на данном языке (что, опять таки, не делает его автоматически хорошим программистом).
UFO just landed and posted this here
Я ответил 6.

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

Ну а что касаемо «пропускаем весьма общие разделы в учебниках по новому для себя языку» — то это, имхо, также странно. Ведь именно в «мелочах» кроются различия.
Работая с LINQ частенько приходится писать нечто подобное…

true?
false? 5: 6:
true? 7: 8


очавидно ответ 6 :)
Глядишь, в C# 5.0 наконец-то сделают оператор if нормальным выражением :-)
И так вполне нормальный :)
Правая ассоциативность как-то привычнее, т.к. код можно фактически переписать в виде if then else:
  1. if(true) then if (false) then 5 else 6 else if (true) then 7 else 8

Если отформатировать, то получим:
  1. if(true)
  2. then
  3.     if (false)
  4.     then 5
  5.     else 6
  6. else
  7.     if (true)
  8.     then 7
  9.     else 8


Это смотря что переписывать.
(true ? (false ? 5 : 6) : true) ? 7 : 8

if
  (if true
  then
    if false then 5 else 6
  else true)
then 7
else 8
Просто слово then более естественно воспринимается там, где знак ?, а знак? в свою очередь естественно переносится перед булевым выражением и все, таким образом, безо всяких скобок воспринимается как и исходное выражение. Вы же сначала расставили скобки, а потом решили переписать — это совсем другое.
У меня все then'ы стоят на месте '?', а что вы хотели сказать этим — «а знак? в свою очередь естественно переносится перед булевым выражением и все» — я, если честно, не понял.
«boolean ?» трансформируется в "if boolean then" — это значит, что знак? становится «if» сразу перед булевым выражением, за которым стоит. У Вас же if улетает куда-то далеко влево от булевого выражения, потому что вы сначала расставили скобки по левоассоциативным правилам, а потом уже начали менять все на if-then-else.
По правой ассоциативности ничего со скобками мудрить не надо, просто вместо? и: пишем then и else соответственно, а прямо перед булевым выражением пишем if, т.е. знак вопроса, который стоит сразу за булевым выражением очень естественно воспринимается, как вопрос условия «если» и потому if ставится пармо перед булевым выражением, а никуда не улетает далеко влево.
Вас путает то, что там числа. Ничего у меня не улетает.
(true ? (false ? true : false) : true) ? 7 : 8
Слева от самого правого? у меня стоит boolean. И слева от самого левого (в скобках) — тоже. Поэтому у меня сначала один if, потом второй.

По Вашей же логике это: true || false ? 5 : 10 должно превратиться в
true || if false then 5 else 10, а это не так, по крайней мере в Си++. Так что «интуитивная» замена bool? на if bool then не работает, а если брать в кач-ве bool всё выражение, то разборов может быть уже два.
Нет, по моем логике if будет перед (true || false). Т.е. я ставлю его перед булевым выражением, а не его частью. Если слева я встречаю то, что булевым выражением не явлается (знак ":", например) я дальше не занимаюсь насилием мозга, а ставлю if — просто и понятно.
Есть замечательная книга — Фьюэр А. Задачи по языку С. На экзамене помню давали из него задачки (из-за этого прозвали автора Фюрером), в этой книге описано много задачек описанного выше плана причем даны к ним полные описания и пояснения т.к. некоторые из них еще являются и компиляторо-зависимыми, однако после такой книги начинаешь ощущать всю мощь языка.
Спасибо за наводку, почитаю Фюрера Фьюэра :)
Мощь — это когда тысячу строк можно скукожить в сотню, а не тридцать символов в десять :-) А тернарный оператор… ну что такое тернарный оператор…
infixl 0 ?

True  ? (x, _) = x
False ? (_, x) = x

infixl 1 ?:

(?:) :: a -> a -> (a, a)

x ?: y = (x, y)

main = print x where x = True ? 5 ?: 6
Никогда не понимал зачем учить кодеров… Уж в университете учиться кодерству — просто дико. Кодерство это уровень ПТУ, а не ВУЗа.

Лично в нашем ВУЗе у нас был С++ только на 5-ом курсе (из 5-ти), хотя программы на С++ мы писали с первого курса — делали расчеты и лабы, ну и конечно вышка все пять курсов была… зато люди знают сейчас (ну кто вообще интересовался программированием, а не математикой) не только C++, но и любой язык фактически — ибо мыслят абстрактно от языковых моделей. Язык всего лишь набор символов и не более. Эффективные алгоритмы и умение их применять — наше всё.
ага, конечно )

про
mov ax, 0
и
xor ax, ax
слыхали?

алгоритм один, а эффективность разная, причем разная в разных местах )
Самый простейший метод оптимизации в асме, есть куда более интересные вещи. Я начинал с Z80, а с учетом глобальной нехватки регистров и памяти, так приходилось извращаться, что x86 даже и не снилось
ну и? может посчитаете сколько тактов займет и то и это на процессорах современных с учетом работы их в 64bit режимах и наличия не одного конвейера?) и сколько на операции на «ax» потратите…

вопрос на засыпку что будет быстрее — битовый сбвиг или add?
думаете сдвиг? если так то сильно ошибаетесь.
что ну и? чтобы писать эффективно, мало уметь применять эффективные алгоритмы, полезно знать и то, в чем пишите и что потом из этого родится.

p.s.
не нужно считать меня за идиота и предлагать посчитать эти команды, которые являются примером понятным для всех.
> мало уметь применять эффективные алгоритмы
ну-ну. будь вы пять раз умнее интеловского компилятора, и 8 раз умнее инженеров того же интел, с тормознутым алгоритмом пузырька (на больших выборках, конечно) вы далеко уедете. Удачи в программировании…

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

А вы посчитайте лучше, может удивитесь. А то сказали слова в пустоту, а как до дела дошло «это все знают»… на заборе тоже пишут, что «интел круче чем амд»… поболтать все горазды. «спецы епть на словах»…

и сказав про «алгоритм один»… вы отличаете алгоритм от реализации?

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

Я ни сколько не преуменьшаю ценность различных алгоритмов, только все достоинства даже хорошего алгоритма, но при хреновой реализации, как вы и предлагаете делать (языки для вас ведь набор букв) можно свести на нет. Что ж, приведу очередной известный пример — рисование точки через gdi в windows — как бы не казалось логичным, но делать это через setpixel() обойдется в разы дороже, чем нарисовать тот же прямоугольник размером в 1 пиксель. Задумайтесь над такими вешами, для действительно эффективных программ алгоритмов не достаточно, нужно еще знать на чем пишешь, чем компилируешь и какие библиотеки используешь.

касательно второй части, что вы прокомментировали — вы не поняли как моего первого поста, так и второго ((( советую перечитать и не понимать буквально, включите фантазию.
так ведь зачем вы используете GDI? почему не пишите напрямую в буфер види?) Да пусть у вас отрисовывается игра мегабыстро, если вы рисуете невидимые поверхности (например) — скорости не будет. Экономите на спичках. Кроме того, указанные вами технические вещи очень просто находятся статическим анализом и профайлером. Даже первокурсник с этим справится.
чорт ,) опять вы все конкретно принимаете ,) это просто пример, на чем обычно люди затыкаются )) поэтому и нужны кодеры, которые уже вдоль и поперек такие веши изучили и собаку съели — вы им ставите задачу и как ее реализовать, а они уже в свою очередь, делают это действительно эффективно, и на то что вы потратите день, они могут потратить реально пару часов.
Пока не знаю, это было онлайн-тестирование.
UFO just landed and posted this here
Просто часто для подобных тестирований берут задачки, упражнения из разных книжек по программированию, где эти задачки приводятся просто для тренировки мозгов, закрепления темы. Для собеседования действительно такие вопросы никуда не годятся. Кадровики же и рекрутеры, как правило, сами в программировании ничего не смыслят и написать свои вопросы не могут.
UFO just landed and posted this here
Во-первых, мне, например, иногда нужны люди, которые умнее меня.
Во-вторых, тут проверяется опытность. Если человек опытный, то он скорее всего уже слышал об этой задаче)
Я думаю не слышал, а читал. На хабре :)
UFO just landed and posted this here
Проблема не в том, что «нельзя судить» — можно судить по ходу рассуждений и полёту фантазии. Проблема в том, что трудно избежать субъективизма, оценивая полёт фантазии.
в тему изучения нескольких языков
каков будет результат выполнения следующего скрипта

<?
$a = array ( «a» => «B», «b» => «B»);
echo count($a);
for ( $i=0; $i < count($a); $i++)
{
$a[$i] = «text»;
}
print_r($a);
?>
Не пудрите людям мозги смешивая числовые индексы и ссылки.
И чтобы избежать подобных недоразумений я бы посоветовал использовать только foreach().
Получится бесконечный цикл.

В 4 строке, после каждой итерации будет увеличиваться значение count($a) на еденицу.
использовать count($a) в условии — не есть гуд. Объяснять думаю не стоит?
а ответ будет 2 и ошибка.
«Причём здесь «влияние изучения нескольких языков программирования»? Часто мы, зная уже несколько языков программирования, пропускаем весьма общие разделы в учебниках по новому для себя языку, полагая, что там всё как и в других языках. Будьте внимательны и доверяйте только официальной документации.»

Перечитывать до просветления… Спасибо. буду знать.
а потом удивляются, что в их проектах тонны говнокода, написанного теми, кто такое собеседованпие прошёл.
Когда передавал исходные коды в другое подразделение, в результате закулисных игр, напичкал код подобными творениеями от души)) Ребятки так и не раскопали ничего))
UFO just landed and posted this here
Ну да, проект и компилился, и работал. А вот анализировать и учится по нему невозможно.
О, минусы видимо от наших ребят)) Приятно, помнят, глаз дергается.
Кстати, выяснил недавно, что проект так и не оформили документально за конторой. Может зарегить на себя))
UFO just landed and posted this here
А если они возьмут да перепишут код?
UFO just landed and posted this here
И как ООП связано с кривой реализацией? Или вы неспособны тоже самое сделать без ООП с еще большими затратами памяти?) да вы себе поди льстите))
UFO just landed and posted this here
В нашем случае была проблема глубже. Подразделение не занималось нашей тематикой. Руководство решило оградить себя от проблем с монополией одного отдела на довольно прибыльное направление. Для этого отобрали людей, критерий был, видимо, по количеству сданных объектов с их участием. Как вяснилось позже — это не показатель качества специалиста. Схема работы между нашими отделами оказалась немного схожая. Есть несколько человек, хорошо разбирающихся в направлении деятельности отдела, очень хорошо. Конечно у этих людей есть специализации. Они готовят решения для узких мест в проектах, возможно что первое внедрение проводят сами, а в дальнейшем все передается «общественности», т. е. толпе обезъяянок с мышками. В результате эти самые «обезъянки» фигурируют на большинстве объектов, в то время как «гуру» сидят дома, или по полгода бьются над оживлением монстров от отдела «промышленного фантазирования». Отличие нашего отдела было в отсутствии «обезъянок». Шеф в свое время просто капитально почистил отдел и довольно резко ограничил прием новых сотрудников. Конечно пахать пришлось как папам-карлам, зато ЗП выросли сказочно (когда ЗП в 10тр считалась весьма неплохим заработком, мы получали по 60-90). При виде таких сумм в квитках, у «обезъянок» началось жуткое слюноотделение, так что недостатка в добровольцах не было.
Тамошние «гуру», в большинстве своем, отмахнулись от предложения, прекрасно понимая объем работ. Один, правда, вляпался. Но, на сколько я знаю, не по своей воле.
И началось. Сачала долго разбирались с графикой, потом с протоколами. Когда добрались до математики — начался тихий ужас. Внедрение — опять кошмар. Люди не понимают, что такие деньги платят не за задержку на рабочем месте на полчаса, а за бесприкословное подчинение приказам, за готовность выехать на объект в любой день, в любое время суток. Нежелание признавать собственные ошибки, попытки подковерной борьбы. «А Вы нам документ с неправильными формулами дали!» «А Ваш контроллер работает неправильно!» «А вообще все вы тут пидарасы, и уроды! У Вас ничего не работало, а вот мы хотели Вам помочь! А Вы, а Вы...!!!» Собственно начатый одновременно с этой «помощью» проект мы аттестовали и сдали первый объект в его рамках месяца через три. А еще через три-четыре мы дождались первой версии «спасателей».
После этого кому и что отдавать? Зная ребят, которые там тянули новые разработки, те самые «гуру», могу предположить что при наличии времени, желания и мотивации — они сделают ничуть не хуже. И в их руках это будет работать лучше и быстрее, чем мои поделки. А остальным — это что метрвому припарки. Так что перепишут. И перепишут лучше. Ни что не вечно. Вот в данный момент я переписываю софт для одного из своих старых объектов. Я удивляюсь, как можно было быть таким недальновидным. Иногда я ужасаюсь собственым поделкам. Но что поделать, был молодым и глупым.
Хотите угадаю, сколько времени проработает сотрудник в фирме, если его уличат в написании этого кода? :)
Так может для этого этот код на собеседовании и фигурирует :) Если увидев такое претендент воскликнет «Ба! Да я еще и не такое писал!», то… в общем как-то так :)
Скорее всего, 6, но зависит от ассоциативности операторов в языке. Есть языки с правой ассоциативностью всегда (т. е. 2 * 2 + 2 == 2 * (2 + 2)), не говоря про всякие языки с RPN, в которых, правда, х. з. есть ли такой тернарный оператор :)
Недавно в C встретил тоже смешную особенность, с первого взгляда взрывающую мозг:
assert('\xFF' != 0xFF);
Sign up to leave a comment.

Articles