100+ запитань з Python для Junior, Middle та Senior

Редакція DOU поспілкувалася з розробниками, які проводять технічні співбесіди Python-спеціалістів для різних рівнів, і зібрала приблизний список запитань до кандидатів. Звісно, він не є вичерпним, проте містить типові запитання.

Запитання для Junior

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

Загальне з Computer Science та Web Development:

1.Що таке інженерія і процес розробки загалом?
2.Які знаєте принципи програмування?
3.Чим відрізняються процедурна та об’єкто-орієнтована парадигми програмування?
4.Які основні принципи ООП (наслідування, інкапсуляція, поліморфізм)?
5.Що таке множинне наслідування?
6.Які є шість етапів розробки продукту в Software Development lifecycle і яка різниця між Agile і Kanban?
7.Які є методи HTTP-запитів та яка між ними різниця?
8.Як виглядають HTTP-request/response?
9.Що таке авторизація і як вона працює?
10.Що таке cookies?
11.Що таке вебвразливість?
12.Які знаєте класичні бази даних?
13.Як читати специфікацію в конкретній мові (наприклад, PEP8 у Python)?
14.Як відбувається взаємодія клієнта і сервера?
15.Які є підходи до проєктування API?
16.Як використовувати патерни програмування?
17.Що таке Acceptance Testing і навіщо його використовують?
18.Що таке модульні та інтеграційні тести, API-тести?
19.Як писати unit-тести?
20.Які є best practices у написанні автотестів?
21.Які базові команди системи контролю версій?
22.Як використовувати Git?
23.У чому різниця між хешуванням і шифруванням?

Python:

24.Python — мова, що інтерпретується чи компілюється?
25.Які є змінні та незмінні типи даних?
26.Що таке область видимості змінних?
27.Що таке introspection?
28.Різниця між is і ==?
29.Різниця між __init__() і __new__()?
30.У чому різниця між потоками та процесами?
31.Які є види імпорту?
32.Що таке клас, ітератор, генератор?
33.Що таке метаклас, змінна циклу?
34.У чому різниця між ітераторами та генераторами?
35.У чому різниця між staticmethod та classmethod?
36.Як працюють декоратори, контекстні менеджери?
37.Як працюють dict comprehension, list comprehension і set comprehension?
38.Чи можна використовувати кілька декораторів для однієї функції?
39.Чи можна створити декоратор з класу?
40.Які є основні популярні пакети (requests, pytest, etc)?
41.Що таке lambda-функції?
42.Що означає *args, **kwargs та як вони використовуються?
43.Що таке exceptions, <try-except>?
44.Що таке PEP (Python Enhancement Proposal), які з них знаєте (PEP 8, PEP 484)?
45.Напишіть hello-world сервіс, використовуючи один із фреймворків.
46.Які є типи даних і яка різниця між list і tuple, навіщо вони?
47.Як використовувати вбудовані колекції (list, set, dictionary)?
48.У чому полягає складність доступу до елементів dict?
49.Як створюється об’єкт в Python, для чого __new__, навіщо __init__?
50.Що знаєте з модуля collections, якими ще built-in модулями користувались?
51.Що таке шаблонізатор та як у ньому виконувати базові операції (об’єднувати ділянки шаблона, виводити дату, виводити дані з серверного боку)?
52.Як Python працює з HTTP-сервером?
53.Що відбувається, коли створюється віртуальне середовище?

Бази даних:

54.Які є базові методи роботи з SQL- базою даних у Python?
55.Що таке SQL-транзакція?
56.Як зробити вибірку із SQL-бази з простою агрегацією?
57.Який вигляд має запит, який виконує JOIN між таблицями й до самих себе?
58.Як відправляти запити у SQL-базу даних без ORM?

Алгоритми:

59.Що таке алгоритми (наприклад, Big-O notation)?
60.Які є базові алгоритми сортування?
61.Що таке Bubble Sort і як це працює?
62.Що таке лінійна складність сортування?

Запитання для Middle

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

