我一般出门比较小心细心,从小到大没丢过钱包手机饭卡,甚至没怎么忘记过拿钥匙(好像有讲究不能这么说,呸呸呸。)我记忆中唯一的一次忘带钥匙是大约两年前,当时还住在Erlangen,还好是合租,钥匙落在屋里,等一等室友回来了,就可以帮我开门。
虽然事情很小,但是当时把我惊到了,我怎么会出现出门忘记带钥匙这种事情,这种情况怎么会在我这里发生,这是不可能的啊。有个前提我得先介绍一下,我从小有一个很好的习惯,出门时候检查一下手机钱包钥匙,回家然后把钥匙放在指定地点。这个习惯感觉已经深入到我的潜意识中,每次出门都是条件反射般将这一系列检查动作就做了,从而保证了我从来没有配过钥匙,补办过饭卡,以及去大街上找钱包。直到上次我的第一次我回家发现钥匙不在身上。
我实在想不通,二十多年的条件反射,为啥当天出门就没检查到钥匙并没有随身带。于是我仔细复盘了整个过程,这个事情一点都不简单,反而很有意思。
刚才讲了我出门会有一个肌肉记忆般检查动作,那是可以同时完成的,手一摸就行了。每次回到家的几个动作确是有先后顺序,我先用钥匙打开门,然后随手放在我的桌子上指定处,然后将背包放下了,衣服鞋子脱掉。至此整个回家动作实施完成。而忘带钥匙那天,早晨切切实实我检查过是带着的,晚上五点钟我回到屋子也用钥匙开了门,然后一系列回家动作开始,我将钥匙放在桌子上后,本来需要继续放下背包,换掉衣服鞋子,可是这个时候恰恰同学联系我出去有点事情,于是我就直接出门了,而这个时候我竟然没有做出门检查这一些列肌肉记忆动作。
我反思当时在我的脑中,虽然已经开始进行了进家动作,可是脑中的按个状态还是处于离家状态,而这个时候进家动作还没完成,钥匙刚放下,来了一个外部中断,脑子告诉我还是离家状态,不符合离家物件检查的前提条件,于是我就没想起来需要检查手机钥匙钱包。这个错误是由于那个外部中断正好卡在了我归家动作的图中,放下了钥匙,而由于脑中的那个标志位需要整套动作完成才做转变,所以那时候虽然放下钥匙,但是状态是离家,于是造成了出门忘带了钥匙。
用出门进门顺序图表示是:
这是我的顺序图,稳定运行了二十多年没出过错。那天的情形是在钥匙放桌上和放下背包间出现了一个外部中断,而我没有出入门顺序保护机制,我以为我的状态还是离家,于是遇到了罕见的bug。这个在程序开发中对应概念叫做临界区和锁。像我出门在入门,以及状态更改的这一小段事情,属于危险操作应该被归到临界区,同时对于这个动作系列进行上锁。简单点说就是这连着的三五个动作必须一次性完成,中间不能打断。而我生活中遇到的Bug就是我忘了上锁了。
我用计算机思维复盘我遇到的事情还是很有意思的,这样的罕见Bug其实也不止我自己遇到,这在程序开发很常见。比如说XBox 360的脉冲破解就是利用这个原理。正常CPU运行代码是有严格的权限等级校验不可能运行自制代码,这个脉冲破解的原理,就是焊一个硬件连接在CPU上,当CPU启动系统时候自检时候外部硬件输入一个脉冲,这个脉冲破坏了原有的CPU自检的流程,从而获得了CPU的高权限,从而引导到自制的代码上,实现了对于CPU的控制。
还有一个例子是我记得去年一款虚拟货币服务商被黑客攻击,损失了好多好多钱。人们复盘被黑过程,也是和上边的流程很像,他们在进行交易以及余额修改的动作操作的时候,没有进行合理的上锁,黑客用计算机高频操作,将虚拟货币转出后,在服务商还没来得及将交易状态更改以及余额减去,黑客就又发送了取消交易的命令。而服务商那端看到的状态没有交易和没有余额变动,同时取消掉了该有的交易记录和余额变动。黑客钱已经转出去了可是账户余额没变。于是黑客重复操作就这样黑掉了服务商好多钱。
还有一个例子更加抽象,是我看知乎讲的一个黑客挑战赛,每个队拿一个自己的项目让别人去黑,其中一个队伍拿了一个火箭,是真的火箭,好像是印度那边的民用小型火箭,其中控制系统都是特制的,开发人员也是顶级的,所以抗黑能力很强。最后没有人将他们组的项目攻下,后来公布正确答案的时候,火箭开发人员讲他们的一个CPU中断有漏洞,利用这个中断可以实现对于硬件的控制权。和Xbox 360破解很像了。
这是我生活黑客第一篇,用计算机思维来分析生活,一次忘记带钥匙引发的思考。