Как взять интервью у естествоиспытателя на должность разработчика? [закрыто]

30

Оригинальный вопрос

Я уже дал несколько интервью для своей компании, в основном компьютерных специалистов на должности разработчиков, а также некоторых тестировщиков и менеджеров проектов. Теперь мне нужно заполнить вакансию в нашей исследовательской группе в отделе исследований и разработок (примечание: «исследования» означает, что мы пытаемся решать проблемы в нашей профессиональной области / нише рынка, используя программное обеспечение в исследовательских проектах вместе с университетами, другими компаниями, исследовательскими центрами и организации конечных пользователей. Это не компьютерные исследования, мы не собираемся решать проблему P = NP).

Теперь мы пригласили парня со степенью магистра в области химии (с большим количеством физики в его резюме), у которого никогда не было никакого урока информатики. Я уже говорил с ним около получаса в дни карьеры в местном университете, и нет сомнений, что парень умен. Также его оценки отличные, и он закончил с отличием. Для получения степени бакалавра он должен был научиться программированию в Mathematica и сказал мне правдоподобно, что он очень любит программирование. Также он решил некоторую проблему физической химии, которую я, вероятно, не понимаю, используя его собственное программное обеспечение, реализованное в Mathematica, для своей магистерской диссертации. Он включает в себя графический интерфейс и заметный размер 8000 LoC. Кажется, его очень привлекает то, что мы делаем в нашей исследовательской группе, и, честно говоря, для таких МСП, как мы, довольно сложно найти хороших людей. Я также очень заинтересован в его найме, поскольку он мог бы помочь мне в написании проектных предложений, отчетов, проведении презентаций и так далее. Он, вероятно, подойдет и для нашей команды.

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

Конечно, я спрошу его, что это такое, что увлекает его в программировании. Я также спрошу, как он начал писать свое естественное программное обеспечение и как он его структурировал. Я спрошу о том, как ему удалось получить необходимые навыки и информацию о разработке программного обеспечения. Но могу ли я спросить что-нибудь еще? Возможно, что-то более конкретное? Должен ли я попросить его объяснить его решение Mathematica?

Чтобы было ясно: я не ищу знания в конкретном языке или технологии стека. Мы являемся магазином .NET в разработке продуктов, но я хочу иметь свободный выбор для наших исследовательских проектов. Поэтому я заинтересован в том, чтобы мета-компетенция могла изучать все, что действительно необходимо.

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

Обновление, чтобы отразить ответы, данные до 2011-12-01

Какой ответ я принял и почему

Спасибо всем за ваши ответы, большинство из них весьма полезны, поэтому я за них проголосовал! Хотя ответ Тома Сквайра получил наибольшее количество голосов, я собираюсь принять ответ, данный принцем Гуляшем . Конечно, Том объективно прав, но ответ Принса для меня просто более полезен, и я дважды проверил FAQ, что это критерий для принятия ответа.

О чем я собираюсь спросить его во время интервью

  • Я позволю ему объяснить несколько простых заданий, таких как пример в «Верблюде с двумя горбами», упомянутом Крисом Буртом-Брауном

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

  • Я проверю его понимание рекурсии на примере математики.

  • Я позволю ему объяснить алгоритм его выбора на естественном языке.

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

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

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

Похоже, это будет длинное интервью;)

Обновление после собеседования 2011-12-09

Еще раз спасибо всем за ваши хорошие ответы. Он прошел интервью с летающими цветами. Я никогда не был более доволен заявителем. Его решение Mathematica, похоже, хорошо структурировано. Он был в состоянии объяснить, где он использовал функции высшего порядка, хотя он не знал, что они упоминаются следующим образом. Он ответил на мои рекурсивные вопросы по математике, а также на простые задания и вопросы управления потоком из «Верблюда с двумя горбами»., Когда он объяснял некоторые алгоритмы, я многое узнал о нелинейной подгонке;) Также он честно сказал, что, конечно, он не может гарантировать, что сможет узнать о профессиональной разработке программного обеспечения то, чего он до сих пор не знал. Но он правдоподобно заявляет, что он всегда был хорош в изучении новых концепций - даже сам по себе - и действительно заинтересован в разработке программного обеспечения. Он также попросил технологический стек проекта, к которому он будет обращаться в первую очередь, чтобы посмотреть на него дома. Ему было любопытно и парное программирование, и командная работа. Теперь я надеюсь, что трудовой договор будет заключен.

