Як взяти співбесіду з природознавцем на посаду розробників? [зачинено]


30

Оригінальне запитання

Я вже робив кілька інтерв'ю для своєї компанії, в основному, комп'ютерних спеціалістів на посадах розробників, а також деяких тестерів та керівників проектів. Тепер мені належить заповнити вакансію в нашій дослідницькій групі у відділі НДДКР (сторона зауваження: «дослідження» означає, що ми намагаємося вирішити проблеми в нашій професійній галузі / ринковій ніші, використовуючи програмне забезпечення в дослідницьких проектах разом з університетами, іншими компаніями, науково-дослідними центрами і організацій кінцевих користувачів. Це не дослідження інформатики; ми не збираємось вирішувати проблему P = NP).

Тепер ми запросили хлопця, який мав магістр з хімії (з великою кількістю фізики в його резюме), який ніколи не мав уроку з інформатики. Я вже говорив з ним близько півгодини в дні кар’єри місцевого університету, і немає сумнівів, хлопець розумний. Також його оцінки чудові, і він закінчив з відзнакою. Для свого ступеня бакалавра йому потрібно було навчити програмування в Mathematica і правдоподібно сказав мені, що йому дуже подобається програмування. Також він вирішив певну проблему фізичної хімії, яку я, мабуть, не розумію, використовуючи власне програмне забезпечення, реалізоване в Mathematica, для своєї магістерської дисертації. Він включає графічний інтерфейс і помітний розмір 8000 ЛоК. Здається, його дуже приваблює те, що ми робимо в нашій дослідницькій групі, і якщо чесно, для МСП, як ми, досить важко отримати хороших людей. Я також дуже зацікавлений у тому, щоб найняти його, оскільки він міг би допомагати мені писати проектні пропозиції, доповіді, робити презентації тощо. Ймовірно, він також підходив би до нашої команди.

Залишилося тільки питання: як я можу перевірити, чи отримає він навички програмування, необхідні для виконання програмного забезпечення в наших проектах, оскільки це буде значною частиною роботи?

Звичайно, я запитаю його, що це таке, що захоплює його програмуванням. Я також запитаю, як він продовжував писати своє природознавче програмне забезпечення та як його структурував. Я запитаю про те, як йому вдалося отримати необхідні навички та інформацію про розробку програмного забезпечення. Але чи можна щось більше запитати? Можливо, щось конкретніше? Чи повинен я попросити його пояснити своє рішення Mathematica?

Щоб було зрозуміло: я не шукаю знань у певній стеці мови чи технологій. Ми - магазин .NET в розробці продуктів, але я хочу мати вільний вибір для наших дослідницьких проектів. Тож мені цікаво, щоб метакомпетентність змогла дізнатись, що насправді потрібно.

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

Оновлення, щоб відобразити відповіді, надані до 2011-12-01

Яку відповідь я прийняв і чому

Дякую всім за ваші відповіді, більшість із них є дуже корисними, тому я дуже схвалював! Хоча відповідь Тома Сквайреса отримала найбільше голосів, я прийму відповідь, яку дав принц Гулаш . Звичайно, Том об'єктивно правильний, але відповідь Принца для мене просто корисніша, і я ще раз перевірив FAQ, що це критерій прийняття відповіді.

Що я збираюся його запитати під час співбесіди

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

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

  • Я перевірю його розуміння рекурсії на математичному прикладі.

  • Я дозволю йому пояснити алгоритм на свій вибір природною мовою.

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

  • Щоб перевірити його мотивацію, я попрошу його захоплення розробкою програмного забезпечення.

  • Я запитаю його, чи знає він, що йому потрібно буде дізнатися про розробку програмного забезпечення підприємства. Особливо я хочу перетворити дискусію в напрямок роботи в командах, парного програмування, TDD, тому що я очікую, що він не буде багато знати про це після роботи над його MSc.

Здається, це буде довге інтерв'ю;)

Оновлення після інтерв'ю 2011-12-09

Ще раз дякую всім за добрі відповіді. Він пройшов співбесіду з літаючими фарбами. Я ніколи не був задоволений заявником. Його рішення Mathematica, здається, структуровано досить добре. Він зміг пояснити, де він використовує функції вищого порядку, хоча він не знав, що їх називають так. Він відповів на мої математичні запитання щодо рекурсії, а також на прості завдання та керував потоками з «Верблюда має два горби». Коли він пояснював деякі алгоритми, я багато чого дізнався про нелінійну підгонку;) Крім того, він чесно сказав, що, звичайно, він не може гарантувати, що зможе дізнатися речі про професійну розробку програмного забезпечення, про яку він досі не знає. Але він, правдоподібно, стверджує, що завжди був добрим у вивченні нових концепцій - навіть самим собою - і дуже зацікавлений у розробці програмного забезпечення. Він також попросив технологічний стек проекту, до якого він буде застосований спочатку, щоб подивитися на нього вдома. Йому цікаво було програмування пар та роботи в команді. Зараз я сподіваюся, що трудовий договір буде укладений.


