Співбесіда з Go. 200+ запитань для Junior, Middle, Senior

Цього разу героєм рубрики, що присвячена технічним співбесідам, є Golang (або просто Go). Як завжди, ми з’ясували у реальних СТО та інших спеціалістів, що проводять технічні інтерв’ю, які питання вони ставлять кандидатам. Результатом ділимось з читачами DOU.

Junior

Software engineering

1.Які бувають області пам’яті програми? У чому їхні особливості та відмінності?
2.Розкажіть, що ви знаєте про HTTP-протокол, які складові частини запиту? Які статус-коди знаєте, які групи можна виділити?
3.Назвіть та опишіть будь-який патерн програмування (на ваш вибір). Коли його доцільно використовувати та чому?
4.Що таке процеси та потоки в операційній системі? Опишіть їхній взаємозв’язок у контексті виконання програми.
5.Що таке шаблон проєктування (design pattern)?
6.Які знаєте алгоритми сортування?
7.Що таке Big-O notation?
8.Які відмінності між unit-тестом та інтеграційним тестом?
9.Що таке mock і для чого його використовують?
10.Що таке SDLC? Які етапи й навіщо вони потрібні?
11.Що таке SOLID?
12.Що таке MVC?
13.Що таке DBMS? Яка різниця між СУБД та базою даних?
14.Які бувають типи баз даних?
15.Що таке Docker?

Бази даних

16.Опишіть ACID-властивості реляційних баз даних.
17.Є таблиця в реляційній БД зі 100 тисячами рядків. SELECT-запит з такої таблиці триває час t. Як зміниться час запиту, якщо кількість рядків буде один мільйон? Які є варіанти, залежно від запиту/таблиці?
18.Для чого використовують індекси в базах даних і завдяки чому (яким структурам даних) вони працюють?
19.З якими NoSQL-базами даних працювали? Які їхні переваги над реляційними базами?

Go

20.На вашу думку, у чому перевага Go перед іншими мовами?
21.Що таке горутини й навіщо вони?
22.Що таке GOROOT і GOPATH?
23.Які типи даних використовуються в Go?
24.Що робить функція init()? Наведіть приклади, де її варто використовувати. Наведіть приклади, коли варто уникати.
25.Поясніть різницю між помилкою і панікою.
26.Як відловлювати паніки?
27.Як отримати теперішній час?
28.Що таке iota?
29.Яка різниця між слайсом і масивом?
30.З яких частин складається змінна типу slice?
31.Як працює append?
32.Що таке len і capacity в slice?
33.Що таке пакети?
34.Що таке інтерфейси і як вони працюють?
35.Для чого потрібні інтерфейси в Golang?
36.Що таке тип даних string?
37.Чим відрізняються лапки в Go (подвійні, одинарні, зворотні): "",'', ``?
38.Що таке rune?
39.Чи може змінна типу string приймати nil-значення?
40.Чи можна повернути з функції кілька значень?
41.Що відбувається під час конкатенації рядків?
42.Як ефективно склеїти кілька рядків?
43.Як записати в файл?
44.Що таке структура?
45.Що буде, якщо викликати log.Fatal?
46.Поясніть різницю між конкурентністю і паралельністю?
47.Як оголосити відкладений виклик?
48.Що таке канал? Які типи каналів ви знаєте? Для чого вони потрібні?
49.Яка різниця між буферизованим і небуферизованим каналами?
50.Що буде, якщо читати із закритого каналу? Що буде, якщо писати у закритий канал?
51.Як перевірити, що змінна типу map має збережене значення для певного ключа?
52.Які стандартні env-змінні в Go?
53.Яка різниця між value & pointer receiver?
54.Як зробити type assertion?
55.Як та навіщо робити type assertion?
56.Як написати benchmark?
57.В якому порядку виконуються кейси в select?

Практичні завдання

