Python с 2008 · Backend · Удалённо

Алексей Траньков

Бэкенд-разработчик. Пишу на Python с 2008 года, на заказ — с 2019. Последние пять лет в одиночку вёл продакшн-платформы, где ошибка стоит чужих денег: краудлендинговую платформу под надзором ЦБ РФ и туристический сервис с бронированием и платежами. Архитектура, код, интеграции, деплой — один человек.

Финансовые продукты

Работа с номинальными счетами, эквайринг, СБП, выплаты и сверки, ЕСИА через КриптоПро, 152-ФЗ. Там, где чужие деньги и государственный регулятор.

Бэкенд под ключ

Django и FastAPI, PostgreSQL, асинхронные сервисы, сложные внешние интеграции, self-hosted LLM и S3. От схемы БД до продакшен-платформы.

Проекты

PapaPlatit

единственный бэкенд-разработчик
Краудлендинговая платформа · ООО в реестре операторов инвестиционных платформ Банка России · papaplatit.com

Частные микроинвесторы финансируют малый и средний бизнес и еженедельно получают фиксированный купон плюс долю от роста выручки заёмщика. Деньги физлиц ходят через номинальный счёт банка-партнёра: платформа ими не владеет, а распоряжается по поручению. Это значит, что каждая операция — реальные чужие деньги под надзором ЦБ, и «потом починим» не существует как опция.

Примеры того, что построено внутри:

  • Свой клиент к API номинальных счетов Т-Банка. Декларативные Action-классы вместо россыпи HTTP-вызовов: бизнес-код читается как обычные функции, знание банковского API инкапсулировано. Идемпотентность вынесена на уровень экземпляра запроса, для предотвращения гонки POST-запросов.
  • Приём денег: терминальный эквайринг и СБП. Подпись запросов токеном, вебхуки, рекуррентные платежи, покупка доли с внутреннего кошелька (отложенная оплата).
  • PROD, STAGE и DEV на одном номинальном счёте. Код окружения зашит в идентификатор заказа, вебхуки и фоновые задачи фильтруют чужие транзакции. Тестировать деньгами на живом счёте — и не поломать живые деньги.
  • Сверка с банком и разбор инцидентов. Нераспознанные входящие, холды против реальных остатков на виртуальных счетах, зависшие выплаты. Собран отдельный набор процедур: как найти недофинансированного депонента, почему банковская валидация сделки возвращает «всё ок» и всё равно врёт. Внедрены AI-инструменты для внутреннего разбора инцидентов.
  • Авторизация через Госуслуги (ЕСИА). КриптоПро, ГОСТ Р 34.10-2012, ключ на физическом Рутокене, отдельный сервис-подписант. Подпись через изолированные файлы в tmpfs с уникальными именами — потому что готовые Python-обёртки над КриптоПро работают нестабильно.
  • Справочник БИК напрямую из ED807 ЦБ РФ. Свой парсер формата УФЭБС и индекс в памяти: поиск банка по БИК — микросекунда, 100 КБ вместо 950 КБ XML.
  • Портирование библиотек из других языков. Например, библиотека для определения типа банковской карты по номеру (JS → Python).
  • Ускорение на компилируемых языках. Модули на Rust (PyO3 + maturin) для маскировки чувствительных данных в URL, JSON и документах — с неповторяющимся кодированием, чтобы усложнить реверс. Nim — для обработки логов. Оба заменяемы на чистый Python drop-in, чтобы не привязывать заказчика к редким компетенциям.
  • Проверка контрагентов и документов: Dadata, Контур, распознавание документов через Dbrain, СМС и Telegram-уведомления.
  • Три собственных MCP-сервера для отладки прода — доступ к API номинальных счетов, Redis и логам прямо из ИИ-агента (+ self-hosted Sentry, у которого свой MCP). Разбор денежного инцидента вместо нескольких часов ручных запросов занимает несколько минут.
Python 3.12+Django 5Django Ninja Pydantic 2PostgreSQLRedis HueyRust / PyO3Nim Т-Банк APIЕСИАКриптоПро СБПMCP

Go and Guide 360

единственный бэкенд-разработчик
Туристическая платформа: виртуальные туры, бронирование, платежи · goguide.ru

