Заметка из продакшна
Четыре сметы, которые не сходились, и чему каждая нас научила
В некоторых бизнесах смета не документ о продукте, а сам продукт. Четыре раза за этот год в трёх построенных нами системах она была неверной, и каждый раз арифметика была в порядке.
Автор Евгений Романов·Опубликовано
Коротко
Там, где цену считают из замеров, смета и есть продукт, и ломается она особым образом: арифметика верна, а число неверно. Четыре дефекта из трёх систем, которые мы построили для бизнесов в США, показывают общий узор: выключенная комната всё равно в счёте, итоги округлены порознь, одна комиссия посчитана по двум правилам, условия оплаты есть в ссылке и пропали из PDF.
SHT-02Заметка из продакшна
Когда смета и есть продукт
У монтажника стеновых покрытий, строителя саун и автоброкера есть общее. Прежде чем клиент скажет «да», кто-то должен превратить замеры, опции и условия в одно число, и именно это число клиент покупает. Ошибка в нём обесценивает всё остальное в системе. Эти четыре дефекта из трёх таких систем, все построены нами и все работают, и каждый записан в публичном журнале сборки вместе с коммитом, который его исправил.
1. Комната выключена, а в счёте осталась
В WallFlow, нашем собственном продукте для смет монтажников стеновых покрытий, смета состоит из комнат, и комнату можно выключить, не удаляя. Калькулятор фильтровал стены по их собственному флагу и не проверял флаг комнаты, поэтому площадь, панели, рулоны и деньги выключенной комнаты шли в итог. Печатный документ делал хуже: показывал только включённые комнаты, а суммировал все. Каждая строка арифметики была верной. Она отвечала не на тот вопрос, который задал клиент. Исправлено в 24c8fff, 19 августа.
2. «Итого», «Оплачено» и «Остаток» не сходились
В системе автоброкера страница покупателя округляла «Итого», «Оплачено» и «Остаток» каждое по отдельности. Каждое число было округлено правильно, а все три вместе на глазах у покупателя машины не сходились. На той же неделе мы насчитали в продукте четырнадцать разных способов напечатать доллар и нашли сумму, которая на одном экране была 612.5, а на соседнем 613. Мы показали расхождение на тестовой сделке, созданной нами же, исправили его в 32ef950 и b9b5a4e и после этого сделку удалили.
3. Одна комиссия, два правила
В той же системе панель считала процентную комиссию от валовой суммы, а все остальные экраны от базы за вычетом расходов. Два соседних экрана показывали по одной сделке два разных числа, и оба честно следовали своему правилу. Теперь правило живёт в одном месте, в базе данных, и каждый экран получает готовые доллары вместе со строкой, а не считает их заново (62de441).
4. Условия в ссылке, но не в PDF
В системе строителя саун смета существует дважды: ссылкой, которую открывает клиент, и документом, который он скачивает. Условия оплаты были в ссылке и пропали из документа. Один факт, отрисованный дважды и разошедшийся сам с собой (438ad72). Когда закрыли лазейку, через которую это прошло, нашлось ещё пять мест, где деньги печатались плохо, включая итог, отправленный на телефон без центов (17b4ae8).
Общий узор
Ни в одном случае сумма не была посчитана неправильно. Каждый раз один факт считался или печатался в двух местах, и они расходились: флаг у стены и флаг у комнаты, три округления вместо одного, правило в панели и другое везде остальное, шаблон для ссылки и другой для PDF. Тест функции проходит во всех четырёх случаях, потому что функция верна. Неверно то, что функций две.
Что мы теперь делаем иначе
Всё, за что платит клиент, считается в одном модуле, и каждый экран и документ берёт число оттуда. Деньги форматирует одна функция, и проверочный тест валит сборку, если файл форматирует их иначе. А изменение сметы проверяется на том документе, который клиент реально получит, а не на зелёной сборке: три дефекта из четырёх были видны только там.
Проверка, которую можно сделать на своих сметах
Возьмите одну настоящую смету и откройте её во всех видах, в которых её видит клиент: ссылка, PDF, сообщение, счёт. Сверьте итог, задаток и остаток в каждом. Если хоть два вида расходятся, на цент или на строку, у вас тот самый дефект, о котором эта заметка, и клиенты его уже видят.
SHT-04Вопросы
Вопросы, на которые отвечает эта заметка.
- N01У готовой CRM та же проблема?
- Может быть, только в другом месте. Обычная CRM чаще оставляет расчёт таблице или человеку, который набирает смету, и вторая копия правила живёт у кого-то в голове. Дефект тот же: один факт, два места. Система, построенная под один вид бизнеса, может держать правило в одном месте, потому что знает, какое оно.
- N02Откуда известно, что это правда?
- Каждый случай записан строкой в публичном журнале сборки на этом сайте, с датой и коммитом исправления, из трёх работающих систем. Цифры и имена самих клиентов в журналы не попадают по правилу, записанному до того, как выбрали первую строку.
- N03Какое самое маленькое изменение это предотвращает?
- Выберите одно число, за которое платит клиент, найдите все места, где оно считается или печатается, и заставьте их все брать его из одного места. Обычно это меньше работы, чем кажется, и убирает весь класс дефектов, а не только замеченный случай.