клируэй #техничка

Это набор вопросов по Go, сети, БД и рабочему процессу. Технические ответы ниже сгруппированы по номерам; вопросы о личном опыте требуют ваших фактов.

Короткий ответ

Что ответить на собеседовании

Это набор вопросов по Go, сети, БД и рабочему процессу. Технические ответы ниже сгруппированы по номерам; вопросы о личном опыте требуют ваших фактов.

Подробный разбор

Ответ с пояснениями

Условие

#клируэй #техничка

  1. Что есть замечательного в Go? - горутины и планировщик, который позволяет работать не думая об этом как он работает с конкурентностью.

  2. Какие минусы видишь в Go? - обработка ошибок

  3. Как пришел к Go?

  4. За счет чего обеспечивается легковесность в Go и за счет чего Гошные потоки переключаются быстрее? Почему в ОС нельзя было так же сделать?

  5. Чем мы жертвуем, когда вместо потоков ОС используем горутины?

  6. Что такое конкурентность и параллельность?

  7. Что такое интерфейс net.Listener и какие у него методы?

  8. Работал ли на прямую с сетями или через фреймворки и какие?

  9. Чем TCP отличается от UDP и что это вообще и для чего используется?

  10. Какие есть риски при использовании TCP и UDP?

  11. Что такое bigIndian и LittleIndian?

  12. Что такое TLS?

  13. Какие есть способы по передаче данных между микросервисами (например команды/запросы/ответы/передача файлов)? Какие мы тут можем выбрать паттерны или средства разработки и какие нюансы у них?

  14. Какие у нас есть способы по передаче данных по сети и их плюсы/недостатки?

  15. С какими СУБД работал и какие средства использовал?

  16. Какую библиотеку использовал под каждую БД в гошке?

  17. Как бороться, когда БД наращивается в процессе разработки?

  18. В БД поменяли схему, поменяли поля, как решается такая задача, чтобы не грохать старые данные? миграции если делать то как и какие минусы/плюсы?

  19. Как в проде поменять БД? Кто у вас этим делал?

  20. Как лучше сделать, чтобы абстрагировать компонент работы с БД со всей основной логикой, чтобы все эти sql запросы, как метостазы не расползались по коду? Убрали в отдельную директорию и логику, а наверх прокидывали интерфейс, чтобы оборачивать и не зависить от конкретной БД + писали теги?

  21. Для чего индексы нужны и какие их минусы?

  22. Тебе поставили задачу: написать кодуль/код - чтобы ты положил в проект и чтобы ты сам делал в плане документирования результата?

  23. Какую документацию ты обычно используешь и для чего + куда оно идет? Типо что это за интерфейс, для чего он используется и т.д.? Может была какая-то такая ситуация?

  24. Как ты активно пользуешься go doc и есть ли такая практика у вас?

  25. Какие-то спеки или в маркдаун сопровождаете? И как вы это делаете?

  26. Какой у вас был воркфлоу, от кого прилетали задачи и как дальше?

  27. Насколько подробно у вас расписаны задачи? Т.е. только что нужно только заходить или как-то еще архитектурно подумать и поспрашивать у кого-то?

  28. У нас есть проект с множеством горутин. Расскажи, какие средства синхронизации используются, чтобы все горутины изящно завершались в безопасной точке?

  29. Где в проекте использовал горутины?

  30. Вот мы передаем интерфейс внутрь функции. Сколько он байт занимает?

  31. Что такое httpHandler, что он получает и что за структура и отдает, какие аргументы и сигнатура? Для чего он нужен и где он дальше используется?

  32. Что такое middleware и как его использовать? Как у вас было на проекте?

  33. Какие свойства языка Go позволяют строить эти мидлвари и что это за функция, что она принимает на вход и выдает на выход?

  34. У нас есть функция, которая принимает функцию и после выполнения заводит горутину и совершает коллбек (обратный вызов), а мы передаем туда метод структуры, который тоже ничего не принимает и не возвращает - будет ли у нас ошибка компиляции или что-то другое? Т.е. у нее сигнатура пустая, и у нас есть некоторый метод, который просит прием такой функции, а мы вместо того, чтобы передать чистую функцию - мы передали туда метод, т.е. объект.фан.

  35. Есть функция, которая принимает int32 а мы пытаемся туда передать int16, что у нас произойдет и на каком этапе?

  36. Сколько байт в памяти у нас занимает слайс на amd64 например? 24 байта, а сами данные не передаются в функцию?

  37. Как можно реализовать множество в Golang и в чем их разность и нюансы?

  38. Что такое UUID и был ли он у вас на проекте и где использовался и какой библиотекой для этого пользовался?

  39. У тебя есть мапа на 1 000 000 элементов, что произойдет если мы добавим туда еще 1 элемент. Какие возможные сценарии и как измениться скорость получения данных?

  40. Что у вас использовался докер(контейнеры/поды? И какие еще были до этого сервисы до докера, "как бинарник развернуть на сервере"? Вот ты сбилдил код, во что его нужно превратить, чтобы этот сервис стартовал при запуске ОС?

Ответ

Это набор вопросов по Go, сети, БД и рабочему процессу. Технические ответы ниже сгруппированы по номерам; вопросы о личном опыте требуют ваших фактов.

Краткая памятка по исходному списку:

  • 1–2, 4–6. Go сочетает простой язык, runtime и лёгкие горутины с растущими стеками. Планировщик переключает их поверх потоков ОС; цена — runtime, GC и меньший прямой контроль. Конкурентность означает несколько продвигающихся задач, параллелизм — одновременное выполнение. Потоки ОС решают более общую задачу изоляции и исполнения произвольного кода; сравнивать их только по скорости переключения некорректно. Явная обработка error может быть многословной, но делает ошибку частью контракта.
    1. net.Listener имеет Accept() (net.Conn, error), Close() error и Addr() net.Addr.
  • 9–12. TCP — надёжный упорядоченный поток, UDP — датаграммы без гарантий доставки. Для обоих нужны таймауты и защита ресурсов; TCP имеет ожидание потерянных данных, UDP требует собственной обработки потерь. Big-endian хранит старшие байты раньше, little-endian — младшие. TLS обеспечивает защищённый канал и проверку стороны при корректной настройке.
  • 13–14. Синхронные API подходят для немедленного ответа, брокер — для событий и отложенной работы, объектное хранилище — для больших файлов. Нужны контракты, отмена, повторы и идемпотентность; транспорт не устраняет частичные отказы.
  • 17–21. Рост БД исследуют по запросам, планам и ресурсам. Миграции делают совместимыми по схеме expand–migrate–contract: сначала расширение, затем перенос и лишь потом удаление старого. Доступ к данным изолируют адаптером за нужным приложению интерфейсом. Индексы ускоряют подходящее чтение ценой записи, памяти и обслуживания.
  • 22–25. Документируйте публичный контракт, ошибки, ограничения, запуск и проверку. Go doc использует комментарии к экспортируемым объявлениям; архитектурные решения и эксплуатацию удобно хранить рядом с кодом в Markdown. Формат должен помогать реальному потребителю.
  • 28–30. Для остановки передают context, прекращают выдачу работы и ждут завершения через WaitGroup. Канал закрывает владелец отправителей. Интерфейс в обычной 64-битной реализации занимает два машинных слова — 16 байт, без отдельного динамического объекта; это деталь реализации, не универсальная гарантия языка.
  • 31–34. http.Handler задаёт ServeHTTP(http.ResponseWriter, *http.Request) без возвращаемого значения. Middleware обычно имеет форму func(http.Handler) http.Handler. Функции первого класса и замыкания позволяют строить цепочки. Значение метода obj.Fn можно передать вместо func(), если его связанная сигнатура совпадает; receiver уже сохранён.
  • 35–38. int16 в параметр int32 не передаётся неявно — нужна явная конверсия. Дескриптор слайса на amd64 обычно занимает 24 байта, элементы остаются в базовом массиве. Множество можно представить map[T]struct{} либо map[T]bool с чётким правилом membership. UUID — 128-битный идентификатор; свойства генерации зависят от версии, а выбранную библиотеку и использование называют по фактическому опыту.
    1. Добавление миллион первого элемента map может пройти без роста либо вызвать перераспределение внутренних структур. Операции обычно имеют ожидаемую амортизированную O(1), но отдельная вставка может быть дороже; точное устройство зависит от версии Go.
    1. Скомпилированный сервис можно запускать через менеджер служб, например systemd, с отдельным пользователем, настройками запуска, логами и политикой перезапуска. Контейнер не обязателен.

Для пунктов 3, 8, 15–16, 19, 23–27, 29, 38 и 41, где спрашивают именно ваш опыт, подготовьте реальные примеры: проект, личный вклад, решение и результат. Не заменяйте их вымышленной биографией. Номер 40 в исходнике отсутствует.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее