Пятница. После работы три разработчика решили выпить и сыграть в бильярд. Чтобы было интересно, мидл придумал такое условие: проигравший оплачивает счёт.
Все знали, что сеньор лучше всех пьёт и играет, поэтому мидл предложил считать так:
«Если сеньор забьёт меньше шаров, чем другие участники, вместе взятые, — он проиграл и платит за всех»
Через пару минут после начала игры, когда несколько шаров уже было забито, к ним подошёл тимлид из соседнего отдела. Ему объяснили, что проигравший платит, он согласился, и игра пошла уже вчетвером.
Когда партия закончилась, получились такие результаты:
Джуниор забил 2 шара
Мидл — 4 шара
Сеньор — 6 шаров
Тимлид — 4 шара
Кто должен оплатить счёт?
Эта задача — пример плохого алгоритма, который привёл к коллизии. Коллизия — это когда набор одних и тех же данных, обработанных в разном порядке, приводит к разным решениям. Коллизии встречаются в разных областях ИТ, поэтому их нужно уметь заметить.
У нас коллизия выглядит так:
- Если не брать в расчёт тимлида, то сеньор победил, следовательно, оплатить счёт должен либо джун, либо мидл. Тимлид вообще как бы не при делах.
- Если считать с тимлидом, то сеньор проиграл и оплачивает счёт он.
Вторая проблема — неясен алгоритм определения проигравшего, если проиграл не сеньор. Допустим, сеньор победил — как тогда рассчитывается, кто оплачивает счёт? Там же тоже есть варианты:
- Оплачивает тот, кто забил меньше всего шаров (то есть джун).
- Оплачивает тот, кто забил больше всего шаров среди тех, кто не победил.
- Счёт делится между теми, кто не победил, но кто участвовал в игре на момент её старта (то есть среди двоих).
- То же самое, но среди участников на конец игры (то есть среди троих).
Наконец, неясно, как будет оплачен счёт, если два человека будут иметь одинаковый результат (например, если и джун, и мидл закатили бы по 2 шара). Счёт нужно разделить? Оплатить должен тот, кто первым набрал 2 шара? Или кто последним? Или по алфавиту? Или по очерёдности вступления в игру?
Вот эти все дырки в алгоритме привели к коллизии. А так как алгоритм сочинил мидл, то теперь это его проблема.
Правильный ответ: платить должен криворукий мидл, который сочинил этот алгоритм. А потом пусть он сам разгребает всё и договаривается, чтобы ему возместили. Или не договаривается, это уже его дело.