那阵子,我每天中午都会被手机连震两下。
一模一样的两条推送,前后差不了几秒,内容几乎一字不差。广东电力第二天的电价预测,一张折线图,一张表格,均价多少、晚峰几点、低价窗口在哪。
第一次看还行。第二次看。。。怎么说呢,就有点像你刚听完一个笑话,旁边人非要凑过来再给你讲一遍。

我得先交代下这俩货是干嘛的。
我手头有两台 Mac。一台 Mac mini,摆在桌上,常年开机,雷打不动。一台 MacBook Air,我背来背去,合上盖子就睡过去了。
这两台机器上,装着同一套程序,干的是同一件事,跑一个广东电力市场的电价预测。每天中午自动去金山文档把最新数据拉下来,喂给模型,算出第二天 24 个小时的电价,画成图,然后推到同一个飞书群里。
为什么要两台干一样的活儿?
冗余啊。一台挂了,还有另一台兜底,这预测就断不了。
听起来很美。直到我发现,两台都好好活着的时候,它俩就都在推。于是我每天被震两下。
那把其中一台关了不就行了。
不行。你一关,冗余就没了。哪天留下的那台睡死过去,或者卡住了,预测当天就开天窗,我啥也收不到。
我要的是一个特别拧巴的东西,两台都活着,但平时只准一台说话。等说话那台哑了,另一台得立刻、自动地接上去。
就像两个保安。平时一个在岗,一个在休息室待命。在岗的那个一直好好的,待命的就别出来添乱。可一旦在岗的那个倒下了,待命的得马上补位,岗不能空。
我最开始的想法很自然,让两台机器商量一下呗,今天你推还是我推,说好了不就行了。
然后我就卡住了。
它俩没法商量。
这两台机器之间,没有共享硬盘,没有共享的代码仓库,连那套程序都是各装各的、我手动同步过去的。它们在网络上互相根本看不见对方,就像两个隔着一堵厚墙的房间,各干各的,谁也不知道墙那边还有个一模一样的家伙在忙活。
你让两个连话都通不了的人商量值班表?
我盯着手机上那两条重复的推送,看了挺久。
然后突然想到一件事。
它俩是看不见对方,没错。可它俩,都看得见同一个东西啊。
那个飞书群。
你想想看,它俩每天辛辛苦苦的活儿,最后的结果,全都落在那个群里了。推送这个动作,它的结果是公开的,是摆在明面上的,是两台机器都能回头去查的。
那「主机今天到底推了没有」这个问题,压根儿就不用两台互相打电话问。
备机自己去群里翻一眼当天的消息,不就全知道了吗。
那个飞书群,一下子就成了它俩之间的一块共享黑板。
一台在上面写字,另一台看一眼黑板,再决定自己要不要写。
它俩谁也没跟谁说过话,但通过盯着同一块黑板,硬是配合上了。
我当时就觉得,有点东西。

我给你说说这套黑板逻辑具体咋转的,不难。
我先给两台定了角色。Mac mini 当主机,因为它常年开机、最靠谱,我管它叫 primary。MacBook Air 当备机,叫 backup。
主机的逻辑特别简单,闷头推就完了。到点了,算完了,发。它不管别人,也不去看黑板,它就是那个永远在岗的保安。
备机的逻辑才是关键。它每次要发之前,先停一下,去群里读当天的消息,搜一下「今天这条有没有人发过了」。
发过了,它就闭嘴,啥也不干。
没发过,说明主机今天大概率出事了,没开机或者卡死了,那它就顶上去,把消息发出来。
这里还有第三种情况,挺重要的。万一它去读群,结果读失败了呢,比如那一刻网断了、或者权限抽风了,它根本没读到群里有啥。这时候我让它选择,照发。
权限终于配齐,我兴冲冲从主机真发了一次。消息是出去了,但是。。。图没了。
本该是漂漂亮亮的折线图加表格,群里收到的,是一坨纯文字。
一查,还是权限。我用的那个应用,能读群,但偏偏没有「上传图片」的权限。飞书发图是个两步走的活儿,得先把图传上去拿个凭证,再把凭证发出来。我那应用卡在第一步,图传不上去,程序还挺「懂事」,自动降级成了纯文字版。
这次我没在那个应用上死磕,直接换了个权限配齐全的新应用,读群、发图,一步到位。
第四节课。你以为到这就结束了???
没有。
换好应用,我再发一次。这回报了个更莫名其妙的错,连飞书的服务器都连不上,死活说 503。

