Интеграции съедают больше времени, чем сам продукт

Когда планируешь систему, кажется, что главное — это «продукт». А потом выясняется, что львиная доля времени уходит не на него, а на стыковку с чужими системами.

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

Чем серьёзнее проект, тем это заметнее. Платёжные системы, банки, биллинг оператора, телефония, CRM, карты, госсервисы, склад, курьеры — почти ничего интересного не живёт в вакууме. Настоящий продукт почти всегда стоит на десятке чужих API.

Почему это так дорого

Свой код ты понимаешь целиком. Чужую систему — нет. И именно на этой границе прячется всё самое времязатратное.

  • Документация врёт. Не со зла — просто она отстаёт от реальности. Поле, помеченное как обязательное, приходит пустым. Ответ, описанный как JSON, иногда прилетает как строка с ошибкой. Пока не увидел реальный трафик — не знаешь, как оно себя ведёт.
  • Форматы и мелочи. Кодировки, часовые пояса, формат дат, деньги (копейки против дробных, округления). Одна неверная копейка в платёжке — и это уже не «мелочь».
  • Сеть не идеальна. Запрос ушёл, ответ потерялся — а деньги списались. Значит, нужны таймауты, повторы, идемпотентность, дедупликация, очереди. Половина работы над интеграцией — это обработка того, что пошло не так.
  • Две системы — две правды. Твоя база говорит одно, чужая — другое. Появляются сверки, компенсирующие операции, ручные разборы расхождений.
  • Доступы и безопасность. Подписи запросов, токены, ротация ключей, «пришлите нам статический IP», белые списки, отдельный канал. Это тоже время.
  • Тестовых сред либо нет, либо они не похожи на прод. И ты узнаёшь о поведении системы уже на боевом трафике.

А поверх всего — организационная часть. По ту сторону API живёт другая команда со своими релизами, своим графиком и поддержкой через тикеты. Иногда ответ «почему так» приходит через неделю.

Из опыта

Мне довелось делать интеграции с CRM и телеком-системами, USSD- и SMS-сервисами, банками и merchant-инфраструктурой, а в собственной доставке — с телефонией. Задачи разные, но узкое место всегда одно и то же: не «написать свою логику», а надёжно ужиться с чужой системой, которая живёт по своим правилам и иногда молча меняет поведение.

Именно поэтому оценка «сам продукт — неделя» почти всегда оказывается неполной. Продукт — да, неделя. А потом три недели на то, чтобы он корректно разговаривал со всем, к чему подключён.

Что помогает

За годы набралось несколько привычек, которые реально экономят нервы:

  • Прячь чужое за адаптером. Отдельный слой, который переводит чужой API в твою модель. Меняется чужая сторона — правишь один слой, а не весь продукт.
  • Считай, что всё упадёт. Таймауты, повторы с нарастающей задержкой, идемпотентные ключи, очереди. Не «если», а «когда».
  • Логируй реальный обмен. Когда что-то расходится, спор решает не документация, а лог запроса и ответа. Наблюдаемость важнее, чем кажется.
  • Документируй фактическое поведение, а не обещанное. Твои заметки по чужому API часто полезнее их официальной документации.
  • Закладывай время на интеграции сразу. Не в конце, «на всякий случай», а как основную часть работы.

Главная мысль

Со временем я перестал воспринимать интеграции как «приклеивание» готового продукта к внешнему миру. Чаще всего интеграции и есть продукт — по крайней мере, большая и самая сложная его часть. Пользователь не видит этот слой, но именно от него зависит, работает система на самом деле или только на демо.

Поэтому, планируя проект, я теперь задаю себе неудобный вопрос сразу: не «что мы построим?», а «с чем это должно будет ужиться — и сколько это на самом деле стоит?».