В інтерв'ю, чи краще кодувати жорстоке запитання, чи провести інтерв'ю, ретельно розглядаючи питання? [зачинено]


14

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

Наприклад, задачу 91 в Project Euler можна вирішити не дуже складним рішенням обчислення всіх можливих трикутників, написанням тесту isRightTriangle () та спливанням всіх трикутників, які проходять тест, у набір. Але дві пари координат X / Y роблять рішення O (x ^ 4) з високим постійним значенням. Ми з другом просто придумали рішення, яке є набагато більш елегантним та ефективним, але ми вдвох витратили на нього 3 години і намалювали десятки діаграм, перевірили кілька формул, вивчили багато підходів тощо.

Не кожне запитання про співбесіду справедливо. Також те, що легко для однієї людини, може бути важким для іншої. Якщо хтось бореться з питанням, то вас більше вразить потворне рішення, яке працює на грубі сили? Або відмінне розуміння проблеми та дорога до елегантного рішення, але не має закодованого рішення? Чи існує таке правило, як через 20 хвилин, ви просто повинні почати кодування незалежно від того, що?


10
Запитайте їх, чи хочуть вони жорстокого рішення, або нюансу.
Роберт Харві

Якби вони хотіли рішення, що не стосується грубої сили, вони поставили б питання, яке в першу чергу не може вирішити жорстка сила.
мінусСевень

Відповіді:


9

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

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

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

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


Чудова відповідь. Калеб висунув концепцію грубої сили, першої, а потім оптимізації, але ваша єдина відповідь, яка пропонує пояснити причину прийняття жорстокого рішення в цьому випадку: "Це лише 6 мільйонів ітерацій, які не приймуть дуже довго." Це просто золото. Дуже дякую!
GlenPeterson

14

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

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

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

Якби я поставив перед вами важку проблему, і рішення, яке ви запропонували - враховуючи обмеження часу та що у вас - було грубою силою та негарним, я б тоді поставив вам ряд питань, чому це було так, і що змінило б це на щось більш елегантне: більше інформації? більше часу? інше середовище? Будучи самосвідомим і зв’язаним з тим, чому ви зробили, а що не зробили, і вміючи раціонально пояснити це, - велика золота зірка в моїй книзі, але це такі види розробників, які я шукати. Тож, "чудове розуміння проблеми та дорога до елегантного рішення" теж працювало б для мене, але не для всіх.


6
Плюс мільйон за те, що "бути самосвідомим і зв’язаним з тим, чому те, що ти зробив, і що ти не зробив, і вміти раціонально пояснити це, - велика золота зірка в моїй книзі" . Кількість людей, які на запитання "Чому?" Просто засновник і не можуть відповісти, неймовірно. При працевлаштуванні я майже завжди вважаю за краще навчити когось кодувати, хто може думати сам, ніж наймати когось, хто може кодувати, але не вміє думати.
Бен

Спасибі. Це проникливе. Моя схильність на моїй роботі полягає в аналізі, перш ніж торкатися клавіатури. Але під тиском інтерв'ю я хочу відчайдушно показати рішення programmers.stackexchange.com/questions/178075/…. Ваша відповідь дає гарний зустрічний приклад, який потрібно запам'ятати.
GlenPeterson

4

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

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

Як ви сказали, хтось може боротися з певною проблемою з будь-якої причини, але ви повинні навчитися їх вирішувати. Їм можна пощастило і вже чули про вирішення подібної проблеми. Це буває.

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


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

@ChristopherCreutzig - Я припускав, що буде важко запропонувати поліпшення, хоча б не запропонувавши проблеми з поточним рішенням.
JeffO

Правда. Я думаю, я це подряпаю.
Крістофер Крейціг

3

Чи існує таке правило, як через 20 хвилин, ви просто повинні почати кодування незалежно від того, що?

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

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

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

Отже, ми могли, очевидно, поставити isRightTriangle(p1, p2, p3)функцію в середину чотирьох forциклів і повторити всі можливі варіанти для кожної з двох змінних точок. Подивимось ... проблема задає кількість правильних трикутників, включаючи початок на сітці 50х50, тому використання методу грубої сили змушує перевірити 50 можливостей для кожної координати кожної точки. Це 50 ^ 4 перевірки ... Я впевнений, що ми можемо зробити краще, але код очевидний, тому дозвольте мені записати це ...

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

