Forwarded from Yandex for Backend
Многие продукты Яндекса используют этот язык в своих сервисах: от инфраструктуры автономного транспорта до продуктовых сервисов финтеха. Поэтому разработчики постоянно расширяют экспертизу в Go: изучают лучшие практики, делятся опытом, проводят митапы и подробно разбирают нововведения.
Сейчас есть отличный повод этим заняться: 10 февраля вышел Go 1.26.
Подписывайтесь:
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
7❤24 12✍4🔥2
Forwarded from igoroutine.courses
Data race это частный случай race condition. Определять термин data race на самом деле можно по-разному.
Самое простое определение:
Состояние во время исполнения, когда две операции над переменной происходят из разных горутин без синхронизации, при этом хотя бы одна из них является записью.
Чуть более сложное:
Состояние во время исполнения, когда две конфликтующие операции над переменной происходят из разных горутин без синхронизации.
И самое сложное на основании формализма из Go memory model:
Состояние во время исполнения, когда две конфликтующие операции над переменной нельзя разделить отношением happens before
Казалось бы, да ну их, есть прекрасный инструмент race detector, который инструментриует программу при компиляции и позволяет во время исполнения находить data race.
Но, внезапно, выясняется, что он не всегда может найти проблему. Это напрямую следует из его устройства.
Пример:
Мейнтейнеры Go пытались реализовать такой интерфейс:
type Cron interface {
Run(ctx context.Context, action func(), next func() time.Duration)
}
Реализация должна вызывать
action, ожидая перед каждым запуском next() времени. После отмены контекста не должно быть вызовов action.Такой подход на практике очень часто используется, например:
• HTTP ретраи
• Service discovery
• Adaptive polling
• Keepalive / heartbeat
• Любые задачи с backoff
Сходу у них получилась следующая реализация:
func (c *cronImpl) Run(ctx context.Context, action func(), next func() time.Duration) {
var t *time.Timer
t = time.AfterFunc(next(), func() {
select {
case <-ctx.Done():
return
default:
action()
t.Reset(next())
}
})
<-ctx.Done()
}
Запускаем тесты:
func TestCron(t *testing.T) {
synctest.Test(t, func(t *testing.T) {
c := New()
var n atomic.Int64
next := func() time.Duration {
if n.Add(1) <= 5 {
return 0
}
return 1 * time.Second
}
var calls atomic.Int64
ctx, cancel := context.WithCancel(t.Context())
t.Cleanup(func() {
cancel()
})
done := make(chan struct{})
go func() {
defer close(done)
c.Run(ctx, func() {
calls.Add(1)
}, next)
}()
synctest.Wait()
require.Greater(t, calls.Load(), int64(0))
cancel()
synctest.Wait()
select {
case <-done:
default:
t.Fatalf("Run did not exit after cancel")
}
})
}
Которые успешно проходят даже с race detector'ом.
Но в этой реализации действительно есть data race, и race detector его не находит.
Ссылка с примером использования: https://go.dev/play/p/Fq-yNa0wXWj
P.S. Пожалуйста, те, кто проходил курс и решал это задание на практике, не пишите сразу правильный ответ)
Please open Telegram to view this post
VIEW IN TELEGRAM
9🤔8👍2❤1✍1
Forwarded from igoroutine.courses
Продолжение к предыдущему посту.
Итак, разработчик из Go team написал такую реализацию:
func (c *cronImpl) Run(ctx context.Context, action func(), next func() time.Duration) {
var t *time.Timer
t = time.AfterFunc(next(), func() {
select {
case <-ctx.Done():
return
default:
action()
t.Reset(next())
}
})
<-ctx.Done()
}
func main() {
ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
defer cancel()
c := cronImpl{}
c.Run(ctx,
func() {
fmt.Println("Hello, @igoroutine")
},
func() time.Duration {
return time.Second
},
)
}
Всё ожидаемо работает:
Hello, @igoroutine
Hello, @igoroutine
Hello, @igoroutine
Hello, @igoroutine
Hello, @igoroutine
Hello, @igoroutine
Hello, @igoroutine
Hello, @igoroutine
Hello, @igoroutine
Hello, @igoroutine
Program exited 0.
Мы, как ответственные люди, дополнительно написали тест. Более того, включили race detector при компиляции.
go test -v -race ./...
func TestCron(t *testing.T) {
synctest.Test(t, func(t *testing.T) {
c := New()
var n atomic.Int64
next := func() time.Duration {
if n.Add(1) <= 5 {
return 0
}
return 1 * time.Second
}
var calls atomic.Int64
ctx, cancel := context.WithCancel(t.Context())
done := make(chan struct{})
go func() {
defer close(done)
c.Run(ctx, func() {
calls.Add(1)
}, next)
}()
synctest.Wait()
require.Greater(t, calls.Load(), int64(0))
cancel()
synctest.Wait()
select {
case <-done:
default:
t.Fatalf("Run did not exit after cancel")
}
})
}
=== RUN TestCron
--- PASS: TestCron (0.00s)
PASS
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x2 addr=0x0 pc=0x1009927fc]
Пробуем дебагать и снова запускать тесты. Для надёжности прогоняем их с count=10000:
go test -v -count=10000 ./...
PASS
ok 0.787s
Попробуем запустить с race detector'ом и count=100:
go test -v -race -count=100 ./...
PASS
ok 4.079s
От безысходности запускаем тесты с race detector'ом и
count=1000000 и видим вот это:
WARNING: DATA RACE
Read at 0x00c0000024a0 by goroutine 3543:
cron.go:30 +0x90 // t.Reset(next())
Previous write at 0x00c0000024a0 by goroutine 3541:
cron.go:24 +0x194 // t = time.AfterFunc(next() ...
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x2 addr=0x0 pc=0x1050ae7fc]
Всё дело в том, что AfterFunc внутри создаёт отдельную горутину:
func AfterFunc(d Duration, f func()) *Timer {
return newTimer(when(d), 0, goFunc, f, nil)
}
func goFunc(arg any, seq uintptr, delta int64) {
go arg.(func())()
}
При очень маленьком
d в этом коде
t = time.AfterFunc(next(), func() {
...
t.Reset(next())
})
Горутина с t.Reset может начать исполняться раньше, чем значение будет сохранено в t. Соответственно, получается nil pointer dereference. На самом деле причина может быть в аппаратной реализации, например, t может находиться в кэше ядра. И таких «аппаратных» объяснений может быть очень много в зависимости от архитектуры.
С точки зрения Go memory model это не важно.
Важно, что мы пишем (t = ...) и читаем (t.Reset) общую переменную без синхронизации. Это data race по определению.
И race detector не всегда может тривиально обнаружить такие проблемы, это напрямую следует из его устройства.
Более того, эту реализацию можно переписать более эффективно, чтобы избежать создания лишней горутины.
Это как раз одно из многочисленных заданий на курсе The Nature of Go.
Please open Telegram to view this post
VIEW IN TELEGRAM
4🤯13👍3😱2✍1
Случайно решил почитать про историю праздника на wiki.
Сознание определенно расширилось
Please open Telegram to view this post
VIEW IN TELEGRAM
❤21 11✍3
Недавно выкладывал пост, после которого по реакциям понял, что многим интересно увидеть мои видео-лекции по разным направлениям.
Некоторые из них слишком сложные и перегруженные для ютуба. Поэтому, уже начал готовить для вас на своем сайте отдельный каталог с бесплатными видео и текстовыми материалами, он появится в открытом доступе в ближайшее время.
Как раз недавно провёл в ШАД (Школа анализа данных от Яндекса) лекции на курсе Go про продвинутое тестирование и concurrency. По concurrency получилось хорошо пройтись по базе, не углубляясь в нюансы.
Из интересного, сам перед лекцией разбирался с новой реализацией sync.Map (HashTrieMap), которую добавили в Go 1.24, там все оказалось довольно интересно))
Про тестирование за 3 часа получилось рассказать почти все, что можно, начиная от устройства пакета testing, заканчивая интеграционными тестами и настройкой CI. Как раз эта большая лекция про тестирование будет одной из первых на сайте.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
8❤40 17🥰8🙏1 1
Многие из вас могли слышать про текущий хайп с кризисом в IT-индустрии. Действительно, некоторые компании закрывают неприоритетные и убыточные направления.
Более того, на это накладывается относительно сложный найм и повышение порога входа.
Именно поэтому важно осознавать реальную обстановку и свои силы.
На знакомом проекте в родной компании можно быть 10x Senior'ом, но, вопрос, что будет за его рамками на собеседовании или в другой компании?
Как раз сейчас есть возможность проверить свои силы на высшем уровне как для начинающих, так и опытных разработчиков.
Мои коллеги из Яндекса традиционно проводят Week Offer Backend и рассматривают:
• Бэкенд-разработчиков с опытом на Go / C++ / Python / Java / Kotlin от 4 лет.
• Стажёров-разработчиков, с базой по алгоритмам и структурам данных, знанием Go / C++ / Python / Java / Kotlin.
В одном из постов я рассказывал, как лично занимался составлением задач на контест для аналогичного мероприятия. Тогда ещё основной целью было, чтобы их не смог решить gpt-5. В итоге к этому получилось прийти, но лучше не знать какой ценой.
В этот раз контест решили убрать, так что есть возможность сразу готовиться к собеседованиям)
Даты мероприятия:
11–17 апреля — для опытных бэкендеров.
13–17 апреля — для стажёров.
Для тех, кто не уверен в своих силах, помните, лучше попробовать и проиграть, чем вовсе не попробовать.
Все этапы проходят онлайн. Подробности и регистрация — по ссылке.
Please open Telegram to view this post
VIEW IN TELEGRAM
14❤21 10👍7🥴4👌2
Please open Telegram to view this post
VIEW IN TELEGRAM
Telegram
igoroutine.courses
😎😎 Это изменение сломало Set на map[key]struct{}, который мы знали
В Go все привыкли писать set вот так:
type set[K comparable] struct {
data map[K]struct{}
}
Ибо многие знают, что в Go пустая структура не занимает память. Давайте посмотрим на формулировку…
В Go все привыкли писать set вот так:
type set[K comparable] struct {
data map[K]struct{}
}
Ибо многие знают, что в Go пустая структура не занимает память. Давайте посмотрим на формулировку…
6😁15🤯5👍4🥴1
Говоря откровенно, несколько лет назад я стал переосмыслять вообще все в своей жизни - каждый праздник, каждое действие, каждое убеждение.
Ем куличи, бью яйца, но почему? Просто потому что мне это передалось как традиция или в этом есть что-то большее? Безусловно, я знал что-то про Иисуса Христа, но мои познания были весьма скудны.
Разобравшись и совершив трансцендентный переход в моём осознании религии, я пришёл к выводу, что в неё зашиты гораздо более глубокие идеи, чем я только мог себе представить.
Я всё ещё очень далёк от компетентности в этой области, поэтому в этот священный праздник хочу сослаться на цитату Апостола Павла к Коринфянам. Верю, что каждый сам для себя найдет в ней свой смысл:
Если я говорю языками человеческими и ангельскими, а любви не имею, то я – медь звенящая или кимвал звучащий.
Если имею дар пророчества, и знаю все тайны, и имею всякое познание и всю веру, так что могу и горы переставлять, а не имею любви, – то я ничто.
И если я раздам все имение мое и отдам тело мое на сожжение, а любви не имею, нет мне в том никакой пользы.
Любовь долготерпит, милосердствует, любовь не завидует, любовь не превозносится, не гордится,
не бесчинствует, не ищет своего, не раздражается, не мыслит зла,
не радуется неправде, а сорадуется истине;
все покрывает, всему верит, всего надеется, все переносит.
Любовь никогда не перестает, хотя и пророчества прекратятся, и языки умолкнут, и знание упразднится.
Ибо мы отчасти знаем, и отчасти пророчествуем, когда же настанет совершенное, тогда то, что отчасти, прекратится.
Когда я был младенцем, то по-младенчески говорил, по-младенчески мыслил, по-младенчески рассуждал; а как стал мужем, то оставил младенческое.
Теперь мы видим как бы сквозь тусклое стекло, гадательно, тогда же лицем к лицу; теперь знаю я отчасти, а тогда позна́ю, подобно как я познан.
А теперь пребывают сии три: вера, надежда, любовь; но любовь из них больше.
Please open Telegram to view this post
VIEW IN TELEGRAM
12🕊47❤32❤🔥13👍6✍2
Как и обещал, сайт с материалами готов, их там уже 20+. На следующей неделе появятся видео про собеседования и базы данных, далее планирую периодически выкладывать туда ещё больше полезного контента. Буду рад вашим отзывам и предложениям)
Более того, сейчас проходят различные конференции, и организаторы попросили меня поделиться ими с вами:
• Я.Субботник по Go от Яндекса 25 апреля, максимально рекомендую сходить, лично знаю организаторов, они действительно вкладывают душу, чтобы все проходило на высшем уровне.
• Статья про тернарный оператор от Дмитрия Бурова в рамках GolangConf. Он написал очень интересную статью и подготовил опрос, результаты которого будут освещены в докладе в понедельник, рекомендую изучить и оставить обратную связь в опросе.
Почему же я не стал участвовать в этих мероприятиях и готовить доклады?
Откровенно говоря, время слишком ценный и конечный ресурс, которого порой на все не хватает. Новый проект на работе, совсем недавно стал тимлидом, подготовка к запуску курса, который начнётся уже совсем скоро, и жизненная рутина сильно вносят свой вклад в планирование.
Кстати, с начала года начал плотно заниматься здоровьем, в том числе для повышения продуктивности, пока результаты меня радуют.
Недавно впервые в жизни сделал в жиме лёжа 100кг на разы, даже есть видео)) Ставьте
P.S. На фото я довольный с потным лбом после насыщенного дня)
Please open Telegram to view this post
VIEW IN TELEGRAM
10 69❤🔥18🔥13👍6💯2
This media is not supported in your browser
VIEW IN TELEGRAM
Много реакций под прошлым постом + некоторые люди даже писали мне в личные сообщения. Выкладываю упомянутое видео со своим скромным результатом)) Пишите в комментариях, каким спортом вы занимаетесь или хотите начать заниматься?
Кстати, напоминаю, что через 9 дней стартует уникальный поток курса The Nature of Go, убежден, что с его помощью можно, если не пожать сотку, то точно сильно повысить компетентность в технической области, и речь совсем не только про Go.
На этой неделе планирую выпустить серию постов, где раскрою детали курса и поделюсь виденьем, почему сейчас амбивалентно худшее и лучшее время для обучения и вложения ресурсов в себя и свои навыки.
Please open Telegram to view this post
VIEW IN TELEGRAM
6 71❤21😁7👍5🔥3
В текущих реалиях возникает вопрос: «Во что вкладывать ресурсы»?
Кто-то советует вложиться в криптовалюту, кто-то — купить акции.
На мой взгляд, лучшая инвестиция — это инвестиция в себя, в своё здоровье, навыки и знания.
Представим, если завтра я проснусь и у меня заберут все материальное, в том числе работу и этот канал.
Я точно знаю, что в этом случае у меня все равно получится быстро вернуться на прежний уровень. Даже если мне придётся поработать, например, курьером, чтобы накопить на ноутбук или аренду квартиры.
Потому что у меня невозможно забрать знания и навыки.
Именно поэтому сейчас лучшее время для вложений в себя, какая бы ни была обстановка в мире, этот актив невозможно отобрать.
Однако в эпоху AI при покупке любого обучения стоит быть аккуратным. Очень многие вещи сейчас можно понять, пообщавшись с ChatGPT и погуглив статьи. Более того, он ещё и объяснит это доступным языком. То есть обучение простым вещам в каком-то смысле обесценивается.
В рамках эксперимента я решил сделать уникальный поток курса The Nature of Go. В нём будет собрана вся база, весь фундамент, на котором дальше можно построить что угодно. Этот поток я составил из пяти своих курсов:
1) The Nature of Computer Science (Оптимизации в Go)
Этот блок позволит разобраться, на чём базируется весь высокоуровневый софт. Некоторые примеры открытых занятий:
• Оперативная, виртуальная и внешняя память: от железа, дисков и ядра ОС до Go | Полный разбор
• Устройство операционных систем: от ядра и системных вызовов до Go | Полный разбор
• Как процессор понимает Go, Java или C++: секреты устройства CPU
• Тайны компилятора и истории Go | Полное руководство для собеседований
2) The Nature of Go
Этот блок позволит не только усовершенствовать свои знания в Go, но и понять, как устроены современные языки программирования:
• Перейди на Go за одно видео | Продвинутая база для работы и собеседований
• Новый сборщик мусора в Go 1.26! Уже используют в Google | Полное руководство про GC
• Собеседование на Senior Go | Разбор задачи из BigTech | LRU Cache
3) The Nature of Concurrency
Многопоточное программирование является одной из основных тем в программировании. Большинство языковых задач на собеседованиях затрагивают именно её:
• Секреты Concurrency: от процессора до атомиков в Go | Полное руководство
• Многопоточные паттерны
• От этого data race не спасает даже race detector
4) The Nature of Microservices
Знание языка программирования — это, конечно, хорошо. Но оно ничего не стоит без возможности запустить полноценную систему:
• gRPC на Go: от устройства до архитектуры
• Профилирование в Go
• Логи, метрики, трейсы и профилирование
5) The Nature of Interview
Каким бы скилловым не был человек, если он не может рассказать и презентовать это на собеседовании, эти навыки никто не увидит.
В рамках этого поста я анонсирую новый видеоматериал на своем сайте. В нём подробно рассказал про то, какие подводные камни существуют на собеседованиях, разобрал все этапы, начиная от скрининга, заканчивая System Design и финалами.
И все это лишь часть того, что будет на этом уникальном потоке.
Для тех, кто хочет вложиться в свои навыки, ещё осталось несколько мест, начинаем через 7 дней.
Please open Telegram to view this post
VIEW IN TELEGRAM
25💯20🔥12❤9 6✍2
🇧🇷🇧🇷🇧🇷
Huge thanks to my Brazilian Golang brother Alex Rios for these rare Go-themed posters.
Alex, at our next meetup I will happily gift you items from the new igoroutine clothes collection dropping this year - you will be the first to get them)
P.S. Подарю один из таких постеров в следующем розыгрыше
🙂 ПАНЕЛЬ УПРАВЛЕНИЯ 🙂
Huge thanks to my Brazilian Golang brother Alex Rios for these rare Go-themed posters.
Alex, at our next meetup I will happily gift you items from the new igoroutine clothes collection dropping this year - you will be the first to get them)
P.S. Подарю один из таких постеров в следующем розыгрыше
Please open Telegram to view this post
VIEW IN TELEGRAM
8 33❤18🔥10🎉3✍1
В последнее время получаю много повторяющихся вопросов про поток The Nature of Go, решил одним постом ответить на всё сразу.
Хочу поступить на BASE, но переживаю, что будет мало обратной связи без ревью и личных встреч 1 на 1
Абсолютно к каждому заданию прилагается набор автотестов и доступ к CI (первый скриншот), начиная от заданий с учебной операционной системой и ассемблером, заканчивая интеграционными тестами для выпускного проекта (ecommerce платформа с базой, кафкой, кэшем и observability). Причём тесты не только на корректность, но и на производительность. Плюс есть 4 групповые Q/A сессии, где можно задать любой интересующий вопрос голосом.
Есть ли какие-нибудь отзывы, чтобы понять опыт других людей?
На сайте есть видео и текстовые отзывы. Более того, некоторые разделы преподавались мной в ИТМО и ШАД для людей разного уровня, записи некоторых лекций можно посмотреть в разделе бесплатных материалов.
Будет ли какое-то подтверждение после прохождения курса?
Да, после итоговой аттестации выдаётся сертификат, который также прорастает на LinkedIn. Более того, каждому участнику курса лично отправляю мерч, самым лучшим в рейтинге дарю дополнительные призы.
Переживаю, что не буду успевать проходить курс или вовсе не потяну
Обычно в таком случае я говорю о том, что доступ остаётся на 2 года, то есть всегда можно перепройти материал в своём темпе. Однако хочется раскрыть этот вопрос глубже.
Я глубоко убеждён, что большая часть жизни человека — это перманентное страдание.
Например, мы либо выбираем идти учиться, где приходиться страдать и стрессовать в процессе.
Либо выбираем зону комфорта, где впоследствии появляются страдания, когда в жизни приходят сложные обстоятельства, которые заставляют упасть с уровня своих ожиданий до уровня своей подготовки.
Вопрос в том, какие страдания мы выбираем и что после них следует.
Для тех, кто выбирает первые, осталось ещё 5 мест, нас уже 30, начинаем послезавтра
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
9👍17🔥9❤6 4✍2