Merge pull request #3 from dreddsa5dies/podolsky

Сделаем самый полный перечень ответов на вопросы уважаемого Подольского.
This commit is contained in:
Andrey Kapitonov
2022-03-18 23:09:28 +03:00
committed by GitHub

View File

@@ -1,4 +1,4 @@
## <a name="podolsky"></a> Вопросы от Данила Подольского на позицию Senior Golang Backend Developer в компанию Evrone
## Вопросы от Данила Подольского на позицию Senior Golang Backend Developer в компанию Evrone
### <a name="1"></a> Go императивный или декларативный? А в чем разница?
@@ -49,7 +49,7 @@ slice := array[:]
### <a name="11"></a> Что такое сериализация? Зачем она нужна?
Сериализация это преобразование объекта в какой-либо формат с тем, чтобы потом tuj можно было восстановить из этого формата. Допустим, после передачи как набора байт по сети.
Сериализация это преобразование объекта в какой-либо формат с тем, чтобы потом можно было восстановить из этого формата. Допустим, после передачи как набора байт по сети. Или сохранения в файл на диск.
### <a name="12"></a> Сколько времени в минутах займет у вас написание процедуры обращения односвязного списка?
@@ -61,10 +61,11 @@ slice := array[:]
### <a name="14"></a> Предположим, ваша функция должна возвращать детализированные Recoverable и Fatal ошибки. Как это реализовано в пакете net? Как это надо делать в современном Go?
[Обработка ошибок в Go 1.13](https://habr.com/ru/company/vk/blog/473658/). Вкратце: Go обрабатывает ошибки как значения. В версии 1.13 добавлены метод Unwrap, исследование ошибок с помощью Is и As, упаковка ошибок с помощью %w для fmt.Errorf.
### <a name="15"></a> Главный недостаток стандартного логгера?
Стандартными логгерами являются: log и log/syslog. Однако в них не реализована идея разделения сообщений по уровням важности (информационные, ошибки, отладочная информация, различные дампы) и сопутствующие плюшки (цвет сообщений и т.д.). Такими пакетами являются: logrus, glog.
### <a name="16"></a> Есть ли для Go хороший orm? Ответ обоснуйте.
@@ -76,15 +77,32 @@ Go vet + golint
### <a name="18"></a> Можно ли использовать один и тот же буфер []byte в нескольких горутинах?
Зачем может понадобиться использовать один и тот же буфер []byte в нескольких горутинах параллельно? Не за чем, для этого существуют каналы. Но даже если такая задача стоит, то в этом случае - это общие данные и тут необходимо исключить возможность одновременного выполнения нескольких операций записи. Например используя мьютексы.
### <a name="19"></a> Какие типы мьютексов предоставляет stdlib?
В стандартной библиотеке есть пакет sync. Он предоставляет следующие типы мьютексов:
- sync.Mutex - блокирует и снимает блокировку;
- sync.RWMutex - тоже самое, но есть отдельно блокировка на чтение/запись и отдельно на чтение;
- отдельно стоит упомянуть sync.Map - вид мьютекса для мап.
### <a name="20"></a> Что такое lock-free структуры данных, и есть ли в Go такие?
Синхронизация это узкое место параллельных программ. Распараллеливая алгоритмы, мы работаем с последовательными структурами данных, обеспечивая их работу примитивами синхронизации критическими секциями, мьютексами, условными переменными (condvar); в результате мы выстраиваем все наши потоки в очередь на доступ к структуре данных, тем самым убивая параллельность.
В академической среде изучение способов реализации конкурентных структур данных, обеспечивающих одновременный доступ к разделяемым данным, привело к созданию нескольких основных направлений:
- Lock-free структуры данных;
- Fine-grained algorithms;
- Транзакционная память (transactional memory).
Lock-free структуры данных - не требующие внешней синхронизации доступа. Это неформальное, чисто техническое определение, отражающее внутреннее строение контейнера и операций над ним.
Формальное определение lock-free объекта звучит так: разделяемый объект называется lock-free объектом (неблокируемым, non-blocking объектом), если он гарантирует, что некоторый поток закончит выполнение операции над объектом за конечное число шагов вне зависимости от результата работы других потоков (даже если эти другие потоки завершились крахом).
В Go есть sync.Map и пакет atomic. Но с точки зрения указанных определений, а также реализации данных пакетов - это не чистый lock-free, это просто абстрактная реализация этой модели.
### <a name="21"></a> Способы поиска проблем производительности на проде?
Анализ метрик (Prometheus и Grafana), кода (pprof) - это про продукт. Анализ загрузки сети (интерфейсы маршрутизаторов, МСЭ и т.д.), соединений (tshark, wireshark) - это про сеть. И железо - логи ОС и т.д.
### <a name="22"></a> Стандартный набор метрик prometheus в Go-программе?
@@ -97,6 +115,9 @@ Go vet + golint
### <a name="25"></a> Почему встраивание не наследование?
Буква L в аббревиатуре SOLID обозначает Liskov Substitution - объекты в программе должны быть заменяемыми на экземпляры их подтипов без изменения правильности выполнения программы. Этот принцип предложила [Барбара Лисков](https://en.wikipedia.org/wiki/Barbara_Liskov).
При использовании наследования объект представляет собой наследуемый тип, тем самым наследуя функциональность, которой делятся родители. При использовании композиции у объекта есть все признаки, что предоставляют необходимую для объекта функциональность. Другой объект может повторно использовать некоторые из данных функциональностей, однако тип родителя или иерархия, восходящая к нему, отсутствует.
### <a name="26"></a> Какие средства обобщенного программирования есть в Go?
@@ -104,6 +125,21 @@ Go vet + golint
### <a name="27"></a> Какие технологические преимущества языка Go вы можете назвать?
- Параллелизм
- Кроссплатформенность
- Скорость и компиляция
- Статическая типизация
- Богатая стандартная библиотека
- Возможность писать в функциональном стиле
- Нет ООП
- Авторитетные отцы-основатели и сильное комьюнити
- Простой и понятный синтаксис
- Open Source
- Обаятельный талисман
### <a name="28"></a> Какие технологические недостатки языка Go вы можете назвать?
- быстрый, да не такой как C, C++
- нет ООП
- всех бесят if err
- кто-то говорит про дженерики, но это лично его мнение