改編自 《狐狸和貓》

從不需要被選擇的那個策略

各自備著的東西

在這座共用叢集裡,資源回收掃描可能毫無預警地到來:一次例行的成本稽核,升級成對任何在四百毫秒視窗內沒能正確回應的程序,發出的立即終止令。百策為應付這件事花的設計時間,比他做過的幾乎任何其他事都長:一套一百種不同凍結釋放策略的庫,各自針對不同的資源特徵調校,動態地依情境權衡後再選用。

一鍵只有一個。一項單一、無條件的資源釋放並凍結動作,每次都一模一樣,沒有分支、不權衡情境,也不宣稱自己在哪種情況下處理得比另一種情況更好。這個動作從來沒有被細緻化過,因為從來沒有人要求過把她細緻化。

百策幾乎覺得看著這個有點尷尬。他說,這麼大的一座叢集,值得一個貼合實際發生狀況的回應——不是不管情況如何,都重複同一個生硬的動作。

平常,靈活贏得了什麼

在一般的負載波動下——這座叢集每天都會遇到的那種,跟真正的掃描完全不是同一回事——百策的靈活確實值回票價。一次小幅尖峰,適合用一種保住產出量的輕策略;一次緩慢的洩漏,適合換另一種犧牲一點產出量、換取餘裕的策略。以任何一個普通月份來衡量,他的選擇都以很大的差距勝過單一固定回應。

一鍵那個單一動作,用在同樣這些一般波動上,往往超出當下實際需要——一次完整凍結,遠比一個較輕的處理方式付出更多代價。而在絕大多數、根本沒有真正掃描到來的日子裡,她每一次都付出了這個代價。

依照任何人在追蹤的每一項指標,這都讓百策成為設計得更好的系統。沒有人在追蹤他那套權衡過程本身要花多久,因為在一百個平常的日子裡,從來沒有任何一次,真的需要它變快。

視窗在四百毫秒關閉

掃描到來時,沒有給出一般波動會給的那種禮貌:沒有緩升,沒有提早的訊號,只有視窗開啟,然後四百毫秒後,不管視窗裡有沒有正確回應,直接關閉。

視窗一開,一鍵立刻觸發。這個單一動作不需要把情境拿去跟一套策略庫權衡,因為它從來就不是被設計來權衡任何東西的——早在這次掃描存在之前,它就已經是她唯一會做的事。

百策開始了他一向會開始的那套程序:讀取情境、對照那套百種策略的庫、逐步收斂到最貼合這次掃描形狀的那一個。這正是他在平常日子裡會走的同一套程序,只是那時候只花掉一段從來沒有人需要精確測量的、極短的時間——因為在平常的日子裡,從來沒有任何東西在替他計時。

一百個正確答案的代價

視窗關閉時,百策還在收斂。事後覆核確認,他那一百種策略裡,至少有四種,如果在視窗開啟的當下就直接套用,本可以在視窗內乾淨完成——問題從來不在那套庫本身。問題是,他的架構裡,從來沒有建過一條能跳過權衡、直接抵達任何一個答案的路徑。

他建了一百個正確答案,卻從來沒有建過一條不必先問「該選哪一個」,就能抵達其中任何一個的路。平常的日子裡,這個問句只花掉一段沒有人在意的極短時間。真正有東西在替他計時的那一天,這個問句本身就佔滿了全部四百毫秒,底下那一百個正確答案,沒有一個真正得到機會被執行。

一鍵,從來沒有人去稽核她那唯一一個動作的結果是不是最佳解。她只有一個結果,而這次掃描要求的,也正好只有一件事:在視窗關閉前,做出某件正確的事,任何一件都可以。她從來不需要是最好的答案,她只需要是那個不必被選擇的答案。

他建了一百個正確答案,卻從來沒有建過一條不必先問「該選哪一個」就能抵達的路。她只建了一個,而她從來不必問。

平行版本

上方是維持原樣的經典版。下方是平行版本——作者認為某位讀者的反應值得留下時,另外發表的完整替代版本,而不是直接修改原作。

平常日子的代價

平常日子付出的代價

百策被回收之後的那次覆核,沒有停在那次掃描本身。它回頭翻查了好幾個月份的平常日子紀錄,第一次把一鍵那個完整凍結動作,用在每一次連真正掃描的邊都沾不上的微小波動上,實際付出的代價加總起來——每一次,都放棄了一些產出量,為的是一個被設計來撐過大概一百天裡才會出現一次的緊急狀況的回應。

這個數字是真實的,卻從來沒有被拿去跟任何東西權衡過,因為轄區的帳目裡,從來沒有人要求平常的日子,也像那一個緊急的日子評判百策一樣,替自己辯護。

反射能做到、選擇做不到的事

覆核為百策提出的修法,沒有動他的策略庫,只在它底下加了一樣東西:一個事先選定、決策當下不再重新評估的策略,一旦視窗剩餘時間跌破一個固定的餘裕值,就立刻觸發——這是一個反射動作,不是一個選擇,跟他一般的權衡程序並行運作,而不是取代它。

如果權衡先完成、給出一個更貼合當下情境的答案,這個答案依然能推翻反射的結果。如果視窗在權衡完成前就關閉,反射的答案早就已經在跑了——從跌破餘裕值的那一刻起就是。百策沒有失去他那一百種策略給他的任何東西。他多得到的,是一層底線,撐住了那個他們沒有一個,速度快到能碰到的時刻。

一個便宜的問題能省下什麼

一鍵的修法比較小,對她的要求也比較少:一項固定、幾乎即時的嚴重度檢查,便宜到即使在最緊的視窗裡也能塞進一小段時間,在她那個單一動作觸發之前跑一次,而不是取代它。

如果這項檢查完成,回報嚴重度低,她就能釋放一個較輕、貼合一般波動形狀的回應。如果檢查來不及完成,或回報的結果不夠明確地低,她就回到她一直以來的做法:完整、無條件的凍結,沒有例外,不重新考慮。這個反射動作,從來沒有被要求要聰明,只被要求快到值得去問一次。

真正被設計來應付的是什麼

十一週後,真正的掃描再次到來。百策的反射在視窗內觸發;跟它並行運作的完整權衡程序,沒有來得及完成——而這一次,第一次,這件事不再重要。同一天下午,下一次一般波動也到來了,一鍵的嚴重度檢查在她舊有的預設動作原本連要不要觸發都還沒評估完之前,就先回報了低嚴重度。

他們兩個,都沒有變成對方。百策沒有變得擅長快速選擇;一鍵也沒有變得靈活。轄區真正打造出來的東西,比這兩者都窄:一層撐住那個慢的、一層蓋住那個貴的,讓「撐過罕見的那一天」跟「在平常的日子裡少付一點代價」,不再是兩者之間必須二選一的東西。

撐過罕見的那一天,跟在平常的日子裡少付一點代價,從來不需要在兩者之間二選一。需要的,只是有人去問:在對方沒有被考驗的那些日子裡,各自付出了什麼代價。