Стратегия для технического интервью

    Регулярно встречаю посты, в том числе и на хабре (Иллюзия эффективной разработки: проектирование, Красной таблетки не существует) в которых говорится о том, что одни программисты эффективней в десять раз чем другие и о том, что выбор людей может оказаться важнее организации процесса работы и выбора технологий.

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

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

    Сначала хочу определить, что означает для меня «эффективность».

    Под эффективностью я подразумевю относительную эффективность: конечную пользу (business value), которую может приносить кандидат, работая в конкретной роли на нашем проекте, по сравнению с другими соискателями.

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

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

    Но интервью проводить все равно нужно. Не будем же мы брать всех желающих на испытательный срок без разговоров.

    Реалии нашего HR процесса таковы, что технические собеседования проводятся, в основном, по телефону. Потому что кандидаты бывают из разных городов и даже стран, потому что интервьюеров бывает несколько, также возможно из разных стран. Даже в условиях одного мегаполиса, поездка на личное интервью съедает много времени у кандидата, а на телефонное собеседование люди соглашаются легче.

    Телефонное интервью должно быть коротким — через час ухо устает, через два – уже готово отвалиться.
    Чтобы получать дополнительную информацию для принятия решения, пробовали давать тестовое задание перед телефонным собеседованием. Не заработало. Стало на порядок меньше тех, кто доходил до интервью, а сколько — нибудь вменяемых специалистов среди них — ещё меньше. Действительно, зачем грамотному разработчику выполнять задание до собеседования, когда его и так отрывают с руками и ногами? И мы отказались от этой идеи.

    Сначала, проводя интервью с соискателем, я придерживался хорошего «правила №1» от Joel Spolsky
    «Лучше упустить настоящего профи, чем взять неэффективного сотрудника и потом с ним мучиться».
    Поэтому отсеивал всех «подозрительных» и при любых сомнениях.

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

    Тогда я создал общий список вопросов, для сравнения кандидатов по ответам на одни и те же пункты, чтобы придти к более объективным количественным оценкам, нежели «подозрительное» шестое чувство, которое позволяет лишь отсеять кандидата, но никак не сравнивать их между собой.

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

    Чтобы найти идеальный баланс, надо определиться — какие факторы будут решающими в вопросе эффективности кандидата на нашем проекте?

    Основным фактором я выбрал умение разбираться в проблемах и придумывать решения в своей области (пресловутые problem solving skills), проще говоря, думалка должна быть прокаченной.

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

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

    Третий — это кроссфункциональные навыки. Для нас идеален «человек-оркестр». Такой, чтобы разбирался в чем-то одном хорошо, но также умел тестировать, собирать аналитику, общаться с клиентом, и делать UI, и backend, и писать SQL запросы, и разрабатывать схему БД, предлагать архитектурные решения.

    Это идеал, конечно. Всё досконально знать и уметь нельзя, но широкий опыт и навыки в разных направлениях должны позволить лучше общаться всей команде, понимать и помогать друг другу, находить решения сообща. Это страхует от пробуксовки проекта при внезапном увольнении одного сотрудника и может сыграть ключевую роль в успехе проекта, особенно для маленьких команд типа нашей, насчитывающей в разные времена 3-5 человек.

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

    И только на последнем месте идет знание используемых нами технологий, которое позволяет быстрее «вкатиться» в проект. Но, на мой взгляд, эти знания не будут влиять на эффективность в долгосрочной перспективе. Мало того, что технологии, и даже языки, могут поменяться в любой момент, так ещё и требование конкретных знаний сильно сокращает наш выбор. Все это может привести к тому, что на безуспешные поиски будет потрачено слишком много времени. Что в свою очередь вынудит нас нанять уже не слишком профессионального сотрудника, который, как говорится, подвернется под руку.

    Итак: problem solving skills. Как их проверять?

    1. Понимание вещей, а также умение объяснить это свое понимание. Чем больше человеку пришлось разбирать сложные вещи, тем лучше может быть натренирована «думалка» (иначе, что ещё дает высшее образование?). Умение объяснить/донести свою мысль, показывает четкость и стройность мышления, так необходимые для решения проблем. Поэтому ответ не по существу моего вопроса, запутанные или отвлеченные объяснения, сооблазняют меня сэкономить дальнейшее время, воспользовавшись правилом №1.
    2. Непонимание вещей. Это когда кандидат использует нечто и вообще не представляет, почему и как оно работает. Скопипастил, кликнул, вроде заработало, а потом отваливается, вылазят баги, и хрен поймешь почему. Это может свидетельствовать о лени, неумении или нежелании разбираться в проблемах. В общем, жирный минус.
    3. Общий разносторонний опыт. Чем его меньше, тем реже приходилось разбираться и вероятно, что «думалка» будет не прокаченной. Меньше будет и кроссфункциональных навыков, важность которых описана выше. Богатый опыт, наоборот же, позволяет быстрее решать непредвиденные сложности на уровне интуиции.
    4. Решение задачек. Я понял, что сложные задачи и «головоломки» не работают. На одном собеседовании, я очень долго пытался ответить на вопрос: «Почему канализационные люки круглые?» Мне так и не пришла в голову мысль: «Чтобы они вниз не провалились». Потому что для этого нужно озарение, а это сродни удачи, и никак, по-моему, не проявляет навыки. В конце концов, я изрек: «Они круглые, потому что в них пролезет такой же чувак, что и в квадратные люки, а металла на них уйдет меньше». Этим можно проверять лишь упорство кандидатов что, конечно, не маловажно, но это слишком долгий и негуманный способ.

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

    У Joel Spolsky есть лозунг/критерий найма: «Smart & Gets things done» (Я бы перевел как «Умный и Практичный»). Все вышесказанное относится к части Smart, часть Gets things done означает способность придумать не только «идеальное» решение, а выбрать практичное решение, учитывая потребности и возможности заказчика. Для этого необходимо оставаться сфокусированным на бизнес- проблемах клиента и целях проекта, а не на собственном исследовательско-изобретательском интересе. Так что, идеальный вопрос/задача должен проявлять оба критерия: «Smart» и «Gets things done».

    И вот какие вопросы я нашел:

    1. Ведете ли Вы технический блог? Пишите ли тех. статьи (например, на хабре) или книги? Выступаете ли на конференциях, собраниях, мастерклассах (внутрикорпоративные считаются)? Участвуете ли в opensource проектах?

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

    2. Есть ли персональные технические проекты?

      Ответ «да» может говорить о том, что человек любит свое дело, а не просто из-за денег страдает на работе. К тому же в персональных IT проектах часто приходится всем заниматься самому, а это говорит о важном кроссфункциональном опыте.

      Ответ «нет» минусом не является.

      Вопросы 1 и 2 позаимствованы из поста Nikos Maravitsas, в котором он предлагает свою методику оценки кандидатов, за что ему спасибо.

    3. Дано: веб страница с приблизительно 30-ю печатными страницами текста, в котором жирным шрифтом выделены 300 слов или словосочетаний.
      Необходимо: Все выделенные слова скопировать в отдельный файл, разделив запятыми и обернув каждое в двойные кавычки.
      Задача делается только один раз (она не будет повторяться), требуется ее решить как можно быстрее и абсолютно неважно, каким способом. Требуется также дать оценку в часах на предпологаемое решение.

      Хочу сказать, что в текущем проекте мы никогда не даем оценки в часах (а только оцениваем порядок сложности задачи), но на этот вопрос я слышал оценки от 3-5 минут до 4 часов. И даже больше «так как нужно написать unit тесты» Вот так рождается расхождение эффективности на порядок.
      Возможные решения:
      • JQuery выражение, можно выполнить в firebug или аналоге и получить готовый результат. Займет 2 минуты. Если Вы назвали данный подход, не имея уверенных знаний jQuery, тогда еще больший плюс.
      • XPath выражение. Хороший способ, если вы знаете, куда это выражение вводить, например команду xmllint в линукс или знаете о соответствующей функции в Вашем любимом IDE. Кроме того, что нужно знать (или быстро придумать) куда это выражение вводить, нужно понимать, что xml и html вещи разные. Если Вы и это понимаете, тогда нужно знать, работает ли xmllint/IDE с html, если не уверены, можно придумать способ конвертации html -> xml. Способ «Погуглить» сканает, но весьма хорошо, если слышали о tidy. Отдельно проверяю адекватность оценки по времени на составление и отладку xpath выражения.
      • RegExp – пройтись регулярным выражением по файлу и выделить все «жирные» теги. Тут проверяю соображалку – куда будем вводить регулярное выражение (в какой программе/команде)? При незнании, начинаем для этого писать программу на любимом языке. Потом проверяю понимание о «жадности» регулярных выражений. И, наконец, сопоставляю оценку кандидата со сложностью решения. То есть, если кандидат делает выбор – писать программу на java (еще и с юнит тестами для этого случая) и вообще плохо понимает regexp, при этом дает мизерную оценку – то это точно минус.
      • Пишем программу на любимом языке, которая выделяет текст между «жирными» тегами. Прошу рассказать алгоритм того, как это сделать, включая то, как будет идти обращение к исходным данным. Это вполне нормальный вариант, если алгоритм рассказывается быстро и четко, а оценка соответствует уверенности кандидата. Если же человек путается в простых вещах, которые не требуют никакого особого знания или опыта, то это повод применить правило «лучше не взять, чем взять и мучиться»
      • Вручную. Вообще отличный вариант. Потому что оценка меньше и предсказуемее, чем те оценки, которые часто слышу для других вариантов. Однозначный плюс, если оценка на этот вариант адекватна, еще лучше, если используем regexp для оборачивания в кавычки и разделения запятыми. Два плюса, если меня спрашивают: «А на сколько критична ошибка в одном символе при копировании?» Это именно тот случай, когда за счет маленького уточнения требований, мы можем в несколько раз сократить стоимость решения. Вообще, чем больше разумных уточняющих вопросов от кандидата, тем лучше.
      Если же человек не может оценить время на такую «ручную» работу адекватно, или вообще наотрез отказывается рассматривать такой вариант – явный минус.

      На мой взгляд, именно такие вопросы, проявляют оба критерия «Smart» и «Gets things done» наилучшим образом.

    4. Дано: .xls (Excel) файл с одним листом в 4 числовых колонки и 1000 строк.
      Требуется: Загрузить его в SQL базу данных, таблица с соответствующими колонками имеется. Ну и, сперва, оценить время на решение.
      • Уверенный ответ – использую такой-то тул. Такой ответ мне ни о чем не говорит, просто повезло со знанием тула.
      • Конвертну в csv и использую такой-то тул. Уже интререснее, додумались сконвертнуть. Маленький плюс.
      • Конвертну в csv и использую встроенные возможности SQL сервера по загрузке из CSV. Еще интереснее, потому что говорит о том, что вероятно вы плотно разбирались с СУБД, а это часто выручает. Плюс побольше.
      • Погуглю тул, уверен, должен такой быть. Плюс за чутье и то, что не запалили кучу времени на изобретение велосипеда. Так же смотрю на адекватность оценки «гугления»
      • Конвертну в csv, напишу шелл скрипт, который будет делать insert into ….; выражения и запущу их на sql сервере. При адекватной оценке уверенный плюс.
      • Добавлю колонку в excel файле, куда во всех ячейках вставлю (растяну) «insert into» и дополнительные колонки с запятыми, получу sql скрипт. Сразу плюс, даже в оценке не нуждаемся.
      • Начинаем писать программу. Обычно это плохо. Если догадались конвертнуть в CSV и работать с простым форматом, и оценка вменяема, то еще ничего. Но если начинаем использовать сложные библиотеки для работы с Excel, потом пишем юнит тесты и оцениваем задачу в 8 часов чистого времени – то минус.

      В начале, я всегда объясняю – что я хочу проверить вопросом, чтобы люди специально не отсекали более простые варианты.

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

    5. Дано: массив из N рандомных чисел.
      Требуется: найти наибольшие K чисел из массива и оценить сложность алгоритма. Уточняю что K<(N/2), N большое число, интересует наиболее быстрый алгоритм, на расход памяти плевать.

      Эта задачка мне нравится тем, что в ней есть очевидное решение (практика это подтверждает), однако, не оптимальное. Я смотрю на то, может ли человек понять, что оно не оптимально самостоятельно, и как быстро добираемся до оптимального решения. В большинстве случаев добираемся, и мышление кандидата на ней раскрывается довольно хорошо, ну у тех, кто комментирует свои мысли. Потом приходим к понятию сложности алгоритма, нормальным ответом будет O(N*log K).
      Но если у Вас плохое настроение, то можно напомнить, что числа то рандомные и их много, и заставить решать задачу исходя из теории вероятности.
      Тогда ответ должен быть существенно меньше, чем O(N*log K). Какой? Я и сам не знаю.

    6. Дано: массив «значений» и соотвествующие этим значениям численные коэффициенты. Необходимо написать функцию/метод, выбирающий произвольно одно из значений таким образом, чтобы вероятность выбора была пропорциональна соотвествующим коэффициентам. То есть, чем больше коэффициент, тем чаще должно выдаваться соотвествующее значение, и наоборот.
      Не такая очевидная задача, но вполне решаемая. Оцениваю время и ход решения.

    7. Ну а дальше вопросы, чтобы выявить общий уровень знаний веб программиста, в моем случае на java, может кому-то будет интересно:

    • Объясните различие между <span> и <div>. Многие знают, а объяснить толком не могут, путаются, это минус.
    • В Javascript, объясните, что такое prototype (Не имеется в виду название фреймворка)? Что можно передать в метод jQuery(), он же $()?
    • В HTTP, что такое keep-alive?
    • Может ли cookie с одим и тем же ключом иметь разное значение на двух разных страницах одного и того же сайта (с одним доменом)? Нет? А на разных сайтах?
    • Чем TCP отличается от UDP. Дурацкий вопрос, но оказалось, что обычно знают ответ, теперь если кто-то не отвечает, для меня это подозрительно. А еще, бывает, что уверенно говорят полный бред, это гораздо хуже чем «не знаю, погуглил бы».
    • Что такое base64?
    • Можно ли сделать ajax запрос между разными доменами? Как?
    • Объясните принципиальную разницу между SOAP и REST? Смотрю на четкость и краткость ответа. «Не знаю» тоже годится.
    • Как реализовать producer-consumer паттерн с помощью двух параллельных потоков. (Суть паттерна объясняю
    • Есть ли опыт работы с xml? Если да, каким образом, с помощью каких технологий?
    • Знаете ли xpath, что такое в нем оси/axes.
    • Какой опыт с линукс? Хорошее знание линукса и его команд позволяет быстро решать (или автоматизировать) довольно сложные бытовые задачи, поэтому может существенно влиять на эффективность. Как поискать по истории введенных команд? Знание команд sed,awk,sudo,ps,top,grep? Использование pipes? Писали шелл скрипты?
    • Знание регулярных выражений?
    • Какие Ваши часто используемые hot keys или примеры автоматизации рутинных задач? Эффективность это не всегда умение думать, иногда люди быстро работают хотя бы потому, что все основные действия вынесли на hot keys и автоматизировали большинство рутины.

      Вопросы по SQL.
    • Отличие inner join и outer join? Смотрю на умение четко объяснить разницу.
    • Transaction isolation levels. Сможете ли объяснить? Достаточно уверенного «Да»
    • Как вывести все числа, встречающиеся в колонке A более двух раз?
    • Как сделать сумму по нарастающей? Например, есть таблица с датой и суммой продаж на каждую дату, нужно на каждую дату выводить сумму продаж с начала года вплоть до этой даты включительно. (на пальцах это проще объяснить)

      По программированию знания выявляются по ходу решения задач, но все же спрашиваю основы.
    • Как построчно прочесть файл?
    • Объясните, как работает TreeMap и HashMap. Это обязательные основы для программиста, на мой взгляд.
    • Ну и ArrayList против LinkedList. Кто из них будет быстрее при добавлении миллиона одинаковых объектов в конец? Точно сказать трудно, потому что ArrayList будет копировать несколько раз свой внутренний массив при расширении (его начальная capacity 16 по условию). А LinkedList будет для каждого вставляемого элемента создавать дополнительный объект, в котором будут храниться ссылки. Обычно отвечают очень уверенно: мол, тот будет быстрее, и упорно не хотят отвечать, почему может быть быстрее другой.


    Вот, в общем то, и все основные вопросы моего технического собеседования, на которые уходит час-полтора. Если остается время, то копаем вглубь и вширь, спрашиваю про предыдущие проекты, но обычно этих вопросов достаточно, чтобы принять решение по моей конкретной вакансии. (В Вашем случае, конечно, все будет по-другому).

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

    Удачи на собеседованиях.
    image
    Luxoft
    think. create. accelerate.

    Comments 106

      0
      «Дано: массив из N рандомных чисел.»
      Отсортировать по убыванию и взять первые K чисел?
      • UFO just landed and posted this here
          –4
          Почему не оптимальное? Проверил на нескольких миллионах чисел, выполняется очень быстро
          • UFO just landed and posted this here
              0
              К раз пройти по массиву из N чисел, каждый раз отыскивая меньшее предыдущего?
              • UFO just landed and posted this here
                • UFO just landed and posted this here
                    0
                    Сложность будет еще хуже: O(N*K)
                    • UFO just landed and posted this here
                        0
                        Ну, если K раз пройти по массиву N, как предлагалось выше.
                        • UFO just landed and posted this here
                            0
                            А тут N раз пройти по K, не так ли?
                              0
                              Пока что лучший и самый очевидный вариант — O(N*log(N)). При этом я таки в упор не вижу, как сделать быстрее :-(
                                0
                                Проходим по N элементам за O(N), если число больше минимального из отсортированного списка K наибольших, делаем вставку за log(K) (бинари сеч + откидывание минимального элемента).
                                Тоесть, в хужшем случае (числа идут в возрастающей последовательности) получим оценку O(N*log(K)).
                              • UFO just landed and posted this here
                      0
                      Если не ошибаюсь есть сортировка с O(N * log(log N) )
                        0
                        Сортировать N чисел уже умеют за O(N*\sqrt(log(log N))).
                          0
                          Можно получить O(N) для этой задачи:
                          держим результат в хеше (вставка/удаление за амортизированные O(1)), дополнительно храним минимальное значение элемента в результате
                          проходим 1 раз по массиву, сравниваем текущий элемент с минимальным — если больше, то кладем в хеш и удаляем минимальное оттуда.
                            0
                            а как в хэше найти минимальное значение?
                              0
                              Да, тоже об этом подумал… минимальное находится за log(K), т.е. будет в худшем случае O(N*log(K))
                              0
                              Я может быть вообще на необитаемом острове живу, но где все берут хеши с O(1)? Это средняя оценка. А в таких задачах интересует худший случай — O(n), для хранения коллизий списком.
                                0
                                Худший случай — это когда все N элементов одинаковые.
                                В данном случае если диапазон возможных значений рандома намного больше чем N можно пренебречь коллизиями. Если же это не так, то можно в хеше хранить ссылки на кольцевой список номеров элементов, и получить в итоге O(1) на вставку.
                                  +1
                                  Согласен. Про вставку погорячился. Просто последнее время постоянно слышу мнение, что хэш это панацея и все операции в нём за O(1). А чудес не бывает.
                            0
                            Если K = N / 2, то O(N log K) = O(N log N).
                        +1
                        Существует оптимально решение за время O(N).
                        en.wikipedia.org/wiki/Selection_algorithm
                        • UFO just landed and posted this here
                            +1
                            Да, действительно, вы правы. Выбор k штук описан тут: en.wikipedia.org/wiki/Partial_sorting. Время O(N). Алгоритм является слегка модифицированной версией нахождения k-го наименьшего(наибольшего)
                            • UFO just landed and posted this here
                            • UFO just landed and posted this here
                            0
                            Priority Queue/Heap (fixed size). O(N * log(K)). Очень часто встречается на StackOverflow, да и на собеседованиях тоже.
                          • UFO just landed and posted this here
                              0
                              Отличный способ кстати, в одном проекте так делали показ баннеров с весовыми коэффициентами :)
                              • UFO just landed and posted this here
                                  0
                                  Можно не хранить каждое по N раз, достаточно заранее просчитать «границы» на промежутке от 0 до суммы весов и хранить только их. То есть, если у нас 100 элементов с весами по 2, то можно сохранить просто сотню значений 0, 2, 4,… 198
                                  И генерить равномерно распределенный рандом из этого промежутка, вероятность будет та же.
                                  • UFO just landed and posted this here
                                      0
                                      Ну да. Думаю на собеседовании было бы плюсом оба варианта осветить)
                                0
                                Можно посчитать сумму коэффициентов, выбирать значение случайно от 0 до этой суммы, потом пробегать по массиву и суммировать коэффициенты до тех пор, пока они меньше этого числа, и «выдавать» то, на чем остановились. Вроде бы должно работать :)
                                +1
                                Вы готовы платить столько своего времени на каждого кандидата? Вы эти вопросы задаёте по телефону или очно? Если очно то вы уверены что кандидата под руками его любимая ide и окружение? Имхо многовато для собеседования.
                                  0
                                  по телефону
                                  • UFO just landed and posted this here
                                      0
                                      Я тоже отвечал. Или их не предлагается делать а предлагается только лишь озвучить варианты? Просто сделать сходу прям тут по телефону не всегда получится быстро.
                                      • UFO just landed and posted this here
                                    0
                                    Smart & Gets things done — Сообразительный и доводит начатое до завершения — у Спольски много раз упоминаеться, насколько это важное качество, умение завершать начатое
                                      +4
                                      Резонный вопрос: почему телефон, а не скайп? Даже если скайпиться в наушниках, это не так утомительно, как с трубкой + есть возможность какие-то вещи передавать текстом.

                                      Немного порадовался за себя — практически все вопросы не вызывают, кхе-кхе, вопросов… хороший выдался год, видимо.
                                        –5
                                        1. Многие выходят на улицу для собеседования — шифруются.
                                        2. Корпоративные стандарты.
                                      • UFO just landed and posted this here
                                          +1
                                          Мне же очень понравилась задача по php, хоть и ужасно проста:

                                          $a = 'I am `a` string';
                                          $b = ' and I am `b` string';
                                          if($a == $c)
                                          echo $a;
                                          if($b == $c)
                                          echo $b;
                                          Найти, чему равна переменная $c, чтобы на экране было написано «I am `a` string and I am `b` string»
                                            +2
                                            Сходу, $c = true;
                                              0
                                              Браво!
                                              Я же говорю, чрезмерно проста.
                                            0
                                            Решал недавно похожую задачу. Тут просто — строится граф, в котором ищутся компоненты связности.
                                            +1
                                            Спасибо, хорошее интервью, годное.

                                            Единственное, вопросы по TreeMap/LinkedList/ArrayLis задают все, кто ищет разработчиков под Java, соответственно, если соискатели не глупы, то к ответам на эти вопросы они уже подготовились.

                                            По поводу задачи k из n случайных чисел, действительно, «интуитивное», но не самое быстрое решение, это отсортировать и взять первые k чисел.

                                            Самое быстрое, имхо, это пройти весь массив, и вставлять элементы по мере обработки в новый упорядоченный массив (или дерево), удаляя из него при вставке к+1 самое маленькое значение, действительно, верхняя оценка сложности будет N * log(K). По поводу вероятности, можно сказать что с ростом N, сложность вставки в новый массив будет стремиться к 1 (если мы перед вставкой проверяем минимальное значение в массиве).

                                              0
                                              Надо подумать над такой идеей: на следующих этапах (во время интервью с Project Manager), спрашивать те вопросы, на которые кандидат не ответил во время ТИ. И если он не сделал попытки погуглить ответы на них, то делать соотвествующие выводы.
                                                +3
                                                Какие выводы?
                                                Понимает ли человек что жизнь слишком коротка чтобы тратить её на ерунду (поиска ответов на ненужные вопросы) ?)
                                                Всего знать невозможно, а само по себе ответы на эти вопросы мало-полезны.
                                                • UFO just landed and posted this here
                                                    +1
                                                    Не сочтите за грубость, но это будет или студент или джуниор.

                                                    Как пример: Знание о том что внутри Integer живет пул этих самых Integer некоторого размера — достаточно бесполезное знание. Тысячи таких «секретиков» регулярно попадают в поле зрение и так же бесследно исчезают. Не оставив следа ни в одном проекте. И только начинающим разработчикам кажется, что знание таких «секретиков» «важно», и сделает из них настоящего «профессионала». Но это не так)
                                                    • UFO just landed and posted this here
                                                        +1
                                                        «Как пример:» должно было натолкнуть на мысль причем здесь пул.
                                                        Если вы спросили человека про этот пул, а он не знает. Нет ничего страшного в том, что он и не узнает ко второму собеседованию — в работе не пригодится
                                                        • UFO just landed and posted this here
                                                      • UFO just landed and posted this here
                                                          +1
                                                          что такое axis в xpath — ничего страшного если человек не поинтересовался ко второму собеседованию если его работа не связана с этим «языком».

                                                          про алгоритмы — совсем смешно.
                                                          Если у нас работа действительно связана с алгоритмами (комп.графика, комп. лингвистика, неокторые другие области) — то действительно человеку нужно будет ознакомиться с тем что твориться в этой области.
                                                          В остальных случаях — все вопросы про алгоритмы — не более чем тешат чсв спрашивающего.
                                                          1)Всех алгоритмов знать не получится
                                                          2)Сейчас даже ответить на вопрос какой быстрее становится сложно:
                                                          Во первых — с распространением многоядерности алгоритмы которые «раньше» были медленными но лучше паралелятся начинают выигрывать на больших объёмах данных.
                                                          Во-вторых — все т.н. «оценки сложности» живут в мире «бесконечности». В реальном мире алгоритм, который медленней «в бесконечности», на реальных данных может оказаться быстрей.
                                                          • UFO just landed and posted this here
                                                0
                                                Почему автор пишет Java вместо JavaScript? Это не одно и тоже.
                                                  +3
                                                  Вероятно потому что имеются в виду серверные технологии на Java?
                                                    +1
                                                    Минусующим: про jsp не слышали и иные технологии? Таки да, на Java можно писать и веб-приложения. К тому же TreeMap/LinkedList/ArrayLis явно отсылает именно к Java, а не JavaScript.
                                                    0
                                                    Задался таким же вопросом
                                                    общий уровень знаний веб программиста, в моем случае на java
                                                    Ну а потом действительно общий уровень знаний веб-программиста, без привязки к Java. В конце на вопросах про списки/деревья только пришли к языковым особенностям.
                                                      +1
                                                      И я. Особенно вопрос про <span> vs <div> убил. Я вот web-программист на Java, но вёрсткой под браузеры ну вот совсем не занимаюсь. Зачем, если мои RESTful API возвращают удобные всем JSON и каждый клиент обработает их как ему удобнее?
                                                        0
                                                        Я так подозреваю, что это все исходит из концепции «человек-оркестр».
                                                    0
                                                    Все никак не могу понять, почему телефон не заменить на скайп, как во многих конторах, сами же говорите, ухо отваливается за час, в наушниках значительно легче, да и руки свободные для рисования/кодинга.

                                                    P.S. Сталкивался с вашими HR, очень агрессивный поиск кандидатов, практически спам. Часто еще на этом этапе отбивают желание продолжать общение.
                                                      0
                                                      Я тоже сталкивался с их HR-ми, не скажи, что они были очень любезны, но обещали «до $1000» за голову приятеля, если я приведу.
                                                        0
                                                        Я так понимаю внутри компании тоже есть бонус за успешного кандидата. Если кто-то привел, ему часть премии, а если HR сам нашел, то вся премия ему. Это как-то объясняет такой агрессивный хантинг.
                                                        +1
                                                        >Все никак не могу понять, почему телефон не заменить на скайп

                                                        Может быть потому, что далеко не все разработчики имеют возможность работы в отдельном кабинете или выйти с ноутом в безлюдное место и тд и тп. Если я на рабочем месте, где ещё 5 человек работают, буду в течении 2 часов отвечать на вопросы интервью, меня побьют палками и будут правы.
                                                          0
                                                          Если вы говорите с позиции человека, который проходит интервью (я так понял что вы именно про этот случай), вы абсолютно правы (в этом случае обычно, спрашивают удобно ли говорить и если нет, то когда будет удобно, можно ли через скайп и т.д.), а если с точки зрения человека, который проводит интервью, то нет. Топик рассказывает как раз о втором случае. Если в компании нет возможности для интервьюера спокойно провести собеседование в удобной обстановке для обеих сторон, то это немного странно.
                                                            0
                                                            >а если с точки зрения человека, который проводит интервью, то нет

                                                            «То нет» — что? Если собеседник (соискатель) говорит по телефону, то интервьюер, конечно, может позвонить ему и со скайпа. Особенно, если у него есть нормальная обратная переадресация (не знаю бывает ли такое у скайпа). Чтобы соискатель мог куда-то перезвонить при случае. Ну, из соображений элементарной вежливости, что ли… Из замечания про отваливающееся ухо я понял заботу топикстартера скорее о соискателе, нежели чем о себе :).

                                                            И… это… вы же говори про свободные руки для кодинга. Это очевидная ссылка на соискателя — интервьюеру-то что кодить? :)

                                                            А так, да, — если интервьюеру нет возможности всякое такое проделать, то это, конечно, странно.
                                                              +1
                                                              Я так подозреваю, что сфинкс, как и я, обратил внимание на то, что разговор по скайпу даже не рассматривается luxoft'ом (хотя не спрашивал, м.б. по желанию «клиента» и согласились бы). Ибо даже час по телефону — для меня это грустно. По скайпу тоже не всегда приятно, но много легче. Понятно, что это не должно быть единственным вариантом, но отсутствие выбора тоже не гут.
                                                                0
                                                                Да, вы абсолютно верно поняли мою точку зрения.
                                                                0
                                                                «То нет» — это, если у человека который собеседует, нет возможности найти спокойное место для собеседования (как вы написали выше) и его коллеги побьют палками, если он будет проводит собеседование по скайпу и поэтому, соискатель будет вынужден беседовать с ним по телефону, то это по меньшей мере странно. Я все рассматривал исходя из того, что написал автор топика, что собеседование он проводит по телефону. То есть мне странно почему именно по телефону, почему не по скайпу, если есть возможность — ведь при обоюдном согласии это значительно легче и для одной и для другой стороны. Я вот про что.
                                                          +2
                                                          Вообще-то к почти всем предлагаемым задачам нужно указывать критерии — одноразовая ли это задача («надо сделать сейчас, как можно быстрее и забыть») или регулярная («это надо делать 20 раз в секунду с разными наборами данных»). Решения серьёзно отличаться будут.
                                                            +1
                                                            Поддерживаю. А то меня тут недавно не взяли в одну контору потому, что я при выполнении тестового задания не комментировал каждую строчку кода и не раскидал «подсистемы» по файлам. А задача-то была сделать долбаный салют (система частиц), что вылилось в 428 строк кода, включая копирайт и лицензию BSD (меньше, чем у других соискателей, между прочим). Зачем размазывать «физику» среднешкольного уровня и отрисовку по нескольким классам и файлам для одноразовой работы? Развивать этот шмат кода никто не будет — нормальный программист возьмёт готовую библиотеку систем частиц с редактором, заодно и задумается над структурой проекта (файловой и классовой). Комментировать очевидные вещи, как это делали другие, принятые на работу соискатели (у одного комменты были почти на каждую строчку), я тоже смысла не видел — проще давать понятные имена функциям и переменным.

                                                            Фактически, меня не приняли в компанию просто потому, что я отнёсся к тестовому заданию, как к тестовому заданию, а не как к заготовке для полноценного проекта. Я для разных задач пишу разный код, и считаю это правильным. Не вижу смысла городить огород, если это не нужно, и если никто специально не просил.
                                                              +1
                                                              Да, очень легко забыть сказать, что именно этой задачкой проверяется — умение структурировать код под большие проекты, умение писать понятные комментарии или умение быстро и эффективно решить одноразовую задачу.
                                                                0
                                                                Структурирование кода — задача архитектора.
                                                                Нужно уметь писать не понятные комментарии, а понятный код.
                                                                Эффективность решения одноразовой задачи только одна — чем быстрее, тем лучше.
                                                            0
                                                            6. Транслировать числа в адреса памяти, записать по адресу единицу. Читать адреса с конца, пока не наберется К чисел. :D Попутно можно использовать принцип ассоциативного кэша, чтобы минимизировать чтения.
                                                              0
                                                              6. Каждый коэффициент представить в виде интервала. Начальное значение — 0 или значение конца предыдущего интервала. Конечное значение — начальное + сам коэффициент. Можно заменить сам коэффициент конечным значением. Рандомом выбирать число от 0 до нового значения последнего коэффициента. Потом найти первый коэффициент больше полученного рандома.
                                                                +3
                                                                Много спорного. «Технические блоги» пестрят статьями про «Hello world» и «как преобразовать строку в int». Половина «правильных» решений про эксель файл будет работать до первой даты, времени, разделителя_в_виде_запятой и прочих локалей. Регэксп я и практически все коллеги исспользуют в лучшем случае раз в три года. Я разбираюсь в нём и тут-же забываю до следующего раза.

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

                                                                  Конечно, если бы я ими постоянно пользовался, я бы их помнил и мог очень быстро составить нужный, но из за редкости применения этого не происходит, тупо забываю. Нет, могу сходу составить регэксп для простого случая — настолько я этот инструмент помню, но если сложный случай — приходится снова разбираться.
                                                                    0
                                                                    Поддержу, меня не меньше удивляет, когда всерьез не воспринимают ответ на собеседовании: «Работал, на память не помню, обычно гуглю».
                                                                  +1
                                                                  Поток мыслей насчет задачи 5:

                                                                  Если N очень большое и значения действительно рандомны, то K верхних с большой вероятностью будут больше (1-K/N) для случая, когда рассматривается диапазон (0; 1), или больше (Xmin+(Xmax-Xmin)(1/K/N) для произвольной базы рандома. Необходимость дальнейшей проверки это не снимает, но позволяет ее минимизировать. Один раз (сложность N) проходим по массиву и отбираем множество значений, которые больше (1-K/N). Далее в зависимости от их количества (Q): Q=K — задача решена, Q>K — отбираем (Q-K) наименьших, Q<K — перебираем (N-Q) на предмет (K-Q) наибольших. Таким образом, сложность будет приближаться к N(1+abs(Q-K))/2 с нормальным распределением (Q-K) вокруг нуля с вероятностью 146%:) В общем, идея в том, чтобы отталкиваться от свойств рандомности как таковой без лишних сортировок.
                                                                    0
                                                                    А я подумал взять небольшой сабсет, выяснить характеристики распределения по нему, и посчитать границу. Потом пойти по всему массиву отбирая всё, что выше этой границы. Сложность будет O(M + N) (где M — размер начальной выборки).

                                                                    Но если сразу предположить, что распределение равномерное (как у Вас), то ещё проще получается, конечно.
                                                                      0
                                                                      Ну да, если допустить, что изначально Xmin и Xmax неизвестны. (Как-то по умолчанию сразу подумал, что рандомные значения будут находиться в диапазоне (0; 1), поэтому этот шаг пропустил.)
                                                                    –1
                                                                    Спасибо за статью.
                                                                    Почерпнул несколько хороших мыслей.
                                                                      0
                                                                      Кстати, а что будет быстрее на миллионе записей ArrayList или LinkedList? Минусы каждой из структур данных описаны в статье. Насколько помню, попадавшиеся на глаза тесты — ArrayList побыстрее будет. Но здесь вопрос наверное требует уточнения: важна ли нам на фоне общей скорости скорость вставки одного элемента или нас интересует только общая скорость. Если общая, то судя по всему ArrayList, если важная скорость вставки каждого элемента, то LinkedList, т.к. на вставка будет происходить всегда за O(1), а у ArrayList вставка некоторых элементов будет предваряться увеличением и копированием ArrayList, соотвественно будет значительно O(n). Я бы так наверное ответил.
                                                                        0
                                                                        в 5-той задаче оптимальное решение такое — найти N/2-ую порядковую статистику за O(N) и за один проход найти все числа меньшие ее.
                                                                        Доказательство что оптимальнее нельзя основано на том что «вход нужно дочитать»
                                                                          0
                                                                          Только не N/2, а K-ую. N/2 — будет худшим случаем(максимальная константа).
                                                                            0
                                                                            для 6-той задачи оптимального решения тоже еще не увидел.
                                                                            Пусть n — длина массивов.
                                                                            Оптимальное решение — предобработка за O(n) и создание случайных чисел за O(log(n))
                                                                            Предобработка состоит в подсчете префикс сумм массива весов. Образованные числа соответствуют концам интервалов соответствующим элементам массива на числовой прямой. Важно заметить что эти концы уже отсортированы.
                                                                            Выбор конкретного числа производится так — создаем случайное число из интервала от 0 до суммы всех чисел(формально это тоже создание минимум log(n) бит) и бинарным поиском по массиву префикс-сумм ищем интервал куда попало образованное число. Число соответствующее интервалу и будет ответом.
                                                                              0
                                                                              Решение оптимально на основании того что из соображений теории информации нам нужно разрешить не менее log(n) энтропии чтобы выбрать конкретное число.
                                                                              • UFO just landed and posted this here
                                                                                  0
                                                                                  В случае равных весов выбор элемента определяет однозначно число в интервале 1..n и наоборот.
                                                                                  Что однозначно определяет log n бит его записи и наоборот.
                                                                                  Вывод — в случае равных весов выбор элемента равноправен фиксации log n бит.

                                                                                  Потому да, я утверждаю что, в случае если единичной операцией будет создание константного числа случайных бит, невозможно выбрать случайный элемент быстрее чем за O(log n). Потому что это означало бы что можно быстрее чем за O(log n) создать O(log n) случайных бит. Что противоречит тому, что мы можем за единичную операцию создавать лишь константное число случайных бит.
                                                                          +1
                                                                          Мне понравилось как в «Докторе Хаусе» набирают персонал — после предварительного отсеивания набирается больше специалистов, чем нужно, они работают испытательный срок и там уже становится ясно кто как работает, индивидуальная совместимость и пр. Конечно, это требует больше времени и средств, но:
                                                                          1) меньше шансов отбросить хорошего кандидата, а на собеседовании многие не в состоянии нормально думать )
                                                                          2) отсутствует психологический барьер, когда вы выбрали кандидата, а он в итоге не очень-то хорош, но увольнять не хочется, потому что придётся опять искать и собеседовать новых кандидатов.
                                                                          3) может оказаться, что новички работают получше некоторых старичков и в итоге могут занять больше мест, чем планировалось.
                                                                          4) ну и даже если вам придётся распрощаться с неплохими кандидатами, если позже появится вакансия, вы можете сэкономить время и обратиться напрямую к ним, если они ещё не нашли работу и не обиделись )
                                                                            +1
                                                                            Да доктор Хаус, по моим наблюдениям, вообще очень неглупый мужик. :)
                                                                              0
                                                                              Мне показалось, что это у них распространённая практика, не подошедших специалистов, вроде, даже определяют в другие, менее крутые клиники, интересно, у нас где-нибудь такое практикуют?
                                                                              0
                                                                              Такие кандидаты могу начать пакостить друг другу, вместо того чтобы работать сообща.
                                                                              Если напакостить другим не удастся, и с ними попрощаются, то они могут оставить backdoor или слить конфеденциальную инфу.
                                                                              Если кандидаты все были нормальные, то трудно выбрать кого оставить, а уволенный может перетащить за собой старичков, с которыми успел сработаться.
                                                                              Новичку требуется достоточно много времени чтобы вкатиться и показать реальную эффективность, и он не будет работать бесплатно все это время, это будет очень дорого.
                                                                              Уволенные могут подать коллективный иск в суд.
                                                                              И наконец, это очень рискованно с точки зрения кандидата, я бы сам на такой вариант не пошел.
                                                                                0
                                                                                Новичку требуется достоточно много времени чтобы вкатиться и показать реальную эффективность

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

                                                                                Про испытательный срок не слышали? Дорого — это нанять плохого работника, а пара лишних специалистов на испытательном сроке много не съедят. Если хотите сэкономить ещё больше — никого не нанимайте, а деньги себе оставьте.
                                                                                Такие кандидаты могу начать пакостить друг другу, вместо того чтобы работать сообща.
                                                                                Если напакостить другим не удастся, и с ними попрощаются, то они могут оставить backdoor или слить конфеденциальную инфу.

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

                                                                                Куда? На биржу труда, или на старую работу, с которой хочет уйти?
                                                                                И наконец, это очень рискованно с точки зрения кандидата, я бы сам на такой вариант не пошел

                                                                                В большинстве случаев всё равно сначала берут на испытательный срок, если только не докажете, что действительно крутой специалист и не поставите вопрос ребром. Так что риски одинаковые.
                                                                              0
                                                                              Судя по фото, мы говорим о специалисте, которого боятся проблемы. Который убивает проблемы быстрее, чем те об этом подумают. Собеседование с ним — понятие вырожденное, это не он хочет устроиться работать, это вы мечтаете его заполучить :)
                                                                                0
                                                                                Вопросы лучше тщательнее формулировать.
                                                                                Например, по задачкам 4 и 5. Почему-то подразумевается, что импорт из Excel — одноразовая операция, а поиск наибольших K чисел из N — часто повторяющаяся. Но явно об этом не говорится.
                                                                                А в жизни обычно наоборот: Excel приходится загружать ежедневно, а искать K наибольших чисел — лишь для какого-то одноразового отчета. И в этом случае оптимальными становятся решения, получившие наименьшую оценку автора )
                                                                                  0
                                                                                  Все, я подготовился к встрече с вами )

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

                                                                                    Автор, создавай интерактивный тест где можно проверить себя :)

                                                                                    Only users with full accounts can post comments. Log in, please.