9
Мені здається чудовим, що компанії готові наймати людей, які не знають технологій, якими вони користуються. Я б хотів, щоб я знайшов вашу компанію ще до того, як я зробив те, що робив у своїй кар’єрі!
NoChance

Еммад: Це я намагався пояснити і мав на увазі "метакомпетентність". Де користь моєї компанії, коли я наймаю відмінного програміста C #, який не в змозі (або бажає) навчитися Scala / Lift при необхідності? І якщо чесно: насправді в Німеччині досить складно знайти хороших людей. Тим більше, коли ти МСП не перебуваєш у модному мегаполісі, як ми.
Silas

2
Попросіть його зробити невелике дослідження щодо простого управління потоком та інших дуже базових прийомів певною мовою. Потім, коли він приходить, попросіть його вирішити проблему, використовуючи ці.
Даррен Янг

2
Я працював з кількома вченими-розробниками в моєму теперішньому становищі. ІМХО вони, як правило, дуже хороші в аспекті розв’язання проблем і не такі вже й великі в написанні ремонтоздатного коду з хорошими принципами ОО Якщо ви хочете, щоб він робив більше, ніж писати «швидкі та брудні» інструменти, можливо, вам знадобиться традиційний розробник, який працює з ним.
Джордан Бентлі

2
Я досить AM цього хлопця. У мене є обчислювальна фізика / хімія, і я розробив безліч обчислювальних моделей / кодів, а також ряд (іноді складних і успішних) побічних проектів. Основні корективи, які я повинен був внести в середовищі професійного розвитку, були пов'язані з методологією розвитку та роботою в команді. Переконайтеся, що він розуміє, що потрібно для спільної роботи над програмним забезпеченням. Переконайтеся, що він розуміє методи, якими ви користуєтесь (TTD / неперервна інтеграція подібних матеріалів) та те, що робота з ними означає для його результатів.
drxzcl

Відповіді:


21

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

Під час мого технічного інтерв'ю на моє сьогоднішнє становище я зіткнувся з досить складною математичною проблемою і попросив розробити програму для її вирішення. Акцент робився на написанні алгоритму, який після його впровадження вирішить проблему. Я могла написати відповідь суто за допомогою слів, щоб описати своє рішення, але мені було дозволено написати якийсь код мовою, яку я обрав, якщо цього хотів. Тест стосувався більше здатності вирішувати проблеми та того, чи зможу я "думати як програміст". Очевидно, якби були кандидати з рівними можливостями і хтось мав більше прямого досвіду кодування, то він би вийшов на перше місце, але це здається мені досить справедливим.

Суть полягає в тому, що: вивчіть кандидата на предмет навичок, які ви його наймаєте, а не на ідеали, яких ви сподіваєтесь досягти.


2
Працюючи з програмістами, які були колишніми вченими, вони незнають не лише деталі низького рівня, але й речі дуже високого рівня. YMMV, звичайно, але це проблема загальної недостатньої глибини. Не те, щоб усі робочі місця потребували цього…
стипендіати

1
@DonalFellows: Я не сумніваюся, що розробникам без специфічної підготовки може не вистачати як ширини, так і глибини знань. Це залежить від ролі та кількості внутрішнього навчання, яке пропонується.
Принц Гулаш

1
@DonalFellows: враховуючи, що ОП зацікавлена ​​у визначенні здатності здобувача до навчання, а не його теперішніх знань ...

2
@DonalFellows: як я вже говорив раніше, враховуючи, що ОП зацікавлена ​​у визначенні здатності здобувача до навчання, а не його теперішніх знань ...

2
@Mark Bannister: Хороший вчений може навчитися, це не корисне питання. Більш корисним було б питання, якщо вчений навчиться того, що йому потрібно знати. Це більше питання особистості. Чи знає вчений, що він / вона не знає про інженерію програмного забезпечення?
Девід Торнлі

37

Як я можу перевірити, чи отримає він необхідні навички програмування

Ви не можете . Неможливо точно перевірити вміння, якого він ще не має. Ви повинні здійснити судовий виклик, виходячи з його розуму та ставлення. Зрештою, це завжди буде ризиком.

