Перейти к содержимому

Ozon / Озон (полный список, ч. 1)

Актуальность: 3 кв 2024

Общие рекомендации по подготовке к собесу - https://job.ozon.ru/events/32

  • Что такое страница памяти? go/memory-gc
  • Если страницы мапятся на физическую память, то каждое обращение к памяти это поиск в некоторой мапе. Как это может работать быстро? go/maps
  • Что такое hugepages? linux-os/memory
  • Что такое сисколл? linux-os/general
  • Что происходит во время вызова сискола? linux-os/general
  • Что делает сисколл fork? linux-os/processes
  • Что делает сисколл epoll? linux-os/general
  • Какие знаешь примитивы синхронизации в ОС? linux-os/general
  • Что такое user space и kernel space? Зачем нужно такое разделение? linux-os/general
  • Что такое файловый дескриптор? linux-os/filesystem
  • Что такое stdin/stdout/stderr, какие дескрипторы назначены для этих сущностей? linux-os/filesystem
  • du/dh показывает, что место в файловой системе еще есть, а записать ничего не возможно, т.к. “нет места”. Почему и как исправить? linux-os/filesystem
  • На голом сервере запущен какой-то сервис и в нем есть утечка памяти. Что произойдет, когда память закончится? Речь не про кубер и ограничения контейнеров, а про голый сервер go/memory-gc
  • На какой тип памяти система будет опираться при решении запустить OOM Killer? linux-os/memory
  • Зачем нужна виртуальная память? linux-os/memory
  • Чем отличается процесс от системного потока? go/runtime
  • А как процессы могут обмениваться информацией? linux-os/processes
  • Что такое GOMAXPROCS? Зачем это нужно? go/runtime
  • Может ли приложение с GOMAXPROCS=4 потреблять больше 4-eх ядер CPU? go/runtime
  • Разработчик дал на ревью код своего нового кэша, нам необходимо провести код-ревью nosql-cache/caching
// Кэш будет использоваться под высокой нагрузкой в проде
// Частота записи/чтения 20%/80% соответственно
func main() {
fmt.Println(GetOrCreate("hello ", "world "))
fmt.Println(Get("hello "))
}
var cache = make(map[string]string)
// GetOrCreate проверяет существование ключа key
// Если такого нет, то создает новое значение
func GetOrCreate(key, value string) string {
var m sync.Mutex
m.Lock()
value = cache[key]
m.Unlock()
if value != "" {
return value
}
m.Lock()
cache[key] = value
m.Unlock()
return value
}
func Get(key string) string {
var m sync.Mutex
m.Lock()
v := cache[key]
m.Unlock()
return v
}
  • Как устроена структура данных «хеш-таблица»? algorithms/data-structures
  • Допустим есть операция set. На вход подается ключ - строка, а значение - число. Что происходит внутри функции? go/strings-runes
  • Расскажи самую сложную или интересную инженерную задачу, которую приходилось решать hr-behavioral/about-you
  • Что выведет этот код? go/puzzles
func main() {
ch := make(chan int, 1)
for i := 0; i < 10; i++ {
select {
case x := <-ch:
print(x)
case ch <- i:
}
}
}
  • Рассказать, как устроен LRU cache algorithms/data-structures
  • Есть 3 сущности - пользователь, чат и сообщение. У пользователя есть имя и дата регистрации. У чата есть название и дата создания. У сообщения есть текст, автор и дата создания. Пользователь может состоять в нескольких чатах одновременно. Сообщение обязательно принадлежит чату, сообщение не может принадлежать более чем 1 чату одновременно Нужно описать предметную область в виде таблиц sql/general
  • Выбрать все чаты пользователя Вася в формате (chat_id,chat_name) sql/general
  • Какие еще виды соединений кроме join знаешь? sql/query-optimization
  • Что будет, если вместо join применить left join в этом запросе? sql/query-optimization
  • Что такое индекс? Сколько и какие индексы будут созданы по этой схеме? sql/indexes
  • По мере роста размеров таблиц этот запрос начинает все медленнее работать, можешь понять почему и исправить? sql/general
  • Что показывает эта команда explain? sql/query-optimization
  • Какой узел плана однозначано показывает, что не хватает индекса? sql/indexes
  • Как заполнять поле id при вставках в таблицы users, chats, messages sql/general
  • Чаты становятся популярными, число пользователей растет и нам скоро не хватит свободного места на диске для хранения всей переписки. Что нам делать? architecture/system-design
  • Какой первичный ключ лучше - числовой или uuid? sql/schema-design
  • Дана таблица «orders»: sql/general