58.Реалізувати алгоритм двійкового пошуку елемента у слайсі.
59.Є код. Що виведеться на екран? Що потрібно зробити, щоб побачити запропонований висновок Foo1 і Foo2?
60.Є код. Що виведеться на екран? Як вивести на екран літери?
61.Поміняйте місцями значення двох змінних без тимчасової допоміжної змінної.
62.Оберніть slice у зворотному порядку.
63.Перемістіть усі zero values у кінець масиву.

Middle

Software engineering

1.У чому переваги та недоліки використання protobuf у порівнянні з JSON?
2.Назвіть деякі з принципів 12-factor-app. Для чого використовують graceful shutdown?
3.Що таке dependency injection? А dependency inversion?
4.У вас є ssh-доступ на Linux-сервер, де запущено вебсервер. З сервером періодично відбуваються незаплановані рестарти. Сервер записує логи у файли (розмір лог-файлу > 10 Mb). Які *nix-команди ви можете використати, щоб проаналізувати проблему?
5.Як працює TLS handshake?
6.Яка різниця між TCP & UDP? В якій ситуації UPD краще?
7.Розкажіть у найдрібніших деталях, що відбувається, коли клієнт посилає запит на сервер, а сервер цей запит отримує.
8.Що таке Clean Architecture? Наведіть приклад.
9.Що таке оперативна пам’ять?
10.Як різниця між stack & heap?
11.Для чого потрібні Docker та Kubernetes?
12.Розкажіть про абстракції Kubernetes, з якими працювали?
13.Що таке Pod? Як він влаштований?
14.Розкажіть про Data structures: stack, queue, linked list, trie, balanced tree.

Бази даних

15.Які шляхи пошуку повільних SELECT-запитів у RDBMS? Які способи пришвидшення таких запитів?
16.Що таке нормальні форми бази даних?
17.Що таке індекси? Які їхні недоліки?
18.Які структури даних можуть використовуватися в індексах баз даних? Як вони працюють?
19.Яка різниця між foreign & primary key?
20.Поняття міграції у контексті баз даних. У чому переваги підходу з міграціями?
21.Що таке реплікація даних? Які варіанти реплікації існують для баз, з якими ви працювали?
22.Яка різниця між SQL і NoSQL?
23.Які типи NoSQL баз даних ви знаєте? Наведіть приклади. Яка між ними різниця?
24.Що таке колонкова БД? Переваги та недоліки.
25.Що таке документоорієнтована БД? Переваги та недоліки.
26.Розкажіть про роботу з key-value базами даних (бажано з власного досвіду).
27.З якими типами даних Redis у вас є практичний досвід? Назвіть приклади, коли їх доцільно використовувати.

Go

28.Якими бібліотеками Go ви користувалися для доступу до RDBMS? Які у них позитивні та негативні сторони?
29.Для чого використовують Context? Які є варіанти скасовування контекстів?
30.Якими способами можна виключити (приховати) поля структури при JSON-серіалізації?
31.Назвіть примітиви пакету sync стандартної бібліотеки. Яке призначення та приклади застосування sync.WaitGroup?
32.Яка різниця між Mutex та RWMutex?
33.Які є способи зупинити N горутин, запущених одночасно (наприклад, worker pool)?
34.Що таке замикання функцій?
35.Поясніть різницю між switch і select?
36.Які є способи дістати дані з JSON?
37.Як у Go реалізовані конструкції циклів?
38.Як влаштований тип map?
39.Який порядок перебору map?
40.Що таке серіалізація? Де вона застосовується?
41.Чи можна використовувати nil для ініціалізації змінної?
42.Чи можна задати місткість map? Чи можна отримати місткість map?
43.Як дізнатися кількість символів у рядку?
44.Що таке кодогенерація і для чого вона потрібна?
45.Чим відрізняється goroutine від OS thread?
46.Як і для чого використовують io.Reader і io.Writer?
47.Як перетворити []io.ReadWriter на []io.Reader?
48.Як вказати головній горутині очікувати завершення роботи всіх робочих горутин?
49.Чи завжди буде швидше передача Pointer як аргументу функції?
50.Що таке варіативна змінна функції? Як працювати з цією змінною?
51.Як працювати з пакетом internal?
52.Як працює імпорт через крапочку і чому це погана практика?
53.Як працює імпорт через підкреслення?
54.Що таке defer()?
55.Як працювати з goto?
56.Що таке reflect.DeepEqual() і reflect.TypeOf()?
57.Як розпарсити час?
58.Як порівняти дві дати?
59.Що таке вказівник і як з ним працювати?
60.Як перевірити, чи змінна імплементує інтерфейс?
61.Що таке embedding?
62.Опишіть кроки процесу тестування.
63.Як писати тести? Що таке табличні тести?
64.Що таке memory leak? Які є способи його виявлення? Як його позбутися?
65.Що таке race condition? Які є способи його виявлення? Як його позбутися?

