Коли стартап тільки починається, у команди є спокуса писати код "як вийде" - головне швидко. Це зрозуміло: продукт важливіший за конвенції, дедлайн горить, людей мало. Але саме в цей момент закладається технічний борг, який потім коштує місяців рефакторингу і нервів при онбордингу нових людей.
Є простіший шлях: не вигадувати свої правила, а взяти готові - перевірені роками і тисячами інженерів у великих компаніях.
Структура проєкту: golang-standards/project-layout
Перше питання будь-якого нового розробника в команді: де що лежить? Якщо відповідь - "ну, десь тут", онбординг буде болісним.
golang-standards/project-layout - неофіційний, але широко прийнятий стандарт структури Go-проєкту. Його ідея проста: передбачувана структура знижує когнітивне навантаження.
/cmd - точки входу (main.go для кожного бінарника)
/internal - приватний код, недоступний ззовні модуля
/pkg - публічні бібліотеки
/api - специфікації (OpenAPI, protobuf)
/configs - конфігураційні файли
Стартапу не обов'язково слідувати кожному пункту буквально. Але сам принцип - розділення відповідальностей на рівні директорій - рятує від ситуації коли main.go перетворюється на 3000-рядковий монстр.
Стиль коду: Uber Go Guide і Airbnb JavaScript Style Guide
Стиль коду - це не про естетику. Це про те, щоб ревʼю займало хвилини, а не години, і щоб будь-який член команди міг читати чужий код без перемикання контексту.
Uber Go Guide - одне з найповніших зібрань практик для Go. Кілька прикладів що реально важливі:
Використовуй errors.Is замість прямого порівняння:
// Погано
if err == sql.ErrNoRows { ... }
// Добре
if errors.Is(err, sql.ErrNoRows) { ... }
Ініціалізуй слайси з відомою ємністю:
// Погано - реаллокації при кожному append
items := []string{}
// Добре
items := make([]string, 0, len(source))
Такі речі не очевидні новачку, але критичні в high-load системах.
Airbnb JavaScript Style Guide - де-факто стандарт для JS-команд. Головна цінність - він уже вирішив тисячі дрібних суперечок: var vs let/const, стрілочні функції, деструктуризація. Команді не треба витрачати час на ці дискусії.
Git-історія як документація: Conventional Commits
Більшість команд недооцінює git-логи до першого серйозного інциденту на продакшені. Коли потрібно швидко знайти "коли і чому це зламалось" - нечитабельна історія комітів стає реальною проблемою.
Conventional Commits - простий формат:
<type>(<scope>): <description>
feat(auth): add JWT refresh token rotation
fix(api): handle empty response from payment gateway
chore(deps): update go modules
Типи: feat, fix, docs, refactor, test, chore, perf.
Що це дає на практиці:
- Автоматичний changelog - інструменти на зразок
git-cliffгенерують його з комітів - Семантичне версіонування -
feat= minor,fix= patch,feat!= major - Швидкий пошук -
git log --grep="fix(payment)"одразу показує всі фікси в конкретному модулі
Висновок
Стандарти великих компаній - це не бюрократія. Це акумульований досвід тисяч інженерів, упакований у конкретні правила. Стартап, який їх ігнорує, рано чи пізно приходить до тих самих висновків - але самостійно і значно болючіше.
Не треба впроваджувати все одразу. Почни з одного: наприклад, з Conventional Commits - це займає 15 хвилин і одразу дає результат.