+----+---------+---------------------+-------------+
| id | user_id | created_at | price_total |
+----+---------+---------------------+-------------+
| 1 | 111 | 2024-01-01 10:00:00 | 2 000 |
| 2 | 222 | 2024-01-02 10:00:00 | 100 |
| 3 | 111 | 2024-04-01 10:00:00 | 20 000 |
| 4 | 222 | 2024-05-01 10:00:00 | 5 000 |
| 5 | 333 | 2024-05-02 10:00:00 | 10 000 |
+-----+--------+---------------------+-------------+
Заголовок раздела «Задача: Напишите SQL-запрос, который вернет количество заказов по каждому пользователю с price_total больше или равным 1000 в таком виде отсортированному по количеству заказов в обратном порядке: algorithms/sorting-search»
+----------+-------------+
| user_id | order_count |
+----------+-------------+
| 111 | 2 |
| 222 | 1 |
| 333 | 1 |
+----------+-------------+
  • Что выведет данная программа. Почему так?
func main() {
nums := []int{1, 2, 3}
addNum(nums[0:2])
fmt.Println(nums) // ?
addNums(nums[0:2])
fmt.Println(nums) // ?
}
func addNum(nums []int) {
nums = append(nums, 4)
}
func addNums(nums []int) {
nums = append(nums, 5, 6)
}
  • Рассказать про правила работы append
  • Рассказать про синтаксис [0:2:2]
  • Что выведет этот код, и почему?
func main() {
lst := []string{"a ", "b ", "c ", "d "}
for k, v := range lst {
if k == 0 {
lst = []string{"aa ", "bb ", "cc ", "dd "}
}
fmt.Println(v)
}
}
func main() {
lst := []string{"a ", "b ", "c ", "d "}
for k, v := range lst {
if k == 0 {
lst[3] = "z "
}
fmt.Println(v)
}
}
  • Что из себя представляет протокол HTTP? Из какиx основных частей состоит HTTP запрос и HTTP ответ?
  • Какие есть основные методы HTTP?
  • Примеры HTTP хедеров?
  • Назовите классы кодов состояний HTTP
  • Какие существуют инструменты для мониторинга и отладки микросервисов?
  • Пример инструментов для сбора и отображения метрик?
  • Какая тулза используется для профилирования в Go?
  • Зачем микросервису на Go нужен хендлер /debug/vars?
  • Как посмотреть логи микросервиса живущего в kubernetes?
  • Команда top показывает, что какой-то процесс потребляет 146% CPU. Это реальная ситуация? Если дa, то нужно ли мне что-то с этим делать?
  • Как убить процесс linux ’e?
  • Что делать, если я вызываю kill и процесс продолжает работает?
  • Что такое -9?
  • Зачем нужен UDP, если он такой ненадежный?
  • Зачем нужен TCP, если он такой медленный?
  • Где применяется udp?
  • На примере создания заказа. Есть запрос на сервис и есть ответ, между этими двумя действиями мы сладываем в аналитику товары которые заказали (например для подсчета популярности товаров). Сервис аналитики переодически работает медленно или вовсе таймаутит, и мы не успеваем ответить, теряем заказы. Что делать, чтобы перестать терять заказы, и деньги соответственно?
  • Сервис аналитики не будет читать данные из нас или нашей очереди, что будем делать?
  • Отдел аналитики жалуется на высокий рпс от нас когда они под нагрузкой мы их сервис кладем. Как решить проблему?
  • Проблема с аналитикой решена. Теперь проблема с местом занимаемым нашей очередю, инфра ограничьила ресурсы(расширять дальше некуда), что делать? (На аналитику повлиять мы не можем, у них в планах переписать сервис и тд нужно свое решение)
  • Мой сервис используют внешний API для построения маршрутов, в рамках тарифа у нас есть ограничьение по RPS. Нужно спроектировать ratelimiter
  • Какие есть плюсы и минусы у одной/обоих схем?
  • Как можно оптимизировать работу с redis ’ом?
  • Есть два сервиса A и B, сервис A отправляет запросы в сервис B по HTTP. Какие существуют варианты для масштабирования сервиса B? Можно использовать любые технологии
  • Какие есть плюсы и минусы у одной/обоих схем?
  • Сколько балансировщиков будет в первой схеме?
  • Если их больше, чем один, то как приложение узнает где они запущены? (возвращаемся к оригинальной задаче)
  • Как именно будет выглядеть discovery через DNS?
  • В чем разница между REST и RPC подходами?
  • Обязательно ли делать REST поверх HTTP?
  • Обязательно ли делать RPC поверх HTTP?
  • Расскажи как RPC запрос можно переложить на HTTP-запрос?
  • А как это сделать используя только TCP?
  • В чем разница между proxy / reverse-proxy?
  • Есть таблица на 1 миллиард записей, которая активно используется в продашкне. Нужно сделать датафикс, который модифицирует 10 миллионов строк. Как бы ты подошел к решению задачи?
  • Какие типы локов (блокировок) есть в PostgreSQL? Кто берет эти локи?
  • Какие аномалии могут быть при исполнении несколько транзакций параллельно? Расскажи кратко о них
  • Что такое транзакция? Какие уровни изоляции транзакций существуют в РСУБД?
  • Построить оптимальный индекс для
