Список вопросов МТС

Секция 1, системный минимум, начальные вопросы

  • Что такое стек? Что такое рекурсия?

  • Как в Go вы можете повлиять, попадет ли что-то в стек или хип (кучу)?

  • Что такое структура данных? Что такое переменная? Что есть регистр? Указатель?

  • Поток ОС, процесс ОС — что такое, чем отличается горутина? Расскажите о памяти в данном контексте?

  • Что такое контейнеры, ВМ? отличие ВМ от контейнера, виды гипервизоров?

  • Как ОС управляет памятью? Страницы, виртуальная память?

  • Иерархия памяти. Фенсинг, барьеры, зачем?

  • Ядро ОС, syscalls, cgroups, systemd; systemd vs. docker?

  • Как убить процесс Linux по имени? Еще какие способы? Недостатки и преимущества? Что такое jobs?

  • Как сконфигурировать доступ SSH по ключу на свежепроинсталлированный Linux?

  • Как посмотреть логи в Linux? Второй способ?

  • Что такое дедлоки?

  • Race conditions?

  • Идемпотентность?

Секция 2, минимум по Golang

  • Синтаксис switch — чем отличается от других языков?

  • Система типов

— Type switch — Reflection

  • Slices (90% кандидатов отсеиваются на этих вопросах)

— Что есть слайсы? — Что есть массивы? — Три способа создать слайс? Создать слайс с размером 0 и емкостью N? — Слайсы передаются в функцию по указателю, по значению или как-то еще? — Append — пожалуйста, расскажи, как это напишешь? Как это работает? Насколько увеличится массив? Капасити пустого слайса? Аппенд к очень большим слайсам? — Удалить элемент слева (в начале)? В середине? — Есть бесконечный цикл, новые элементы аппендятся, первый элемент постоянно удаляется. — Как много памяти съест такой слайс со временем (рассказать в деталях)? — Вы передаете слайс в функцию, аппендите элемент и возвращаете слайс обратно —будет ли возвращенный слайс иметь тот же самый нижестоящий массив? — Вы передаете слайс в функцию, аппендите элемент и возвращаете слайс обратно — будет ли возвращенный слайс использовать тот же нижележащий массив, что и оригинальный слайс? (детали) — Есть слайс s1 с 50 элементами. Ты берешь s2=s1[30:40], затем анмаршалишь JSON в s2. — Можно ли ожидать, что элементы 30..40 в s1 проапдейтятся, или что произойдет? —Можно ли взять пойнтер на элемент слайса? Почему?

  • Строки в Го

— Иммутабельность — Руны — Как итерировать по рунам? — Оверхед использования рун, и вообще анализ в деталях

  • Конкурентность (это еще одна тема, которую каждый кандидат должен предельно четко понимать; многие выучили мантру, что конкурентность не равно параллелизм, но нужно убедиться, что он правда понимает это, а не заучил формулу).

— Что такое горутины, потоки? Сколько и каких создается по умолчанию? — Что они из себя представляют? Как много памяти занимают? Что если нужно больше стекового пространства? — Как горутины мапятся на потоки ОС и на ядра процессора? — Можно ли принудительно завершить горутину извне ее? Хорошо, вам правда это нужно, как вы решите эту задачу? — Могут ли быть утечки горутин? Возможно ли это на практике? Приведите пример, как это может произойти и как вы будете устранять причину?

  • Каналы (продолжение про конкурентность)

