diff --git a/docs/PODOLSKY.md b/docs/PODOLSKY.md index 7e161cd..a14ea95 100644 --- a/docs/PODOLSKY.md +++ b/docs/PODOLSKY.md @@ -1,92 +1,92 @@ ## Вопросы от Данила Подольского на позицию Senior Golang Backend Developer в компанию Evrone -### Go — императивный или декларативный? А в чем разница? +### 1. Go — императивный или декларативный? А в чем разница? В основном Императивный. Разница в подходе: - императивный - как сделать (прямо пошагово); - декларативный - что сделать (итоговый результат). -### Что такое type switch? +### 2. Что такое type switch? Сравнение типов переменной, а не ее значений. -### Как сообщить компилятору, что наш тип реализует интерфейс? +### 3. Как сообщить компилятору, что наш тип реализует интерфейс? Если наш тип реализует все методы интерфейса, значит он реализует этот интерфейс. -### Как работает append? +### 4. Как работает append? Если capacity исходного массива достаточно, он используется повторно. В противном случае выделяется новый базовый массив достаточной длины и данные копируются -### Какое у slice zero value? Какие операции над ним возможны? +### 5. Какое у slice zero value? Какие операции над ним возможны? Zero value у slice == nil Возможные операции: len, cap, append. -### Как устроен тип map? +### 6. Как устроен тип map? Map в Go это хэш таблица, позволяющая хранить пары ключ-значение и обладающая следующими функциями: маппинг, вставка, удаление, поиск. Map in Go не упорядоченная. Место поиска определяется рандомно. Когда мы пытаемся получить значение из мапы, а его там нет, получаем «нулевое значение типа», что в случае числа 0. Map — ссылочный тип и мало объявить переменную, надо ее проинициализировать. -### Каков порядок перебора map? +### 7. Каков порядок перебора map? Случайным образом. -### Что будет, если читать из закрытого канала? +### 8. Что будет, если читать из закрытого канала? Вернется нулевое значение. -### Что будет, если писать в закрытый канал? +### 9. Что будет, если писать в закрытый канал? Произойдет вызов panic. -### Как вы отсортируете массив структур по алфавиту по полю Name? +### 10. Как вы отсортируете массив структур по алфавиту по полю Name? С помощью функции sort.SliceStable. Для этого сначала конвертируем массив в слайс. ```go slice := array[:] ``` -### Что такое сериализация? Зачем она нужна? +### 11. Что такое сериализация? Зачем она нужна? Сериализация — это преобразование объекта в какой-либо формат с тем, чтобы потом можно было восстановить из этого формата. Допустим, после передачи как набора байт по сети. Или сохранения в файл на диск. -### Сколько времени в минутах займет у вас написание процедуры обращения односвязного списка? +### 12. Сколько времени в минутах займет у вас написание процедуры обращения односвязного списка? Тут каждый считает сам. Попробуйте с таймингом (засеките время). -### Где следует поместить описание интерфейса: в пакете с реализацией или в пакете, где этот интерфейс используется? Почему? +### 13. Где следует поместить описание интерфейса: в пакете с реализацией или в пакете, где этот интерфейс используется? Почему? Небольшое копирование лучше, чем небольшая зависимость. Даже в стандартной библиотеке есть места, где те же io.Reader или fmt.Stringer переопределены, чтобы избежать ненужной зависимости от других пакетов. Если интерфейс маленький, скопировать его не составит труда, а если он большой, то есть вероятность, что в будущем одному модулю понадобятся одни методы, а другому - другие. -### Предположим, ваша функция должна возвращать детализированные Recoverable и Fatal ошибки. Как это реализовано в пакете net? Как это надо делать в современном Go? +### 14. Предположим, ваша функция должна возвращать детализированные Recoverable и Fatal ошибки. Как это реализовано в пакете net? Как это надо делать в современном Go? [Обработка ошибок в Go 1.13](https://habr.com/ru/company/vk/blog/473658/). Вкратце: Go обрабатывает ошибки как значения. В версии 1.13 добавлены метод Unwrap, исследование ошибок с помощью Is и As, упаковка ошибок с помощью %w для fmt.Errorf. -### Главный недостаток стандартного логгера? +### 15. Главный недостаток стандартного логгера? Стандартными логгерами являются: log и log/syslog. Однако в них не реализована идея разделения сообщений по уровням важности (информационные, ошибки, отладочная информация, различные дампы) и сопутствующие плюшки (цвет сообщений и т.д.). Такими пакетами являются: logrus, glog. -### Есть ли для Go хороший orm? Ответ обоснуйте. +### 16. Есть ли для Go хороший orm? Ответ обоснуйте. Для работы с базами данных можно использовать пакет database/sql. Но есть куча ORM, можно выбрать любую. Все зависит от исходной посылки. -### Какой у вас любимый линтер? +### 17. Какой у вас любимый линтер? Go vet + golint -### Можно ли использовать один и тот же буфер []byte в нескольких горутинах? +### 18. Можно ли использовать один и тот же буфер []byte в нескольких горутинах? Зачем может понадобиться использовать один и тот же буфер []byte в нескольких горутинах параллельно? Не за чем, для этого существуют каналы. Но даже если такая задача стоит, то в этом случае - это общие данные и тут необходимо исключить возможность одновременного выполнения нескольких операций записи. Например используя мьютексы. -### Какие типы мьютексов предоставляет stdlib? +### 19. Какие типы мьютексов предоставляет stdlib? В стандартной библиотеке есть пакет sync. Он предоставляет следующие типы мьютексов: - sync.Mutex - блокирует и снимает блокировку; - sync.RWMutex - тоже самое, но есть отдельно блокировка на чтение/запись и отдельно на чтение; - отдельно стоит упомянуть sync.Map - вид мьютекса для мап. -### Что такое lock-free структуры данных, и есть ли в Go такие? +### 20. Что такое lock-free структуры данных, и есть ли в Go такие? Синхронизация – это узкое место параллельных программ. Распараллеливая алгоритмы, мы работаем с последовательными структурами данных, обеспечивая их работу примитивами синхронизации – критическими секциями, мьютексами, условными переменными (condvar); в результате мы выстраиваем все наши потоки в очередь на доступ к структуре данных, тем самым убивая параллельность. @@ -100,30 +100,30 @@ Lock-free структуры данных - не требующие внешне В Go есть sync.Map и пакет atomic. Но с точки зрения указанных определений, а также реализации данных пакетов - это не чистый lock-free, это просто абстрактная реализация этой модели. -### Способы поиска проблем производительности на проде? +### 21. Способы поиска проблем производительности на проде? Анализ метрик (Prometheus и Grafana), кода (pprof) - это про продукт. Анализ загрузки сети (интерфейсы маршрутизаторов, МСЭ и т.д.), соединений (tshark, wireshark) - это про сеть. И железо - логи ОС и т.д. -### Стандартный набор метрик prometheus в Go-программе? +### 22. Стандартный набор метрик prometheus в Go-программе? -### Как встроить стандартный профайлер в свое приложение? +### 23. Как встроить стандартный профайлер в свое приложение? -### Overhead от стандартного профайлера? +### 24. Overhead от стандартного профайлера? -### Почему встраивание — не наследование? +### 25. Почему встраивание — не наследование? Буква L в аббревиатуре SOLID обозначает Liskov Substitution - объекты в программе должны быть заменяемыми на экземпляры их подтипов без изменения правильности выполнения программы. Этот принцип предложила [Барбара Лисков](https://en.wikipedia.org/wiki/Barbara_Liskov). При использовании наследования объект представляет собой наследуемый тип, тем самым наследуя функциональность, которой делятся родители. При использовании композиции у объекта есть все признаки, что предоставляют необходимую для объекта функциональность. Другой объект может повторно использовать некоторые из данных функциональностей, однако тип родителя или иерархия, восходящая к нему, отсутствует. -### Какие средства обобщенного программирования есть в Go? +### 26. Какие средства обобщенного программирования есть в Go? Обобщенное программирование — это форма, в которой мы подключаем шаблоны, известные как дженерики, которые на самом деле не являются истинным исходным кодом, но компилируются компилятором для преобразования их в исходный код. [Дженерики будут](https://go.googlesource.com/proposal/+/refs/heads/master/design/43651-type-parameters.md) с версии 1.18. -### Какие технологические преимущества языка Go вы можете назвать? +### 27. Какие технологические преимущества языка Go вы можете назвать? - Параллелизм - Кроссплатформенность @@ -137,7 +137,7 @@ Lock-free структуры данных - не требующие внешне - Open Source - Обаятельный талисман -### Какие технологические недостатки языка Go вы можете назвать? +### 28. Какие технологические недостатки языка Go вы можете назвать? - быстрый, да не такой как C, C++ - нет ООП