Перейти к содержимому
На этой странице

Базовые вопросы · часть 2

Все темы Go Developer

Что такое CI/CD?

CI/CD (Continuous Integration / Continuous Deployment) — это методики и набор практик для автоматизации разработки, тестирования и развертывания программного обеспечения. В контексте Go (Golang) это включает следующие ключевые моменты:

  1. Continuous Integration (CI):

    • Автоматическое тестирование и сборка кода при каждом изменении.

    • Использование инструментов, таких как Jenkins, GitHub Actions, GitLab CI/CD или Travis CI.

    • Проверка, что новый код совместим с существующим и не ломает функциональность.

  2. Continuous Deployment (CD):

    • Автоматическое развертывание нового кода на рабочие серверы после успешного прохождения всех тестов.

    • Обеспечение минимального времени простоя и быстрой доставки новых функций пользователям.

    • Использование оркестрационных инструментов, таких как Kubernetes, Docker, Ansible, Terraform.

Для проектов на Go это может включать:

  • Написание юнит-тестов с использованием пакета testing.

  • Настройку CI/CD пайплайнов для автоматической сборки Go приложений.

  • Автоматический запуск go vet и выбранного линтера, например Staticcheck.

  • Сборку и упаковку приложений в Docker-контейнеры.

  • Развертывание приложений в облачные среды или на серверы.


Что такое линтеры (linters) зачем они нужны и как их использовать?

Линтеры (linters) — это инструменты для анализа исходного кода, которые автоматически проверяют его на наличие ошибок, нарушение стиля и других потенциальных проблем.

Зачем нужны линтеры:

  1. Повышение качества кода: Линтеры помогают обнаружить ошибки и проблемные места еще на этапе написания кода.

  2. Соблюдение стиля: Линтеры проверяют, что код соответствует установленным стандартам кодирования, делая его более читаемым и поддерживаемым.

  3. Уменьшение количества багов: Раннее выявление ошибок помогает снизить количество багов в будущем.

Как использовать линтеры:

  1. Установка: выберите поддерживаемый анализатор. golint архивирован; Staticcheck устанавливается командой go install honnef.co/go/tools/cmd/staticcheck@latest. go vet входит в инструментарий Go.

  2. Запуск: выполните go vet ./… и, если установлен Staticcheck, staticcheck ./… в каталоге модуля.

  3. Интеграция в CI/CD: Линтеры часто интегрируются в CI/CD пайплайны, чтобы автоматизировать проверку качества кода при каждом коммите.

Примеры линтеров для разных языков:

  • Go: go vet и Staticcheck.

  • Python: pylint, flake8

  • JavaScript: eslint


Как можно измерить использование памяти в Go? Что такое pprof?

Для измерения использования памяти в Go можно использовать пакет runtime:

package main

import (
	"fmt"
	"runtime"
)

func main() {
	var m runtime.MemStats
	runtime.ReadMemStats(&m)
	fmt.Printf("Allocated: %v KB\\n", m.Alloc/1024)
	fmt.Printf("Total Allocated: %v KB\\n", m.TotalAlloc/1024)
	fmt.Printf("Heap Allocated: %v KB\\n", m.HeapAlloc/1024)
	fmt.Printf("Heap Objects: %v\\n", m.HeapObjects)
}

pprof — это инструмент для профилирования производительности и памяти приложений Go. Он позволяет собирать и анализировать данные о CPU, памяти, горутинах и блокировках.

Как использовать pprof:

  1. Импорт пакета:

    import _ "net/http/pprof"
  2. Добавление в код:

    import (
        "net/http"
        _ "net/http/pprof"
    )
    
    func main() {
        go func() {
            log.Println(http.ListenAndServe("localhost:6060", nil))
        }()
        // Ваше приложение
    }
  3. Запуск и доступ:

    • Запустите приложение.

    • Откройте браузер и перейдите по адресу http://localhost:6060/debug/pprof/.

  4. Анализ данных:

    • Снимите профили памяти и CPU.

    • Проанализируйте их с помощью команды go tool pprof.

