API и контракты
Контракт описывается первым: proto внутрь контура, GraphQL или OpenAPI наружу. Код клиента и сервера генерируется из него, а не дописывается руками.
- buf: линтер и реестр proto
- gqlgen: схема → типы Go
- развитие без ломки клиентов
Услуга · разработка backend
Берём серверную часть целиком или отдельный модуль внутри вашей команды. Решения принимает тот же человек, который их пишет, — поэтому схема архитектуры и код не расходятся.
Стек
Набор небольшой и намеренно скучный: всё перечисленное стоит у нас в продакшене, а не изучается на вашем проекте.
Объём работ
Backend — это не «написать эндпоинты», а доменная модель, контракты, схема данных, обмен с чужими системами и то, что видно дежурному в три часа ночи. Шесть слоёв, за которые мы отвечаем.
Контракт описывается первым: proto внутрь контура, GraphQL или OpenAPI наружу. Код клиента и сервера генерируется из него, а не дописывается руками.
Правила предметной области живут в пакете, который не знает ни про HTTP, ни про SQL: их можно проверить тестами без базы и без сети.
Схему проектируем под запросы, а не под ORM: типы, ограничения целостности, внешние ключи и индексы, которые реально выбирает планировщик.
Событие не теряется между коммитом в базу и публикацией: транзакционный Outbox, идемпотентные обработчики, повторы с нарастающей паузой.
Сервис рассказывает о себе сам: сквозной идентификатор запроса в логах, метрики по каждому обработчику, распределённая трассировка.
Права проверяются на сервере при каждом вызове, секреты не живут в коде, а вход валидируется до попадания в домен — не «прикрутим в конце».
Инварианты
Это не про оформление и длину строк. Пять правил, которые мы не нарушаем ни в спринте, ни в срочной задаче перед релизом: именно они отличают кодовую базу, которую можно передать другому разработчику, от той, которую дешевле переписать.
Статус документа меняется не присваиванием поля из любого места кода, а переходом, который агрегат разрешает или отклоняет ошибкой. Таблица допустимых переходов лежит рядом с агрегатом и покрыта тестами: провести отменённый заказ невозможно не потому, что мы договорились так не делать, а потому что метода для этого нет.
order.Confirm() → ErrInvalidTransition
Домен не знает ни про HTTP-коды, ни про gRPC-статусы: он возвращает собственные ошибки, которые вызывающий разбирает через errors.Is и errors.As. Перевод в код ответа происходит один раз, на границе транспорта, — поэтому «не найдено» не приезжает клиенту как 500, а сравнений текста ошибки по подстроке в коде нет.
errors.Is(err, ErrNotFound) → codes.NotFound
Никаких пакетных переменных, синглтонов и работы в init(): всё нужное приходит параметрами конструктора — репозиторий, часы, логгер, клиент соседнего сервиса. Список зависимостей виден в сигнатуре, а не выясняется на четвёртый час отладки; тест подставляет свою реализацию без библиотек подмены рантайма.
func NewOrderService(r Repo, c Clock) *Service
Модуль отдаёт наружу интерфейс и структуры данных, всё остальное закрыто в internal. Обращаться к чужой таблице напрямую, минуя владеющий ею модуль, нельзя — как и звать транспорт из домена. Правило проверяет линтер в CI, а не память ревьюера: так монолит остаётся модульным дольше первого квартала.
domain ← service ← transport
У каждой миграции есть встречная: накат и откат прогоняются в пайплайне на пустой и на наполненной базе. Тяжёлые операции разводятся во времени — добавить и заполнить, переключить чтение, только затем удалить старое. Выкладка перестаёт требовать ночного окна.
goose up → goose down → goose up
Форматы
Один инженер уровня архитектора вместо команды из трёх джунов и менеджера-переводчика между вами и кодом. Меняется не состав, а то, как этот инженер встроен в вашу работу.
Когда задача очерчена и нужен закрытый результат в календарном окне.
2 неделификсированная стоимость
Когда нужна серверная часть целиком: от доменной модели до выкладки.
Под ТЗсмета после дискавери
Когда команда есть, но некому принимать решения и держать планку.
Part-timeзагрузка обсуждается
СтоимостьФикс. смета
Ни один из форматов не продаётся по прайсу: цена зависит от предметной области, состояния кода и числа внешних систем, которые придётся учитывать. Фиксированную стоимость считаем после короткого созвона — суммой, а не «вилкой от и до». Оплата по этапам.
Информация на сайте, включая описание форматов сотрудничества, не является публичной офертой. Итоговая стоимость, состав работ и сроки фиксируются в договоре с ИП Диденко М. С.
Кейсы
Два продакшена на одном фундаменте: Go, gRPC внутри контура, генерируемые контракты и обратимые миграции. Разные предметные области — одинаковые правила.
Логистика · микросервисы
Автоматизация логистических операций: сервисы за централизованным API-шлюзом, вход через LDAP и JWT, логи через Vector в Elasticsearch.
16 ч → 9 минобработка ключевых процессов
Разбор проекта →Учётная платформа · Go
Единый контракт coreerp.v1 почти на два десятка сервисов, GraphQL-шлюз с DataLoader против N+1, транзакционный Outbox и Kafka, мультиарендность с шардированием.
100+обратимых миграций на Goose
Разбор проекта →Качество
Ревью человека ловит смысл, рутину должен ловить робот. Эти проверки стоят в пайплайне и делают сборку красной — их нельзя «согласовать словами» и пропустить перед релизом.
И так, и так. Целиком — когда серверной части ещё нет: отвечаем за домен, контракты, базу и выкладку. Внутри команды — когда нужен сеньор на кусок: берём модуль и работаем в вашем репозитории по вашим правилам ревью.
Go берём там, где важны предсказуемое поведение под нагрузкой, статическая типизация и простая эксплуатация: сервис собирается в один бинарник, конкурентность видна в коде. Там, где сильнее экосистема Python — обработка данных и ETL, — мы так и говорим и пишем на Python.
С чтения, а не с переписывания. Разбираем структуру модулей, миграции и точки интеграции и показываем, что можно спасти, а что дешевле сделать заново. Это отдельная работа с фиксированной ценой — аудит архитектуры. Только после него оценка сроков перестаёт быть выдуманной.
Вам. Репозиторий и инфраструктура заводятся на вашей стороне, исключительные права передаются по договору. Вместе с кодом остаются контракты, миграции, конфигурация пайплайна и записанные решения — по ним проект подхватывает любой Go-разработчик.
По короткому созвону обычно понятен класс задачи и её главные риски. Дальше — дискавери с фиксированной стоимостью: домен, нагрузка, ограничения и внешние системы превращаются в состав работ и смету. Решите не продолжать — материалы остаются у вас.
Контакты
Разберём контекст, обозначим риски и границы, скажем, какой из трёх форматов подходит. Если задача не наша — скажем прямо. maincode — студия ИП Диденко М. С.
Смежные услуги
Серверная часть редко приходит одна. Если формулировка ближе к соседней услуге — начните оттуда, состыковать работы успеем.
Учётный контур
Когда нужна связная учётная система целиком: документы, склад, финансы и права в одной модели.
Взгляд со стороны
Когда код уже есть и непонятно, что с ним делать: карта системы, реестр рисков и план работ с фиксированной ценой.
Обмен данными
Когда сервисы написаны, а заказы и остатки теряются между 1С, CRM, маркетплейсами и кассами.