我盯着这个错看了一会儿,猛地想起来,这台 Mac mini 上挂着一个科学上网的系统代理,平时所有联网都从它走。这玩意儿偶尔会抽风返回 503,正好被我撞上了,把我发给飞书的请求活活吞了。
解法倒是简单,让程序发飞书请求的时候,别走那个代理,直连。一行配置的事。
这四节课,一节比一节出乎我意料。
我本来以为,整件事最难的是「把群当共享状态」那个思路。结果那个思路,十分钟就想明白了。剩下的所有时间,全耗在跟飞书的各种权限、跟这台机器自己的环境,一点一点较劲上了。
写代码这行干久了你会有个体感,真正吃掉你时间的,从来不是那个聪明的主意。是把主意落地的时候,现实世界一把糊到你脸上的那一地鸡毛。
现在这套东西跑起来是啥样,我给你完整过一遍。
正常的一天,两台都好好的。11 点 10 分,主机闷头把当天的预测发进群。12 点,备机醒来,去群里一翻,看到了,「哦今天的有了」,它就乖乖闭嘴。我手机,只震一下。

主机挂了的一天。比如那天 Mac mini 没开机。11 点 10 分,群里一片安静。12 点,备机去翻,「咦,今天咋是空的」,它二话不说顶上去,把预测发了。我手机照样震一下,点开一看,是 [Air] 发的。预测,没断。
备机挂了的一天。无所谓。主机本来就在发,少个待命的,一点影响都没有。
平时不吵,关键时刻不掉链子。
这,就是我想要的那个拧巴的东西,被我捋顺了。
怕你看晕,整套机制我画成了一张图,存着随时回看。

这套东西做完,我自己琢磨了挺久。
让我觉得最有意思的,真不是哪段代码。是「两个没法直接说话的个体,靠观察同一个公共空间,把协作给完成了」这件事本身。
这两台 Mac,从头到尾,没交流过一个字。它们不知道对方存在,不知道对方是死是活。它俩之间唯一的默契,全建立在一个共同看得见的公共场所上,那个飞书群。一个在上面留下痕迹,另一个看着痕迹,调整自己的动作。
你仔细想想,这不就是人嘛。
红绿灯路口,没有谁挨个打电话商量「这把你先走我后走」,大家都看那个灯。
菜市场里,没有一个中央大脑挨个通知每个摊主「今天白菜卖几块」,大家都看别人的标价、看今天来了多少买菜的,自己心里调。
我们这些彼此独立、谁也读不了谁心思的个体,能合作起来,靠的从来不是把每两个人之间都连根线。靠的是一个又一个共享的、公开的、所有人都看得见的「场」。
市场是这样的场。语言是这样的场。规则和法律,也是这样的场。
我那两台破电脑,稀里糊涂地,把人类社会跑了几千年的这套底层逻辑,复刻了一遍。它们硬是把一个飞书群,用成了一块协调彼此的公告板。
哦对,得说一句,这套东西不是我一个人吭哧吭哧敲出来的,全程是我跟 Claude Code 一起搞的。我负责出想法、做判断、踩坑了把报错甩给它。它负责读代码、改文件、一个一个帮我验证。那几个飞书权限的坑,基本都是它在那头一边发请求一边告诉我「这次缺这个权限」「这次是你那代理挂了」,我俩就这么一来一回,把路趟平的。
现在干这种活儿的体感,真的跟两三年前,完全是两个世界了。
反正现在,每天中午,我手机还是会震。
但只震一下了。
就这一下的差别,背后是一个飞书群被两台电脑当成了黑板,是四个权限的坑,是一行绕过代理的配置,是「宁可重不可漏」的一个小小取舍。
一件特别小的事。小到不值一提。
但我就喜欢这种小事。喜欢那种,把一个本来每天让你皱一下眉的小别扭,亲手捋顺了的感觉。
这世界上大部分的好东西,可能都是这么,一下一下,捋顺出来的。
夜雨聆风