Собственное внедрение (dogfooding)

Заказчик просил дубликатор кодов. Получилась SaaS-платформа

История проекта Marki: почему мы не стали писать техническое задание, собрали прототип за один день — и как из него выросли настоящие требования.

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

С чего началось

Запрос звучал так:

«Мне нужен дубликатор Честного Знака. Навожу камеру на код, система его считывает, и я печатаю несколько таких кодов на принтере.»

Ни личных кабинетов, ни базы данных, ни командной работы. Нужен был прикладной инструмент под одну ежедневную операцию: считать код маркировки и напечатать нужное количество дубликатов.

Задача понятная и узкая. Ровно из таких чаще всего и вырастают системы — просто об этом никто не догадывается в момент постановки.

Почему мы не стали писать ТЗ

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

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

Прототип за один день

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

Сервис на JavaScript: принимает снимок кода Честного Знака, распознаёт его, преобразует в формат, пригодный для печати. Упаковали в Docker, добавили минимальный интерфейс, настроили вывод на принтер.

  1. 1Пользователь фотографирует или загружает код маркировки
  2. 2Система распознаёт код
  3. 3Пользователь указывает количество копий
  4. 4Сервис готовит этикетки
  5. 5Коды уходят на принтер

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

Что показал прототип

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

Было
Сфотографировать код
Стало
Считывание с телефона, загрузка через веб, работа в приложении на компьютере
Было
Напечатать несколько копий
Стало
Редактор этикеток: шаблоны, настройка внешнего вида, разные варианты печати
Было
Инструмент для одного человека
Стало
Пользователи, командная работа, разграничение доступа
Было
Простой скрипт
Стало
Веб-сервис, мобильный интерфейс, приложение для Windows, база данных, лендинг, серверная часть в контейнерах
Было
Разовая локальная операция
Стало
Хранение кодов и операций, история печати, серверное хранение

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

Итоговое техническое задание

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

Вместо отдельного скрипта была спроектирована архитектура полноценного продукта.

Архитектура — и самое дорогое решение в ней

веб-интерфейс для работы с кодами
мобильный сценарий считывания камерой
приложение для Windows
редактор этикеток
серверная часть
реляционная база данных
хранение истории операций и пользователей
несколько Docker-контейнеров
лендинг с описанием продукта

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

Самым дорогим решением оказалась авторизация и личный кабинет

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

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

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

Редактор этикеток DataMatrix в сервисе маркировки Marki
Редактор этикеток: DataMatrix, человекочитаемый код, логотип Честного Знака, поля товара, пресеты размеров и DPI.
Серии и партии кодов маркировки с историей печатей в Marki
Серии и партии: статус каждого кода, счётчик печатей, перепечать с нужной позиции, выгрузка в CSV и PDF.

Итоговый состав: распознавание кодов · печать дубликатов · работа с телефона · веб-интерфейс · приложение для Windows · редактор этикеток · командная работа · хранение данных · история операций · серверная инфраструктура · публичный лендинг.

Сроки и стоимость

Прототип был готов за один день — до всяких договорённостей о цене.

После согласования ТЗ заключили договор. Первая версия вышла примерно через неделю: значительная часть логики уже была проверена на прототипе, поэтому неделя ушла на доводку согласованного объёма, а не на разработку с нуля.

Стоимость работ
350 000 ₽
В эту сумму вошли:
  • серверная часть (бэкенд)
  • веб-сервис и сайт
  • система работы с кодами маркировки и хранение данных
  • подготовка этикеток к печати
  • MVP мобильного приложения
  • MVP приложения для Windows
  • развёртывание и запуск

Систему развернули на наших серверах и передали заказчику доступ к готовому сервису.

Продукт не остался в состоянии сдачи

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

Разница между «сдали проект» и «ведём продукт» именно в этом: первое заканчивается актом приёмки, второе живёт и меняется вместе с задачами бизнеса.

Итог

Проект начинался с одной узкой функции: считать код камерой и напечатать копии. Вырос в сервис с редактором этикеток, серийным учётом, историей печати и работой на четырёх устройствах.

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

Расскажите задачу — соберём прототип и посчитаем объём

Начнём с работающего сценария, а смету назовём, когда станет понятен объём.