Re[10]: собеседование
От: elmal  
Дата: 22.01.10 08:42
Оценка: 8 (3) +10 :)
Здравствуйте, LordMAD, Вы писали:

LMA>Да и это не проблема, потому что для получения среднего с заданной точностью (в виде int), естественно имеет место округление. Так как в задании не указан конкретный вид округления, случайное округление вполне подходит.

Ни черта себе случайное округление вполне подходит! Это потенциальный баг гораздо круче, чем если просто произошло бы переполнение. Переполнение то заметить легко. А тут от разного порядка входных данных получаем разный результат. Причем по логике, ожидается, что результат должен быть один, более того, вполне справедливо ожидается, что округление будет произведено именно так, как оно делается для целых типов. На это вполне логично закладываться. И в данном случае на практике (именно на практике) вероятность огрести проблемы с этой мегафункцией гораздо больше, чем в случае, если просто сложить 2 числа и подетить на 2, без проверки на переполнение. Не так часто будут функцией пользоваться для достаточно больших данных, скорее всего, а вот вызывать ее с разным порядком параметров будут постоянно. И лично я предпочту пользоваться функций без проверки на переполнение, чем функцией, которая возвращает разные значения при разном порядке аргументов. У тебя ошибка гораздо грубее!!!

PS А прикольно, когда сам собеседующий умудряется облажаться на своей же задаче еще сильнее, чем те кандидаты, которых он отсеивает . Хотя, к сожалению, это типичный случай.
Re[8]: собеседование
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 21.01.10 14:59
Оценка: 15 (4) +2 :))) :)
Здравствуйте, LordMAD, Вы писали:

LMA>Здравствуйте, Codechanger, Вы писали:


C>>Самое смешное, что данный вариант не во всех случаях корректно отработает .


LMA>Это в каких?


например avg (2,3) == avg (3,2) даёт false, а надо true, иначе это не среднее арифметическое



Сколько раз ты её давал на собеседовании ?
Re[9]: собеседование
От: LordMAD Россия  
Дата: 22.01.10 06:12
Оценка: -7 :)))
Здравствуйте, Ikemefula, Вы писали:

C>>>Самое смешное, что данный вариант не во всех случаях корректно отработает .


LMA>>Это в каких?


I>например avg (2,3) == avg (3,2) даёт false,


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

I>а надо true, иначе это не среднее арифметическое


Бред.
Или Вы можете привести ссылку на такое требование к среднему арифметическому в общем случае?

I>Сколько раз ты её давал на собеседовании ?


Не считал, а что?
Re[6]: собеседование
От: Handie  
Дата: 15.01.10 16:51
Оценка: 1 (1) +7
LMA>Вариант решения:
LMA>int sign(int a) { return (a < 0) ? -1 : 1; }
LMA>int avg(int x, int y) { return (sign(x) == sign(y)) ? x+(y-x)/2 : (x+y)/2; }

Это тот случай, когда служение стандарту С++ важнее продуктивной работы. Вам надо работу делать или стандарту следовать? На элементарнейшей задаче два вызова функции, усложненный код.

Простые вещи должны быть простыми. Я никогда не видел чтобы в реальном боевом коде каждое вычисление выражения проверялось на переполнение. Оперируете миллиардами — использование long long решает все проблемы

int avg(int x, int y) { return (int)(((long long)x + y)/2); }

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

template <class InputIterator, class T>
T average(InputIterator first, InputIterator last);

Реализуется в терминах алгоритмов STL парой строк, работает с любыми типами — int, double, float, long long, c любым количеством чисел хранящихся в любых контейнерах — vector, set, my_super_container.

При этом создатели STL не страдали идиотизмом проверки на переполнения, справедливо считая что это вопрос к программисту который использует инструмент и выбирает адекватные типы данных.
Re[13]: собеседование
От: LordMAD Россия  
Дата: 15.01.10 18:19
Оценка: :))) :))) :))
Здравствуйте, hrensgory, Вы писали:

H>Вопросы о том, что именно при условии правильного ответа на них вы

H>рассчитываете услышать по следующим темам:

H>2. Архитектура и проектирование

H>4. Объектно-ориентированное программирование
H>7. Базы данных
H>10. Автоматизированное тестирование
H>12. Составление спецификаций и анализ требований

Я думаю будет понятно, если я просто приведу пример вопроса, например, по теме Объектно-ориентированное программирование:

К каким требованиям на предусловия (preconditions) и постусловия (postconditions) приводит Принцип замещения Лисков (Liskov Substitution Principle — LSP)?
Re[5]: собеседование
От: LordMAD Россия  
Дата: 15.01.10 07:01
Оценка: 3 (1) -5
Здравствуйте, Handie, Вы писали:

LMA>>Нет, просто мы не нанимаем людей, которые на ровном месте спотыкаются об UB или implementation-defined resulting value.

LMA>>Кстати, когда этот вопрос использовали на собеседовании, количество людей, которые сходу писали верный результат, не превышало 10% для позиций с уровнем зарплаты выше среднего по городу.

H>Может я отношусь к 10% особо талантливых людей, рискну написать функцию среднего двух интов:

H>int avg(int x, int y) { return (x+y)/2; };

H>В чем я не прав?


В том, что Вы не умеете складывать два числа на C/C++.

Для C++03 (ISO 14882-2003) — §5/5: «If during the evaluation of an expression, the result is not mathematically defined or not in the range of representable values for its type, the behavior is undefined, unless such an expression is a constant expression (5.19), in which case the program is ill-formed. [Note: most existing implementations of C + + ignore integer overflows. Treatment of division by zero, forming a remainder using a zero divisor, and all floating point exceptions vary among machines, and is usually adjustable by a library function. ]»

Для C99 (ISO 9899-TC3) — §6.5/5: «If an exceptional condition occurs during the evaluation of an expression (that is, if the result is not mathematically defined or not in the range of representable values for its type), the behavior is undefined.»

Вариант решения:
int sign(int a) { return (a < 0) ? -1 : 1; }
int avg(int x, int y) { return (sign(x) == sign(y)) ? x+(y-x)/2 : (x+y)/2; }
Re[5]: а никто и не задумывается: зачем собеседование
От: Pizarro  
Дата: 14.01.10 13:09
Оценка: 1 (1) +3 -2
Здравствуйте, StandAlone, Вы писали:

SA>Итого, кто остается? На поиск кого они заточены — "начинающих кодеров", которые будут пахать за миску доширака от забора и до обеда?:)


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

Для этого хорошо помогает разговор о прошлых проектах.

Задачки предлагают только идиоты. Особенно для сеньоров.
Джуниорам можно предложить что-то несложное, на понимание. Никаких алгоритмов обычно не надо. вообще.
Re[5]: собеседование
От: elmal  
Дата: 14.01.10 13:48
Оценка: 1 (1) +2 -1 :)
Здравствуйте, StandAlone, Вы писали:

SA>Итого, кто остается? На поиск кого они заточены — "начинающих кодеров", которые будут пахать за миску доширака от забора и до обеда?

ИМХО история у всех этих задачь такова — по этим задачам гоняли в институте. Далее, кто-то попал на работу, оказался набирающим. Как определять квалификацию не знает, и не находит ничего лучшего, как использовать те же критерии оценки, какие были в институте. Далее появляются первые люди под его началом, те снова начинают набирать людей. И снова не знают что спрашивать, и спрашивают именно так, как их гоняли в институте. Ситуация усугубляется тем, что часто народ становится начальниками, так и не научившись программировать, так и не поняв, а что же главное в профессии разработчика и что реально ему требуется в работе.
Мне вообще веселит, как набирают. Человека с 10 летним опытом будут гонять по задачкам, которыми в институте гоняют, и наоборот, студента без опыта будут просить спроектировать систему, спрашивать о роли в прошлых проектах и т.д .
Re[2]: собеседование
От: Handie  
Дата: 14.01.10 15:38
Оценка: 1 (1) :))) :)
S>одна из компаний давала написать простой интопритатор с ваис подобного языка (перед приходом на собеседование)

Проявил волю к победе и продемонстрировал полезный для работодателя скиллс — умение работать за бесплатно. Такие люди м нужны.
Re[6]: собеседование
От: Олег К.  
Дата: 17.01.10 03:09
Оценка: 2 (2) +2
H>>Вы просили кандидатов продекламировать эти параграфы наизусть или пересказать своими словами?
LMA>Нет, помнить стандарты вообще не требуется. Требуется уметь писать код, который им не противоречит.
Ты троллишь? Умение писать код не значит фигачить везде проверки на переполнение. Это значит брать типы данных при которых переполнение не произойдет.
Re[7]: собеседование
От: modev  
Дата: 18.01.10 06:45
Оценка: 1 (1) +3
Здравствуйте, Олег К., Вы писали:

LMA>>Нет, помнить стандарты вообще не требуется. Требуется уметь писать код, который им не противоречит.

ОК>Ты троллишь? Умение писать код не значит фигачить везде проверки на переполнение. Это значит брать типы данных при которых переполнение не произойдет.

Не всегда и float можно взять, не говоря уж про double. Long long и прочее тоже может не поощряться. Например, вычисления для мобильных платформ в fixed point. Там даже при несложной физике много тонких моментов вылезает. Правда, те же физические движки для моб. игр пишут одна-две конторы, остальным это не особо нужно. Готовым пользуются уже.
Если у чела компания чем-то подобным занимается, то задача вполне оправдана. Такое и нужно спрашивать.
Если же чел спрашивает такое, только ради того, чтобы проверить, как кандидат знает параграфы стандарта, то плохая задача. Такой выпендреж не есть хорошо.
Re[4]: собеседование
От: StandAlone  
Дата: 14.01.10 12:53
Оценка: +3 -1
Здравствуйте, ProgrammerG, Вы писали:


PG>Так оно и есть. Я эту задачу (реверс строки) всегда задаю первой в технической части интервью. И в зависимости от того решает или нет и как решает строится дальнейший разговор.

...без выделения дополнительной памяти?

PG>И я всегда поражаюсь сколько людей не могут решить эту задачу с первого раза (без подсказок). Причём это не всегда студенты, а люди и с 2-3 летним "опытом" на С.

А какой сакральный смысл в подсчете единичек и замене lookup table на битовый сдвиг(или деление по модулю 2) и наложение маски?
Как они помогут в реальном проекте, когда надо будет оптимизировать какой-нибудь алгоритм Левенштайна, или спектрально-корреляционное преобразование(чисто навскидку крайние задачи, для которых пришлось использовать unmanaged. Подставьте сюда свои реальные задачи, тысячи их...)
?
Человеку со склонностью к математике проще решить через деление и маску. Человеку со склонностью к архитектуре и дизайну такие задачи вообще за разумное время решить сложно, паттерны здесь не применишь.
Итого, кто остается? На поиск кого они заточены — "начинающих кодеров", которые будут пахать за миску доширака от забора и до обеда?
Re[8]: собеседование
От: MozgC США http://nightcoder.livejournal.com
Дата: 15.01.10 02:03
Оценка: 6 (1) +2
Вообще такие споры по поводу вопросов на собеседовании и, в частности, вопросов по различным алгоритмам возникают из-за того, что все мы работаем с разными вещами, и увлекаемся тоже разными вещами. Кому-то по работе часто нужно писать эффективные достаточно низкоуровневые алгоритмы обработки данных, кто-то увлекается решением алгоритмических задач и этюдов, и соответственно будет задавать такие вопросы на собеседовании. А кто-то работает с более высокоуровневыми вещами и решает совсем другие проблемы. Мне, например, сейчас нужно продумать дизайн веб-сервиса для сотен наших клиентов, и продумать его так, чтобы сотни клиентов могли потом долго этим веб-сервисом пользоваться, встраивая работу с ним в свой внутренний софт. И сделать нужно так, чтобы через неделю не оказалось, что что-то не продумано, или что-то надо переделать так, что у клиентов код использующий наш веб-сервис перестанет работать. Или чтобы не пришлось писать через неделю всем клиентам письма, сообщая "вы знаете, мы тут кое что добавили/переделали в нашем веб-сервисе" или "доводим до вашего сведения, что теперь этот метод может выбрасывать такое-то исключение". Но при этом алгоритм быстрой сортировки я не помню. У меня просто другие задачи.
Re[8]: а никто и не задумывается: зачем собеседование
От: IT Россия linq2db.com
Дата: 15.01.10 21:02
Оценка: 6 (2) :)
Здравствуйте, MozgC, Вы писали:

MC>Игорь, вот ваше мнение мне всегда интересно. Можно пример какие вопросы бы вы задавали при собеседовании на позицию старшего .NET/C#/Desktop программиста на проект по разработке типичного корпоративного приложения? Можно буквально 3 предложения, просто из интереса.


У нас интервью выглядит примерно так.

Телефонный скрининг. Расскажите о себе (тут как правило скупая мужская слеза и счастье знакомства). Далее несложные вопросы по списку. SQL, .NET, ASP. Из SQL самый сложный вопрос, если не ошибаюсь, это LEFT/INNER/FULL JOIN, по .NET даже не помню, ASP — ViewState.

Всё в пределах получаса. До следующего интервью доходит в лучшем случае 20%, но не потому что мы такие суровые, а потому что см. мой постинг выше.

Далее приглашаем человека на face to face. Первая часть интервью мы его слушаем, он рассказывает о проектах. Вторая — предлагается решить две задачи.

Первая — SQL скрипт из нашего реального проекта на одну страничку с объяснением проблемы в этом скрипте. Просим найти проблему и предложить фикс. Наблюдать за этим крайне интересно. Кода страница, а проблемное место одно. По описанию проблемы в принципе можно быстро выйти на это место. Здесь сразу виден уровень разработчика, не его написанный в резюме "problem solving skil", а настоящий. Используемое в скрипте решение на самом деле не совсем очевидно и далее мы просим высказать предположение, почему именно это решение используется.

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

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

ЗЫ. При этом на данный момент в нашей команде работают только те, кто пришёл по рекомендации и этого интервью не проходил
Если нам не помогут, то мы тоже никого не пощадим.
Re[11]: собеседование
От: elmal  
Дата: 15.01.10 13:41
Оценка: 3 (1) +1 -1
Здравствуйте, Ytz, Вы писали:

Ytz>Не в обиду, но вы написали два варианта решения элементарной задачи и не один из них не работает, не понятно о чем вообще после этого говорить.

-1 запросто можно и забыть написать, вообще-то. Особенно если привык итераторами пользоваться, а всякие len и for уже давно забыл, как потенциально приводящие вот к таким бякам, я эти -1 уже вообще забыл когда писал. Если на практике потребуется, буду отладчиком внимательно смотреть, а не ошибся ли я — это самый минимум, а желательно еще настроить тестирование таким образом, чтобы такие ошибки всплыли. А если у вас вот такие явная работа с указателями норма, причем вся надежда на внимательность разработчика, и такие ошибки у вас автоматом не всплывут — ваши проблемы. Это задание проверяет исключительно внимательность, и все. Причем нет гарантии, что успешно проверяет, очень реально внимательный человек может просто оказаться уставший, а крайне невнимательный может в данный момент оказаться более сконцентрирован.
Как раз после этого нужно говорить о том, как бороться с такими ошибками, как сделать так, чтобы их не было. А не браковать тех, кто ошибается. Код пишет человек. А человек всегда ненадежен, причем любой. Не ошибается только тот, кто код не пишет. Потому надо не браковать иногда ошибающихся, а делать так, чтобы ошибки быстро находились. Если у человека недостаток внимательности, очень вероятно, что этот недостаток на практике будет компенсироваться осторожностью, тестированием и т.д. И в результате товарищь будет гораздо надежный код писать, чем тот, кто на собеседованиях не ошибается.
Re[6]: собеседование
От: elmal  
Дата: 24.01.10 06:58
Оценка: 1 (1) +2
Здравствуйте, LordMAD, Вы писали:

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

И что с того, что по твоему мнению не является? Баг никуда не делся. То, что по мнению твоих коллег не является, вполне логично, так как коллег набирал ты, или такие, как ты, на похожих задачках. Баг с переполнением тоже по мнению очень большого количества людей багом не является, и вариант такой даюь еще большее количество людей.
Вот еще одно скажу. Не страшно, если кандидат ошибся, гораздо сложнее, когда он не признает свои ошибки. Если кандидат ошибся — выясни, случайно он ошибся или потому, что не в курсе. И посмотри как он исправит свою ошибку. Если ошибся, признал, и исправил — ему плюс такой же, как если б не ошибался. А вот если настаивает что это не баг, это фича — я как то сомневаюсь что таких стоит брать.
Иначе как в одном проекте будет — в ключевой библиотеке, от которой зависят куча людей, ошибка, исходников нет, репортишь баг, так как поведение очень странно, нелогично, и вообще выглядит случайным. Говорят что не баг, разбирайтесь в своем коде, вообще вы идиоты, ни черта не можете, отстаньте, мы заняты важными делами. Простейшая фича висит 2 месяца в результате, перепробываются все обходные пути, не получается. Начинает интересоваться высший менеджмент, а что так долго (не просто типичный ПМ, а практически владелец конторы опускается до этого, причем спрашивает разработчиков лично)? В результате фичу просят сделать разработчиков библиотеки, и тут они признают, что ее никак не сделать, и наконец исправляют баг в библиотеке (перелопатив ее черти как, исправляют долго, и исправив обрушив другие места). И так постоянно. Реальный случай.
Re[13]: собеседование
От: LordMAD Россия  
Дата: 26.01.10 21:33
Оценка: 1 (1) +1 -1
Здравствуйте, Ikemefula, Вы писали:

LMA>>Ты наверное удивишься, но вариант функции avg, который я привел, удовлетворяет этом условию с заданной точностью (в данном случае с точностью до 1 так как имеет место округление до целых).


I>в таком случае вариант x/2 + y/2 вообще идеальный. Погрешность в нем та же но он коммутативен.


В каком месте у него такая же погрешность? Среднее двух 1 точно равно 1, так как округления нет, а эта формула дает 0.

I>но вообще у тебя своя формулировка свойства коммутативности и алгоритмы, явно или неясно использующие эту коммутативность работать у тебя не будут.


Будут, если написаны правильно. Ты ведь, наверное, в курсе, что числа с плавающей точкой сравниваются с точностью до некой ненулевой величины?

I>т.е. крути не крути, а твоя функция не есть среднее арифметическое.


Я так понимаю, что если тебя попросят вычислить среднее с точностью до 100, то ты скажешь, что с точностью до 100 это уже будет не среднее арифметическое?

I>>>Потому avg с помощью приведения типа от int к double и обратно будет смотреться во первых проще, во вторых не будет ошибок


LMA>>Это ты к чему?


I>это я к тому, что ты нагородил кода и выдал неправильный результат


Про double и "не будет ошибок" см. выше.

LMA>>Я думаю, что если бы знал, что такое "случайное округление", ты бы такой глупости не написал. То что в названии присуствует слово "случайное", не означает, что округлять можно с любой точностью.


I>а здесь не любая, а вполне конкретная "(в данном случае с точностью до 1 так как имеет место округление до целых)"


То есть ты думаешь, что для (1, 1) получая 0 вместо 1, ты получаешь точность до 1?

I>avg(a,avg(b,avb(c,...)))


I>чувствуешь, куда я клоню ?


К тому, что (1/2 + (3/2 + 5/2)/2) == 1 для твоего "идеального" варианта "x/2 + y/2"?
Re[6]: а никто и не задумывается: зачем собеседование
От: IT Россия linq2db.com
Дата: 15.01.10 20:28
Оценка: +3
Здравствуйте, Pizarro, Вы писали:

P>Технарей до собеседования допускать нельзя. Собеседовать должен только менеджер (желательно, забывший кодирование) которого интересует только одно: сможет ли человек решать задачи и выполнять работу.


А на основании чего он это будет решать?

P>Для этого хорошо помогает разговор о прошлых проектах.


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

P>Задачки предлагают только идиоты. Особенно для сеньоров.


... задачки не предлагают только идиоты. Особенно для сеньоров.

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

P>Джуниорам можно предложить что-то несложное, на понимание. Никаких алгоритмов обычно не надо. вообще.


Заумные алгоритмы действительно мало что показывают, но код человеку дать пописать необходимо. Желательно не на бумажке.
Если нам не помогут, то мы тоже никого не пощадим.
Re[9]: собеседование
От: LordMAD Россия  
Дата: 17.01.10 17:13
Оценка: -2 :)
Здравствуйте, Олег К., Вы писали:

H>>>int avg(int x, int y) { return (int)(((long long)x + y)/2); }


LMA>>Уже лучше. Если бы в начале был еще assert (лучше статический), проверяющий, что размер long long больше, чем размер int, так вообще было бы хорошо. Соответственно — хороший повод на собеседовании обсудить цену преобразования int в long long и операций над ним на разных платформах, особенно если речь именно об C, а не C++, потому что C99 требует для long long не менее 64 бит. Ну и т.д.

ОК>Еще советую изменить название функции на какой-нибудь набор букв и цифр и тогда никто уж точно не поймет что она делает!

Если Вам непонятно, что делает приведенная выше функция, видимо у Вас проблемы.

H>>>При этом создатели STL не страдали идиотизмом проверки на переполнения, справедливо считая что это вопрос к программисту который использует инструмент и выбирает адекватные типы данных.


LMA>>Именно. Это как раз одна из причин, почему в задании приводится объявление функции avg — чтобы было видно, что адекватный результат функции — int.

ОК>Я фигею как можно извратиться над какой-то avg()! Если тебе так хочется обсудить переполнение, то этот пример очень неудачный.

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

ОК>В реальном коде, как тебе сказали, программисты берут тип с большим числом битов и не страдают фигней.


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

Если человек не в состоянии решать даже такую проблему без увеличения разрядности, что он будет делать когда завтра ему придется реализовывать
long long avg(long long, long long) для 5 различных платформ? Реализовывать собственный тип данных, который бедет выполнять сложение в 3 раза медленнее, чем long long?

ОК>Мне double-ов до сих пор хватало.


Ну так зачем это всем рассказывать — позорить себя так?
Re[6]: собеседование
От: Хвост  
Дата: 24.01.10 02:34
Оценка: +1 -1 :)
Здравствуйте, LordMAD, Вы писали:

LMA>Еще раз повторю: то, что ты называешь багом в моём примере — багом не является, по крайней мере, по моему мнению, и, по мнению моих коллег. Такой вариант решения, как привел я, из кандидатов давали десятки людей. Вариант решения с другим округлением давали всего несколько человек, и так как я не считаю его сильно лучше, здесь я его не привожу. Если требуется какой-то определенный вариант округления, у нас в спецификации об этом явно говорится, и я не думаю, что кто-то из кандидатов, решивших эту задачу тем способом, который привел я, если ему поставить условие применения конкретного варианта округления, не сделает этого.


дядь, да успокойся уже, ты реально слил
People write code, programming languages don't.
Re: собеседование
От: Ulitka США http://lazarenko.me
Дата: 13.01.10 19:22
Оценка: 11 (2)
Здравствуйте, errest, Вы писали:

E>Какие тестовые задания могут дать на C/C++?

E>Нужны простенькие — типа сортировки массива и найти ошибки

Мне очень нравятся string similarity алгоритмы (http://www.dcs.shef.ac.uk/~sam/stringmetrics.html).
Вряд-ли кто-то ответит что-то вменяемое, если никогда с этим не сталкивался, но для завязывания разговора может подойти.
Ну а если в поисковик набираем и т.п. — must.
Re[24]: собеседование
От: elmal  
Дата: 08.02.10 11:41
Оценка: 1 (1) +1
Здравствуйте, LordMAD, Вы писали:

LMA>Наверное, мы о разном говорим.

Хорошо, напиши мне avg для 5 аргументов. Решение, которое привел ты для двух, для большего числа аргументов уже не годится. И если будешь проверять на чет-нечет с кучей if, то есть у меня большие подозрения в том, что они ко всему прочему будет крайне неэффективно. Неэффективен именно алгоритм.

LMA>Если ты про создание полноценного типа — это не на 1-2 минуты задание.

То, что ты назвал — это тоже не на 1-2 минуты задание. Там очень неприятные подводные камни, которые в реальности редки. Даже если видишь их, не факт что сходу наиболее эффективно обойдешь. За 1-2 минуты это сделают без ошибок те, кто к этому заданию готов. Даже у тебя его сделать не получилось, хоть ты и задаешь его на собеседовании. У большинства тоже на этом форуме не получилось без ошибок, хоть они и более правильное решение выдали, чем твое (a/2+b/2 гораздо лучше во всех отношениях, например, хоть и не всегда работает идеально).

LMA>Пример avg — это не тот случай когда их надо вводить.

Если что-то потребовалось 1 раз, значит потребуется еще много раз. Делаете много вычислений с типами ограниченной разрядности — рано или поздно придется вводить. Или avg и не нужна вовсе. А если умножать потребуется, а потом разделить?

LMA>Пока все доводы были в стиле "а вдруг...".

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

LMA>Нет, навых не допускать UB на пустом месте. Понятно, что можно просто перевалить всё на тесты и потом героически исправлять баги... Только зачем, если можно нанять людей, который таких багов просто не допустят?

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

LMA>Мягко говоря, в такой ситуации явно проблема распределения обязанностей.

Нет такой проблемы. Есть проблема человеческой природы. Люди не машины, и ошибаются. Могу ошибиться и в простых вещах тоже.

LMA>Это верно, при условии, что рефакторинг обойдется дороже, что зависит от конкретной ситуации.

Рефакторинг обычно всегда забывают делать, пока не приспичит. И когда уже без него никак, он объодится очень дорого.

LMA>Чушь, потому что универтальная функция будет хуже по определенным критериям, чем ad hoc.

В основном она хуже по критериям скорости. Одно но — если тебя так беспокоит кроссплатформенность, то универсальное решение даже простой задачи с максимальной скоростью тебе не сделать. И затачивать надо под конкретную платформу. Вплоть до написания этого критического участка кода на ассемблере, с кучей флагов условной компиляции. Это делается никак не на собеседованиях в стрессовых режимах, и далеко не всегда вот такая оптимизация очень хорошая идея.

LMA>Чтобы система не развалилась, нужно просто иметь нормальную архитектуру.

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

LMA>Вообще, это не работа программистов — исправлять и предугадывать косяки менеджмента, как любое другое лечение симптомов.

У менеджмена косяки были, есть и будут всегда. По простой причине, что они физически не могут уследить за всем. Особенно если они очень давно в последний раз код видели. Потому исправлять косяки менеджмента — это основное в работе программиста. Если не предугадаешь, и будешь делать слепо по инструкции, система развалится. Вариант с тупыми исполнителями в разработке не работает, хоть ты тресни, или работает на коротком промежутке времени, а потом все переделывать.
Re[4]: собеседование
От: errest  
Дата: 14.01.10 14:05
Оценка: :))
PG>Так оно и есть. Я эту задачу (реверс строки) всегда задаю первой в технической части интервью. И в зависимости от того решает или нет и как решает строится дальнейший разговор.
PG>И я всегда поражаюсь сколько людей не могут решить эту задачу с первого раза (без подсказок). Причём это не всегда студенты, а люди и с 2-3 летним "опытом" на С.

то есть надо что-то вроде этого:
#include <stdio.h>
#include <string.h>


void main()
{
char a[100],b[100];

gets(a);
for (int i=0; i<strlen(a); i++)
{
b[i]=a[strlen(a)-i-1];
}
b[strlen(a)] = 0;
puts(b);
}
Re[3]: собеседование
От: LuciferSaratov Россия  
Дата: 14.01.10 17:58
Оценка: +1 :)
Здравствуйте, Handie, Вы писали:

H>Ну и тест на "лоха" с << и | в цикле.


Это если он совсем лох, будет << и |
А чтобы работало, надо << и &
Re[7]: собеседование
От: маген Россия https://ru.linkedin.com/pub/alexey-smorkalov/4/283/8b8
Дата: 15.01.10 07:31
Оценка: +2
S>на такое решение обычно говорят а теперь тоже самое без char tmp (типо через XOR)

А вот смысл этого, зачеем? Кто-нибудь себе в проект предпочтет код через Xor?
Вопрос скорее не к вам, а риторический.
Надо же помнить, что код всегда — это то, что кто-то потом сопровождает.
Re[6]: собеседование
От: Codechanger Россия  
Дата: 15.01.10 09:28
Оценка: +2
Здравствуйте, LordMAD, Вы писали:
LMA>Вариант решения:
LMA>int sign(int a) { return (a < 0) ? -1 : 1; }
LMA>int avg(int x, int y) { return (sign(x) == sign(y)) ? x+(y-x)/2 : (x+y)/2; }

Самое смешное, что данный вариант не во всех случаях корректно отработает .
Re[13]: собеседование
От: LordMAD Россия  
Дата: 18.01.10 06:47
Оценка: -2
Здравствуйте, Олег К., Вы писали:

ОК>>>Проблем у меня нету. Проблемы есть у тех кто так пишет!

LMA>>Ну так расскажи мне — какие у меня и моих коллег проблемы!
ОК>Большие проблемы! И вы даже не представляете какие у вас проблемы!

А по сути есть что сказать?

ОК>>>Вот что мне интересно — вы там также весь код пишите или это только для интервью?

LMA>>Представляешь, весь код такой!
ОК>Могу представить. Более того, считаю что таких вот "гениев" нужно заставлять поддерживать код написанный другими такими "гениями" чтоб неповадно было.

Давай угадаю – ты, конечно, считаешь, что главное — сделать так, чтобы любой вменяемый и аккуратный студент смог в любой момент включится в работу?

LMA>>Тебе и с LSP не приходилось сталкиваться, что ли?

ОК> Что-то помню такое. Скорее всего приходилось, но просто не помню это под этими fancy words. Ты тоже это забудешь как повзрослеешь.

Ну, да. Зачем использовать короткие слова и абревиатуры на брифингах и code review, когда можно долго и нудно объяснять что имеешь в виду.
Re[23]: собеседование
От: LordMAD Россия  
Дата: 22.01.10 05:44
Оценка: -2
Здравствуйте, Олег К., Вы писали:

LMA>>Ну, это сейчас вообще на каждом углу. Мы убрали его из корпоративного документа по собеседованиям после того, как это написали в английской википедии и количество знающий ответ заранее возросло. Кстати, очень жаль, потому что вопрос действительно очень хороший. Мне до сих пор не известно кто впервые обратил внимание на эту связь.

ОК>Все! Я понял. Вы там задались целью придумать вопросы на которые никто не ответит! Браво!

Нет, у нас цель — задавать такие вопросы, чтобы, мы были уверены, что те, кто на них отвечают — нам подходят. Но ты то, конечно, думаешь, что раз ты на них ответить не можешь, то никто не может.
Re[4]: собеседование
От: elmal  
Дата: 22.01.10 10:19
Оценка: +2
Здравствуйте, LordMAD, Вы писали:

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

В своем решении ты лично внес в код баг, причем больший, чем те, кто просто складывает. Причем ты находился не в стрессовой ситуации, а в спокойной, и все равно ошибся. Почему тебе ошибаться можно, а остальным нет? Если требователен к другим, то надо быть требовательным и к себе, так?
Re[6]: собеседование
От: shrecher  
Дата: 27.01.10 05:31
Оценка: +1 -1
Здравствуйте, LordMAD, Вы писали:

LMA>avg(INT_MAX, INT_MAX)


кому это надо? Если хочется складывать сверх большие цифры используй __int64.
Re[20]: собеседование
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 02.02.10 09:35
Оценка: +2
Здравствуйте, LordMAD, Вы писали:

I>>>>Потому что ты нарушил основное свойство функции — коммутативность.


LMA>>>Еще раз: коммутативность выполняется c заданной точностью (с точностью до округления до целых).


I>>Это значит что коммутативность отсутствует.


LMA>Да ну?


именно так. потому что в твоем случае после применения мега-функции i == j писать уже нельзя.


I>>Решение простое — сортировать аргументы. Одна строчка кода и проблемы как не бывало. Только при этом твой вариант однозначно становтся говнокодом, хотя и правильным.


LMA>Интересно узнать, что за критерий для говнокода ты имеешь в виду?


слшком много кода и слишком много логики для решения простой задачи.



LMA>При чем тут — какую ошибку легче найти? По-твоему, если человек делает ошибку, но эту ошибку легко найти, это его оправдывает?


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

LMA>>>А "(int)(((double)x+(double)y)/2)" "не будет привязан к конкретной платформе", то есть ты правда думаешь, что для ILP64 преобразование из int в double будет корректным?

I>>>>С даблами то решение тебе не нравится почему то
LMA>>>Хотя бы потому что нет способа запихнуть 64 бита в 53 бита без потерь.

I>>Для 32х бит работает идеально.


LMA>Ну вот и пусть те, кто в состоянии мыслить только в пределах одной платформы, идут лесом.


начни с себя.
Re[7]: собеседование
От: elmal  
Дата: 15.01.10 06:13
Оценка: 1 (1)
Здравствуйте, Олег К., Вы писали:

ОК>По мне, так перевернуть строку лучше чем радикс сорт. Если ты такой крутой в программировании, то тебе раз плюнуть перевернуть строку. Не так ли?

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

ОК>Я не думаю что кто-либо будет спрашивать студентов о ролях в предыдущих проектах, но меня откровенно умиляют заявления что человека с 10-летним опытом знания плюсов спрашивать не нужно.

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

ОК>Впрочем, как погляжу, для тебя это больная тема.

У меня не плюсы, а язык на порядок попроще. Никогда у меня не было с ним проблем. Всякие тесты вроде проходил всегда, правда не всегда идеально. У меня тема больная совершенно по другой причине. У меня есть куча сильных сторон, именно практически сильных сторон. Умею бороться со сложностью, умение написать надежно, расширяемо и поддерживаемо. Умудряюсь нормально проектировать в условиях жестких сроков, когда написать по нормальному времени нет, надо все ASAP, приходится идти на компромис, умудряюсь сделать каркас по правильному в рамках мелкой задачи и постепенно, в следующих задачах, перевожу все на нормальный дизайн, а не пишу в лоб, как остальные. Более того, сходу понимаю чужие архитектурные решения, т в состоянии вписывать в чужие решения свои. За счет чего сокращаются как сроки разработки, так и потом практически нет багов при тестировании, а если есть — фиксятся мгновенно, баги не архитектурные, а допущенные по невнимательности. Так вот, сильные стороны мои на собеседованиях никого не интересуют совершенно, вместо этого меня гоняют по слабым сторонам, которые на практике мне не требуются, иначе бы я их подтянул. Слабейшая сторона у меня при прохождении собеседований — многопоточность. А так как у меня одно собеседование в 2 месяца в лучшем случае, то я забываю кое какие детали, так как не используются они у меня в работе. При реальной работе я обставлю всех кандидатов, конкурентов не боюсь, а о них мечтаю. При собеседованиях — приоритет будет у того, кто меньше ошибется в вопросах многопоточности. Отношусь философски — не требуются мои сильные стороны, вам же хуже. А может и лучше, а то если возьмете меня, то по прошествии времени, авторитет будет у меня, а не у вас .
Re[11]: собеседование
От: StandAlone  
Дата: 15.01.10 12:20
Оценка: 1 (1)
Здравствуйте, Ytz, Вы писали:

Ytz>Не в обиду, но вы написали два варианта решения элементарной задачи и не один из них не работает, не понятно о чем вообще после этого говорить.


Без обид, но ни, и "непонятно". Так вот, непонятно, вам шашечки или ехать?
Алгоритм проверить или навыки работы с адресной арифметикой псевдокода, набранного в браузере?
В первом примере обнуление последнего байта строки я опустил намеренно, а во втором — да, каюсь, позабыл в спешке -1 после strlen() дописать. Слава богу, три года с указателями не работаю Ну и, о чем это говорит? Может, о вас, раз с вами помимо указателей говорить не о чем?
Re[12]: собеседование
От: Олег К.  
Дата: 18.01.10 06:19
Оценка: 1 (1)
ОК>>Проблем у меня нету. Проблемы есть у тех кто так пишет!
LMA>Ну так расскажи мне — какие у меня и моих коллег проблемы!
Большие проблемы! И вы даже не представляете какие у вас проблемы!

ОК>>Вот что мне интересно — вы там также весь код пишите или это только для интервью?

LMA>Представляешь, весь код такой!
Могу представить. Более того, считаю что таких вот "гениев" нужно заставлять поддерживать код написанный другими такими "гениями" чтоб неповадно было.

ОК>>Вы там реально пишите для "пяти различных платформ" или ты это тут абстрактно так рассуждаешь?

LMA>Представляешь, реально!
Что за платформы? Что за аппликейшн?

ОК>>>>Мне double-ов до сих пор хватало.

LMA>>>Ну так зачем это всем рассказывать — позорить себя так?
ОК>>Да ладно тебе. Это ты тут конкретно жжешь. В этой подветке, с Liskov Substitution Principle и далее.
LMA>Тебе и с LSP не приходилось сталкиваться, что ли?
Что-то помню такое. Скорее всего приходилось, но просто не помню это под этими fancy words. Ты тоже это забудешь как повзрослеешь.
Re[12]: собеседование
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 24.01.10 09:20
Оценка: 1 (1)
Здравствуйте, LordMAD, Вы писали:

LMA>Ты наверное удивишься, но вариант функции avg, который я привел, удовлетворяет этом условию с заданной точностью (в данном случае с точностью до 1 так как имеет место округление до целых).


в таком случае вариант x/2 + y/2 вообще идеальный. Погрешность в нем та же но он коммутативен.

При этом он занимает кода примерно на порядок меньше, чем твой шедевр

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

т.е. крути не крути, а твоя функция не есть среднее арифметическое.

I>>Потому avg с помощью приведения типа от int к double и обратно будет смотреться во первых проще, во вторых не будет ошибок


LMA>Это ты к чему?


это я к тому, что ты нагородил кода и выдал неправильный результат

I>>А с учетом "случайное округление вполне подходит" то x/2 + y/2 вполне подходит под это условие


LMA>Я думаю, что если бы знал, что такое "случайное округление", ты бы такой глупости не написал. То что в названии присуствует слово "случайное", не означает, что округлять можно с любой точностью.


а здесь не любая, а вполне конкретная "(в данном случае с точностью до 1 так как имеет место округление до целых)"

I>>Среднее арифметическое — коммутативная функция, что следует из её определения.


LMA>См. выше по поводу коммутативности.


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

avg(a,avg(b,avb(c,...)))

чувствуешь, куда я клоню ?
Re[11]: собеседование
От: LordMAD Россия  
Дата: 08.02.10 11:46
Оценка: 1 (1)
Здравствуйте, cpp_beginner, Вы писали:

LMA>>1. Не вполне корректное поведение, если будут переданы в качестве аргументов типы, которые могут быть неявно преобразованы к int, но для которых нет специализации.


_>В специализации по умолчанию сделать assert(),


Этого недостаточно.

_>добавить специализаций по вкусу


За ради чего? Если уж хотелось сделать реализацию для char и short, достаточно было просто перегруженных функций.

LMA>>2. Функция возвращает не const T и даже не T, хотя для данного случая const T — достаточно. В принципе к const я бы на собеседовании может сильно не придирался бы, хотя, с другой стороны, такое решение провоцирует задать соответствующий вопрос.


_>А почему должна возвращать const T?


const потому что rvalue. T — потому что его достаточно и это есть в постановке задачи.

LMA>>3. Все равно нужна проверка, что размер long long больше, чем int (а не равен). И при таком решении еще и, что int больше, чем short и char.

_>Вроде тоже решается ассертом. Хотя наверно как-нибудт можно намутить проверку при спциализации, применить SFINAE например.

Решается только если не надо поддерживать платформы, на которых размеры равны.
Re[3]: собеседование
От: ProgrammerG  
Дата: 14.01.10 12:32
Оценка: :)
Здравствуйте, Handie, Вы писали:

H>Здравствуйте, placement_new, Вы писали:


_>>Здравствуйте, errest, Вы писали:


E>>>Какие тестовые задания могут дать на C/C++?

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

H>Реверс строки я уже писал на трех-четырех собеседованиях и делаю это исключительно по памяти — своп двух указателей идущих навстречу друг другу. Это старый баян, его знают почти все, тест на "лоха".


H>То же самое и с подсчетом единичек. Оптимальное решение — lookup table c 8 или 16 битными "чанками". Ну и тест на "лоха" с << и | в цикле.


H>Все это тесты начинающих кодеров


Так оно и есть. Я эту задачу (реверс строки) всегда задаю первой в технической части интервью. И в зависимости от того решает или нет и как решает строится дальнейший разговор.
И я всегда поражаюсь сколько людей не могут решить эту задачу с первого раза (без подсказок). Причём это не всегда студенты, а люди и с 2-3 летним "опытом" на С.
Re[2]: собеседование
От: Handie  
Дата: 14.01.10 15:36
Оценка: -1
LMA>Напишите функцию, вычисляющую среднее значение двух любых значений типа int:
LMA>int avg(int x, int y);

Вы нанимаете умственно отсталых инвалидов?

LMA>Предположим, что у Вас есть некий класс, реализующий идиому pimpl. Требуется реализовать для него эффективную специализацию функции swap.


Бред какой-то
Re[4]: собеседование
От: Handie  
Дата: 15.01.10 06:33
Оценка: :)
LMA>Большинство кандидатов спотыкались на §5/5 для C++03 (ISO 14882-2003) и §6.5/5 для C99 (ISO 9899-TC3), и, соответственно, §5.8/3 для C++03 и §6.5.7/5 для C99. Но, как уже тут писали, любое задание — всего лишь повод для разговора.

Вы просили кандидатов продекламировать эти параграфы наизусть или пересказать своими словами?
Re[5]: собеседование
От: LordMAD Россия  
Дата: 15.01.10 06:54
Оценка: -1
Здравствуйте, Handie, Вы писали:

LMA>>Большинство кандидатов спотыкались на §5/5 для C++03 (ISO 14882-2003) и §6.5/5 для C99 (ISO 9899-TC3), и, соответственно, §5.8/3 для C++03 и §6.5.7/5 для C99. Но, как уже тут писали, любое задание — всего лишь повод для разговора.


H>Вы просили кандидатов продекламировать эти параграфы наизусть или пересказать своими словами?


Нет, помнить стандарты вообще не требуется. Требуется уметь писать код, который им не противоречит.
Re[8]: собеседование
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 15.01.10 12:56
Оценка: :)
Здравствуйте, LordMAD, Вы писали:

I>>int avg(int x, int y) { return x/2 + y/2; }


I>>Правда он будет давать немого более другие средние значения.


LMA>Ну да, то, что в этом случае avg(3, 5) == 3 или avg(7, 7) == 6, не здорово.


Да, отстой какой то вышел
Re[12]: собеседование
От: Ytz https://github.com/mtrempoltsev
Дата: 15.01.10 17:20
Оценка: +1
Здравствуйте, elmal, Вы писали:

E>-1 запросто можно и забыть написать, вообще-то. Особенно если привык итераторами пользоваться, а всякие len и for уже давно забыл, как потенциально приводящие вот к таким бякам, я эти -1 уже вообще забыл когда писал. Если на практике потребуется, буду отладчиком внимательно смотреть, а не ошибся ли я — это самый минимум, а желательно еще настроить тестирование таким образом, чтобы такие ошибки всплыли.


Поймите правильно — я не пытаюсь кого либо принизить, а себе цену набить, но это все равно, что фигурист будет говорить, что он может крутиться как волчок на коньках, а как просто вперед ехать уже забыл.
Re[13]: собеседование
От: StandAlone  
Дата: 15.01.10 17:48
Оценка: +1
Здравствуйте, Ytz, Вы писали:

Ytz>Все нормально Без обид, но возможно вам стоит попробовать себя как корректора, раз уж с программированием не очень Шутка.


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

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


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

Ytz>С какой целью опустили?

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

Ytz>Вообще есть мнение, например у Спольски, которое я разделяю, что у хорошего программиста ответ как написать < или <=, отнять единицу или нет, приходит сам, без дополнительных усилий. Ну если на велосипеде научился ездить, то не будешь задумываться как крутить педали и когда жать на тормоз. Потому и странно.


Ага. Когда-то, в туманной дали, когда я вовсю педалил на С++ Builder-е, обращение с указателями для меня было, как завязка шнурков.
Был ли я тогда хорошим программистом? Глядя на тогдашний код — увы. С указателями там все было в порядке. Зато на уровень абстракции выше — полный швах.
С тех пор утекло много воды, я как-то начал думать больше о дизайне и меньше об указателях. Перешел на обувь без шнурков, условно говоря-ногу забил и пошел.
Потому что те же паттерны невозможно освоить чисто теоретически. Нужно потратить несколько лет и сделать несколько больших, сложных проектов, набить шишки и увидеть грамотную архитектуру, реально поработать- только после этого придет понимание грамотных подходов проектирования, разработки, тестирования, внедрения.
Никакие олимпиады и курсачи\лабы этого не дадут.
Но адресная арифметика может, увы, подзабыться. Даже у Шерлока Холмса объем чердака был ограничен. Sad but true.
Так что там у Спольски с переворотом строки?
Re[8]: собеседование
От: Олег К.  
Дата: 17.01.10 02:59
Оценка: +1
H>>int avg(int x, int y) { return (int)(((long long)x + y)/2); }

LMA>Уже лучше. Если бы в начале был еще assert (лучше статический), проверяющий, что размер long long больше, чем размер int, так вообще было бы хорошо. Соответственно — хороший повод на собеседовании обсудить цену преобразования int в long long и операций над ним на разных платформах, особенно если речь именно об C, а не C++, потому что C99 требует для long long не менее 64 бит. Ну и т.д.

Еще советую изменить название функции на какой-нибудь набор букв и цифр и тогда никто уж точно не поймет что она делает!

H>>При этом создатели STL не страдали идиотизмом проверки на переполнения, справедливо считая что это вопрос к программисту который использует инструмент и выбирает адекватные типы данных.


LMA>Именно. Это как раз одна из причин, почему в задании приводится объявление функции avg — чтобы было видно, что адекватный результат функции — int.

Я фигею как можно извратиться над какой-то avg()! Если тебе так хочется обсудить переполнение, то этот пример очень неудачный. В реальном коде, как тебе сказали, программисты берут тип с большим числом битов и не страдают фигней. Мне double-ов до сих пор хватало.
Re[15]: собеседование
От: LordMAD Россия  
Дата: 17.01.10 17:45
Оценка: :)
Здравствуйте, hrensgory, Вы писали:

H>LordMAD пишет:

>>
>> H>2. Архитектура и проектирование
>> H>4. Объектно-ориентированное программирование
>> H>7. Базы данных
>> H>10. Автоматизированное тестирование
>> H>12. Составление спецификаций и анализ требований
>>
>> Я думаю будет понятно, если я просто приведу пример вопроса, например,
>> по теме Объектно-ориентированное программирование:
>>
>> К каким требованиям на предусловия (preconditions) и постусловия
>> (postconditions) приводит Принцип замещения Лисков (Liskov Substitution
>> Principle — LSP)?

H>К сожалению, стало яснее только на 20%. Более всего интересуют примеры

H>вопросов к рядовому разработчику №№ 12 и 2 (если на все лениво примеры
H>приводить).

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

Базы данных. Если в данной конкретной вакансии речь идет об реляционных БД, вопросами проверяется умение проектировать БД и писать запросы (не на конкретном диалекте SQL и т.д., а с помощью реляционной алгебры и/или реляционного исчисления).

Автоматизированное тестирование. Например, кандидату предлагается для некоторого небольшого фрагмента кода сказать — что именно нужно подвергнуть тестам (и каким тестам) и как лучше переписать этот код, чтобы он лучше поддавался тестированию.

Составление спецификаций и анализ требований. Например, кандидату дается достаточно мелкая подзадачка, а он должен выделить соответствующие сценарии использования и, например, описать — что не будет реализовано в первой версии.
Re[10]: собеседование
От: Олег К.  
Дата: 17.01.10 23:26
Оценка: :)
E>Задание слишком простое.
Нормальное. Большинство и такое не сделают а я не хочу (точнее не хотел уже) особо напрягать людей.

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

ОК>>Это тоже не сложно но большинство даже простого синтаксиса не знают.

ОК>>Да никакой это не алгоритм. В смысле сложности, то есть. Нужно всего лишь помнить немного синтаксиса да иметь голову на плечах.
E>Что значит простого синтаксиса? Простой синтаксис компилятор проверяет. Даже до компиляции куча ошибок IDE подсветит. Проблем не будет, проблемы могут начаться после непростого синтаксиса.
Синтаксис надо знать. Например помнить что после объявления класса нужна точка с запятой или как написать производный класс. Я не говорю о каких-то там дебрях языка.

ОК>>До свидания сразу никто не скажет но я вообще не понимаю как можно извратить код такой функции чтобы струдом понимать что она делает. Такие тоже бывали. Пример с memcpy() я уже приводил. По-твоему такого человека надо было нанять?

E>С memcpy() конечно перебор (для копирования одного байта, как я понял ).
Правильно понял.

E>Но стоило хоть поинтересоваться для чего он так сделал. Вдруг в этом смысл какой, и от этого все станет в 100 раз быстрее и надежнее работать, а забраковали слишком умного .

Этот пример уже был последней каплей терпения. Ты просто не представляешь кто бывает на интервью.
Re[11]: собеседование
От: elmal  
Дата: 18.01.10 06:12
Оценка: +1
Здравствуйте, Олег К., Вы писали:

ОК>Нормальное. Большинство и такое не сделают а я не хочу (точнее не хотел уже) особо напрягать людей.

Итак, человек в простейшем задание не ошибся. Говорит ли это о его уровне, говорит ли это о том, что реальный код он будет писать нормально? Я считаю, что нет, и надо давать задание посложнее. Иначе возьмем тех, кого обычно берут (я про индуссокодеров в спагетти стиле, которых так любят нанимать), и потом их творчество расхлебывать.

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

Ну вполне логично что не помнят. В реальной работе некоторые вещи помнить не требуется, вот и не помнят. Помнят принципы, а не детали. То, что не помнят, говорит о том, что редко ходят по собеседованиям, а не то, что они плохо будут справляться с работой, так как умудрилтсь за 10 лет ни одной строчки не написать, не знают даже как класс отнаследовать, вместо вместо private priv написали, не скомпилится — явно человек первый раз в жизни программу пишет . На бумажке плохой почерк и куча помарок — значит и в коде будет черти что, да ?

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

Можно спросить, чем мне поможет память о том, когда нужно ставить точки с запятой а когда нет? У меня например в IDE, если я точку с запятой не поставлю, или поставлю лишние — сразу будет выдано предупреждение об этом, до компиляции. Как то давно уже на это внимание не обращаю. И синтаксис main я, каюсь, не помню, у меня в IDE есть шаблон, который генерит. На самом деле немного то я конечно помню, нак как писал более чем 100 раз, но далеко не факт, что я не ошибусь на собеседовании.
Re[15]: собеседование
От: elmal  
Дата: 18.01.10 09:13
Оценка: +1
Здравствуйте, Олег К., Вы писали:

ОК>Это почему тут должны быть предупреждения?

Лично у меня предупреждение выдала среда разработки — "if" statement has empty body here. У меня правда не С++ и не С.

E>>Хоть и отказался, но помню еще. Иной раз приходится использовать, так как альтернатив, увы, иногда нет.

ОК>Ты скоро такими темпами вообще откажешся от циклов и все будешь делать через метки, if-ы и goto.
Как раз наоборот. Все делаю через мапки, полиморфизм, итераторы и т.д. if и switch тоже довольно редко использую. Циклы использую, но с другим синтаксисом, но если бы писал на С#, то не использовал бы и их. Именно for (int i = 0; i < n; ++i) — такой использую редко, обычно использую for (MyType instance : someCollection). В С++ (точнее в STL), ЕМНИП, тоже есть for_each цикл.
Re[18]: собеседование
От: MozgC США http://nightcoder.livejournal.com
Дата: 18.01.10 13:08
Оценка: +1
Здравствуйте, LordMAD, Вы писали:

LMA>В качестве аналогии классический пример, что называется "из учебника": человек унаследовал класс квадрата от класса прямоугольника. Понятно, что я привожу искусственный пример, зато относительно наглядный.


Я конечно понимаю что вы начитались Роберта Мартина и его быструю разработку, и теперь все это стараетесь включить в вопросы на собеседованях, просто не забывайте что некоторые люди могут просто не знать умных названий и определений, но от этого они не обязательно становятся плохими специалистами. И даже наоборот, человек который вам перескажет главу из Боба Мартина по LSP и приведет все те примеры с прямоугольниками, квадратами, сетами и т.д. — не обязательно будет хорош на практике. Я знаю людей, которые не ответили бы на тот вопрос по LSP, но при этом у них по 10 лет опыта и они ПРЕКРАСНО делают свою работу. То же самое и по другим вашим вопросам. Что если человек не знает описание протокола kerberos? Все, он получается на архитектурный вопрос (это по вашему мнению) не ответил? А зачем вы собираетесь спрашивать вопросы о базах даннах в терминах реляционной алгебры? Разве кандидат у вас будет не c обычным SQL работать? Так может тогда лучше знания SQL и проверять? Дать к примеру задачку и попросить написать запрос ее решающий?
Re[13]: собеседование
От: ilvi Россия  
Дата: 19.01.10 03:46
Оценка: +1
Здравствуйте, Олег К., Вы писали:

ОК>Спрашиваю как внутри реализован std::list<>.


Можно узнать с какой целью задаются подобные вопросы?
Re[19]: собеседование
От: MescalitoPeyot Украина  
Дата: 19.01.10 08:38
Оценка: +1
Здравствуйте, Олег К., Вы писали:

ОК>И что, ты предлагаешь не помнить совсем синтаксис и полагаться на то что среда/компилятор подскажут или все-таки не допускать самому таких ситуаций в первую очередь? Я за последнее.


Я считаю что ситуаций в которых программисту надо о чем-то помнить, следить, обращать особое внимание должно быть как можно меньше. Надо ему пройтись по контейнеру от начала до конца — пусть так и пишет for each begin end, нужна длина строки — size; а все эти strlen'ы, char buffer[], +1, -1 — потенциальный багодром и на собеседовании лучше смотреть как соискатель умеет его избегать чем заставлять писать непривычный ему код и смотреть как он считает единички.

Точка с запятой вообще надуманная проблема, кода типа if (xxx); yyy(); ни разу не встречал, это может быть или неудачная копипаста или откровенное вредительство, но никак не результат незнания синтаксиса. В тоже время лично у меня половина ошибок первой компиляции если писать без IDE — пропущенная точка с запятой, забытые инклуды и std:/boost::. Смею вас заверить, где в С++ нужны/не нужны ';' и в каком пространстве лежит list/shared_ptr я знаю.
... << RSDN@Home 1.2.0 alpha 4 rev. 1138>>
Re[15]: собеседование
От: ilvi Россия  
Дата: 21.01.10 00:18
Оценка: +1
Здравствуйте, Олег К., Вы писали:

ОК>>>Спрашиваю как внутри реализован std::list<>.

I>>Можно узнать с какой целью задаются подобные вопросы?
ОК>Спрашиваю потому что считаю что программист должен знать стандартные структуры данных и понимать в каком случае лучше использовать ту или иную структуру данных. Ответить на этот вопрос занимает 20 секунд.
Одно дело знать структуры данных и представлять как они обычно должны быть устроенны, другое дело лезть в реализацию конкретного std::list от конкретного производителя и запоминать её. Мне к примеру список понадобился один/два раза всего, ввиду того что он мало подходит для моей деятельности. И мне как то приетит, из-за использования листа в двух местах, лесть и смотреть как его конкретно сделала Dinkumware. Или я тебя не правильно понял?

ОК>У тебя проблемы со структурами данных?

Нет .
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Re[12]: собеседование
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 21.01.10 15:05
Оценка: +1
Здравствуйте, LordMAD, Вы писали:

ОК>>Проблем у меня нету. Проблемы есть у тех кто так пишет!


LMA>Ну так расскажи мне — какие у меня и моих коллег проблемы!


Самые простые — в твоем коде нужно много времени что бы найти ошибку.

Переполнение то же проще найти.

ОК>>Вот что мне интересно — вы там также весь код пишите или это только для интервью?

LMA>Представляешь, весь код такой!

Сочувствую.
Re[14]: собеседование
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 21.01.10 15:50
Оценка: +1
Здравствуйте, LordMAD, Вы писали:

LMA>Давай угадаю – ты, конечно, считаешь, что главное — сделать так, чтобы любой вменяемый и аккуратный студент смог в любой момент включится в работу?


Да и это очень важно. Потому как часто бывает проекты кочуют между бригадами. Одн начали, другие продолжили.

Если код не прозрачный, то сразу начнется хаос
Re[3]: собеседование
От: LordMAD Россия  
Дата: 22.01.10 05:55
Оценка: :)
Здравствуйте, shrecher, Вы писали:

S>Здравствуйте, LordMAD, Вы писали:


LMA>>Напишите функцию, вычисляющую среднее значение двух любых значений типа int:

LMA>>int avg(int x, int y);

S>Есть люди теоретики, они ответят про переполнение и знаки. А есть люди — практики. Они просто сложат и поделят на два. Все-таки в программировании практики важнее, слишком приклодная отрасль. Для теоретиков тоже найдется работа, правда,не кодером.


Ничего подобного. Если человек просто сложит и поделит — это означает, что его код будет работать не в соответствии с тем заданием, которое он получил. То есть это баг. А зачем нужен программист, который на обычном сложении внесет в код баг? Единственная ситуация, при которой это допустимо — если команду в целом не сильно заботит — есть в программе баг или нет, ведь зато разработка обошлась чуть дешевле и бизнес проще масштабировать.
Re[13]: собеседование
От: LordMAD Россия  
Дата: 22.01.10 06:22
Оценка: :)
Здравствуйте, Ikemefula, Вы писали:

ОК>>>Проблем у меня нету. Проблемы есть у тех кто так пишет!


LMA>>Ну так расскажи мне — какие у меня и моих коллег проблемы!


I>Самые простые — в твоем коде нужно много времени что бы найти ошибку.


Ну тогда по твоей логике, правильный ответ должен быть
int avg(int x, int y) { return 0; }
Ведь в нем очень легко найти ошибку!

Если ты можешь предложить вариант решения, который (1) будет работать правильно для, как сказано в задании, "любых значений типа int" и (2) будет проще (хотя бы с точки зрения поиска ошибок) и при этом (3) не будет привязан к конкретной платформе — придложи и мы его обсудим.
Re[15]: собеседование
От: LordMAD Россия  
Дата: 22.01.10 07:27
Оценка: +1
Здравствуйте, Ikemefula, Вы писали:

LMA>>Давай угадаю – ты, конечно, считаешь, что главное — сделать так, чтобы любой вменяемый и аккуратный студент смог в любой момент включится в работу?


I>Да и это очень важно. Потому как часто бывает проекты кочуют между бригадами. Одн начали, другие продолжили.


Это важно для IT-шных McDonald's-ов, где главное, чтобы можно было набрать любых студентов, и они начали сразу приносить какую-то пользу, то есть когда главное — обеспечить качество не хуже такого-то, за деньги, не больше стольки-то.
Лично я предпочитаю их гамбургерам стейк с кровью из любимого ресторана.

I>Если код не прозрачный, то сразу начнется хаос


Вопрос, в том какой код считать прозрачным. Глупо пытаться писать код так, чтобы любой первоклассник, даже ни разу не видевший компьютер, мог понять ваш код. Соответственно, не важно, понимают ли код люди, которых мы не берем к себе на работу, важно, чтобы код понимали люди, которых мы берем. Более того, если опускать планку необходимых знаний для того, чтобы понимать этот код, код будет становиться менее понятным для квалифицированных сотрудников, потому что действительно важные для понимания кода вещи начнут тонуть в большом потоке информации.
Re[14]: собеседование
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 22.01.10 09:39
Оценка: +1
Здравствуйте, LordMAD, Вы писали:

I>>Самые простые — в твоем коде нужно много времени что бы найти ошибку.


LMA>Ну тогда по твоей логике, правильный ответ должен быть

LMA>int avg(int x, int y) { return 0; }
LMA>Ведь в нем очень легко найти ошибку!

(x+y)/2 (int)(((double)x+(double)y)/2)

любой из них будет проще

LMA>Если ты можешь предложить вариант решения, который (1) будет работать правильно для, как сказано в задании, "любых значений типа int"


твой то этому условию не удовлетворяет

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

Я сделал это минима трижды в этом топике.

P.S. ты даешь задачу на собеседовании, а сам придумал какие то свои критерии правильности.

Откуда собеседуемому знать, что у тебя особое мнение на тему коммутативности?
Re[17]: собеседование
От: LordMAD Россия  
Дата: 26.01.10 21:03
Оценка: -1
Здравствуйте, Ikemefula, Вы писали:

LMA>>Потому что округление до целых роисходит не так как ты предполагаешь?


I>Потому что ты нарушил основное свойство функции — коммутативность.


Еще раз: коммутативность выполняется c заданной точностью (с точностью до округления до целых).

LMA>>Ну так ткни носом, потому что я что-то таких не вижу.


I> Два из них было прямо в том сообщении на которое ты писал ответ. Более того — они был виден и в твоем тексте.


I>Мне интересно, на собеседовании ты тоже "скромно" не заметишь ответ ?


Я кажется начинаю догадываться: ты на полном серьезе думаешь, что "(x+y)/2" "будет работать правильно для, как сказано в задании, "любых значений типа int", то есть когда среднее значение двух положительных чисел получается отрицательным? А "(int)(((double)x+(double)y)/2)" "не будет привязан к конкретной платформе", то есть ты правда думаешь, что для ILP64 преобразование из int в double будет корректным?

LMA>>А в чем проблема? Если он напишет решение, которое будет верно и с моей точки зрения, и округление будет как тебе хочется, я такое решение засчитаю.


I>С даблами то решение тебе не нравится почему то


Хотя бы потому что нет способа запихнуть 64 бита в 53 бита без потерь.

I>>>Откуда собеседуемому знать, что у тебя особое мнение на тему коммутативности?


LMA>>Во-первых, если у него есть сомнения, он может спросить.


I>Во первых ты и сам не знал, что нарушил свойство коммутативности.


?

LMA>>Во-вторых, как я уже написал, если он использует другой вариант округления, задача тоже будет решена верно.


I>Во вторых тогда x/2 + y/2 тоже всего лишь другой вариант округления


Округление до целых подразумевает округление с точностью ±1, или ты не согласен?
Re[18]: собеседование
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 27.01.10 10:54
Оценка: :)
Здравствуйте, LordMAD, Вы писали:

I>>Потому что ты нарушил основное свойство функции — коммутативность.


LMA>Еще раз: коммутативность выполняется c заданной точностью (с точностью до округления до целых).


Это значит что коммутативность отсутствует.

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

LMA>Я кажется начинаю догадываться: ты на полном серьезе думаешь, что "(x+y)/2" "будет работать правильно для, как сказано в задании, "любых значений типа int", то есть когда среднее значение двух положительных чисел получается отрицательным?


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

Вот скажи, часто ли кандидатам приходится ставить тебя в известность типа "на этот вопрос ответ был даден дважды 15 и 5 минут назад" ?

LMA>А "(int)(((double)x+(double)y)/2)" "не будет привязан к конкретной платформе", то есть ты правда думаешь, что для ILP64 преобразование из int в double будет корректным?

I>>С даблами то решение тебе не нравится почему то
LMA>Хотя бы потому что нет способа запихнуть 64 бита в 53 бита без потерь.

Для 32х бит работает идеально.

LMA>>>Во-первых, если у него есть сомнения, он может спросить.


I>>Во первых ты и сам не знал, что нарушил свойство коммутативности.


LMA>?


Перечитай свою писанину.
Re[22]: собеседование
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 05.02.10 11:23
Оценка: +1
Здравствуйте, LordMAD, Вы писали:

LMA>Если ты сумеешь таки привести решение корректное и не зависимое от платформы, которое будет содержать меньше кода, тогда сможешь такое утверждать, а пока это bullshit.


Вроде уже было показано несколько недель назад, но на всякий случай еще раз

int avg(int a,int b)
{
return a/2 + b/2 + (a%2+b%2)/2;
}
Re[19]: собеседование
От: LordMAD Россия  
Дата: 05.02.10 11:34
Оценка: -1
Здравствуйте, Ikemefula, Вы писали:

LMA>>>>Нет, не так. Догадаешься как сравнивать надо?


I>>>при правильной реализации вот так, avg1 == avg2


LMA>>Да ну?


LMA>>


I>Именно так, потому что это сравнение целых.


Ладно, объясню на наглядном примере: представь девайс который измеряет температуру и у тебя есть функция которая возвращает показание прибора в °С в виде целого числа. Прибор пусть будет с низкой точностью (например, он на базе термопары на эффекте Зеебека) — возвращает результат с точностью до 1°С. Помещаем прибор в комнату, где поддерживается постоянная температура с достаточной точностью. Вопрос: исправен ли прибор, если функция возвращает тебе сначала 20, а потом 21? Корректно ли проверять правильность прибора, надеясь, что он будет возвращать одинаковые значения при неизменной температуре которую он измеряет?

LMA>>Так пусть тот, кто по глупости писал "avg1 == avg2" (потому что чего-то там себе напридумывал, чего в контракте нету) и исправляет свой баг. С тем же успехом он может и числа с плавающей точкой сравнивать через == ...


I>О чем и речь — твой мега-код влияет на сравнение целых чисел.


Он влиет не на сравнение целых чисел, а на сравнение результата этой функции с результатом этой функции. И ничего плохого в этом нет.
Re[20]: собеседование
От: elmal  
Дата: 05.02.10 12:31
Оценка: +1
Здравствуйте, LordMAD, Вы писали:

LMA>Ладно, объясню на наглядном примере: представь девайс который измеряет температуру и у тебя есть функция которая возвращает показание прибора в °С в виде целого числа. Прибор пусть будет с низкой точностью (например, он на базе термопары на эффекте Зеебека) — возвращает результат с точностью до 1°С. Помещаем прибор в комнату, где поддерживается постоянная температура с достаточной точностью. Вопрос: исправен ли прибор, если функция возвращает тебе сначала 20, а потом 21? Корректно ли проверять правильность прибора, надеясь, что он будет возвращать одинаковые значения при неизменной температуре которую он измеряет?

Мне страшно представить, во что превратится код, если для каждой из библиотечных функций мне придется беспокоиться о погрешности, и зависимости этой погрешности от входных параметров. Ну и далее — функция нахождения среднего, она имеет смысл для N элементов, а не для двух. Как ты будешь считать для трех элементов? А для пяти? Будешь хитрые спагетти из формул делать?
На практике лично я бы сделал так: Пытался бы привести к большему типу, а далее стандартной математической формулой (просуммировал и разделил на n. Прошу заметить — не на 2, а на n, так как программист должен знать 3 числа — 0, 1 и n). При необходимости кроссплатформенности — вначале проверил бы, что я действительно буду кастить к типу с большей разрядностью. Если компилятор не поддерживает типы с большей разрядностью, тут уже варианты. Самый простой — не допускать значений >= MAX_TYPE_VALUE/n. Если неприемлемо — вводил бы свои типы с большей разрядностью, а то и с неограниченной разрядностью. Но уж никак бы не стремился показать свои немерянные знания арифметики, что потом и сам черт ногу сломит в простейшем методе, и этой функцией пользоваться нельзя, так как из-за используемых хаков она округляет в случайную сторону. Но вообще, возникает вопрос — а почему в вашей мегафирме до сих пор нет библиотеки, которая вычисляет среднее? Почему каждый сотрудник обязан написать свою? Почему вы сами не в состоянии писать библиотеки, а доверяете это вновь прибывшим? Или у вас библиотек нет вообще? Библиотеки, вообще-то, пишутся достаточно редко, медленно, не в стрессовых условиях, и тщательно тестируются.

Да, кстати. Кого набираем и кто нужен? Я вот одно понял, кто действительно нужен работодателю. Это не тот, кто не ошибается в битах. Это не тот, кто знает язык назубок, включая подводные камни. А это тот, кто предугадывает проблемы на несколько лет вперед, и делая текущие таски пишет так, что чтоб если что надо было добавить — оно бы там уже было. Если каждый будет думать о будующем, будущее есть и у системы. А то иначе будет как у большинства — прекрасно работает система первый год, а через год сложность системы и объемы данных такими становятся, что тормозить не по детски все начинает, а оказывается, что фундамент забыли построить, а при добавлении новой функциональности забывали его укреплять. И намахнется все именно на продакшене, в самый ответственный момент. Учитесь у менеджеров — они всегда говорят, что программа должна быть написана так, чтобы если что потребовалось добавить или изменить, оно бы там уже было .
Re[24]: собеседование
От: shrecher  
Дата: 05.02.10 15:12
Оценка: +1
Здравствуйте, LordMAD, Вы писали:

I>>int avg(int a,int b)

I>>{
I>> return a/2 + b/2 + (a%2+b%2)/2;
I>>}

LMA>Да, это хорошее решение.


Увидил бы в коде такое "хорошее решение" заставил бы переписать.
Re[17]: собеседование
От: Roman Odaisky Украина  
Дата: 08.02.10 09:52
Оценка: :)
Здравствуйте, FR, Вы писали:

SA>>
SA>>Func<string, string> revFunc = sourceStr => new string(sourceStr.ToCharArray().Reverse().ToArray());
SA>>

SA>>пользуйтесь :)) Количество использованных паттернов предлагаю посчитать самостоятельно :))
SA>>Как видим, нормальные языки позволяют сосредоточиться на логике, а не на том, как передвигать каждую из сорока ножек :))

FR>std::reverse(Str.begin(), Str.end());


do_something(s.rbegin(), s.rend())
До последнего не верил в пирамиду Лебедева.
Re[26]: собеседование
От: elmal  
Дата: 08.02.10 16:24
Оценка: +1
Здравствуйте, LordMAD, Вы писали:

LMA>Как я писал с самого начала — этот вопрос именно по С/C++, не про алгоритмы и не про проектирование. Ты же пытаешься утверждать, что проектирование важнее знания языка.

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

LMA>В любом случае, от кандидата никто не требует идеального решения (его, кстати, нет) — требуется показать, что он владеет определенными навыками.

a/2+b/2 пойдет за нормальное решение? Или промежуточный кастинг к большему пройдет за нормальное решение? Если да, то хорошо. Если нет — тут уже очень большие вопросы.

LMA>Давай поподробнее про UB из стандартов C/C++, с которыми ты сталкивался "когда я еще на ассемблере писал"?

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

LMA>А я вообще не вижу причин не жертвовать тем, что не требуется. И в данном конкретном случае — сравнивать результаты можно.

Можно спросить, как сравнивать результаты? Я вижу один путь, вводить функцию isEquals(int a, int b), возвращающую true если разница между аргументами не превышает 1. Как минимум очень спорное решение, погрешность схлопочем на пустом месте. Для нормального сравнения целых она не годится, потому функцию придется назвать isAvgEquals(int a, int b), что маразм, вообще-то. Да и не спасет эта функция, придется рассчитывать на внимательность, что вызовут ее, а не оператор сравнения, что является стандартом для целочисленных типов.
собеседование
От: errest  
Дата: 13.01.10 18:37
Оценка:
Какие тестовые задания могут дать на C/C++?
Нужны простенькие — типа сортировки массива и найти ошибки
Re: собеседование
От: placement_new  
Дата: 13.01.10 18:55
Оценка:
Здравствуйте, errest, Вы писали:

E>Какие тестовые задания могут дать на C/C++?

E>Нужны простенькие — типа сортировки массива и найти ошибки
Ну например, написать реверс строки или перевод из одной системы счисления в другую, подсчитать число единичек в байте.
Re: собеседование
От: Vamp Россия  
Дата: 13.01.10 19:06
Оценка:
E>Какие тестовые задания могут дать на C/C++?
Какие угодно. Это неважно. На нормальном собеседовании тест — всего лишь предмет для разговора, чтобы было, с чего начать.
Да здравствует мыло душистое и веревка пушистая.
Re[2]: собеседование
От: Handie  
Дата: 13.01.10 19:32
Оценка:
Здравствуйте, placement_new, Вы писали:

_>Здравствуйте, errest, Вы писали:


E>>Какие тестовые задания могут дать на C/C++?

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

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

То же самое и с подсчетом единичек. Оптимальное решение — lookup table c 8 или 16 битными "чанками". Ну и тест на "лоха" с << и | в цикле.

Все это тесты начинающих кодеров
Re[3]: собеседование
От: placement_new  
Дата: 13.01.10 19:37
Оценка:
H>Все это тесты начинающих кодеров

А в каком месте его поста, Вы посчитали, что он на синьора претендует?
Re[3]: собеседование
От: errest  
Дата: 14.01.10 08:19
Оценка:
H> Ну и тест на "лоха" с << и | в цикле.
Ты здесь что имеешь ввиду?
Re[4]: собеседование
От: placement_new  
Дата: 14.01.10 08:23
Оценка:
Здравствуйте, errest, Вы писали:

H>> Ну и тест на "лоха" с << и | в цикле.

E>Ты здесь что имеешь ввиду?

Видимо то, что если ты сделаешь не через табличку а через последовательный сдвиг и наложение маски, то "там наверху тебя окрестят лохом"
Re: собеседование
От: StandAlone  
Дата: 14.01.10 10:57
Оценка:
Здравствуйте, errest, Вы писали:

E>Какие тестовые задания могут дать на C/C++?

E>Нужны простенькие — типа сортировки массива и найти ошибки

Копирование многосвязного списка, к примеру.
И разработать аналог boost::shared_array
Re: собеседование
От: LordMAD Россия  
Дата: 14.01.10 13:25
Оценка:
Здравствуйте, errest, Вы писали:

E>Какие тестовые задания могут дать на C/C++?

E>Нужны простенькие — типа сортировки массива и найти ошибки

Напишите функцию, вычисляющую среднее значение двух любых значений типа int:
int avg(int x, int y);

Предположим, что у Вас есть некий класс, реализующий идиому pimpl. Требуется реализовать для него эффективную специализацию функции swap.
Re: собеседование
От: sergey2b ЮАР  
Дата: 14.01.10 14:35
Оценка:
Здравствуйте, errest, Вы писали:

одна из компаний давала написать простой интопритатор с ваис подобного языка (перед приходом на собеседование)
Re[5]: собеседование
От: StandAlone  
Дата: 14.01.10 14:43
Оценка:
Здравствуйте, errest, Вы писали:

PG>>Так оно и есть. Я эту задачу (реверс строки) всегда задаю первой в технической части интервью. И в зависимости от того решает или нет и как решает строится дальнейший разговор.

PG>>И я всегда поражаюсь сколько людей не могут решить эту задачу с первого раза (без подсказок). Причём это не всегда студенты, а люди и с 2-3 летним "опытом" на С.

E>то есть надо что-то вроде этого:

E>#include <stdio.h>
E>#include <string.h>


E>void main()

E>{
E> char a[100],b[100];

E> gets(a);

E> for (int i=0; i<strlen(a); i++)
E> {
E> b[i]=a[strlen(a)-i-1];
E> }
E> b[strlen(a)] = 0;
E> puts(b);
E>}




void __fastcall Reverse(char* src)
{
    if(NULL==src)
       throw new string("Sanity check failed.");
    int strLen=strlen(src);
    for(int i=0;i<strLen/2;++i)
    {
       src[strLen]=src[i];
       src[i]=src[strLen-i-1];
       src[strLen-i-1]=src[strLen];
    }
}
Re[6]: собеседование
От: denisko http://sdeniskos.blogspot.com/
Дата: 14.01.10 14:47
Оценка:
Здравствуйте, StandAlone, Вы писали:

Вы соревнуетесь в том, кто быстрее отымеет мозг интервьюеру чтоли?
<Подпись удалена модератором>
Re[7]: собеседование
От: StandAlone  
Дата: 14.01.10 14:57
Оценка:
Здравствуйте, denisko, Вы писали:

D>Здравствуйте, StandAlone, Вы писали:


D>Вы соревнуетесь в том, кто быстрее отымеет мозг интервьюеру чтоли?


Собеседование — дело такое, тут надо успеть отыметь моцк интервьюеру, пока интервьюер не отымел моцк тебе... :-D
А реально, я просто привык пользоваться семантикой массивов в применении к указателям.
Удобно и нагляднее, чем все эти жуткие разыменования указателей:

  char * start=src;
  char *end=src+strlen(src);
  while(start<end)
  {
    char temp=*end; 
    *end=*start;
    *start=temp;
    start++;end--;
  }
Re[8]: собеседование
От: denisko http://sdeniskos.blogspot.com/
Дата: 14.01.10 15:05
Оценка:
Здравствуйте, StandAlone, Вы писали:

В прошлом примере ты очень изящно и неуйстойчиво уронил приложение.
<Подпись удалена модератором>
Re[5]: собеседование
От: Sanik Россия http://sergeysthoughts.blogspot.com/
Дата: 14.01.10 15:08
Оценка:
Здравствуйте, errest, Вы писали:

PG>>Так оно и есть. Я эту задачу (реверс строки) всегда задаю первой в технической части интервью. И в зависимости от того решает или нет и как решает строится дальнейший разговор.

PG>>И я всегда поражаюсь сколько людей не могут решить эту задачу с первого раза (без подсказок). Причём это не всегда студенты, а люди и с 2-3 летним "опытом" на С.

E>то есть надо что-то вроде этого:

E>#include <stdio.h>
E>#include <string.h>


E>void main()

E>{
E> char a[100],b[100];

E> gets(a);

E> for (int i=0; i<strlen(a); i++)
E> {
E> b[i]=a[strlen(a)-i-1];
E> }
E> b[strlen(a)] = 0;
E> puts(b);
E>}

ударим gets()-ом по фиксированному малоразмрному буферу!!!

... на лозунг сойдт?
... << RSDN@Home 1.2.0 alpha 4 rev. 1253>>
Re[9]: собеседование
От: StandAlone  
Дата: 14.01.10 15:10
Оценка:
Здравствуйте, denisko, Вы писали:

D>Здравствуйте, StandAlone, Вы писали:


D>В прошлом примере ты очень изящно и неуйстойчиво уронил приложение.


Ага . И на эту тему с интервьюером можно поговорить столько, что он забудет про все свои дурацкие задачки на подсчеты битов.
Re[5]: собеседование
От: kosmik Россия http://www.linkedin.com/in/kosmik
Дата: 14.01.10 15:30
Оценка:
Сакральный смысл очень прост — умение решать задачки — вполне нормальный proxy ( http://en.wikipedia.org/wiki/Proxy_(statistics) ) для способностей кандидата. То, что кандидату не придется решать такую или подобные задачи в реальном проекте ничего не меняет.
Re[5]: собеседование
От: Handie  
Дата: 14.01.10 15:31
Оценка:
>то есть надо что-то вроде этого:
E>#include <stdio.h>
E>#include <string.h>


E>void main()

E>{
E> char a[100],b[100];

E> gets(a);

E> for (int i=0; i<strlen(a); i++)
E> {
E> b[i]=a[strlen(a)-i-1];
E> }
E> b[strlen(a)] = 0;
E> puts(b);
E>}

Плохое решение.
1) никто не просил писать программу с вводом и выводом, достаточно написать функцию
const char* strrev(const char *src);
не для майна задачка

2) задача решается in-place, без двух буфферов

3) существуют указатели и *begin++ = *end-- выглядит симпатичней
В реале
char tmp = *begin;
*begin++ = *end;
*end-- = tmp;
Re[6]: собеседование
От: sergey2b ЮАР  
Дата: 14.01.10 16:36
Оценка:
Здравствуйте, Handie, Вы писали:

H>3) существуют указатели и *begin++ = *end-- выглядит симпатичней

H>В реале
H>char tmp = *begin;
H>*begin++ = *end;
H>*end-- = tmp;

на такое решение обычно говорят а теперь тоже самое без char tmp (типо через XOR)
Re[6]: собеседование
От: StandAlone  
Дата: 14.01.10 16:39
Оценка:
Здравствуйте, kosmik, Вы писали:

