Гофер — junior Golang backend developer. Портфолио

привет! я

ГОGO!ФЕР

junior Golang backend developer

делаю REST API, телеграм-ботов и парсеры на Go —
чисто, идиоматично и с тестами

Гофер за рабочим столом с мониторами

пет-проект №1 · сервис коротких ссылок

Shortify
main.go — роутер chi
func main() {
r := chi.NewRouter()
r.Use(middleware.Logger)
r.Post("/api/links", h.Create)
r.Get("/s/{hash}", h.Redirect)
http.ListenAndServe(":8080", r)
}
200 OK8 msGET /s/aB3xK9
{
"hash": "aB3xK9",
"url": "https://example.com/…",
"ttl": 3600
}
карточки кликабельны — нажмите, чтобы приблизить

Работа над проектом

Разрабатывал REST API на Go: роутер chi, слои
handler → service → repository, JWT-авторизацию
и PostgreSQL. Покрыл логику юнит-тестами
и собрал всё в Docker-контейнер

Изометрическая сцена API-сервера

Архитектура

Собрал слоистую структуру:
handlers → service → repository —
каждый слой в своём пакете

Middleware для логирования,
recover и rate-limit —
паника не роняет сервис

service.go
// service.go — слой бизнес-логики
type Service struct {
repo Repo // интерфейс, не реализация
cache *redis.Client
}
func (s *Service) Resolve(
ctx context.Context, hash string,
) (string, error) {
if u, ok := s.cache.Get(ctx, hash); ok {
return u, nil
}
return s.repo.FindByHash(ctx, hash)
}
нажмите на терминал, чтобы приблизить
Гофер рядом с базами данных

База данных

Спроектировал схему PostgreSQL:
таблицы users и links,
составные индексы
и миграции golang-migrate

usersid bigint PKemail textcreated_at timestamplinksid bigint PKhash text UNIQUEurl text1 — ∞CREATE INDEX ON links (user_id, hash);↑ составной индекс под частые запросы
ER-схема и миграции
EXPLAIN ANALYZE
Index Scan using links_hash_idx
cost=0.42..8.44 rows=1
actual time=0.09..0.11
✓ планировщик счастлив
EXPLAIN вместо гаданий
полароиды кликабельны
Спидометр и графики

Нагрузочное
тестирование

Гонял сервис wrk’ом: 4 200 RPS
при p99 = 84 мс. Нашёл N+1,
добавил кэш в Redis —
и стало вдвое быстрее

p99 latency
84 ms
p99 latency · wrk 12 потоков
RPS
4 200
RPS · 8 соединений
полароиды кликабельны
Коллекция объектов пет-проектов

Прочие пет-проекты

парсер вакансий
парсер вакансийcolly · PostgreSQL
CLI-трекер задач
CLI-трекер задачcobra · sqlite
go-генератор паролейcrypto/rand
пора делать ретро!
уже бегу
стендап-ботнапоминает про демо
гофер-стикерпак
гофер-стикерпакну почти
парсер вакансий
парсер вакансийcolly · PostgreSQL
CLI-трекер задач
CLI-трекер задачcobra · sqlite
go-генератор паролейcrypto/rand
пора делать ретро!
уже бегу
стендап-ботнапоминает про демо
гофер-стикерпак
гофер-стикерпакну почти
всё на GitHub — код открыт, звезды приветствуются
Бумажный самолётик в облаках

пет-проект №2 · телеграм-бот

Petrovich
Привет! Пора кодить — стендап через 10 минут
уже бегу!
нажмите, чтобы приблизить

Работа над проектом

Писал бота на Go с library telebot: FSM-сценарии диалогов,
инлайн-кнопки, напоминания по cron и деплой на VPS

Конвейер с роботами

Фоновые задачи

Вынес рассылки и напоминания в воркеры: Redis-очередь и планировщик —
бот не подвисает даже на 10 000 уведомлений за раз

asynq · cron · graceful shutdown
Стена мониторов с графиками

Мониторинг и метрики

Поднял Prometheus и Grafana: runtime-метрики Go, pprof-эндпоинты
и алерты в телеграм — узнаю о проблеме раньше пользователей

p99 latency · shortify
84 ms
p99 latency84 ms — стало после кэша
requests / sec
4 200
RPSпик в обеденные часы
gc pause, ms
0.9
GC pauseruntime Go
42goroutines
goroutinesстабильно, без утечек
Grafana
Grafanaдашборд сервиса
p99 latency · shortify
84 ms
p99 latency84 ms — стало после кэша
requests / sec
4 200
RPSпик в обеденные часы
gc pause, ms
0.9
GC pauseruntime Go
42goroutines
goroutinesстабильно, без утечек
Grafana
Grafanaдашборд сервиса
алерт приходит в телеграм — как раз туда, где я и так живу
Конвейер CI/CD с ракетой

CI/CD

Настроил пайплайн в GitHub Actions:
линтер, тесты, сборка Docker и деплой

lintgolangci-lint
testgo test ./…
builddocker build
deploypush на VPS

А это бэкенд для одного
зелёного банка...

Подробнее расскажу
на собеседовании :)