Перейти к основному содержимому
megapromotingДавайте обсудим

Экспертиза · Разработка программного обеспечения на заказ

Система, построенная под то, как работает ваша организация, а не под общий случай.

Мы строим системы с нуля, когда ни один продукт на рынке не подходит: платформы с несколькими приложениями и общей базой данных, коннекторы к системам без API, потоки, которые читают документы и денежные движения, и программы, результат которых — не экран, а производственное досье. В конце мы передаём репозиторий, документ о вводе в эксплуатацию и доступы.

Уже построеноAm ales patru sisteme proprii din discipline diferite, tocmai ca să nu arate ca patru variante ale aceluiași site, și am rulat testele fiecăruia azi. Un monorepo cu 3 aplicații și 12 pachete, 486 de fișiere TypeScript și 68 de fișiere de test, 151 de comituri, arbore de lucru curat. Un sistem de interogare a două portaluri B2B fără API public: 38 de teste trecute în 0,52 s, pe răspunsuri reale salvate ca fixturi. O conductă care citește notificări bancare din e-mail și PDF și le scrie în Postgres cu deduplicare prin amprentă. Și un generator de documentație de inginerie, în Python, cu 44 de teste trecute în 0,50 s. Cifrele sunt din rulările mele de pe 6 septembrie 2026, nu din README-uri.

«На заказ» означает, что система пишется под то, как уже работают ваши люди, а не наоборот. У этого есть цена, и честно сказать её нужно заранее: кто-то должен будет её поддерживать, и этим кем-то будем либо мы, либо ваша команда. Поэтому первый вопрос, который мы задаём, не что вы хотите построить, а есть ли уже продукт, который делает 80% работы. Если есть, мы так и скажем, даже если это значит, что вы не отдадите работу нам. То, что остаётся после этого вопроса — часть, которую нельзя купить, — это именно то, что мы хорошо строим.

Масштаб лучше видно по четырём разным системам, чем по списку технологий. Первая — платформа для учреждения спектаклей: монорепозиторий с тремя приложениями (публичный сайт, административный кабинет, API) и двенадцатью общими пакетами — билеты, торговля, контент, уведомления, возвраты, безопасность. Вторая по запросу опрашивает B2B-порталы туроператоров, которые не публикуют никакого API: программная аутентификация, возврат к входу при истечении сессии и анализатор, протестированный на реальных ответах, захваченных в файлы. Третья читает банковские уведомления из e-mail и PDF-выписки и помещает их в Postgres. Четвёртая вообще не имеет экрана: это программа, которая генерирует модель, спецификацию материалов и чертежи промышленной машины.

Что удерживает такую систему на ногах — не стек, а правила, написанные до первого экрана. В платформе для учреждения зрелищ договор внедрения фиксирует в тексте вещи, которые иначе обсуждаются на каждом совещании: деньги хранятся только в целых минимальных единицах вместе с валютой; доступность места определяется только устойчивой записью в базе данных, никогда не кэшем; критические заказы имеют ключи идемпотентности; пути P0 и P1 fail closed, а не fail open; данные карты никогда не сохраняются. Эти правила пишутся в начале, потому что, написанные в конце, они означали бы переписывание системы.

В конце передаются три вещи, не одна: репозиторий со всей его историей, документ о том, как поднять его на пустом сервере, и доступы. В каталоге наших проектов — 150 git-репозиториев, 103 файла README и 19 документов по запуску или передаче — посчитанные сегодня, не оценочные. Правило собственности мы прописываем в контракте до старта, и оно простое: код, написанный специально для вас, принадлежит вам, сторонние библиотеки остаются под своей лицензией, а наши повторно используемые компоненты и наши продукты лицензируются, а не передаются. Если часть работы лучше решается нашим продуктом, мы говорим вам об этом именно так, чтобы вы с самого начала знали, что покупаете и что получаете.

Что входит

Работа, по составляющим

Мы пишем правила домена до первого экрана