SELECT*FROM employее WHERE sex ='m'AND salary >300000 AND age =20
ORDER BY created_at
  • Какие существуют общие типы ограничьений (constraint) в реляционных базах данных? Расскажите кратко о назначении каждого ограничения
  • Что произойдет если нарушить CHECK?
  • Можно ли как-то визуально улучшить сообщения об ошибках нарушения ограничения CHECK средствами БД?
  • Может ли ограничьение CHECK или UNIQUE работать на всю таблицу целиком? Если дa, приведите пример.
  • Что такое значение NULL?
  • Допустим мы создаем таблицу:
CREATE TABLE TEST_TABLE (
A serial,
B bigint,
C bigint
);
insert into test_table(b) values(5);

Что вернет следующий запрос?

  • Допустим мы создаем таблицу: sql/general
CREATE TABLE TEST_TABLE (
A serial,
B bigint,
C bigint,
PRIMARY KEY(a, c)
);
insert into test_table(b) values(5);

Что вернет следующий запрос?

  • Что происходит с таблицей при добавлении первичного ключа? sql/schema-design
  • Для чего нужны FOREIGN KEY? sql/schema-design
  • Допустим мы имеем базу данных из следующих таблиц sql/general
CREATE TABLE products (
product_no integer PRIMARY KEY,
name text,
price numeric
);
CREATE TABLE orders (
order_id integer PRIMARY KEY,
shipping_address text
);
CREATE TABLE order_items (
product_no integer REFERENCES products,
order_id integer REFERENCES orders,
quantity integer,
PRIMARY KEY(product_no, order_id)
);
  • при удалении записи из таблицы products гарантированно не удалялись все записи из таблицы order_items с тем же продуктом? sql/general
  • при удалении из таблицы заказов автоматически удалялись все записи этого заказа из order_items? sql/general
  • Приведите плюсы и минусы практики применения FOREIGN KEY sql/schema-design
  • Нужно описать модель библиотеки. Есть 3 сущности: «Автор», «Книга», «Читатель». Физически книга только одна и может быть только у одного читателя. Нужно составить таблицы для библиотеки так чтобы это учесть. sql/general
  • Написать запрос - выбрать названия всех книг которые на руках sql/general
  • Написать запрос - выбрать названия всех книг в библиотеке у которых больше 3 авторов sql/general
  • Написать запрос - выбрать имена топ 3 читаемых авторов на данный момент sql/general