Практичні завдання

67.Реалізувати перевірку на слова на анаграму. Написати тест і бенчмарк. Оцінити складність розробленого алгоритму.
68.Є код. Що виведеться на екран? Чому?
69.Є код. Чи можна передбачити, що виведеться на екран? Чому?
70.Реалізуйте Stack (LIFO).
71.Реалізуйте linked list.
72.Задача про суму підмножини (Subset Sum Problem). Дано: множина позитивних цілих чисел і значення sum. Визначте, чи існує підмножина даної множини з сумою, яка дорівнює значенню sum.

Input: set[] = {3, 34, 4, 12, 5, 2}, sum = 9

Output: True

Senior

Software engineering

1.Що таке процес і потік? Як вони пов’язані між собою? Чи мають різні процеси чи потоки доступу до однієї області пам’яті?
2.Які інструменти зазвичай використовують для збору метрик і логів? Як працює Prometheus?
3.Як працює docker під капотом?
4.Як працює load balancer під капотом?
5.Для чого потрібні черги?
6.Що таке CQRS?
7.Які архітектури програмного забезпечення ви знаєте?
8.Яка різниця між мікросервісами та монолітом? Які є переваги та недоліки?
9.Як побудувати міжсервісну транзакцію?
10.Що таке розподілені транзакції? Як реалізувати?
11.Які проблеми вирішує патерн Saga?
12.Як реалізувати аутентифікацію в мікросервісній архітектурі?
13.Що таке Event Sourcing?
14.Сформулюйте CAP-теорему.
15.Розкажіть про Raft Consensus Algorithm.
16.У чому різниця між імперативною і декларативною парадигмою програмування? Наведіть приклади мов.

Бази даних

17.Для чого потрібні графові бази даних?
18.Якщо точкові дані прив’язані до часу, які бази даних варто використовувати для збереження цих даних?
19.Що таке Materialized View? У чому відмінність від звичайного View?
20.Що таке ACID? Прокоментуйте, як ACID реалізований в PostgreSQL.
21.Яка різниця між BASE та ACID?
22.Назвіть рівні ізоляції транзакцій?
23.Досвід оптимізації бази. Які інструменти використовували?
24.Що таке шардинг? Які види є?
25.Як працює master-slave реплікація?
26.Як працюють індекси? Як вибрати індекси в таблицях?
27.Розкажіть про optimistic та pessimistic locking.

Go