Договор внедрения в тексте, который фиксирует словарь и инварианты: что значит зарезервированное место, что значит полученный платёж, что fail closed, когда сервис не отвечает. В платформе для учреждения зрелищ правила явные — деньги в целых минимальных единицах плюс валюта, доступность только из устойчивых резервирований в базе данных, ключи идемпотентности на критических заказах, кэш никогда не источник истины для остатков, данные карты никогда не сохраняются. Это правила, которые проверяются в коде, а не принципы.

Мы строим ядро на тестах, которые запускаются без живой системы

Реальные ответы внешних систем сохраняются как фикстуры, и анализатор тестируется на них, а не на портале, который может быть недоступен именно в тот день, когда вы работаете. В системе запроса авиационных порталов набор выполняется за 0,52 секунды и проходит полностью; тесты, которые действительно обращаются к порталам, помечаются отдельно и требуются явно. Такое же разделение есть во всех четырёх системах: что можно проверить на столе, проверяется на столе.

Передаём репозиторий, запуск и доступы

Не zip-файл. Репозиторий с историей коммитов, документ, описывающий, как поднять систему на пустой машине — база данных, переменные окружения, системная служба, веб-сервер спереди — и доступы, которые делают её вашей. В каталоге наших проектов сегодня есть 150 git-репозиториев, 103 README и 19 документов типа DEPLOY или HANDOVER; такая форма передачи — правило, а не исключение.

Когда у чужой системы нет API, мы говорим, какой риск вы берёте

B2B-порталы, которые мы запрашиваем, не публикуют программный интерфейс, поэтому аутентификация идёт как у пользователя, с сессионным cookie и ключом подключения, и автоматически повторяется по истечении срока действия. Риск описан в README проекта, а не обнаруживается позже: программная аутентификация — серая зона относительно условий использования портала, а для интенсивного производственного объёма правильное решение — запросить у оператора его официальный API. Клиент имеет право узнать это до подписания, а не после.

Документы попадают только один раз, даже если мы читаем их десять раз

Каждая транзакция, извлечённая из банковского уведомления или из PDF-выписки, получает внешний идентификатор, вычисленный как SHA-256-отпечаток по её полям, а вставка в Postgres выполняется с `ON CONFLICT (external_id) DO NOTHING`. Практический итог: почтовый ящик можно перечитывать сколько угодно, а баланс не удваивается. Без этого правила любой ingest-конвейер начинает порождать дубликаты, то есть проблему учёта.

Классификация моделью выполняется через инструменты, а не через свободный текст

Модель не пишет предложение, которое потом должны угадывать мы: она получает семь инструментов — платёж от клиента, зарплата, налог, платёж кредитору, операционный расход, неизвестно — и должна выбрать один, со степенью уверенности от 0 до 1. Для приблизительного сопоставления названий контрагентов есть отдельный резерв, по сходству векторов. «Неизвестно» — законный выход, с причиной, а не скрытый сбой.

Иногда результат — не экран, а досье

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

Непрерывное измерение — это другая дисциплина, чем запрос по требованию

Собственная система одновременно захватывает несколько радиостанций с `ffmpeg`, локально транскрибирует с помощью open-source модели, затем ищет рекламу с прозрачным баллом по группам сигналов на румынском и русском языках, с настраиваемым порогом, и группирует одну и ту же рекламу, вышедшую на разных станциях, с помощью аудиоотпечатка типа chromaprint — потому что транскрипции расходятся, но звук идентичен. У неё 81 тест, которые проходят за 1,14 секунды. Система, работающая без надзора, нуждается в счётчиках покрытия, повторных попытках с арендой задачи и автотесте, иначе она молчит, когда ломается.

Говорим и о том, чего мы не строим

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

Как это выглядит

Путь, шаг за шагом.

01

Ограничиваем область и записываем правила

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

02

Строим ядро, с его тестами, до экранов

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

03

Ставим интерфейс и интеграции поверх ядра

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

04

Вводим в работу и передаём

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

