Нудна теорія чи корисний інструмент: навіщо розробнику алгоритми та структури даних
Розповідають джуни, синьйори та хайринг-менеджери
«Алгоритми слугують базовими елементами будь-якої машинної програми», — казав автор мови програмування Pascal Ніклаус Вірт. Але серед розробників і досі побутує думка, що розбиратися в алгоритмах та структурах даних потрібно лише, щоб вдало пройти технічну співбесіду. В результаті спеціалісти можуть навіть успішно вирішувати завдання, але при цьому не розуміти, як працює їхній код, і не мати змоги покращити його якість.
У цьому матеріалі розбираємо, як знання алгоритмів та структур даних впливає на реальну роботу і що конкретно треба знати джуніору, мідлу та синьйору, аби отримати офер.
Яких знань з алгоритмів очікують компанії та як їх продемонструвати
Знання алгоритмів та вміння працювати зі структурами даних очікує від розробників більшість компаній. Якщо це потрібно для проєкту, то очікування щодо знань приблизно однакові як для джуніора, так і для синьйор-позиції.
Це база, яку вивчають в університеті. Ми не очікуємо знань екзотичних структур даних, але обов’язково мають бути знання того, як працюють базові речі на прикладі стандартних колекцій. Щоб це перевірити, ми даємо невеличку практику з оцінкою швидкодії різних підходів до розв’язання простої алгоритмічної задачі
каже Андрій Білоус, Senior Dev Lead в Luxoft.
У компанії Roosh свої очікування за кількістю правильних відповідей від кандидатів зобразили таким чином:
- джуніор: >50 %;
- мідл: >70 %;
- синьйор: >90 %
На етапі технічної співбесіди ці знання перевіряють обов’язково. Інженери використовують їх для розуміння складності ML-алгоритмів, процесингу даних тощо.
У Luxoft зазначають, що на фронтенд-позицію в простих проєктах знання алгоритмів менш важливі й рідше будуть блокером. Для бекенд-позицій буває по-різному: багато залежить і від бізнес-домену. Наприклад, для проєктів у сфері енергетики завжди перевіряють ці знання насамперед, бо важлива швидкодія під час обробки великих обсягів даних.
Невтішна новина для тих, хто не цікавиться алгоритмами та структурами даних: компанії часто відмовляють таким кандидатам.
У Roosh вважають подібні знання мастхевом: розробник має продемонструвати профіль із Leetcode, профіль на Github із вирішеними задачами із Leetcode.
Якщо ж ви тільки починаєте свій шлях у розробці, то проходження курсів та зазначення цього у резюме зможе зіграти вам у плюс:
«Плюсом це буде тільки для інтерна. Якщо ж кандидат із досвідом 10 років напише, що рік тому проходив курс із базових структур даних, то це скоріше мінус, бо тоді незрозуміло, як він працював 9 років до цього», — кажуть у Luxoft.
Про що запитують на співбесідах
Роман Аболмасов, Fullstack Developer і TechLead у SoftServe, каже, що на співбесідах зазвичай можуть запитати про алгоритми та структури даних, починаючи від сортування бульбашкою та дерев — до прохання оцінити ефективність алгоритмів за часовими та просторовими параметрами:
Також у вас можуть запитати, де потрібно реалізувати певний алгоритм або структуру даних, або як можна оптимізувати наявний алгоритм для покращення його продуктивності
Роман Аболмасов, Fullstack Developer і TechLead у SoftServe
Назар Конюшенко, Middle Unity Developer, каже, що про алгоритми на співбесідах його майже не питали:
Максимум, що можу згадати, — просили перелічити алгоритми сортування, які я знаю (просто назви). З мого досвіду в геймдеві, задачі, де була б потреба в знаннях якихось специфічних алгоритмів, мені не траплялися, а типові — давно вже реалізовані в стандартних бібліотеках. Про структури даних питають майже завжди: які знаєте, як працюють «під капотом», у чому відмінність тощо
Назар Конюшенко, Middle Unity Developer
Анна Костирко, Junior Node.js Developer, каже, що на співбесіді їй стали у пригоді знання про складність пошуку за масивом та деревом.
Як алгоритми та структури даних допомагають у роботі
Роман Аболмасов згадує, що на одному з проєктів, пов’язаним з підрахунку площин деталей для обробки, користувався алгоритмом обгортки Грехема та методом Монте-Карло. Перший допоміг з обчисленнями опуклої оболонки множини точок у просторі, а другий згодився для моделювання складних систем, які важко досліджувати аналітично. Його суть полягає в тому, щоб генерувати випадкові вхідні дані для системи й обчислювати вихідні дані. Потім результати обчислень агрегуються, і на основі статистики визначають імовірність, ризики або інші параметри системи.
Найскладнішим для розуміння та роботи синьйор-розробник вважає рекурсивні алгоритми. За їх використання важливо визначити, наскільки глибоко може дійти рекурсія та як ефективно керувати пам'яттю, щоб уникнути негативних наслідків.
Назар Конюшенко, мідл-спеціаліст, реалізовував алгоритм лише раз — для власного петпроєкту:
«Структури даних використовують звідусіль: і звичайні списки, і хеш-таблиці, і словники, і стек».
Він каже, що будь-який більш-менш типовий алгоритм вже багато разів описали в мережі та реалізували. Тому тут складність тільки в тому, як його адаптувати під конкретно ваше завдання. Зі стандартними структурами даних треба запам'ятати назви (їх досить багато) і принцип роботи:
«Буває, пам'ятаєш, який принцип роботи структури тобі потрібен, але не можеш згадати, як вона називається. Тоді просто гуглиш».
Джуніор-розробниця Анна Костирко додає, що впевнено підступається до Leetcode і за змоги розв’язує там задачі. На стажуванні були таски з Map та Set, але це не головне:
Знання про алгоритми, структуру даних та вміння розв'язувати такі задачі навчають дивитися на кодування трішки з іншого боку. Це впливає на розробку на роботі, навіть без прямого використання. Набувається звичка шукати, як можна оптимізувати код, дивитися на декілька кроків вперед та глибше вивчити мову програмування
Анна Костирко, джуніор-розробниця