把自己走回来 书架

第 12 章 / 共 16 章

第12章 · 黔东南的梯田:慢,是一种被验证过千年的算法

从梵净山下来,我进了黔东南。

准确说是从江县往南,加榜乡一带的大山里。班车开到某个岔路就不走了,剩下的路靠腿。我背着包在盘山土路上走,走一个多小时才见一户人家。这一带的山不像北方的山那样一整块拔地而起,它是被人一刀一刀切出来的——从谷底到山顶,一层一层的梯田,像谁把一整座山削成了等高线图。加榜梯田,据说是苗族人从明代就开始垒的,到现在四五百年。

我在一个叫党扭的寨子边上停下来,蹲在田埂上看。那天不忙,一个老倌在放水,赤脚踩在泥里,手上拿把小锄,把这一格田的水口挖开一点点,让水漫到下一格。他动作很慢,慢到我一度怀疑他是不是在发呆。水从最高那格,顺着一格一格往下渗,走完整座山可能要走一整天。

他们的地,是活的

后来在寨子里借宿,主人家给我讲了这套东西怎么运作,我才知道自己看漏了多少。

他们种的不只是稻。田里放着鱼——鲤鱼,秧插下去没多久就把鱼苗撒进水里。田埂上、水面上再养鸭。这叫稻鱼鸭共生

说人话:一块水田里同时干三件事。稻子长在水里;鱼在稻子底下游,吃虫子、吃杂草、吃掉在水里的稻花,鱼拉的屎又肥了田;鸭子在田里划水,吃更大的虫、踩死杂草,顺便把水搅浑让害虫待不住。三样东西互相喂、互相清理,人几乎不用打农药,不用怎么施肥。一块地的产出,是米、是鱼、是鸭、是鸭蛋,好几样。

我是写代码的,看到这套东西,脑子里第一反应居然是"这系统耦合得太厉害了吧"。稻、鱼、鸭绑死在一块地里,牵一发动全身。要是我来设计,我八成会想着"解耦":稻田归稻田,鱼塘归鱼塘,鸭子圈到棚里工业化养殖,每一样单独优化到极致,产量拉满。

可我算了一下当地人给我报的数,愣住了。单看稻子的亩产,这种田确实不高,比平原上化肥催出来的差远了。可它几乎不花钱、不塌方。不买农药化肥,不买鱼饲料,一块地当好几块地用,最要命的是——它几百年就没怎么绝收过。

我最爱干的那件事,恰恰是它没干的

我们这行有句被引用到烂的话,Donald Knuth 说的:premature optimization is the root of the evil。

过早优化是万恶之源。以前我把它当一句写代码的技术忠告:别在还没搞清楚瓶颈在哪之前,就一头扎进去抠某段代码的性能,把它写得又快又聪明又难懂——结果那段根本不是瓶颈,你白费劲,还把代码搞脆了。

再翻译一层:优化,本质是"把某个指标拉到极致"。但拉极致是有代价的——你为了让这一处更快、更省、更高产,往往要砍掉冗余、砍掉备份、砍掉那些"看着没用"的东西,让整个系统变得又紧又脆。过早,是指你还没真正搞懂这个系统会遇到什么、什么才是关键,就急着把它拧到最紧。

站在这片梯田前我才反应过来,这句话我一直只懂一半。我以为它讲的是"时机"——早了不好,晚点优化就对了。其实它真正戳的是另一件事:在一个你还没吃透、而且充满意外的世界里,"把某个指标拉满"这个动作本身,就是危险的。

平原上那种化肥高产田,就是一次极致优化:所有变量都往"这一季稻子产量最大"这一个数上使劲。它在天气正常、农药供得上、市场稳定的时候,确实碾压梯田。可它是绷紧的——一旦来个虫灾、来个旱、化肥断供、地力被榨干,它就整片塌。它把所有鸡蛋放进了"产量"这一个篮子。

梯田反过来。它一点都不追求某个指标最优,它追求的是鲁棒性

鲁棒性,robustness,就是"抗造"。不是说它跑得多快、产出多高,而是说不管你怎么折腾它——今年多雨、明年干旱、虫子突然变多——它都不会崩,总能给你一个还过得去的结果。稳,比高,更重要。

它靠什么抗造?靠的正是我一眼想砍掉的那些东西——冗余。鱼是稻的冗余,鸭是鱼的冗余,一样东西出事,还有另两样兜着。稻子欠收,起码有鱼有鸭有蛋。水一格一格慢慢淌,也是冗余:慢,意味着每一格田的水位、温度都有缓冲,上游出点岔子,下游有的是时间反应。

在我原来那套价值观里,冗余等于浪费,慢等于低效,耦合等于设计糟糕。这三个词,是我过去十几年在公司里天天想着要消灭的东西。而这座山上的人,把这三样"缺点"垒了四五百年,垒成了饿不死的底气。

放水的人不急

那个放水的老倌,我后来又见过他两回。他真的不急。水走得慢,他就等;这一格满了,他挪到下一格。他没有一个"今天必须放完多少亩"的 KPI 顶在脑门上。

我问同住的年轻人,为啥不修个水渠、装个泵,一下把水打上去,多快。他想了想,说,泵会坏,坏了没人修;水渠一冲垮,底下几十户没水。这样一格一格漫,慢是慢,但从来不会一下子全断。他不懂什么鲁棒性,可他把这事讲得比我任何一个技术评审都清楚:他们不是没能力搞快的,是几百年下来,他们知道快的会断,慢的不会。

我在城里的那些年,判断一个方案好不好,标准从来只有一个维度:快不快、多不多、省不省。更高的吞吐、更短的响应、更低的成本。"好"就是把某个数字往极致推。我甚至从没怀疑过这个"好"字本身。

可这套标准,是有前提的——它假设世界是稳定的、可预测的、意外很少的。在写字楼里、在数据中心里,这个前提大致成立,所以极致优化才划算。但我这一路走过来,膝盖废过,罗霄山里迷过路,梵净山顶看云说散就散——我越来越清楚,真实的世界根本不是那样。真实的世界充满意外。

在一个充满意外的世界里,"最优"是个陷阱。因为你优化的是你以为会发生的那种情况,而世界偏偏在你没优化的地方给你来一下。这时候,能救你的不是那个跑得最快的设计,是那个摔不死的设计。

我蹲在田埂上,忽然有点想笑,也有点堵得慌。我前半辈子,一直在做那块化肥高产田——把自己所有的变量都往"效率"这一个数上拧,砍掉一切我判定为冗余的东西:闲聊、发呆、走神、那些"没用"的关系、那些不能计入产出的时间。我把自己优化得又快又满,然后在四十岁上,整个人啪地塌了。我不是被某件大事击垮的,我是被自己拧得太紧,脆了。

而这座山上的人,用四五百年告诉我另一种"好":慢,是一种被验证过千年的算法;冗余,不是浪费,是留给意外的余地。

我没有当场就想通、就释怀。走的时候,田里的水还在一格一格往下淌,老倌还蹲在那儿。我只是第一次觉得,我脑子里那个用了半辈子的"好"字,需要重写了。至于重写成什么样,我当时还不知道。我只是把包背上,接着往云南走。

把自己走回来 · 微一
面向对世界有好奇心的人 · 费曼式写法 · 由多个 AI 代理撰写与互相审校