Як проходить співбесіда з Python Developer різних ґрейдів та які питання їм ставлять?
Python — одна з найпопулярніших мов програмування, яка активно використовується у веброзробці, аналізі даних, машинному навчанні та автоматизації. Її простота та гнучкість роблять Python універсальним інструментом для вирішення складних задач.
На технічних інтервʼю з Python Developer зазвичай перевіряють знання основ Python, вміння працювати зі структурами даних, а також практичні навички вирішення завдань. Водночас стрімкий розвиток LLM змінює підходи до співбесід, зокрема до тестових завдань. У цій статті ми наведемо перелік поширених питань для стандартної співбесіди, а також розповімо про підхід компанії Jiji, де технічна частина складається виключно з лайвкодингу. Микола Зорін, СТО Jiji поділився, чому наразі не бачить сенсу давати тестові завдання та математичні задачі, а також ставити питання з теорії. Він розповів, на що звертає увагу, наймаючи Python Developer, а також як зробити лайвкодинг цікавим та результативним для обох сторін.
Як проходять співбесіди в Jiji
Jiji — українська продуктова IT компанія, яка створює продукти електронної комерції в Африці. Процес найму в компанії складається зі скринінгу, технічної співбесіди та баррейзингу. В останньому етапі бере участь Chief Product Officer, який оцінює софт-скіли кандидата, чи впишеться він у команду.
Зазвичай технічна співбесіда починається з того, що кандидата питають про досвід роботи та останній проєкт: чим кандидат займався, що йому було цікавим, яких результатів досяг. Потім інтервʼюер детально розповідає про компанію, наші технології, кількість користувачів, специфіку продукту та перспективи розвитку та відповідає на запитання. Коли етап знайомства завершено, ми переходимо до технічної частини співбесіди. За останні роки вона зазнала серйозних змін.
Перш за все ми відмовилися від перевірки теорії. Зокрема, від стандартних питань про ООП чи принципи SOLID — більшість розробників і так знайомі з цими концепціями, але для нас важливіше, як кандидат адаптується до роботи з наявною кодовою базою проєкту, якому понад 10 років. Вона складається з понад 400 тисяч рядків коду, і новачку доведеться працювати в межах наявних стандартів та стилю.
Раніше ми використовували питання і тестові завдання для скринінгу кандидатів, але з появою LLM це втратило сенс. Наприклад, нещодавно я експериментував із ChatGPT для Advent of Code, і виявилося, що 80% завдань можна вирішити просто копіпастом: вставляєш опис задачі, і отримуєш готовий код, який працює. Тому наразі ми вирішили сфокусуватися виключно на лайвкодингу. Під час співбесіди даємо декілька завдань, спрямованих скоріше на перевірку логічного мислення. Ми свідомо не ускладнюємо їх, щоби не зробити процес виснажливим — коли над завданням потрібно подумати хоча б 20 хвилин, це робить співбесіду сумною і безрезультатною.
Також раніше ми давали задачі з математики та на загальне мислення. Проте вони не показують практичних навичок кандидата, а наш нинішній підхід дозволяє швидко оцінити, чи готова людина до реальної роботи в команді. Один з найбільших викликів для інтервʼюера — зрозуміти, як кандидат проявить себе в реальних умовах.
Можливо, цей підхід погано масштабується і не підійде, якщо потрібно швидко найняти 10 людей одночасно. Проте компанія зростає органічно і стабільно, тож для періодичного найму Middle Python Developer він підходить.
Завдання для лайвкодингу
Наразі ми даємо два завдання. Перше — написати невелику програму на Python. Кандидату даються два відсортовані масиви чисел, він має об’єднати їх в один, зберігши сортування. Це завдання досить просте й може бути виконане навіть дитиною за допомогою кубиків. Водночас в розробці воно вимагає базових навичок: знання циклів, змінних, перевірки граничних умов. І далеко не всі кандидати можуть впоратися з ним.
Друге завдання перевіряє практичні навички роботи з базами даних, оскільки для Python розробника ця компетенція є ключовою. Кандидат отримує схему даних із 2-3 таблиць. Його завдання — написати запит, який поєднає ці таблиці, відфільтрує дані за заданими умовами та виведе результат.
Чому завдання такі прості? Наша мета — оцінити базові навички кандидата і зрозуміти процес його мислення і підходи до вирішення. Ці два завдання дозволяють оцінити, як кандидат формулює алгоритм у коді, чи здатен він працювати з базовими інструментами мови, вирішувати проблеми без готових рішень.
Що важливо для нас
Процес виконання: як кандидат від початку до кінця виконує завдання: чи ставить питання, якщо щось незрозуміло, чи аналізує свою роботу, чи здатен логічно побудувати рішення.
Комунікація: ідеальний кандидат супроводжує свою роботу коментарями. Він пояснює, що робить, чому обрав саме такий підхід, і аналізує результати. Навіть якщо він помиляється, завдяки поясненням можна побачити хід його думок і зрозуміти, чи здатен він виправити свої помилки.
Фінальний результат: кандидат має надати робочий код на Python і SQL-запит, які відповідають вимогам.
Червоні прапорці
Незацікавленість результатом. Якщо кандидату байдуже, як його робота впливає на користувачів, це тривожний сигнал.
Відсутність комунікації. Якщо людина мовчить і не здатна пояснити свої дії — це ускладнює співпрацю.
Невміння завершити завдання. Якщо кандидат не може виконати базове завдання, його шанси на успіх дуже низькі.
Відсутність рефлексії. Коли кандидат не аналізує свою роботу і не усвідомлює, що зробив щось неправильно.
Сліпе виконання. Якщо людина підходить до задачі за принципом «скажуть копати — буду копати». Ми цінуємо, коли розробнику цікаво, як його робота впливає на кінцевих користувачів.
Поради
Будьте чесними щодо своїх навичок і досвіду
Не варто прикрашати чи перебільшувати свої знання. На співбесіді швидко стане зрозуміло, що ви можете, а що ні. Адекватна самооцінка й щирість завжди сприймаються краще, ніж намагання «продати» те, чого немає. Був випадок, який ми згадуємо досі: приблизно 7-8 років тому на співбесіду прийшов кандидат на позицію сеньйора. Він мав досвід викладання та оцінював себе дуже високо, але не міг розв’язати навіть базові завдання. Таких випадків зараз немає, завдяки кращому скринінгу.
Підготуйтеся до співбесіди
Перед зустріччю виділіть час, щоб ознайомитися з компанією та її проєктами. Зайдіть на сайт, дізнайтеся більше про історію, місію та те, чим вона займається. Це покаже вашу зацікавленість і допоможе ставити більш осмислені запитання на співбесіді. Допитливість завжди створює позитивне враження.
Коментуйте свої дії
Пояснюйте хід своїх думок. Якщо кандидат мовчки працює, але успішно завершує завдання, це прийнятно. Проте розгубитися і просто мовчати, — це поганий знак. У такому випадку краще ставити питання, уточнювати вимоги та будувати гіпотези.
Питання для Python Developer
Водночас у багатьох ІТ-компаніях співбесіди проходять традиційно: з теорією, питаннями про алгоритми, бази даних тощо. Редакція HBJ публікує перелік поширених питань, який може стати у пригоді та допомогти підготуватися до інтервʼю. Запитання розташовані від простих до складних у кожній з тем.
Основи Python
Чому Python? Які його переваги та ключові особливості?
Які основні типи даних існують у Python і як вони взаємодіють між собою? Наведіть приклади.
Що ви розумієте під літералами в Python?
Чому Python є інтерпретованою мовою?
Що таке PEP 8?
Що таке простір імен у Python?
Що таке модулі в Python?
Що таке локальні та глобальні змінні в Python?
Що таке ключові слова в Python?
Як перевірити тип змінної?
Як перевірити, чи можна конвертувати рядок у число? Напишіть функцію.
Що таке mutable та immutable об'єкти? Наведіть приклади кожного типу.
Чому рядки (str) у Python є immutable?
Робота зі структурами даних
Поясніть різницю між списком (list) і кортежем (tuple) і дайте приклади реальних сценаріїв їх використання.
Що таке множина (set) у Python? Чим вона відрізняється від списку?
Напишіть функцію для видалення дублікатів зі списку за допомогою множини (set).
Як працює словник (dict) у Python? Які типи даних можна використовувати як ключі?
Поясніть, як Python хешує ключі у словнику. Що станеться, якщо ви використаєте mutable об’єкт як ключ?
Як створити множину або словник за допомогою аналогічного виразу? Як це виглядає?
Як створити список із кортежів (число, його квадрат) для чисел від 1 до 5?
Цикли та умовні оператори
У чому різниця між циклами for і while? Наведіть приклади їх використання.
Як перервати цикл до його завершення? Наведіть приклад із використанням оператора break.
Як пропустити одну ітерацію в циклі? Наведіть приклад із використанням оператора continue.
Як зупинити нескінченний цикл, якщо умова виходу не виконується?
Чи можна використовувати else разом із циклом for або while? Що це означає?
Як перевірити парність чисел у списку? Напишіть списковий вираз.
Напишіть вкладений цикл для створення матриці 3x3.
List comprehensions та генератори
Що таке list comprehensions? У чому їх переваги порівняно зі звичайними циклами?
Як створити список квадратів чисел від 1 до 10 за допомогою list comprehensions?
Як відфільтрувати список чисел, залишивши лише парні числа, використовуючи list comprehensions?
Як використовувати умовні вирази в list comprehensions?
Чи можна використовувати вкладені list comprehensions? Наведіть приклад.
Що таке генератори в Python? Як їх створювати?
Чим генератори відрізняються від list comprehensions? Наведіть приклад їх застосування.
Напишіть генератор для створення нескінченної послідовності чисел.
Реалізуйте функцію-генератор, яка повертає всі парні числа в заданому діапазоні.
Pandas і робота з даними
Що таке Pandas?
Як створити датафрейм зі списків / словника?
Як об'єднати датафрейми у Pandas?
Як створити новий стовпець у Pandas, використовуючи значення з інших стовпців?
Як відсортувати датафрейм за кількома стовпцями, одночасно видаляючи рядки з пропущеними значеннями?
Що таке Reindexing у Pandas?
Класи, функції та ООП
Що таке функції в Python?
Що таке init у Python?
Як реалізувати кілька конструкторів у класі Python?
Як уникнути змін mutable об'єктів, переданих у функцію?
Чим небезпечне використання mutable об'єктів як значення за замовчуванням у функціях?
Як створити клас для створення сінглтона?
Що таке декоратори у Python?
Компіляція та інтерпретація
Поясніть, що таке Bytecode у Python і як він створюється.
Що відбувається під час виконання Python-коду, починаючи від запуску .py файлу?
Як Python оптимізує повторне виконання скриптів (з використанням .pyc файлів)?
Як можна використати compile() в Python? Для чого він може бути корисним?
Архітектура та організація проєктів
Як правильно організувати структуру Python-проєкту? Поясніть роль init.py.
Що таке sys.path і як ним можна маніпулювати для імпорту модулів?
Як використовувати відносний і абсолютний імпорт у Python? Наведіть приклади.
Поясніть різницю між локальними та глобальними модулями в Python. Як Python знаходить модуль для імпорту?
Створіть простий проєкт із кількома модулями й організуйте імпорти так, щоб уникнути дублікатів шляхів у sys.path.
Як організувати тестування в Python-проєкті? Які інструменти та структури використовуєте?