вторник, 20 июля 2010 г.

Три закона Идеального Сотрудника

  1. Идеальный Сотрудник не может причинить вред его Руководителю или своим бездействием допустить, чтобы его Руководителю был причинён вред.
  2. Идеальный Сотрудник должен повиноваться всем приказам, которые дает Руководитель, кроме тех случаев, когда эти приказы противоречат Первому Закону.
  3. Идеальный Сотрудник должен заботиться о своих интересах в той мере, в которой это не противоречит Первому и Второму Законам.

Совсем не agile-сотрудник получается, но многим Руководителям такой понравится =)

суббота, 19 июня 2010 г.

Человек и паравоз

Самая старая из моей коллекции задачек для программистов и самая любимая.

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

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

Вопрос: как соотносятся скорость паровоза и скорость влюбленного?

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

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

Дальше - спойлер решения. =)

Самым оригинальным (и самым быстрым!) вариантом решения был такой ход рассуждений:
- Предполагаем,что ответом является натуральное число.
- Проверяем ответ "1" - не подходит
- Проверяем ответ "2" - подходит, решение найдено

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

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

пятница, 5 марта 2010 г.

Кратность семи

Еще одна задачка с написанием кода.

Вывести 100 первых чисел, сумма цифр которых кратна 7.

Что тут проверяется:

  1. Умение писать понятный, читабельный код.
  2. Проверяется, как человек подходит к нестандартным задачам. Есть вероятность, что собеседник попытается найти алгоритм нахождения чисел, отличный от брутфорса. Скорее всего, ничего не получится, но если попытка была - то это уже хорошо.
  3. Внимательность к условиям задачи. Некоторые решают задачу "сумма цифр равна 7". 
В отличии от задачи с рассылкой емейлов, эту задачу можно давать на прямо во время собеседования. Важно только заранее указать сроки. Еще лучше - попросить человека самого дать оценку сроков.

После того, как основная задача решена, можно задать такую на закуску:  найти первые 100 чисел, сумма цифр которых кратна 3.
Эту задачу можно давать для устного решения.

среда, 3 марта 2010 г.

Naming conventions

Перед этим вопросом надо обязательно спросить у собеседника, знает ли он, что такое naming convention, считает ли эту практику полезной и почему.

И сам вопрос.

У класса есть два метода.
void setBuzz(Buzz buzz)
void addBeer(Beer beer)

Сделайте предположение, как может выглядеть реализация этих методов в предположении, что автор следует нотации naming conventions.

Цели вопроса следующие:

  1. Умеет ли человек использовать naming conventions
  2. Есть ли у него минимально необходимые знания английского
  3. Выяснить, как человек проясняет непонятную для себя задачу
Вопрос часто ставит собеседника в ступор, отсюда возможность достичь третью цель.

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

суббота, 27 февраля 2010 г.

Рассылка емейлов

Эта задача предполагает написание работающего кода. Лучше всего давать как домашнее задание.

В компании - 1 миллион клиентов.
Ко дню рождения компании нужно разослать всем емейлы с персонализированным текстом. День рождения - через неделю.
Напишите программу на любом языке с использованием любого источника данных (хоть файл, хоть xml).

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

Оценка работы и беседа по горячим следам:

  1. Посмотрите на реализацию многопоточной обработки. Если ее нет, то дальше можно не разговаривать.
  2. Каким образом приложение выбирает, какому потоку отсылать какое письмо. Если есть центральный диспетчер - решение не оптимально, попросить предложить другое решение.
  3. Есть ли возможность восстановить работу программы, если произошел сбой работы. Другими словами, можно ли понять, какие емейлы отправлены, а какие - нет. Если это не реализовано, то спросить, как сделать. Если нету, попросить придумать.
  4. Если нет юнит-тестов, попросить написать один-два самых критичных.
  5. Наверняка в коде будут места, где нужна синхронизация потоков. На примере этих мест порасспрашивать собеседника.

Преподаватели и лекции

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

Вопросы

  1. Как называется такое вид отношения между сущностями
  2. Нарисовать схему БД. (SQL, диаграмма, что угодно)
  3. Написать запрос, выдающий список преподавателей, которые не ведут никаких курсов
  4. Написать запрос, выдающий количество преподавателей, ведущих курсы.
С вопросом №3 справляется процентов 20 собеседников. Только третья часть из них делает это без использования подзапросов.

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

Вопросы, которые задаю в процессе обсуждения
  1. Быстро ли отрабатывает подзапрос?
  2. Что такое JOIN? Какие бывают?
Забавные ответы
Человек решил задачку №3 с подзапросом. На вопрос: "Как повысить быстродействие?" предложил создать в базе кеширующую таблицу, в которой будут храниться результаты подзапроса.

Начало

Сегодня меня попросили поделиться простеньким вопросом, который я задавал разработчикам на интервью.
Этот просьба сподвигла меня на создание онлайн хранилища вопросов, задаваемых программистам.
Основная масса людей, которых я интервьюирую - либо Java, либо PHP разработчики. С них и начнем.