beldmit: (Программизм)
Dmitry Belyavskiy ([personal profile] beldmit) wrote2009-03-04 05:36 pm
Entry tags:

И еще о поддерживаемости кода

Вдогонку к этой
и немного этой записям. И еще немного к боковому хвосту у Витуса.

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

Так вот, господа. Когда вам показывают такой пример (если он выходит за пределы разумного понимания языка и знания ключевых слов или общепринятых идиом), то скорее всего - одно из двух.

1. Собеседующий пытается срезать соискателя. То есть самоутвердиться. Вам нужен такой начальник?
2. Код реально используется в проекте? Вы действительно хотите это поддерживать?

Да, и главное, без чего пп.1-2 не действуют. Понимать, что предъявленный пример собой представляет - все-таки надо. Чтобы было ясно, что объявлена таки переменная, а не функция.

[identity profile] raydac.livejournal.com 2009-03-04 02:49 pm (UTC)(link)
что то никогда не просил на собеседованиях что то разобрать, даже в голову не приходило такое

[identity profile] beldmit.livejournal.com 2009-03-04 02:57 pm (UTC)(link)
Меня несколько раз просили объяснить именно код. Но в качестве вопросов на собеседование нечто подобное пару регулярно встречается.

(no subject)

[identity profile] raydac.livejournal.com - 2009-03-04 15:01 (UTC) - Expand

[identity profile] grzegorzrus.livejournal.com 2009-03-04 03:22 pm (UTC)(link)
А что является разумным пониманием?

[identity profile] beldmit.livejournal.com 2009-03-04 03:24 pm (UTC)(link)
Я бы определил примерно так: исходя из общей идеологии языка, сделать вывод можно, даже не зная конкретной идиомы.

[identity profile] gornal.livejournal.com 2009-03-04 03:30 pm (UTC)(link)
Я почти всегда спрашиваю
c=3;
d=++c++;
printf("%d\n",d);

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

[identity profile] beldmit.livejournal.com 2009-03-04 03:42 pm (UTC)(link)
Ну, на это я отвечу. Неопределенное поведение, зависит от компилятора, за такой код убивать.

(no subject)

[identity profile] gornal.livejournal.com - 2009-03-04 15:47 (UTC) - Expand

(no subject)

[identity profile] beldmit.livejournal.com - 2009-03-04 15:58 (UTC) - Expand

(no subject)

[identity profile] fdo-eq.livejournal.com - 2009-03-04 15:59 (UTC) - Expand

(no subject)

[identity profile] gornal.livejournal.com - 2009-03-04 16:13 (UTC) - Expand

(no subject)

[identity profile] slobin.livejournal.com - 2009-03-04 16:39 (UTC) - Expand

(no subject)

[identity profile] gornal.livejournal.com - 2009-03-04 16:42 (UTC) - Expand

(no subject)

[identity profile] slobin.livejournal.com - 2009-03-04 17:37 (UTC) - Expand

(no subject)

[identity profile] gornal.livejournal.com - 2009-03-04 19:48 (UTC) - Expand

(no subject)

[identity profile] some41.livejournal.com - 2009-03-04 20:43 (UTC) - Expand

(no subject)

[identity profile] slobin.livejournal.com - 2009-03-04 21:08 (UTC) - Expand

(no subject)

[identity profile] some41.livejournal.com - 2009-03-04 21:20 (UTC) - Expand

(no subject)

[identity profile] slobin.livejournal.com - 2009-03-04 21:50 (UTC) - Expand

(no subject)

[identity profile] slobin.livejournal.com - 2009-03-04 21:00 (UTC) - Expand

(no subject)

[identity profile] some41.livejournal.com - 2009-03-04 21:29 (UTC) - Expand

(no subject)

[identity profile] slobin.livejournal.com - 2009-03-04 21:55 (UTC) - Expand

(no subject)

[identity profile] some41.livejournal.com - 2009-03-04 22:05 (UTC) - Expand

(no subject)

[identity profile] slobin.livejournal.com - 2009-03-04 22:24 (UTC) - Expand

(no subject)

[identity profile] beldmit.livejournal.com - 2009-03-04 19:02 (UTC) - Expand

(no subject)

[identity profile] gornal.livejournal.com - 2009-03-04 19:43 (UTC) - Expand

(no subject)

[identity profile] slobin.livejournal.com - 2009-03-04 21:12 (UTC) - Expand

(no subject)

[identity profile] gegmopo4.livejournal.com - 2009-11-22 21:02 (UTC) - Expand
singalen: (Default)

[personal profile] singalen 2009-03-04 03:31 pm (UTC)(link)
Третье противоречит первым двум.
Вы же не считаете, что большинство собеседующих не понимают этих трёх тезисов?

[identity profile] beldmit.livejournal.com 2009-03-04 03:43 pm (UTC)(link)
Часть явно не понимает.

[identity profile] shigin.livejournal.com 2009-03-04 03:36 pm (UTC)(link)
У меня несколько другая точка зрения.