Зазвичай у мідлів запитують:

63.Чи орієнтуєтесь в *nix, можете писати скрипти/автоматизацію для себе і колег?
64.Що таке багатопотоковість?
65.Що таке архітектура вебсервісів?
66.Як працює сучасний навантажений вебзастосунок (намалювати й обговорити приблизну архітектуру, наприклад, Twitter чи Instagram)?
67.Що потрібно для сайту/сервісу середнього розміру (redis\celery\кеш\логування\метрики)?
68.Як написати, задеплоїти та підтримувати (мікро) сервіс?
69.Як масштабувати API?
70.Як проводити Code review?
71.Що таке абстрактна фабрика, як її реалізувати й навіщо її застосовують?
72.Що таке цикломатична складність?

Python:

73.Async Python: як працює, навіщо, що під капотом?
74.Порівняти асинхронні web-фреймворки.
75.Що таке модель пам’яті Python?
76.Що таке SQLAlchemy (Core та ORM частин) і які є альтернативи?
77.Принципи роботи та механізм Garbage collection, reference counting?
78.Як працює thread locals?
79.Що таке _slots_?
80.Як передаються аргументи функцій у Python (by value or reference)?
81.Що таке type annotation?
82.Для чого використовують нижні підкреслення в іменах класів?
83.Статичні аналізатори: Flake8, Pylint, Radon.

Бази даних:

84.Різниця між SQL і NoSQL?
85.Як оптимізувати SQL-запити?
86.Які є рівні ізоляції транзакцій?
87.Які є види індексів?
88.Точкові питання з вибору БД, рушіїв БД?
89.Front-end: чи є досвід роботи із «сучасним» JS (Babel, Webpack, TS, ES)?
90.DevOps: чи працювали з Docker-контейнерами, пояснити основні терміни K8s (кластер, pod, node, deployment, service), що таке Kibana?
91.Алгоритми: що таке часова складність алгоритму (time complexity)?
92.Поглиблені знання Linux: як зайти на зовнішній сервер, працювати з пакетами, налаштувати середовище та виконувати операції?
93.Специфічно для Data Science: як працювати з пакетами для обробки та візуалізації даних (NumPy, Pandas та інші)?

Запитання для Senior

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

94.Що таке @property?
95.Яким чином можна запустити код на Python паралельно?
96.Як працювати зі stdlib?
97.Які завдання вирішували за допомогою метакласів?
98.Що таке дескриптори?
99.Знання інших мов, крім Python (досвід).
100.Які технологічні особливості реалізації розподілених систем?
101.Які є низькорівневі особливості мов і фреймворків?
102.Способи та методи керування пам’яттю.

Бонус. Практичні завдання

1.Спроєктувати клон Instagram. Це сервіс, який зрозумілий практично будь-якому кандидату, навіть якщо в нього немає акаунту. На високому рівні він дуже простий: картинки, описи, коментарі. Тому щось мінімальне зможе описати й джуніор. Якщо кандидат претендує на вищі позиції, можна нескінченно копати вглиб, торкаючись API, тротлінгу запитів, захисту від фроду, побудови фідів користувача тощо.

2.Дано рекурсивне визначення чисел Фібоначчі, треба написати функцію, яка реалізує це визначення.

3.Є база даних із трьох таблиць — стандартна many-to-many схема. Потрібно написати запит, який об’єднує три таблиці й повертає певний результат.

4.Даємо ТЗ якогось корисного мікросервісу (скорочувалка урлів, пошук дублікатів картинок, пошук тегів у текстах) або функції (rate limiter). Просимо кандидата розповісти, як би він його реалізовував. Це дає та можливість дізнатися, що звик використовувати фахівець, наскільки глибоко він знає і розуміє різні технології.

5.Написати якийсь нескладний декоратор (виводить аргументи функції на екран чи, наприклад, вимірює скільки часу виконувалась функція).

6.Junior’у можна запропонувати реалізувати задачку FizzBuzz test.

