Middle-разработчик — это качественный скачок от Junior. Это уже не просто исполнитель задач из трекера, а самостоятельный участник команды, способный решать задачи от постановки до деплоя, думающий о бизнес-ценности и способный вести диалог с заказчиком. При найме Middle вы ищете не просто человека, умеющего писать на Go — вы ищете инженера, который закроет задачу целиком и будет двигать продукт вперед.
Чем Middle отличается от Junior
Самостоятельность
Middle берет задачу в формате user story и доводит до продакшена. Он сам разбирается в требованиях, проектирует решение, реализует, покрывает тестами и раскатывает в production. Вам не нужно расписывать каждый шаг — достаточно обозначить цель и ожидаемый результат.
Архитектурное мышление
Middle думает о структуре модулей, зависимостях, тестируемости и масштабируемости. Он видит систему целиком, понимает как его код встраивается в общую архитектуру, и может предложить альтернативные решения с обоснованием trade-offs.
Понимание бизнес-контекста
Middle спросит: «Зачем нужна эта фича? Как она влияет на метрики продукта? Может, есть альтернативное решение, которое быстрее доставит ценность?» Он понимает, что код — это средство доставки бизнес-ценности, а не самоцель.
Техническая глубина
Middle понимает, КАК работают горутины, планировщик, сборщик мусора. Он может профилировать производительность приложения, находить узкие места и оптимизировать их с измерениями до и после. Он не угадывает, а измеряет и принимает решения на основе данных.
Коммуникация
Middle проактивно коммуницирует: сообщает о блокерах, рисках, предлагает альтернативные решения. Он может объяснить техническое решение нетехническому человеку — PM, заказчику, руководителю — на понятном языке без избыточного жаргона.
На что обращать внимание при найме Middle
При собеседовании Middle-разработчика оценивайте не только технические навыки, но и способность мыслить как владелец продукта. Задавайте себе вопросы:
- Может ли он спроектировать микросервис с нуля? От выбора технологий до структуры репозитория, от API дизайна до observability.
- Способен ли вести техническую дискуссию с аргументацией всех «за» и «против»? Не «я так думаю», а «вариант А дает нам X, но стоит Y; вариант Б дает Z, но требует дополнительно W».
- Понимает ли он компромиссы? Производительность и читаемость, сложность и гибкость, time-to-market и техдолг.
- Готов ли взять ответственность за целый модуль или сервис? Не просто написать код, а владеть им: поддерживать, мониторить, реагировать на инциденты.
- Может ли объяснить техническое решение менеджеру или заказчику? Без жаргона. Простым языком, фокусируясь на ценности для бизнеса.
- Думает ли он о доставке ценности, а не только о написании кода? Спрашивает ли о приоритетах, предлагает ли урезать объём работ ради скорости, понимает ли что такое MVP.
Middle — это будущий Senior или Tech Lead. Вложения времени и денег в правильного Middle’а окупается кратно, потому что через год-два он способен стать опорой команды.
Темы (кратко)
Технические темы (8 штук)
Конкурентность и синхронизация — горутины, каналы, select, context, race conditions, deadlock, примитивы синхронизации. Ожидается понимание модели конкурентности Go, и умение применять правильные инструменты для решения задач.
Управление памятью и производительность — стек против кучи, escape analysis, профилирование (через pprof), бенчмаркинг, оптимизация аллокаций, понимание работы сборщика мусора.
Работа с базами данных — database/sql, lib/pq, pgx, sqlx, транзакции, пулы соединений, миграции, понимание ACID и уровней изоляции.
Паттерны проектирования и архитектура — чистая архитектура, DDD основы, SOLID принципы в Go, инъекция зависимостей, интерфейсы как контракты, разделение на слои (handlers, services, repositories).
Протоколы и API дизайн — лучшие практики REST и GRPC, middleware, context propagation, graceful shutdown, rate limiting, аутентификация и авторизация, идемпотентность.
Тестирование в Go — табличные тесты, моки (testify, gomock), покрытие тестами, интеграционное тестирование, бенчмарки.
Обработка ошибок и устойчивость — оборачивание ошибок (errors.Is, errors.As), retry паттерны, экспоненциальный backoff, circuit breaker, graceful degradation.
Observability и диагностика — структурированные логи (slog), метрики (Prometheus), трейсинг (OpenTelemetry), health проверки, readiness пробы, мониторинг производительности.
Soft skills и бизнес-ориентация (4 темы)
Декомпозиция задач и оценка сроков — умение разбить фичу на подзадачи, реалистичная оценка с учетом рисков, понимание треугольника scope-time-quality, коммуникация при сдвиге сроков.
Коммуникация с заказчиком — выявление реальных требований и проблем (техника «5 почему»), управление ожиданиями, объяснение технических ограничений нетехническому человеку, проактивность в коммуникации.
Приоритизация и фокус на ценности — понимание MVP vs полнофункциональная версия, умение отказаться от over-engineering, выбор решения исходя из бизнес-целей, time-to-market против совершенства кода.
Код ревью и командная работа — опыт ревью кода (как автор и ревьювер), конструктивная критика кода, менторинг джуниоров, работа в распределенной команде, линтеры.
Темы (подробно)
1. Конкурентность и синхронизация
Что проверяем: Понимание модели конкурентности Go, умение выбрать правильный примитив синхронизации для конкретной задачи, знание типичных проблем (race conditions, deadlocks, утечка рутин), практический опыт с отмены context’а операций.
Критерии оценки:
| Уровень | Ожидания |
|---|---|
| Не прошел | Путает горутины и потоки ОС, не знает про гонку данных |
| Проходной минимум | Объясняет горутины и каналы, знает sync.Mutex, sync.RWMutex, sync.WaitGroup, пакет errgroup |
| Хороший middle | Знает select, context, может выбрать между каналом и мьютексом |
| Сильный middle | Понимает планировщик, знает про GOMAXPROCS, умеет диагностировать deadlock, объясняет паттерн «worker pool» |
Примеры вопросов/задач:
Теория: Чем отличается горутина от потока ОС? Что произойдет, если создать миллион горутин?
Практика: Напишите worker pool, который обрабатывает задачи из канала с ограничением количества воркеров. Как корректно завершить все воркеры при получении сигнала остановки?
Диагностика: Дан код с race condition — найдите и исправьте:
var counter int for i := 0; i < 100; i++ { go func() { counter++ // race! }() }Пакет context: Как использовать
context.Contextдля отмены долгих операций? Когда использоватьWithTimeoutvsWithDeadlinevsWithCancel? Приведите пример HTTP-хендлера, который прерывается при отмене запроса от клиента.Продвинутое: Что такое deadlock? Приведите пример кода, который гарантированно приведет к deadlock. Как диагностировать deadlock в production?
На что обращать внимание:
- Упоминает ли race detector (
go test -race) - Знает ли про утечки горутин и как их избежать (всегда закрывать каналы, использовать context)
- Понимает ли разницу работы и реализации между буферизированным и не буферизированным каналом
- Может ли объяснить, когда использовать
sync.Mutex, когдаsync.RWMutex, а когдаatomicоперации - Знает ли про
context.WithValueи его ограничения
Полезные ссылки и материалы (Go 1.23-1.25):
- Go 1.24: новые методы
T.Context()иB.Context()для тестов с автоматической отменой - Go 1.25:
WaitGroup.Go()для удобного запуска горутин без ручного Add/Done - Ссылки: Data Race Detector, Context package
2. Управление памятью и производительность
Что проверяем: Понимание модели памяти Go: стек, куча, сборщик мусора, escape analysis. Что это, зачем, как влияет на производительность, умение бенчить, профилировать и оптимизировать код.
Критерии оценки:
| Уровень | Ожидания |
|---|---|
| Не прошел | Не знает про GC, не слышал про pprof |
| Проходной минимум | Понимает базово GC, знает что аллокации на куче медленнее стека |
| Хороший middle | Умеет пользоваться pprof, понимает escape analysis, писал бенчмарки |
| Сильный middle | Читает assembly вывод, оптимизировал реальный код с измерениями до/после, понимает компромиссы оптимизаций |
Примеры вопросов/задач:
Теория: Когда переменная попадает на стек, а когда на кучу? Что такое escape analysis? Как компилятор принимает решение?
Практика: Даны два варианта функции — какой быстрее и почему?
// Вариант 1 func process1() *Result { r := Result{} return &r // escapes to heap } // Вариант 2 func process2() Result { r := Result{} return r // может остаться на стеке }Профилирование: Как найти, какая функция в вашем сервисе потребляет больше всего CPU/RAM? Опишите шаги использования pprof.
Бенчмарки: Напишите бенчмарк для функции конкатенации строк. Как убедиться, что компилятор не оптимизировал код (dead code elimination)? Что такое
b.N/b.Loop()и как Go подбирает это значение?Тонкая настройка GC: В каких случаях имеет смысл настраивать
GOGC? Приведите пример сценария. Какие есть альтернативы настройке GC?
На что обращать внимание:
- Упоминает ли
go build -gcflags="-m"для проверки escape analysis - Знает ли про pprof (CPU, memory, goroutine)
- Понимает ли компромисс между производительностью и читаемостью
- Умеет ли оценить, стоит ли оптимизация затраченного времени
- Знает ли про
sync.Poolдля переиспользования объектов - Упоминает ли benchstat как инструмент статистического анализа результатов
Полезные ссылки и материалы (Go 1.24-1.25):
- Go 1.24: новая реализация map на базе Swiss Tables (2-3% прирост производительности)
- Go 1.24:
b.Loop()для защиты от dead code elimination в бенчмарках - Статья: Бенчмарки и оптимизация в Go
- Официальное руководство по диагностике Go программ: Diagnostics
3. Работа с базами данных
Что проверяем: Практический опыт с PostgreSQL/MySQL из Go, понимание database/sql, lib/pq, pgx, sqlx — когда что использовать, знание про транзакции, уровни изоляции, пуллинг соединений, умение избежать типичных проблем (SQL инъекции, утечка соединений).
Критерии оценки:
| Уровень | Ожидания |
|---|---|
| Не прошел | Не работал с БД из Go, не знает database/sql |
| Проходной минимум | Использовал database/sql или GORM, понимает базовые запросы и транзакции |
| Хороший middle | Знает pgx, понимает транзакции, connection pooling, миграции |
| Сильный middle | Оптимизировал запросы, использовал prepared statements, знает уровни изоляции ACID, понимает в чём PostgreSQL измеряет дороговизну запроса |
Примеры вопросов/задач:
Теория: В чем разница между
database/sql,pgxиsqlx? Когда что использовать? Какие преимущества дает pgx над pq?Транзакции: Как правильно обернуть несколько операций в транзакцию в Go? Что делать при ошибке в середине транзакции? Покажите пример с rollback и commit.
Connection pooling: Как настроить размер пула соединений? Что такое
MaxOpenConns,MaxIdleConnsиConnMaxLifetime? Как выбрать правильные значения для высоко-нагруженного сервиса?Миграции: Какие инструменты для миграций знаете (например goose)? Как откатывать миграции? Как организовать миграции в production с минимальным простоем?
На что обращать внимание:
- Знает ли про
context.Contextв database/sql для таймаутов и отмены запросов - Понимает ли prepared statements и защиту от SQL инъекций (параметризованные запросы)
- Может ли объяснить ACID и уровни изоляции (Read Uncommitted, Read Committed, Repeatable Read, Serializable)
- Упоминает ли про индексы, EXPLAIN ANALYZE для оптимизации запросов
- Знает ли про graceful shutdown для закрытия соединений с БД
Полезные ссылки и материалы:
- database/sql context support (доступен с Go 1.8+)
- pgx v5 — текущая мажорная версия, значительно быстрее database/sql
- Статья: Database/SQL Tutorial, pgx GitHub
4. Паттерны проектирования и архитектура
Что проверяем: Знание базовых паттернов (репозиторий, инъекция зависимостей, фабрика), понимание SOLID принципов применительно к Go, умение структурировать код (слоистая архитектура и чистая архитектура), опыт рефакторинга.
Критерии оценки:
| Уровень | Ожидания |
|---|---|
| Не прошел | Весь код в одном файле/пакете, нет структуры |
| Проходной минимум | Разделяет handlers/services/repositories, знает интерфейсы |
| Хороший middle | Понимает инъекцию зависимостей, использует паттерны осознанно, может обосновать выбор |
| Сильный middle | Может спроектировать микросервис с нуля, понимает разницу для применения паттернов, объясняет выбор архитектуры через бизнес-требования |
Примеры вопросов/задач:
SOLID: Объясните принцип единственной ответственности. Приведите пример нарушения в Go-коде. Как его исправить?
Инъекция зависимостей: Как внедрять зависимости в Go, где располагать интерфейсы? Покажите на примере структуры с несколькими зависимостями.
Паттерн репозиторий: Зачем нужен? Как выглядит интерфейс репозитория для User? Какие методы должны быть? Что должно возвращаться при ошибках?
Архитектура: Как бы вы структурировали REST API сервис на Go? (handlers, services, repositories, models). Какие слои и зачем? Как будут зависеть друг от друга?
Рефакторинг: Даётся «God Object» (1000+ строк, 20+ методов, все в одном файле) — как разбить на модули? С чего начать? Какие метрики использовать для оценки качества рефакторинга?
На что обращать внимание:
- Использует ли интерфейсы для абстракций (инверсия контроля)
- Понимает ли принцип «принимает интерфейсы, возвращаем структуры»
- Знает ли про циклические зависимости и как их избежать
- Упоминает ли про package-oriented design
- Понимает ли компромиссы между простотой и гибкостью
Полезные ссылки и материалы:
- Effective Go — обязательное чтение для Middle
- Go Proverbs — философия языка
- Статья: Монолит vs микросервисы
5. HTTP и API дизайн
Что проверяем: Опыт построения REST API или gRPC сервисов, знание middleware, понимание graceful shutdown, rate limiting, аутентификация, авторизация, HTTP/2 особенности.
Критерии оценки:
| Уровень | Ожидания |
|---|---|
| Не прошел | Не писал HTTP сервисы в Go |
| Проходной минимум | Использовал net/http или gin/echo, знает handlers и routing |
| Хороший middle | Понимает middleware, context propagation, graceful shutdown, знает REST |
| Сильный middle | Проектировал API с версионированием, rate limiting, observability, понимает идемпотентность |
Примеры вопросов/задач:
Лучшие практики REST: Как бы вы спроектировали CRUD API для блога? (ручки, HTTP методы, статус-коды). Какой метод будем использовать для получения списка постов? Для создания? Для обновления?
Middleware: Напишите middleware для логирования всех HTTP запросов (метод, URL, продолжительность, статус). Как передать ID запроса через цепочку middleware?
Graceful shutdown: Как корректно остановить HTTP сервер при получении SIGINT или SIGTERM, не оборвав существующие запросы?
Rate limiting: Как реализовать простой rate limiter на уровне приложения? (token bucket, sliding window). Где хранить состояние? Что возвращать клиенту при превышении лимита?
Аутентификация: JWT или сессии — плюсы и минусы каждого подхода? Где хранить JWT на клиенте? Как обрабатывать refresh tokens?
На что обращать внимание:
- Знает ли про context для передачи специфичных для запроса данных (user ID, request ID, трейсинг)
- Понимает ли идемпотентность HTTP методов (GET, PUT — идемпотентны, POST — нет)
- Упоминает ли CORS, HTTPS, заголовки (CSP, X-Frame-Options, HSTS)
- Знает ли про HTTP/2, HTTP/3 особенности в Go (переиспользование соединений)
- Понимает ли versioning (через URL или через заголовок)
Полезные ссылки и материалы:
- net/http: https://pkg.go.dev/net/http
- Go 1.22+ улучшенный роутинг (ServeMux паттерны с поддержкой
{id}плейсхолдера) - Graceful shutdown пример:
httpServer.Shutdown(ctx)
6. Тестирование в Go
Что проверяем: Практика написания юнит-тестов, табличные тесты (идиома Go), использование моков (testify/mock, gomock), интеграционные тесты, понимание покрытия тестами и ограничений.
Критерии оценки:
| Уровень | Ожидания |
|---|---|
| Не прошел | Не пишет тесты, не знает testing пакет |
| Проходной минимум | Пишет базовые unit tests, знает t.Run для вложенных тестов |
| Хороший middle | Использует табличные тесты, использует моки, анализирует покрытие, понимает разницу юнит-тестом и интеграционным |
| Сильный middle | Покрывает интеграционные сценарии, знает testcontainers, пишет бенчмакри |
Примеры вопросов/задач:
Табличные тесты: Напишите табличные тесты для функции, которая валидирует email адреса. Как организовать тестовые случаи? Что делать с негативными кейсами?
Моки: Как протестировать сервис, который ходит в БД и внешний API, не поднимая реальные зависимости? (интерфейсы + моки). Покажите пример с testify/mock.
Покрытие: Как измерить покрытие тестами? Какой процент покрытия считается хорошим? Почему 100% покрытия не гарантирует отсутствие багов?
Интеграционные тесты: Как бы вы тестировали HTTP сервер с реальной БД? Когда имеет смысл писать интеграционные тесты, а когда достаточно юнит-теста?
На что обращать внимание:
- Использует ли testify или пишет чистый testing (оба подхода валидны)
- Знает ли про
t.Parallel()для параллельных тестов и когда его не стоит использовать - Понимает ли разницу между unit, integration и e2e тестами
- Упоминает ли про testcontainers для интеграционных тестов с реальными БД
- Знает ли про бенчмарки и их связь с производительностью
Полезные ссылки и материалы:
- Go 1.24:
T.Context()иB.Context()для контекста в тестах с автоматической отменой - testing package: https://pkg.go.dev/testing
- Статья: Бенчмарки и оптимизация в Go
7. Обработка ошибок и устойчивость
Что проверяем: Понимание обработки ошибок в Go (error как значение, не исключение), error wrapping (errors.Is, errors.As) с Go 1.13+, retry patterns, exponential backoff, circuit breaker, graceful degradation и fallback механизмы.
Критерии оценки:
| Уровень | Ожидания |
|---|---|
| Не прошел | Игнорирует ошибки (_ = err) или всегда паникует |
| Проходной минимум | Проверяет ошибки, использует fmt.Errorf |
| Хороший middle | Использует error wrapping (%w), понимает ситуации когда приемлемо использовать panic |
| Сильный middle | Реализовал retry, circuit breaker, понимает fault tolerance паттерны, может объяснить fail-fast vs fault-tolerant |
Примеры вопросов/задач:
Error wrapping: В чем разница между
fmt.Errorf("%w", err)иfmt.Errorf("%v", err)? Когда использовать каждый вариант?Sentinel errors: Что это? Приведите пример из стандартной библиотеки (
io.EOF,sql.ErrNoRows).Retry pattern: Реализуйте функцию retry с экспоненциальным backoff и максимальным количеством попыток. Как обрабатывать context cancellation во время retry?
Circuit breaker: Что это и когда применять? Приведите пример сценария (внешний API недоступен). Какие состояния у circuit breaker?
Паника или ошикба: Когда в Go использовать panic, а когда возвращать error? Что делать с panic из сторонних библиотек?
На что обращать внимание:
- Знает ли
errors.Is()иerrors.As()(Go 1.13+) и разницу между ними - Понимает ли
context.Cause()для извлечения причины отмены (Go 1.20+) - Упоминает ли fallback механизмы (кэширование старых данных при недоступности API)
- Может ли объяснить fail-fast и fault-tolerant подходы, когда и что применять
- Знает ли про библиотеки для retry (cenkalti/backoff, avast/retry-go)
- Понимает ли кастомные error типы и когда их использовать
Полезные ссылки и материалы:
- errors package: https://pkg.go.dev/errors
- Go 1.23:
context.AfterFunc()для cleanup операций - Go blog: Working with Errors in Go 1.13
8. Observability и диагностика
Что проверяем: Структурированные логи (slog в Go 1.21+), метрики (Prometheus), трейсинг (OpenTelemetry), health checks, readiness probes (для Kubernetes), понимание трёх столпов наблюдаемости.
Критерии оценки:
| Уровень | Ожидания |
|---|---|
| Не прошел | Использует fmt.Println для логирования в проде |
| Проходной минимум | Использует logrus или zap, логирует ошибки и важные события |
| Хороший middle | Использует structured logging (slog), экспортирует метрики (Prometheus) |
| Сильный middle | Настраивал трейсинг, понимает пользу распределенного трейсинга, понимает зачем требуется сэмплирование |
Примеры вопросов/задач:
Структурированные логи: Чем отличается от обычного текстового? Покажите пример с slog. Какие уровни логирования использовать и для чего?
Метрики: Какие метрики вы бы собирали для HTTP сервиса? (latency, throughput, errors). В чем разница между counter, gauge, histogram, summary?
Health checks: Как реализовать
/health(liveness) и/ready(readiness) endpoints для Kubernetes? В чем разница? Что проверять в каждом?Трейсинг: Что такое trace, span, trace ID? Зачем нужно распределенный трейсинг? Как передавать trace context между сервисами?
Уровни логов: Когда использовать DEBUG vs INFO vs WARN vs ERROR? Что логировать в production, а что только в dev/stage среде?
На что обращать внимание:
- Знает ли slog (стандартная библиотека с Go 1.21)
- Понимает ли типы метрик в Prometheus и когда какой использовать
- Может ли объяснить сэмплинг в трейсинге (не трейсить 100% запросов для снижения издержек)
- Знает ли про три столпа наблюдаемости (logs, metrics, traces)
- Понимает ли компромиссы наблюдаемости (компромисс издержек и прозрачности)
Полезные ссылки и материалы:
- пакет slog: https://pkg.go.dev/log/slog
- OpenTelemetry Go: https://opentelemetry.io/docs/languages/go/
- Prometheus client: https://github.com/prometheus/client_golang
9. Декомпозиция задач и оценка сроков
Что проверяем: Умение разбить задачу на подзадачи, реалистичная оценка с учетом рисков, понимание что «быстро» не равно «хорошо», коммуникация при сдвиге сроков, понимание треугольника scope-time-quality.
Критерии оценки:
| Уровень | Ожидания |
|---|---|
| Не прошел | Не может разбить задачу, оценки всегда оптимистичны («сделаю за день») |
| Проходной минимум | Разбивает на шаги, даёт оценку с запасом |
| Хороший middle | Учитывает тестирование, код-ревью, документацию в оценке, задает уточняющие вопросы |
| Сильный middle | Выделяет риски, предлагает инкременты ценности (MVP → v2 → v3) |
Примеры вопросов/задач:
Практика: Задача — «Добавить фильтрацию пользователей по ролям в REST API». Разбейте на подзадачи и оцените время на каждую. Что может пойти не так?
Риски: Какие риски вы учитываете при оценке задачи? (неопределенность, зависимости от других команд, технический долг, незнакомые технологии)
Неопределенность: Как оценивать задачу, если не знаете технологию или предметную область? (spike, time-boxing, исследование, proof of concept)
MVP мышление: Как бы вы приоритизировали функции для MVP версии продукта? Что включить в первую итерацию, что отложить на v1, что на v2?
Задержка: Понимаете, что не успеваете в срок. Что делаете? (сообщить заранее, предложить урезать объём, перенести дедлайн, обосновать решение)
На что обращать внимание:
- Задает ли уточняющие вопросы перед оценкой (формализация требований)
- Упоминает ли тестирование, документацию, код-ревью как часть работы (а не только кодинг)
- Понимает ли разницу между прогнозом и обещанием
- Может ли объяснить компромисс между объёмом работы и сроками (треугольник scope-time-quality)
- Понимает ли, что чем дальше в будущее, тем больше неопределенность
- Закладывает ли буфферы для непредвиденных проблем
10. Коммуникация с заказчиком
Что проверяем: Умение выявлять реальные требования (не принимать постановку на веру), управление ожиданиями, объяснение технических ограничений нетехническому человеку, проактивность в коммуникации, техника «5 почему».
Критерии оценки:
| Уровень | Ожидания |
|---|---|
| Не прошел | Избегает общения с заказчиком, только пишет код |
| Проходной минимум | Отвечает на вопросы, может показать демо, реагирует на обратную связь |
| Хороший middle | Задает уточняющие вопросы, предлагает альтернативы, управляет ожиданиями |
| Сильный middle | Выявляет скрытые требования («5 почему»), управляет ожиданиями проактивно, предлагает поэтапную доставку |
Примеры вопросов/ситуаций:
Выявление требований: Заказчик говорит «Мне нужна быстрая система». Какие вопросы зададите? (быстрая — это сколько мс? для какого сценария? сколько пользователей? что критичнее — задержка или пропускная способность?)
Объяснение ограничений: Как объясните, что «добавить эту кнопку» займет неделю? (рефакторинг, тесты, интеграции, ревью безопасности, деплой)
Альтернативы: Заказчик хочет фичу за 2 дня, но это нереалистично. Ваши действия? (предложить упрощенную версию, фича-тогглы, инкременты ценности)
Демо: Как проводите демонстрацию новой фичи? (готовите сценарий, подготовленные данные, фокус на ценности, а не на технических деталях)
Обратная связь: Заказчик недоволен результатом. Как реагируете? (слушаем, уточняем ожидания, предлагаем улучшения, не защищаемся)
На что обращать внимание:
- Использует ли технику «5 почему» для выявления причин запроса (почему нужна эта фича? какую проблему решаем?)
- Может ли объяснить техдолг без жаргона (не «рефакторинг монолита», а «ускорим добавление новых фич»)
- Предлагает ли поэтапную доставку ценности вместо «всё разом» (показывать прогресс раньше, для ранней обратной связи)
- Понимает ли разницу между «что хочет заказчик» и «что ему реально нужно»
- Упоминает ли про циклы обратной связи и итеративность
- Умеет ли сказать «нет» с обоснованием и альтернативами
11. Приоритизация и фокус на ценности
Что проверяем: Понимание разницы MVP и полнофункциональной версии, умение отказаться от over-engineering, выбор решения исходя из бизнес-целей, понимание компромисса time-to-market и совершенства кода, YAGNI принцип.
Критерии оценки:
| Уровень | Ожидания |
|---|---|
| Не прошел | «Код должен быть идеальным» — перфекционизм без учета контекста |
| Проходной минимум | Понимает, что иногда «работает» важнее чем «красиво» |
| Хороший middle | Выбирает уровень качества исходя из важности фичи, понимает техдолг |
| Сильный middle | Аргументирует решения через бизнес-метрики (выручка, DAU/MAU, engagement) |
Примеры вопросов/ситуаций:
MVP: Что вы включите в MVP для интернет-магазина? Что отложите на v2? (каталог, корзина, оплата — обязательно; избранное, отзывы, рекомендации — v2)
Техдолг: Когда можно взять задачи на техдолг (быстрая доставка критична, конкурентное преимущество), а когда нельзя (платежная система, безопасность, комплаенс)?
Over-engineering: Приведите пример, когда вы отказались от «красивого» решения в пользу простого. Почему? Какие были компромиссы?
Компромиссы: Микросервисы или монолит — как принять решение для стартапа из 5 человек? (монолит проще, быстрее MVP, меньше операционных издержек)
Бизнес-ценность: Как оценить, принесет ли оптимизация (ускорение на 100ms) бизнес-ценность? (зависит от сценария: страница оплаты — критично, админ-панель — не важно)
На что обращать внимание:
- Понимает ли что «хорошо» важнее «идеально» (80/20 правило, парето принцип)
- Может ли объяснить, что каждая неделя задержки = упущенная выручка
- Упоминает ли про циклы обратной связи и итеративную разработку (лучше запустить простое и улучшить, чем долго делать идеальное)
- Понимает ли YAGNI (You Aren’t Gonna Need It) — не делать того, что не нужно сейчас
- Может ли обосновать выбор через бизнес-метрики, а не только через технические критерии
12. Ревью кода и командная работа
Что проверяем: Опыт ревью кода (как автор и как ревьювер), конструктивная критика кода, менторинг джуниоров, работа в распределенной команде и CI/CD интеграции.
Критерии оценки:
| Уровень | Ожидания |
|---|---|
| Не прошел | Не понимает зачем нужно ревью кода, воспринимает критику лично |
| Проходной минимум | Участвует в ревью, исправляет замечания, оставляет комментарии |
| Хороший middle | Дает конструктивные комментарии, менторит джуниоров, понимает баланс улучшений стиля и критических проблем |
| Сильный middle | Создает культуру качества в команде, автоматизирует проверки в CI пайплайнах, асинхронная коммуникация |
Примеры вопросов/ситуаций:
Процесс кодревью: Как вы проводите ревью? На что обращаете внимание? (логика, тесты, читаемость, безопасность, производительность)
Конструктивная критика: Что скажете на плохой код, не демотивируя автора? (фокус на код, не на человека; объяснить почему; предложить альтернативы)
Менторинг: Джуниор написал код с проблемами. Как поступите? (объясняете почему проблема, даете ссылки на лучшие практики, примеры)
Конфликт: Коллега не согласен с вашим комментарием в ревью. Ваши действия? (обсуждаем, приводим аргументы, идем на компромисс, эскалируем если нужно)
Лучшие практики: Какие практики ревью вы считаете обязательными? (автоматизация, чек-листы, фокус на важное, асинхронность)
На что обращать внимание:
- Упоминает ли про автомтизаицю (golangci-lint, staticcheck, CI/CD пайплайны) — автоматизация рутины
- Понимает ли разницу между мелочами и критичными замечаниями (логика, безопасность)
- Знает и понимаем асинхронную коммуникацию в распределенных командах (подробные комментарии в PR, не «давай созвонимся»)
Теги: