Здравствуйте, Stanislav V. Zudin, Вы писали:
SVZ>Здравствуйте, Паблик Морозов, Вы писали:
SVZ>Вот тебе взамен схожие по сложности задачки, не требующие подготовки.
SVZ>1. Дано бинарное упорядоченное дерево. SVZ>Вернуть максимальный узел <= заданному.
SVZ>2. То же, но вернуть не сам узел, а его родителя [злодейская ухмылка]. Что возвращать для крайних случаев (узлов не найдено, найден корневой узел) — на выбор интервьюера.
SVZ>3. Для самых продвинутых можно предложить написать обход дерева.
SVZ>И чтобы без рекурсии
А нахрена оно нужно? Если 1 еще может встретиться в реальной жизни, то 2 и 3 — просто высосаны из пальца.
Здравствуйте, gandjustas, Вы писали:
G>Слушай, скажи как тебя зовут. Я свяжусь с вашим начальством и попрошу чтобы тебя не допускали к собеседованиям, чтобы зря не парил мозг людям.
G>В брайте же занимаются CRM, SharePoint, SQL, BI. Что там c Java — хз, но точно не консольные приложения. Нахрена задачи, не имеющие отношения к работе, решать?
G>Или ты просто троллишь?
Просто одного из этих ребят
, контуженных в юности адресной арифметикой и массивами, допустили к собеседованиям.
Кодеры-задроты на марше, это печалька.
Здравствуйте, gandjustas, Вы писали:
G>Слушай, скажи как тебя зовут. Я свяжусь с вашим начальством и попрошу чтобы тебя не допускали к собеседованиям, чтобы зря не парил мозг людям.
G>В брайте же занимаются CRM, SharePoint, SQL, BI. Что там c Java — хз, но точно не консольные приложения. Нахрена задачи, не имеющие отношения к работе, решать?
G>Или ты просто троллишь?
Вообще(безотносительно набижавших в этот раздел унылых троллей), про задачи на собеседованиях.
Мне как-то дали задание написать веб-сервис, которому скармливается строка, затем эта строка обрабатывается асинхронно вторым потоком(разбивается по заданным токенам), и затем результат выводится в Вин-Формс клиенте.
Дали студию и пару часов на выполнение. Сделал за полчаса,код никто обсуждать не стал, просто оставил проект.
Искали сеньора.
Через день позвонили и спросили, когда выйду на работу.
Так-то!
Здравствуйте, minorlogic, Вы писали:
>>> Другими словами решение проблемы а не ее усугубления?* М>>а решения проблемы нет. во всяком случае в такой постановке вопроса. "ты скажи мне что те нужно, я те дам, что ты хошь" M>Тогды совсем не сеньер. "Моя хата с краю" это позиция в никуда
Вот там в другой ветке об этом написали хорошо:
Первое что мне сказали когда я пришел в IBM — Do not think, do ask.
Я бы сразу задал вопрос — устраивает ли решение из STL. Умные задают дополнительные вопросы — дураки сразу "понимают".
Знаменитая история. Джоел спольски любил задавать вопрос — нарисуйте дом. Вы рисуете квадратик с шапочкой, может даже окошком и дверцей. И когда закончили, Спольски говорил — да, совсем забыл. Домик-то для двуголовых жирафов. Что, размеры не те? чего не уточняли? все, до свиданья.
У меня исходная задача тоже вызвала массу вопросов. Бросаться чего-то писать не прояснив что это и для чего — самый плохой способ, в сложных проектах потом так и делают — сначала что-то накодят, потом разбираются "а надо-то было не так... эх.. не поглядели.. не спросили...".
Здравствуйте, мыщъх, Вы писали:
М>как бы x & (x — 1) проверка на то, что x это степень двойки. если поменять минус на плюс, то получим проверку, что следующее за x число это степень двойки, а сама x это битовая маска из единиц. это в том случае если результат равен нулю. все остальные случаи мы приравниваем к true.
Ну вот, поскольку ты ответ знаешь, а не думал над ним, то назвал ровно половину ответа. Да, если x = 2 ^ n — 1 (число из единиц), результат станет равным нулю (будут занулены все биты до младшего нуля, т.е. все биты числа). Если нет — то именно как я написал. Аналогично x & (x — 1) очищает младший установленный бит, соответственно возвращает 0 если x = 2 ^ n, т.к. у такого числа установлен всего один бит.
Вообще, всякие x +- — по сути циклы с условиями (carry-бит двигается в цикле пока биты установлены, borrow — пока сняты, сами биты в результате движения устанавливаются/сбрасываются), */ 2 — безусловный сдвиг всех битов влево/вправо, and/or/xor — условное снятие/установка бита на фиксированной позиции. И после того, как ты абсолютно верно нашел решение задачи: M>мы начинаем двигать самый младший бит влево до тех пор, пока на следующей позиции не окажется нуль
остаётся только понять, как собрать его из этих кубиков. Для этого декомпозируем задачу дальше:
Что значит двигать бит? Это значит надо его найти, извлечь, сдвинуть (операцией сложения), восстановить сброшенные биты, кроме крайнего правого (его мы "двигаем")
Для поиска: обнулим и сделаем xor.
обнуляем твоей "проверкой на степень двойки":
reset_lsb = x .&. (x — 1) // например 10110 станет равным 10100.
извлекаем:
extract_lsb = reset_lsb `xor` x // из 10110 и 10100 получили 10
"начинаем двигать самый младший бит влево до тех пор, пока на следующей позиции не окажется нуль":
move_lbs = x + extract_lsb // 10110 + 10 = 11000
устанавливаем биты, которые сбросились в процессе "движения":
result = move_lbs .|. reset_lsb // 11000 | 10100 = 11100
или в одну строчку:
result = (((x .&. (x — 1)) `xor` x) + x) .|. (x .&. (x — 1))
Вот решение для ближайшего большего, собственно. Вполне адекватная задача для собеседования при условии, что человеку будут даваться подсказки и что он умеет обращать списки. Сформулировал задачу, как это сделал ты — пол решения. Разобрался, как работает сложение/вычитание на уровне битов — еще четверть . Собрал решение из готовых блоков — заключительная четверть. Никаким хакером для решения этой задачи быть не надо, лично я — даже не программист, а деплоймент-инженер.
Здравствуйте, gandjustas, Вы писали:
G>Слушай, скажи как тебя зовут.
Стасик.
G>Я свяжусь с вашим начальством и попрошу чтобы тебя не допускали к собеседованиям, чтобы зря не парил мозг людям.
Думаешь они станут слушать какого-то форумного болтуна?
G>В брайте же занимаются CRM, SharePoint, SQL, BI. Что там c Java — хз, но точно не консольные приложения. Нахрена задачи, не имеющие отношения к работе, решать?
Чтобы отделить тех, кто самостоятельно могут решать задачи от обычных зубрилок, которым нельзя давать в руки ничего сложнее техзадания на размещение кнопочек на форме.
Здравствуйте, Паблик Морозов, Вы писали:
G>>Я свяжусь с вашим начальством и попрошу чтобы тебя не допускали к собеседованиям, чтобы зря не парил мозг людям. ПМ>Думаешь они станут слушать какого-то форумного болтуна?
Форумный болтун это ты, а я партнер, выход на начальство твое есть обучение консультантов проводил.
G>>В брайте же занимаются CRM, SharePoint, SQL, BI. Что там c Java — хз, но точно не консольные приложения. Нахрена задачи, не имеющие отношения к работе, решать? ПМ>Чтобы отделить тех, кто самостоятельно могут решать задачи от обычных зубрилок, которым нельзя давать в руки ничего сложнее техзадания на размещение кнопочек на форме.
Каким образом переворачивание списков или еще какие-то тупые задачи, не имеющие отношения к реальной работе что-то показывают?
Не говоря уже шапках и гномах.
Тебя вообще вредно допускать к собеседованиям после такого тут
Вполне адекватная задача для собеседования при условии, что человеку будут даваться подсказки и что он умеет обращать списки. Сформулировал задачу, как это сделал ты — пол решения. Разобрался, как работает сложение/вычитание на уровне битов — еще четверть.
Это пример эпического дрочева на хакерские приемы, которые не имеют никакого отношения к реальной разработке.
Никаким хакером для решения этой задачи быть не надо, лично я — даже не программист, а деплоймент-инженер.
Самое главное что ты на этой картинке справа
Кстати: максимальная подпоследовательность в силе. Дерзай. Ниче сложного в ней нет, код на 10 строк примерно. Покажи что ты понимаешь что-либо за пределами того что знаешь.
Здравствуйте, gandjustas, Вы писали:
G>Форумный болтун это ты, а я партнер, выход на начальство твое есть обучение консультантов проводил.
Ну да, еще среди наших патнёров — клининговая компания, которая в офисе убирается, её мнение по вопросам рекуртинга для нас тоже очень важно.
G>Каким образом переворачивание списков или еще какие-то тупые задачи, не имеющие отношения к реальной работе что-то показывают?
Оно показывает идиот человек или нет. Я еще ни разу не встречал нормального программиста, который бы был не в состоянии решить такую простую задачу.
G>Не говоря уже шапках и гномах.
Аналогично.
G>Тебя вообще вредно допускать к собеседованиям после такого тут
Офигенная задача. Видишь, как много она показывает:
— умение понять что же надо сделать (что мыщъх сделал намного лучше меня, видимо из него бы получился хороший консультант-аналитик или постановщик)
— умение провести исследование, найти закономерности, понять и их смысл (вообще, поиск закономерностей — это стандартная задача теста на IQ, так у детей в детском саду уровень развития интеллекта определяют)
— умение декомпозировать задачу и сложить решение из готовых блоков
— наличие системного подхода к решению задач, состоящих из более, чем одного действия
). Т.е. то, из чего состоит любой успешный проект по внедрению Microsoft Dynamics CRM, да и вообще решение любой задачи. Плюс, задача требует понимания важности всех этапов, их взаимосвязи и системного подхода к ним. Смог бы я решить задачу, если бы мыщъх не выполнил бы корректную постановку (моя собственная была некорректной, я бы изначально стал решать задачу неправильно)? Смог бы я её решить, если бы не выполнил исследование битовых операций или ошибся при исследовании? Т.е. четвертым пунктом эта задача проверяет наличие качеств, необходимых менеджерам проектов.
При этом на всём протяжении можно общаться с кандидатом, давать подсказки (например, спросить что значит x & (x — 1), что значит x & (x + 1), в чем разница), запутывать и провоцировать (что, например, мыщъх делал здесь: http://www.rsdn.ru/forum/job/4633807.1.aspx
Короче, не знаю, где мыщъх раскопал эту задачу, но она просто великолепна. Единственная проблема в том, что это действительно серьезная задача, рассчитанная на инженеров, и она может оказаться сложноватой для обчитавшейся msdn прокладки между пользователем и sharepoint-ом, гордо именуемой майкрософт сертифиед профешшионал девелопер.
G>Это пример эпического дрочева на хакерские приемы, которые не имеют никакого отношения к реальной разработке.
Накакого дрочева, только системный подход и ориентированность на результат (еще раз напоминаю, я никакой не хакер, этот ваш Hacker Delight не читал и на оссёмблере со школы не программировал).
Здравствуйте, gandjustas, Вы писали:
G>Здравствуйте, Stanislav V. Zudin, Вы писали:
SVZ>>И чтобы без рекурсии
G>А нахрена оно нужно? Если 1 еще может встретиться в реальной жизни, то 2 и 3 — просто высосаны из пальца.
Что-то я занимаюсь проектами, высосанными из пальца последнее время.
Что-то странное Вы написали, ближе к истине IMHO будет следующий вариант для большего числа, без обработки ошибок:
//Count the consecutive zero bits (trailing) on the right in parallelunsigned int trailingZeroBits(unsigned int v) // 32-bit word input to count zero bits on right
{
unsigned int c = 32; // c will be the number of zero bits on the right
v &= -signed(v);
if (v) c--;
if (v & 0x0000FFFF) c -= 16;
if (v & 0x00FF00FF) c -= 8;
if (v & 0x0F0F0F0F) c -= 4;
if (v & 0x33333333) c -= 2;
if (v & 0x55555555) c -= 1;
return c;
}
unsigned int next(unsigned int x)
{
unsigned int zeroBits = trailingZeroBits(x);
unsigned int bit = x - (x & (x-1));
x += bit;
unsigned int totalBits = trailingZeroBits(x);
x += (1u << (totalBits - 1 - zeroBits)) - 1;
return x;
}
G>>Каким образом переворачивание списков или еще какие-то тупые задачи, не имеющие отношения к реальной работе что-то показывают? ПМ>Оно показывает идиот человек или нет. Я еще ни разу не встречал нормального программиста, который бы был не в состоянии решить такую простую задачу.
G>>Не говоря уже шапках и гномах. ПМ>Аналогично.
Ты уже в сплошной беспроглядный субъективизм скатился.
Ты разве не понял что я могу подобрать задачи, которые ты на собеседовании не решишь. Даже с подсказками.
После этого назову тебя идиотом. Только с твоими навыками это никак не коррелирует.
ПМ>Офигенная задача. Видишь, как много она показывает: ПМ>- умение понять что же надо сделать (что мыщъх сделал намного лучше меня, видимо из него бы получился хороший консультант-аналитик или постановщик) ПМ>- умение провести исследование, найти закономерности, понять и их смысл (вообще, поиск закономерностей — это стандартная задача теста на IQ, так у детей в детском саду уровень развития интеллекта определяют) ПМ>- умение декомпозировать задачу и сложить решение из готовых блоков ПМ>- наличие системного подхода к решению задач, состоящих из более, чем одного действия
Решение задачи манипуляции с битами показывает только умение решать задачи манипуляции с битами и больше ничего
А вот на товарища мыщъх ты зря ссылаешься. Потому что он не инженер-разработчик , а исследователь-реверсер.
Здравствуйте, gandjustas, Вы писали:
G>Ты разве не понял что я могу подобрать задачи, которые ты на собеседовании не решишь. Даже с подсказками. G>После этого назову тебя идиотом. Только с твоими навыками это никак не коррелирует.
Я не подбираю задачи, которые кандидат не может решить, я подбираю задачи, которые должен уметь решить любой программист, пишущий код. Если задача обращения списка кажется программисту слишком сложной, то он явно чем-то не тем занимается. Доверять разработку такому человеку мне бы не хотелось.
G>Решение задачи манипуляции с битами показывает только умение решать задачи манипуляции с битами и больше ничего
Я уже очень подробно расписал, что она показывает, опровержений по сути нет, лишь повторение одной и той же мантры. Но если у тебя уж совсем с соображалкой туго, замини слово "биты" словом "майкрософт сертифиед профешшионал девелоперы" и задача будет показывать умение решать задачи манипуляции с майкрософт сертифиед профешшионал девеловерами.
Кстати, в решении задачи я облажался, но не в месте манипуляции с битами, уже одно это умному человеку скажет, что эта задача — больше чем манипуляция с битами.
G>А вот на товарища мыщъх ты зря ссылаешься. Потому что он не инженер-разработчик , а исследователь-реверсер.
Я тоже не разработчик. И, как выяснилось, 9 из 10 сеньёр-разработччиков — это просто зубрилки, которые выучили какую-то справочную информацию, но мозгов у них от этого не прибавилось и задачи они решать не научились. В эпоху интернета знание справочной информации не представляет никакой ценности — любая доступна в течение нескольких секунд. Ценен только интеллект.
Здравствуйте, Паблик Морозов, Вы писали:
ПМ>Здравствуйте, gandjustas, Вы писали:
G>>Ты разве не понял что я могу подобрать задачи, которые ты на собеседовании не решишь. Даже с подсказками. G>>После этого назову тебя идиотом. Только с твоими навыками это никак не коррелирует.
ПМ>Я не подбираю задачи, которые кандидат не может решить, я подбираю задачи, которые должен уметь решить любой программист, пишущий код.
Кому должен?
ПМ>Если задача обращения списка кажется программисту слишком сложной, то он явно чем-то не тем занимается. Доверять разработку такому человеку мне бы не хотелось.
Еще раз напомню что ты не решил две предложенные мной задачи, хотя видел их точно. Причем задача выбора случайных элементов гораздо чаще встречается, чем разворот списка.
Ты хочешь сказать что доверять тебе решение задач нельзя?
G>>Решение задачи манипуляции с битами показывает только умение решать задачи манипуляции с битами и больше ничего
ПМ>Я уже очень подробно расписал, что она показывает, опровержений по сути нет, лишь повторение одной и той же мантры.
Мантру вижу: "каждый программист должен", а объяснения не вижу. Ты ведь и сам такие задачи решать не умеешь, ты это уже явно показал.
Врядли ты в таком расклде сможешь чтонить объяснить.
ЗЫ. Кстати, жду решения задачи о максимальной подпоследовательности.
Здравствуйте, gandjustas, Вы писали:
ПМ>>Я не подбираю задачи, которые кандидат не может решить, я подбираю задачи, которые должен уметь решить любой программист, пишущий код. G>Кому должен?
Должен уметь решать, если он собирается писать код в моём проекте. Если не умеет — пусть пишет в другом месте. Исправлять за такими ошибки — себе дороже.
G>Еще раз напомню что ты не решил две предложенные мной задачи, хотя видел их точно. Причем задача выбора случайных элементов гораздо чаще встречается, чем разворот списка.
Я не на собеседовании.
G>Мантру вижу: "каждый программист должен", а объяснения не вижу.
Объяснения я уже раз 20 раз написал.
G>Ты ведь и сам такие задачи решать не умеешь, ты это уже явно показал.
Здравствуйте, gandjustas, Вы писали:
G>А нахрена оно нужно? Если 1 еще может встретиться в реальной жизни, то 2 и 3 — просто высосаны из пальца.
Задачи действительно высосаны из пальца. Хотя полно проектов, где и их надо решать.
Но если кандидаты даже такое задание не могут решить, то как им доверишь что-то сложнее?
Здесь нет ничего из rocket science. Просто сесть, подумать и написать. И то не справляются, как выяснилось.
2 П.Морозов: Есть еще одна идея. Спроси кандидатов, какую литературу они читают (техническую)? Может быть весьма показательным.
_____________________
С уважением,
Stanislav V. Zudin