1. Если нанимают программиста на C++ (то есть весь код у нас плюсовый и всё такое), то как--то логично проверить, знает ли человек подводные камни этого самого C++. Тем более, что приведенный пример может получиться и сам по себе.

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

3. Я не очень понимаю, чем это принципиально отличается от предложения отсортировать терабайтный файл, если у нас есть только 2 гига памяти.

[identity profile] beldmit.livejournal.com 2009-03-04 03:45 pm (UTC)(link)
1. Да. Я ж говорю - понимание необходимо.
2. Согласен. А с другой стороны - стоит ли связываться с этим чужим кодом?
3. Тут несколько сложнее. В идеале стоит думать о том, что ресурсов не хватит объективно. И описывать границы применения предложенного решения. Любого.

(no subject)

[identity profile] shigin.livejournal.com - 2009-03-04 15:49 (UTC) - Expand

(no subject)

[identity profile] beldmit.livejournal.com - 2009-03-04 16:00 (UTC) - Expand

[identity profile] fdo-eq.livejournal.com 2009-03-04 04:00 pm (UTC)(link)
С выводами относительно конкретного примера согласен полностью.

[identity profile] beldmit.livejournal.com 2009-03-04 04:01 pm (UTC)(link)
Может, и пример вспомните? Я так навскидку затрудняюсь, но был многократно.

(no subject)

[identity profile] fdo-eq.livejournal.com - 2009-03-04 16:07 (UTC) - Expand

[identity profile] oldbukh.livejournal.com 2009-03-04 04:06 pm (UTC)(link)
для понимания языка достаточно спросить очень простую вещь, которая только кажется зубодробительной.

Зачем нужно вот такое макроопределение
#define MACRO(a,b) (&((b*)NULL)->a)

Работает как из пушки :)

[identity profile] oldbukh.livejournal.com 2009-03-04 04:10 pm (UTC)(link)
или чем плох вот такой код?

void print(std::vector& v)
{
for (unsigned i = 0; i < v.size(); i++)
printf("%d\n", v[i]);
}

Или чем STL-ный vector хуже чем имплементация списков из /usr/include/linux/list.h?

P.S. В плюсовом синтаксисе могу ошибаться :) Это не на подкорке

[identity profile] besm6.livejournal.com 2009-03-04 05:04 pm (UTC)(link)
Работает как из пушки :)

Из той самой, из которой нужно пристрелить того, кому эта информация в программе понадобилась?

(no subject)

[identity profile] some41.livejournal.com - 2009-03-04 20:45 (UTC) - Expand

(no subject)

[identity profile] besm6.livejournal.com - 2009-03-05 11:44 (UTC) - Expand

[identity profile] beldmit.livejournal.com 2009-03-04 07:36 pm (UTC)(link)
Типа смещение элемента a в структуре/классе b? Убивать.

(no subject)

[identity profile] oldbukh.livejournal.com - 2009-03-05 04:39 (UTC) - Expand

(no subject)

[identity profile] oldbukh.livejournal.com - 2009-03-05 04:40 (UTC) - Expand

(no subject)

[personal profile] yurikhan - 2009-03-05 09:53 (UTC) - Expand

[identity profile] dimas.livejournal.com 2009-03-04 04:11 pm (UTC)(link)
Дим, ты не поверишь сколько народу срезается по пост-кондициям банального префиксного и постфиксного инкремента в цикле ... Когда мне на собеседовании в SWSoft об этом рассказали, я не поверил ... как подавал на собеседованиях сам - офигел ...


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

Но любителей подсунуть что-нить на undefined behavior, и заставляющих объяснить почему неправильно ... или всякие неоднозначные штуковины ... Я вот считаю что проще сказать что не правильно, и как - правильно, чем объяснять ... С другой стороны - собеседование, это ж взаимный экзамен, проще отсеять невменяемое место сразу, чем потом мучаться :)

[identity profile] beldmit.livejournal.com 2009-03-04 07:37 pm (UTC)(link)
Верю. Дофига. И с твоими выводами полностью согласен.
Ты, кстати, окопался где-нибудь?

(no subject)

[identity profile] dimas.livejournal.com - 2009-03-04 19:46 (UTC) - Expand

[identity profile] vtosha.livejournal.com 2009-03-04 04:30 pm (UTC)(link)
Рассказывают, что на некоем коллоквиуме у медиков по черепу (или отверстиям черепа) преподаватель просверливал две дополнительные дырки и требовал ответить, что это. Мало кто сознавался, что этих дырок не должно было быть.

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

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

[identity profile] dimas.livejournal.com 2009-03-04 07:49 pm (UTC)(link)
м-м-м ... можете рассказать на Ваш взгляд аналогию этим дыркам? :)

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

(no subject)

[identity profile] vtosha.livejournal.com - 2009-03-05 05:39 (UTC) - Expand

[identity profile] slobin.livejournal.com 2009-03-04 04:49 pm (UTC)(link)
Поскольку здесь всё равно не собеседование, не могу не удержаться и не рассказать свой любимый вопрос про язык C: как выглядит самая короткая программа на нём? На всякий случай проверяемая постановка задачи: из какого самого короткого файла команда gcc myfile.c создаст a.out? Варианты: (1) без ворниногов (2) ворнинги допустимы.