K>Сакральный смысл очень прост — умение решать задачки — вполне нормальный proxy ( http://en.wikipedia.org/wiki/Proxy_(statistics) ) для способностей кандидата. То, что кандидату не придется решать такую или подобные задачи в реальном проекте ничего не меняет.


Да неужели? КАКИХ способностей? Решать задачки? Особенно такие — на подсчет битов — наследие тех времен, когда динозавры были большие, вулканы высокие, а все программирование сводилось к "Численные методы решения задач на ЭВМ"?

-Э-э-эй, ты, бородатый! Ты что мне дал?! Это же великая теорема Ферма!


Вы, когда мастеров-плиточников на работу нанимаете, тоже им задачки "собери 2 квадратных метра из 4 плиток" подкидываете? Или летку-еньку станцевать просите?
Re[3]: собеседование
От: LuciferSaratov Россия  
Дата: 14.01.10 18:02
Оценка:
Здравствуйте, Handie, Вы писали:


LMA>>Напишите функцию, вычисляющую среднее значение двух любых значений типа int:

LMA>>int avg(int x, int y);

H>Вы нанимаете умственно отсталых инвалидов?


Чисто ради интереса, вот ты бы как реализовал такую функцию?
Re[7]: собеседование
От: kosmik Россия http://www.linkedin.com/in/kosmik
Дата: 14.01.10 20:11
Оценка:
SA>Да неужели? КАКИХ способностей? Решать задачки? Особенно такие — на подсчет битов — наследие тех времен, когда динозавры были большие, вулканы высокие, а все программирование сводилось к "Численные методы решения задач на ЭВМ"?

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

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

SA>Вы, когда мастеров-плиточников на работу нанимаете, тоже им задачки "собери 2 квадратных метра из 4 плиток" подкидываете? Или летку-еньку станцевать просите?


Ничего не могу сказать, я в другой области работаю
Re[3]: собеседование
От: kosmik Россия http://www.linkedin.com/in/kosmik
Дата: 14.01.10 20:18
Оценка:
H>Вы нанимаете умственно отсталых инвалидов?

Задания показывают не то, кого нанимают, а кого не нанимают
Re[10]: собеседование
От: Ytz https://github.com/mtrempoltsev
Дата: 14.01.10 21:33
Оценка:
Здравствуйте, StandAlone, Вы писали:

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


Не в обиду, но вы написали два варианта решения элементарной задачи и не один из них не работает, не понятно о чем вообще после этого говорить.
Re[2]: собеседование
От: Ytz https://github.com/mtrempoltsev
Дата: 14.01.10 21:54
Оценка:
Здравствуйте, LordMAD, Вы писали:

LMA>Напишите функцию, вычисляющую среднее значение двух любых значений типа int:

LMA>int avg(int x, int y);

А подвох в чем? В проверке на переполнение, округлении результата деления или использовании сдвига вместо деления?
Re: собеседование
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 14.01.10 23:13
Оценка:
Здравствуйте, errest, Вы писали:

E>Какие тестовые задания могут дать на C/C++?

E>Нужны простенькие — типа сортировки массива и найти ошибки

Скажем просто: если у тебя нет практического опыта работы на C++ (и на C), то любой тест может оказаться камнем преткновения. Если есть, то ты всегда найдёшь, как обойти потенциально острые углы.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[6]: собеседование
От: Олег К.  
Дата: 15.01.10 01:33
Оценка:
E>ИМХО история у всех этих задачь такова — по этим задачам гоняли в институте. Далее, кто-то попал на работу, оказался набирающим. Как определять квалификацию не знает, и не находит ничего лучшего, как использовать те же критерии оценки, какие были в институте. Далее появляются первые люди под его началом, те снова начинают набирать людей. И снова не знают что спрашивать, и спрашивают именно так, как их гоняли в институте. Ситуация усугубляется тем, что часто народ становится начальниками, так и не научившись программировать, так и не поняв, а что же главное в профессии разработчика и что реально ему требуется в работе.
А ты знаешь? Я видел уже пример твоего идеального интервью.

По мне, так перевернуть строку лучше чем радикс сорт. Если ты такой крутой в программировании, то тебе раз плюнуть перевернуть строку. Не так ли?

E>Мне вообще веселит, как набирают. Человека с 10 летним опытом будут гонять по задачкам, которыми в институте гоняют, и наоборот, студента без опыта будут просить спроектировать систему, спрашивать о роли в прошлых проектах и т.д .

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

Я тоже давал задачку перевернуть строку на интервью. Один из последних кого я интервьюировал, чувак с многолетним опытом, использовал memcpy() (!) чтобы скопировать char. Сейчас со мной сидит чувак как раз с 10-летним опытом программирования на плюсах и время от времени задает мне вопросы по этому языку. Я, в принципе, не против но некоторые его перлы убивают просто. Один из его перлов: "почему я возвращаю ссылку на локальный объект и код не работает?" И аналогичных вопросов — порядком и я не преувеличиваю. А ты говоришь что синьйоров не надо проверять на знания языка. Впрочем, как погляжу, для тебя это больная тема.
Re[7]: собеседование
От: MozgC США http://nightcoder.livejournal.com
Дата: 15.01.10 01:43
Оценка:
Здравствуйте, Олег К., Вы писали:

ОК>Я не думаю что кто-либо будет спрашивать студентов о ролях в предыдущих проектах, но меня откровенно умиляют заявления что человека с 10-летним опытом знания плюсов спрашивать не нужно.

ОК>А ты говоришь что синьйоров не надо проверять на знания языка. Впрочем, как погляжу, для тебя это больная тема.

Он же вроде говорил про алгоритмы, а не знания языка. Лично я например уже около 5 лет на C# пишу, и действительно низкоуровневые алгоритмы мне по работе писать практически не приходится. И получается, что на собеседовании меня сольет какой-нибудь чел, попросивший написать быструю сортировку (ну да, честно скажу — не помню, может лет 5 назад и использовал еще в универе в лабораторной какой-нибудь), и потом еще будет удивляться и тыкать мне как это я 5 лет работаю, когда не знаю даже алгоритма быстрой сортировки.
Re[2]: собеседование
От: Sitrix Россия  
Дата: 15.01.10 02:03
Оценка:
Здравствуйте, Ulitka, Вы писали:

U>Здравствуйте, errest, Вы писали:


E>>Какие тестовые задания могут дать на C/C++?

E>>Нужны простенькие — типа сортировки массива и найти ошибки

U>Мне очень нравятся string similarity алгоритмы (http://www.dcs.shef.ac.uk/~sam/stringmetrics.html).

U>Вряд-ли кто-то ответит что-то вменяемое, если никогда с этим не сталкивался

Т.е. сразу дать понять что вы его завалили, и меньше предлагать зп?
Re[3]: собеседование
От: LordMAD Россия  
Дата: 15.01.10 06:22
Оценка:
Здравствуйте, Handie, Вы писали:


LMA>>Напишите функцию, вычисляющую среднее значение двух любых значений типа int:

LMA>>int avg(int x, int y);

H>Вы нанимаете умственно отсталых инвалидов?


Нет, просто мы не нанимаем людей, которые на ровном месте спотыкаются об UB или implementation-defined resulting value.
Кстати, когда этот вопрос использовали на собеседовании, количество людей, которые сходу писали верный результат, не превышало 10% для позиций с уровнем зарплаты выше среднего по городу.

LMA>>Предположим, что у Вас есть некий класс, реализующий идиому pimpl. Требуется реализовать для него эффективную специализацию функции swap.


H>Бред какой-то


А что конкретно не нравится?
Re[3]: собеседование
От: LordMAD Россия  
Дата: 15.01.10 06:28
Оценка:
Здравствуйте, Ytz, Вы писали:

LMA>>Напишите функцию, вычисляющую среднее значение двух любых значений типа int:

LMA>>int avg(int x, int y);

Ytz>А подвох в чем? В проверке на переполнение, округлении результата деления или использовании сдвига вместо деления?


Большинство кандидатов спотыкались на §5/5 для C++03 (ISO 14882-2003) и §6.5/5 для C99 (ISO 9899-TC3), и, соответственно, §5.8/3 для C++03 и §6.5.7/5 для C99. Но, как уже тут писали, любое задание — всего лишь повод для разговора.
Re[4]: собеседование
От: Handie  
Дата: 15.01.10 06:37
Оценка:
Здравствуйте, LordMAD, Вы писали:

LMA>Здравствуйте, Handie, Вы писали:



LMA>>>Напишите функцию, вычисляющую среднее значение двух любых значений типа int:

LMA>>>int avg(int x, int y);

H>>Вы нанимаете умственно отсталых инвалидов?


LMA>Нет, просто мы не нанимаем людей, которые на ровном месте спотыкаются об UB или implementation-defined resulting value.

LMA>Кстати, когда этот вопрос использовали на собеседовании, количество людей, которые сходу писали верный результат, не превышало 10% для позиций с уровнем зарплаты выше среднего по городу.

Может я отношусь к 10% особо талантливых людей, рискну написать функцию среднего двух интов:
int avg(int x, int y) { return (x+y)/2; };

В чем я не прав?
Re[5]: собеседование
От: elmal  
Дата: 15.01.10 06:48
Оценка:
Здравствуйте, Handie, Вы писали:

H>В чем я не прав?

У интов ограничение по разрядности, вообще-то. При сложении очень вероятно получим отрицательное значение, поделив на 2 результат тоже будет отрицательный.
Re[9]: собеседование
От: LordMAD Россия  
Дата: 15.01.10 06:51
Оценка:
Здравствуйте, MozgC, Вы писали:

MC>Вообще такие споры по поводу вопросов на собеседовании и, в частности, вопросов по различным алгоритмам возникают из-за того, что все мы работаем с разными вещами, и увлекаемся тоже разными вещами. Кому-то по работе часто нужно писать эффективные достаточно низкоуровневые алгоритмы обработки данных, кто-то увлекается решением алгоритмических задач и этюдов, и соответственно будет задавать такие вопросы на собеседовании. А кто-то работает с более высокоуровневыми вещами и решает совсем другие проблемы. Мне, например, сейчас нужно продумать дизайн веб-сервиса для сотен наших клиентов, и продумать его так, чтобы сотни клиентов могли потом долго этим веб-сервисом пользоваться, встраивая работу с ним в свой внутренний софт. И сделать нужно так, чтобы через неделю не оказалось, что что-то не продумано, или что-то надо переделать так, что у клиентов код использующий наш веб-сервис перестанет работать. Или чтобы не пришлось писать через неделю всем клиентам письма, сообщая "вы знаете, мы тут кое что добавили/переделали в нашем веб-сервисе" или "доводим до вашего сведения, что теперь этот метод может выбрасывать такое-то исключение". Но при этом алгоритм быстрой сортировки я не помню. У меня просто другие задачи.


У нас, например, для каждой вакансии формируется список тем, и для каждой из них задается приоритет в рамках этой вакансии. Соответственно для каждой из тем, кандидату задается минимум один вопрос (или больше, если одного вопроса недостаточно для принятия решения о квалификации в данной теме). Например, для рядового разработчика список тем может быть таким:
1. Алгоритмы
2. Архитектура и проектирование
3. Системы счисления и булева алгебра
4. Объектно-ориентированное программирование
5. Программирование на языке C
6. Программирование на языке С++
7. Базы данных
8. Разработка под ОС Windows
9. Продвинутый пользователь ОС Windows
10. Автоматизированное тестирование
11. Отладка
12. Составление спецификаций и анализ требований
13. Документирование кода
14. Сопровождение кода
Re[11]: собеседование
От: errest  
Дата: 15.01.10 07:25
Оценка:
Ytz>Не в обиду, но вы написали два варианта решения элементарной задачи и не один из них не работает, не понятно о чем вообще после этого говорить.
Ты можешь привести один — но что бы он работал
Re[10]: собеседование
От: hrensgory Россия  
Дата: 15.01.10 07:41
Оценка:
LordMAD пишет:
>

> У нас, например, для каждой вакансии формируется список тем, и для

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

(длинный список skipped)

Прикольно. Вы специализируетесь на разработке софта или просто на найме
Самых Лучших Читателей Самых Умных Книг?

Есть конечно вариант что для прохода уровня "автоматизированное
тестирование" достаточно просто громко произнести ключевое слово
"юнит-тест", но тогда к чему такое перечисление?

--
WBR,
Serge.
Posted via RSDN NNTP Server 2.1 beta
Re[11]: собеседование
От: LordMAD Россия  
Дата: 15.01.10 08:02
Оценка:
Здравствуйте, hrensgory, Вы писали:

H>Прикольно. Вы специализируетесь на разработке софта или просто на найме

H>Самых Лучших Читателей Самых Умных Книг?

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

H>Есть конечно вариант что для прохода уровня "автоматизированное

H>тестирование" достаточно просто громко произнести ключевое слово
H>"юнит-тест", но тогда к чему такое перечисление?

Примеры из тем "Программирование на языке C" и "Программирование на языке С++" я привел выше — можете посмотреть, чтобы составить впечатление о вопросах.
Re[7]: собеседование
От: LordMAD Россия  
Дата: 15.01.10 09:46
Оценка:
Здравствуйте, Codechanger, Вы писали:

C>Самое смешное, что данный вариант не во всех случаях корректно отработает .


Это в каких?
Re[5]: собеседование
От: StandAlone  
Дата: 15.01.10 12:16
Оценка:
Здравствуйте, Handie, Вы писали:

LMA>>Большинство кандидатов спотыкались на §5/5 для C++03 (ISO 14882-2003) и §6.5/5 для C99 (ISO 9899-TC3), и, соответственно, §5.8/3 для C++03 и §6.5.7/5 для C99. Но, как уже тут писали, любое задание — всего лишь повод для разговора.


H>Вы просили кандидатов продекламировать эти параграфы наизусть или пересказать своими словами?


Спеть, с выражением и стоя на табуретке...
Слегка отвлекусь в сторону — из чисто моего опыта прохождения собеседований.
Контора, в которой гоняли на собеседованиях особенно сильно — три экзамена на брейнбенче, задачки на листе бумаги с сортировкой выбором и тракторами, пашущими поле, затем собеседование с двумя сеньорами и предложения написать intrusive_ptr опять же на бумажке — оказалась самой говенной потовыжималкой.
Узнал об этом, встретив через год человека уже там поработавшего. Уровень зарплат вдвое ниже рынка, временные штрафы — не уложился в сроки выполнения задачи, сброшенные тим-лидом в трекер, будь любезен отрабатывай это время, иначе накажут денежно
Как вы думаете, это случайное совпадение?
Re[6]: собеседование
От: LordMAD Россия  
Дата: 15.01.10 12:20
Оценка:
Здравствуйте, StandAlone, Вы писали:

SA>Контора, в которой гоняли на собеседованиях особенно сильно — три экзамена на брейнбенче, задачки на листе бумаги с сортировкой выбором и тракторами, пашущими поле, затем собеседование с двумя сеньорами и предложения написать intrusive_ptr опять же на бумажке — оказалась самой говенной потовыжималкой.


И сколько времени проходили такие собеседования?
Re[5]: собеседование
От: StandAlone  
Дата: 15.01.10 12:23
Оценка:
Здравствуйте, Handie, Вы писали:


H>Может я отношусь к 10% особо талантливых людей, рискну написать функцию среднего двух интов:

H>int avg(int x, int y) { return (x+y)/2; };

H>В чем я не прав?


А он сейчас вызовет ее с аргументами (2^32-1,2^32-1), после чего будет весело смеяться и декламировать вслух параграф §6.5/5 для ISO 9899-TC3.

И дикий же народ!

Re[7]: собеседование
От: StandAlone  
Дата: 15.01.10 12:26
Оценка:
Здравствуйте, LordMAD, Вы писали:

LMA>И сколько времени проходили такие собеседования?


У меня заняло три дня. День на брейнбенч — Основы ООП, С++ и SQL. День на задачки, ну и на третий день — беседа с сеньорами.
Re[8]: собеседование
От: UA Украина  
Дата: 15.01.10 12:31
Оценка:
Здравствуйте, LordMAD, Вы писали:

LMA>Здравствуйте, Codechanger, Вы писали:


C>>Самое смешное, что данный вариант не во всех случаях корректно отработает .


LMA>Это в каких?


переполнение типа int при сложении чисел близких к INT_MAX?
Re[8]: собеседование
От: LordMAD Россия  
Дата: 15.01.10 12:33
Оценка:
Здравствуйте, StandAlone, Вы писали:

LMA>>И сколько времени проходили такие собеседования?


SA>У меня заняло три дня. День на брейнбенч — Основы ООП, С++ и SQL. День на задачки, ну и на третий день — беседа с сеньорами.


Офигеть. И что — целый день говорил с сеньорами? Тогда видимо классно у них сеньоры работают — если по целому дню на кандидата.
Re[9]: собеседование
От: LordMAD Россия  
Дата: 15.01.10 12:35
Оценка:
Здравствуйте, UA, Вы писали:

C>>>Самое смешное, что данный вариант не во всех случаях корректно отработает .


LMA>>Это в каких?


UA>переполнение типа int при сложении чисел близких к INT_MAX?


И где в коде, который я привел сложение чисел, близких к INT_MAX?
Re[6]: собеседование
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 15.01.10 12:38
Оценка:
Здравствуйте, LordMAD, Вы писали:

LMA>Вариант решения:

LMA>int sign(int a) { return (a < 0) ? -1 : 1; }
LMA>int avg(int x, int y) { return (sign(x) == sign(y)) ? x+(y-x)/2 : (x+y)/2; }

Первый вариант, который пришел мне в голову до твоего ответа был вот такой

int avg(int x, int y) { return x/2 + y/2; }

Правда он будет давать немого более другие средние значения.
Re[7]: собеседование
От: LordMAD Россия  
Дата: 15.01.10 12:44
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Первый вариант, который пришел мне в голову до твоего ответа был вот такой


I>int avg(int x, int y) { return x/2 + y/2; }


I>Правда он будет давать немого более другие средние значения.


Ну да, то, что в этом случае avg(3, 5) == 3 или avg(7, 7) == 6, не здорово.
Re[9]: собеседование
От: StandAlone  
Дата: 15.01.10 13:07
Оценка:
Здравствуйте, MozgC, Вы писали:

MC>... И сделать нужно так, чтобы через неделю не оказалось, что что-то не продумано, или что-то надо переделать так, что у клиентов код использующий наш веб-сервис перестанет работать. Или чтобы не пришлось писать через неделю всем клиентам письма, сообщая "вы знаете, мы тут кое что добавили/переделали в нашем веб-сервисе" или "доводим до вашего сведения, что теперь этот метод может выбрасывать такое-то исключение". Но при этом алгоритм быстрой сортировки я не помню. У меня просто другие задачи.


Ну вот. А кому-то в свое время численные методы забили в голову настолько глубоко, что они там застряли навечно. И главным, по их мнению, для программиста оказывается умение считать биты, среднее арифметическое или там сумму ряда. А потом пишут веб-сервисы на C++\CGI за несколько человеко-лет
Re[12]: собеседование
От: hrensgory Россия  
Дата: 15.01.10 13:21
Оценка:
LordMAD пишет:

> Примеры из тем "Программирование на языке C" и "Программирование на

> языке С++" я привел выше — можете посмотреть, чтобы составить
> впечатление о вопросах.

О вопросах по С/С++ вопросов нет. Смысл примера с целыми ясен, а что
такое "класс, реализующий идиому pimpl" и "эффективная специализация
функции swap для него" я просто не знаю.

Вопросы о том, что именно при условии правильного ответа на них вы
рассчитываете услышать по следующим темам:

2. Архитектура и проектирование
4. Объектно-ориентированное программирование
7. Базы данных
10. Автоматизированное тестирование
12. Составление спецификаций и анализ требований


--
WBR,
Serge.
Posted via RSDN NNTP Server 2.1 beta
Re[4]: собеседование
От: denisko http://sdeniskos.blogspot.com/
Дата: 15.01.10 13:49
Оценка:
Здравствуйте, ProgrammerG, Вы писали:

PG>Здравствуйте, Handie, Вы писали:


H>>Здравствуйте, placement_new, Вы писали:


_>>>Здравствуйте, errest, Вы писали:


E>>>>Какие тестовые задания могут дать на C/C++?

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

H>>Реверс строки я уже писал на трех-четырех собеседованиях и делаю это исключительно по памяти — своп двух указателей идущих навстречу друг другу. Это старый баян, его знают почти все, тест на "лоха".


H>>То же самое и с подсчетом единичек. Оптимальное решение — lookup table c 8 или 16 битными "чанками". Ну и тест на "лоха" с << и | в цикле.


H>>Все это тесты начинающих кодеров


PG>Так оно и есть. Я эту задачу (реверс строки) всегда задаю первой в технической части интервью. И в зависимости от того решает или нет и как решает строится дальнейший разговор.

Хорошо, что ты эту задачу только сишникам, а не плюсовикам задаешь
<Подпись удалена модератором>
Re[5]: собеседование
От: ProgrammerG  
Дата: 15.01.10 14:19
Оценка:
Здравствуйте, StandAlone, Вы писали:

SA>Здравствуйте, ProgrammerG, Вы писали:



PG>>Так оно и есть. Я эту задачу (реверс строки) всегда задаю первой в технической части интервью. И в зависимости от того решает или нет и как решает строится дальнейший разговор.

SA>...без выделения дополнительной памяти?
Да именно так. Причём ниже как раз подтвердили почему такие задачи до сих пор актуальны.

PG>>И я всегда поражаюсь сколько людей не могут решить эту задачу с первого раза (без подсказок). Причём это не всегда студенты, а люди и с 2-3 летним "опытом" на С.

SA>А какой сакральный смысл в подсчете единичек и замене lookup table на битовый сдвиг(или деление по модулю 2) и наложение маски?
Ну во-первых надо с чего то начать разговор. Спрашивать сухую теорию типа 4-х постулатов ОО не лучшая замена. Убрать вообще техническую составляющую из собеседования то же не правильно.
Во вторых, убеждён что человек который занимается системным программирванием (а я ищу именно таких, а не формочки рисовать) должен знать как устроено то чем он пользуется. Даже если в реальной жизни он будет пользоваться только библиотеками. Более того написание любого кода на собеседовании считаю правильным.
В третьих, это показывает как человек пишет код — стилистика, сразу бросается или сначала думает, проверяет ли его перед тем как показать мне и т.д.
Чем проще задача — тем лучше. Не давать же написать реальный кусок проекта.

SA>Как они помогут в реальном проекте, когда надо будет оптимизировать какой-нибудь алгоритм Левенштайна, или спектрально-корреляционное преобразование(чисто навскидку крайние задачи, для которых пришлось использовать unmanaged. Подставьте сюда свои реальные задачи, тысячи их...)

SA>?
SA>Человеку со склонностью к математике проще решить через деление и маску. Человеку со склонностью к архитектуре и дизайну такие задачи вообще за разумное время решить сложно, паттерны здесь не применишь.
SA>Итого, кто остается? На поиск кого они заточены — "начинающих кодеров", которые будут пахать за миску доширака от забора и до обеда?

Ну причём тут миска. Да речь идёт о начинающих или с опытом до 3-х лет. Конечно человеку с 10-ти летним опытом будут задаваться другие вопросы.
Re[7]: собеседование
От: alzt  
Дата: 15.01.10 15:24
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Здравствуйте, LordMAD, Вы писали:


LMA>>Вариант решения:

LMA>>int sign(int a) { return (a < 0) ? -1 : 1; }
LMA>>int avg(int x, int y) { return (sign(x) == sign(y)) ? x+(y-x)/2 : (x+y)/2; }

I>Первый вариант, который пришел мне в голову до твоего ответа был вот такой


I>int avg(int x, int y) { return x/2 + y/2; }


А мне вот этот вариант:

int is_odd(int x) {
    return x & 1;
}

int avg_my(int x, int y) { 
    return x/2 + y/2 + is_odd(x & y); 
}
Re[9]: собеседование
От: Handie  
Дата: 15.01.10 17:06
Оценка:
LMA>Офигеть. И что — целый день говорил с сеньорами? Тогда видимо классно у них сеньоры работают — если по целому дню на кандидата.

У меня в Google было шесть собеседований, явно не с джуниорами. Каждый из них потратил 30-45 минут, я потратил два дня. У некоторых интервьюеров были бумажки со списком вопросов и задачек — видимо они для себя шпаргалок наделали или в конторе есть корпоративный "хелп".
Re[12]: собеседование
От: Ytz https://github.com/mtrempoltsev
Дата: 15.01.10 17:07
Оценка:
Здравствуйте, StandAlone, Вы писали:

SA>Без обид, но ни, и "непонятно". Так вот, непонятно, вам шашечки или ехать?


Все нормально Без обид, но возможно вам стоит попробовать себя как корректора, раз уж с программированием не очень Шутка.

SA>Алгоритм проверить или навыки работы с адресной арифметикой псевдокода, набранного в браузере?


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

SA>В первом примере обнуление последнего байта строки я опустил намеренно, а во втором — да, каюсь, позабыл в спешке -1 после strlen() дописать. Слава богу, три года с указателями не работаю Ну и, о чем это говорит? Может, о вас, раз с вами помимо указателей говорить не о чем?


С какой целью опустили? Вообще есть мнение, например у Спольски, которое я разделяю, что у хорошего программиста ответ как написать < или <=, отнять единицу или нет, приходит сам, без дополнительных усилий. Ну если на велосипеде научился ездить, то не будешь задумываться как крутить педали и когда жать на тормоз. Потому и странно.
Re[8]: собеседование
От: LordMAD Россия  
Дата: 15.01.10 18:23
Оценка:
Здравствуйте, alzt, Вы писали:

A>А мне вот этот вариант:


A>
A>int is_odd(int x) {
A>    return x & 1;
A>}

A>int avg_my(int x, int y) { 
A>    return x/2 + y/2 + is_odd(x & y); 
A>}
A>


Похожая проблема: avg_my(-3, -3) == -1
Re[7]: собеседование
От: LordMAD Россия  
Дата: 15.01.10 18:41
Оценка:
Здравствуйте, Handie, Вы писали:

H>int avg(int x, int y) { return (int)(((long long)x + y)/2); }


Уже лучше. Если бы в начале был еще assert (лучше статический), проверяющий, что размер long long больше, чем размер int, так вообще было бы хорошо. Соответственно — хороший повод на собеседовании обсудить цену преобразования int в long long и операций над ним на разных платформах, особенно если речь именно об C, а не C++, потому что C99 требует для long long не менее 64 бит. Ну и т.д.

H>Вот другой варант


H>template <class InputIterator, class T>

H>T average(InputIterator first, InputIterator last);

H>Реализуется в терминах алгоритмов STL парой строк, работает с любыми типами — int, double, float, long long, c любым количеством чисел хранящихся в любых контейнерах — vector, set, my_super_container.


Ну, это вариант, только будучи реализованным кандидатом на собеседовании. Опять-таки — хороший повод обсудить дешевые варианты перехода от двух int'овых аргументов к итераторам и т.д.

H>При этом создатели STL не страдали идиотизмом проверки на переполнения, справедливо считая что это вопрос к программисту который использует инструмент и выбирает адекватные типы данных.


Именно. Это как раз одна из причин, почему в задании приводится объявление функции avg — чтобы было видно, что адекватный результат функции — int.
Re[10]: собеседование
От: LordMAD Россия  
Дата: 15.01.10 19:05
Оценка:
Здравствуйте, Handie, Вы писали:

LMA>>Офигеть. И что — целый день говорил с сеньорами? Тогда видимо классно у них сеньоры работают — если по целому дню на кандидата.


H>У меня в Google было шесть собеседований, явно не с джуниорами. Каждый из них потратил 30-45 минут, я потратил два дня. У некоторых интервьюеров были бумажки со списком вопросов и задачек — видимо они для себя шпаргалок наделали или в конторе есть корпоративный "хелп".


Ну вот это уже адекватное расходование времени. Всего чистого времени 3-5 часов получается, так?
Re[14]: собеседование
От: Ytz https://github.com/mtrempoltsev
Дата: 15.01.10 19:08
Оценка:
Да я понял, прошу прощения если резко вышло, просто собеседую контингент и грустно становиться. Начинаешь про алгоритмы — непонимание, про паттерны — шок. Поэтому я теперь чтобы не терять время сразу простую задачку, типа найти минимальное число в массиве или ту же строку развернуть — страшно становится, от того сколько отсеивается людей, а ведь в резюме написано по пять лет опыта работы разработчиком. И это без придирок, просто человек тупо не может развернуть строку без выделения памяти под еще одну строку.
Re[13]: собеседование
От: elmal  
Дата: 15.01.10 19:17
Оценка:
Здравствуйте, Ytz, Вы писали:

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

Эти -1, самые поганые ошибки, вообще-то. Которые никак не влияют на квалификацию. На -1 скорее всего ошибется тот, кто знает до черта языков и имеет черти какой опыт. В одном языке нумерация с 0, в другом с 1, в одном len это число элементов, в другом индекс последнего элемента. И синтаксис цикла не у всех такой ясный как в Сиподобных языках, не понятно включает ли интервал крайнее значение или нет. Потому и стараются от такой гадости уходить, и такой код в основном, работающий напрямую с указателями пишут в основном в институте. Это вообще не ошибка. Вот то, что забыл про переполнение кое кто, там да, ошибка. И то, далеко не факт, что его допустившего надо браковать сразу, зависит все от задач во первых, и от того, что он еще знает. Научиться сможет быстро, если что.
Re[2]: собеседование
От: Mephisto666 Великобритания  
Дата: 15.01.10 19:43
Оценка:
Здравствуйте, Ulitka, Вы писали:

U>Мне очень нравятся string similarity алгоритмы (http://www.dcs.shef.ac.uk/~sam/stringmetrics.html).

U>Вряд-ли кто-то ответит что-то вменяемое, если никогда с этим не сталкивался, но для завязывания разговора может подойти.
U>Ну а если в поисковик набираем и т.п. — must.

wow, спасибо! Я как раз смотрел вопрос с анаграммами (часто в гугле/мс задают) и заинтересовался как в ворде сделаны подсказки на слова с ошибками.
Т.е. предлагаются все слова из словаря "расстояние" до который от ошибочного слова меньше либо равно N. Но хотелось все таки уже разработанные методики изучить
Re[15]: собеседование
От: LordMAD Россия  
Дата: 15.01.10 19:49
Оценка:
Здравствуйте, Ytz, Вы писали:

Ytz>страшно становится, от того сколько отсеивается людей, а ведь в резюме написано по пять лет опыта работы разработчиком.


А вот интересно, когда шеф-повар дорогого ресторана набирает себе команду, к нему тоже приходят толпы бывших работников McDonald's?
Re[14]: собеседование
От: MozgC США http://nightcoder.livejournal.com
Дата: 15.01.10 20:19
Оценка:
Здравствуйте, StandAlone, Вы писали:

SA>Ага. Когда-то, в туманной дали, когда я вовсю педалил на С++ Builder-е, обращение с указателями для меня было, как завязка шнурков.

SA>Был ли я тогда хорошим программистом? Глядя на тогдашний код — увы. С указателями там все было в порядке. Зато на уровень абстракции выше — полный швах.
SA>С тех пор утекло много воды, я как-то начал думать больше о дизайне и меньше об указателях. Перешел на обувь без шнурков, условно говоря-ногу забил и пошел.

Такая же фигня. Лет 5-7 назад баловался на ассемблере и С++, и в уме знал как будет выглядеть тот код который я пишу на С++ в дизассемблированном виде. Был ли я хорошим программистом? Да вообще никаким не был, только и мог сортировки писать и задачки с олимпиад и ничего более серьезного. До сих пор кстати иногда разгребаю говнокод который 4-5 лет назад писал.
Re[7]: а никто и не задумывается: зачем собеседование
От: MozgC США http://nightcoder.livejournal.com
Дата: 15.01.10 20:32
Оценка:
Здравствуйте, IT, Вы писали:

IT>... задачки не предлагают только идиоты. Особенно для сеньоров.

IT>Заумные алгоритмы действительно мало что показывают, но код человеку дать пописать необходимо. Желательно не на бумажке.

Игорь, вот ваше мнение мне всегда интересно. Можно пример какие вопросы бы вы задавали при собеседовании на позицию старшего .NET/C#/Desktop программиста на проект по разработке типичного корпоративного приложения? Можно буквально 3 предложения, просто из интереса.
Re[14]: собеседование
От: Vlad_SP  
Дата: 15.01.10 20:35
Оценка:
Здравствуйте, StandAlone, Вы писали:

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


Глупости. Взялся за C++ — не говори, что не дюж. Что тебе мешало написать тот же самый переворот строки на C# или на чем там? С дюжиной паттернов впридачу и прочим там.... Ась?
Re[15]: собеседование
От: StandAlone  
Дата: 15.01.10 21:57
Оценка:
Здравствуйте, Vlad_SP, Вы писали:

V_S>Глупости. Взялся за C++ — не говори, что не дюж. Что тебе мешало написать тот же самый переворот строки на C# или на чем там? С дюжиной паттернов впридачу и прочим там.... Ась?


Да ради бога:

Func<string, string> revFunc = sourceStr => new string(sourceStr.ToCharArray().Reverse().ToArray());

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

P.S. Жалко нельзя лямбду в вар запихать
Re[9]: а никто и не задумывается: зачем собеседование
От: StandAlone  
Дата: 15.01.10 21:59
Оценка:
Здравствуйте, IT, Вы писали:

IT>ЗЫ. При этом на данный момент в нашей команде работают только те, кто пришёл по рекомендации и этого интервью не проходил


А в чем подвох-то? Только не говорите, что никто не знает атрибута [WebMethod]
SQL для выборки последовательности чисел с разрывом? Или еще какая-нить задачка с sql-ex ?
Re[13]: собеседование
От: FR  
Дата: 16.01.10 04:46
Оценка:
Здравствуйте, Ytz, Вы писали:

Ytz>С какой целью опустили? Вообще есть мнение, например у Спольски, которое я разделяю, что у хорошего программиста ответ как написать < или <=, отнять единицу или нет, приходит сам, без дополнительных усилий. Ну если на велосипеде научился ездить, то не будешь задумываться как крутить педали и когда жать на тормоз. Потому и странно.


Такие навыки очень быстро выветриваются (и так же быстро восстанавливаются).
Как пример я (очень давно) практически думал на языке Forth сейчас с трудом разбираю не очень сложные программки. C++ конечно до форта не дотягивает, но даже программируя на нем постоянно в высокоуровневом стиле мелочи из памяти выветриваются, и написать на бумажке простую вещь с указателями может стать затруднительным, мелкие ошибки точно будут.
Re[9]: а никто и не задумывается: зачем собеседование
От: Pizarro  
Дата: 16.01.10 04:50
Оценка:
Здравствуйте, IT, Вы писали:


IT>Первая — SQL скрипт из нашего реального проекта на одну страничку с объяснением проблемы в этом скрипте. Просим найти проблему и предложить фикс. Наблюдать за этим крайне интересно. Кода страница, а проблемное место одно. По описанию проблемы в принципе можно быстро выйти на это место. Здесь сразу виден уровень разработчика, не его написанный в резюме "problem solving skil", а настоящий. Используемое в скрипте решение на самом деле не совсем очевидно и далее мы просим высказать предположение, почему именно это решение используется.


IT>Вторая задача письменная. В наличии лаптоп, интернет, созданный в студии и уже открытый проект. Просьба написать в этом проекте один веб-метод, который должен делать то-то и то-то и возвращать то-то и то-то. Примитивная задачка, которая может быть решена в пол строки кода.


Кстати довольно разумно. пару задачек и я даю, не надо же доводить дело до абсурда.
Re[16]: собеседование
От: FR  
Дата: 16.01.10 04:57
Оценка:
Здравствуйте, StandAlone, Вы писали:

SA>
SA>Func<string, string> revFunc = sourceStr => new string(sourceStr.ToCharArray().Reverse().ToArray());
SA>

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


std::reverse(Str.begin(), Str.end());
Re[6]: собеседование
От: dilmah США  
Дата: 16.01.10 08:48
Оценка:
H>>int avg(int x, int y) { return (x+y)/2; };

SA>А он сейчас вызовет ее с аргументами (2^32-1,2^32-1)


у интов верхний предел это обычно 2^31-1
Re[9]: собеседование
От: alzt  
Дата: 16.01.10 09:13
Оценка:
Здравствуйте, LordMAD, Вы писали:

A>>
A>>int is_odd(int x) {
A>>    return x & 1;
A>>}

A>>int avg_my(int x, int y) { 
A>>    return x/2 + y/2 + is_odd(x & y); 
A>>}
A>>


LMA>Похожая проблема: avg_my(-3, -3) == -1


Да. как-то на отрицательных числах не проверил её.
Похоже без функции sign не обойтись.
Re[14]: собеседование
От: hrensgory Россия  
Дата: 16.01.10 10:30
Оценка:
LordMAD пишет:
>
> H>2. Архитектура и проектирование
> H>4. Объектно-ориентированное программирование
> H>7. Базы данных
> H>10. Автоматизированное тестирование
> H>12. Составление спецификаций и анализ требований
>
> Я думаю будет понятно, если я просто приведу пример вопроса, например,
> по теме Объектно-ориентированное программирование:
>
> К каким требованиям на предусловия (preconditions) и постусловия
> (postconditions) приводит Принцип замещения Лисков (Liskov Substitution
> Principle — LSP)?

К сожалению, стало яснее только на 20%. Более всего интересуют примеры
вопросов к рядовому разработчику №№ 12 и 2 (если на все лениво примеры
приводить).

--
WBR,
Serge.
Posted via RSDN NNTP Server 2.1 beta
Re[5]: собеседование
От: ettcat США  
Дата: 16.01.10 12:57
Оценка:
> for (int i=0; i<strlen(a); i++)
> {
> b[i]=a[strlen(a)-i-1];
> }

Вот пример, как на ровном месте получили квадратичную сложность вместо линейной.

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

Ну и в любом случае, решение брать/не брать по результату одной задачи не принимается. Есть еще
задачки на приектирование (спроектируйте Яндекс.Маркет например).

А что можно понять о кандидате в разговоре о прошлых проектах?
Posted via RSDN NNTP Server 2.1 beta
Re[10]: а никто и не задумывается: зачем собеседование
От: IT Россия linq2db.com
Дата: 16.01.10 18:27
Оценка:
Здравствуйте, StandAlone, Вы писали:

IT>>ЗЫ. При этом на данный момент в нашей команде работают только те, кто пришёл по рекомендации и этого интервью не проходил


SA>А в чем подвох-то? Только не говорите, что никто не знает атрибута [WebMethod]


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

Сама задача примитивна до нельзя. Нужно по заданному параметру прочитать строчку из файла и вернуть её. Файл не большой.

SA>SQL для выборки последовательности чисел с разрывом? Или еще какая-нить задачка с sql-ex ?


В тесте с SQL не надо ничего писать, нужно найти ошибку. Большую часть скрипта занимает UPDATE выражение вообще не относяшиееся к делу. Оно вызывается в цикле и этот цикл никогда не завершается. Это и надо найти и пофиксить. Ещё нужно попытаться объяснить зачем мы используем цикл, т.к. на первый взгляд он абсолютно не нужен. Можно было бы всё сделать одним UPDATE, но мы устанавливаем ROWCOUNT в 10000 и крутим пока всё не проапдейтится.
Если нам не помогут, то мы тоже никого не пощадим.
Re[8]: собеседование
От: Олег К.  
Дата: 17.01.10 02:39
Оценка:
E>Мне ни разу не приходилось в своей практике переворачивать строку. Написать переворот я напишу, он будет работать, если буду писать за компом. Если на бумажке, запросто могу и ошибку сделать.
Было бы странно если бы в течении 30 — 50 минут которое длится интервью тебя бы попросили написать реальный код. Развернуть строку — несложное и довольно-таки примитивное задание которое не требует каких-либо специальный знаний или поисков алгоритма в Интернете.

ОК>>Я не думаю что кто-либо будет спрашивать студентов о ролях в предыдущих проектах, но меня откровенно умиляют заявления что человека с 10-летним опытом знания плюсов спрашивать не нужно.

E>По плюсам отдельная тема, там действительно много чего требуется знать. Вопрос только, что считать знанием? Я лично считаю, что под знанием языка должно подразумеваться представление, а во что твой код превратится после компиляции.
Это тоже не сложно но большинство даже простого синтаксиса не знают.

E>Обращение строки — это вопрос не на знание языка, это вопрос по алгоритмам, независящим от языка.

Да никакой это не алгоритм. В смысле сложности, то есть. Нужно всего лишь помнить немного синтаксиса да иметь голову на плечах.

E>Если человек много ходит по собеседованиям — он ответ будет знать,

Ты удивишся, но большинство не напишет даже после хождения по интервью.

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

До свидания сразу никто не скажет но я вообще не понимаю как можно извратить код такой функции чтобы струдом понимать что она делает. Такие тоже бывали. Пример с memcpy() я уже приводил. По-твоему такого человека надо было нанять?

ОК>>Впрочем, как погляжу, для тебя это больная тема.

E>Слабейшая сторона у меня при прохождении собеседований — многопоточность. А так как у меня одно собеседование в 2 месяца в лучшем случае, то я забываю кое какие детали, так как не используются они у меня в работе.
Так почему не подтянешь слабую сторону? Особенно перед интервью.

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

За это я спокоен. Наоборот, считаю, что лучше работать с толковыми ребятами.
Re[9]: собеседование
От: Олег К.  
Дата: 17.01.10 02:43
Оценка:
E>>При реальной работе я обставлю всех кандидатов, конкурентов не боюсь, а о них мечтаю. При собеседованиях — приоритет будет у того, кто меньше ошибется в вопросах многопоточности. Отношусь философски — не требуются мои сильные стороны, вам же хуже. А может и лучше, а то если возьмете меня, то по прошествии времени, авторитет будет у меня, а не у вас .
ОК>За это я спокоен. Наоборот, считаю, что лучше работать с толковыми ребятами.
Проблема еще в том, что все считают себя умными на деле такими не являясь. И еще я заметил что меньше знает человек или способен на что-то, то тем больше он мнит о себе. Ну да это оффтопик уже.
Re[6]: собеседование
От: Олег К.  
Дата: 17.01.10 03:02
Оценка:
LMA>Вариант решения:
LMA>int sign(int a) { return (a < 0) ? -1 : 1; }
LMA>int avg(int x, int y) { return (sign(x) == sign(y)) ? x+(y-x)/2 : (x+y)/2; }

-1 за изврат.
Re[6]: собеседование
От: FR  
Дата: 17.01.10 04:34
Оценка:
Здравствуйте, ettcat, Вы писали:

E> Вот пример, как на ровном месте получили квадратичную сложность вместо линейной.


Угу чистейшая иллюстрация вот этой http://russian.joelonsoftware.com/Articles/BacktoBasics.html
статьи, автору кода очень советую прочитать.
Re[9]: собеседование
От: elmal  
Дата: 17.01.10 07:47
Оценка:
Здравствуйте, Олег К., Вы писали:

ОК>Было бы странно если бы в течении 30 — 50 минут которое длится интервью тебя бы попросили написать реальный код. Развернуть строку — несложное и довольно-таки примитивное задание которое не требует каких-либо специальный знаний или поисков алгоритма в Интернете.

Задание слишком простое. Мне всегда казалось, что именно на плюсах крайне важно не забывать const в нужных местах ставить, умение уходить от прямой работы с указателями, надежно работать с памятью (автоматически, а не через кучу явных delete в любом месте на каждый чих, размазывая это по всему коду) четко понимать, как твоими классами будут пользоваться другие и потому часть операций запрещать, а часть реализовывать так, чтобы клиенты не могли сделать ошибку. А что этим заданием проверите? Я бы его в школе сделал, и сейчас сделаю, несмотря на то, что плюсы забыл практически, и не владею тем, что я перечислил, я собеседование сам у себя по плюсам не пройду. На бумажке могу и ошибиться, -1 например не поставить или еще что такое. Итого — мне значит можно па плюсовика претендавать? Задание я тестовое скорее всего сделаю, если синтаксис повторю, благо у меня справочник лежит на полке, а вот работать достаточно эффективно увы, первое время не смогу — будут проблемы со сборкой проекта, с отладкой, всякими специализациями шаблонов я не пользовался на практике, так что могу что-нидь натворить не то, буду долго втыкать почему не компиляется. Про проекты — могу очень много интересного наговорить, сказав что все делал на плюсах, как проверять будете.
Кстати, как я уже говорил, я бы вместо этого задания предпочел бы дать человеку кусок реального проекта, намеренно сделать в нем ошибку, и попросить сделать code review. Пусть напишет что надо исправить, общие замечания по коду, а то и дать комп, и пусть порефакторит. Потом если хорошо сделает, можно будет даже закоммитить его исправления, и время на собеседование отыграете, и человека проверите — двух зайцев одним ударом.

ОК>Это тоже не сложно но большинство даже простого синтаксиса не знают.

ОК>Да никакой это не алгоритм. В смысле сложности, то есть. Нужно всего лишь помнить немного синтаксиса да иметь голову на плечах.
Что значит простого синтаксиса? Простой синтаксис компилятор проверяет. Даже до компиляции куча ошибок IDE подсветит. Проблем не будет, проблемы могут начаться после непростого синтаксиса.

ОК>До свидания сразу никто не скажет но я вообще не понимаю как можно извратить код такой функции чтобы струдом понимать что она делает. Такие тоже бывали. Пример с memcpy() я уже приводил. По-твоему такого человека надо было нанять?

С memcpy() конечно перебор (для копирования одного байта, как я понял ). Но стоило хоть поинтересоваться для чего он так сделал. Вдруг в этом смысл какой, и от этого все станет в 100 раз быстрее и надежнее работать, а забраковали слишком умного . Я вот лично привык подвергать свои знания сомнению. Всегда думаю — а вдруг я не прав, и в говнокоде есть какой-то сакральный смысл ? Сможет меня убедить, что именно так и надо писать — такого человека надо нанимать. Не сможет — увы, я слишком глуп чтоб понять великие идеи, мы не сработаемся, лучше собеседуйтесь на мое место.

ОК>Так почему не подтянешь слабую сторону? Особенно перед интервью.

Эта сторона слабая для прохождения интервью, но никак не для эффективного выполнения работы. Эта сторона, кстати, в свое время у меня была сильной. Причем самой сильной. Синтаксис знал так, что мог написать такое, что без поллитра не разберешься . Особенно с битовыми операциями был силен . А потом понял, что в программировании надо не навороты синтаксиса демонстрировать, а писать так, чтобы код был понятным и недежным. И если ты ошибся, ошибка должна быть заключена в одной функции, а не быть размазанной по всему коду. Некоторый синтаксис использовать перестал вообще (например массивы), и многое забыл, так как мало использую. Может еще решение диффур, аналитическую геометрию, сортировки, обходы дерева на память, алгоритмы поиска кратчайшего пути в графах и все такое подтягивать, перед каждым собеседованием? Вдруг спросят?
Re[2]: собеседование
От: Ilias  
Дата: 17.01.10 09:11
Оценка:
Здравствуйте, LordMAD, Вы писали:

LMA>Здравствуйте, errest, Вы писали:


E>>Какие тестовые задания могут дать на C/C++?

E>>Нужны простенькие — типа сортировки массива и найти ошибки

LMA>Напишите функцию, вычисляющую среднее значение двух любых значений типа int:

LMA>int avg(int x, int y);

Я прошу прощения за воскресный тупняк (после субботнего пива в больших количествах), но почему нельзя написать что-то типа:
int avg(int x, int y)
{
    int minVal = min(x,y);
    int maxVal = max(x,y);
    
    return minVal + (maxVal - minVal) / 2;
}


тут и с переполнением вроде нормально всё и с отрицательными работает.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: собеседование
От: dilmah США  
Дата: 17.01.10 10:43
Оценка:
I> return minVal + (maxVal — minVal) / 2;
I>тут и с переполнением вроде нормально всё и с отрицательными работает.

это работает для unsigned (собственно, такой пример в применении к указателям есть в K&R).
Для signed int это не работает потому что INT_MAX — INT_MIN слишком большое и не влезет в signed int.
Re[3]: собеседование
От: LordMAD Россия  
Дата: 17.01.10 17:50
Оценка:
Здравствуйте, Ilias, Вы писали:

I>Я прошу прощения за воскресный тупняк (после субботнего пива в больших количествах), но почему нельзя написать что-то типа:

I>
I>int avg(int x, int y)
I>{
I>    int minVal = min(x,y);
I>    int maxVal = max(x,y);
    
I>    return minVal + (maxVal - minVal) / 2;
I>}
I>


I>тут и с переполнением вроде нормально всё и с отрицательными работает.


Собственно уже ответили: например, если одно из значений INT_MAX, а другое — отрицательное, maxVal — minVal создаст проблему с переполнением.
Re[10]: собеседование
От: Олег К.  
Дата: 17.01.10 23:03
Оценка:
ОК>>Еще советую изменить название функции на какой-нибудь набор букв и цифр и тогда никто уж точно не поймет что она делает!
LMA>Если Вам непонятно, что делает приведенная выше функция, видимо у Вас проблемы.
Проблем у меня нету. Проблемы есть у тех кто так пишет!

ОК>>Я фигею как можно извратиться над какой-то avg()! Если тебе так хочется обсудить переполнение, то этот пример очень неудачный.

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

Вот что мне интересно — вы там также весь код пишите или это только для интервью? Кандидат написал-таки эту функцию а дальше это нафиг уже никому не надо?

ОК>>В реальном коде, как тебе сказали, программисты берут тип с большим числом битов и не страдают фигней.

LMA>Когда дорастешь, узнаешь, что это не всега лучший способ.
Еще вопрос кому до кого дорастать!

LMA>Реальный код — это какой?

Демагог.

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

LMA>long long avg(long long, long long) для 5 различных платформ? Реализовывать собственный тип данных, который бедет выполнять сложение в 3 раза медленнее, чем long long?
Вы там реально пишите для "пяти различных платформ" или ты это тут абстрактно так рассуждаешь?

Я порядком багов правил и правлю, но что-то не припомню чтобы один из них был связан с переполнением.

ОК>>Мне double-ов до сих пор хватало.

LMA>Ну так зачем это всем рассказывать — позорить себя так?
Да ладно тебе. Это ты тут конкретно жжешь. В этой подветке, с Liskov Substitution Principle и далее.
Re[16]: собеседование
От: Олег К.  
Дата: 17.01.10 23:06
Оценка:
Два вопроса. Сколько надо времени на все эти вопросы и задачи? Какую зарплату предлагаете кандидатам?
Re[11]: собеседование
От: LordMAD Россия  
Дата: 18.01.10 05:08
Оценка:
Здравствуйте, Олег К., Вы писали:

ОК>Проблем у меня нету. Проблемы есть у тех кто так пишет!


Ну так расскажи мне — какие у меня и моих коллег проблемы!

ОК>Вот что мне интересно — вы там также весь код пишите или это только для интервью?


Представляешь, весь код такой!

ОК>Вы там реально пишите для "пяти различных платформ" или ты это тут абстрактно так рассуждаешь?


Представляешь, реально!

ОК>Я порядком багов правил и правлю, но что-то не припомню чтобы один из них был связан с переполнением.


А работники McDonald's ни разу не сталкивались с проблемами при приготовлении стейка с кровью. Потому что у них не готовят стейк с кровью.

ОК>>>Мне double-ов до сих пор хватало.

LMA>>Ну так зачем это всем рассказывать — позорить себя так?
ОК>Да ладно тебе. Это ты тут конкретно жжешь. В этой подветке, с Liskov Substitution Principle и далее.

Тебе и с LSP не приходилось сталкиваться, что ли?
Re[17]: собеседование
От: LordMAD Россия  
Дата: 18.01.10 05:21
Оценка:
ОК>Два вопроса. Сколько надо времени на все эти вопросы и задачи? Какую зарплату предлагаете кандидатам?

Зависит от конкретного вопроса. На большинство вопросов — 1-2 минуты, не более. Общее время на вопросы по всем темам — не более 45-60 минут. Это соответственно, если раньше не становится ясно, что далее проводить собеседование нет смысла. Ну и как следствие, более затратные по времени темы идут в конце.

Про з/п я уже писал в этой теме.
Re[12]: собеседование
От: Олег К.  
Дата: 18.01.10 06:51
Оценка:
ОК>>Нормальное. Большинство и такое не сделают а я не хочу (точнее не хотел уже) особо напрягать людей.
E>Итак, человек в простейшем задание не ошибся. Говорит ли это о его уровне, говорит ли это о том, что реальный код он будет писать нормально?
Я надеюсь ты понимаешь что не по одной этой задачке составляется впечатление о человеке?

E>Я считаю, что нет, и надо давать задание посложнее.

Ты меня вообще читаешь или нет? Я тебе говорю что большинство и с этой справиться не могут, а ты мне говоришь про "посложнее."

E>Иначе возьмем тех, кого обычно берут (я про индуссокодеров в спагетти стиле, которых так любят нанимать), и потом их творчество расхлебывать.

В этом я меньше всего заинтересован.

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

E>Ну вполне логично что не помнят. В реальной работе некоторые вещи помнить не требуется, вот и не помнят. Помнят принципы, а не детали.
Может ты еще в хелп каждый раз лезешь когда тебе надо цицл for написать или ты от него совсем отказался?

Про не помнит... Вот тебе один из конкретных примеров. Спрашиваю как внутри реализован std::list<>. Чувак закатывает глаза, всем видом показывает что помнил но забыл. Ну как такое вообще можно забыть? Да что там этот лист. Большинство не могут сказать в каком неймспейсе находятся STL-овские контейнеры.

E>То, что не помнят, говорит о том, что редко ходят по собеседованиям, а не то, что они плохо будут справляться с работой, так как умудрилтсь за 10 лет ни одной строчки не написать, не знают даже как класс отнаследовать, вместо вместо private priv написали, не скомпилится — явно человек первый раз в жизни программу пишет . На бумажке плохой почерк и куча помарок — значит и в коде будет черти что, да ?

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

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

E>Можно спросить, чем мне поможет память о том, когда нужно ставить точки с запятой а когда нет? У меня например в IDE, если я точку с запятой не поставлю, или поставлю лишние — сразу будет выдано предупреждение об этом, до компиляции.
Что-то ты не то говоришь. Базовый синтаксис помнить все-таки надо а не целиком полагаться на среду. Среда в данном случае просто помощник который укажет тебе если ты что-то не то сделал но она никак не должна замещать мозги программиста.

И потом, как тебе, к примеру, поможет среда в такой ситуации?
if (i < 10); // Ошибочная точка с запятой
    do_something();

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

Про синтаксис цикла for я уже спросил.

E>Как то давно уже на это внимание не обращаю. И синтаксис main я, каюсь, не помню, у меня в IDE есть шаблон, который генерит. На самом деле немного то я конечно помню, нак как писал более чем 100 раз, но далеко не факт, что я не ошибусь на собеседовании.

Для тебя это какая-то больная тема, ей богу.
Re[14]: собеседование
От: Олег К.  
Дата: 18.01.10 07:12
Оценка:
ОК>>>>Проблем у меня нету. Проблемы есть у тех кто так пишет!
LMA>>>Ну так расскажи мне — какие у меня и моих коллег проблемы!
ОК>>Большие проблемы! И вы даже не представляете какие у вас проблемы!

LMA>А по сути есть что сказать?

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

ОК>>>>Вот что мне интересно — вы там также весь код пишите или это только для интервью?

LMA>>>Представляешь, весь код такой!
ОК>>Могу представить. Более того, считаю что таких вот "гениев" нужно заставлять поддерживать код написанный другими такими "гениями" чтоб неповадно было.
LMA>Давай угадаю – ты, конечно, считаешь, что главное — сделать так, чтобы любой вменяемый и аккуратный студент смог в любой момент включится в работу?
Ты ведь сам вчерашний студент, не так ли?

LMA>>>Тебе и с LSP не приходилось сталкиваться, что ли?

ОК>> Что-то помню такое. Скорее всего приходилось, но просто не помню это под этими fancy words. Ты тоже это забудешь как повзрослеешь.
LMA>Ну, да. Зачем использовать короткие слова и абревиатуры на брифингах и code review, когда можно долго и нудно объяснять что имеешь в виду.
Ты странное говоришь. Я что-то не могу предположить как проходит код ревью при помощи академических терминов да и зачем они вообще нужны.

ЗЫ. Ты чего покоцал вопросы про платформы и аппликейшн?
Re[13]: собеседование
От: elmal  
Дата: 18.01.10 07:46
Оценка:
Здравствуйте, Олег К., Вы писали:

ОК>Ты меня вообще читаешь или нет? Я тебе говорю что большинство и с этой справиться не могут, а ты мне говоришь про "посложнее."

Это их проблемы. Я так понимаю, нужны те, кто в состоянии делать реальные задачи, а не те, кто строки инвертировать умеет. Тогда надо не требования снижать, а требовать именно то, что реально потребуется. Или определять скорость обучания как-то.

ОК>Может ты еще в хелп каждый раз лезешь когда тебе надо цицл for написать или ты от него совсем отказался?

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

ОК>Про не помнит... Вот тебе один из конкретных примеров. Спрашиваю как внутри реализован std::list<>. Чувак закатывает глаза, всем видом показывает что помнил но забыл. Ну как такое вообще можно забыть? Да что там этот лист. Большинство не могут сказать в каком неймспейсе находятся STL-овские контейнеры.

Мне вот что-то не верится, что все кандидаты такие, как описывают. А вот то, что такие кандидаты легко как-то умудряются фильтры и собеседования проходить — про это я в курсе. И как то еще умудряются там черти сколько времени работать, не умея программировать вообще, и получая зарплату выше рынка. Я вот в этом виню собеседующих, а не кандидатов .

ОК>И потом, как тебе, к примеру, поможет среда в такой ситуации?

ОК>
ОК>if (i < 10); // Ошибочная точка с запятой
ОК>    do_something();
ОК>

ОК>Полностью правильная программа, однако делает не то что программист задумал.
Что то у меня сомнения, что в этом случае никакого предупреждения при компиляции не будет. Если человеку пофиг на предупреждения, это гораздо хуже, чем если он не знает когда точку с запятой ставить.

ОК>Про синтаксис цикла for я уже спросил.

Хоть и отказался, но помню еще. Иной раз приходится использовать, так как альтернатив, увы, иногда нет.
Re[14]: собеседование
От: Олег К.  
Дата: 18.01.10 08:12
Оценка:
ОК>>Ты меня вообще читаешь или нет? Я тебе говорю что большинство и с этой справиться не могут, а ты мне говоришь про "посложнее."
E>Это их проблемы. Я так понимаю, нужны те, кто в состоянии делать реальные задачи, а не те, кто строки инвертировать умеет. Тогда надо не требования снижать, а требовать именно то, что реально потребуется. Или определять скорость обучания как-то.
Если я начну спрашивать и давать писать все что мне хотелось бы спросить, то никакого времени не хватит. Это также следует понимать.

ОК>>Может ты еще в хелп каждый раз лезешь когда тебе надо цицл for написать или ты от него совсем отказался?

E>От него я почти отказался. В хелп не лезу. А вот в случае с массивами например, грешен, постоянно забываю синтаксис. Случается это где-то раз в полгода, когда я вынужден это вспоминать. За синтаксисом регулярных выражения я тоже каждый раз в хелп лезу, так как тоже раз в полгода ими пользуюсь.
Мне странно слышать что программист отказался от цикла for. То что не помнишь регулярных выражений — понять могу.

ОК>>Про не помнит... Вот тебе один из конкретных примеров. Спрашиваю как внутри реализован std::list<>. Чувак закатывает глаза, всем видом показывает что помнил но забыл. Ну как такое вообще можно забыть? Да что там этот лист. Большинство не могут сказать в каком неймспейсе находятся STL-овские контейнеры.

E>Мне вот что-то не верится, что все кандидаты такие, как описывают. А вот то, что такие кандидаты легко как-то умудряются фильтры и собеседования проходить — про это я в курсе. И как то еще умудряются там черти сколько времени работать, не умея программировать вообще, и получая зарплату выше рынка. Я вот в этом виню собеседующих, а не кандидатов .
А ты попробуй поинтервьюировать. Тут люди приводили уже аналогичные ситуации когда не знают про бинарные деревья или хэш-таблицы.

ОК>>И потом, как тебе, к примеру, поможет среда в такой ситуации?

ОК>>
ОК>>if (i < 10); // Ошибочная точка с запятой
ОК>>    do_something();
ОК>>

ОК>>Полностью правильная программа, однако делает не то что программист задумал.
E>Что то у меня сомнения, что в этом случае никакого предупреждения при компиляции не будет. Если человеку пофиг на предупреждения, это гораздо хуже, чем если он не знает когда точку с запятой ставить.
Это почему тут должны быть предупреждения?

ОК>>Про синтаксис цикла for я уже спросил.

E>Хоть и отказался, но помню еще. Иной раз приходится использовать, так как альтернатив, увы, иногда нет.
Ты скоро такими темпами вообще откажешся от циклов и все будешь делать через метки, if-ы и goto.
Re[15]: собеседование
От: LordMAD Россия  
Дата: 18.01.10 08:47
Оценка:
Здравствуйте, Олег К., Вы писали:

ОК>>>>>Проблем у меня нету. Проблемы есть у тех кто так пишет!

LMA>>>>Ну так расскажи мне — какие у меня и моих коллег проблемы!
ОК>>>Большие проблемы! И вы даже не представляете какие у вас проблемы!
LMA>>А по сути есть что сказать?
ОК>Так я и сказал. Судя по твоим постам дела у вас там обстоят не ахти как. В прочем, есть надежда что это именно ты изголяешся здесь, на форуме, и на интервью.

Все, что ты пока что сказал — это то, что по твоему мнению, ценность которого пока что 0, такой код приводит к каким-то проблемам. Без указания, что за проблемы, по твоему мнению; без какой-либо аргументации...

ОК>Ты ведь сам вчерашний студент, не так ли?


Нет, лет на 15 ты ошибся.

LMA>>>>Тебе и с LSP не приходилось сталкиваться, что ли?

ОК>>> Что-то помню такое. Скорее всего приходилось, но просто не помню это под этими fancy words. Ты тоже это забудешь как повзрослеешь.
LMA>>Ну, да. Зачем использовать короткие слова и абревиатуры на брифингах и code review, когда можно долго и нудно объяснять что имеешь в виду.
ОК>Ты странное говоришь. Я что-то не могу предположить как проходит код ревью при помощи академических терминов да и зачем они вообще нужны.

Фраза "похоже на нарушение LSP" напротив объявления класса. Итересно — как бы это выглядело у тебя?

ОК>ЗЫ. Ты чего покоцал вопросы про платформы и аппликейшн?


Если сообщу это информацию, некоторым сразу станет понятно где работаю, чего бы мне не хотелось. Научись уважать чужую privacy.
Впрочем, если хочешь рассказать о себе — валяй.
Re[8]: собеседование
От: ProgrammerG  
Дата: 18.01.10 09:10
Оценка:
Здравствуйте, маген, Вы писали:


S>>на такое решение обычно говорят а теперь тоже самое без char tmp (типо через XOR)


М>А вот смысл этого, зачеем? Кто-нибудь себе в проект предпочтет код через Xor?

М>Вопрос скорее не к вам, а риторический.
М>Надо же помнить, что код всегда — это то, что кто-то потом сопровождает.
Вот вот. Если человек напишет с XOR я ещё 10 раз подумаю нужен ли мне такой.
Потом замучаешься его код поддерживать. Это скорее минус.
Вот если он напишет нормально, но на словах упомянет про XOR, то это плюс.
Re[18]: собеседование
От: Vzhyk  
Дата: 18.01.10 09:18
Оценка:
18.01.2010 7:21, LordMAD пишет:
>
> ОК>Два вопроса. Сколько надо времени на все эти вопросы и задачи? Какую
> зарплату предлагаете кандидатам?
>
> Зависит от конкретного вопроса. На большинство вопросов — 1-2 минуты, не
> более. Общее время на вопросы по всем темам — не более 45-60 минут. Это
> соответственно, если раньше не становится ясно, что далее проводить
> собеседование нет смысла. Ну и как следствие, более затратные по времени
> темы идут в конце.
Специально глянул профиль. Думал, в Гугл набираете.
Posted via RSDN NNTP Server 2.1 beta
Re[19]: собеседование
От: LordMAD Россия  
Дата: 18.01.10 09:25
Оценка:
Здравствуйте, Vzhyk, Вы писали:

V>Специально глянул профиль. Думал, в Гугл набираете.



Разве только такие монстры как google, делают системы?

Вообще, наше направление "embedded" заставляет серьезно относиться к набору сотрудников. Просто ошибки действительно очень дорого часто обходятся.
Re[20]: собеседование
От: Олег К.  
Дата: 18.01.10 09:27
Оценка:
LMA>Разве только такие монстры как google, делают системы?

LMA>Вообще, наше направление "embedded" заставляет серьезно относиться к набору сотрудников. Просто ошибки действительно очень дорого часто обходятся.

Что, Гугль уже пишет под embedded?
Re[21]: собеседование
От: LordMAD Россия  
Дата: 18.01.10 09:31
Оценка:
Здравствуйте, Олег К., Вы писали:

LMA>>Разве только такие монстры как google, делают системы?


LMA>>Вообще, наше направление "embedded" заставляет серьезно относиться к набору сотрудников. Просто ошибки действительно очень дорого часто обходятся.

ОК>Что, Гугль уже пишет под embedded?

Эти два абзаца не связаны между собой.
Re[16]: собеседование
От: Олег К.  
Дата: 18.01.10 09:37
Оценка:
ОК>>Это почему тут должны быть предупреждения?
E>Лично у меня предупреждение выдала среда разработки — "if" statement has empty body here. У меня правда не С++ и не С.
Ну Си шарп вообще параноидальный. Бывает что переменная инициализируется при каких-то условиях, затем ниже по коду используется уже когда она была гарантированно иницализрованна, так он ругается что она не всегда инициализированна. Приходится при объявлении ставить какое-то начальное значение.

E>>>Хоть и отказался, но помню еще. Иной раз приходится использовать, так как альтернатив, увы, иногда нет.

ОК>>Ты скоро такими темпами вообще откажешся от циклов и все будешь делать через метки, if-ы и goto.
E>Как раз наоборот. Все делаю через мапки, полиморфизм, итераторы и т.д. if и switch тоже довольно редко использую.
Могу представить как это все выглядит...
Re[16]: собеседование
От: Олег К.  
Дата: 18.01.10 09:45
Оценка:
LMA>Все, что ты пока что сказал — это то, что по твоему мнению, ценность которого пока что 0, такой код приводит к каким-то проблемам. Без указания, что за проблемы, по твоему мнению; без какой-либо аргументации...
Если ты занимаешся системными вещами, то я что-то не могу представить для чего там нужны такие большие числа которые могут вызвать переполнение.

ОК>>Ты ведь сам вчерашний студент, не так ли?

LMA>Нет, лет на 15 ты ошибся.
И ты помнишь весь этот академический бред?

ОК>>Ты странное говоришь. Я что-то не могу предположить как проходит код ревью при помощи академических терминов да и зачем они вообще нужны.

LMA>Фраза "похоже на нарушение LSP" напротив объявления класса. Итересно — как бы это выглядело у тебя?
Ты не умничай. Ты код покажи а я скажу как бы сказал. В наших code review как-то не было такой фигни. Уж и не знаю что вы там обсуждаете.

ОК>>ЗЫ. Ты чего покоцал вопросы про платформы и аппликейшн?

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

LMA>Впрочем, если хочешь рассказать о себе — валяй.

Тут речь не обо мне, вообще-то.
Re[17]: собеседование
От: elmal  
Дата: 18.01.10 09:50
Оценка:
Здравствуйте, Олег К., Вы писали:

ОК>Ну Си шарп вообще параноидальный. Бывает что переменная инициализируется при каких-то условиях, затем ниже по коду используется уже когда она была гарантированно иницализрованна, так он ругается что она не всегда инициализированна. Приходится при объявлении ставить какое-то начальное значение.

Я вообще то в книгах по плюсам видел рекомендацию всегда ставить переменным начальное значение. Хотя бы NULL.

ОК>Могу представить как это все выглядит...

Пока никто не жаловался.
Re[8]: собеседование
От: Олег К.  
Дата: 18.01.10 10:00
Оценка:
M>Не всегда и float можно взять, не говоря уж про double. Long long и прочее тоже может не поощряться. Например, вычисления для мобильных платформ в fixed point. Там даже при несложной физике много тонких моментов вылезает. Правда, те же физические движки для моб. игр пишут одна-две конторы, остальным это не особо нужно. Готовым пользуются уже.
Твоя правда но мы не говорим тут о какой-то экзотике в большинстве своем. Потом, разве на плюсах пишут игры для мобилок? А еще там код ужасный и те кто этим занимается сами хотят свалить. Были тут посты.

M>Если у чела компания чем-то подобным занимается, то задача вполне оправдана. Такое и нужно спрашивать.

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

M>Если же чел спрашивает такое, только ради того, чтобы проверить, как кандидат знает параграфы стандарта, то плохая задача. Такой выпендреж не есть хорошо.

У меня сложилось именно такое впечатление. Особенно с его статик ассертом.
Re[16]: собеседование
От: hrensgory Россия  
Дата: 18.01.10 10:01
Оценка:
LordMAD пишет:

>> > К каким требованиям на предусловия (preconditions) и постусловия

>> > (postconditions) приводит Принцип замещения Лисков (Liskov Substitution
>> > Principle — LSP)?
>
> H>К сожалению, стало яснее только на 20%. Более всего интересуют примеры
> H>вопросов к рядовому разработчику №№ 12 и 2 (если на все лениво примеры
> H>приводить).

Спасибо, понятно. Вообщем, если отбросить странные академизмы, вроде
"принципа подстановки Лискова" — вполне нормальные вопросы для senior
уровня в большинстве софтверных контор.

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

--
WBR,
Serge.
Posted via RSDN NNTP Server 2.1 beta
Re[8]: собеседование
От: Олег К.  
Дата: 18.01.10 10:08
Оценка:
Ты привел хороший аргумент, но можешь привести пример задач с большими int-ами которые бы вызвали переполнение?
Re[21]: собеседование
От: Sanik Россия http://sergeysthoughts.blogspot.com/
Дата: 18.01.10 10:29
Оценка:
Здравствуйте, Олег К., Вы писали:

LMA>>Разве только такие монстры как google, делают системы?


LMA>>Вообще, наше направление "embedded" заставляет серьезно относиться к набору сотрудников. Просто ошибки действительно очень дорого часто обходятся.

ОК>Что, Гугль уже пишет под embedded?

андроид — не оно?
... << RSDN@Home 1.2.0 alpha 4 rev. 1253>>
Re[20]: собеседование
От: Vzhyk  
Дата: 18.01.10 12:10
Оценка:
18.01.2010 11:25, LordMAD пишет:
>
> Вообще, наше направление "embedded" заставляет серьезно относиться к
> набору сотрудников.
А в остальных можно безответственно? Или ты что-то другое имел в виду?

> Просто ошибки действительно очень дорого часто

> обходятся.
Т.е. вы ищите, кто никогда не ошибается? А кто никогда не ошибается?
Закончишь фразу сам.
Posted via RSDN NNTP Server 2.1 beta
Re[10]: собеседование
От: Vzhyk  
Дата: 18.01.10 12:23
Оценка:
15.01.2010 19:06, Handie пишет:
>
> У меня в Google было шесть собеседований, явно не с джуниорами. Каждый
> из них потратил 30-45 минут, я потратил два дня. У некоторых
> интервьюеров были бумажки со списком вопросов и задачек — видимо они для
> себя шпаргалок наделали или в конторе есть корпоративный "хелп".
Так в Гугл тебя взяли?
В "embeded" у Lordmad ты уже задачку выше не решил, так что пролет.
Posted via RSDN NNTP Server 2.1 beta
Re[22]: собеседование
От: Sanik Россия http://sergeysthoughts.blogspot.com/
Дата: 18.01.10 12:29
Оценка:
Здравствуйте, Sanik, Вы писали:

S>Здравствуйте, Олег К., Вы писали:


LMA>>>Разве только такие монстры как google, делают системы?


LMA>>>Вообще, наше направление "embedded" заставляет серьезно относиться к набору сотрудников. Просто ошибки действительно очень дорого часто обходятся.

ОК>>Что, Гугль уже пишет под embedded?

S>андроид — не оно?

хотя конешно врядли... эту часть затачивают те, кто железки делает...
... << RSDN@Home 1.2.0 alpha 4 rev. 1253>>
Re[17]: собеседование
От: LordMAD Россия  
Дата: 18.01.10 12:40
Оценка:
Здравствуйте, Олег К., Вы писали:

ОК>Если ты занимаешся системными вещами, то я что-то не могу представить для чего там нужны такие большие числа которые могут вызвать переполнение.


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

ОК>И ты помнишь весь этот академический бред?

Да, потому что LSP — это базис. Я, конечно, понимаю, что есть люди, для которых и инкапсуляция — не более, чем "академический бред". Вообще меня увивляет количество людей, марширующих по знаменем воинствующего невежества. В чем кайф?

LMA>>Фраза "похоже на нарушение LSP" напротив объявления класса. Итересно — как бы это выглядело у тебя?

ОК>Ты не умничай. Ты код покажи а я скажу как бы сказал. В наших code review как-то не было такой фигни. Уж и не знаю что вы там обсуждаете.

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

LMA>>Если сообщу это информацию, некоторым сразу станет понятно где работаю, чего бы мне не хотелось. Научись уважать чужую privacy.

ОК>Слив засчитан.

Считай, как хочешь. Не уважаешь других — твои проблемы.

LMA>>Впрочем, если хочешь рассказать о себе — валяй.

ОК>Тут речь не обо мне, вообще-то.

Ну, да. Ну, да.
Re[17]: собеседование
От: LordMAD Россия  
Дата: 18.01.10 12:51
Оценка:
Здравствуйте, hrensgory, Вы писали:

>>> > К каким требованиям на предусловия (preconditions) и постусловия

>>> > (postconditions) приводит Принцип замещения Лисков (Liskov Substitution
>>> > Principle — LSP)?
>>
>> H>К сожалению, стало яснее только на 20%. Более всего интересуют примеры
>> H>вопросов к рядовому разработчику №№ 12 и 2 (если на все лениво примеры
>> H>приводить).

H>Спасибо, понятно. Вообщем, если отбросить странные академизмы, вроде

H>"принципа подстановки Лискова" — вполне нормальные вопросы для senior
H>уровня в большинстве софтверных контор.

Только почему "Лискова"? Если уж коверкать на русский манер, то получится "Лисковой". Хотя она, конечно, Лисков.

Ну, под senior вообще каждый своё понимает. Начиная от варианта, что он, в отличие от рядового разработчика, просто еще и проектированием занимается, и, заканчивая тем, что он курирует junior'ов.

H>Рискну предположить, что разрабатываете что-то программно-аппаратное.


Точно.
Re[21]: собеседование
От: LordMAD Россия  
Дата: 18.01.10 13:00
Оценка:
Здравствуйте, Vzhyk, Вы писали:

>> Вообще, наше направление "embedded" заставляет серьезно относиться к

>> набору сотрудников.
V>А в остальных можно безответственно? Или ты что-то другое имел в виду?

Нет, конечно. Просто тут это заметнее, что ли.

>> Просто ошибки действительно очень дорого часто

>> обходятся.
V>Т.е. вы ищите, кто никогда не ошибается? А кто никогда не ошибается?
V>Закончишь фразу сам.

Никогда не ошибаться невозможно. Просто это не повод брать кого попало.
Просто чем дороже ошибка, тем для всех очевиднее, что лучше нормально платить, чтобы брать тех, кто делает меньше ошибок.
Re[22]: собеседование
От: Vzhyk  
Дата: 18.01.10 13:25
Оценка:
18.01.2010 15:00, LordMAD пишет:
>
> V>А в остальных можно безответственно? Или ты что-то другое имел в виду?
>
> Нет, конечно. Просто тут это заметнее, что ли.
Ни чем не заметнее, ровно одинаково. А то что ты пишешь — это
классический максимализм — "Мы круче всех".

>

> лучше нормально
> платить, чтобы брать тех, кто делает меньше ошибок.
Вот поэтому я и спросил, не Гугл ли вы?

P.S. Русские (белорусские, украинские) конторы, которые платят, как ты
описал выше, я не знаю вообще.
Posted via RSDN NNTP Server 2.1 beta
Re[19]: собеседование
От: LordMAD Россия  
Дата: 18.01.10 13:49
Оценка:
Здравствуйте, MozgC, Вы писали:

MC>Здравствуйте, LordMAD, Вы писали:


LMA>>В качестве аналогии классический пример, что называется "из учебника": человек унаследовал класс квадрата от класса прямоугольника. Понятно, что я привожу искусственный пример, зато относительно наглядный.


MC>Я конечно понимаю что вы начитались Роберта Мартина и его быструю разработку, и теперь все это стараетесь включить в вопросы на собеседованях, просто не забывайте что некоторые люди могут просто не знать умных названий и определений, но от этого они не обязательно становятся плохими специалистами. И даже наоборот, человек который вам перескажет главу из Боба Мартина по LSP и приведет все те примеры с прямоугольниками, квадратами, сетами и т.д. — не обязательно будет хорош на практике. Я знаю людей, которые не ответили бы на тот вопрос по LSP, но при этом у них по 10 лет опыта и они ПРЕКРАСНО делают свою работу. То же самое и по другим вашим вопросам. Что если человек не знает описание протокола kerberos? Все, он получается на архитектурный вопрос (это по вашему мнению) не ответил? А зачем вы собираетесь спрашивать вопросы о базах даннах в терминах реляционной алгебры? Разве кандидат у вас будет не c обычным SQL работать? Так может тогда лучше знания SQL и проверять? Дать к примеру задачку и попросить написать запрос ее решающий?


Я, к своему стыду, Роберта Мартина не читал. А еще я не очень хорошо отношусь к agile, но это другая история. Буду признателен, если Вы скажете, что именно из того, что я писал похоже на то, что написано там. Это я безо всякой иронии или скрытого смысла — мне правда интересно.

Я прекрасно понимаю, что может быть огромное число отличных разработчиков, которые никогда не знали или просто забыли, что такое LSP, никогда не имели ничего общего с kerberos, и при этом в состоянии разобраться с ним за 1 час. Просто моя цель на собеседовании — не выставить оценку человеку за его знания, а выбрать кандидата так, чтобы не взять неподходящего. Отсеять тех, кто возможно (всего лишь возможно) не подходит. Если мои вопросы "рубят" отличных разработчиков — это не проблема. Важно чтобы те, кто ответили — были отличными программистами.

Если для вакансии такой список тем, как я привел — этот человек не будет работать с конкретным диалектом SQL. Он будет писать что надо, например, в терминах реляционной алгебры, и передавать это специалистам по конкретным диалектам SQL. Я даже никогда не встречал человека, который хотя бы 3 диалекта SQL отлично знал, так что требовать всего — не вариант.
Re[7]: собеседование
От: swame  
Дата: 18.01.10 13:54
Оценка:
SA>Вы, когда мастеров-плиточников на работу нанимаете, тоже им задачки "собери 2 квадратных метра из 4 плиток" подкидываете? Или летку-еньку станцевать просите?

На плиточника не требуется несколько месяцев "въезжать в проект".
Если после найма не смог собрать трубемые 2 метра за 2-3 дня — просто выгоняется и все.
Re[20]: собеседование
От: MozgC США http://nightcoder.livejournal.com
Дата: 18.01.10 14:12
Оценка:
Здравствуйте, LordMAD, Вы писали:

LMA>Я, к своему стыду, Роберта Мартина не читал. А еще я не очень хорошо отношусь к agile, но это другая история. Буду признателен, если Вы скажете, что именно из того, что я писал похоже на то, что написано там. Это я безо всякой иронии или скрытого смысла — мне правда интересно.


Там написано про связь LSP с пред- и постусловиями, а так же есть пример с наследованием квадрата от прямоугольника. Так что складывается впечатление, что вы взяли это именно оттуда. Хотя возможно что-то из этого есть и у Мейера. Вы откуда взяли пример про прямоугольник с квадратом и связь LSP с контрактном? Насколько я помню, в статье Лисков этой связи не показано, да и я не уверен что в те времена уже было развито понятие design by contract, и лично я эту связь в купе с примером встречал только у Роберта Мартина.
Re[17]: собеседование
От: MescalitoPeyot Украина  
Дата: 18.01.10 16:17
Оценка:
Здравствуйте, Олег К., Вы писали:

ОК>Ну Си шарп вообще параноидальный.


Вот C++:

warning C4390: ';' : empty controlled statement found; is this the intent?


И в целом elmal прав.
... << RSDN@Home 1.2.0 alpha 4 rev. 1138>>
Re[21]: собеседование
От: LordMAD Россия  
Дата: 18.01.10 19:12
Оценка:
Здравствуйте, MozgC, Вы писали:

MC>Там написано про связь LSP с пред- и постусловиями,


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

MC>а так же есть пример с наследованием квадрата от прямоугольника.


Ну это классический пример из книги Скотта Мейерса Effective C++. Отличная книга, кстати. В top-5 книг по C++ я бы её точно включил.
Re[23]: собеседование
От: LordMAD Россия  
Дата: 18.01.10 19:48
Оценка:
Здравствуйте, Vzhyk, Вы писали:

>> лучше нормально

>> платить, чтобы брать тех, кто делает меньше ошибок.
V>Вот поэтому я и спросил, не Гугл ли вы?

Нет, и даже в нашем городе Google не присутствует.

На самом деле это просто экономия, хороший разработчик не настолько больше стоит, чем посредственный, насколько полезнее для дела.

V>P.S. Русские (белорусские, украинские) конторы, которые платят, как ты

V>описал выше, я не знаю вообще.

Просто обычно такое в не очень больших конторах, а они не так известны как крупные.
Re[18]: собеседование
От: Олег К.  
Дата: 18.01.10 22:37
Оценка:
MP>Вот C++:
MP>

warning C4390: ';' : empty controlled statement found; is this the intent?

MP>И в целом elmal прав.
И что, ты предлагаешь не помнить совсем синтаксис и полагаться на то что среда/компилятор подскажут или все-таки не допускать самому таких ситуаций в первую очередь? Я за последнее.
Re[18]: собеседование
От: Олег К.  
Дата: 18.01.10 22:50
Оценка:
LMA>Да я погляжу, ты себе вообще много чего представить не можешь. Я понимаю, что ты работаешь не в IT-конторе, и тебе сложно о таких вещах судить, но все же, честно говоря, разжевывать такие вещи мне лень.
Однако тебе не лень флеймить тут?

ОК>>И ты помнишь весь этот академический бред?

LMA>Да, потому что LSP — это базис. Я, конечно, понимаю, что есть люди, для которых и инкапсуляция — не более, чем "академический бред". Вообще меня увивляет количество людей, марширующих по знаменем воинствующего невежества. В чем кайф?
Вообще-то базис это сами понятия а не то как они называются. То что ты называешь LSP — это всего лишь fancy word.

LMA>>>Фраза "похоже на нарушение LSP" напротив объявления класса. Итересно — как бы это выглядело у тебя?

ОК>>Ты не умничай. Ты код покажи а я скажу как бы сказал. В наших code review как-то не было такой фигни. Уж и не знаю что вы там обсуждаете.
LMA>В качестве аналогии классический пример, что называется "из учебника": человек унаследовал класс квадрата от класса прямоугольника. Понятно, что я привожу искусственный пример, зато относительно наглядный.
Ха! Ты мне только что привел пример наследия а это, имхо, не есть само LSP. Если судить по слову substitution, то могу предположить что имеется в виду обычный полиморфизм — смособность разных объектов реагировать по-разному на одно и то же сообщение, если говорить академическим языком. То есть сам термин LSP применим к клиентскому коду который и работает с этими объектами.

И потом, я тебя не просил приводить мне пример наследования. Я тебя попросил привести конкретный пример (код) где бы ты сказал "похоже на нарушение LSP напротив объявления класса", а я бы объснил это по-своему.
Re[22]: собеседование
От: Олег К.  
Дата: 18.01.10 22:55
Оценка:
LMA>Ну, это сейчас вообще на каждом углу. Мы убрали его из корпоративного документа по собеседованиям после того, как это написали в английской википедии и количество знающий ответ заранее возросло. Кстати, очень жаль, потому что вопрос действительно очень хороший. Мне до сих пор не известно кто впервые обратил внимание на эту связь.
Все! Я понял. Вы там задались целью придумать вопросы на которые никто не ответит! Браво!
Re[23]: ну естественно
От: Pizarro  
Дата: 19.01.10 10:32
Оценка:
Здравствуйте, Олег К., Вы писали:

LMA>>Ну, это сейчас вообще на каждом углу. Мы убрали его из корпоративного документа по собеседованиям после того, как это написали в английской википедии и количество знающий ответ заранее возросло. Кстати, очень жаль, потому что вопрос действительно очень хороший. Мне до сих пор не известно кто впервые обратил внимание на эту связь.

ОК>Все! Я понял. Вы там задались целью придумать вопросы на которые никто не ответит! Браво!

в этом и цель — письками померяться
http://retiredwizard.livejournal.com/51355.html
Re[9]: собеседование
От: modev  
Дата: 19.01.10 17:10
Оценка:
Здравствуйте, Олег К., Вы писали:

M>>Не всегда и float можно взять, не говоря уж про double. Long long и прочее тоже может не поощряться. Например, вычисления для мобильных платформ в fixed point. Там даже при несложной физике много тонких моментов вылезает. Правда, те же физические движки для моб. игр пишут одна-две конторы, остальным это не особо нужно. Готовым пользуются уже.

ОК>Твоя правда но мы не говорим тут о какой-то экзотике в большинстве своем. Потом, разве на плюсах пишут игры для мобилок? А еще там код ужасный и те кто этим занимается сами хотят свалить. Были тут посты.

Для "продвинутых" смартфонов пишутся на C или C++.

M>>Если у чела компания чем-то подобным занимается, то задача вполне оправдана. Такое и нужно спрашивать.

ОК>Не знаю чем они там занимаются, но если давать такие задания, то надо честно предупреждать чтобы принималось во внимание переполнение.

Просто иногда из названия самой компании/подразделения это может быть очевидно.
Например, есть библиотеки Intel Performance Library Primitives, там про обработку сигналов, фильтры изображений и т.д. Так там есть много на целочисленные вычисления. Вроде бы куски этих библиотек в Нижнем Новгороде писали. Может, и под arm версии этих или подобных библиотек остались, даже после продажи этого подразделения.
Или всевозможные программы/сервисы для захвата и стриминга видео со смартфонов. Там тоже может быть, например, задача повышения резкости сразу после захвата с камеры. Тоже в целых числах задача. Или популярные разработки в стиле "преврати смартфон в web-камеру" для Symbian или Windows Mobile. Тоже может быть какая-то пост-обработка захватываемого видео.
Re[14]: собеседование
От: Олег К.  
Дата: 20.01.10 01:58
Оценка:
ОК>>Спрашиваю как внутри реализован std::list<>.
I>Можно узнать с какой целью задаются подобные вопросы?
Спрашиваю потому что считаю что программист должен знать стандартные структуры данных и понимать в каком случае лучше использовать ту или иную структуру данных. Ответить на этот вопрос занимает 20 секунд.

У тебя проблемы со структурами данных?
Re[20]: собеседование
От: Олег К.  
Дата: 20.01.10 02:42
Оценка:
MP>Я считаю что ситуаций в которых программисту надо о чем-то помнить, следить, обращать особое внимание должно быть как можно меньше. Надо ему пройтись по контейнеру от начала до конца — пусть так и пишет for each begin end, нужна длина строки — size; а все эти strlen'ы, char buffer[], +1, -1 — потенциальный багодром и на собеседовании лучше смотреть как соискатель умеет его избегать чем заставлять писать непривычный ему код и смотреть как он считает единички.
Вообще-то речь была о простом синтаксисе. И потом, программист должен не только уметь писать новый код но и поддерживать существующий. В чем-то я согласен с твоим утверждением, в чем-то нет, но я не хочу вдаваться в эти детали. Скажу только что для меня большее зло это когда я вижу ужасную логику (а точнее отсутсвие оной), всевозможные навороты и очень плотный текст. Порой бывает что рябить в глазах начинает от всех этих круглых скобок, фигурных и т.д.

MP>Точка с запятой вообще надуманная проблема, кода типа if (xxx); yyy(); ни разу не встречал, это может быть или неудачная копипаста или откровенное вредительство, но никак не результат незнания синтаксиса.

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

MP>В тоже время лично у меня половина ошибок первой компиляции если писать без IDE — пропущенная точка с запятой,

Ну что я могу сказать. У меня таких проблем не было. Надеюсь ты не лезешь в хелп чтобы написать цикл for?

MP>забытые инклуды и std:/boost::.

Такое бывает но это, опять-таки, не синтаксис.

MP>Смею вас заверить, где в С++ нужны/не нужны ';' и в каком пространстве лежит list/shared_ptr я знаю.

Да не сомневаюсь что знаешь. Невнимателен просто. Только ты прицепился к этой точке с запятой которая была лишь выбрана в качестве малюсенького примера. elmal, вон, вообще отказался от цикла for и это жестко!
Re[21]: собеседование
От: MescalitoPeyot Украина  
Дата: 20.01.10 08:38
Оценка:
Здравствуйте, Олег К., Вы писали:

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

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

ОК>Ну что я могу сказать. У меня таких проблем не было. Надеюсь ты не лезешь в хелп чтобы написать цикл for?

Нет. Зато, к статии, время от времени лезу чтоб проверить что там вернет strlen("a")/sizeof("a"), постоянно забываю. Было дело даже синтаксис main() забыл
... << RSDN@Home 1.2.0 alpha 4 rev. 1138>>
Re[2]: собеседование
От: shrecher  
Дата: 20.01.10 18:02
Оценка:
Здравствуйте, LordMAD, Вы писали:

LMA>Напишите функцию, вычисляющую среднее значение двух любых значений типа int:

LMA>int avg(int x, int y);

Есть люди теоретики, они ответят про переполнение и знаки. А есть люди — практики. Они просто сложат и поделят на два. Все-таки в программировании практики важнее, слишком приклодная отрасль. Для теоретиков тоже найдется работа, правда,не кодером.
Re[22]: собеседование
От: dilmah США  
Дата: 20.01.10 22:56
Оценка:
MP>Нет. Зато, к статии, время от времени лезу чтоб проверить что там вернет strlen("a")/sizeof("a"), постоянно забываю.

и хоть на одной архитектуре оно было отлично от нуля?
Re[21]: собеседование
От: elmal  
Дата: 21.01.10 08:45
Оценка:
Здравствуйте, Олег К., Вы писали:

ОК>Да не сомневаюсь что знаешь. Невнимателен просто. Только ты прицепился к этой точке с запятой которая была лишь выбрана в качестве малюсенького примера. elmal, вон, вообще отказался от цикла for и это жестко!

Я отказался не от цикла for в целом, а отказался от того варианта его использования, который практикуется спрашивать на собеседованиях ( for (int i = 0, int last = getLastElement(someCollection); i <= last; ++i), если мне память не изменяет и я на 1 не ошибся ). И то, в очень редких случаях приходится использовать, так что не совсем отказался. В 99% случаев вместо такой прелести на практике пишу for each. Но замечаю одно, те, кто проходят через собеседования, про for each почему то не знают, и для итерирования по коллекциям пушут всякие for (причем размер вычисляют на каждом проходе, а не как я написал), особенно красиво это выглядит, когда итерируешься по связанному списку — тормоза на ровном месте.
У меня претензии то к собеседующим даже не из-за меня, а из-за того, кого нанимаете в результате таких вопросов. Гоняете по синтаксису, и, и один черт пропускаете тех, которые базовых вещей не знают, даже в плане синтаксиса. Постоянно у них открытия про то, что бывают переполнения, что числа с плавающей запятой нельзя так же сравнивать, как целые, и тому подобное — один черт пропускаете. В результате принимаете тех, кто и в синтаксисе ошибаются, и задачи рабочие решать не может, все решения в лоб в спагетти стиле, никакой инициативы, а если инициатива и есть, то вида — а давайте заюзаем фреймворк такой-то, так как это модно. Но, очень хорошо этими вопросами фильтруете тех, кто может эффективно решать требуемые проекту задачи, так как если ошибся на -1 или не поставил точку с запятой на бумажке, то говорим "до свидания, мы вам обязательно перезвоним, а пока нам надо подумать".
Re[23]: собеседование
От: MescalitoPeyot Украина  
Дата: 21.01.10 20:22
Оценка:
Здравствуйте, dilmah, Вы писали:


MP>>Нет. Зато, к статии, время от времени лезу чтоб проверить что там вернет strlen("a")/sizeof("a"), постоянно забываю.


D>и хоть на одной архитектуре оно было отлично от нуля?


Не-не-не, дело не в архитектурах, я имел в виду "и", а не деление. Просто забываю когда считается/не считается конечный '\0'
... << RSDN@Home 1.2.0 alpha 4 rev. 1138>>
Re[10]: собеседование
От: dilmah США  
Дата: 21.01.10 21:35
Оценка:
E>С memcpy() конечно перебор (для копирования одного байта, как я понял ). Но стоило хоть поинтересоваться для чего он так сделал. Вдруг в этом смысл какой, и от этого все станет в 100 раз быстрее и надежнее работать, а забраковали слишком умного . Я вот лично привык подвергать свои знания сомнению. Всегда думаю — а вдруг я не прав, и в говнокоде есть какой-то сакральный смысл ? Сможет меня убедить, что именно так и надо писать — такого человека надо нанимать. Не сможет — увы, я слишком глуп чтоб понять великие идеи, мы не сработаемся, лучше собеседуйтесь на мое место.

на моем самом первом собеседовании десяток лет тому назад примерно такое и произошло. Зашла речь об auto и static переменных, и меня спросили какие из них использовать в рекурсивных функциях. Я ответил, что везде где это можно нужно ставить static. Я имел в виду переменные которые не нужно сохранять после рекурсивного вызова. Это довольно тонкая мысль, близкая к tail call optimization. Естественно, меня не поняли
Re[16]: собеседование
От: Олег К.  
Дата: 22.01.10 02:56
Оценка:
I>Одно дело знать структуры данных и представлять как они обычно должны быть устроенны, другое дело лезть в реализацию конкретного std::list от конкретного производителя и запоминать её.
А что, разные "производители" могут как-то очень по-разному заимплементить std::list<>? Я о концепциях тут.

I>Мне к примеру список понадобился один/два раза всего, ввиду того что он мало подходит для моей деятельности. И мне как то приетит, из-за использования листа в двух местах, лесть и смотреть как его конкретно сделала Dinkumware.

Это уж слишком.

I>Или я тебя не правильно понял?

Именно что неправильно.
Re[22]: собеседование
От: Олег К.  
Дата: 22.01.10 03:25
Оценка:
E>У меня претензии то к собеседующим даже не из-за меня, а из-за того, кого нанимаете в результате таких вопросов.
И теперь ты все решил высказать мне за всех плохих собеседующих?

E>Гоняете по синтаксису, и, и один черт пропускаете тех, которые базовых вещей не знают, даже в плане синтаксиса.

По синтаксису не гоняю. Спрашиваю (точнее спрашивал) понятия. Пара вопросов на счет синтаксиса и/или небольшая задачка — это чтобы понять может ли человек хоть что-то или нет.

Вообще мы как бы говорим тут о синтаксисе, но вместе с тем говорим о Фоме и о Ереме в пределах синтаксиса. Я вижу что для тебя это больная тема и, поверь, мне тоже не доставляет удовольствия копаться в тоннах уже написанного мусора или видеть как некоторые из моих настоящих сотрудников пишут в том же духе.
Re[19]: собеседование
От: LordMAD Россия  
Дата: 22.01.10 05:41
Оценка:
Здравствуйте, Олег К., Вы писали:

ОК>Однако тебе не лень флеймить тут?


Действительно, твои посты — сплошной флейм: нет аргументов, нет собственных решений, только одно желание покритиковать других. С тобой действительно больше не о чем говорить.

ОК>Если судить по слову substitution, то могу предположить что имеется в виду обычный полиморфизм — смособность разных объектов реагировать по-разному на одно и то же сообщение, если говорить академическим языком.


Ты правда думаешь, что кому-то интересно читать твои неверные предположения?

ОК>И потом, я тебя не просил приводить мне пример наследования. Я тебя попросил привести конкретный пример (код) где бы ты сказал "похоже на нарушение LSP напротив объявления класса", а я бы объснил это по-своему.


Я именно такой пример и привел. Или ты словами не понимаешь, тебе нужен код?
Re[10]: собеседование
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 22.01.10 09:32
Оценка:
Здравствуйте, LordMAD, Вы писали:

LMA>>>Это в каких?


I>>например avg (2,3) == avg (3,2) даёт false,


LMA>Да и это не проблема, потому что для получения среднего с заданной точностью (в виде int), естественно имеет место округление. Так как в задании не указан конкретный вид округления, случайное округление вполне подходит.


Дело не в погрешности, в том среднее арифметическое коммутативна, а твоя функция этому условию не удовлетворяет.

Потому avg с помощью приведения типа от int к double и обратно будет смотреться во первых проще, во вторых не будет ошибок

А с учетом "случайное округление вполне подходит" то x/2 + y/2 вполне подходит под это условие

I>>а надо true, иначе это не среднее арифметическое


LMA>Бред.

LMA>Или Вы можете привести ссылку на такое требование к среднему арифметическому в общем случае?

Среднее арифметическое — коммутативная функция, что следует из её определения.

Тут даже матан и функан знать не нужно.

I>>Сколько раз ты её давал на собеседовании ?


LMA>Не считал, а что?


Это был риторический вопрос.
Re[16]: собеседование
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 22.01.10 09:47
Оценка:
Здравствуйте, LordMAD, Вы писали:

I>>Да и это очень важно. Потому как часто бывает проекты кочуют между бригадами. Одн начали, другие продолжили.


LMA>Это важно для IT-шных McDonald's-ов,


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

I>>Если код не прозрачный, то сразу начнется хаос


LMA>Вопрос, в том какой код считать прозрачным.


Я привел нормальный критерий, когда с проектами работают разные бригады, т.е. в каждой опытные девелоперы.
Re[23]: собеседование
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 22.01.10 09:53
Оценка:
Здравствуйте, Олег К., Вы писали:

LMA>>Ну, это сейчас вообще на каждом углу. Мы убрали его из корпоративного документа по собеседованиям после того, как это написали в английской википедии и количество знающий ответ заранее возросло. Кстати, очень жаль, потому что вопрос действительно очень хороший. Мне до сих пор не известно кто впервые обратил внимание на эту связь.

ОК>Все! Я понял. Вы там задались целью придумать вопросы на которые никто не ответит! Браво!

Может они сами ответы ищут ?
Re[11]: собеседование
От: LordMAD Россия  
Дата: 23.01.10 20:24
Оценка:
Здравствуйте, elmal, Вы писали:

LMA>>Да и это не проблема, потому что для получения среднего с заданной точностью (в виде int), естественно имеет место округление. Так как в задании не указан конкретный вид округления, случайное округление вполне подходит.

E>Ни черта себе случайное округление вполне подходит! Это потенциальный баг гораздо круче, чем если просто произошло бы переполнение. Переполнение то заметить легко.

Это ты про сферического коня в вакууме?

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


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

E>На это вполне логично закладываться. И в данном случае на практике (именно на практике) вероятность огрести проблемы с этой мегафункцией гораздо больше, чем в случае, если просто сложить 2 числа и подетить на 2, без проверки на переполнение. Не так часто будут функцией пользоваться для достаточно больших данных, скорее всего, а вот вызывать ее с разным порядком параметров будут постоянно. И лично я предпочту пользоваться функций без проверки на переполнение, чем функцией, которая возвращает разные значения при разном порядке аргументов. У тебя ошибка гораздо грубее!!!


Ты опять пытаешься обсуждать сферического коня в вакууме. Пытаешься оправдать плохое решение какой-то статистикой. Как я уже писал в этой теме — решение посчитать просто, но сначала вставив assert — верное для этого примера. Ты просто не понимаешь, что задача имеет несколько решений, у каждого из них есть свои достоинства и недостатки. Я лишь привел вариант решения этой задачки, который я считаю достаточным для того, чтобы сделать соответствующий вывод о кандидате.
Re[11]: собеседование
От: LordMAD Россия  
Дата: 23.01.10 20:35
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Дело не в погрешности, в том среднее арифметическое коммутативна, а твоя функция этому условию не удовлетворяет.


Ты наверное удивишься, но вариант функции avg, который я привел, удовлетворяет этом условию с заданной точностью (в данном случае с точностью до 1 так как имеет место округление до целых).

I>Потому avg с помощью приведения типа от int к double и обратно будет смотреться во первых проще, во вторых не будет ошибок


Это ты к чему?

I>А с учетом "случайное округление вполне подходит" то x/2 + y/2 вполне подходит под это условие


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

I>>>а надо true, иначе это не среднее арифметическое


LMA>>Бред.

LMA>>Или Вы можете привести ссылку на такое требование к среднему арифметическому в общем случае?

I>Среднее арифметическое — коммутативная функция, что следует из её определения.


См. выше по поводу коммутативности.
Re[15]: собеседование
От: LordMAD Россия  
Дата: 23.01.10 21:06
Оценка:
Здравствуйте, Ikemefula, Вы писали:

LMA>>Ну тогда по твоей логике, правильный ответ должен быть

LMA>>int avg(int x, int y) { return 0; }
LMA>>Ведь в нем очень легко найти ошибку!

I>(x+y)/2 (int)(((double)x+(double)y)/2)


I>любой из них будет проще


Ты правда не видишь разницы между совершенно неверным результатом и не тем вариантом округления, который ты почему-то предполагаешь?

LMA>>Если ты можешь предложить вариант решения, который (1) будет работать правильно для, как сказано в задании, "любых значений типа int"


I>твой то этому условию не удовлетворяет


Потому что округление до целых роисходит не так как ты предполагаешь?

I> и (2) будет проще (хотя бы с точки зрения поиска ошибок) и при этом (3) не будет привязан к конкретной платформе — придложи и мы его обсудим.


I>Я сделал это минима трижды в этом топике.


Ну так ткни носом, потому что я что-то таких не вижу.

I>P.S. ты даешь задачу на собеседовании, а сам придумал какие то свои критерии правильности.


А в чем проблема? Если он напишет решение, которое будет верно и с моей точки зрения, и округление будет как тебе хочется, я такое решение засчитаю.

I>Откуда собеседуемому знать, что у тебя особое мнение на тему коммутативности?


Во-первых, если у него есть сомнения, он может спросить. Во-вторых, как я уже написал, если он использует другой вариант округления, задача тоже будет решена верно.
Re[5]: собеседование
От: LordMAD Россия  
Дата: 23.01.10 21:22
Оценка:
Здравствуйте, elmal, Вы писали:

E>В своем решении ты лично внес в код баг, причем больший, чем те, кто просто складывает. Причем ты находился не в стрессовой ситуации, а в спокойной, и все равно ошибся. Почему тебе ошибаться можно, а остальным нет? Если требователен к другим, то надо быть требовательным и к себе, так?


Еще раз повторю: то, что ты называешь багом в моём примере — багом не является, по крайней мере, по моему мнению, и, по мнению моих коллег. Такой вариант решения, как привел я, из кандидатов давали десятки людей. Вариант решения с другим округлением давали всего несколько человек, и так как я не считаю его сильно лучше, здесь я его не привожу. Если требуется какой-то определенный вариант округления, у нас в спецификации об этом явно говорится, и я не думаю, что кто-то из кандидатов, решивших эту задачу тем способом, который привел я, если ему поставить условие применения конкретного варианта округления, не сделает этого.
Re[16]: собеседование
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 24.01.10 09:08
Оценка:
Здравствуйте, LordMAD, Вы писали:

I>>твой то этому условию не удовлетворяет


LMA>Потому что округление до целых роисходит не так как ты предполагаешь?


Потому что ты нарушил основное свойство функции — коммутативность.

I>>Я сделал это минима трижды в этом топике.


LMA>Ну так ткни носом, потому что я что-то таких не вижу.


Два из них было прямо в том сообщении на которое ты писал ответ. Более того — они был виден и в твоем тексте.

Мне интересно, на собеседовании ты тоже "скромно" не заметишь ответ ?

I>>P.S. ты даешь задачу на собеседовании, а сам придумал какие то свои критерии правильности.


LMA>А в чем проблема? Если он напишет решение, которое будет верно и с моей точки зрения, и округление будет как тебе хочется, я такое решение засчитаю.


С даблами то решение тебе не нравится почему то

I>>Откуда собеседуемому знать, что у тебя особое мнение на тему коммутативности?


LMA>Во-первых, если у него есть сомнения, он может спросить.


Во первых ты и сам не знал, что нарушил свойство коммутативности.

LMA>Во-вторых, как я уже написал, если он использует другой вариант округления, задача тоже будет решена верно.


Во вторых тогда x/2 + y/2 тоже всего лишь другой вариант округления
Re[7]: собеседование
От: LordMAD Россия  
Дата: 26.01.10 20:48
Оценка:
Здравствуйте, elmal, Вы писали:

E>И что с того, что по твоему мнению не является?


Тоже, что и с того, что по твоему мнение это баг.

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


Далеко не всех набирал я.

E>Баг с переполнением тоже по мнению очень большого количества людей багом не является, и вариант такой даюь еще большее количество людей.


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

E>Вот еще одно скажу. Не страшно, если кандидат ошибся, гораздо сложнее, когда он не признает свои ошибки. Если кандидат ошибся — выясни, случайно он ошибся или потому, что не в курсе. И посмотри как он исправит свою ошибку. Если ошибся, признал, и исправил — ему плюс такой же, как если б не ошибался. А вот если настаивает что это не баг, это фича — я как то сомневаюсь что таких стоит брать.


Если ты намекаешь на меня — то очевидный факт, что функция дает разные результаты (±1) при смене порядка аргументов, мне был известен до того, как я впервые использовал этот вопрос на собеседовании. И именно потому, что я не вижу в этом проблемы, я этот пример использовал.

E>Иначе как в одном проекте будет — в ключевой библиотеке, от которой зависят куча людей, ошибка, исходников нет, репортишь баг, так как поведение очень странно, нелогично, и вообще выглядит случайным. Говорят что не баг, разбирайтесь в своем коде, вообще вы идиоты, ни черта не можете, отстаньте, мы заняты важными делами. Простейшая фича висит 2 месяца в результате, перепробываются все обходные пути, не получается. Начинает интересоваться высший менеджмент, а что так долго (не просто типичный ПМ, а практически владелец конторы опускается до этого, причем спрашивает разработчиков лично)? В результате фичу просят сделать разработчиков библиотеки, и тут они признают, что ее никак не сделать, и наконец исправляют баг в библиотеке (перелопатив ее черти как, исправляют долго, и исправив обрушив другие места). И так постоянно. Реальный случай.


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

Вообще мне не понятна ситуация, при которой у использующих библиотеку нет исходных кодов к библиотеке — это создает настолько критическую зависимость, что не понятно — куда вообще это годится. Если добровольно сели "на иглу", то чего возмущаться то?
Re[10]: собеседование
От: Young yunoshev.ru
Дата: 27.01.10 00:22
Оценка:
Здравствуйте, modev, Вы писали:

M>Здравствуйте, Олег К., Вы писали:


M>>>Не всегда и float можно взять, не говоря уж про double. Long long и прочее тоже может не поощряться. Например, вычисления для мобильных платформ в fixed point. Там даже при несложной физике много тонких моментов вылезает. Правда, те же физические движки для моб. игр пишут одна-две конторы, остальным это не особо нужно. Готовым пользуются уже.

ОК>>Твоя правда но мы не говорим тут о какой-то экзотике в большинстве своем. Потом, разве на плюсах пишут игры для мобилок? А еще там код ужасный и те кто этим занимается сами хотят свалить. Были тут посты.

M>Для "продвинутых" смартфонов пишутся на C или C++.


Если покажите мне игру написанную для "продвинутого" смартфона на С вышлю вам 100 баксов.

А вообще конечно даже для "продвинутрых" смартфонов подавляющее (думаю процентов 90% если считать от количества) игр пишется не на с++.
Re[4]: собеседование
От: shrecher  
Дата: 27.01.10 05:08
Оценка:
Здравствуйте, LordMAD, Вы писали:

LMA>Здравствуйте, shrecher, Вы писали:


S>>Здравствуйте, LordMAD, Вы писали:


LMA>>>Напишите функцию, вычисляющую среднее значение двух любых значений типа int:

LMA>>>int avg(int x, int y);

S>>Есть люди теоретики, они ответят про переполнение и знаки. А есть люди — практики. Они просто сложат и поделят на два. Все-таки в программировании практики важнее, слишком приклодная отрасль. Для теоретиков тоже найдется работа, правда,не кодером.


LMA>Ничего подобного. Если человек просто сложит и поделит — это означает, что его код будет работать не в соответствии с тем заданием, которое он получил.


чесно говоря, я не понял, почему он не будет работать в соответствии с заданием? К примеруЮ


int avg( int a, int b)
{
    return (a+b)/2;
}

int _tmain(int argc, _TCHAR* argv[])
{
    printf( "test %d\n", avg( -2, -4) );
    printf( "test %d\n", avg( 2, 4) );
    printf( "test %d\n", avg( 2, -4) );
    printf( "test %d\n", avg( -2, 4) );
    
    return 0;
}


печатает законные значения:

test -3
test 3
test -1
test 1


че не так-то?!
Re[5]: собеседование
От: LordMAD Россия  
Дата: 27.01.10 05:22
Оценка:
Здравствуйте, shrecher, Вы писали:

S>чесно говоря, я не понял, почему он не будет работать в соответствии с заданием? К примеруЮ


S>

S>int avg( int a, int b)
S>{
S>    return (a+b)/2;
S>}

S>int _tmain(int argc, _TCHAR* argv[])
S>{
S>    printf( "test %d\n", avg( -2, -4) );
S>    printf( "test %d\n", avg( 2, 4) );
S>    printf( "test %d\n", avg( 2, -4) );
S>    printf( "test %d\n", avg( -2, 4) );
    
S>    return 0;
S>}

S>


S>печатает законные значения:


S>

S>test -3
S>test 3
S>test -1
S>test 1


S>че не так-то?!


avg(INT_MAX, INT_MAX)
Re[18]: собеседование
От: WPooh США  
Дата: 27.01.10 07:45
Оценка:
Здравствуйте, elmal, Вы писали:

E>Здравствуйте, Олег К., Вы писали:


ОК>>Ну Си шарп вообще параноидальный. Бывает что переменная инициализируется при каких-то условиях, затем ниже по коду используется уже когда она была гарантированно иницализрованна, так он ругается что она не всегда инициализированна. Приходится при объявлении ставить какое-то начальное значение.

E>Я вообще то в книгах по плюсам видел рекомендацию всегда ставить переменным начальное значение. Хотя бы NULL.
А потом запускаем FxCop aka пунктик "Analyze Code" и он сообщает, что рантайм инициализацию делает автоматически, что надо убрать.
В общем, про "всегда" я был бы осторожен. Можно рассматривать частные случаи, когда такое будет, когда нет, и пр.
Оно только потом запоминается: строчку, целое и пр. — инициализуем string.Empty, объект — не надо, будет автоматом.
Я в том, что написал сверху не уверен, надо вспоминать/проверять, но вроде так было в C#.
К этому моменту у меня внутри 0.5, 0.7, 0.33 (с) НС
Re[19]: собеседование
От: elmal  
Дата: 27.01.10 08:36
Оценка:
Здравствуйте, WPooh, Вы писали:

WP>А потом запускаем FxCop aka пунктик "Analyze Code" и он сообщает, что рантайм инициализацию делает автоматически, что надо убрать.

Так если использовать автоматические инспекции, то про то, инициализировать или нет можно вообще не задумываться . Если матерится — править чтоб не материлось. Не матерится — значит все хорошо. У меня была в свое время привычка все инициализировать, когда инспекций не было. Как появились инспекции — им стал доверять, пока поводов для недоверия они мне не дали.
Re[14]: собеседование
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 27.01.10 10:35
Оценка:
Здравствуйте, LordMAD, Вы писали:

I>>в таком случае вариант x/2 + y/2 вообще идеальный. Погрешность в нем та же но он коммутативен.


LMA>В каком месте у него такая же погрешность? Среднее двух 1 точно равно 1, так как округления нет, а эта формула дает 0.


В твоей формуле округление в одном месте, в моей в другом.

Мой вариант коммутативный, твой — нет, а точность одна и та же.

I>>но вообще у тебя своя формулировка свойства коммутативности и алгоритмы, явно или неясно использующие эту коммутативность работать у тебя не будут.


LMA>Будут, если написаны правильно.


Не будут. Потому что после твоего трикса придется сравнивать целые числа вот так

abs(avg1-avg2) <=1

Что однозначно есть бред.

LMA>Я так понимаю, что если тебя попросят вычислить среднее с точностью до 100, то ты скажешь, что с точностью до 100 это уже будет не среднее арифметическое?


дело не в точности, а в коммутативности, см. выше


I>>avg(a,avg(b,avb(c,...)))


I>>чувствуешь, куда я клоню ?


LMA>К тому, что (1/2 + (3/2 + 5/2)/2) == 1 для твоего "идеального" варианта "x/2 + y/2"?


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

В моем же случае пострадает всего лишь точность.

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

В моем случае — корректировку на нечетные аргументы.

В итоге как ни крути твой вариант все равно хромает, т.к. слишком много кода.
Re[18]: собеседование
От: blackhearted Украина  
Дата: 27.01.10 11:21
Оценка:
Здравствуйте, LordMAD, Вы писали:

LMA>Только почему "Лискова"? Если уж коверкать на русский манер, то получится "Лисковой". Хотя она, конечно, Лисков.


LMA>Ну, под senior вообще каждый своё понимает. Начиная от варианта, что он, в отличие от рядового разработчика, просто еще и проектированием занимается, и, заканчивая тем, что он курирует junior'ов.


H>>Рискну предположить, что разрабатываете что-то программно-аппаратное.


LMA>Точно.


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

И на самом деле я множество книг не читал,а вопросики могут всплыть и выйдет, что набираются "читатели умных книг".
Re[7]: собеседование
От: LordMAD Россия  
Дата: 02.02.10 06:05
Оценка:
Здравствуйте, shrecher, Вы писали:

LMA>>avg(INT_MAX, INT_MAX)


S>кому это надо? Если хочется складывать сверх большие цифры используй __int64.


А тебе не приходило в голову, что не все программируют исключительно под VC++?
Re[15]: собеседование
От: LordMAD Россия  
Дата: 02.02.10 06:16
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Мой вариант коммутативный, твой — нет, а точность одна и та же.


Одна и та же точность результата?

I>>>но вообще у тебя своя формулировка свойства коммутативности и алгоритмы, явно или неясно использующие эту коммутативность работать у тебя не будут.


LMA>>Будут, если написаны правильно.


I>Не будут. Потому что после твоего трикса придется сравнивать целые числа вот так


I>abs(avg1-avg2) <=1


Нет, не так. Догадаешься как сравнивать надо?

LMA>>Я так понимаю, что если тебя попросят вычислить среднее с точностью до 100, то ты скажешь, что с точностью до 100 это уже будет не среднее арифметическое?


I>дело не в точности, а в коммутативности, см. выше


Дело в точности.

I>В моем же случае пострадает всего лишь точность.


Да. как и для return 0;

I>И вообще говоря не ясно с чем ты споришь, тебе надо добавить сортировку параметров в начале функции и всех делов.


Я спорю с тем, что это НАДО добавить.

I>В моем случае — корректировку на нечетные аргументы.


I>В итоге как ни крути твой вариант все равно хромает, т.к. слишком много кода.


По сравнению с чем? С return 0 ?
Re[19]: собеседование
От: LordMAD Россия  
Дата: 02.02.10 06:28
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>>>Потому что ты нарушил основное свойство функции — коммутативность.


LMA>>Еще раз: коммутативность выполняется c заданной точностью (с точностью до округления до целых).


I>Это значит что коммутативность отсутствует.


Да ну?

I>Решение простое — сортировать аргументы. Одна строчка кода и проблемы как не бывало. Только при этом твой вариант однозначно становтся говнокодом, хотя и правильным.


Интересно узнать, что за критерий для говнокода ты имеешь в виду?

LMA>>Я кажется начинаю догадываться: ты на полном серьезе думаешь, что "(x+y)/2" "будет работать правильно для, как сказано в задании, "любых значений типа int", то есть когда среднее значение двух положительных чисел получается отрицательным?


I>Уже было сказано не единожды — ошибку с переполнением найти гораздо легче, чем твою мега-коммутативность.


При чем тут — какую ошибку легче найти? По-твоему, если человек делает ошибку, но эту ошибку легко найти, это его оправдывает?

LMA>>А "(int)(((double)x+(double)y)/2)" "не будет привязан к конкретной платформе", то есть ты правда думаешь, что для ILP64 преобразование из int в double будет корректным?

I>>>С даблами то решение тебе не нравится почему то
LMA>>Хотя бы потому что нет способа запихнуть 64 бита в 53 бита без потерь.

I>Для 32х бит работает идеально.


Ну вот и пусть те, кто в состоянии мыслить только в пределах одной платформы, идут лесом.
Re[19]: собеседование
От: LordMAD Россия  
Дата: 02.02.10 06:59
Оценка:
Здравствуйте, blackhearted, Вы писали:

LMA>>Только почему "Лискова"? Если уж коверкать на русский манер, то получится "Лисковой". Хотя она, конечно, Лисков.


LMA>>Ну, под senior вообще каждый своё понимает. Начиная от варианта, что он, в отличие от рядового разработчика, просто еще и проектированием занимается, и, заканчивая тем, что он курирует junior'ов.


H>>>Рискну предположить, что разрабатываете что-то программно-аппаратное.


LMA>>Точно.


B>Да, особенно важно название принципов из книжек

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

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


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

Например, мне встречались программисты под Windows, которые достаточно часто пользовались CreateProcess, чтобы помнить порядок аргументов наизусть, но при этом не понимали четко, за что ответственны процессы, а за что потоки.
Re[16]: собеседование
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 02.02.10 09:41
Оценка:
Здравствуйте, LordMAD, Вы писали:

I>>Мой вариант коммутативный, твой — нет, а точность одна и та же.


LMA>Одна и та же точность результата?


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

I>>abs(avg1-avg2) <=1


LMA>Нет, не так. Догадаешься как сравнивать надо?


при правильной реализации вот так, avg1 == avg2

а в твоем случае это вариант применить нельзя из за мега-коммутативности

I>>дело не в точности, а в коммутативности, см. выше


LMA>Дело в точности.


коммутативность влияет на операцию сравнения


I>>И вообще говоря не ясно с чем ты споришь, тебе надо добавить сортировку параметров в начале функции и всех делов.


LMA>Я спорю с тем, что это НАДО добавить.


еще раз — если ты использовал свою мега-функцию, то обязан пройт по коду и все явные или неявные сравнения результатов переписать, потому что код
avg1 == avg2
больше работать не будет по причине "коммутативности".


I>>В итоге как ни крути твой вариант все равно хромает, т.к. слишком много кода.


LMA>По сравнению с чем? С return 0 ?


по сравнению с другими вариантами
Re[21]: собеседование
От: LordMAD Россия  
Дата: 05.02.10 06:07
Оценка:
Здравствуйте, Ikemefula, Вы писали:

LMA>>>>Еще раз: коммутативность выполняется c заданной точностью (с точностью до округления до целых).


I>>>Это значит что коммутативность отсутствует.


LMA>>Да ну?


I>именно так. потому что в твоем случае после применения мега-функции i == j писать уже нельзя.


А какое отношение "i == j" имеет к коммутативности?

I>>>Решение простое — сортировать аргументы. Одна строчка кода и проблемы как не бывало. Только при этом твой вариант однозначно становтся говнокодом, хотя и правильным.


LMA>>Интересно узнать, что за критерий для говнокода ты имеешь в виду?


I>слшком много кода и слишком много логики для решения простой задачи.


Если ты сумеешь таки привести решение корректное и не зависимое от платформы, которое будет содержать меньше кода, тогда сможешь такое утверждать, а пока это bullshit.

LMA>>При чем тут — какую ошибку легче найти? По-твоему, если человек делает ошибку, но эту ошибку легко найти, это его оправдывает?


I>Нет, но если человек сделал ошбку вроде твоей и не хочет признавать так же как и ты — его вина гораздо более серьезная.


Просто твои "аргументы", что в решении, которое я привел есть ошибка — просто смехотворны.

LMA>>>>А "(int)(((double)x+(double)y)/2)" "не будет привязан к конкретной платформе", то есть ты правда думаешь, что для ILP64 преобразование из int в double будет корректным?

I>>>>>С даблами то решение тебе не нравится почему то
LMA>>>>Хотя бы потому что нет способа запихнуть 64 бита в 53 бита без потерь.

I>>>Для 32х бит работает идеально.


LMA>>Ну вот и пусть те, кто в состоянии мыслить только в пределах одной платформы, идут лесом.


I>начни с себя.


Re[17]: собеседование
От: LordMAD Россия  
Дата: 05.02.10 06:18
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>>>Мой вариант коммутативный, твой — нет, а точность одна и та же.


LMA>>Одна и та же точность результата?


I>Дело не в точности результата, а в том, что коммутативность влияет например на операцию сравнения.


I>>>abs(avg1-avg2) <=1


LMA>>Нет, не так. Догадаешься как сравнивать надо?


I>при правильной реализации вот так, avg1 == avg2


Да ну?



LMA>>Я спорю с тем, что это НАДО добавить.


I>еще раз — если ты использовал свою мега-функцию, то обязан пройт по коду и все явные или неявные сравнения результатов переписать, потому что код

I>avg1 == avg2
I>больше работать не будет по причине "коммутативности".

Так пусть тот, кто по глупости писал "avg1 == avg2" (потому что чего-то там себе напридумывал, чего в контракте нету) и исправляет свой баг. С тем же успехом он может и числа с плавающей точкой сравнивать через == ...

I>>>В итоге как ни крути твой вариант все равно хромает, т.к. слишком много кода.


LMA>>По сравнению с чем? С return 0 ?


I>по сравнению с другими вариантами


Так ты приведи хоть один корректный вариант, не привязанный к платформе... В частности, который не подразумевает, что int имеет размер 32 бита, как твой последний "шедевр"...
Re[18]: собеседование
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 05.02.10 10:44
Оценка:
Здравствуйте, LordMAD, Вы писали:

LMA>>>Нет, не так. Догадаешься как сравнивать надо?


I>>при правильной реализации вот так, avg1 == avg2


LMA>Да ну?


LMA>


Именно так, потому что это сравнение целых.

LMA>Так пусть тот, кто по глупости писал "avg1 == avg2" (потому что чего-то там себе напридумывал, чего в контракте нету) и исправляет свой баг. С тем же успехом он может и числа с плавающей точкой сравнивать через == ...


О чем и речь — твой мега-код влияет на сравнение целых чисел.
Re[22]: собеседование
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 05.02.10 10:55
Оценка:
Здравствуйте, LordMAD, Вы писали:

I>>именно так. потому что в твоем случае после применения мега-функции i == j писать уже нельзя.


LMA>А какое отношение "i == j" имеет к коммутативности?


Потому что например i и j может вернуть функция которая _неявно_ использует avg.

I>>слшком много кода и слишком много логики для решения простой задачи.


LMA>Если ты сумеешь таки привести решение корректное и не зависимое от платформы, которое будет содержать меньше кода, тогда сможешь такое утверждать, а пока это bullshit.


I>>Нет, но если человек сделал ошбку вроде твоей и не хочет признавать так же как и ты — его вина гораздо более серьезная.


LMA>Просто твои "аргументы", что в решении, которое я привел есть ошибка — просто смехотворны.


Да, не все понимают свойтсво коммутативности, с этим я ничего не могу поделать.
Re[23]: собеседование
От: LordMAD Россия  
Дата: 05.02.10 11:36
Оценка:
Здравствуйте, Ikemefula, Вы писали:

LMA>>А какое отношение "i == j" имеет к коммутативности?


I>Потому что например i и j может вернуть функция которая _неявно_ использует avg.


И что?
Re[23]: собеседование
От: LordMAD Россия  
Дата: 05.02.10 12:07
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Вроде уже было показано несколько недель назад,


Вроде нет.

I>но на всякий случай еще раз


I>int avg(int a,int b)

I>{
I> return a/2 + b/2 + (a%2+b%2)/2;
I>}

Да, это хорошее решение.

Но на мой взгляд, по его внешнему виду менее очевидно (по сравнению с тем, что приводил я), что оно дает правильные значения на граничных значениях. Понятно, что это очень субъективно и для других — может быть с точностью наоборот.
Re[24]: собеседование
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 05.02.10 12:11
Оценка:
Здравствуйте, LordMAD, Вы писали:

LMA>Здравствуйте, Ikemefula, Вы писали:


LMA>>>А какое отношение "i == j" имеет к коммутативности?


I>>Потому что например i и j может вернуть функция которая _неявно_ использует avg.


LMA>И что?


И то, что после введения твоей функции придтся использовать сравнение целых чисел с оглядкой на твою функцию
Re[21]: собеседование
От: LordMAD Россия  
Дата: 06.02.10 17:47
Оценка:
Здравствуйте, elmal, Вы писали:

E>Здравствуйте, LordMAD, Вы писали:


LMA>>Ладно, объясню на наглядном примере: представь девайс который измеряет температуру и у тебя есть функция которая возвращает показание прибора в °С в виде целого числа. Прибор пусть будет с низкой точностью (например, он на базе термопары на эффекте Зеебека) — возвращает результат с точностью до 1°С. Помещаем прибор в комнату, где поддерживается постоянная температура с достаточной точностью. Вопрос: исправен ли прибор, если функция возвращает тебе сначала 20, а потом 21? Корректно ли проверять правильность прибора, надеясь, что он будет возвращать одинаковые значения при неизменной температуре которую он измеряет?


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


По сравнению с IEEE 754 — это мелочь.

E>функция нахождения среднего, она имеет смысл для N элементов, а не для двух.


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

E>На практике лично я бы сделал так: Пытался бы привести к большему типу, а далее стандартной математической формулой (просуммировал и разделил на n.


Выше в этой тему уже обсуждалось — поищи по ILP64.

E>Прошу заметить — не на 2, а на n, так как программист должен знать 3 числа — 0, 1 и n).


Ты слишком упрощаешь. Есть простые вещи, которые действительно имеет смысл реализовывать для n, а есть такие — для которых смысла в этом нет.

E>При необходимости кроссплатформенности — вначале проверил бы, что я действительно буду кастить к типу с большей разрядностью.


Это в этой теме уже обсуждалось. Как я уже писал, хорошее решение, если кандидат корректно использует статический assert. Но хуже, чем универсальное — усложняет подсчет времени на перенос системы на новую платформу.

E>Если компилятор не поддерживает типы с большей разрядностью, тут уже варианты. Самый простой — не допускать значений >= MAX_TYPE_VALUE/n.


Изменить Мир?
Постановка задачи — она не просто так, она из чего-то следует...

E>Если неприемлемо — вводил бы свои типы с большей разрядностью, а то и с неограниченной разрядностью. Но уж никак бы не стремился показать свои немерянные знания арифметики, что потом и сам черт ногу сломит в простейшем методе,


Зачем писать 2 строки включив мозг, когда можно написать 100 не включая его — это твой путь?

E>и этой функцией пользоваться нельзя, так как из-за используемых хаков она округляет в случайную сторону.


Почему же нельзя пользоваться? Если так рассуждать, так вообще никакой способ округления до целого нельзя использовать, а то вдруг кто-то ожидает еще какой-то способ округления.

E>Но вообще, возникает вопрос — а почему в вашей мегафирме до сих пор нет библиотеки, которая вычисляет среднее? Почему каждый сотрудник обязан написать свою?


Потому же, почему такой функции нет в стандартной библиотеке — потому что ad-hoc будет обладать преимуществами.

E>Почему вы сами не в состоянии писать библиотеки, а доверяете это вновь прибывшим? Или у вас библиотек нет вообще? Библиотеки, вообще-то, пишутся достаточно редко, медленно, не в стрессовых условиях, и тщательно тестируются.


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

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


Таких просто не бывает. Ошибаются все. Искать нужно таких, которые не делают глупых ошибок.

E>А это тот, кто предугадывает проблемы на несколько лет вперед, и делая текущие таски пишет так, что чтоб если что надо было добавить — оно бы там уже было.


Ты имеешь в виду "оно должно быть готово к добавлению"? Или ты предлагаешь в рамках ресурсов, бюджета и времени для A, делать A+B?

E>Если каждый будет думать о будующем, будущее есть и у системы. А то иначе будет как у большинства — прекрасно работает система первый год, а через год сложность системы и объемы данных такими становятся, что тормозить не по детски все начинает, а оказывается, что фундамент забыли построить, а при добавлении новой функциональности забывали его укреплять. И намахнется все именно на продакшене, в самый ответственный момент.


Это вопрос вменяемости менеджмента, не более того.
Re[22]: собеседование
От: elmal  
Дата: 06.02.10 18:47
Оценка:
Здравствуйте, LordMAD, Вы писали:

LMA>По сравнению с IEEE 754 — это мелочь.

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

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

Не увеличила бы. Решение практически тоже самое.

LMA>Выше в этой тему уже обсуждалось — поищи по ILP64.

Да хоть 128 или 256.

LMA>Ты слишком упрощаешь. Есть простые вещи, которые действительно имеет смысл реализовывать для n, а есть такие — для которых смысла в этом нет.

Смысла очень редко нет. Наиболее типичная ошибка — как раз сделать для двух вариантов. Или трех. А надо для N оказывается через год, а уже не поменять, на это заложились.

E>>При необходимости кроссплатформенности — вначале проверил бы, что я действительно буду кастить к типу с большей разрядностью.


LMA>Зачем писать 2 строки включив мозг, когда можно написать 100 не включая его — это твой путь?

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

LMA>Почему же нельзя пользоваться? Если так рассуждать, так вообще никакой способ округления до целого нельзя использовать, а то вдруг кто-то ожидает еще какой-то способ округления.

Уже 100 раз об этом говорили.

LMA>Цель собеседования не в том, чтобы получить от кандидата код, который потом использовать, а в том, чтобы проверить определенные навыки у кандидата.

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

LMA>Таких просто не бывает. Ошибаются все. Искать нужно таких, которые не делают глупых ошибок.

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

LMA>Ты имеешь в виду "оно должно быть готово к добавлению"? Или ты предлагаешь в рамках ресурсов, бюджета и времени для A, делать A+B?

Нет. Делать надо А так, чтобы когда потребовалось Б и В, их можно было сделать и код к этому был бы готов. То есть подумать, что потребоваться может в будующем, и если потребуется — как будем делать. Если решение есть, и не кривое, то делать. Если же А сделано так, что для добавление фичи Б потребуется все переписывать с нуля, или от этой фичи отказываться, или делать страшный костыль, то А сделано плохо. В твоем случае — фича А — посчитать среднее для 2-х чисел. А вот неизвестная фича Б, на которую нужно сразу же закладываться — это считать среднее для N чисел произвольного типа. Это в привычку должно войти — всегда думать на полтора шага вперед, или система развалится в будущем.

LMA>Это вопрос вменяемости менеджмента, не более того.

Как правило, у менеджмента хватает других забот, чтобы интересоваться что творится в коде. Под вменяемость должно подразумеваться не препятствовать наведению порядка в коде, а не руководство этим наведением.
Re[8]: собеседование
От: cpp_beginner  
Дата: 08.02.10 09:31
Оценка:
Здравствуйте, LordMAD, Вы писали:

LMA>Здравствуйте, Handie, Вы писали:


H>>int avg(int x, int y) { return (int)(((long long)x + y)/2); }


А если так?

template <typename T>
class simple_avg_traits{};

template <>
class simple_avg_traits<char>{
public:
    typedef int AccType;
};

template <>
class simple_avg_traits<short>{
public:
    typedef int AccType;
};


template <>
class simple_avg_traits<int>{
public:
    typedef long long AccType;
};

template <typename T> inline typename 
simple_avg_traits<T>::AccType traits_avg(const T a, const T b){
    typename simple_avg_traits<T>::AccType acc = a + b;
    return acc/2;
}
Re[4]: собеседование
От: Roman Odaisky Украина  
Дата: 08.02.10 09:48
Оценка:
Здравствуйте, LuciferSaratov, Вы писали:

H>>Ну и тест на "лоха" с << и | в цикле.


LS>Это если он совсем лох, будет << и |

LS>А чтобы работало, надо << и &

А не >> и &, случаем? (while(x) { result += x & 1; x >>= 1; }).

(Еще тут есть вариант с while(x) { x &= x-1; ++result; }.)
До последнего не верил в пирамиду Лебедева.
Re[5]: собеседование
От: LuciferSaratov Россия  
Дата: 08.02.10 10:02
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>Здравствуйте, LuciferSaratov, Вы писали:


H>>>Ну и тест на "лоха" с << и | в цикле.


LS>>Это если он совсем лох, будет << и |

LS>>А чтобы работало, надо << и &

RO>А не >> и &, случаем? (while(x) { result += x & 1; x >>= 1; }).


RO>(Еще тут есть вариант с while(x) { x &= x-1; ++result; }.)


ну << можно заюзать хотя бы в этом варианте:

for (int i = 0; 1 << i < x; i++) {
  if (x & (1 << i)) {
    result++;
  }
}


А вот куда пристроить | — непонятно.
Re[23]: собеседование
От: LordMAD Россия  
Дата: 08.02.10 10:25
Оценка:
Здравствуйте, elmal, Вы писали:

LMA>>По сравнению с IEEE 754 — это мелочь.

E>Как раз на практике IEEE 754 будет мелочью. Так как типы с ограниченной разрядностью как правила используются на значениях, далеких от предельно допустимых. Потому скорее всего на грабли даже не наступят.

Как раз профессионально сделанные системы тем и отличаются от слеланных на коленке, что не расчитывают на "как правило" и "скорее всего".

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

E>Не увеличила бы. Решение практически тоже самое.

Наверное, мы о разном говорим.

LMA>>Выше в этой тему уже обсуждалось — поищи по ILP64.

E>Да хоть 128 или 256.

Если ты про создание полноценного типа — это не на 1-2 минуты задание.

LMA>>Ты слишком упрощаешь. Есть простые вещи, которые действительно имеет смысл реализовывать для n, а есть такие — для которых смысла в этом нет.

E>Смысла очень редко нет. Наиболее типичная ошибка — как раз сделать для двух вариантов. Или трех. А надо для N оказывается через год, а уже не поменять, на это заложились.

Это всё зависит от конкретных задач. Для разных задач — статистика будет разная — когда есть смысл, а когда нет.

LMA>>Зачем писать 2 строки включив мозг, когда можно написать 100 не включая его — это твой путь?

E>Когда то я гордился, что знаю язык настолько хорошо, что для прочтения моего творчества требовалось очертененно включать мозг. С опытом понял, что код должен быть таким, чтобы при его чтении мозг не напрягался.

Концептуальная сложность задачи заключается не том, что может быть связано с C++ вообще, так что мозг все равно включать придется по другой причине. Бывают, конечно, и рутинные задачи, но это хорошее поле боя для junior'ов.

E>А относительно типов с большей разрядностью — если в них появляется необходимость, а их нет, их надо вводить. Это потом многократно окупится, и не важно какое число строчек кода придется написать.


Пример avg — это не тот случай когда их надо вводить.

LMA>>Почему же нельзя пользоваться? Если так рассуждать, так вообще никакой способ округления до целого нельзя использовать, а то вдруг кто-то ожидает еще какой-то способ округления.

E>Уже 100 раз об этом говорили.

Пока все доводы были в стиле "а вдруг...".

LMA>>Цель собеседования не в том, чтобы получить от кандидата код, который потом использовать, а в том, чтобы проверить определенные навыки у кандидата.

E>Навыки написания библиотек на скорость без тестирования в стрессовых условиях, работающих правильно с первого раза? Наверно есть у кого то эти навыки, не спорю. Но навык уж очень специфичный, и нужен в основном на собеседованиях.

Нет, навых не допускать UB на пустом месте. Понятно, что можно просто перевалить всё на тесты и потом героически исправлять баги... Только зачем, если можно нанять людей, который таких багов просто не допустят?

LMA>>Таких просто не бывает. Ошибаются все. Искать нужно таких, которые не делают глупых ошибок.

E>Глупые ошибки тоже делают все. Более того, большинство ошибок как раз глупые. Так как когда делаешь простые вещи, ты в уверен что не допустишь ошибку, внимание расслаблено. А когда что-то сложнее, стараешься как раз максимально концентрироваться.

Мягко говоря, в такой ситуации явно проблема распределения обязанностей.

LMA>>Ты имеешь в виду "оно должно быть готово к добавлению"? Или ты предлагаешь в рамках ресурсов, бюджета и времени для A, делать A+B?

E>Нет. Делать надо А так, чтобы когда потребовалось Б и В, их можно было сделать и код к этому был бы готов. То есть подумать, что потребоваться может в будующем, и если потребуется — как будем делать. Если решение есть, и не кривое, то делать. Если же А сделано так, что для добавление фичи Б потребуется все переписывать с нуля, или от этой фичи отказываться, или делать страшный костыль, то А сделано плохо.

Это верно, при условии, что рефакторинг обойдется дороже, что зависит от конкретной ситуации.

E>В твоем случае — фича А — посчитать среднее для 2-х чисел. А вот неизвестная фича Б, на которую нужно сразу же закладываться — это считать среднее для N чисел произвольного типа.


Чушь, потому что универтальная функция будет хуже по определенным критериям, чем ad hoc.

E>Это в привычку должно войти — всегда думать на полтора шага вперед, или система развалится в будущем.


Чтобы система не развалилась, нужно просто иметь нормальную архитектуру.

E>>>Если каждый будет думать о будующем, будущее есть и у системы. А то иначе будет как у большинства — прекрасно работает система первый год, а через год сложность системы и объемы данных такими становятся, что тормозить не по детски все начинает, а оказывается, что фундамент забыли построить, а при добавлении новой функциональности забывали его укреплять. И намахнется все именно на продакшене, в самый ответственный момент.

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

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

Вообще, это не работа программистов — исправлять и предугадывать косяки менеджмента, как любое другое лечение симптомов.
Re[9]: собеседование
От: LordMAD Россия  
Дата: 08.02.10 10:41
Оценка:
Здравствуйте, cpp_beginner, Вы писали:

_>А если так?


_>
_>template <typename T>
_>class simple_avg_traits{};

_>template <>
_>class simple_avg_traits<char>{
_>public:
_>    typedef int AccType;
_>};

_>template <>
_>class simple_avg_traits<short>{
_>public:
_>    typedef int AccType;
_>};


_>template <>
_>class simple_avg_traits<int>{
_>public:
_>    typedef long long AccType;
_>};

_>template <typename T> inline typename 
_>simple_avg_traits<T>::AccType traits_avg(const T a, const T b){
_>    typename simple_avg_traits<T>::AccType acc = a + b;
_>    return acc/2;
_>}
_>


Как минимум, такие проблемы:
1. Не вполне корректное поведение, если будут переданы в качестве аргументов типы, которые могут быть неявно преобразованы к int, но для которых нет специализации.
2. Функция возвращает не const T и даже не T, хотя для данного случая const T — достаточно. В принципе к const я бы на собеседовании может сильно не придирался бы, хотя, с другой стороны, такое решение провоцирует задать соответствующий вопрос.
3. Все равно нужна проверка, что размер long long больше, чем int (а не равен). И при таком решении еще и, что int больше, чем short и char.
Re[10]: собеседование
От: cpp_beginner  
Дата: 08.02.10 11:09
Оценка:
Здравствуйте, LordMAD, Вы писали:


LMA>Как минимум, такие проблемы:

LMA>1. Не вполне корректное поведение, если будут переданы в качестве аргументов типы, которые могут быть неявно преобразованы к int, но для которых нет специализации.

В специализации по умолчанию сделать assert(), добавить специализаций по вкусу

LMA>2. Функция возвращает не const T и даже не T, хотя для данного случая const T — достаточно. В принципе к const я бы на собеседовании может сильно не придирался бы, хотя, с другой стороны, такое решение провоцирует задать соответствующий вопрос.


А почему должна возвращать const T?

LMA>3. Все равно нужна проверка, что размер long long больше, чем int (а не равен). И при таком решении еще и, что int больше, чем short и char.


Вроде тоже решается ассертом. Хотя наверно как-нибудт можно намутить проверку при спциализации, применить SFINAE например.
Re[25]: собеседование
От: LordMAD Россия  
Дата: 08.02.10 14:01
Оценка:
Здравствуйте, elmal, Вы писали:

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

E>>>Не увеличила бы. Решение практически тоже самое.
LMA>>Наверное, мы о разном говорим.
E>Хорошо, напиши мне avg для 5 аргументов.



E>Решение, которое привел ты для двух, для большего числа аргументов уже не годится.


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

Как я писал с самого начала — этот вопрос именно по С/C++, не про алгоритмы и не про проектирование. Ты же пытаешься утверждать, что проектирование важнее знания языка. Так вот: во-первых, эта задачка не имеет к этому никакого отношения (она имеет отношение конкретно к знанию языка), а во-вторых, не надо сравнивать синее и мягким.

E>И если будешь проверять на чет-нечет с кучей if, то есть у меня большие подозрения в том, что они ко всему прочему будет крайне неэффективно. Неэффективен именно алгоритм.


Давай я тебе на более очевидном примере поясню: сортировку двух чисел делают чем-то вроде if (a>b) swap(a, b);
Так вот: делать по этому алгоритму сортировку n чисел — не эффективно. А делать сортировку двух чисел алгоритмом, который хорош для сортировки n чисел — тоже неэффективно.

LMA>>Если ты про создание полноценного типа — это не на 1-2 минуты задание.

E>То, что ты назвал — это тоже не на 1-2 минуты задание. Там очень неприятные подводные камни, которые в реальности редки. Даже если видишь их, не факт что сходу наиболее эффективно обойдешь. За 1-2 минуты это сделают без ошибок те, кто к этому заданию готов.

Это задание именно на 1-2 минуты. И его цель — отсеять тех, кто сходу не видит проблемы в бездумном сложении двух int и тех, кто не знает когда безопасно можно заменять деление на степень двойки, а когда нельзя.

E>Даже у тебя его сделать не получилось, хоть ты и задаешь его на собеседовании. У большинства тоже на этом форуме не получилось без ошибок, хоть они и более правильное решение выдали, чем твое (a/2+b/2 гораздо лучше во всех отношениях, например, хоть и не всегда работает идеально).


Не передергивай! Во-первых, я привел лишь вариант решения, который считаю нормальным. Никто меня не переубедил, что это решение чем-то плохо, при такой формулировке задания и ни одного серьезного довода я не увидел пока в этой теме. То, что кто-то чего-то ожидает от функции, чего нет в её контракте — это не аргумент. С тем же успехом можно жаловаться на то, что max(a, b) = 0 и max(b, a) = 0 дадут разные результаты при a == b.
В любом случае, от кандидата никто не требует идеального решения (его, кстати, нет) — требуется показать, что он владеет определенными навыками.

LMA>>Пример avg — это не тот случай когда их надо вводить.

E>Если что-то потребовалось 1 раз, значит потребуется еще много раз. Делаете много вычислений с типами ограниченной разрядности — рано или поздно придется вводить. Или avg и не нужна вовсе.

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

E>А если умножать потребуется, а потом разделить?


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

LMA>>Пока все доводы были в стиле "а вдруг...".

E>Вдруг в реальных ситуациях всегда встречается. Если что-то может случиться, оно случится.

Ну да — все люди умирают от падения кирпича на голову.

E>У тебя тоже доводы в стиле "а вдруг". Непонятно зачем тебе понадобилась мегафункция, которая должна корректно отрабатывать на любых целых и для любых платформ.


Ссылку, пожалуйста, — что ты конкретно имеешь в виду.

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

LMA>>Нет, навых не допускать UB на пустом месте. Понятно, что можно просто перевалить всё на тесты и потом героически исправлять баги... Только зачем, если можно нанять людей, который таких багов просто не допустят?

E>Последний раз, когда мне приходилось помнить про UB, было еще тогда, когда я еще на ассемблере писал.

Давай поподробнее про UB из стандартов C/C++, с которыми ты сталкивался "когда я еще на ассемблере писал"?

E>С переходом на языки высокого уровня мне ни разу не приходилось встречаться с ситуациями, где надо было думать про UB.


И ты решил, что раз ты не сталкивался, то никто не сталкивается?

E>Мне как то странным видится, что у вас риск UB настолько велик, что это критическая вещь. Настолько это важно, что готовы пожертвовать коммутативностью, что потом сравнивать результаты вообще нельзя.


А я вообще не вижу причин не жертвовать тем, что не требуется. И в данном конкретном случае — сравнивать результаты можно.

LMA>>>>Таких просто не бывает. Ошибаются все. Искать нужно таких, которые не делают глупых ошибок.

E>>>Глупые ошибки тоже делают все. Более того, большинство ошибок как раз глупые. Так как когда делаешь простые вещи, ты в уверен что не допустишь ошибку, внимание расслаблено. А когда что-то сложнее, стараешься как раз максимально концентрироваться.
LMA>>Мягко говоря, в такой ситуации явно проблема распределения обязанностей.
E>Нет такой проблемы. Есть проблема человеческой природы. Люди не машины, и ошибаются. Могу ошибиться и в простых вещах тоже.

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

LMA>>Это верно, при условии, что рефакторинг обойдется дороже, что зависит от конкретной ситуации.

E>Рефакторинг обычно всегда забывают делать, пока не приспичит. И когда уже без него никак, он объодится очень дорого.

Это называется — бардак. Грубо говоря, если применяются design review и code review, такая ситуация не должна возникать в принципе. Так что ни разу это не "обычно всегда".

LMA>>Чушь, потому что универтальная функция будет хуже по определенным критериям, чем ad hoc.

E>В основном она хуже по критериям скорости.

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

LMA>>Чтобы система не развалилась, нужно просто иметь нормальную архитектуру.

E>Архитектура в начале обычно всегда нормальная, заточенная под конкретную задачу. А при развитии системы уже начинаются особенности. Потому если при изменении требований не укреплять фундамент, система рухнет.

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


LMA>>Вообще, это не работа программистов — исправлять и предугадывать косяки менеджмента, как любое другое лечение симптомов.

E>У менеджмена косяки были, есть и будут всегда. По простой причине, что они физически не могут уследить за всем. Особенно если они очень давно в последний раз код видели. Потому исправлять косяки менеджмента — это основное в работе программиста. Если не предугадаешь, и будешь делать слепо по инструкции, система развалится. Вариант с тупыми исполнителями в разработке не работает, хоть ты тресни, или работает на коротком промежутке времени, а потом все переделывать.



Поработаешь с вменяемым менеджментом — узнаешь "страшную" правду.
Re[27]: собеседование
От: LordMAD Россия  
Дата: 10.02.10 07:53
Оценка:
Здравствуйте, elmal, Вы писали:

LMA>>Как я писал с самого начала — этот вопрос именно по С/C++, не про алгоритмы и не про проектирование. Ты же пытаешься утверждать, что проектирование важнее знания языка.

E>Начнем с того, что это вопрос совсем не по языку. Так как теже самые грабли будут на VB, Forth, Nemerle, ассемблере наконец. Эта задача на то, знает человек внутреннее представление чисел или не знает, больше не проверяет ничего. Не уверен я, кстати, что на абсолютно всех платформах внутреннее представление чисел будет одинаковым.

Грабли будут разные, потому что на том же ассемблере, поведение будет детерминированным, в отличие от C/C++, где будет UB. Соответственно при UB будет большая разница в том, как обрабатывается integer overflows в конкретной версии компилятора и на конкретной платформе и с конкретными параметрами компиляции. Соответственно, применительно к C++, приходим даже к теме гарантий безопасности исключений Абрамса. Могу конечно, предположить, что ты считаешь, что и безопасный относительно исключений код писать "на практике требуется очень и очень редко"?

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


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

Кстати, я не совсем понял — ты иммешь в виду, что C и C++ — низкоуровневые языки или просто передергиваешь, пытаясь сделать вид, что мы говорим о C, а не о C и C++?

E>Ну и закончим тем, что язык изучается очень быстро, более того, глубокое знание языка на практике требуется очень и очень редко.


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

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

LMA>>В любом случае, от кандидата никто не требует идеального решения (его, кстати, нет) — требуется показать, что он владеет определенными навыками.

E>a/2+b/2 пойдет за нормальное решение? Или промежуточный кастинг к большему пройдет за нормальное решение? Если да, то хорошо. Если нет — тут уже очень большие вопросы.

Я уже привел решение, которое я считаю нормальным — это решение, которое кандидаты дают именно за 1-2 минуты.
a/2+b/2 дает неверный результат для двух нечетных чисел, а casting к большему — нормальный если casting происходит к большему (а не просто к long long или double).

LMA>>Давай поподробнее про UB из стандартов C/C++, с которыми ты сталкивался "когда я еще на ассемблере писал"?

E>При чем здесь стандарты конкретного языка? Проблема, которую ты пытаешься отловить, она от языка не зависит вообще. Если только язык не оперирует исключительно с числами неограниченной разрядности.

При том, что программисту придется писать на конкретном языке. Соответственно мы берем на работу тех, кто его знает. Как я уже написал выше, эта "проблема" проявляется в C/C++ как UB, в то время как ассемблере такая же ситуация проявляется по-другому.

Я все еще жду про UB из стандартов C/C++, с которыми ты сталкивался "когда я еще на ассемблере писал" (выделил).

LMA>>А я вообще не вижу причин не жертвовать тем, что не требуется. И в данном конкретном случае — сравнивать результаты можно.

E>Можно спросить, как сравнивать результаты? Я вижу один путь, вводить функцию isEquals(int a, int b), возвращающую true если разница между аргументами не превышает 1. Как минимум очень спорное решение, погрешность схлопочем на пустом месте. Для нормального сравнения целых она не годится, потому функцию придется назвать isAvgEquals(int a, int b), что маразм, вообще-то. Да и не спасет эта функция, придется рассчитывать на внимательность, что вызовут ее, а не оператор сравнения, что является стандартом для целочисленных типов.

Если сравнивать результаты нужно — правильный способ — это оговорить в требованиях к функции вопрос округления до целого.
Если по каким-то причинам так сделать не удастся — можно и костыль использовать, но тогда сравнивать разницу нужно не с 1, а c величиной, зависящей, от a и b. Причем это именно костыль, который лечит симптом, а болезнь в том, что кто-то знал, что надо часто сравнивать результаты функции, но не включил это в требования к функции.
Re[28]: собеседование
От: elmal  
Дата: 10.02.10 09:17
Оценка:
Здравствуйте, LordMAD, Вы писали:

LMA>Грабли будут разные, потому что на том же ассемблере, поведение будет детерминированным, в отличие от C/C++, где будет UB. Соответственно при UB будет большая разница в том, как обрабатывается integer overflows в конкретной версии компилятора и на конкретной платформе и с конкретными параметрами компиляции. Соответственно, применительно к C++, приходим даже к теме гарантий безопасности исключений Абрамса. Могу конечно, предположить, что ты считаешь, что и безопасный относительно исключений код писать "на практике требуется очень и очень редко"?

Ассемблеры, они разные. И в общем случае на разных ассемблерах поведение ни черта не детерминировано тоже. Я, например, знал как минимум 4 системы команд разных процессоров. Когда знал только один процессор, для меня было все детерминировано. Когда стал знать несколько — стал мыслить более высокоуровнево. Как результат, из ассемблера я вырос. А начинал я как раз с ассемблера. По поводу безопасного кода в плане исключений — это зависит от того, что под ним подразумевается. Если пишешь под разными компиляторами под любыми платформами, то самый безопасный путь — не использовать исключений вообще, так как не все компиляторы их поддерживают. И плевать куче компиляторов на стандарты, это рекомендация, а не факт. Здравый смысл надо иметь, а не стандарты цитировать, и все хорошо будет.

LMA>Я конечно понимаю, что ты думаешь, что если ты пишешь код, который будет компилироваться только одним компилятором, то у всех такой же быдлокодинг. А вот представляешь — не у всех так.

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

LMA>Кстати, я не совсем понял — ты иммешь в виду, что C и C++ — низкоуровневые языки или просто передергиваешь, пытаясь сделать вид, что мы говорим о C, а не о C и C++?

Я не видел в задаче ничего, что относилось бы к С++. Чистый Си.

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

Те, кто в совершенстве знают язык, часто тоже очень и очень сильно быдлокодят. Быдлокодинг от знания языка не зависит. Более того, чем лучше знаешь язык, тем более опасные вещи сможешь натворить. В Си, например, с указателями такое можно наворотить, что это потом без поллитра ну никак не прочитать. А в С++ возможностей накреативить на порядок больше. А через полгода сам в своем творчестве не разберешься.

LMA>Во-вторых, если уж ты пытаешься какую-то статистику приводить относительно того, как как ачсто требуется "глубокое знание языка", то будь добр приводить ссылку — откуда у тебя такая странная статистика взялась.

Относительно статистики. Я уже читал про твое крайне негативное отношение к Макконелу. Например ты высказывался против замены magic numbers на константы, ты за усложнение кода и т.д. Я представляю соответственно, в каком стиле у вас код написан. И да, именно при таком коде основное — это как раз знание языка. Плюс очертененная внимательность тоже основное. Что могу сказать, система, насколько я понимаю, у вас пока держится, но рано или поздно столкнетесь с тем, что поддерживать ее будете не в силах даже сами. Польза писать понятно уже давно доказана, best practices тоже уже давно выработаны, то, что это игнорируем — это до ткх пор, пока конкуренты не появятся. А я наблюдал, как из-за того, что в коде ни черта не разобраться, компания (пионер в своей области) поглощалась конкурентом.

LMA>Я уже привел решение, которое я считаю нормальным — это решение, которое кандидаты дают именно за 1-2 минуты.

LMA>a/2+b/2 дает неверный результат для двух нечетных чисел, а casting к большему — нормальный если casting происходит к большему (а не просто к long long или double).
Большинство людей на этом форуме считают твое решение ненормальным. Тебя еще никто не поддержал. Одни неучи в индустрии сидят, как я понимаю?

LMA>Я все еще жду про UB из стандартов C/C++, с которыми ты сталкивался "когда я еще на ассемблере писал" (выделил).

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

LMA>Если по каким-то причинам так сделать не удастся — можно и костыль использовать, но тогда сравнивать разницу нужно не с 1, а c величиной, зависящей, от a и b. Причем это именно костыль, который лечит симптом, а болезнь в том, что кто-то знал, что надо часто сравнивать результаты функции, но не включил это в требования к функции.

Вот это вообще жесть . Представляю что у вас там в требованиях творится, если такое надо включать. На 1 строчку кода 100 строк документации, я так понимаю? Результаты нужно ведь не только сравнивать, но и делить на них, умножать, возводить в степень и т.д. Итого — надо для каждой функции писать теперь что с результатом делать можно, а что нет ? Всегда считал, что не дело функции знать, как будет использоваться ее результат. Базовый принцип это, вообще то. Если можно результат использовать неправильно, он будет использован неправильно. И никакая кипа документации не поможет. Если этот принцип нарушать — крупную сложную систему не построить, даже на средней все рухнет.
Re[29]: собеседование
От: LordMAD Россия  
Дата: 10.02.10 12:14
Оценка:
Здравствуйте, elmal, Вы писали:

LMA>>Грабли будут разные, потому что на том же ассемблере, поведение будет детерминированным, в отличие от C/C++, где будет UB. Соответственно при UB будет большая разница в том, как обрабатывается integer overflows в конкретной версии компилятора и на конкретной платформе и с конкретными параметрами компиляции. Соответственно, применительно к C++, приходим даже к теме гарантий безопасности исключений Абрамса. Могу конечно, предположить, что ты считаешь, что и безопасный относительно исключений код писать "на практике требуется очень и очень редко"?

E>Ассемблеры, они разные. И в общем случае на разных ассемблерах поведение ни черта не детерминировано тоже. Я, например, знал как минимум 4 системы команд разных процессоров. Когда знал только один процессор, для меня было все детерминировано. Когда стал знать несколько — стал мыслить более высокоуровнево.

Ты имел один исходник на ассемблере, из которого получал программу для 4 различных процессоров? Если нет — то к чему это ты?

E>По поводу безопасного кода в плане исключений — это зависит от того, что под ним подразумевается. Если пишешь под разными компиляторами под любыми платформами, то самый безопасный путь — не использовать исключений вообще, так как не все компиляторы их поддерживают.


Что с того, что исключения не поддерживают старые компиляторы? Если так рассуждать — надо вообще отказываться от половины C++, включая шаблоны, using и прочее. В тех случаях когда переносимость имеет наивысший приоритет, лучше просто использовать чистый С, причем желательно не C99, а K&R. Отказываться от исключений в C++ можно, когда речь идет о небольших автономных поделках, так например поступает google с их open-source проектиками. А вот в полноценных проектах так делать не стоит, потому что иначе придется иметь дело только с "наибольшим общим делителем" возможностей, а для систем нормальных размеров проще на новую платформу подходящий компилятор портировать или от платформы отказаться.

E>Все то, что не связано с тем, чем занимаешься ты — то быдлокодинг, знакомый образ мыслей .


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

LMA>>Кстати, я не совсем понял — ты иммешь в виду, что C и C++ — низкоуровневые языки или просто передергиваешь, пытаясь сделать вид, что мы говорим о C, а не о C и C++?

E>Я не видел в задаче ничего, что относилось бы к С++. Чистый Си.

То есть то, что справедливо и для C, человек, который программирует на C++ знать не должен?

E>>>Ну и закончим тем, что язык изучается очень быстро, более того, глубокое знание языка на практике требуется очень и очень редко.

LMA>>Во-первых, язык изучается быстро только в объеме, достаточным для быдлокодинга, а во всех остальных случаев его обычно изучают годами, по крайней мере.
E>Те, кто в совершенстве знают язык, часто тоже очень и очень сильно быдлокодят. Быдлокодинг от знания языка не зависит. Более того, чем лучше знаешь язык, тем более опасные вещи сможешь натворить. В Си, например, с указателями такое можно наворотить, что это потом без поллитра ну никак не прочитать. А в С++ возможностей накреативить на порядок больше. А через полгода сам в своем творчестве не разберешься.

Есть старая истина: the only valid measurement of code quality: WTFs/minute. Опять возвращаемся к design review и code review. Короче говоря — то о чем ты пишешь — не проблема, если бардака нет.

LMA>>Во-вторых, если уж ты пытаешься какую-то статистику приводить относительно того, как как ачсто требуется "глубокое знание языка", то будь добр приводить ссылку — откуда у тебя такая странная статистика взялась.

E>Относительно статистики. Я уже читал про твое крайне негативное отношение к Макконелу.

Отнюдь — Стив Макконнелл (Steve McConnell), которого ты неуважаешь до такой степени, что даже фамилию его переврал, — много чего умного понаписал. Это, само собой, не означает, что каждое его слово надо понимать буквально.
И какое это имеет отношение к статистике?

E>Например ты высказывался против замены magic numbers на константы, ты за усложнение кода и т.д. Я представляю соответственно, в каком стиле у вас код написан.


Ни в коем разе. Я лишь писал, что есть константы (0, 1, 0xDEADBEEF и т.п.), которые в числовом выражении могут быть читабельнее, чем те имена, которые могут назначить соответствующим константам.
И какое это имеет отношение к статистике?

E>И да, именно при таком коде основное — это как раз знание языка.


При каком коде?

E>Польза писать понятно уже давно доказана, best practices тоже уже давно выработаны, то, что это игнорируем — это до ткх пор, пока конкуренты не появятся.


А кто-то выступал за то, чтобы писать непонятно?
И какое это имеет отношение к статистике?

E>А я наблюдал, как из-за того, что в коде ни черта не разобраться, компания (пионер в своей области) поглощалась конкурентом.


Это ты к чему? Эта тема важна для тебя? Пытаешься выдумать ветряные мельницы, чтобы было что побеждать?

Что-то я сомневаюсь, что из-за такого произошло поглощение — зачем поглотителю такой код и такие разработчики, которые такой код пишут?

LMA>>Я уже привел решение, которое я считаю нормальным — это решение, которое кандидаты дают именно за 1-2 минуты.

LMA>>a/2+b/2 дает неверный результат для двух нечетных чисел, а casting к большему — нормальный если casting происходит к большему (а не просто к long long или double).
E>Большинство людей на этом форуме считают твое решение ненормальным. Тебя еще никто не поддержал. Одни неучи в индустрии сидят, как я понимаю?

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

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

LMA>>Я все еще жду про UB из стандартов C/C++, с которыми ты сталкивался "когда я еще на ассемблере писал" (выделил).

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

И где при этом происходит UB? Переполнение и UB — это вещи ортогональные. Это в C/C++ ты можешь на одном и том же компиляторе получить для (a+b)/2 для a == INT_MAX и b == INT_MAX результат INT_MAX, а для a == INT_MAX и b == INT_MAX-1 отрицательную величину, а для ассемблера — ты такое не получишь.

LMA>>Если по каким-то причинам так сделать не удастся — можно и костыль использовать, но тогда сравнивать разницу нужно не с 1, а c величиной, зависящей, от a и b. Причем это именно костыль, который лечит симптом, а болезнь в том, что кто-то знал, что надо часто сравнивать результаты функции, но не включил это в требования к функции.

E>Вот это вообще жесть . Представляю что у вас там в требованиях творится, если такое надо включать. На 1 строчку кода 100 строк документации, я так понимаю? Результаты нужно ведь не только сравнивать, но и делить на них, умножать, возводить в степень и т.д. Итого — надо для каждой функции писать теперь что с результатом делать можно, а что нет ? Всегда считал, что не дело функции знать, как будет использоваться ее результат. Базовый принцип это, вообще то. Если можно результат использовать неправильно, он будет использован неправильно. И никакая кипа документации не поможет. Если этот принцип нарушать — крупную сложную систему не построить, даже на средней все рухнет.

Надо просто понимать, что является типичным поведением, а что — не типичным. И нетипичное поведение описывать в требовании. Если вызывающая часть критична к способу округления — это должно быть указано, если ей это все равно — не указывать. Программист, получив такое задание, не может знать как будет использован результат, поэтому волен использовать, что ему удобнее в рамках контракта, например, как я уже писал
Автор: LordMAD
Дата: 23.01.10
, если возвращаемое число — сумма денег, то оптимальным может быть банковское округление и любое другое — будет неверным. Функции все равно — что будут делать с результатом, а вот вызывающей стороне — не все равно, что возвращает функция, поэтому если кто-то ввел такую зависимость (от способа округления) — он должен об этом позаботится или избавится от зависимости (не сравнивать результаты вызова при различном порядке следования аргументов). F почему правильно предоставлять свободу программисту в рамках контракта — я уже приводил пример с std::max.
Re[30]: собеседование
От: elmal  
Дата: 10.02.10 13:23
Оценка:
Здравствуйте, LordMAD, Вы писали:

LMA>Ты имел один исходник на ассемблере, из которого получал программу для 4 различных процессоров? Если нет — то к чему это ты?

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

LMA>Что с того, что исключения не поддерживают старые компиляторы? Если так рассуждать — надо вообще отказываться от половины C++, включая шаблоны, using и прочее.

Вот в том то и дело, что имеешь дело с разными платформами — хрен у тебя получится написать универсально. Хочешь универсальности и портируемости, K&R рулез, и то надо быть аккуратным. А на практике имеешь дело именно с конкретными платформами. Для которых можно быть достаточно уверенным, что long long > int.

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

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

LMA>Есть старая истина: the only valid measurement of code quality: WTFs/minute. Опять возвращаемся к design review и code review. Короче говоря — то о чем ты пишешь — не проблема, если бардака нет.

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

LMA>При каком коде?

При типичном спагетти коде основное — знание языка. При нормальном коде основное — здравый смысл + умение проектировать.

LMA>Когда нет аргументов, начинаешь оперировать фразами вроде "миллиард китайцев не может ошибаться"?

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

LMA>Мне все равно, сколько людей на этом форуме считают, что корректность кода не важна, или что корректность кода менее важна, чем, чтобы любой первокурсник (может еще первоклассник?) мог разобраться в коде сходу.

Пишешь вот такие хаки если — они должны быть протестированы сверхтщательным образом. Библиотеки все-таки. Туда лезть очень редко приходится. В принципе да, библиотека должна быть black box, туда лезть совершенно необязательно, потому код там вполне имеет право быть запутанным, если уж там надо и скорость, и переносимость. Одно но только — библиотеки не должны потенциальных багов содержать никогда! То есть должно быть крайне маловероятно, что она начнет тормозить, или что приколы при округлении получим, зависимые от порядка аргументов.

LMA>И где при этом происходит UB? Переполнение и UB — это вещи ортогональные. Это в C/C++ ты можешь на одном и том же компиляторе получить для (a+b)/2 для a == INT_MAX и b == INT_MAX результат INT_MAX, а для a == INT_MAX и b == INT_MAX-1 отрицательную величину, а для ассемблера — ты такое не получишь.

На разных ассемблерах вполне получишь. Не надо мыслить на уровне языка, надо мыслить выше. То что мнемоники разные, порядок аргументов разный, не значит, что язык разный. Можно макросами настроить все таким образом, что получим ассемблер с единым синтаксисом, вот для него UB вполне будет. А можно теми же макросами обеспечить определенное поведение. Шире надо мыслить, шире .

LMA>max(a, b) = 0 и max(b, a) = 0 дадут разные результаты при a == b. F почему правильно предоставлять свободу программисту в рамках контракта — я уже приводил пример с std::max.

Использование конечно функции достаточно экзотическое, но поведение вполне логичное будет. И тот, кто будет пользоваться этим, справедливо будет полагать, что вернется одно значение, а не 2. И проблемы это, в результате, не вызовет. В отличие от твоего решения, там поведение ну совершенно не поддается логике.
Re[31]: собеседование
От: LordMAD Россия  
Дата: 11.02.10 06:49
Оценка:
Здравствуйте, elmal, Вы писали:

LMA>>>>Грабли будут разные, потому что на том же ассемблере, поведение будет детерминированным, в отличие от C/C++, где будет UB. Соответственно при UB будет большая разница в том, как обрабатывается integer overflows в конкретной версии компилятора и на конкретной платформе и с конкретными параметрами компиляции. Соответственно, применительно к C++, приходим даже к теме гарантий безопасности исключений Абрамса. Могу конечно, предположить, что ты считаешь, что и безопасный относительно исключений код писать "на практике требуется очень и очень редко"?

E>>>Ассемблеры, они разные. И в общем случае на разных ассемблерах поведение ни черта не детерминировано тоже. Я, например, знал как минимум 4 системы команд разных процессоров. Когда знал только один процессор, для меня было все детерминировано. Когда стал знать несколько — стал мыслить более высокоуровнево.
LMA>>Ты имел один исходник на ассемблере, из которого получал программу для 4 различных процессоров? Если нет — то к чему это ты?
E>Бывают случаи, когда ассемблерную программу под один процессор требуется портировать на другой процессор. Принципы одинаковые. Детали — разные. Алгоритм должен быть достаточно универсальным.

И какое это имеет отношение к UB? И к тому "на разных ассемблерах поведение ни черта не детерминировано тоже"?

LMA>>Что с того, что исключения не поддерживают старые компиляторы? Если так рассуждать — надо вообще отказываться от половины C++, включая шаблоны, using и прочее.

E>Вот в том то и дело, что имеешь дело с разными платформами — хрен у тебя получится написать универсально.

Да ну? А мужики то и не знали!

LMA>>В тех случаях когда переносимость имеет наивысший приоритет, лучше просто использовать чистый С, причем желательно не C99, а K&R. Отказываться от исключений в C++ можно, когда речь идет о небольших автономных поделках, так например поступает google с их open-source проектиками. А вот в полноценных проектах так делать не стоит, потому что иначе придется иметь дело только с "наибольшим общим делителем" возможностей, а для систем нормальных размеров проще на новую платформу подходящий компилятор портировать или от платформы отказаться.

E>Хочешь универсальности и портируемости, K&R рулез, и то надо быть аккуратным. А на практике имеешь дело именно с конкретными платформами. Для которых можно быть достаточно уверенным, что long long > int.

То есть ILP64 и SILP64 — они такие мифические, мы на них глаза закроем, чтобы не портили идиллической картины?

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

E>Типичный код, который я пишу, без проблем при необходимости перенесется на любой другой язык, и платформу. Практически в лоб будет этот перенос, поменять придется в основном синтаксис. UB не будет, особенно если это сложение.

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

LMA>>Есть старая истина: the only valid measurement of code quality: WTFs/minute. Опять возвращаемся к design review и code review. Короче говоря — то о чем ты пишешь — не проблема, если бардака нет.

E>У меня сомнение в отсутсвии бардака, если коммутативность считается излишеством.

Ты про std::max?

E>При типичном спагетти коде основное — знание языка. При нормальном коде основное — здравый смысл + умение проектировать.


Ты не поверишь, каких результатов можно добится, если объединить здравый смысл, умение проектировать и знание языка!

E>>>Большинство людей на этом форуме считают твое решение ненормальным. Тебя еще никто не поддержал. Одни неучи в индустрии сидят, как я понимаю?

LMA>>Когда нет аргументов, начинаешь оперировать фразами вроде "миллиард китайцев не может ошибаться"?
E>Аргументы были. Не только у меня. Напиши, как предполагается сравнивать результаты. Если функция что-то возвращает, вполне логично, что результат придется сравнивать. Я хочу узнать как мне надо сравнивать.

Вменяемых аргументов я не увидел. Твой аргумент про то, что это подстрахует менеджеров — даже не смешно.
Как сравнивать — я уже написал — см. мой пост от 10.02.10 10:53.
Мы ходим по кругу.

E>Так как у меня впечатление, что я всю жизнь сравниваю неправильно (а я сравниваю либо через ==, либо через equals (синонимы мз разных языков не привожу), а надо как-то еще, похоже).


Если ты и типы с плавающей точкой сравниваешь через operator== — да, ты сравниваешь неправильно.
Я привел пример и с функцией, возвращающей температуру — если ты её результат будешь сравнивать через operator== — тоже неправильно.
Мы ходим по кругу.

LMA>>Мне все равно, сколько людей на этом форуме считают, что корректность кода не важна, или что корректность кода менее важна, чем, чтобы любой первокурсник (может еще первоклассник?) мог разобраться в коде сходу.

E>Пишешь вот такие хаки если — они должны быть протестированы сверхтщательным образом. Библиотеки все-таки. Туда лезть очень редко приходится. В принципе да, библиотека должна быть black box, туда лезть совершенно необязательно, потому код там вполне имеет право быть запутанным, если уж там надо и скорость, и переносимость. Одно но только — библиотеки не должны потенциальных багов содержать никогда! То есть должно быть крайне маловероятно, что она начнет тормозить, или что приколы при округлении получим, зависимые от порядка аргументов.

Какая к черту библиотека? Мы обсуждаем задание на собеседовании!

E>>>>>Последний раз, когда мне приходилось помнить про UB, было еще тогда, когда я еще на ассемблере писал.

LMA>>И где при этом происходит UB? Переполнение и UB — это вещи ортогональные. Это в C/C++ ты можешь на одном и том же компиляторе получить для (a+b)/2 для a == INT_MAX и b == INT_MAX результат INT_MAX, а для a == INT_MAX и b == INT_MAX-1 отрицательную величину, а для ассемблера — ты такое не получишь.
E>На разных ассемблерах вполне получишь. Не надо мыслить на уровне языка, надо мыслить выше. То что мнемоники разные, порядок аргументов разный, не значит, что язык разный. Можно макросами настроить все таким образом, что получим ассемблер с единым синтаксисом, вот для него UB вполне будет. А можно теми же макросами обеспечить определенное поведение. Шире надо мыслить, шире .

То есть ты сам макросами создавал ситуацию, при которой в языке, в котором в принципе не может быть UB, мог получить UB и это было проблемой, я ни чего не упустил?

LMA>>max(a, b) = 0 и max(b, a) = 0 дадут разные результаты при a == b. F почему правильно предоставлять свободу программисту в рамках контракта — я уже приводил пример с std::max.

E>Использование конечно функции достаточно экзотическое, но поведение вполне логичное будет. И тот, кто будет пользоваться этим, справедливо будет полагать, что вернется одно значение, а не 2. И проблемы это, в результате, не вызовет. В отличие от твоего решения, там поведение ну совершенно не поддается логике.

Так в чем разница?
Re[32]: собеседование
От: elmal  
Дата: 11.02.10 08:51
Оценка:
Здравствуйте, LordMAD, Вы писали:

LMA>Если ты и типы с плавающей точкой сравниваешь через operator== — да, ты сравниваешь неправильно.

Мы говорили о целочисленных типах. И avg было для целочисленных типов. Как сравнивать результат? Всегда целые числа сравнивались через ==, ты первый, кто мне говорит обратное. Относительно температуры — мы либо не используем == вообще, так как погрешность может быть, либо == допустимо. Если датчик температуры целые числа возвращает, а не с плавающей точкой, естественно.

LMA>Какая к черту библиотека? Мы обсуждаем задание на собеседовании!

avg — библиотечная функция. Она должна быть именно в либах. И должна не содержать подводных камней. Либы собственные есть у каждого проекта. Либы, это фундамент. С ненадежными либами много не напрограммируешь. Ты тестируешь умение писать либы на скорость, за 2 минуты, без тестирования, сходу. Более того, ИМХО, все платформозависимые вещи должны быть именно в либах. У нас например так и есть. А в основном коде, который пишется каждый день, ничего платформозависимого нет. И не должно быть. Низкоуровневые вещи всегда скрывают в либах, а не демонстрируют свою крутость непосредственно в основном коде.

LMA>То есть ты сам макросами создавал ситуацию, при которой в языке, в котором в принципе не может быть UB, мог получить UB и это было проблемой, я ни чего не упустил?

Не создавал. Более того, макросами никогда не увлекался. Я говорю не о языках, а о концепциях. Есть концепция сложения чисел ограниченной разрядности, и для нее, в общем случае, есть UB. А конкретный язык — лишь способ записи этой концепции для реализации конкретного алгоритма. Если мыслить в рамках концепций, а не конкретного языка, можно стороной обходить кучу подводных камней. А вот если мыслить в рамках языка, то на грабли можно нарваться на ровном месте, при выходе новой версии языка, например. Знание принципов освобождает от необходимости помнить кучу деталей.

LMA>Так в чем разница?

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