概念地圖・兩將軍問題
分類:系統
這一頁不只是把一個概念解釋一遍——一張自己畫的結構圖,加上拿台灣情境從頭走一次的實例演練、這個框架什麼時候會騙你,以及它接回 P.A.I.N. 之後長什麼樣。一頁必須交付的三層 →
兩將軍問題:確認鏈永遠差一層
晚上九點四十,剪接師把成片傳出去,傳訊軟體上跳出「已送達」。他還是補了一句「收到請回」。對方回了「收到」——然後換對方開始不確定:這兩個字,他到底看到沒有。兩將軍問題畫的就是這條鏈。兩支軍隊隔著一道會吃掉信差的峽谷,要在同一個時間一起進攻,只能靠來回送信對時間。這張圖沒有在算「送幾次才夠」。它畫的是一件更硬的事——在這種通道上,「兩邊都確定對方也確定」這一層,永遠補不完。
三則回條,一則比一則少了什麼
把峽谷兩邊的帳一列一列攤開,這條鏈的形狀就出來了。
| 送到第幾則 | 甲軍手上多了什麼 | 乙軍手上多了什麼 | 還缺的那一層 |
|---|---|---|---|
| 第一則(甲→乙:明早六點進攻) | 只知道自己送出去了 | 我收到約定了 | 甲軍不知道它到了沒 |
| 第二則(乙→甲:收到) | 他收到約定了 | 只知道自己回了 | 乙軍不知道回條到了沒 |
| 第三則(甲→乙:你的收到我收到了) | 他知道我收到了 | 他知道我收到約定 | 甲軍不知道它到了沒 |
| 第 N 則 | 再往裡多包一層 | 再往裡多包一層 | 差距還是一層 |
每多送一則,兩邊知道的事都往裡多包一層:從「他收到了」變成「他知道我收到了」,再變成「他知道我知道他收到了」。塔一直長高,缺口卻一直卡在最上面那一格——而那一格永遠屬於剛剛按下送出、還沒等到回音的那個人。再送幾則都補不上這個缺口,這種通道上沒有一則訊息能同時當「內容」,又當「它自己的送達證明」。
還要不要再等一則,三個問題先問過
這條鏈沒有終點,可是你有預算、也有下班時間。要決定的其實只有一件事:這一則之後,還值不值得再等下一則。三個問題問完,答案通常自己會浮出來。
一、賭錯的那一邊有多貴。剪接師手上那支片,如果客戶其實沒看到、隔天早上照舊上架了舊版,代價是重壓縮、重上傳,加上一次道歉。這種代價一小時內吃得下,那麼「已送達」加一則回條就夠了。換成一支要在記者會現場播的片,同樣的沒看到就是全場空轉,還賠掉整年的合作。這時候該換的是通道——打一通電話,讓兩邊在同一秒都在線上。判斷順序永遠是先秤後果,再秤要不要多花一則訊息去買心安。自問:這件事如果對方其實沒收到,我付得起那個後果嗎?
二、你還缺哪一層。客戶回「收到」,剪接師手上就有了第一層:他知道對方收到了。可是他接著回「那我就按這版送壓縮」,要的已經是第二層——他要客戶知道「他已經知道客戶收到了」,客戶才不會半夜另外找人改一版。層數不一樣,該做的事也不一樣:缺第一層,補一則回條就好;缺第二層,補的是一次雙方同時在場的確認。多數人把兩種缺口混成同一句「再問一下」,於是問了三次還在原地。自問:我還缺的是「他知道」,還是「他知道我知道」?
三、有沒有一個不用再問的對帳點。字幕外包這一行最有效的一招,是把交付規則寫死:檔案一旦出現在共用資料夾的 final 目錄,就視為送達;隔天上午九點前沒有人回覆修改,就照那一版開壓。規則不會讓不確定消失,它只是把不確定挪到一個雙方都同意的地方——挪到時鐘上。時鐘兩邊都看得到,也不必再送一趟信去問它。找不到這種對帳點的時候,才輪到多送一則訊息。自問:有沒有一個不必再問一次就能對帳的方法?
一家字幕外包工作室的交片確認,把三則回條走一遍
底下這家台灣中部的字幕外包工作室,是為了把這個結構講清楚而編出來的示意情境,沒有指涉任何真實公司。
- 21:40 第一則送出:剪接師把六十分鐘的成片傳上客戶的雲端連結,附一句「明早八點上架前若要改,請今晚回我」。畫面顯示已送達。內容到了對面的伺服器
- 21:40 之後那二十五分鐘:他盯著對話框。已送達證明得了檔案抵達,證明不了窗口今晚會打開手機。送出的一方不知道它被看到沒
- 22:05 第二則回來:客戶回「收到,我看一下」。剪接師手上多了一層——他知道對方收到了。第一層補上
- 23:15 第三則送出:他回「那我就按這版送壓縮」。這一則要的是第二層:讓客戶知道「他已經知道客戶收到了」,客戶才不會另外找人改一版。而這一則有沒有到,他還是不知道
- 再下一則:客戶若再回一個「好」,缺口就整個換到客戶那邊。階梯換人站,就是不結束
三則走完,這家工作室比 21:40 那一刻確定的東西其實沒有多多少。真正讓那一夜能收工的,是 23:15 之後他做的另一件事:把「明早八點前沒有新訊息,就照這一版上架」寫進合作備忘,於是兩邊都不必再猜下一則。確認鏈換成了一個看得見的時刻,而時刻不需要送信。工程上處理兩將軍問題的辦法就長這樣——把「兩邊都確定」這個目標降級成「風險夠低」:重送、逾時、隔天早上一次對帳。降級聽起來像認輸,它其實是這個題目唯一能交出來的答案。以上為說明結構用的示意情境,僅供理解框架之用。
這條確認鏈什麼時候會騙你
- 再送一則,多半只買到安心。第二則回條把主觀的踏實感往上拉一大段,客觀上只是把缺口往上挪了一格。第三則以後的邊際效益幾乎歸零,而每一則都在佔用對方今晚剩下的注意力。真正的分岔在於要不要換一條通道:一通電話、一次同步會議、一條寫死的截止規則。把「再問一次」當成努力,會讓人一直待在成本最高、收穫最小的那一段。
- 把「已送達」讀成「已看到」。系統回報的是封包抵達,人的注意力抵達沒有任何欄位在記。這兩件事之間隔著一支靜音的手機、一場會議、一個正在哄小孩睡覺的窗口。凡是把不可逆動作(上架、出貨、開壓、匯款)掛在「已送達」上的流程,都在替自己埋一個看不見的假設。要嘛加一道人回覆的門檻,要嘛把動作設計成可回復。
- 把「共識不可能」讀成「所以不必決定」。定理否定的只有「兩邊都確定」這個狀態,行動本身完全不受影響。實務上大家每天都在沒有完美共識的情況下出貨、開會、按下上架,靠的是逾時、重送、事後對帳把風險壓到願意承擔的高度。拿這條定理去合理化「反正說不準,那就先不做」,是把一個關於資訊的結論,硬套到一個關於責任的問題上。
用痛點的眼光量這條確認鏈
每一則確認,都在替下一則確認製造理由。
你回了「收到」,對方就開始想知道你的「收到」到了沒;他補一句「你的收到我收到了」,你又開始等下一則。鏈的成本是遞增的——訊息本身很便宜,貴的是兩個人耗在等待與猜測上的注意力,一則疊一則。《痛點》那把尺問的一直是同一件事:誰在痛、痛多深。這張圖畫得出訊息走了幾趟、缺口停在誰手上,畫不出對面那個窗口今晚還剩多少力氣被打擾一次。所以真正該量的,是那個人的耐受度:他在什麼時間、什麼狀態下,願意為這件事再回你一行字。量出來之後你會發現,大部分的「再確認一次」買到的是自己的安心,對方那頭並沒有因此少掉一件事。今晚可以做的很小:翻開你最近一個還在等回覆的對話,寫下一句「如果對方其實沒看到,最壞會怎樣」,照那個答案決定明天早上要不要先打一通電話。
關於兩將軍問題,常被問到的幾件事
兩將軍問題到底證明了什麼?
它證明的是:在訊息可能遺失的確定性通道上,兩邊無法達成共識。證法很短——假設存在一套保證共識的協定,取它送出訊息最少的那一版本,最後那一則訊息的送達與否對結果不能有影響(否則送出的一方就沒有把握),於是刪掉它仍然成立,得到一套更短的協定,與「最少」矛盾。一路推下去,訊息數只能是零,而零則訊息顯然做不到共識。請留意它的強度:證明說的是做不到,重試幾次都改變不了這個結論。
網路上大家不是天天在傳訊息嗎,TCP 三次握手不就解決了?
三次握手降低風險,沒有消除它。握手做完,最後一則 ACK 有沒有抵達,送出的那一端一樣不知道,只是實務上遺失的機率低到可以忽略。整個網路工程處理這件事的方式都是同一套:重送、逾時、序號去重、冪等設計、事後對帳。這些手段把「確定」換成「夠低的風險」,讓系統在無法達成共識的前提下照樣運轉。把它當成務實的降級處理,而不是把定理推翻了。
團隊溝通上,最少要送幾則才算夠?
沒有一個對所有事都成立的數字,判準來自三件事:賭錯的後果成本、你還缺第幾層、有沒有現成的對帳點。日常協作多半一則送達加一則回條就收工。牽涉到不可逆的動作,例如上架、出貨、開壓、匯款,就別把賭注押在訊息鏈上,改成同步通道或一條寫死的截止規則。真正省時間的做法,是把規則寫在事前——事發當晚一則一則追,追的永遠是同一條沒有盡頭的階梯。
找一個第三方見證,是不是就能繞過去?
繞不過去。第三方與兩邊之間仍然是同樣會遺失訊息的通道,原本一條不可靠的鏈變成兩條,缺口只是從中間挪到了兩側。真正有效的替代品是改變賽局本身:把兩邊拉進同一條同步通道(電話、會議、同一台機器上的交易),或者事先約定一個雙方都觀察得到的外部條件,例如時鐘、共用資料夾的狀態、一份簽好的合約條款。
下一次要決定「還要不要再等一則回覆」時,把這張圖攤開來數一數:你手上是第幾層,對方手上是第幾層,缺的那一層值多少錢。想再往分散式系統的取捨看一層,可以接著讀一致性、可用性與分區容忍的取捨;想知道節點增減時資料落在誰身上,那張圖在一致性雜湊環。
喜歡這篇文章嗎?
每週幫你拆二本好書,把判斷力、好書金句、好問題,直送你的信箱。
不適合你可隨時退訂 · 每週兩封,陪你把書讀進生活。
送出即表示同意我們依隱私權政策使用你的 email。