Ищем Middle Go Developer для разработки backend-сервисов. Предстоит самостоятельно реализовывать функции в принятой архитектуре, писать тесты и сопровождать код. Решения обсуждаем с архитектором и Senior-разработчиками. Рассматриваем также Senior-кандидатов с опытом из раздела «Будет преимуществом».
Особые условия (обратить внимание):
- Формат работы: только офис
- Тип занятости: проектная работа до 30.07.2027. После выполнения проекта рассматривается возможность оформления в штат на постоянной основе.
Чем предстоит заниматься
- Разрабатывать сервисы на Go, REST API, gRPC-взаимодействие, обработчики сообщений и операции с БД.
- Реализовывать транзакции, конкурентную обработку и фоновые задачи; работать с XML/XSD.
- Писать unit- и интеграционные тесты, проводить нагрузочное тестирование; исправлять ошибки и оптимизировать Go-код и SQL.
- Участвовать в code review, обсуждать решения с командой, поддерживать документацию API и компонентов.
Обязательные требования
От 3 лет коммерческой разработки на Go; опыт самостоятельной реализации и сопровождения функций в промышленной эксплуатации.
- Go. Структуры, указатели, slices, maps и interfaces; передача значений, общий backing array у slices и nil в интерфейсах. Небольшие интерфейсы, композиция, разделение обработчиков, прикладной логики и доступа к данным. Go modules и зависимости.
- Ошибки и ввод-вывод. Сохранение причины ошибки, errors.Is/As, defer, panic/recover. Работа с io.Reader/io.Writer, частичными чтениями; закрытие файлов и тел HTTP-ответов.
- Конкурентность. Goroutines, channels, select, sync.WaitGroup/Mutex; понимание data race и deadlock, защита общих данных, корректное закрытие channels и завершение задач. Применение ограничений параллелизма и очередей, контроль фоновых задач при остановке сервиса.
- Context. Передача context.Context в SQL и межсервисные вызовы, тайм-ауты и отмена, вызов cancel и освобождение ресурсов. Понимание, что отмена context не завершает goroutine автоматически.
- PostgreSQL. JOIN, группировки, подзапросы; PK/FK/UNIQUE/CHECK, индексы и чтение EXPLAIN. pgx/pgxpool или database/sql: параметризованные запросы, пул соединений, тайм-ауты, закрытие Rows, проверка ошибок итерации и обработка NULL. Контроль числа запросов и устранение N+1.
- Транзакции и миграции. ACID и конфликты конкурентных изменений; выполнение связанных запросов через один Tx, обработка Commit/Rollback и конфликтов записи. Отсутствие длительных сетевых вызовов внутри транзакции. Миграции goose/golang-migrate или аналогом с проверкой данных и совместимости схемы с кодом.
- REST и HTTP. Обработчики на net/http или фреймворке поверх него; OpenAPI, DTO, JSON, валидация, ошибки и пагинация. Переиспользование Client/Transport, тайм-ауты, ограничения размера запросов, обработка ошибок и ограниченные повторы с учётом идемпотентности.
- gRPC. Реализация методов по Protocol Buffers-контрактам, работа со сгенерированными клиентами, status codes, deadlines и cancellation. Сохранение совместимости сообщений.
- Доступ. Применение принятой аутентификации и авторизации, проверка прав на объект. Валидация JWT через библиотеку: подпись, допустимый алгоритм, issuer, audience и срок действия.
- Redis. Чтение и запись, TTL, правила ключей и инвалидации. Обработка отсутствующих и устаревших значений, тайм-аутов и отказа кэша с сохранением корректности приложения. Понимание отличий pipeline от атомарной операции.
- Kafka или RabbitMQ. Практика с одним брокером: topics/partitions/consumer groups/offsets либо queues/exchanges/routing keys/ack/nack. Публикация, обработка и подтверждения, повторная доставка, идемпотентность, дедупликация, ограниченные retry и DLQ. Применение существующего механизма согласования записи в БД и отправки сообщений.
- Состояния и фоновые задачи. Переходы по заданной модели, проверки допустимости, атомарные изменения, защита от повторных и конфликтующих операций. Работа с принятыми механизмами запуска, повторов и восстановления задач; расширение пакетов и обработчиков с сохранением контрактов.
- XML и XSD. encoding/xml, теги структур, пространства имён, атрибуты, кодировки и ограничения размера данных. Чтение и изменение XSD: типы, ограничения, include/import. Работа с подключённым валидатором или сервисом: ошибки проверки и контроль доступа к внешним ресурсам.
- Тестирование. testing, table-driven tests, subtests, подмена зависимостей через интерфейсы. Проверка граничных случаев, ошибок и отмены; go test -race и разбор гонок. Интеграционные тесты с PostgreSQL, Redis и брокером через Testcontainers for Go или аналог: rollback, повторы и доставка сообщений. httptest, проверка ошибок gRPC.
- Инструменты. Структурированные логи, stack trace, данные запросов и отладчик. Git, gofmt, go vet, статический анализ и code review.
Будет преимуществом
Для Middle — дополнительные навыки. Для позиции Senior эти навыки обязательны.
- Самостоятельное проектирование сервисов, границ компонентов, владения данными и контрактов; выбор синхронной или событийной модели. Переиспользуемые Go-пакеты и обоснованное применение generics.
- Go Memory Model, happens-before, sync.RWMutex, sync/atomic, errgroup. Диагностика сложных data race, deadlock и утечек goroutines.
- Проектирование worker pool, ограниченных очередей, backpressure и graceful shutdown. Потоковая обработка, частичные чтения и записи, контроль объёма данных в памяти.
- PostgreSQL: MVCC, уровни изоляции, CTE, оконные функции, SELECT FOR UPDATE, оптимистическая блокировка. Обработка deadlock и ошибок сериализации; EXPLAIN (ANALYZE, BUFFERS), составные и частичные индексы.
- Оптимизация пула соединений, пакетных операций и COPY. Миграции схем и данных с учётом блокировок и одновременно работающих версий приложения.
- Проектирование REST/gRPC-контрактов, совместимая эволюция Protobuf, interceptors. OAuth 2.0/OpenID Connect, ротация ключей проверки токенов, retry с backoff и jitter.
- Стратегии кэширования и инвалидации, singleflight и защита от массового обновления значения; транзакции Redis, Lua-скрипты и ограничения блокировок на основе TTL.
- Надёжная обработка сообщений: порядок и rebalance в Kafka, prefetch и publisher confirms в RabbitMQ; Transactional Outbox, границы at-least-once/exactly-once для брокера, БД и внешних вызовов.
- Идемпотентность через ключ операции, ограничения уникальности и сохранение результата; обработка частичного выполнения и неопределённого результата удалённого вызова.
- Проектирование фоновых задач с сохранением состояния, восстановлением после перезапуска и защитой от захвата несколькими экземплярами сервиса. Temporal или аналоги, компенсации многошаговых операций.
- Потоковая обработка больших XML через Decoder; проектирование и версионирование XSD, выбор и интеграция валидатора.
- Самостоятельная интеграция с КриптоПро: CMS/CAdES, XMLDSig, присоединённая и отсоединённая подпись, каноникализация XML, кодирование подписываемых данных. cgo: передача указателей, память Go/C, освобождение нативных ресурсов.
- Тестирование переполнения очередей, остановки и восстановления сервиса с управляемой синхронизацией; fuzzing парсеров и преобразований, benchmarks и benchmem.
- pprof, go tool trace: CPU-, heap-, goroutine-, mutex- и block-профили. Аллокации, escape analysis, GC, удержание backing arrays, лишние копирования; применение sync.Pool после измерений.
- Инструментирование кода через OpenTelemetry: метрики, трассировка, перенос контекста через HTTP/gRPC и сообщения; диагностика задержек во взаимодействующих сервисах.
- Практика NATS JetStream, OpenSearch/Elasticsearch, ClickHouse или S3-совместимого хранилища; проектирование схем данных и API.
Мы предлагаем
- Разработка нового продукта вместе с архитектором и опытными разработчиками; возможность развивать технические навыки и брать более сложные задачи.
- Оформление по ТК РФ. Уровень вознаграждения обсуждается по результатам собеседования.