декабря 21, 2025
15 мин. чтения

Вопросы и ответы для собеседования Junior SRE

interview
career-advice
job-search
entry-level
Вопросы и ответы для собеседования Junior SRE
Milad Bonakdar

Milad Bonakdar

Автор

Подготовьтесь к собеседованию Junior SRE с практическими вопросами по SLO, бюджету ошибок, оповещениям, инцидентам, Linux, автоматизации и Kubernetes.


Что проверяют на собеседовании Junior SRE

На собеседовании Junior SRE обычно смотрят, умеете ли вы идти от влияния на пользователей к сигналам системы: SLO, бюджету ошибок, оповещениям, инцидентам, Linux-сигналам, автоматизации, контейнерам и базовым операциям Kubernetes. Не нужно звучать как senior-инженер. Важно показать, что вы расследуете проблемы последовательно, ясно коммуницируете во время инцидента и автоматизируете повторяющуюся операционную работу без сокрытия рисков.

Используйте эти вопросы, чтобы подготовить короткие ответы и связать каждый ответ с реальным примером из проектов, учебных стендов, стажировки или наблюдения за on-call.


Основы SRE

1. Что такое Site Reliability Engineering и чем она отличается от DevOps?

Ответ: SRE — это подход Google к надежной эксплуатации производственных систем в масштабе.

Основные принципы:

  • Рассматривать операции как программную проблему
  • Максимум 50% времени на операционную работу (тяжелый труд)
  • Бюджеты ошибок для балансировки надежности и скорости
  • Беспристрастные посмертные анализы
  • Постепенные развертывания и автоматизированные откаты

SRE против DevOps:

АспектSREDevOps
ФокусНадежность и масштабируемостьСотрудничество и автоматизация
МетрикиSLI, SLO, бюджеты ошибокЧастота развертывания, время выполнения
ПодходПредписывающий (конкретные практики)Философия (культурное движение)
Тяжелый трудЯвно ограничено 50%Конкретно не определено

SRE реализует принципы DevOps с помощью конкретных практик и метрик.

Распространенность: Очень часто
Сложность: Легко


2. Объясните SLI, SLO и бюджеты ошибок.

Ответ: Это основные концепции SRE для измерения и управления надежностью:

SLI (Service Level Indicator):

  • Количественная мера уровня обслуживания
  • Примеры: Задержка, доступность, частота ошибок

SLO (Service Level Objective):

  • Целевое значение для SLI
  • Пример: "99,9% запросов выполняются успешно"

Бюджет ошибок:

  • Допустимая частота отказов (100% - SLO)
  • Используется для балансировки надежности и скорости разработки
# Пример расчета SLI/SLO
def calculate_error_budget(total_requests, failed_requests, slo_target=0.999):
    """
    Рассчитать потребление бюджета ошибок
    
    SLO: 99.9% успешных запросов
    Бюджет ошибок: 0.1% допустимых отказов
    """
    success_rate = (total_requests - failed_requests) / total_requests
    error_rate = failed_requests / total_requests
    
    # Бюджет ошибок: сколько из допустимых 0.1% мы использовали
    allowed_errors = total_requests * (1 - slo_target)
    budget_consumed = (failed_requests / allowed_errors) * 100
    
    return {
        'success_rate': success_rate,
        'error_rate': error_rate,
        'slo_target': slo_target,
        'slo_met': success_rate >= slo_target,
        'error_budget_consumed': budget_consumed,
        'remaining_budget': max(0, 100 - budget_consumed)
    }

# Пример
result = calculate_error_budget(
    total_requests=1000000,
    failed_requests=500,  # 0.05% частота ошибок
    slo_target=0.999
)

print(f"Успешность: {result['success_rate']:.4%}")
print(f"SLO достигнут: {result['slo_met']}")
print(f"Потребленный бюджет ошибок: {result['error_budget_consumed']:.1f}%")

Распространенность: Очень часто
Сложность: Средняя


