正文
右上到左下个位数9,8,7,6,…,十位数重复两次交替 1,3,5,7,9,和 0,2,4,6,8
这些规律是小宝和我在玩的过程中一点点发现的,大部分要归功于她,我只是做一点小小的总结和启发。
当然,本文的重点不在于这些对你而言过于简单的四则运算。我们是程序员,数学给了我们穿越时空的眼睛,我们要用它探究程序的奥义。
幂等(idempotent)
幂等是很多程序员的装逼利器。在 code review 大家激烈撕逼的当口,你淡定而优雅地吐出一个烟圈,缓缓掐灭手头的烟蒂,清一清喉咙,嘶哑地来一句:这个 API 幂等么?绝对秒杀现场 99% 的格子衫。如果你还能够正确地拼对并且读对 idempotent,基本可以一战封候,不愁找不到女朋友。
那么究竟什么是幂等?
Idempotent is the property of certain operations in mathematics and computer science whereby they can be applied multiple times without changing the result beyond the initial application. - wikipedia
说白话就是:幂等是指被自己重复运算,结果还等于自己。说人话就是:f x f = f。这个规则放在计算机世界里,稍微弱化成一个函数 f(x) 可以被调用任意多次,其副作用保持不变。注意,这里的不变并不意味着没有副作用 —— 比如删除数据库里的一条主键为 k 的记录,无论调用多少次,其副作用都是 k 这条记录不存在。从这个意义上讲,没有副作用的纯函数(pure function)一定是幂等的,幂等函数不一定是纯函数。
幂等的好处是带来(副作用的)确定性
。HTTP GET / PUT / DELETE 被设计成幂等的,是因为资源的获取,替换和删除无论被调用一次还是多次,资源的状态保持不变。这样,调用者可以多次调用(刷新页面)而不必担心引发错误。
在一个分布式的世界里,幂等是皇冠上的钻石。我们要尽可能(或者说不得不)将系统设计为幂等,来应对各种各样的不确定性。比如郭靖通过互联网给华筝转账 10 个金叶子,华筝可能没收到,也可能收到了但是给靖哥哥的回复在网络上丢了,两种情况郭靖都需要重传这笔交易,然而重传导致的后果可能是郭靖明明只需要给华筝转 10 个金叶子,却转了 20 个。如果设计成为幂等,我们可以在转账交易中加入一个唯一标识,这样重复的转账就会被丢弃,从而保证一致的副作用。