Почему я не доверяю счётчикам

Представьте счётчик: каждый раз, когда друг оплачивает подписку, засчитываем +1 к награде. Логично же — больше друзей привёл, больше получил. Проблема в том, что если несколько друзей оплатят почти одновременно — скажем, все в один день, пока пригласивший ещё не воспользовался ни одной скидкой, — счётчик добросовестно насчитает пять единиц награды сразу. Хотя по смыслу программы это должно быть «одна возможность воспользоваться скидкой», а не «сколько успело накопиться, пока не смотрел».

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

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