3. Что такое тяжелый труд и как его уменьшить?

Ответ: Тяжелый труд — это повторяющаяся, ручная операционная работа, которая:

  • Является ручной (требует действий человека)
  • Является повторяющейся
  • Может быть автоматизирована
  • Не имеет долговременной ценности
  • Растет линейно с ростом сервиса

Примеры тяжелого труда:

  • Ручной перезапуск сервисов
  • Копирование файлов между серверами
  • Ручное масштабирование ресурсов
  • Повторяющиеся ответы на тикеты

Стратегии уменьшения тяжелого труда:

# Пример: Автоматизировать перезапуск сервиса
#!/bin/bash
# auto-restart-service.sh

SERVICE_NAME="myapp"
MAX_RETRIES=3
RETRY_DELAY=5

check_service() {
    systemctl is-active --quiet $SERVICE_NAME
    return $?
}

restart_service() {
    echo "$(date): Перезапуск $SERVICE_NAME"
    systemctl restart $SERVICE_NAME
    
    # Ждем, пока сервис стабилизируется
    sleep $RETRY_DELAY
    
    if check_service; then
        echo "$(date): $SERVICE_NAME успешно перезапущен"
        # Отправляем уведомление
        curl -X POST https://alerts.company.com/webhook \
          -d "{\"message\": \"$SERVICE_NAME автоматически перезапущен\"}"
        return 0
    else
        return 1
    fi
}

# Основная логика
if ! check_service; then
    echo "$(date): $SERVICE_NAME не работает"
    
    for i in $(seq 1 $MAX_RETRIES); do
        echo "Попытка $i из $MAX_RETRIES"
        if restart_service; then
            exit 0
        fi
        sleep $RETRY_DELAY
    done
    
    # Все попытки не удались - эскалируем
    echo "$(date): Не удалось перезапустить $SERVICE_NAME после $MAX_RETRIES попыток"
    curl -X POST https://pagerduty.com/api/incidents \
      -d "{\"service\": \"$SERVICE_NAME\", \"severity\": \"critical\"}"
    exit 1
fi

Цель SRE: Поддерживать тяжелый труд ниже 50% времени, автоматизировать остальное.

Распространенность: Очень часто
Сложность: Легко-Средняя


Мониторинг и наблюдаемость

4. В чем разница между мониторингом и наблюдаемостью?

Ответ: Мониторинг: Сбор предопределенных метрик и оповещений

  • Известные-неизвестные: Вы знаете, за чем следить
  • Панели мониторинга, оповещения, метрики
  • Примеры: ЦП, память, частота запросов

Наблюдаемость: Понимание состояния системы по выходным данным

  • Неизвестные-неизвестные: Отладка проблем, которые вы не предвидели
  • Объединенные журналы, метрики, трассировки
  • Можно ответить на произвольные вопросы
Loading diagram...

Три столпа наблюдаемости:

  1. Метрики: Агрегированные числа (ЦП, задержка)
  2. Журналы: Дискретные события
  3. Трассировки: Поток запросов через систему

Пример: Prometheus + Grafana + Loki

# Конфигурация сбора Prometheus
scrape_configs:
  - job_name: 'api-server'
    static_configs:
      - targets: ['localhost:8080']
    metrics_path: '/metrics'
    scrape_interval: 15s

Распространенность: Часто
Сложность: Средняя


5. Как настроить эффективные оповещения?

Ответ: Хорошие оповещения действенны, значимы и не вызывают усталости.

Рекомендации по оповещениям:

1. Оповещать о симптомах, а не о причинах:

# Плохо: Оповещение о высокой загрузке ЦП
- alert: HighCPU
  expr: cpu_usage > 80
  
# Хорошо: Оповещение о влиянии на пользователя
- alert: HighLatency
  expr: http_request_duration_seconds{quantile="0.95"} > 1
  for: 5m
  annotations:
    summary: "Задержка API высокая"
    description: "95-й процентиль задержки составляет {{ $value }}с"

