公众号旧文
为什么“再按一次”,不应该更糟?——从电梯按钮,到工程里的幂等原则
我以前一直觉得,有些按钮是骗人的。
比如电梯里的「关门键」。
你按一下,它不一定马上关; 你再按一下,好像也没更快; 你连续按十几下,它还是那样慢悠悠。
那一刻你会产生一种非常正常的怀疑: “这玩意是不是摆设?”
后来我才意识到,这个按钮的设计,背后其实藏着一个极其重要、但又极其朴素的工程原则——幂等。
一、什么是幂等?
工程书里的解释通常是这样的:
幂等: 一个操作执行一次和执行多次,结果是一样的。
但说实话,这种定义不太适合人类记忆。
我们换一种方式理解它。
二、生活里的幂等:你再来一遍,也不会更糟
还是电梯关门键。
- 你按一次:门开始关
- 你按十次:门还是在关
- 不会因为你多按几次,就把门“关到负数”
结果没有被放大。
这就是幂等。
再想几个更生活的例子:
- 你把灯关了
- 你把手机调成静音
- 你跟朋友说我到家了
这些行为都有一个共同点:
重复,不会引发新的后果。
三、反例:为什么有些“再来一次”会出事?
我们再看一个反例。
自动售货机的出货按钮。
- 按一次 → 出一瓶水
- 按两次 → 出两瓶水
这就不是幂等。
再想一个你可能真的遇到过的场景:
网页卡了一下,你刷新了 结果钱被扣了两次
这不是你倒霉, 而是系统没有做到幂等。
四、工程师为什么特别怕“不幂等”?
因为在现实世界里,有三件事是一定会发生的:
- 网络会抖
- 请求会超时
- 人会忍不住点第二次
你不可能指望世界完美, 所以工程师的思路通常是:
既然重复一定会发生,那就让重复变得无害。
这就是幂等的工程价值。
五、一个很真实的工程场景
假设你点了「提交订单」。
流程可能是:
- 浏览器发请求
- 网络抖了一下
- 浏览器没收到响应
- 你点了第二次
如果系统是:
- ❌ 非幂等:
- ✅ 幂等:
你作为用户,更希望哪一种?
六、幂等,其实是在替人兜底
我后来慢慢意识到:
幂等这个词, 本质上不是为机器服务的, 而是为人类的不确定行为兜底的。
- 手抖
- 网络慢
- 看不懂提示
- 不知道到底有没有成功
幂等假设了一件非常诚实的事:
人一定会重复操作。
七、为什么“删除”通常是幂等的?
你有没有注意到一个细节:
- 删除文件
- 删除联系人
- 取消订单
这些操作,通常都是幂等的。
因为它们设计成:
只要目标不存在,就什么都不做
你删一次,文件没了; 你再删一次,系统只会淡定地说一句:
嗯,它已经不在了。
而不是:
你在删什么?
八、幂等不是偷懒,是成熟
很多初学者会觉得:
我都控制好了流程,怎么会点两次?
但成熟系统的态度是:
我不相信你永远只点一次。
工程越往后走, 越不是追求完美执行路径, 而是接受:
- 错误
- 重试
- 重复
- 偏差
然后把它们磨平。
九、回到那个电梯按钮
现在我再看电梯的关门键, 已经不会生气了。
我知道它不是没用, 而是它在遵循一个非常重要的原则:
无论你多焦虑、 无论你按多少次, 我都不会让事情变得更糟。
这大概是我见过, 最温柔的一种工程设计。
幂等听起来是个技术词, 但它解决的,其实是一个非常现实的问题:
当事情不确定时, 重复行为不应该成为灾难的放大器。