IntrareVerificareDeciziePublicareNimic nu trece mai departe neverificat.ORDINEA E ARGUMENTUL
Trei pași și ordinea lor, care e jumătate din lucrare. Întâi regulile domeniului scrise în text — ce înseamnă un loc rezervat, cum se țin banii, ce cade închis când un serviciu tace. Apoi nucleul cu testele lui, care rulează pe răspunsuri reale salvate ca fixturi, fără sistemele vii. La final punerea în funcțiune și predarea: depozit, documentul pentru o mașină goală, accese. Săgeata înapoi de la pasul trei la pasul unu e reală: ce se descoperă la punerea în funcțiune schimbă regulile, nu se ascunde sub ele.

Данные

К чему прикасаемся, где оно лежит и сколько остаётся

Вопросы, которые задаёт всякий, у кого есть ответственный за защиту данных, — заданы здесь раньше, чем их задаст он.

Где работает и кто держит ключ
Система работает на инфраструктуре, письменно согласованной в начале: ваш сервер, сервер, администрируемый нами, или выбранный вместе хостинг-провайдер. Четыре системы выше работают по-разному — одна как системная служба за веб-сервером, одна из контейнеров, одна как запланированный процесс на локальной машине, одна только по команде, на рабочей станции. Выбор делается из ограничений данных, а не по привычке.
Учётные данные не хранятся в коде и, где возможно, даже не на диске
Пароли и ключи читаются из переменных окружения, а файл, который их содержит, ограничивается текущим пользователем. В коннекторе к внешней системе сессионный токен хранится только в памяти и восстанавливается по истечении срока действия или при первом отказе — пароль и токен не записываются ни в один файл. Правило проверяется при ревизии: ключ, попавший в репозиторий, — это инцидент, а не упущение.
Данные, которые поступают из документов
Когда система читает электронные письма или PDF, она обрабатывает реальные бизнес-данные: суммы, календарные даты, наименования контрагентов, номера счетов. Они хранятся в базе данных бенефициара, с собственным идентификатором, который не может повторяться, по каждой записи, и их можно восстановить из источника. То, что уходит во внешнюю модель, если она используется, — это описание транзакции, а не весь документ и не вложение.
Что сохраняется и как долго
Срок хранения устанавливается по типу данных, а не глобально, и записывается до ввода в эксплуатацию: бизнес-записи — в соответствии с юридическими обязанностями бенефициара, технические журналы — на короткое окно, промежуточные файлы — аудиозаписи, скачанные вложения — с автоматической очисткой. Система без политики удаления через шесть месяцев становится более высоким риском, чем проблема, которую она решала.
Что остается у нас после передачи
После передачи доступ к вашим системам у нас есть только если существует договор на обслуживание, который этого требует, и он отзывается, когда договор заканчивается. Рабочие копии с наших станций удаляются по запросу. Что мы сохраняем в любом случае, так это общие компоненты, которые мы написали и которые не содержат ваших данных — и о них мы сообщаем с самого начала, чтобы в конце это не стало сюрпризом.

Случай

Система опроса для двух порталов без какого-либо API

Ситуация

Туристическому агентству по запросу требовалась доступность мест и тарифы на чартерные рейсы в B2B-порталах двух туроператоров. Порталы рассчитаны на человеческий взгляд: вы входите в систему, ищете, читаете таблицу. Публичного программного интерфейса нет, а информация вручную перечитывалась несколько раз в день одним человеком.

Что мы построили

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

Что получилось

Набор проходит полностью: 38 проверок за 0,52 секунды, не затрагивая порталы. Один запрос возвращает в одном ответе доступность в четырех состояниях, которые использует портал, и тариф с классом и багажом, в запрошенной валюте. Результат можно использовать из командной строки, как JSON, или через две HTTP-точки входа.

Чего этот случай не говорит

Программная аутентификация остается серой зоной по отношению к условиям использования порталов, и это записано в README проекта, а не выяснено после передачи. Для интенсивного производственного объема наша рекомендация однозначна: нужно запрашивать официальный API у операторов. Система делает точечные запросы и делает паузы между ними именно для того, чтобы не превратиться в инструмент массового извлечения.

