Продовжуємо ділитися тим, як проходять технічні співбесіди у продуктових ІТ-компаніях. Цього разу розповімо, які питання ставлять iOS-розробникам різних ґрейдів. Артур Майорський, iOS Team Lead в Universe, поділився своїм підходом до проведення інтервʼю, пояснив, чому не питає у кандидатів про ООП та іншу фундаментальну теорію, як формуються вимоги до вакансії, та чому найефективніше будувати розмову навколо технічних інтересів.
> Як проходить співбесіда iOS Developer
> Питання для Junior iOS Developer
> Питання для Middle iOS Developer
Як проходить співбесіда iOS Developer
До всіх iOS спеціалістів є набір стандартних базових вимог, як от знання Swift та фреймворків (UIKit або SwiftUI). Водночас у кожної компанії є чимало нішевих запитів: наприклад, досвід роботи зі сканерами чи ML, відеостримінгами чи картами тощо. На ці теми зазвичай і питають кандидатів.
В Universe, як у деяких інших продуктових компаній, немає стандартних шаблонів із питаннями. Коли зʼявляється необхідність найняти людину, ми формуємо для неї набір завдань та прогнозуємо роботу на 6-12 місяців. На основі цих завдань і формуються вимоги до позиції та теми для інтервʼю. Таким чином дві вакансії Junior iOS Developer можуть бути абсолютно різними. Наприклад, якось шукали одну людину під нову апку, а іншу — для створення A/B тестів на онбордингу застосунку, і один кандидат зовсім не підходив на позицію іншого.
Перше, що я дізнаюся на співбесіді — чим технічно цікавиться кандидат. Я намагаюся це дізнатися з перших питань: що він вивчав, що читав, що дивився, які були цікаві завдання на попередній роботі. Визначивши їх, ставлю технічні питання з цієї теми, щоби дізнатися, наскільки глибоко людина може самостійно розібратися в цікавих для неї речах. Наступний етап — перевірити знання у менш захоплюючих, але важливих аспектах програмування. Це база, з якою постійно стикаєшся, і важливо не просто закривати завдання, а розуміти, що і чому ви робите.
Як правило, я беру одну тему, ставлю базове питання і прошу людину своїми словами розказати, що вона знає про це. Наприклад, робота з памʼяттю в iOS або зі стандартним компонентом UITableView. Далі уточнюю: що це таке, як воно працює, де зберігається тощо. З кожним новим питанням я заглиблююсь, щоби зрозуміти, на якому рівні знань людина. Коли я визначаю глибину, я перестрибую на іншу тему. У такий спосіб зачіпаю близько пʼяти базових тем, по кожній з яких можна говорити хвилин по 10. Усі питання я завжди беру з контексту розмови. За таким принципом я проводжу інтервʼю з Junior та Middle розробниками.
Спиратися в співбесіді на інтереси кандидата, на мій погляд, ефективно. Для компанії важливо найняти людину, яка зможе розвивати потенціал і зростати разом із проєктом. Якщо ж робочі завдання не відповідатимуть його інтересам, це буде неможливим.
Питання для Junior iOS Developer
Більшість «хардових» питань ми перевіряємо тестовим завданням. Наприклад, Junior iOS Developer має відтворити онбординг одного з наших застосунків (набір екранів, які зʼявляються при першому запуску та пояснюють, як ним користуватися) з використанням певного стека. Загалом за тестовим завданням одразу можна оцінити технічну базу підготовки. На співбесідах ми не питаємо принципи ООП чи фундаментальну теорію. Якщо людина не знає супербазових речей, це помітно одразу. Якщо ж знає — це насправді ні про що не свідчить. Намагаюся ефективно витрачати час на співбесіду, ставлячи питання, які справді скажуть щось про людину.
Деякі з питань — кейсові. Наприклад, «як створити кнопку, яка буде пульсувати? Кандидат пропонує ідеї, і ми заглиблюємося в деталі. Це може звучати, як просте питання, яке знає кожен розробник, але на останніх пʼяти співбесідах ніхто не запропонував оптимального рішення. Водночас у нас немає вимоги, щоби кандидат відповів правильно на всі питання. Якщо він вміє вчитися, зможе швидко заповнити прогалини.
Часом я можу підняти тему, яка не часто застосовується на практиці. Наприклад, є популярне питання на співбесідах: «Що таке copy-on-write». Часто розробники знають про цей механізм тільки те, що поверхнево прочитали в статті, готуючись до інтервʼю. Одразу видно, якщо вони ніколи не стикалися з цим на практиці. Дізнатися, чи розуміє людина, як цей механізм реалізований, — просто. Треба знати назву однієї функції та вміти описати, як вона працює. Водночас якщо кандидат не знає — це не страшно. Це питання не належить до категорії «цікаве» чи «важливе», проте показує глибину знань та кругозору людини, вміння вчитися, закопуватися в різні теми. Намагаюся знаходити подібні питання «із зірочкою», виходячи з інтересів кандидатів.
Нижче перелік запитань, з яких можна почати заглиблюватися в різні теми.
Swift та UIKit
1. Чим відрізняється структура від класу?
2. Що таке Optional у Swift і як вони використовуються? Які проблеми можуть бути повʼязані з ними?
3. Які основні переваги використання guard у порівнянні з if let?
4. Що таке протоколи у Swift і як вони використовуються?
5. Що таке Auto Layout? Чому він важливий для розробки iOS застосунків?
6. Що таке value-type та reference-type у Swift? Коли їх використовувати?
7. Чому Apple надає перевагу використанню value type за замовчуванням? Що не так із використанням reference type?
8. Для чого використовується ключове слово mutating?
9. В чому різниця між Array і Set?
10. Що таке замикання (Closure)? Поясніть, що таке trailing closures?
11. Чи використовували клас URLSession? Як це працює?
12. Що таке дженерики? Як ви використовуєте їх у своєму коді?
13. Як ви використовуєте Enum та Pattern Matching для створення читабельного коду?
14. Як ви реалізуєте error handling у Swift?
15. На що варто звернути увагу при роботі з UITableView та UICollectionView?
16. Як реалізувати навігацію між екранами у застосунку?
17. Поясніть життєвий цикл iOS застосунку?
18. Як передати дані від одного контролера до іншого?
19. Розкажіть про цикли життя UIViewController в UIKit?
20. Яка різниця між frame та bounds у UIView?
21. Як реалізувати тестування UI в iOS?
Архітектура
22. Які основні компоненти архітектури MVVM використовуються в iOS розробці?
23. Що таке Dependency Injection, і як воно впливає на тестованість коду?
24. Як ви реалізуєте асинхронну обробку даних в iOS, і чому це важливо?
25. Поясніть різницю між MVC і MVVM? Які плюси та мінуси у кожного з шаблонів?
26. Що таке Singleton і в яких випадках варто використовувати його в iOS розробці?
Робота з пам'яттю в iOS
27. Як уникати memory leakage у вашому коді?
28. Які інструменти використовуєте для виявлення проблем з пам'яттю та їхнього вирішення?
29. Як можна керувати циклами утримання (retain cycles)? Які проблеми можуть виникати, пов'язані з ними?
30. Як використовувати ARC? Як це працює?
31. Як оптимізувати роботу зі структурами та об'єктами для ефективного використання пам'яті?
Робота з мережею
32. Як створити мережеві запити в iOS застосунках і обробити відповіді?
33. Як використовувати URLSession для виконання HTTP-запитів?
34. У чому різниця між GET та POST запитами? Коли використовувати один чи інший?
35. Як обробляти та парсити JSON-відповіді у застосунку?
36. Як обробляти аутентифікацію та авторизацію в застосунку?
37. Як кешування допомагає уникнути проблем зі збільшенням кількості запитів на сервер?
38. Що таке RESTful API? Чому вони використовуються в розробці застосунків?
Бази даних
39. Як використовувати Core Data для виконання запитів до бази даних?
40. Як керувати версіями бази даних при змінах у застосунку?
41. Як провести міграцію даних при оновленні застосунку?
42. Як налаштувати взаємодію з віддаленими базами даних?
43. Як проводити асинхронні операції з базою даних для збереження продуктивності?
44. Як використовувати індексацію для прискорення запитів до бази даних?
Робота з анімацією та інтерфейсом користувача
45. Поясніть, як застосунок розуміє, на який елемент інтерфейсу натиснув користувач?
46. Опишіть досвід використання Core Animation для створення анімації?
47. Розкажіть, як створити переходи між екранами?
48. Які проблеми з продуктивністю можуть виникнути при використанні складної анімації? Як їх вирішити?
49. Опишіть реалізацію взаємодії користувача з жестами (наприклад, swipe, pinch, rotate)?
50. Як реалізувати анімацію взаємодії з таблицями та колекціями?
Питання для Middle iOS Developer
Принцип проведення співбесіди для Middle iOS Developer не відрізняється від Junior: дізнатися, що найбільше цікавить кандидата в розробці, та поставити низку технічних питань, щоби зрозуміти глибину знань. Різниця лиш у тому, що питання можуть бути складніші, а відповіді — розгорнутіші. Думаю, такий підхід допомагає зрозуміти, чи справді знання кандидата відповідають ґрейду.
Є низка питань, на які цікаво подискутувати, наприклад, використання Singleton, Force Unwrap, Unowned. На них немає правильної відповіді, та можна зрозуміти будь-яку позицію. Наприклад, іноді людина не хоче ризикувати та використовувати Force Unwrap, а іноді готова взяти відповідальність, іноді це обґрунтовано, а іноді — ні. Загалом, майже в кожній темі можна довести, що це працює не так, як написано в документації.
Кейси
51. Застосунок відображає галерею фотографій, і користувачі скаржаться на повільне завантаження. Як вирішити цю проблему?
52. У застосунку користувачі можуть редагувати дані в офлайн-режимі, а після підключення до мережі вони мають синхронізуватися з сервером. Як реалізувати цей механізм, враховуючи можливі конфлікти та помилки з'єднання?
53. Застосунок виконує багато асинхронних запитів до різних API. Як забезпечити керування потоками та ефективну обробку помилок?
54. Застосунок має працювати однаково добре на iPhone та iPad з різними розмірами екрана. Як оптимізувати дизайн для різних пристроїв?
55. Під час роботи виникла проблема з конфліктом версій залежностей. Як би ви шукали, в чому проблема?
56. Користувачі скаржаться, що застосунок витрачає багато заряду батареї. Як зменшити вплив на життєвий цикл батареї?
57. Застосунок обробляє конфіденційні дані користувачів. Як гарантувати безпеку?
58. Застосунок отримує дані з декількох різних API. Як би ви керували цим та вирішували проблеми несумісності?
59. Команда вирішила додати новий функціонал. Як спланувати розробку та інтеграцію нової фічі, щоби зберегти сумісність з існуючим кодом?
60. Застосунок має підтримувати різні версії iOS. Що треба зробити, щоби інтерфейс виглядав і працював належним чином на різних версіях?
61. Потрібно додати кастомну анімацію при переході між певними екранами. Як це реалізувати?
62. Ви хочете додати анімації до взаємодії з об'єктами у списку. Як це реалізувати?
Теми для дискусій
63. Чи використовуєте ви Force Unwrap, Optional Chaining чи Guard Statements? Які переваги та недоліки є у кожному підході?
64. Як ви ставитеся до використання Singleton? Які є переваги та ризики?
65. Як ви оцінюєте використання ключового слова mutating у Swift для методів структур? Як це впливає на безпеку коду?
66. Що би ви обрали для реалізації анімації — Core Animation чи UIKit? Чому?
67. Як визначити, коли використовувати замикання, а коли — делегати?
68. Що обрати для паралельного виконання завдань — GCD чи Operation?
69. Як ви ставитеся до використання ключового слова final для обмеження поведінки та перевизначення класів та методів? Які є ризики?
70. Як ви ставитеся до використання лінтерів? Як це впливає на єдність стилю коду та загальну якість?
71. Як ви ставитеся до використання замикань для обробки асинхронних операцій у Swift?
Comments