З особистого досвіду можу сказати, що перехід від науки до програмування дуже можливий. Вони обидва в основному зводяться до використання мозку для вирішення складних головоломок.


8
+1 За "Вони обидва в основному зводяться до використання вашого мозку для вирішення складних головоломок".
joshin4colours

1
Що з тобою? Найміть хлопця, ради бога! Пам'ятайте, що програмісти - це лише високотехнологічні верстати. Він захоплений, спритний і знає багато хімії. Якщо ви його не наймете, то наступного разу, коли ви будете наймати когось через рік, ви будете бити по дупі, чого не зробили.
Піт Вілсон

1
Не рідкість випускник КС, можливо, займався програмою ще з 13 років. До моменту вступу до коледжу вони вже є проміжним програмістом у більшості масштабів. Це не означає, що вони нічого не вивчили зі своїх ступенів. Програмування легко ... Інформатика / Soft Engineering - ні. Це не те, що вони не зможуть внести свій внесок і стати цінним членом ... Але це означає, що вони, ймовірно, ніколи не будуть мати однаковий фундамент CS.
user606723

6

У мене немає жодних вторинних джерел, які б підтверджували цей документ, тому я не можу поручитися за нього, але:

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

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


3
Після прочитання статті я вважаю, що пам’ятаю, що я читав більше про це дослідження деякий час тому. Просто не вдається знайти його знову :( Редагувати: про це згадували в кодуваннях Horror , дякую за нагадування
Silas

Ви побили мене до цього, я збирався відповісти посиланням Coding Horror @Silas додано
Izkata

5

Як я можу перевірити, чи отримає він необхідні навички програмування?

Це дуже просто. Надайте йому навички.

Тепер це не дуже задовольняє відповідь, але дозвольте мені детальніше.

До програмування я прийшов після того, як 3 роки займався будівництвом. Це досить міцний фон у прикладній фізиці та математиці. Це не теоретична математика, яку отримає ступінь CS, але вона чогось варта. Те, що я черпав з інженерного досвіду, було міцним підґрунтям у вирішенні проблем . Кожен, хто має математичний фон, вже цінує концепцію елегантності, коли говорити про вирішення проблеми. Вони вже здобули освіту в рефакторингу, оскільки витратили час, беручи шість сторінок курячого подряпини і перетворюючи його на елегантний доказ на півсторінки для подання.

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

А що програмування поза цими навичками? - мова, ідіома, візерунки та рамки. Це легко навчати. Вирішити проблеми ви не можете. Якщо ви зможете надати інструкції в цих областях, тоді ви отримаєте хорошого розробника.

Тоді стає питання: "Як довго ви можете чекати, коли він зробить швидкість?"

tl; dr; Можна навчити вводити текст. Ви не можете навчити розумного.


+1, Дуже приємна відповідь. Я хотів би, щоб люди мали більш відкриті погляди на професії: мати ступінь математики не означає, що ти не можеш займатися програмуванням на життя, а не навпаки. Навчитися вчитися - важлива навичка ІМО.
K.Steff

2

Маю ступінь бакалавра матеріалознавства, але всю свою кар’єру працював у розробці програмного забезпечення.

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

Більшості цього можна навчити, але ви, можливо, захочете розробити деякі питання, щоб це перевірити.


2

Також він вирішив певну проблему фізичної хімії, яку я, мабуть, не розумію, використовуючи власне програмне забезпечення, реалізоване в Mathematica, для своєї магістерської дисертації. Він включає графічний інтерфейс і помітний розмір 8000 ЛоК.

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

  • Основні компетенції - чи розуміє кандидат базову програмну логіку, контроль потоку, основні структури даних.
  • Розширені компетенції - чи розуміє кандидат об'єктно-орієнтоване програмування та дизайн, розширені структури даних, інтерфейси, абстрактні класи тощо.
  • Навички розв’язання проблеми - Враховуючи проблему, чи демонструє кандидат тверді навички вирішення проблем.

Мова, якою користується Mathematica, є досить розвиненою, і хтось, хто добре пише програмне забезпечення для Mathematica, повинен бути досить компетентним в інших сферах, тому фокусування на цьому досвіді та використання цього як основи для кодування досвіду може бути хорошим способом підійти до інтерв'ю.


2

Виступаючи програмістом аерокосмічної інженерії, безумовно, можна зробити стрибок від природничих наук до програмування. Однак будьте попереджені, вміння вирішувати проблеми не завжди корелює зі здатністю писати код. Ви, здається, усвідомлюєте це, і це добре.

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

Також остерігайтеся вміння вирішувати наукові завдання в Mathematica / MatLab / Що б це не означало, він може написати хороший код. Це просто означає, що він здатний застосовувати основні (іноді надзвичайно базові) принципи програмування, як правило, якщо / else заяви. Навчання бути хорошим програмістом, як правило, на цьому етапі вимагає як особистого, так і роботодавчого зобов’язання. Попередження: Я зустрів дуже розумних людей, які були / є добрими інженерами, які не могли програмувати вихід з паперового пакета і, чесно кажучи, не могли зрозуміти основні мовні основи.

Особистий досвід

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

Висновок

Це пропозиція про ризик / винагороду, але часто беручи на себе когось, хто має чисті навички вирішення проблем, можна окупитися в довгостроковій перспективі, якщо вони здатні вивчити концепції програмування, і ви обидва готові вкласти час у розширення його програмування знання. Однак я твердо вірю, що він повинен володіти хоча б базовим розумінням основ програмування, перш ніж запропонувати йому роботу. На моєму досвіді, як тільки ти в цьому моменті, ти можеш піти набагато далі.


Дякуємо за Ваш відповідь. Це підтверджує більшість моїх думок. Хочу лише додати, що я багато років зустрічався з комп'ютерними вченими, працюючи розробниками та архітекторами, які ІМО теж не в змозі написати хороший код. Навіть деякі з тих, хто пише технічні статті про програмування. Підсумок: Навчання хорошого прогмера завжди вимагає, щоб ви читали багато книг, вивчали різні мови і так далі ... незалежно від того, яким ступенем ви володієте.
Силас

1

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


1

Як я можу перевірити, чи отримає він навички програмування, необхідні для виконання програмного забезпечення в наших проектах, оскільки це буде важливою частиною роботи

Чесно кажучи, я впевнений, що ви не отримаєте цю інформацію з одно-або двохгодинного інтерв'ю. Дайте йому завдання програмування на C # (щось не надто технічне) та один-два тижні для вирішення. Цього має бути достатньо часу для вивчення основ мови для того, хто вже навчився програмуванню за допомогою Mathematica. Потім зробіть з ним перегляд коду і вирішіть, на якій базі.


1

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

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

У моєму бізнесі є чимало "хороших програмістів", кваліфікація яких здатна утримувати достатньо штату в голові, щоб обробляти якийсь робочий код, але робота якого, як правило, неструктурована і важко підтримувати. Взагалі їх можна вчити, але ... їх треба вчити.


0

Інший відділ, де я працюю, використовує варіацію нашому стандартному тесті. Перше завдання - перевернути слова на рядок на місці. Потім скористайтеся цим кодом, щоб змінити порядок слів у рядку, який все ще знаходиться. Замість того, щоб використовувати мову програмування, вони мають кандидат проектувати алгоритми на папері та запускати їх за допомогою дошки Scrabble.


0

Я б попросив описати (використовуючи природну мову) алгоритм обчислення чогось із фізики. Щось дещо складніше, ніж проста формула, і тоді я запитав би, як він бачить його обчислення, закладене в об'єкти (немає необхідності в знаннях OOP, ви могли б пояснити, яке ваше очікування від об’єкта). Таким чином можна побачити його логічне мислення. Це важливіше будь-яких навичок програмування.


0

По-перше, вони, ймовірно, досить розумні, тому в гіршому випадку можна навчитися бути хорошим програмістом із керівництвом. Однак якщо вам знадобляться, щоб вони ввійшли і були гідними програмістами з початку роботи, запропонуйте їм надіслати якийсь зразок коду, який вони написали.

Це одна чи дві гігантські багатоцільові функції чи вони інкапсулюють функціональність на відповідних рівнях абстракції? Чи магічні числа важко кодуються в усьому світі? Чи є код DRY? Чи дали вони змінній назві змінним чи все є нерозбірливим абревіатурою чи змінною однієї літери? Ви в основному можете слідувати логіці їх коду? Чи розуміють вони основи ОО?

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

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

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


-3

Оскільки він все ще знаходиться в університеті або лише нещодавно закінчив, він звик вчитися. Запропонуйте йому прочитати та зрозуміти книгу "Шаблони дизайну" та після (або протягом) місяця, провести ретельну дискусію з ним щодо цих тем. (Я думаю, що) це може багато розповісти про його здібності (не тільки важкі (теж)), а також про те, як він обробляє осмислення нових понять, розуміння їх використання, бачення плюсів і мінусів тощо). Але це коштуватиме вам один місяць часу.


8
-1 Питання полягало в тому, як взяти інтерв'ю з ним, а не як змусити його перестати бажати своєї посади.
Пітер Тейлор
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.