2. Включить ссылки на runbook:

- alert: DatabaseConnectionPoolExhausted
  expr: db_connection_pool_active / db_connection_pool_max > 0.9
  for: 5m
  labels:
    severity: warning
  annotations:
    summary: "Пул подключений к базе данных почти исчерпан"
    runbook: "https://wiki.company.com/runbooks/db-connections"

3. Использовать соответствующие уровни серьезности:

# Заслуживает пейджинга (будит кого-то)
- alert: ServiceDown
  expr: up{job="api"} == 0
  for: 1m
  labels:
    severity: critical
    
# Заслуживает тикета (обработка в рабочее время)
- alert: DiskSpaceWarning
  expr: disk_free_percent < 20
  for: 30m
  labels:
    severity: warning

4. Избегать усталости от оповещений:

  • Использовать for: для избежания дребезжания
  • Группировать связанные оповещения
  • Устанавливать соответствующие пороги
  • Регулярно пересматривать и настраивать

Распространенность: Очень часто
Сложность: Средняя


Реагирование на инциденты

6. Опишите свой процесс реагирования на инциденты.

Ответ: Структурированное реагирование на инциденты минимизирует воздействие и время восстановления:

Этапы реагирования на инциденты:

Loading diagram...

1. Обнаружение:

  • Срабатывает оповещение или пользователь сообщает о проблеме
  • Подтверждаем оповещение
  • Создаем канал инцидента

2. Триаж:

# Чек-лист быстрой оценки
- Каково влияние на пользователя?
- Сколько пользователей затронуто?
- Какие сервисы затронуты?
- Становится ли хуже?

3. Смягчение:

# Общие стратегии смягчения
- Откат недавнего развертывания
- Масштабирование ресурсов
- Отключение проблемной функции
- Переключение на резервную систему
- Ограничение скорости трафика

4. Разрешение:

  • Устранение первопричины
  • Проверка возврата метрик в норму
  • Мониторинг на предмет повторного возникновения

5. Посмертный анализ (Беспристрастный):

# Шаблон посмертного анализа инцидента

## Краткое содержание
Краткое описание того, что произошло

## Влияние
- Продолжительность: 2024-11-25 10:00 - 10:45 UTC (45 минут)
- Затронутые пользователи: ~10 000 (5% от общего числа)
- Затронутые сервисы: API, Web Frontend

## Первопричина
Пул подключений к базе данных исчерпан из-за медленных запросов

## Хронология
- 10:00: Сработало оповещение о высокой задержке API
- 10:05: Инженер на дежурстве подтвердил
- 10:10: База данных определена как узкое место
- 10:15: Увеличен размер пула подключений (смягчение)
- 10:30: Определены и убиты медленные запросы
- 10:45: Сервис полностью восстановлен

## Разрешение
- Немедленное: Увеличен пул подключений со 100 до 200
- Краткосрочное: Добавлен таймаут запроса (30 с)
- Долгосрочное: Оптимизировать медленные запросы, добавить мониторинг запросов

## Элементы действий
- [ ] Добавить оповещение для медленных запросов (Владелец: Алиса, Срок: 2024-12-01)
- [ ] Реализовать таймаут запроса в приложении (Владелец: Боб, Срок: 2024-12-05)
- [ ] Просмотреть и оптимизировать 10 самых медленных запросов (Владелец: Чарли, Срок: 2024-12-10)

## Извлеченные уроки
- Мониторинг пула подключений был недостаточным
- Ухудшение производительности запросов осталось незамеченным

Распространенность: Очень часто
Сложность: Средняя


7. Как вы устраняете неполадки сервиса, испытывающего высокую задержку?

Ответ: Систематический подход к отладке:

# 1. Проверяем проблему
curl -w "@curl-format.txt" -o /dev/null -s https://api.example.com/health

