Чем конкурентность отличается от параллельности?
Можешь рассказать пример самостоятельного ведения проекта?
Почему ушли с предыдущего места?
Ты пришёл на проект, где код писался годами, куча легаси, нет тестов, всё еле дышит. С чего начнёшь работу, если нужно внедрить новую фичу?
Дана строка символов. Найти количество пар индексов i и j (i <= j), между которыми, включительно, нет повторяющихся символов. Для строки "aba" ответ 5: [0, 0] ("a") [0, 1] ("ab") [1, 1] ("b") [1, 2] ("ba") [2, 2] ("a") Для строки "abcb" ответ ?: aba 3 + 2 = 5 abcb 4(a, b, c, d) + 1(ab) + 1(bc) + 1(cb) + 1(abc) = 8
Чем партиционирование отличается от шардирования?
Какого типа многозадачность использует планировщик Go? Какие два типа многозадачности существуют?
Насколько можно считать высоконагруженным текущий продукт?
Расскажи про паттерны проектирования. Что такое double-checked locking (блокировка с двойной проверкой) и для чего применяется?
А при Serializable — что решается?
Что произойдёт, если запустить 5 триллионов горутин? Как оптимизировать?
/* Нам нужно передать данные из некоторого источника некоторому потребителю. При этом источник отдает данные небольшими пачками (~ десятки записей), а потребитель оптимальнее работает с крупными батчами Реальный пример - поставка данных из очередей типа Kafka в базу Clickhouse. Источник: - Условно бесконечный. - Источник никогда не возвращает более MaxItems записей за один вызов Next. - В рамках одной "сессии" (одного вызова функции Pipe) источник каждый раз возвращает новые данные на каждый вызов Next. - Однако, после перезапуска источник начнет с прошлой "подтвержденной" позиции, задаваемой cookie. Поэтому *каждое* значение cookie, которое вернул вызов Next, после сохранения данных в приемнике, должно быть фиксировано вызовом Commit, причем строго в той же последовательности, в которой их вернул Next Приемник: - Не может обработать более MaxItems за один раз. Базовый уровень: Требуется реализовать функцию func Pipe(p Producer, c Consumer) error которая читает данные из источника, группирует их в буфер размером не более MaxItems и сохраняет в приемник, после чего фиксирует прогресс в источнике. */ const MaxItems = 9999 type Producer interface { // Next returns: // - batch of items to be processed // - cookie to be commited when processing is done // - error Next() (items []any, cookie int, err error) // Commit is used to mark data batch as processed Commit(cookie int) error } type Consumer interface { Process(items []any) error } func Pipe(p Producer, c Consumer) error { var buf []any var cookies []int for { items, cookie, err := p.Next() if err != nil { return err } buf = append(buf, items...) cookies = append(cookies, cookie) if len(buf) >= MaxItems { if err := c.Process(buf); err != nil { return err } for _, c := range cookies { if err := p.Commit(c); err != nil { return err } } buf = buf[:0] cookies = nil } } if len(buf) > 0 { if err := c.Process(buf); err != nil { return err } for _, c := range cookies { if err := p.Commit(c); err != nil { return err } } } return nil }
Какие HTTP-серверы в Go вам доводилось использовать?
Расскажи про базы данных — с чем работал и работаешь сейчас?
Как определяли необходимые ресурсы для сервиса в Kubernetes?
Что такое реверс-прокси и что обычно используют для его реализации?
Задача 2: Что выведет код с интерфейсами и nil? (typed nil vs untyped nil)
Расскажи подробнее о проекте в Авито — это был единственный проект за три года?
Как происходит расширение (рехэш) в Swiss Tables?
Чем занималась твоя команда и чем ты занимался?