— У вас есть канал, из которого читаете, и некоторая блокирующая операция ввода-вывода, например сетевой сокет. Расскажите, как вы сможете объединить обе операции чтения в один общий цикл, так что бы не было ситуации блокировки и игнорирования данных в канале? — Еще раз — что есть каналы по сути, какие бывают (два вида)? — Вы пишете в небуферизированный канал, из которого никто не читает — что произойдет? — Что такое блокировка (по существу)? — У вас есть канал, несколько горутин читают из него. Вы записываете сообщение в канал. — Какая горутина получит его? — Что делать, если вам нужно, чтобы получили все? — Что если количество читающих горутин переменное, как вы решите эту задачу? — Что произойдет, если вы будете читать из закрытого канала? — Как это может быть с пользой использовано? Есть ли стандартные библиотеки языка, работа которых построена на этом поведении каналов? — Что произойдет, если вы попытаетесь записать в закрытый канал? — Хорошо, но предположим, что вам нужно точно убедиться, что этого не произойдёт. Как вы поступите, есть ли какие-то методологии по этому поводу? Предположим вы не можете ничего гарантировать, но как вам обезопаситься от паники при записи в канал? — Range над каналом — Вы записали некоторые данные в буферизованный канал, и закрыли его. Можете ли вы прочитать эти данные обратно? — У вас есть канал и вы хотите посылать в него данные только в том случае, если он готов их принять. Вы не можете позволить себе блокироваться и ждать записи. Как вы поступите? — Опишите два или три варианта, как можно поступить, и сравните их. Что если канал не буферизован? — Вы можете позволить себе заблокироваться на операции с каналом, но не более чем на 5 сек — как вы это реализуете? — У вас есть библиотечная блокирующаяся функция, и без таймаута, но вы не можете себе позволить блокироваться без таймаута. Как вы сделаете обертку над ней, чтобы обеспечить таймаут? — Можно ли определить, что канал полон? — А можно ли определить, что он пуст? А если у нас есть канал для передачи данных, и перед завершением горутины хотим убедиться, что он пуст. Каков корректный способ это обеспечить? — Почему “Uber best practices” рекомендует устанавливать емкость всех буферизованных каналов в 1 или иначе очень хорошо подумать, если там любая другая цифра? С чем это связано? — Можно ли изменить размер буфера канала? — Хорошо, вам очень это нужно, как вы реализуете это? — Какие виды данных можно передавать через каналы? Можно ли передать другой канал? Пустую структуру? Зачем это может быть нужно? — Всегда ли эффективнее передавать через каналы данные по указателю, или по значению — проведите сравнение и анализ. — Как можно имплементировать RPC поверх каналов? То есть как коммуницировать с N горутин и получать ответы асинхронно от каждой отдельно? — Как реализовать приоритезацию среди набора каналов? (Это самый хитрый вопрос. Если кандидат успешно расскажет как — он молодец.)

  • Синхронизация (конкурентность, часть 3)

— Что такое waitgroups? — Мьютексы — что это, что под капотом, какие виды бывают? — Контексты: виды контекстов? Какой от них прок? Предположим, контекстов нет, — как вы имплементируете их сами? Как остановить net/http сервер? — Семафоры и мьютексы: как имплементировать семафор с помощью канала? Как использовать канал вместо мьютекса? — Мьютексы vs каналы: что лучше, что по этому поводу говорит «официальный Го» и что типично в проектах? Преимущества и недостатки — провести анализ-сравнение. Какие еще есть средства взаимодействия (перечислить хотя бы еще два)? — Deadlocks: что представляют собой, как их детектировать, как понять, что это случилось? Как искать причину, дебажить? Как с ними бороться, стратегии по предотвращению? Как должна вести себя программа, если это произошло? Могут ли быть при использовании каналов? Могут ли быть при использовании внешних ресурсов? Является ли умышленная блокировка горутины дедлоком? Привести примеры, как сделать дедлок в Go. — Что такое гонки? [Задаем все те же вопросы, что и про дедлоки]

  • Сборщик мусора и управление памятью

— Что это такое и как он работает? — Можно ли его остановить, отключить, форсировать выполнение? — Можно ли так написать программу, чтобы сборщику нечего было делать, или хотя бы минимизировать его работу? Какие паттерны наоборот приводят к избыточной нагрузке на сборщик? — Стек vs хип (куча). — Аллокация в стеке или на куче — от чего это зависит, как на это можно влиять? Escape analysis? — Как мониторить циклы сборщик и расходование памяти? Каковы характерные графики? — Как понять, что у вас утечка памяти? — Как утечку дебажить (искать причину)? — Как отследить утечку горутин? Пример — как такое может случиться? Как посмотреть количество горутин?

  • Maps

— vs. hash set? — Что такое хэш-функция? … (а здесь место вашему воображению, читатель — см. комментарий в начале списка!)

  • ООП

— Embedding? — Interfaces? — “Exported” vs “not exported”? — … (а здесь место вашему воображение, читатель — см. комментарий в начале списка!)

  • Ошибка

— Как создать новую ошибку? — Новый тип? — Проще, например, из строки? — Как отследить, что возвращается конкретная ошибка? — error.Is(), error.As(); — %w в формате строки?

  • Управление репозиториями, проектами и зависимостями

