Как вы берете интервью у разработчиков и технических специалистов? Это вечный вопрос, вызывающий множество разгневанных фракций.

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

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

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

Первая группа называет вторую элитарной. Второй называет первого наивным. Кто прав?

Конечно, я прихожу к этому со своим собственным предубеждением. У меня есть степень по компьютерным наукам, но я сделал это некоторое время назад и не очень хорошо помню эти вещи. Задайте мне нотацию Большое О для Быстрой сортировки, и я пойму вопрос и, возможно, сделаю попытку ответить на него, но я не собираюсь притворяться, что уверен на 100%.

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

Начнем с первого.

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

Если ответ… ну, ответ, то я очень твердо поддерживаю толпу «вам не нужно знать это». Люди, как правило, хотят получить конкретный ответ, когда либо им нужен дипломированный специалист по компьютерным наукам, либо они не понимают ответа.

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

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

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

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

Так как насчет требований к работе?

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

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

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

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

Итак, что мы заключаем?

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

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

Наконец, сказав все это, вы не можете уйти от того факта, что программирование связано с алгоритмами. Согласно Википедии:

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

Вы должны понимать и уметь объяснять алгоритмы.

Но вы также должны понимать командную работу, несколько языков программирования, соответствующие фреймворки, дизайн пользовательского интерфейса, управление исходным кодом, вашу IDE, командную строку Unix, безопасность, Linux, веб-серверы, лидерство и управление, фильм, в котором строчка «вспышка, hotshot» происходит от и знаете правильные ответы на «табы или пробелы?» Разработка программного обеспечения сложна и имеет много аспектов.

Сосредоточение внимания на каком-то одном аспекте, исключая другие, является ошибкой. И это верно как для вас как человека, так и для вас как работодателя.

Эта запись первоначально появилась в моем блоге здесь.