Сайлас
источник
9
Я нахожу удивительным, что компании готовы нанимать людей, не имеющих знаний о технологиях, которые они используют. Я хотел бы найти вашу компанию, прежде чем я сделал то, что я сделал для моей карьеры!
NoChance
Эммад: Это то, что я пытался объяснить и имел в виду под "мета-компетентностью". В чем польза моей компании, когда я сейчас нанимаю отличного программиста на C #, который не может (или не хочет) изучать Scala / Lift, когда это необходимо? И если честно: на самом деле в Германии довольно сложно найти хороших людей. Особенно, когда вы МСП, не находясь в таком модном мегаполисе, как мы.
Сайлас
2
Попросите его провести небольшое исследование простого потока управления и других базовых методов на конкретном языке. Затем, когда он войдет, попросите его решить проблему, используя их.
Даррен Янг
2
Я работал с несколькими учеными, ставшими разработчиками в моей нынешней должности. ИМХО, они, как правило, очень хороши в аспекте решения проблем при разработке и не так хороши в написании поддерживаемого кода с хорошими ОО-принципами. Если вы хотите, чтобы он делал больше, чем просто писал «быстрые и грязные» инструменты, вам может понадобиться, чтобы с ним работал традиционный разработчик.
Джордан Бентли
2
Я в значительной степени AM этот парень. У меня есть опыт работы в области вычислительной физики / химии, и я разработал много вычислительных моделей / кодов, а также ряд (иногда сложных и успешных) побочных проектов. Основные изменения, которые я должен был внести в среду профессионального развития, были связаны с методологией разработки и работой в команде. Убедитесь, что он понимает, что нужно для совместной работы над программным обеспечением. Убедитесь, что он понимает методы, которые вы, ребята, используете (TTD / непрерывная интеграция и тому подобное) и что означает работа с ними для его вывода.
drxzcl

Ответы:

21

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

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

Суть в следующем: изучите кандидата на предмет навыков, на которые вы его нанимаете, а не на идеалы, которые, как вы надеетесь, он достигнет.

Принц гуляш
источник
2
Работая с программистами, которые были бывшими учеными, они не только не знают детали низкого уровня, но и вещи очень высокого уровня. YMMV, конечно, но проблема заключается в общем недостатке глубины. Не то чтобы все рабочие места нуждались в этом ...
Донал Феллоуз
1
@DonalFellows: Я не сомневаюсь, что разработчикам без специального обучения может не хватать как широты, так и глубины знаний. Это зависит от роли и количества предлагаемых внутренних тренингов.
Принц Гуляш
1
@DonalFellows: учитывая, что ОП заинтересован в определении способности заявителя к обучению, а не его нынешних знаний ...
2
@DonalFellows: как я уже говорил, учитывая, что ОП заинтересован в определении способности заявителя к обучению, а не его нынешних знаний ...
2
@ Марк Баннистер: Хороший ученый может учиться, это не полезный вопрос здесь. Более полезный вопрос будет, если ученый узнает, что ему нужно знать. Это больше проблема личности. Знает ли ученый, что он или она не знает о разработке программного обеспечения?
Дэвид Торнли
37

Как я могу проверить, получит ли он необходимые навыки программирования?

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

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

Том Сквайрс
источник
8
+1 За «Они оба в основном сводятся к использованию вашего мозга для решения сложных головоломок».
joshin4colours
1
Что с тобой? Наймите парня, ради всего святого! Помните, что программисты - просто высокотехнологичные операторы токарного станка. Он полон энтузиазма, умен и знает много химии. Если ты не найдешь его тогда, в следующий раз, когда ты найдешь кого-нибудь на работу через год, ты будешь пинать свою задницу, чего не сделал.
Пит Уилсон
1
Не редкость, что выпускник CS, возможно, программировал, так как им было 13 лет или около того. К тому времени, когда они поступают в колледж, они уже являются программистом среднего уровня по большинству шкал. Это не значит, что они ничему не научились от своих степеней. Программирование - это просто ... Компьютерные науки / Soft Engineering - это не так. Это не значит, что они не смогут внести свой вклад и стать ценным участником ... Но это означает, что у них, вероятно, никогда не будет одинакового фонда CS.
user606723
6

У меня нет вторичных источников, подтверждающих эту статью, поэтому я не могу ручаться за это, но:

У верблюда два горба
http://www.eis.mdx.ac.uk/research/PhDArea/saeed/paper1.pdf

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