28.За що відповідає змінна GOMAXPROCS? Яке її значення за замовчуванням?
29.Хто відповідає за планування горутин? Розкажіть про алгоритм роботи планувальника. Навіщо він потрібен, якщо вже й так є системні потоки?
30.Розкажіть про алгоритм роботи garbage collector. Mark and sweep, Reference counting та оптимізації алгоритму в мові Go. Що таке stop the world?
31.Які види багатозадачності ви знаєте? Який з них використовують у Go?
32.Для чого потрібна рефлексія? У чому різниця між рефлексією та кодогенерацією?
33.У чому різниця між value та reference типом? Назвіть декілька прикладів у мові Go.
34.Як зупинити горутину?
35.Як в Go реалізується спадкування?
36.Що таке lvalue і rvalue?
37.Яке у slice zero value?
38.Як вбудувати стандартний профайлер у свій застосунок?
39.Що таке map-reduce? Як його реалізувати в Go?
40.Як в Go працює префіксний інкремент/декремент?
41.Що буде, якщо перетворити в JSON-об’єкт, структура якого містить поля з малими літерами в назвах?
42.Як перервати for/switch або for/select?
43.Як можна оптимізувати виконання великої кількості послідовних операцій читання або запису?
44.Чи можна викликати метод у вказівника (pointer) на структуру, якщо він дорівнює nil?
45.Що буде при спробі запису в закритий канал?
46.Що таке взаємне блокування (deadlock)?
47.У чому особливість nil-каналів?
48.У яких випадках варто використовувати м’ютекси, а не канали, та навпаки?
49.Що таке білд-теги?
50.Як реалізувати LRU cache?
51.Що таке SSA-представлення?
52.Що ви знаєте про роботу з плагінами на Go?
53.Що таке аліаси типів?
54.Що таке падінги в структурах і на що вони впливають?
55.Що таке escape-аналіз?
56.Яка різниця між стеком і купою?
57.Що нам дає пакет unsafe?
58.Чи можна змінити певний символ у рядку? А за допомогою пакета unsafe?
59.Як працювати з рефлексією і що ми можемо з нею зробити?
60.Як під капотом виглядають слайси й мапи?
61.Як працювати з copy()?
62.Як працювати з sync.Pool і sync.Map? Які підводні камені вони мають?
63.Розкажіть про канкаренсі-патерни в Go.
64.Як у Go реалізована арифметика вказівників?*

Практичні завдання

65.Продувати архітектуру бекенду для оренди самокатів типу Kiwi чи Bolt. Які мікросервіси будуть? Які мови та інструменти? Який клауд-провайдер? Що варто використати як інфраструктуру? Які бази даних та шини повідомлень?
66.Уявімо, що ви провідний розробник на проєкті, як би ви розподілили ролі в команді із 5 людей для найефективнішої роботи?
67.Є код. Чому err! = nil?
68.Вам дають ssh на сервер і просять полагодити вебзастосунок, який «впав». Інформації про сервер і сервіси немає. Які команди ви будете використовувати, щоб зібрати інформацію, знайти та усунути проблему?
69.Реалізуйте двійкову структуру даних дерева пошуку в Go.
70.Знайдіть максимальну суму шляху в трикутнику. (Подано числа у формі трикутника, починаючи з верхньої частини трикутника і рухаючись до сусідніх чисел у рядку внизу, знаходимо максимальну загальну кількість зверху вниз.)


Дякуємо за питання та технічну рецензію Євгену Радіонову, Алі Шанааху, Денису Оленіну, Олегу Геричу, Івану Чоботарю, Іллі Вишневському, Євгену Харківському, Ярославу Подорванову.

Похожие статьи:
Щомісяця редакція публікує у Стрічці понад 40 статей, які збирають близько 1 мільйона переглядів. Нам цікаво дізнатися, що вам...
Ссылки, на которые лучше таки нажать (по мнению автора), отмечены знаком (!) Java is TIOBE’s Programming Language of 2015! Ну серьезно, это...
Усім привіт. Мене звати Дмитро Кравчук, я QA Engineer у продуктовій компанії iDeals. Часто тестування вважають одним...
С каждым годом все больше говорят о необходимости отказаться от иерархической системы управления...
Команда «Армії дронів» проведе змагання серед виробників БпЛА, про це у своєму Telegram-каналі...
Яндекс.Метрика