From 6e9307dca96a7dc3119e51cd0781a39e1b64e933 Mon Sep 17 00:00:00 2001 From: dreddsa5dies Date: Mon, 14 Mar 2022 18:18:36 +0300 Subject: [PATCH 1/8] =?UTF-8?q?=D0=B2=D1=81=D1=82=D1=80=D0=B0=D0=B8=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=BD=D0=B0=D1=81=D0=BB=D0=B5=D0=B4?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/PODOLSKY.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/PODOLSKY.md b/docs/PODOLSKY.md index a809fbe..f3785b4 100644 --- a/docs/PODOLSKY.md +++ b/docs/PODOLSKY.md @@ -97,6 +97,9 @@ Go vet + golint ### Почему встраивание — не наследование? +Буква L в аббревиатуре SOLID обозначает Liskov Substitution - объекты в программе должны быть заменяемыми на экземпляры их подтипов без изменения правильности выполнения программы. Этот принцип предложила [Барбара Лисков](https://en.wikipedia.org/wiki/Barbara_Liskov). + +При использовании наследования объект представляет собой наследуемый тип, тем самым наследуя функциональность, которой делятся родители. При использовании композиции у объекта есть все признаки, что предоставляют необходимую для объекта функциональность. Другой объект может повторно использовать некоторые из данных функциональностей, однако тип родителя или иерархия, восходящая к нему, отсутствует. ### Какие средства обобщенного программирования есть в Go? From 4ed65f3c8935e6e62c843813df6edf40600f4798 Mon Sep 17 00:00:00 2001 From: dreddsa5dies Date: Mon, 14 Mar 2022 18:23:00 +0300 Subject: [PATCH 2/8] =?UTF-8?q?=D0=BC=D1=8C=D1=8E=D1=82=D0=B5=D0=BA=D1=81?= =?UTF-8?q?=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/PODOLSKY.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/PODOLSKY.md b/docs/PODOLSKY.md index f3785b4..0ce2bbb 100644 --- a/docs/PODOLSKY.md +++ b/docs/PODOLSKY.md @@ -79,6 +79,10 @@ Go vet + golint ### Какие типы мьютексов предоставляет stdlib? +В стандартной библиотеке есть пакет sync. Он предоставляет следующие типы мьютексов: +- sync.Mutex - блокирует и снимает блокировку; +- sync.RWMutex - тоже самое, но есть отдельно блокировка на чтение/запись и отдельно на чтение; +- отдельно стоит упомянуть sync.Map - вид мьютекса для мап. ### Что такое lock-free структуры данных, и есть ли в Go такие? From 5ac12fa323d50ff94fb22ca53b735999667fe7e1 Mon Sep 17 00:00:00 2001 From: dreddsa5dies Date: Mon, 14 Mar 2022 20:22:52 +0300 Subject: [PATCH 3/8] log --- docs/PODOLSKY.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/PODOLSKY.md b/docs/PODOLSKY.md index 0ce2bbb..4c2212e 100644 --- a/docs/PODOLSKY.md +++ b/docs/PODOLSKY.md @@ -65,6 +65,7 @@ slice := array[:] ### Главный недостаток стандартного логгера? +Стандартными логгерами являются: log и log/syslog. Однако в них не реализована идея разделения сообщений по уровням важности (информационные, ошибки, отладочная информация, различные дампы) и сопутствующие плюшки (цвет сообщений и т.д.). Такими пакетами являются: logrus, glog. ### Есть ли для Go хороший orm? Ответ обоснуйте. @@ -76,6 +77,7 @@ Go vet + golint ### Можно ли использовать один и тот же буфер []byte в нескольких горутинах? +Зачем может понадобиться использовать один и тот же буфер []byte в нескольких горутинах параллельно? Не за чем, для этого существуют каналы. Но даже если такая задача стоит, то в этом случае - это общие данные и тут необходимо исключить возможность одновременного выполнения нескольких операций записи. Например используя мьютексы. ### Какие типы мьютексов предоставляет stdlib? From 9dca9c760cf7631480fb319c0966ca964ea55620 Mon Sep 17 00:00:00 2001 From: dreddsa5dies Date: Mon, 14 Mar 2022 20:29:24 +0300 Subject: [PATCH 4/8] =?UTF-8?q?=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BE=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/PODOLSKY.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/PODOLSKY.md b/docs/PODOLSKY.md index 4c2212e..b73fe54 100644 --- a/docs/PODOLSKY.md +++ b/docs/PODOLSKY.md @@ -61,7 +61,7 @@ slice := array[:] ### Предположим, ваша функция должна возвращать детализированные Recoverable и Fatal ошибки. Как это реализовано в пакете net? Как это надо делать в современном Go? - +[Обработка ошибок в Go 1.13](https://habr.com/ru/company/vk/blog/473658/). Вкратце: Go обрабатывает ошибки как значения. В версии 1.13 добавлены метод Unwrap, исследование ошибок с помощью Is и As, упаковка ошибок с помощью %w для fmt.Errorf. ### Главный недостаток стандартного логгера? From 3ad4594be1790109f011b9cfcaa0e39bba68eff3 Mon Sep 17 00:00:00 2001 From: dreddsa5dies Date: Tue, 15 Mar 2022 09:37:18 +0300 Subject: [PATCH 5/8] =?UTF-8?q?lock-free=20=D1=81=D1=82=D1=80=D1=83=D0=BA?= =?UTF-8?q?=D1=82=D1=83=D1=80=D1=8B=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/PODOLSKY.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/docs/PODOLSKY.md b/docs/PODOLSKY.md index b73fe54..4b1aa1f 100644 --- a/docs/PODOLSKY.md +++ b/docs/PODOLSKY.md @@ -88,6 +88,17 @@ Go vet + golint ### Что такое 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, это просто абстрактная реализация этой модели. ### Способы поиска проблем производительности на проде? From 9c5f1babd8d0c0b5f588f66e971dd3305a61e5bc Mon Sep 17 00:00:00 2001 From: dreddsa5dies Date: Tue, 15 Mar 2022 10:14:35 +0300 Subject: [PATCH 6/8] errata --- docs/PODOLSKY.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/PODOLSKY.md b/docs/PODOLSKY.md index 4b1aa1f..31d07c0 100644 --- a/docs/PODOLSKY.md +++ b/docs/PODOLSKY.md @@ -49,7 +49,7 @@ slice := array[:] ### Что такое сериализация? Зачем она нужна? -Сериализация — это преобразование объекта в какой-либо формат с тем, чтобы потом tuj можно было восстановить из этого формата. Допустим, после передачи как набора байт по сети. +Сериализация — это преобразование объекта в какой-либо формат с тем, чтобы потом можно было восстановить из этого формата. Допустим, после передачи как набора байт по сети. Или сохранения в файл на диск. ### Сколько времени в минутах займет у вас написание процедуры обращения односвязного списка? From e8764e9b01d7dae6847967510b87338454dfb0f3 Mon Sep 17 00:00:00 2001 From: dreddsa5dies Date: Wed, 16 Mar 2022 09:55:56 +0300 Subject: [PATCH 7/8] performance prodaction --- docs/PODOLSKY.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/PODOLSKY.md b/docs/PODOLSKY.md index 31d07c0..6fcd1ce 100644 --- a/docs/PODOLSKY.md +++ b/docs/PODOLSKY.md @@ -102,6 +102,7 @@ Lock-free структуры данных - не требующие внешне ### Способы поиска проблем производительности на проде? +Анализ метрик (Prometheus и Grafana), кода (pprof) - это про продукт. Анализ загрузки сети (интерфейсы маршрутизаторов, МСЭ и т.д.), соединений (tshark, wireshark) - это про сеть. И железо - логи ОС и т.д. ### Стандартный набор метрик prometheus в Go-программе? From 83845897e7009056fd0b5d27c25617537facc820 Mon Sep 17 00:00:00 2001 From: dreddsa5dies Date: Fri, 18 Mar 2022 16:49:45 +0300 Subject: [PATCH 8/8] =?UTF-8?q?=D0=BF=D1=80=D0=B5=D0=B8=D0=BC=D1=83=D1=89?= =?UTF-8?q?=D0=B5=D1=81=D1=82=D0=B2=D0=B0=20=D0=B8=20=D0=BD=D0=B5=D0=B4?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D0=B0=D1=82=D0=BA=D0=B8=20Go?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/PODOLSKY.md | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/docs/PODOLSKY.md b/docs/PODOLSKY.md index 6fcd1ce..7e161cd 100644 --- a/docs/PODOLSKY.md +++ b/docs/PODOLSKY.md @@ -1,4 +1,4 @@ -## Вопросы от Данила Подольского на позицию Senior Golang Backend Developer в компанию Evrone +## Вопросы от Данила Подольского на позицию Senior Golang Backend Developer в компанию Evrone ### Go — императивный или декларативный? А в чем разница? @@ -125,6 +125,21 @@ Lock-free структуры данных - не требующие внешне ### Какие технологические преимущества языка Go вы можете назвать? +- Параллелизм +- Кроссплатформенность +- Скорость и компиляция +- Статическая типизация +- Богатая стандартная библиотека +- Возможность писать в функциональном стиле +- Нет ООП +- Авторитетные отцы-основатели и сильное комьюнити +- Простой и понятный синтаксис +- Open Source +- Обаятельный талисман ### Какие технологические недостатки языка Go вы можете назвать? +- быстрый, да не такой как C, C++ +- нет ООП +- всех бесят if err +- кто-то говорит про дженерики, но это лично его мнение \ No newline at end of file