Крис Бёрт-Браун
источник
3
Прочитав газету, я думаю, что вспомнил, что я читал больше об этом исследовании некоторое время назад. Просто не могу найти его снова :( Редактировать: это было упомянуто на Coding Horror , спасибо за напоминание
Сайлас
Вы победили меня, я собирался ответить с помощью ссылки Coding Horror @Silas
Izkata
5

Как я могу проверить, получит ли он необходимые навыки программирования?

Это очень просто Дай ему навыки.

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

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

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

И что такое программирование вне этих навыков? - Язык, идиома, шаблоны и рамки. Это легко научить. Это решение проблем, которые вы не можете. Если вы сможете дать инструкции в этих областях, то в итоге вы получите хорошего разработчика.

Тогда возникает вопрос: «Как долго вы можете ждать, пока он наберет скорость?»

ТЛ; др; Вы можете научить печатать. Вы не можете научить умных.

Крис Кадмор
источник
+1, очень хороший ответ. Я бы хотел, чтобы у людей было более открытое представление о профессиях: наличие математической степени не означает, что вы не можете зарабатывать на жизнь программированием, равно как и наоборот. Учиться учиться является важным навыком ИМО.
К.Стефф
2

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

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

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

Jaydee
источник
2

Также он решил некоторую проблему физической химии, которую я, вероятно, не понимаю, используя его собственное программное обеспечение, реализованное в Mathematica, для своей магистерской диссертации. Он включает в себя графический интерфейс и заметный размер 8000 LoC.

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

  • Основные компетенции - понимает ли кандидат базовую программную логику, управление потоком, основные структуры данных.
  • Расширенные компетенции - понимает ли кандидат объектно-ориентированное программирование и дизайн, сложные структуры данных, интерфейсы, абстрактные классы и т. Д.
  • Навыки решения проблем - Учитывая проблему, демонстрирует ли кандидат твердые навыки решения проблем.

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

rjzii
источник
2

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

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

Также остерегайтесь умения решать научные задачи в Mathematica / MatLab / Что бы не означало, что он может написать хороший код. Это просто означает, что он способен применять базовые (иногда чрезвычайно базовые) принципы программирования, обычно операторы if / else. На этом этапе обучение тому, как стать хорошим программистом, обычно требует как личной, так и работодательской приверженности. Предупреждение: я встречал очень умных людей, которые были / являются хорошими инженерами, которые не могли запрограммировать свой выход из бумажного пакета и, честно говоря, не могли понять основы языка.

Личный опыт

Я закончил школу с дипломом инженера и немного опыта программирования под моим поясом. Я работал с очень небольшим количеством C, немного MatLab и немного VB + Access. У меня ушло около 3 месяцев обучения, чтобы стать действительно полезным программистом в магазине VB.NET. Мне потребовалось еще 9 месяцев, чтобы стать полностью опытным. Однако я могу с достаточной долей уверенности сказать, что мои навыки решения проблем превосходят 99% других программистов, с которыми я встречался на работе. Мои работодатели постоянно считают меня одним из своих наиболее ценных активов.

Вывод

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

Майк Челлини
источник
Спасибо за ваш ответ. Это подтверждает большинство моих мыслей. Я просто хочу добавить, что я встречался со многими учеными-программистами, которые много лет работали разработчиками и архитекторами, и IMO тоже не умеют писать хороший код. Даже некоторые из тех, кто пишет технические статьи о программировании. Итог: для того, чтобы стать хорошим программистом, вы всегда должны читать много книг, изучать разные языки и так далее ... независимо от того, какая у вас степень.
Сайлас
1

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

LostMohican
источник
1

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

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

Док Браун
источник
1

Вы можете посмотреть на Практики для программирования в научной среде? (на Stack Overflow), чтобы получить представление о том, как выглядит культура программирования естественных наук. Таким образом, вы сможете сравнить его подготовку с подготовкой его сверстников.

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

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

dmckee
источник
0

Другой отдел, где я работаю, использует вариант нашего стандартного теста. Первая задача - поменять слова в строке на месте. Затем используйте этот код, чтобы изменить порядок слов в строке, все еще на месте. Вместо того чтобы использовать язык программирования, они предлагают кандидатуру разработать алгоритмы на бумаге и запускать их с помощью доски Scrabble.

Питер Вестлейк
источник
0

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

alinoz
источник
0

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

Это одна или две гигантские многоцелевые функции или они инкапсулировали функциональность на соответствующих уровнях абстракции? Магические числа жестко запрограммированы? Код СУХОЙ? Они давали переменным разумные имена, или все это неразборчивое сокращение или однобуквенная переменная? Можете ли вы в основном следовать логике их кода? Они понимают основы ОО?

Спросите, что они используют для контроля версий (git / hg / svn / cvs / bzr и т. Д.). Они когда-либо профилировали код или использовали отладчик, и если да, то какие или какова их общая стратегия отладки?

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

(Для справки я тоже физик, ставший программистом.)

доктор джимбоб
источник
-3

Поскольку он еще учится в университете или только недавно закончил, он привык учиться. Пусть он прочитает и поймет книгу «Шаблоны проектирования» и через месяц (или во время) проведет с ним обстоятельное обсуждение по темам. (Я думаю, что) это может многое рассказать вам о его способностях (не только о сложных (тех, которые тоже), но и о том, как он справляется с пониманием новых концепций, пониманием их использования, пониманием плюсов и минусов и т. Д.) Но это будет стоить вам один месяц времени.

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