Як перемогти на співбесіді

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

Ти більше, ніж просто машина для кодинга
Частина 1. Програмування на дошці
Хто взагалі в цьому світі програмує на дошці? Справді, серйозно. Проте, я попрошу вас зробити це. Не хвилюйтеся, я не зійшов з розуму. Я знаю про Google і що дошка погано справляється з автодоповнення. Мене це не турбує. Я перевіряю не те, наскільки красивий код ви пишете на дошці, а дещо інше.
Коли ви отримаєте роботу, вам ніколи не доведеться програмувати на дошці. Але я гарантую, що настане момент, коли ми всі будемо ламати голови над проблемою перед самим дедлайном, коли ми виснажені до краю, на нас все зляться, а на кону стоїть наша робота і репутація. Коли настане такий момент, ми підемо в переговорну, стовпів біля дошки і будемо з'ясовувати, що робити. Швидко.
«Я перевіряю не те, наскільки красивий код ви пишете на дошці»
Хоча мені не потрібен програміст, який пише красивий код на дошці, але мені потрібен той, хто здатний швидко думати на ходу, під тиском, в одній кімнаті з іншими. Проблема в тому, що якщо ви не розумієте, що саме я перевіряю, то все зробите неправильно. Ви збираєтеся довести, що ви справжній ніндзя в програмуванні на дошці. Це нерозумно. Нікому не потрібен ніндзя в програмуванні на дошці. Ось як мене перемогти:
1. вербалізуется свої припущення і постарайтеся їх підтвердити
3. Не бійтеся попросити допомоги
Якщо ви застрягли або чогось не знаєте, запитаєте мене. Ви не уявляєте, наскільки фантастично дорого компанії обходиться розробник, який відмовляється просити про допомогу, коли десь застряг. У мене немає часу на програміста, який не дає результат, тому що вдає, що у нього все під контролем, а сам безсило борсається в самоті.
4. Чесно покажіть свій творчий хист і досвід
Частина 2. Програмування на комп'ютері

На відміну від дошки, якщо я запрошую вас за комп'ютер і прошу написати код, то я дійсно перевіряю, як добре ви програмуєте. Точніше, я перевіряю ваше вміння дотримуватися правил.
Найкраще зрозуміти це, якщо подивитися на реальний приклад. Один з моїх улюблених питань такий:
Паліндром - це число, буквосполучення, слово або текст, однаково Новомосковскющееся в обох напрямках. Дозволяються коригування до прописних буквах, пунктуації та прогалин. Деякі приклади англійською: "A man, a plan, a canal, Panama!", "Amor, Roma", "race car", "stack cats", "step on no pets", "taco cat", "put it up "," Was it a car or a cat I saw? "і" No 'x' in Nixon ".
Напишіть найефективнішу функцію, яку зможете знайти, щоб визначити, чи є даний рядок паліндромом.
Ваша функція повинна приймати рядок як параметр і повертати логічне значення (true. Якщо рядок є паліндромом, і false. Якщо не є).
Припускайте, що цей код буде поставлений в реальну систему на робочому сервері, і пишіть відповідно з цим.
Коли я пропоную таке завдання на співбесіді, насамперед я дивлюся, задасте ви мені додаткові питання чи ні. Як я вже говорив раніше, кращі програмісти розуміють, що допущення - це саме те, що вбиває вас в цьому бізнесі. Моя порада кожному, хто отримав інструкції для написання коду, - зробити паузу і подумати, які припущення слід зробити для того, щоб виконати завдання (вони завжди є) і знайти спосіб підтвердити або прояснити ці припущення. Я розумію, що під час виконання завдання люди йдуть в «тестовий режим» і думають, що їм заборонено говорити. Я ж вважаю, що ви почнете з питання інтерв'юера: «Мені дозволено задати вам один або два питання, щоб прояснити деякі припущення?» (Я завжди відповідаю "так"), і тоді ви отримаєте ВЕЛИЧЕЗНЕ перевага.
Хороші питання для цієї конкретної задачі:
Далі я дивлюся, наскільки добре ви прямуєте інструкцій. Наприклад, я визначив рядок як параметр і логічне значення як результат. Це те, що видає програма?
Потім я хочу подивитися, як ви інтерпретіруете фразу «Припускайте, що цей код буде поставлений в реальну систему на робочому сервері, і пишіть відповідно з цим». Якщо ви раніше розробляли робочий софт, то розумієте, що ця фраза означає кілька речей:
Далі, мені цікаво подивитися, як ви розумієте слово «ефективний» в поєднанні з «продакшн системою». Якщо у вас є досвід, то ви розумієте, що поняття «ефективний» для програми в продакшн означає три речі:
- Швидко працює.
- Не займає пам'ять, коли вона їй не потрібна.
- Стабільна і легко підтримується.
Ви повинні розуміти, що пункт № 3 іноді означає деякий збиток для пунктів № 1 і № 2.
Щодо тестів я хочу побачити, що ви передбачте багато тестів, але всі вони будуть перевіряти дійсно різні сценарії. Перевірка "mom", "dad" і "racecar" надлишкова, це все один і той же тест. Я також очікую побачити, що ви дозволите тести на міцність (краш-тести); тести якихось рядків, які не є паліндромами. Розглядайте прикордонні випадки, перевіряйте нуль або число. Перевіряйте порожній рядок або набір спеціальних символів.
Я задаю це завдання розробникам всіх рівнів, але чим більш досвідчений фахівці, тим суворіші критерії.
Якщо джуніор видає працездатне і досить просте рішення, і все інше співбесіда проходить нормально, цього достатньо для початку роботи і підвищення своїх навичок.
Очевидно, є інші способи написати відповідну програму, але це дає уявлення, про що я говорю.
Якщо я даю завдання додому, то очікування ще вище.
Частина 3. Алгоритми
Деякі інтерв'юери будуть просити написати реалізацію конкретного алгоритму. Особисто я вважаю це гігантської втратою часу. Набагато важливіше для мене, щоб ви розуміли, який алгоритм застосувати для якої задачі. Реалізацію завжди можна знайти в Google.
Проте, оскільки інтерв'юери попросять це, краще освіжити знання в пам'яті перед співбесідою. На Khan Academy є відмінний безкоштовний курс.
Частина 4. Не здаватися без боротьби
Якщо ви не здатні вирішити запропоновану задачу, завжди є деякі речі, які можна зробити, щоб зберегти шанси отримати посаду.
1. Не здавайтеся занадто легко
Переконайтеся, що я помітив ваші зусилля. Якщо ви з тих, хто здається, коли стає важко, я не витрачатимуть на вас час.
2. Псевдокод
3. Назвіть відомі невідомі
Частина 5. Практика, практика, практика
Мабуть, найважливіше для успішної співбесіди з програмування - хороша підготовка. Найкраще практикуватися зі стандартними питаннями знову і знову, поки ви не вивчите їх напам'ять. Якщо багато тренуватися, то ви зможете відповідати на питання, які не зустрічали раніше. У вас з'явиться впевненість і ви зможете зв'язати будь-яке питання з чимось іншим, що зустрічали раніше.