Мені прийшло в голову, коли я писав, що ми можемо скористатися симетрією. Ми можемо відобразити будь-який заданий правильний трикутник навколо лінії 45 °, тому, якщо ми вирішимо перевірити одну з точок лише на одній стороні цієї лінії, ми можемо просто порахувати будь-які праві трикутники, які ми знайдемо двічі ... один раз для трикутника та один раз для її відображення. Це скорочує кількість чеків удвічі. Крім того, дивлячись на це зараз, ми беремо квадратний корінь, щоб знайти відстань між двома точками, але тоді ми просто знову це квадрат у isRightTriangle()...

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


1
Дуже приємна відповідь. Мені особливо подобається: "Я впевнений, що ми можемо зробити краще, але код очевидний, тому дозвольте мені записати це ..."
GlenPeterson

3

Як менеджер, якщо я попрошу вас кодувати як тест, мене найбільше цікавить:

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

Перший предмет може здатися божевільним, але ви здивуєтеся ...

Стиль кодування - під цим я маю на увазі не просто те, де ви поставите брекети, а такі речі, як:

  • Ви вибрали склад чи спадщину для вирішення цієї проблеми? Чому?
  • Для цього значення, чому ви вирішили використовувати enum vs. string проти int (або будь-яку перестановку застосовується)
  • Чи використовували ви властивості, поля чи отримували / встановлювали методи для цього значення? Чому?
  • Як ви обробляли стан у своїх класах?
  • Ви розумієте, як працюють успадкування, інтерфейси та лямбда?
  • Чи розумієте ви параметри мови мови (що означає ref vs за значенням?)
  • Чи знаєте ви, як писати одиничні тести?

Ось що мене насправді не цікавить:

  • Це компілюється (якщо припустити, що я щойно подарував вам блокнот і не компілятор)
  • Щоб ви знали на пам’ять порядок цих 2 параметрів у цій одній функції
  • Щоб ви могли прочитати напам’ять рядок з'єднання SQL Server або Oracle
  • Що ти можеш ідеально кодувати, поки я стою за твоїм плечем, спостерігаючи за кожною помилкою.

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


1
Я теж не любитель тестів кодування. Проблеми в Project Euler - це цікаві тизери для мозку та чудовий спосіб розвивати навички вирішення проблем. Але якщо ви в основному пишете додатки CRUD, краще знати, чи кандидат знає, як написати хороші запити БД або, якщо ви в світі .NET, як я, як правильно використовувати такі речі, як MVC, WCF, WPF та LINQ.
jfrankcarr

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

@jfrankcarr - як визначити, чи може хтось написати sql під якимсь тестом?
JeffO

1
@JeffO - Я, як правило, люблю це робити, беручи розмову про нього, грунтуючись на їх резюме або на загальних сценаріях. Наприклад, "Чи використовували ви змінні таблиць або тимчасові таблиці у своїх запитах?" або "Як ви інтегрували застарілі запити даних у дизайн нового додатка?" Я можу вдатися до тестів, якщо найму молодшого, позашкільного, програміста, але я вважаю за краще підхід для розмови на відкритому повітрі.
jfrankcarr

1

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


1

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

Можливо, інтерв'юер - це працьовитий прагматик, який дійсно дивиться на те, щоб ви швидко працювали, а потім оптимізували як нижчу пріоритетність, якщо у вас залишився час. Не менш можливо, що інтерв'юер справляє найкраще враження від практики найму Google і не цікавиться нічим, крім найсексуальнішим, найелегантнішим алгоритмом, і сприймає це як знак слабкості, що ви коли-небудь ставили слова "груба" та " сила "протягом 5 слів одне від одного. Можливо також, що інтерв'юер гугл "запитання про інтерв'ю" і знайшов цю проблему в Інтернеті за 5 хвилин до того, як ви зайшли, і не має поняття, що він хоче.

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

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


0

Інтерв'юери попросять все-таки покращити своє рішення.

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


1
"Інтерв'юери попросять все-таки покращити своє рішення." Мені здається, що це азартна гра.
Craige

1
@Craige: Не дуже. Але якщо вони цього не піднімуть. Скажіть, це жорстоке рішення, і аналіз можна вдосконалити.
Мартін Йорк
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.