你按的不是开关,是一个环
按开关是一件有始有终的事:你按下去,灯亮了,结束。而「一边看一边调」不是——它没有终点,它是一个会自己转下去的圈。这一章要说的是:当你把「看一眼再动手」这件事装进任何系统,你手里的东西就换了一个物种,它开始有自己的脾气,而那个脾气不在你写的那条规则里。
有个人在调洗澡水。水从 25°C 开始,他想要 40°C。他的做法很朴素:觉得凉就往热的方向拧,觉得烫就往回拧,差得越多拧得越快。手法自始至终不变。
现在只改一件事:水管长度。短水管,水从阀门流到他身上要 1 秒;长水管,要 8 秒。
问:长水管的情况下,他大约要多久能把水温调到 40°C 并稳住?
心里落一个答案。这一章的最后会给出真跑出来的数,也会告诉你,如果你选了 A 或 B,你的直觉是在哪一步拐错的。
一件所有人都做过、但没人解释过的事
先把这件事的结构看清楚。调水温的时候,你在做四个动作,循环往复:
- 感觉——水打在身上,你知道现在大概几度;
- 比较——和你想要的温度比一比,得到一个「差多少」;
- 动手——朝着缩小这个差距的方向拧;
- 回到 1。
注意第 4 步。正是它让这件事和「按开关」有了本质区别。按开关的时候,你的动作和结果之间是一条直线:按下去 → 灯亮。而调水温的时候,你的动作会改变水温,水温又会改变你下一步的动作,你下一步的动作又会改变水温——它是一个圈。
这个圈有个名字,叫反馈环(feedback loop)。「反馈」这个词在日常汉语里已经被用得很软了(「给我反馈一下」),但在这里它有一个非常硬的意思:系统的输出,被送回去当作输入的一部分。就这么一件事。
而这件事的后果,大得离谱。
一旦你把输出接回输入,你手里的东西就换了一个物种。它的行为不再由你写的那条规则单独决定,而是由整个环决定——包括那个你控制不了的设备、那根你没在意的水管、那个你以为无所谓的「晚半秒才看到」。
本书要反复演示的是:这些「无所谓的细节」不但有所谓,而且往往是决定性的。你写的控制律可以一个字不改,只把某个别处的延迟拉长一点,同一个系统就从「三下调好」变成「永远调不好」。
为什么调水温要来回好几次
标准解释是「因为水温反应慢」。这个解释不能说错,但它把两件完全不同的事糊在了一起,而这两件事在后面的章节里会被反复分开:
- 惯性:你拧了阀门,水温开始变,但它是慢慢变过去的,不会瞬间到位。(混合腔里还有一腔旧水。)
- 延迟:你拧了阀门,什么都没发生——一秒、两秒、八秒——然后才开始变。(水还在管子里走。)
它们听起来都叫「慢」,但对一个环来说,它们是两种完全不同的毒。惯性只是让你等;延迟会让你做错事——因为在那段什么都没发生的时间里,你会以为「我拧得还不够」,于是继续拧。等到水终于变过来,它已经带着你多拧的那一份,一起冲过头了。
这就是本书标题的意思。过冲(overshoot),冲过头。
# 长水管:你拧的时候什么都不知道会发生什么
温度
50 │ ╱╲ ← 冲过头了
│ ╱ ╲
目标 ═╪══════════════════╱════╲═══╲═══╱══════
40 │ ╱ ╲ ╲_╱
│ ╱
30 │░░░░░░░░╲____╱ ← 你在这 8 秒里
25 │░░░░░░░░ 一直以为「拧得还不够」
└──┴──────────────────────────────→ 时间
你开始拧
░ = 延迟:动作已经做了,结果还没到
# 你没有做错任何一步。每一步你都朝着缩小误差的方向拧。
# 但你依据的是 8 秒前的水温,而 8 秒前的世界已经不在了。
下面这个 demo 里,那个人的手法完全固定——每差一度、每秒拧固定的量。你唯一能动的是水管长度。
把水管长度拖到 1 秒:他 28 秒调好,水温最高只到 41.2°C,几乎没冲过头。
拖到 8 秒:水温冲到 54.7°C(烫伤级别),然后来回摆动,永远停不下来。
请注意这句话的分量:他的手法一个字都没改。如果你把这件事当成「技术问题」,你会得出「这人手笨」的结论;而真相是,在 8 秒的水管上,没有任何人能用这个手速调好水——不是难,是数学上不可能。他必须把手速降到 0.158(每秒每度拧的量)以下才有可能,而在 1 秒的水管上,他可以急到 1.052——快 6.6 倍。
「他最快能有多急」这个上限,有个名字叫临界增益,它是这本书后半段的主角。现在你只需要记住一条经验:
水管长一倍,你的手就得慢一半。
看看那四个数:1 秒 → 1.052,2 秒 → 0.548,4 秒 → 0.292,8 秒 → 0.158。每次延迟翻倍,上限差不多对半砍。第 11 章会把这条经验变成一个能验算的等式,并用四条互相独立的方法把它算出来。
你以为它是 X,其实它是 Y
这张表是这本书的地图。左边这些话,大部分工程师(包括写这本书之前的我)都会点头。右边是学完之后你会怎么看它们。每一行对应后面的某一章。
| 你以为 | 其实 |
|---|---|
| 「稳定」是一种感觉,靠经验判断 | 是一个能算出来的整数:闭环特征方程有几个根在右半平面。有一张只做加减乘除的表能直接数出来(第 13 章) |
| 系统开始振荡,是因为增益调得太大 | 增益只是扳机,火药是延迟。没有延迟(也没有第二级惯性)的系统,增益加到十倍也不会越过终点一次(第 4 章) |
| 加大力度能更快到位 | 过了某个点,加大力度让「到位」变慢——因为它开始来回。第 12 章那台设备,力气加六成,调节时间从 20.9 秒变成 69.3 秒(第 12 章) |
| 传感器慢一点没关系,反正会追上 | 传感器慢一点,等于把整个环能用的力气按比例砍掉。慢一倍,力气减半(第 11、17 章) |
| 调 PID 是玄学,只能试 | 只要量出两个数(临界增益、临界周期),1942 年就有一张表能算出参数。它给的答案会冲过头 44.4%——而这也是可以预先算出来的(第 8、12 章) |
| 自动扩容不生效,是阈值没调好 | 常常是指标延迟超过了机器启动时间。越过这条线,任何阈值都会震荡——同一套配置,指标晚 60 秒时稳如磐石,晚 180 秒时冲到 200 台(第 22 章) |
| 重试能提高成功率 | 重试是一个正反馈环:它恰好在系统最忙的时候增加负载(第 22 章) |
| 缓冲区、库存是浪费,该砍 | 它是这个环唯一的余量。砍掉它,等于把延迟直接焊到执行器上(第 21 章) |
| 牛鞭效应是因为大家非理性 | 每一级都完全理性时,放大倍数有闭式解 1 + 2L/p + 2L²/p²。四级链条下来,工厂看到的波动是顾客的 4.27 倍(第 21 章) |
| 指标全绿说明系统健康 | 一个环只会优化它测得到的东西。测得到的那个指标涨 90% 的同时,你真正想要的可以跌 24%(第 23 章) |
| 恒温器一直开开关关,是坏了 | 那不是故障,那是设计。执行器只有开/关两档时,永不停歇的来回是唯一可能的结局(第 16 章) |
| 反馈就是「测一下,修一下」 | 反馈把系统换了个物种。闭环的行为由环路动态决定,可以和你写的那条控制律长得完全不像(第 3、6 章) |
如果这张表里有超过三行让你觉得「等等,真的吗」,那这本书就值得你读下去。
日常汉语里的「反馈」是评论的意思——「给我点反馈」。这个用法把它变成了一个可有可无的软词。
这本书里的反馈只有一个硬邦邦的意思:系统的输出被送回去,参与决定它下一步的输入。它不是一种态度,是一条连线。这条线要么在,要么不在;在的时候,系统的数学性质会彻底改变。
还有一组词也被用坏了:正反馈和负反馈。日常语境里「正面反馈」是表扬、「负面反馈」是批评。在这里它们和好坏毫无关系:负反馈是「输出偏高就往下压」(自我纠正),正反馈是「输出偏高就再往上推」(自我放大)。恒温器是负反馈,麦克风啸叫是正反馈。
而第 10 章会给出这本书最不舒服的一个结论:一个设计成负反馈的环,可以因为延迟,在某些频率上精确地变成正反馈——你什么都没改,它自己变的。
这件事的历史比你以为的短
人类造反馈装置很早——公元前三世纪的水钟就有浮子调节阀,18 世纪瓦特的离心调速器让蒸汽机能自己稳住转速。但理解反馈很晚。
1868 年,麦克斯韦(就是那个麦克斯韦)写了一篇叫《论调速器》的论文,头一回把「调速器为什么有时候会自己抖起来」变成了一个数学问题——他发现答案藏在一个多项式的根里。这篇论文直接催生了本书第 13 章要讲的那张表。
而真正让这门学问爆发的是二战:高射炮要打中飞机,得预测飞机几秒后在哪,还得让炮塔跟上——这是一个带延迟的反馈环,而且打不中的代价很直接。战后,参与这项工作的维纳把这套想法推广到生物和社会,起名叫控制论(cybernetics,词根是希腊语的「舵手」)。
所以这门学问的谱系很奇怪:它从蒸汽机来,被高射炮催熟,然后跑去解释了恒温器、经济周期、生态系统、血糖调节,和为什么组织里的坏消息总是来得太晚。这也是为什么它值得学——它不是「一门技术」,是一层透镜。
巡航定速。上坡了,车速掉下来,它加油;速度回来了,它收油。你在高速上感觉到的那种「轻微的一顶一顶」,就是这个环在工作——而且是一个整定得相当保守的环,因为汽车厂宁可让你觉得它有点迟钝,也不愿意让它在长上坡上开始一冲一冲。
你的洗澡间。下次洗澡时留意一下:老房子的热水器离浴室远,那个延迟能到十几秒,而所有人都会不自觉地把手放慢——不是因为他学过控制论,是因为快了就会被烫到。人类在这件事上普遍是合格的自适应控制器,代价是被烫过很多次。
看着仪表盘做决策的人。如果你的看板是「昨天的数据」,那你就是一个延迟 24 小时的控制器。这个环有多大力气可用,第 11 章会给你一个能算的上限——而绝大多数团队用的力气远远超过那个上限,表现出来就是方向反复横跳。
这个直觉之所以顽固,是因为它在开环里完全正确。你按下播放键,音乐晚 8 秒响,那确实只是晚了 8 秒,别的一模一样。
但一旦这条延迟被关进环里,情况就变了:延迟期间你会继续动作,而这些动作是基于已经过期的信息做的。等真相到达时,你已经多做了 8 秒的功。于是你冲过头,然后往回修,然后又冲过头——每一轮冲得更远。
上面那个 demo 就是证据:8 秒水管下,温度不是「晚 8 秒到达 40°C」,而是永远到不了 40°C。延迟在开环里是延后,在闭环里是失稳。
D在 8 秒水管上,他永远调不好。水温冲到 54.7°C,然后一直在过烫和过凉之间摆下去,而且幅度不会自己收敛。作为对比,同一双手在 1 秒水管上 28 秒就搞定了,全程最高只到 41.2°C。
这不是「慢了多少倍」的问题。这是两种不同的结局:一种会停下来,一种不会。而它们之间只隔着七秒钟的水管。
A 「延迟 8 秒,那就是所有事情推迟 8 秒」——这是把开环的直觉搬进了闭环。它在「按播放键」的世界里对,在「一边看一边调」的世界里不对。 B 「慢一倍」——这个答案假设了延迟和总耗时是线性关系。真实关系是:延迟越长,可用的力气按 1/L 下降,而调节时间按 L 上升;两头一起恶化,所以是超线性的。你可以在 demo 里看到:1 秒 → 28 秒,2 秒 → 40 秒,4 秒 → 78 秒,6 秒 → 186 秒,然后崩掉。 C 「五分钟左右」——这个答案已经抓到了「超线性」这件事,方向完全对。它只差最后一步:这条曲线不是一直上升的,它在某个临界点竖直起飞,之后就没有「多久」这回事了。L=6 秒时是 186 秒,L=8 秒时是无穷。这一章的一句话
把输出接回输入的那一刻,你就不再是在下命令,而是在设计一个环;而环的脾气,往往藏在你最不在意的那个细节里。
下一章先做一件更基础的事:把「不接那条线」和「接上那条线」摆在一起,同一台设备、同一个目标,让你看清那条线到底买来了什么。剧透一个数:当设备的实际能力比你以为的强 30%、同时半路又来了一个你完全不知道的扰动时,开环的做法会停在 1.6873(目标是 1),而闭环停在 1.00233——它自始至终不知道发生了什么。