Pull to refresh

Comments 94

а кандидат должен решить все эти задачи или только некоторое количество?
Предполагается задавать по одной задаче из группы. Если ответил на задачу из 1 группы (очевидную), перейти на задачу из 2 группы, если ответил, то обсуждаем что-нибудь из 3-ей.

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

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

  • И объективности это не даст. Лучше ставить перед человеком простые задачи, которые он сможет просто решать и смотреть на ход мысли.

  • А вообще на своём опыте убедился - понты на собеседовании это признак гнилой конторы.
  • На какую вакансию?

    Java-разработчик серверной части

    Я думаю это слишком сложные задачи

    Спасибо за мнение!

    Лучше ставить перед человеком простые задачи, которые он сможет просто решать и смотреть на ход мысли.

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

    понты на собеседовании это признак гнилой конторы

    Утверждение спорное, но если на интервью втирают, что контора самая крутая, в ней все самые умные и вообще тебе ещё расти и расти, то подозрение это вызывает точно!
    Задачи лучше разбирать прикладные к работе, и чем глубже в детали, тем лучше. В приципе при общении всё и становится ясно.
    Я пытаюсь начать интервью с вопросов вроде "на сколько по 10-и балльной шкале Вы оцениваете своё знание ${технология_тут}?". В зависимости от ответа задаю вопрос соответствующей сложности. К примеру, для языка Java вопрос на 10 - "что такое strictfp?".

    Ну а после технологичных вопросов идут задачки. Расчёт такой: если человек здорово знает прикладную часть, то это хорошо. Если знает так себе, но шибко решает задачки, то тоже хорошо.

    Но вообще действительно очень много понимаешь просто поговорив с человеком (про жизнь, его любимые проекты и т. п.)
    > К примеру, для языка Java вопрос на 10 — «что такое strictfp?»

    Тогда вот хороший вопрос: «В чем разница между varchar и varchar2 в Oracle 8i?»
    Я не знаю Oracle 8i на 10, но вопрос, похоже, и правда неплохой.
    задачи конечно интересные и вполне решаемые, но сходу их просто не найти без доп. источников. Не нужно искать тех кто знает заранее решения, нужно искать тех кто умеет находить эти решения и ещё лучше - находить и оптимизировать.
    Да и многое они всё таки не скажут о кандидате.

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

    Вы решительно правы! А каким образом минут за 40-60 определить человека, который это умеет делать. Как должно выглядеть задание (и должно ли быть задание вообще или достаточно беседы)?
    Я не совсем понял: сложно задачи найти или решения
    UFO just landed and posted this here
    UFO just landed and posted this here
    UFO just landed and posted this here
    Я не знаю, кому как, а мне кажется, что если человек умеет улыбнуться, то с ним приятно работать :)
    Задачки — далеко не всё
    UFO just landed and posted this here
    **долго смотрел на чисто мужской коллектив офиса и думал, что что-то не так с этими задачками на собеседовании**
    UFO just landed and posted this here
    Если честно, задачи в большинстве своем не сильно сложные, только вот тут:

    2.3 Из цельного куба произвольно вырезали маленький куб, полностью расположенный внутри большого. Требуется найти плоскость, которая разрежет получившуюся фигуру (большой куб с полостью внутри) на две фигуры одинакового объема.

    Ребра внутреннего куба параллельны ребрам внешнего?

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

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

    А насчет куба что-то не представляю решения. Тока перебором. Поставить плоскость посередине и двигать, считая площадь, пока не получится половина.
    >Дополнительная переменная - тоже выделение памяти, это сбивает с толку.
    Наверное, стоило сказать за память O(1)

    Поставить плоскость посередине и двигать, считая площадь, пока не получится половина.
    Это один из вариантов, но есть более изящное решение. Если хотите подумать, то попробуйте решить то же самое для двухмерного случая
    Любая плоскость, проходящая через центр куба делит его ровно пополам. Это - почти ответ.
    В подобных задачках "отсуствие дополнительной памяти" трактуется как "константная дополнительная память" всегда. Логика очевидна: ваша программа где-то хранится, значит совсем без дополнительной памяти не обойтись, а чем два байта хуже десяти?
    про первую задачку: ничего о используемых структур не говорится. По идее можно каждое слово запихать в массив, а потом просто вывести его элементы в обратном порядке. Еще задачка про "тик-так" понравилась :)
    >По идее можно каждое слово запихать в массив, а потом просто вывести его элементы в обратном порядке.
    Не совсем. Для "Мама мыла раму" получится "умар алым амаМ", а не "раму мыла Мама"

    >Еще задачка про "тик-так" понравилась
    Самого прёт :)
    нет :) элементами массива могут быть слова :)
    1.1 Перевернуть предложение (было "Мама мыла раму", стало "раму мыла Мама"); сделать это без использования дополнительной памяти
    ----
    Без использования доп. памяти это как?
    Не выделять явным способом?
    Не использовать доп. переменные?
    На каком языке?
    Результатом является вывод перевернутой строки на экране/в файле или в той же самой переменной/адресе памяти, где была оригинальная строка?
    >Без использования доп. памяти это как?
    Вы можете только переставлять местами символы в исходной строке.

    >Результатом является вывод перевернутой строки на экране/в файле или в той же самой переменной/адресе памяти, где была оригинальная строка?
    Перевернутая строка в памяти. Но если можете предложить, как строку в памяти не трогать, а вывести перевёртыша на экран (не используя доп память), то будет здорово!
    А где слово строка в условии?
    Выводим набор символов в нужной последовательности на экран не используя дополнительную память. :)
    Эээ. Не совсем понял.
    Условие предлагает строку в памяти (типа char[]). Надо за O(1) памяти обратить её по словам на месте
    За O(1) и без использование дополнительной памяти (создания вообще каких-либо переменных) вариант:
    cout << str[11] << str[12] <<...;
    Хотя проще и нагляднее будет cout << "рама мыла Маму";
    Уже можно писать отрицитальный отзыв: либо человек реально не может понять простайшую задачку, либо может и "кидает понты". В обоих случаях на работу его брать не стоит...
    Супер! А можете теперь без вывода на экран — чисто в памяти обратить (чтоб этот самый str содержал перевёртыша)?
    Немного кривовато, но должно работать(правда может цикл соптимизируется, чтобы этого не было в нем чтонибудь делать надо, но мне сейчас влом ^_^)
    А можете в самом нижнем цикле скобки поставить? А то не очень понятно, что именно выполняется size_of_last_word раз.
    по моему, если это будет работать, то не за О(1).
    Ну да, 6 кажется переменных дополнительных используется.
    А млин, больше 6 переменных кажется используется, правда можно оставить 5, причем 3 из них будут использоватся в цикле(i,i,j), 1 для перемены символов местами(buf) и еще одна тоже нужна(start).
    Да хоть тысячу! O(1) - это когда количество дополнительных переменных не зависит от размера исходных данных.
    Кстати, количество проходов условием не ограниченно.
    кстати, да заметил только что.
    Да не, по памяти оно O(1) кажись. Там баги мелкие: видимо вместо "str[i]!=' '||i>=0;" имеется в виду "str[i]!=' '&&i>=0;", вместо "str[size]=buf" — "str[size-1]=buf".

    Только если это исправить, он для предложения "W1 w2 w3" возвратит "w23 wW1" — size_of_last_word не ловит конца (начала) предложения.

    Но подхода такого я ещё не видел — интересно, сможете ли Вы (хотя бы из любопытства) довести его до конца (и возможно ли это вообще ;) ).

    Я чесслово завтра ещё подумаю
    Да, глючки присутствовали + swap не в ту сторону крутил ^_^.
    Исправил и залил туда же.
    Компилятора нет под рукой :)
    У тебя работает со словами разной длины?
    Да.
    П.С. Я тоже писал без компилятора, но, чтобы проверить, пришлось побороть свою лень и открыть его ^_^
    Прикольно! Всё работает! И решения такого я ещё не видел :)
    Решение по сути своей элементарное, только работает оно за O(n*n)
    А слабо за O(n) :) ?
    (на самом деле это я докапываюсь и вообще занудствую)
    Без использования дополнительной памяти - если только мудрить с обходом массива с двух сторон к середине, но у меня нету настроения чтобы мудрить сейчас ^_^
    Циклы или рекурсии можно использовать? (вроде как тоже выделение памяти...)
    Строка, как я понимаю, mutable?
    Решение
    print(str, 10, 14)
    print(str, 6, 10)
    print(str, 1, 5)
    не принимается? :))

    oldpos = str.length
    pos = reverse_find(str, whitespace, oldpos)
    while pos>0
    print (str, pos, oldpos)
    oldpos = pos
    pos = reverse_find(str, whitespace, oldpos)
    end

    reverse_find - позиция в строке для найденного символа, начиная с oldpos, до начала строки. Либо -1 если символ не найден.

    Такое решение в лоб на псевдоязыке - правда не могу сказать, что доп. память не выделяется :))
    На самом деле память всё же растёт как O(n) — каждое слово предложения влечёт +1 шаг рекурсии.

    А можете сделать так, чтоб вместо вывода на экран сам str содержал перевёртыша?
    Здесь нет рекурсии память не растет. Сложность линейная. По строке пробегутся всего один раз. Ищется пробел начиная с найденного в прошлой итерации.
    >А можете сделать так, чтоб вместо вывода на экран сам str содержал перевёртыша?
    А str любой или конкретно "мама мыла раму"? То есть слова одинакового размера или нет?
    > Здесь нет рекурсии память не растет
    Сорри, не воткнул

    > А str любой или конкретно "мама мыла раму"? То есть слова одинакового размера или нет?
    str - любой, слова любого размера не короче 1 (т.е. двух пробелов подряд быть не может)
    Если условия таковы, то решения у меня нет. Хочется увидеть твое.
    Завтра напишу Большой Белый Камент с идеями всех решений. Идёт?
    А ответы на эти задачи можно услышать?
    Конечно. Я вот только не знаю как лучше:
    1. либо белым-белым большим каментом,
    2. либо отдельным постом-разблачением,
    3. либо отвечать на вопросы интересующихся в каментах (что-то вроде "Уважаемый, я ума не приложу почему в задаче 2.1 мне на ум приходят числа Каталана?" - "Ничего удивительного, ${подробное_объяснение}").

    Как было бы удобнее?
    Большой белый коммент - это нормально. Только номера задач черным, а то не всем все нужно;)
    Большой белый коммент. Только номера задач черным, а то не всем нужны все ответы. Кто-то еще и подумать на досуге захочет;)
    Упс. Извиняюсь, глюк.
    ОК — завтра будут :)

    Я напишу ББК с идеями решений ответом на этот камент
    И в конце статьи можно будет поставить ссылку на на этот ОББК;)

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

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

    Дано, три соискателя: Отличный специалист, Хороший специалист, Победитель школьной олимпиады; 15 задач из прошлогоднего задачника по олимпиаде.
    Найти соискателя, который сможет решить данные 15 задач.

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

    А вот как среди трёх предложенных Вами соискателей найти Отличного Специалиста, я, увы, не знаю. Узнаю — обязательно напишу!
    На фоне нехватки специалистов в ИТ, очень странно видет такие вычурные собеседования. Нормальный специалист имеет Портфолио, Резюме и даже Рекомендации. По ним уже можно понять о человеке как специалисте. На собеседовании лишь достаточно выяснить насколько это верно и психологический тип человека, поскольку мега-специалист со склочным характером - это очень плохо.
    А задачки подойдут лишь для неопытных, начинающих или просто недо-специалистов, которые могут работать за недорого.
    В ИТ нет нехватки специалистов. И никогда не было. Есть нехватка хороших специалистов.

    Что касается ваших трёх соискателей, то практика показывает что взять третьего - далеко не худший вариант. Ибо он хорошо обучаем и обычно не имеет лишних понтов. Если вы берёте не человека чтобы срочно "заткнуть дыру", а в рассчёте на достаточно долгосрочный проект, то победителя олимпиады уж точно лучше чем взять плохого специалиста.

    Собственно собеседования в такие конторы как Google и Яндекс проходят зачастую примерно по такому принципу (это, разумеется, не единственное что спрашивают на собеседовании). Я не думаю что там все недо-специалисты...
    Действительно, хороших специалистов найти очень сложно и просят они довольно много. Поэтому нанять не очень профессионального товарища получается дорого и обидно. Определяют ли задачи умение думать — вопрос действительно спорный. Лично мне кажется, что да, определяют — если человек может быстро воткнуть в суть проблемы, пусть даже не предлагая окончательного решения, то это уже очень хорошо. Ну а если совсем не понимает о чём идёт речь, то это вызывает сомнения.

    khim, большое спасибо за поддержку! Я уже почти совем отчаялся в разумности этих задач и вообще в смысле жизни :)
    Специалист может либо хорошим либо отличным, иначе это просто обезьяна с лопатой. Я не говорил, что все кто не имеет опыта - это недо-специалисты, есть категория начинающих, у которых все в переди при соответствующем стремлении и желании.
    Не будем путать теплое с мягким. Хороший практик всегда знает где найти теорию, а хороший теоретик вряд ли сделает что-то практичное.
    Google и Яндекс себе могут позволить что угодно - у них хорошие условия и деньги, люди стремяться туда из-за этого. В конторах меньшего масштаба этого нет.
    Похоже на задачи по информатике - слабая связь с реалиями жизни.

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

    На самом деле мне я всерьёз задумался, не стоит ли просить других кандидатов присылать подобные кусочки...
    Это не задачи по информатике, это простые задачи по программированию(+ кое-где по математике). Они не направленны на то, чтобы понять какой вы специалист. Они направленны на то, чтобы понять, можете ли вы думать.
    Уметь думать != Хороший специалист. От программиста мне надо, чтобы он писал:

    1. Устойчивый к ошибкам код с комментариями
    2. Делал работу максимально в срок
    3. Умел пользоваться сторонними библиотеками
    4. Мог работать в команде

    Конечно, если при этом сотрудник будет блистать сообразительностью - я не откажусь, но часто перекладывают работу Системного архитектора на программиста. Я специально перегибаю палку, чтобы показать, что живость ума - не единственный фактор.
    Согласен. Кажется Джоуэл в своей книге "О программировании" так и написал: (не дословно) лучший способ определить какой перед вами программист, то дайте ему задачу написать код. Подход с задачками ответы на которые ты можешь знать (и тогда скажешь) или не знать (и тогда ты её никогда на собеседовании не решишь) он считает в корне неверным.
    Ни одна из приведённых задач не относится к категории "если не знаешь то никогда не решишь". Некоторые требуют подумать минут 10-15...
    Вы очень кстати вспомнили Джоуэла. В этой статье он как раз предлагает одну такую задачу: "Перевернуть строку, не пользуясь дополнительным буфером" :)
    Умение думать - необходимое условие, но недостаточное, тут вы правы. Конечно собеседование не сводится чисто к подобным задачкам, но как его часть - почему бы и нет...

    У нас нет разделания на программистов и Системных архитекторов (ещё и с большой буквы, уж ты), а многие проекты включают в себя одного-двух человек. Зачем нужны программисты если можно найти людей, которые могут придумать как решать задачу и написать код, её решающий? Таких людей есть, это не уникумы. Ну может платить им придётся несколько побольше, чем быдлокодерам, но это того стоит, поверьте.
    Мне кажется что подобные задачки подошли бы при подборе на работу начинающих программистов, то бишь стажеров. Как раз знания о том как правильно писать код, комментарии, и т.п. у них скорее всего нет, а то как голова соображает решение задач покажет.
    Ась? Умение правильно писать код не заменяет умения думать! Вы ж не писарей на работу берёте, а программистов. Другое дело что к коду стажёра можно меньше придираться... Но, скажем, задачка 2.2 - это чисто задача на написание кода. Можно посмотреть как клиент его структурирует, какие структуры данных использует, etc. Задачу 3.5 можно для того же использовать.
    А ответы будут? Или я что-то пропустил? %)
    =) Не, Вы ничего не пропустили. Sic transit gloria mundi, статья потерялась в архивах хабра, так что я решил, что ответы никому не интересны (да и задачки довольно простые).

    А какой номер Вас интересует?
    UFO just landed and posted this here
    Желательно все :)
    Есть некоторые, которые я не знаю пока как решить, для других хочу проверить решения.
    Если лень много писать, хотя бы просто намекните на суть решения.
    Хм… Похоже, раньше я был сообразительнее.

    Если все числа взаимопростые или если у нас есть бесконечная память, то ответ очевиден. Ответ очевиден, если есть функция отображающая любое число в простое.
    Sign up to leave a comment.

    Articles