Работающий продукт: 360°-туры и аудиогиды по достопримечательностям, поверх которых слой коммерции — бронирование и оплата отелей, ресторанов и экскурсий, доставка, трансферы, бонусный кошелёк. Около двадцати Django-приложений в одном бэкенде, две версии API.

  • Бронирование как отдельное ядро. Разные типы объектов — отели, рестораны, экскурсии — со своими сценариями, собранными из общих миксинов. Интеграция с гостиничной системой TravelLine: контент, наличие, резервирование.
  • Платежи через ЮKassa и бонусный кошелёк со списанием и начислением баллов при бронировании.
  • ИИ-поиск на собственной LLM. Qwen на MLX-сервере, поднятом на своём железе, доступ по приватной сети — без внешних API и без утечки пользовательских запросов наружу. Конвейер из трёх шагов: категоризация запроса → определение локации → поиск по признакам, специфичным для категории. Промпты хранятся в базе и правятся без релиза, с фолбэком на зашитые в код.
  • Единый контракт для фронтенда. Результаты ИИ-поиска приводятся к той же схеме, что и обычный поиск: фронт не знает, каким путём пришёл ответ, и не содержит двух веток обработки.
  • Единая обработка ошибок API: доменные исключения отображаются в HTTP-коды централизованно, ответ всегда одной формы.
Django 4.2+Django NinjaPydantic PostgreSQLЮKassaTravelLine Qwen / MLXDockernginxSentry

LifeArk

бэкенд микросервисов, единственный разработчик
Мобильное приложение семейных воспоминаний · четыре асинхронных сервиса

Бэкенд мобильного приложения, разнесённый на четыре независимых FastAPI-сервиса: авторизация, профили и семейные пространства, лента воспоминаний, хранилище медиа. Каждый — свой контейнер, своя база, свой пайплайн в GitLab CI.

  • Полностью асинхронный стек: FastAPI, Tortoise ORM, asyncpg, uvloop. Межсервисное взаимодействие — через тонкие клиенты-«аутлеты», а не общую базу.
  • Вход через Google и Apple, push-уведомления через Firebase, сессии с устройствами и правами.
  • Медиа в S3 с транскодингом видео в HLS и проверкой загружаемых файлов.
  • Материализованные представления PostgreSQL для тяжёлых выборок профилей — управляются из кода вместе с миграциями.
  • Собственная библиотека асинхронных свойств с кэшированием и ленивой подгрузкой связей: убирает лишние обращения к базе в async-моделях. Покрыта тестами, включая гонки и наследование.
  • Отдельный пакет smoke-тестов, гоняющий живой API по сценариям через все четыре сервиса.
FastAPITortoise ORMasyncpg PostgreSQLRedisAWS S3 FirebaseDockerGitLab CIpytest-asyncio

PullOut

автор
Открытая библиотека · gitverse.ru/trankov/pullout

Извлечение значений из глубоко вложенных структур Python одним выражением: ключи, атрибуты и индексы вперемешку, без каскада проверок и try/except. Путь объявляется один раз и переиспользуется — когда контракт внешнего API меняется, правится одна строка в декларациях, а не двадцать мест в коде. Единственный код, который я могу показать публично: клиентские репозитории закрыты.

Python 3.12без зависимостейtyping

Плюс несколько проектов поменьше с 2019 года — разовые интеграции, автоматизация и доработки чужих систем. Расскажу по запросу.

Что умею такого, что редко встречается вместе

Деньги под регулятором

Номинальные счета, эквайринг, СБП, выплаты, сверки с банком, разбор зависших транзакций. Понимаю, чем холд отличается от остатка и почему это важно.

Государственные интеграции

ЕСИА с КриптоПро и ГОСТ-подписью на токене, справочники ЦБ в формате УФЭБС, работа с персональными данными по 152-ФЗ.

LLM без облака

Развёртывание и эксплуатация своей модели на собственном железе — когда данные нельзя отдавать наружу, а ИИ-функции нужны.

Расширения на Rust

Горячие участки выносятся в компилируемый код через PyO3 — с сохранением чистого Python-фолбэка, чтобы не привязывать команду заказчика к редкому стеку.

Разработка с использованием AI

LLM-агенты у меня в работе каждый день, и их вклад я считаю в часах. В оценках проектов коэффициент ускорения назначается отдельно по видам работ, а не одним числом на всё: на типовом слое он высокий, на финансовом ядре — близок к единице. Единый множитель по принципу «мы с AI в три раза быстрее» означает, что оценку не делали.

Процесс устроен так:

Чего AI не ускоряет совсем:

— Согласование требований
— Ожидание доступов к сервисам
— Договоры с платёжными провайдерами
— Юридические заключения
— Приёмку на стороне заказчика
— Ревью в магазинах приложений