... За окном сверкает пол-луны ...

(no subject)

[identity profile] abraham1901.livejournal.com - 2009-03-04 21:08 (UTC) - Expand

(no subject)

[identity profile] beldmit.livejournal.com - 2009-03-04 21:31 (UTC) - Expand

(no subject)

[identity profile] slobin.livejournal.com - 2009-03-04 21:15 (UTC) - Expand

[identity profile] besm6.livejournal.com 2009-03-04 04:54 pm (UTC)(link)
Так эти два вопроса надо задавать не в ЖЖ, а собеседующему... И принимать решение исходя из его реакции.

[identity profile] beldmit.livejournal.com 2009-03-04 08:54 pm (UTC)(link)
Я бы сказал, эти вопросы стоит держать в голове во время собеседования.

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

(no subject)

[identity profile] besm6.livejournal.com - 2009-03-05 11:42 (UTC) - Expand

(no subject)

[identity profile] beldmit.livejournal.com - 2009-03-05 11:45 (UTC) - Expand

(no subject)

[identity profile] besm6.livejournal.com - 2009-03-05 11:42 (UTC) - Expand
arilou: (Meditate)

[personal profile] arilou 2009-03-04 08:23 pm (UTC)(link)
В общих чертах согласен (и, например, с комметом Рана о том, что этивопросы надо задавать собеседующему).
Но есть тут некоторое "но".
Токость тут в том, что твой пост, как мне кажется, предполагает, что данный программист заведомо достаточно владеет языком настолько, что его мнение о "зубодробительности" конструкций заведомо верно. Т.е. того, что кто-то данными конструкциями пользуется легко, как говорится "играючи" (т.е. получает преимущества таких конструкций, не страдая от ожидаемых тобой недостатков), и что это остижимо даже без смены прошивки собственного мозга - ты уже не допускаешь? Да, конечно, ответ типа: "Я просто не считаю для себя нужным подниматься на такой уровень виртуозности, потому что за тоже время я луше освою что-то более востребованное на рынке," -- тоже принимается (и даже, сажу честно, ожидается ;) ).

[identity profile] beldmit.livejournal.com 2009-03-04 08:58 pm (UTC)(link)
Нет. Я имел в виду другое: конструкции, которые не очевидны с первого и со второго взгляда - неудачные конструкции. Преимущества их мне еще надо обосновывать. Хотя выигрыш я допускаю.

Я, например, долго не любил конструкцию a?b:c; И сейчас недолюбливаю. Понимать я ее прекрасно понимаю, но эта конструкция, в отличие от честного if-а, неустойчива к малым воздействиям типа добавления отладочной печати.

(no subject)

[personal profile] arilou - 2009-03-04 23:54 (UTC) - Expand

(no subject)

[identity profile] beldmit.livejournal.com - 2009-03-05 06:22 (UTC) - Expand

(no subject)

[personal profile] arilou - 2009-03-06 16:44 (UTC) - Expand

(no subject)

[identity profile] beldmit.livejournal.com - 2009-03-06 19:10 (UTC) - Expand

(no subject)

[personal profile] arilou - 2009-03-06 19:18 (UTC) - Expand

(no subject)

[identity profile] beldmit.livejournal.com - 2009-03-06 20:20 (UTC) - Expand

(no subject)

[identity profile] mikeiva.livejournal.com - 2009-03-05 08:51 (UTC) - Expand

(no subject)

[identity profile] beldmit.livejournal.com - 2009-03-05 09:00 (UTC) - Expand

(no subject)

[identity profile] mikeiva.livejournal.com - 2009-03-05 09:02 (UTC) - Expand

(no subject)

[personal profile] arilou - 2009-03-06 16:48 (UTC) - Expand

[identity profile] yakov-sirotkin.livejournal.com 2009-03-04 09:59 pm (UTC)(link)
Да, я хочу это поддерживать, это моя специализация! Только на Java, а не на C++.

[identity profile] beldmit.livejournal.com 2009-03-05 05:40 am (UTC)(link)
Скажи, а почему у тебя образовалась такая специализация?

Здесь идет речь о псевдоидеомах, которые чаще всего - "выпендрись как я".

(no subject)

[identity profile] beldmit.livejournal.com - 2009-03-05 08:39 (UTC) - Expand

(no subject)

[identity profile] beldmit.livejournal.com - 2009-03-05 08:47 (UTC) - Expand

(no subject)

[identity profile] beldmit.livejournal.com - 2009-03-05 09:01 (UTC) - Expand

[identity profile] persinval.livejournal.com 2009-03-06 07:23 pm (UTC)(link)
Согласен с тобой. Скорее всего, старший разработчик, который столь "любуется языком", не понимает, что в продукте это не главное. Тем самым какую либо ситсемную компоненту он напишет отлично, а продумать решение более сложной проблемы просто не сможет, так как не понимает ни задач, ни принципов, ни возможностей, которые требуются на "столь высоком уровне".
Мне самому нравятся всякие красивости языка, но задавать их на собеседовании? Уж нет.