# curl-format.txt:
#     time_namelookup:  %{time_namelookup}s\n
#        time_connect:  %{time_connect}s\n
#     time_appconnect:  %{time_appconnect}s\n
#    time_pretransfer:  %{time_pretransfer}s\n
#       time_redirect:  %{time_redirect}s\n
#  time_starttransfer:  %{time_starttransfer}s\n
#                     ----------\n
#          time_total:  %{time_total}s\n

# 2. Проверяем метрики приложения
# - Частота запросов (внезапный скачок?)
# - Частота ошибок (ошибки, вызывающие повторные попытки?)
# - Использование ресурсов (ЦП, память)

# 3. Проверяем зависимости
# - Время запроса к базе данных
# - Вызовы внешних API
# - Частота попадания в кеш

# 4. Проверяем инфраструктуру
top  # Использование ЦП
free -h  # Память
iostat  # Дисковый ввод-вывод
netstat -s  # Сетевая статистика

# 5. Проверяем журналы на наличие ошибок
tail -f /var/log/app/error.log | grep -i "timeout\|slow\|error"

# 6. Профилируем приложение
# Пример Python
import cProfile
cProfile.run('my_function()')

# 7. Проверяем базу данных
# Журнал медленных запросов
SELECT * FROM mysql.slow_log ORDER BY query_time DESC LIMIT 10;

# Активные запросы
SELECT pid, query, state, query_start 
FROM pg_stat_activity 
WHERE state = 'active';

Общие причины:

  • Медленные запросы к базе данных
  • Тайм-ауты внешних API
  • Нехватка памяти (паузы GC)
  • Сетевые проблемы
  • Исчерпание ресурсов
  • Неэффективные пути кода

Распространенность: Очень часто
Сложность: Средняя


Автоматизация и скрипты

8. Напишите скрипт для проверки работоспособности сервиса и его перезапуска при необходимости.

Ответ: Скрипт проверки работоспособности и автоматического восстановления:

#!/usr/bin/env python3
"""
Проверка работоспособности сервиса с возможностью автоматического перезапуска
"""
import requests
import subprocess
import time
import sys
from datetime import datetime

class ServiceMonitor:
    def __init__(self, service_name, health_url, max_retries=3):
        self.service_name = service_name
        self.health_url = health_url
        self.max_retries = max_retries
    
    def check_health(self):
        """Проверяем, работоспособен ли сервис"""
        try:
            response = requests.get(
                self.health_url,
                timeout=5
            )
            return response.status_code == 200
        except requests.exceptions.RequestException as e:
            print(f"{datetime.now()}: Проверка работоспособности не удалась: {e}")
            return False
    
    def restart_service(self):
        """Перезапускаем сервис с помощью systemctl"""
        try:
            print(f"{datetime.now()}: Перезапуск {self.service_name}")
            subprocess.run(
                ['systemctl', 'restart', self.service_name],
                check=True,
                capture_output=True
            )
            time.sleep(10)  # Ждем, пока сервис запустится
            return True
        except subprocess.CalledProcessError as e:
            print(f"{datetime.now()}: Перезапуск не удался: {e.stderr}")
            return False
    
    def send_alert(self, message, severity='warning'):
        """Отправляем оповещение в систему мониторинга"""
        try:
            requests.post(
                'https://alerts.company.com/webhook',
                json={
                    'service': self.service_name,
                    'message': message,
                    'severity': severity,
                    'timestamp': datetime.now().isoformat()
                },
                timeout=5
            )
        except Exception as e:
            print(f"Не удалось отправить оповещение: {e}")
    
    def monitor(self):
        """Основной цикл мониторинга"""
        if self.check_health():
            print(f"{datetime.now()}: {self.service_name} работоспособен")
            return 0
        
        print(f"{datetime.now()}: {self.service_name} неработоспособен")
        self.send_alert(f"{self.service_name} не работает", severity='warning')
        
        # Попытка перезапуска
        for attempt in range(1, self.max_retries + 1):
            print(f"Попытка перезапуска {attempt}/{self.max_retries}")
            
            if self.restart_service() and self.check_health():
                print(f"{datetime.now()}: Сервис восстановлен")
                self.send_alert(
                    f"{self.service_name} автоматически восстановился после перезапуска",
                    severity='info'
                )
                return 0
            
            time.sleep(5)
        
        # Все попытки не удались
        print(f"{datetime.now()}: Не удалось восстановить сервис")
        self.send_alert(
            f"{self.service_name} не удалось восстановить после {self.max_retries} попыток",
            severity='critical'
        )
        return 1