7.Для Middle+ я полюбляю давати нескладні задачки на рекурсію. Наприклад, є вкладений список чисел і треба щось на ньому порахувати (скажімо, знайти максимум). Також можна запропонувати написати аналог deepcopy для конкретної структури даних (tree, graph).

8.Для Senior — гра «спроєктувати за 5 хвилин...» Це може бути Google, FB, Twitter, високонавантажений інтернет-магазин, сервіс пошуку, продажу та бронювання квитків, сайт новин тощо. Така задача допомагає зрозуміти, як кандидат розв’язує проблеми, хід його думок, чи вміє відділяти головне від другорядного, зрозуміти, якого він типу («у глибину» чи «в ширину»).

9.Гра «у юзера щось не працює». На прикладі спроєктованої системи співбесідувач вигадує помилку з «дикими симптомами», яку дуже складно зрозуміти, відтворити. Але потрібно швидко розв’язати проблему.

10.Завдання, що демонструє знання та розуміння list та dict comprehensions.

Looking at the below code, write down the final values of A0, A1, ...An.

 A0 = dict(zip(('a','b','c','d','e'),(1,2,3,4,5)))
 A1 = range(10)
 A2 = sorted([i for i in A1 if i in A0])
 A3 = sorted([A0[s] for s in A0])
 A4 = [i for i in A1 if i in A3]
 A5 = {i:i*i for i in A1}
 A6 = [[i,i*i] for i in A1]
 A7 = [i if i%2 else 0 for i in A1 if 2 < i < 8]

 ','.join(str(j**2) for j in range(10)) – what is this object ?

11.Задача, в якій є три функції, в них виконуються базові операції (сортування, фільтрування, піднесення масиву до квадрата). Потрібно упорядкувати ці три функції в порядку зростання часу, що йде на їх виконання.

Place the following functions below in order of their efficiency. They all take in a list of numbers between 0 and 1. The list can be quite long. An example input list would be [random.random() for i in range(100000)]. How would you prove that your answer is correct? -  profiling?

def f1(lIn):
    l1 = sorted(lIn)
    l2 = [i for i in l1 if i<0.5]
    return [i*i for i in l2]

def f2(lIn):
    l1 = [i for i in lIn if i<0.5]
    l2 = sorted(l1)
    return [i*i for i in l2]

def f3(lIn):
    l1 = [i*i for i in lIn]
    l2 = sorted(l1)
    return [i for i in l1 if i<(0.5*0.5)]

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

12.Прості задачі на статистику чи логіку. Наприклад, визначити кут між стрілками годинника, що показує 8:40.

Дякуємо за підготовку матеріалу Михайлу Кашкіну (Founder в Okumy ), Руслану Скірі (Python Developer в CodeIT LLC), Бориславу Ларіну (Python Developer у Prom.ua), Володимиру Обризану (Director в Design and Test Lab), Віктору Свірському (Senior Developer в DataArt), Миколі Зоріну (CTO в Jiji, проєкт Genesis), Володимиру Селюху (Team Lead у Prom.ua), Сергію Галабурді (Software Engineer в N-iX), Олексію Чуприкову (Lead Python Engineer в EPAM), Івану Лучку (TL Data Science Specialist в Boosta), Олегу Новікову , Володимиру Щербініну, Романові Могилатову (Technical Leader в SoftServe) Вадиму Рудю , Наталії Кушнір , Андрію Лейцюсю , Роману Луцю та іншим.


Наступний матеріал готуємо про .NET. Якщо ви співбесідуєте фахівців різних рівнів на позицію .NET-розробника, пишіть на [email protected] .

Опубліковано: 30/09/20 @ 10:00
Розділ Різне

Рекомендуємо:

Навіщо розробнику "відрощувати" м'які скіли, або Ще одна стаття про soft skills
Превращаем пожелания заказчика в Acceptance Criteria: 3 практики
Exploratory Testing: три истории применения тест-дизайна
5 советов начинающим программистам: как выбрать специализацию
DevOps’ный C++ и «кухонные войны», или Как я начал писать игры во время еды