— Управление зависимостями. — Go mod. — Вендоринг зависимостей. — Проксирование и кэширование. — Использование кэширования как неявного вендоринга. — Чем модуль отличается от пакета? — Допускает ли Go циклические импорт? Почему? — Нам нужен циклический импорт — что делать? — Использование интерфейсов для инверсии зависимостей? — Способы организации кода?

Секция 3, форматы данных

  • JSON

  • Формат gob — что это?

  • XML

  • YAML

  • protobuf

— Генерация? — Где используется? — Как еще используется, кроме grpc?

Секция 4, базы данных

  • Основное

— Реляционные? — Нереляционные? — Какова разница? Можно ли все виды задач решить в одном или другом классе БД? — Уровни изоляции данных: Read uncommitted? Read committed? Repeatable read? Serializable?

  • 2PC (заодно пусть расскажет что это): Задачка про транзакцию над несколькими внешними БД, можно пример про отпуск и билеты.

— Consistency? — Eventual consistency? — Индексы — какие бывают? По назначению? Внутреннее устройство? Имплементация внутри, какие бывают варианты имплементаций? Индексы для геоданных?

  • Репликация

— Шардирование? — Мастер / слейв? — Какие еще варианты бывают? — Ограничения и сравнительный анализ?

  • Отказоустойчивость

— Инструменты? — Сплит брейн в БД?

  • Redis, Postgres, MongoDB, et al

—Какие библиотеки вы используете (по каждой БД которую говорит что использовал (способ проверить использовал ли — если нет, сразу тут падает))? —Отличия, особенности, и т.д.?

  • PostgreSQL

— Предназначение pgbouncer? — Типы пуллинга? — Ограничения? — Производительность? — Клиентский пуллинг в Го?

Секция 5, сети

  • Что такое L2, L3, L4, L7? Детали и примеры.

  • IP адреса, маски, DNS?

  • VPN и бриджевание L2 или L3 — в чем разница?

  • Что такое ARP-запрос?

  • Вы вводите в строке браузера google.com и нажимаете Enter — расскажите за 3 минуты в деталях, что дальше будет происходить? (с этого можно начать)

  • HTTP

  • Как такой запрос выглядит?

  • TCP?

  • TLS?

  • UDP?

  • Расскажите о преимуществах и недостатках, проведите сравнительный анализ, приведите примеры, где использовали бы одно, а где другое.

  • Что такое порты? А сокеты? В чем разница?

  • Расскажите что такое RPC?

  • Что такое REST?

— OpenAPI, Swagger? — Чем REST отличается от RPC? — Может ли REST быть имплементирован не поверх HTTP? С примером? — Возможно ли кэшировать REST? RPC? — Балансировка нагрузки, RPC vs. REST? — RESTful, REST-like — что это значит?

  • GRPC

— Что это, чем отличается (кроме использования protobuf)? — Особенности балансировки?

Секция 6, брокеры, очереди сообщений

  • Общее

— push или pull? — Режимы доставки at least once, at most once, exactly once? — А вообще возможен ли 1= (exactly once)? — Что такое персистентность? — Расскажите о идемпотентности? — Расскажите о split brain?

  • Паттерны

— Multicast / fanout, job distribution? — Продолжите список

  • Kafka

— Партиции — Оффсеты — Персистентность — Consumer groups — Наиболее распространенные библиотеки, и расскажите об опыте использования?

  • AMQP / RabbitMQ (если он работал с ним)

  • NATS (если он работал с ним)

  • NATS Streaming / JetStream (если он работал с ним)

  • и т.д.

Секция 7, инфраструктура и архитектура

  • Docker

— Что такое Layers? — Что такое Containers?

  • Kubernetes (или альтернативы)?

  • Шаблоны микросервисной архитектуры?

— Монолит vs микросервисы? — Стоит ли делать новый продБукт монолитным — преимущества и недостатки? — Как монолит может упереться в потолок производительности, и что делать? — Какие могут быть подходы при распиле монолита на микросервисы?

  • Межсервисное взаимодействие

— Синхронное? — Асинхронное? — Событийное взаимодействие? — Сага, два вида. Конечный автомат, персистизация состояния (в контексте оркестрационной саги)? — 2PC? — Eventual consistency vs. strict consistency — детали? — CQRS, event sourcing? — Audit log? — Варианты интеграции, плюсы и минусы?

Секция 8, алгоритмы

  • Деревья

— B-tree? — Trie, prefix tree? — Другие виды?

Last updated