Пример команды для анализа профиля CPU:

go tool pprof "http://localhost:6060/debug/pprof/profile?seconds=30"

Что такое Prometheus и Grafana? Зачем они нужны?

Prometheus — это система мониторинга и сбора метрик с открытым исходным кодом, предназначенная для мониторинга и оповещения.

Основные функции:

  • Сбор метрик: Сбор данных с различных источников в реальном времени.

  • Хранение данных: Эффективное хранение временных рядов данных.

  • Запросы и анализ: Использование языка запросов PromQL для анализа данных.

  • Оповещения: Настройка правил оповещений на основе собранных данных.

Grafana — это платформа для визуализации данных с открытым исходным кодом.

Основные функции:

  • Визуализация: Создание интерактивных и настраиваемых дашбордов.

  • Интеграция: Поддержка множества источников данных, включая Prometheus.

  • Мониторинг в реальном времени: Отображение данных и метрик в реальном времени.

  • Оповещения: Настройка уведомлений на основе метрик и данных.

Пример использования:

  1. Prometheus собирает метрики из приложения.

  2. Grafana визуализирует эти метрики в виде графиков и дашбордов.

  3. Настраиваются оповещения в Grafana на основе данных из Prometheus для своевременного уведомления о проблемах.

Вместе, Prometjeus и Grafana образуют мощный инструмент для мониторинга и управления инфраструктурой.


Как defer может изменить именованный результат функции?

При return expr функция сначала присваивает выражение именованным результатам, затем выполняет deferred calls в обратном порядке и только после этого возвращает значения вызывающему. Поэтому deferred closure может прочитать и изменить именованный результат, например добавить контекст к err. Это допустимо, но легко скрывает управление потоком, особенно с несколькими return и shadowing. Лучше использовать такой приём только для симметричного post-processing, сохраняя короткую функцию и явное имя результата. У неименованного результата defer не может заменить уже подготовленное значение через локальную переменную.

Собеседования: Go

Смотри записи интервью, узнай, какие вопросы задают и как отвечают кандидаты.

Вопросы и ответы

Не нашли ответ? Напишите мне в чат. Я делаю Шпаргалку и сам отвечаю на сообщения. Расскажите, что не работает или чего вам не хватает. Может, смогу сразу взять это в работу.

Откуда взяты вопросы?

Из реальных собеседований. Основой подборки стал опыт Вадима Новосёлова: он проходил интервью и записывал вопросы. Подробнее о материалах.

Насколько эти вопросы актуальны?

Эти вопросы встречались нам на реальных собеседованиях в 2025 году. Мы регулярно проходим собеседования и пополняем подборку новыми вопросами. Основы профессии и ключевые технологии остаются востребованными годами, а детали конкретных инструментов и версий стоит сверять с текущей документацией.

На какой уровень рассчитана подборка?

Мы проходили собеседования на вакансии уровня Middle+, а иногда и на Senior-позиции. Вопросы из этих интервью вошли в подборку. Направления работы: Go-разработчик, Backend-разработчик на Go. Глубина обсуждения зависит от вакансии: будь готов объяснить основную идею, привести практический пример и разобрать ограничения и альтернативы решения.

Этот вопрос точно будет на моём собеседовании?

Гарантии нет: набор вопросов зависит от компании, задач команды, уровня вакансии и самого интервьюера. Эти вопросы уже встречались на реальных собеседованиях, но на твоём интервью ту же тему могут проверить другой формулировкой, практической задачей или обсуждением твоего опыта. Используй подборку, чтобы разобраться в теме: объясняй идею своими словами, приводи примеры и готовься обсудить ограничения и альтернативы решения. Так будет проще ответить и на знакомый вопрос, и на неожиданные уточнения.