if __name__ == '__main__':
    monitor = ServiceMonitor(
        service_name='myapp',
        health_url='http://localhost:8080/health'
    )
    sys.exit(monitor.monitor())

Распространенность: Часто
Сложность: Средняя


Практики обеспечения надежности

9. Что такое runbook и почему он важен?

Ответ: Runbook — это документированная процедура для обработки операционных задач и инцидентов.

Структура Runbook:

# Runbook: Высокая задержка API

## Симптомы
- 95-й процентиль задержки API > 1 секунды
- Жалобы пользователей на медленную загрузку страниц
- Срабатывает оповещение: "HighAPILatency"

## Серьезность
**Предупреждение** — Ухудшает пользовательский опыт, но сервис функционален

## Этапы исследования

### 1. Проверяем текущие метрики
```bash
# Проверяем распределение задержки
curl -s http://prometheus:9090/api/v1/query?query='histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m]))'

# Проверяем частоту запросов
curl -s http://prometheus:9090/api/v1/query?query='rate(http_requests_total[5m])'

2. Определяем узкое место

  • Проверяем время запроса к базе данных
  • Проверяем вызовы внешних API
  • Проверяем частоту попадания в кеш
  • Просматриваем недавние развертывания

3. Проверяем зависимости

# Подключения к базе данных
mysql -e "SHOW PROCESSLIST;"

# Задержка Redis
redis-cli --latency

# Внешние API
curl -w "%{time_total}\n" -o /dev/null -s https://external-api.com/health

Этапы смягчения

Быстрые исправления (< 5 минут)

  1. Масштабируем экземпляры приложения
kubectl scale deployment api --replicas=10
  1. Временно увеличиваем TTL кеша
redis-cli CONFIG SET maxmemory-policy allkeys-lru

Если проблема не исчезнет

  1. Откатываем недавнее развертывание
kubectl rollout undo deployment/api
  1. Включаем ограничение скорости
kubectl apply -f rate-limit-config.yaml

Разрешение

  • Устраняем первопричину (медленный запрос, неэффективный код)
  • Развертываем исправление
  • Мониторим в течение 30 минут
  • Масштабируем обратно к нормальной емкости

Эскалация

Если не удается разрешить в течение 30 минут:

  • Эскалируем на: @backend-team
  • Канал Slack: #incidents
  • Дежурный: Используйте политику эскалации PagerDuty

Связанные


**Почему runbook важны:**
- Более быстрое реагирование на инциденты
- Последовательные процедуры
- Обмен знаниями
- Снижение стресса во время инцидентов
- Инструмент обучения для новых членов команды

**Распространенность:** Часто  
**Сложность:** Легко

---

### 10. Объясните концепцию изящной деградации.

**Ответ:**
**Изящная деградация** означает, что система продолжает работать с пониженной производительностью при отказе компонентов, а не полностью выходит из строя.

**Стратегии:**

**1. Feature Flags:**
```python
# Отключаем некритичные функции при высокой нагрузке
class FeatureFlags:
    def __init__(self):
        self.flags = {
            'recommendations': True,
            'analytics': True,
            'search_autocomplete': True
        }
    
    def is_enabled(self, feature):
        # Отключаем некритичные функции, если бюджет ошибок низкий
        if self.error_budget_low():
            non_critical = ['analytics', 'search_autocomplete']
            if feature in non_critical:
                return False
        return self.flags.get(feature, False)
    
    def error_budget_low(self):
        # Проверяем, если бюджет ошибок < 20%
        return get_error_budget() < 0.2

# Использование
flags = FeatureFlags()
if flags.is_enabled('recommendations'):
    show_recommendations()
else:
    # Изящная деградация - показываем статический контент
    show_popular_items()

2. Circuit Breaker:

from enum import Enum
import time

class CircuitState(Enum):
    CLOSED = "closed"  # Нормальная работа
    OPEN = "open"      # Сбой, отклоняем запросы
    HALF_OPEN = "half_open"  # Проверяем восстановление

class CircuitBreaker:
    def __init__(self, failure_threshold=5, timeout=60):
        self.failure_threshold = failure_threshold
        self.timeout = timeout
        self.failures = 0
        self.last_failure_time = None
        self.state = CircuitState.CLOSED
    
    def call(self, func, *args, **kwargs):
        if self.state == CircuitState.OPEN:
            if time.time() - self.last_failure_time > self.timeout:
                self.state = CircuitState.HALF_OPEN
            else:
                # Возвращаем fallback вместо вызова сбойного сервиса
                return self.fallback()
        
        try:
            result = func(*args, **kwargs)
            self.on_success()
            return result
        except Exception as e:
            self.on_failure()
            return self.fallback()
    
    def on_success(self):
        self.failures = 0
        self.state = CircuitState.CLOSED
    
    def on_failure(self):
        self.failures += 1
        self.last_failure_time = time.time()
        if self.failures >= self.failure_threshold:
            self.state = CircuitState.OPEN
    
    def fallback(self):
        # Возвращаем закешированные данные или ответ по умолчанию
        return {"status": "degraded", "data": []}

# Использование
breaker = CircuitBreaker()
result = breaker.call(external_api_call, user_id=123)

3. Timeouts and Retries:

import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry

def create_resilient_session():
    session = requests.Session()
    
    # Стратегия повторных попыток
    retry = Retry(
        total=3,
        backoff_factor=0.3,
        status_forcelist=[500, 502, 503, 504]
    )
    
    adapter = HTTPAdapter(max_retries=retry)
    session.mount('http://', adapter)
    session.mount('https://', adapter)
    
    return session

# Использование с таймаутом
session = create_resilient_session()
try:
    response = session.get('https://api.example.com/data', timeout=5)
except requests.exceptions.Timeout:
    # Изящная деградация - используем закешированные данные
    response = get_cached_data()

Распространенность: Часто
Сложность: Средняя


Основы контейнеризации

11. Что такое Docker и чем он отличается от виртуальных машин?

Ответ: Docker — это платформа контейнеризации, которая упаковывает приложения с их зависимостями.

Контейнеры против виртуальных машин:

Loading diagram...

Основные различия:

ФункцияКонтейнерыВиртуальные машины
Время запускаСекундыМинуты
РазмерМБГБ
Использование ресурсовЛегкоеТяжелое
ИзоляцияУровень процессаУровень оборудования
ОСОбщая ОС хостаОтдельная ОС для каждой ВМ

Основы Docker:

# Скачиваем образ
docker pull nginx:latest

# Запускаем контейнер
docker run -d \
  --name my-nginx \
  -p 8080:80 \
  nginx:latest

# Список запущенных контейнеров
docker ps

# Просмотр журналов
docker logs my-nginx

# Выполняем команду в контейнере
docker exec -it my-nginx bash

# Останавливаем контейнер
docker stop my-nginx

# Удаляем контейнер
docker rm my-nginx

Пример Dockerfile:

# Базовый образ
FROM python:3.12-slim

# Устанавливаем рабочий каталог
WORKDIR /app

# Копируем зависимости
COPY requirements.txt .

# Устанавливаем зависимости
RUN pip install --no-cache-dir -r requirements.txt

