Что здесь значит детерминизм
Бизнес-логика никогда не читает системные часы, не берёт случайных чисел и не использует плавающую точку. Время и другие внешние данные приходят как записанные события. Поэтому одни и те же входы всегда дают один и тот же результат — на любой машине и в любое время.
Журнал — это истина
Каждое изменение дописывается в журнал, который только растёт. Состояние, которое вы видите, — чистая функция этого журнала: восстановление из журнала даёт ровно то состояние, что дало исполнение. Исправления — новые записи, а не правки.
Возьмите журнал прошлого года, проиграйте его на чистой машине — получите те же остатки до цента. Спросите, что система считала верным на 31 марта, — получите то, что она считала тогда, а не то, что известно сейчас.
Два вида времени
Каждая запись хранит два времени: когда факт был верен в мире и когда система о нём узнала. Можно спросить и «какой была цена 1 марта?», и «какой мы считали цену на 1 марта по состоянию на 15 марта?» — второй вопрос как раз задают аудиторы и суды.
Всё, что из этого следует
- Журнал аудита с защитой от подделки: каждое действие и отказ сцеплены хешами, поэтому правка, удаление или обрезка записи обнаруживаются
- Изменения ровно один раз: повторный запрос никогда не применится дважды
- Репетиция: изменение правила можно проиграть по истории и увидеть, какие результаты оно изменит, до включения
- Воспроизводимые программы: две сборки образа операционной системы из одних исходников дают побайтно одинаковый файл
- Движок рассуждений тоже детерминирован: два одинаковых экземпляра думают и действуют одинаково, любой прогон можно повторить
Детерминизм — не надстройка, которую проверяют в конце. Это правило кода: у бизнес-логики просто нет способа прочитать часы или взять случайное число.