😎😎 Убийственная задача с собеседования в UzumMarketС каждым днём AI-инструменты
обесценивают тривиальные знания и навыки. Никого уже не удивишь каналами, паттернами или устройством планировщика Go. Задачи становятся сложнее, требуются как знания нюансов языка, так и понимание базовых принципов. Всё это делается, чтобы отобрать максимально компетентных кандидатов среди огромного количества желающих.
Говоря про Go, почти каждое собеседование содержит задачи с concurrency. Пример одной из задач:
«Необходимо написать собственный
sync.Once»
func (o *Once) Do(f func())
Проще говоря, если две горутины вызывают Do(f1) и Do(f2), по итогу только одна из функций должна выполниться, даже если f1 == f2.
Попробуем реализовать:
❗️
STOP 😱😱😱
Здесь 97% кандидатов уже проиграли, даже не начав писать код. И не потому, что не знают sync.Once, а потому что не умеют задавать вопросы и уточнять требования. Ведь корректность реализации примитива синхронизации, прежде всего, зависит от его контракта. Смотрим, что дальше
Наивная реализация выглядит так:
if o.done.CompareAndSwap(0, 1) {
f()
}
Заходим в исходники Go и видим:
// Note: Here is an incorrect implementation of Do:
//
// if o.done.CompareAndSwap(0, 1) {
// f()
// }
Почему так? Потому что изначально контракт sync.Once предполагает, что:
In the terminology of the "Go memory model", the return from f "synchronizes before" the return from any call of once.Do(f).
Проще говоря, выход из любого Do должен быть всегда после выхода из f, что не выполняется в тривиальной реализации. Здесь два варианта: либо человек это знает, либо перед написанием кода он уточняет требования, что более важно, ибо это умение не зависит от языка программирования.
Корректная реализация выглядит так:
...
if !o.done.Load() {
o.doSlow(f)
}
...
func (o *Once) doSlow(f func()) {
o.m.Lock()
defer o.m.Unlock()
if !o.done.Load() {
defer o.done.Store(true)
f()
}
}
Этим тонкостям на канале посвящено
отдельное видео, там в том числе разбирается реализация sync.Once с примерами возникающих проблем. Более того, стала доступна
запись выступления на GolangConf-X-2025, где подробно рассказывается про модель памяти.
Если же у тебя есть желание повысить свою компетентность, чтобы не попасть в те самые 97%, второй поток 🍀
The Nature of Concurrency начнётся уже на следующей неделе,
успевай, пока ещё остались места