# Копируем код приложения
COPY . .

# Открываем порт
EXPOSE 8000

# Проверка работоспособности
HEALTHCHECK --interval=30s --timeout=3s \
  CMD curl -f http://localhost:8000/health || exit 1

# Запускаем приложение
CMD ["python", "app.py"]

Сборка и запуск:

# Собираем образ
docker build -t myapp:1.0 .

# Запускаем с переменными окружения
docker run -d \
  --name myapp \
  -p 8000:8000 \
  -e DATABASE_URL=postgres://db:5432/mydb \
  -e LOG_LEVEL=info \
  myapp:1.0

# Просмотр использования ресурсов
docker stats myapp

Docker Compose (Multi-container):

services:
  web:
    build: .
    ports:
      - "8000:8000"
    environment:
      - DATABASE_URL=postgresql://db:5432/mydb
    depends_on:
      - db
      - redis
    restart: unless-stopped
  
  db:
    image: postgres:14
    environment:
      - POSTGRES_DB=mydb
      - POSTGRES_PASSWORD=secret
    volumes:
      - postgres_data:/var/lib/postgresql/data
  
  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"

volumes:
  postgres_data:

Запускаем с Docker Compose:

# Запускаем все сервисы
docker compose up -d

# Просмотр журналов
docker compose logs -f web

# Масштабируем сервис
docker compose up -d --scale web=3

# Останавливаем все сервисы
docker compose down

Рекомендации:

  • Используйте официальные базовые образы
  • Минимизируйте количество слоев
  • Не запускайте от имени root
  • Используйте .dockerignore
  • Правильно помечайте образы тегами
  • Сканируйте на наличие уязвимостей

Распространенность: Очень часто
Сложность: Легко-Средняя


Контроль версий и развертывание

12. Объясните рабочие процессы Git и как вы обрабатываете развертывания.

Ответ: Git необходим для контроля версий и автоматизации развертывания.

Общий рабочий процесс Git:

Loading diagram...

Основные команды Git:

# Клонируем репозиторий
git clone https://github.com/company/repo.git
cd repo

# Создаем ветку для фичи
git checkout -b feature/add-monitoring

# Вносим изменения и коммитим
git add .
git commit -m "Add Prometheus monitoring"

# Отправляем в удаленный репозиторий
git push origin feature/add-monitoring

# Обновляем из main
git checkout main
git pull origin main
git checkout feature/add-monitoring
git rebase main

# Сливаем фичу (после одобрения PR)
git checkout main
git merge feature/add-monitoring
git push origin main

Стратегия ветвления:

1. Gitflow:

  • main: Код, готовый к производству
  • develop: Ветка интеграции
  • feature/*: Новые фичи
  • release/*: Подготовка релиза
  • hotfix/*: Срочные исправления

2. Trunk-Based Development:

# Кратковременные ветки для фич
git checkout -b feature/quick-fix
# Работаем < 1 дня
git push origin feature/quick-fix
# Сливаем в main сразу

Итог

Готовьтесь к собеседованию Junior SRE через практику SLO, оповещений, реагирования на инциденты, Linux-траблшутинга и безопасной автоматизации. Хороший ответ не просто перечисляет команды: он начинается с влияния на пользователей, проверяет надежные сигналы, снижает риск и фиксирует выводы для команды.

Newsletter subscription

Еженедельные советы по карьере, которые действительно работают

Получайте последние идеи прямо на вашу почту

Создайте резюме, которое поможет вам устроиться на 60% быстрее

За несколько минут создайте персонализированное резюме, совместимое с ATS, которое доказано увеличивает количество собеседований в 6 раз.

Создать лучшее резюме

Поделиться этим постом

Сократите Время Написания Резюме на 90%

Средний соискатель тратит более 3 часов на форматирование резюме. Наш ИИ делает это менее чем за 15 минут, ускоряя переход к этапу подачи заявки в 12 раз.