Вопросы

О чём нас спрашивают перед тем, как позвонить

Почему на этой странице не указана цена?

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

Кто владеет кодом в итоге?

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

Что происходит, если мы хотим продолжить с кем-то другим?

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

Могу ли я увидеть систему, построенную вами, чтобы оценить качество?

Частично, и правильно сказать, где это заканчивается. Системы, построенные для клиентов, не наши, чтобы показывать их, а внутренние содержат реальные бизнес-данные. Что мы можем сделать перед вами, на экране, — это другое: открыть репозиторий, показать вам правила предметной области, записанные текстом, запустить наборы тестов — 38 за полсекунды на одном, 81 чуть больше чем за секунду на другом, 44 на третьем — и вместе прочитать код, который делает утверждение, в котором вы сомневаетесь. Этот сайт, в свою очередь, тоже является собственной системой, которую можно осмотреть снаружи.

Наша старая система не имеет API. Можно ли что-то сделать?

Обычно да, но с заявленным риском. Порядок такой: сначала мы спрашиваем, есть ли у поставщика официальный API, который он просто не задокументировал публично — такое часто бывает. Если нет, можно работать через программную аутентификацию, точно как пользователь, с автоматически обновляемой сессией; мы построили такую систему, которая опрашивает два B2B-портала. Тогда мы прямо пишем, что это серая зона по отношению к условиям использования поставщика и что при большом объёме устойчивое решение — запросить официальный API. Решение остаётся за вами, но уже информированным.

Вы используете искусственный интеллект, чтобы писать код?

Да, и мы этого не скрываем. Важны правила, по которым это делается: каждая часть работы закрывается тестами, которые запускаются, проверкой типов и ревизией различий перед коммитом, а ограничения записаны в репозитории — без публикаций в продакшен изнутри работы, без изменений во внешних аккаунтах, адаптеры для поставщиков только с вариантом симуляции. Код, написанный быстро и не доказанный, дороже, чем код, написанный медленно. То, что это продаёт, — скорость на скучной части, а не отсутствие проверки.

Что вы делаете, когда в середине оказывается, что исходная идея была неверной?

Говорим. В собственном инженерном проекте мы после оценки пришли ко второй, совершенно иной архитектуре для той же задачи и описали её как задокументированную альтернативу, с контрольными точками, которые нужно пройти перед любым заказом, вместо того чтобы продолжать по первой только потому, что она уже была начата. Цена смены курса на середине меньше, чем цена системы, сданной в неверном виде, а разницу в обоих случаях платит заказчик.

Насколько большой может быть работа?

На одном конце — система с тремя приложениями и двенадцатью общими пакетами в одном репозитории, 486 файлами TypeScript, 68 файлами тестов и 151 коммитом, с реляционной базой данных, отдельной эфемерной координацией от источника истины и общими контрактами между приложениями. На другом — система с одним процессом и двадцатью точками входа, ровно настолько, насколько нужно. Широта — это не обещание про любой размер, а наблюдение, что мы работали на обоих концах.

Вы делаете и обслуживание после сдачи?

Да, но как отдельное соглашение, а не как подразумевание. Системе на заказ нужны обновления безопасности, отслеживание изменений у внешних поставщиков и кто-то, кто смотрит журналы. Если вы предпочитаете делать это своей командой, передача строится так, чтобы это было возможно. Если вы предпочитаете, чтобы это делали мы, прописывается, что покрывается и что нет — включая то, что означает «срочно», потому что без определения это слово ничего не значит.

На чём основаны утверждения выше (15 источников)

15 из них — код и файлы из наших репозиториев. Мы не публикуем их название и строку: вместе, на одной странице, они слишком точно описали бы, как устроены системы, которые принадлежат не только нам. Мы разбираем их вместе с тобой, в репозитории, по запросу — проверка остаётся возможной, просто она проходит в разговоре.

Что вы хотели бы наладить?

Расскажите о своём процессе. Вместе определим, что стоит построить, что можно подключить и как проверим результат.

Давайте обсудим