Hammerhall Сколько стоит Войти

Идемпотентность: слово, которого не было в словаре

Выпуск 4 · читать минут 6

Слово: идемпотентность · где услышишь: в шлюзе каналов — «одно событие, не больше одного письма»

«Истории слов» — рубрика буткемпа Hammerhall. Наша команда строит учебную платформу и сервисы вокруг неё, а здесь рассказывает, откуда взялись слова, на которых говорит.

Поздний вечер. Человек покупает билет на поезд: выбрал место, ввёл карту, нажал «оплатить». На экране крутится колёсико. Минуту крутится. Страница зависла.

У человека в голове один вопрос: деньги ушли или нет? Если ушли, второй раз нажимать нельзя. Если не ушли — надо, иначе место уйдёт. Он не знает. И нажимает ещё раз.

Сколько раз с него должны списать деньги? Один, тут все согласны. Чтобы вышло именно один, у программистов есть правило — и у него самое эльфийское имя из всех, что ты у нас услышишь: идемпотентность.

Придумал это слово не программист, а математик, и было это больше 150 лет назад.

Величина, которая остаётся собой

1870 год, США. Бенджамин Пирс (Benjamin Peirce), профессор математики в Гарварде, — он преподавал там почти полвека. Его часто называют первым американским учёным, чью работу признали во всём мире.

В тот год Пирс прочёл перед Национальной академией наук большую работу «Линейная ассоциативная алгебра» (Linear Associative Algebra). Если совсем коротко — о том, как умножать друг на друга не только числа, но и другие величины.

У работы своя маленькая история. Почерк у Пирса был ужасный. Нашли женщину, которая математики не знала, зато писала красиво и умела разбирать его каракули. Она переписала от руки весь текст на литографские камни — гладкие камни, с которых потом печатали, как штампом. С них отпечатали 100 экземпляров и разослали математикам по всему миру.

В этой работе Пирсу понадобились имена для двух странных величин. Первая, если умножать её саму на себя, в какой-то момент исчезает — получается ноль. Её Пирс назвал нильпотентной: nil по-латыни — «ничто». Вторая — наоборот: умножишь на себя — получишь её же, умножишь ещё раз — опять она. Её Пирс назвал идемпотентной: idem — «тот же самый», potens — «имеющий силу». А «сила» по-английски — power, и это же слово значит «степень». Выходит: та же самая в любой степени.

Само это свойство до Пирса записал англичанин Джордж Буль (George Boole) в своей алгебре логики. А имя ему дал Пирс — и оно прижилось.

«Этого слова нет ни в одном словаре»

Сначала слово жило у математиков, потом его подхватили программисты: им понадобилось имя для действий, которые можно спокойно повторить. А в середине 1990-х люди договаривались о правилах, по которым компьютер просит у сайта страницу и получает ответ, — о протоколе HTTP, тех самых буквах из адресов сайтов. В черновик этих правил попало и наше слово.

30 августа 1995 года в переписке рабочей группы HTTP один участник пишет: слово в черновике употребляют путано, совсем не так, как в математике, — давайте определим его или заменим. Другой поддерживает: этого слова нет ни в одном словаре, даже в моём полном Webster's. В тот же день приходит ответ: это математический термин, — а к нему статья из Оксфордского словаря, где первым стоит Пирс и 1870 год.

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

Лифт и выключатель#

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

Без компьютеров это выглядит так:

что нажимаешь что делает повтор идемпотентно?
кнопку вызова лифта ничего: лифт уже едет да
кнопку «выключить» ничего: свет уже выключен да
выключатель туда-сюда отменяет первое нажатие нет

А как же оплата? Кнопка «оплатить» сама по себе не идемпотентна — идемпотентной её делают нарочно. К покупке прикладывают номер, один на все нажатия. Платёжная система его запоминает и, если приходит второй запрос с тем же номером, отвечает то же, что в первый раз: оплачено. Второй раз деньги не списывает. Так что, если магазин сделан аккуратно, нашему человеку с зависшей страницей второе нажатие не страшно.

Сколько бы раз ни постучалось

У нас это слово услышишь в шлюзе каналов — сервисе команды, который пишет людям уведомления на почту. Шлюз читает события платформы. Событие — короткая записка о том, что случилось: «ментору пришла новая заявка» или «задание проверено». А повторы — дело обычное: платформа честно предупреждает, что одно событие может прийти дважды, например после сбоя или перезапуска.

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

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

Пирс так назвал величину, которая от умножения на себя остаётся собой. А мы так называем действие, которое от повтора остаётся одним.

Идемпотентность — это когда жмёшь пять раз, а случается один.


Источники

← Все истории слов

Попробовать руками

В кузницах Hammerhall — задачи по Java, которые проверяет сервер: решаешь в своей IDE, отправляешь одной командой, проверка запускает твои тесты и закрытые. Сложность растёт вместе с решённым, первые задачи бесплатны.