Экономия часов не превращается в такую же экономию календарного срока: обещать обратное — значит, обманывать заказчика.

Инструмент требует настройки, иначе он ускоряет производство мусора. В моих репозиториях лежат подробные инструкции для агентов с накопленными фактами о поведении конкретной системы, а для разбора платёжных инцидентов я написал три MCP-сервера, дающих агенту доступ к API банка, Redis и логам (+ self-hosted Sentry, у которого свой MCP). Это — инженерная работа, а не просто подписка на LLM-сервис.

Принципы работы с заказчиками

У меня самого большой опыт работы с удалёнными исполнителями. Я знаю, что чувствует бизнес, когда передаёт часть ответственности на внешнюю сторону. Нанять удалённого человека вместо команды — или в помощь команде — это всегда риск. Самостоятельность и проактивность в принятии решений не должны превращаться во вредительство, а понимание своих границ ответственности — в пассивность и потерю времени на проекте.

Полный разбор чужого API: документация всегда немного врёт

У банков и госсервисов поведение регулярно расходится с их же документацией. Например, на платформе банковская проверка сделки отвечала «всё в порядке» и при этом обманывала: она сверяет обещания внести деньги, а не реальные остатки на счетах. Когда документации не хватает, я иду к продуктовым менеджерам провайдера и получаю письменное разъяснение, а не теряю время, строя догадки или говоря о невозможности сделать что-либо, не убедившись в обратном.

Интеграция не встаёт на месяц из-за расхождения между документом и реальностью.

Проектирую так, чтобы меня можно было заменить

Разработчики нередко строят себе незаменимость. Я считаю это плохим тоном. Так, например, модули на Rust снабжены чистыми Python-аналогами и меняются один в один. Промпты и конфигурации запросов к языковым моделям хранятся в базе, а не в коде, и правятся без релиза — прямо на стороне заказчика. Каждое такое решение описано в проекте отдельно.

Вы не покупаете вместе с кодом зависимость от одного человека.

Оставляю инструменты, а не только код

Чтобы разбирать денежные инциденты, я написал три служебных сервера с прямым доступом к API банка, кэшу и логам. То, на что уходил час ручных запросов, стало занимать минуты.

Инструменты остаются в проекте и работают без меня.

Тестирую на живых деньгах, не ломая живые деньги

Если на стороне партнёрского сервиса нет тестового контура, это решаемая задача, а не приговор. Например, продакшн, тестовый и рабочий контуры платформы жили на одном банковском счёте: код окружения был зашит в идентификатор заказа, а обработчики платежей и фоновые задачи отсекали чужие транзакции.

Не нужен отдельный контур в банке, а выкатка не требует остановки приёма платежей.

Разговариваю с бизнесом напрямую

Одиннадцать лет до разработки я провёл на средних и старших руководящих позициях по другую сторону стола. Разбор инцидента у меня начинается с того, что произошло с деньгами, и только потом переходит к тому, какой код к этому привёл.

Между вами и разработкой не нужен переводчик.

Документирую отвергнутые варианты, а не только принятые

Например, в проектах зафиксировано, почему готовая обёртка для криптографической подписи оказалась негодной и что поставлено вместо неё; почему ответы банковского API намеренно не заворачиваются в схемы. Это ровно те решения, к которым иначе приходят через повторение чужой ошибки.

Следующий человек не потратит месяц, чтобы выяснить то, что уже выяснено.

До разработки

До 2019 года я одиннадцать лет работал по другую сторону стола: прошёл путь от проджект-менеджера до директора по маркетингу международного IT-инфраструктурного холдинга XBT Holding (хостинг и дата-центры, бренды Servers.com и Webzilla). До этого — Яндекс, МТС, Ростелеком, Ogilvy. Всё это время писал на Python: сначала для своих задач, потом всерьёз.

Заказчику это даёт вещь, которую редко получают от подрядчика: мне не нужно подробное техническое задание, чтобы начать. Я разбираюсь в предметной области сам, понимаю, зачем нужна функция и во что она превращается в деньгах, и задаю вопросы про бизнес раньше, чем про схему базы. Разбор инцидента у меня объясняет, что случилось с деньгами, а не только какая строчка кода упала.

Контакты

Открыт для проектной работы и долгого подряда, удалённо. Берусь как за задачи в своей нише, так и за обычный продуктовый бэкенд. Напишите, что нужно сделать — отвечу, реально это или нет, и сколько займёт.