問題即空間
每個問題都勾勒出一個空間
問題不只是詢問單一事物。它開啟了一個可能答案的空間,而每個候選答案都是該空間中某處的一個點。
「選個地方吃飯」開啟了一個巨大的空間:地球上的每家餐廳、咖啡館、流動攤車與廚房。「選一個步行可達、現在營業、素食且低於十五美元的地方」則開啟了一個微小的空間:可能只有三個點。
意圖相同,幾何結構卻截然不同。第二個問題做了實質工作:它在任何人開始搜尋之前,就縮小了空間。
這整堂課可以用一句話概括:一個好問題,是將答案空間縮小至值得搜尋區域的問題。 模糊的問題會留下廣闊的空間,迫使搜尋變得緩慢且漫無目的。而精準的問題則會交給你一個小空間,讓你一眼就能掃描完畢。
我們將透過四個幾何概念來精確化這一點:分割空間、用約束條件切割空間,以及透過精心挑選的是/否問題將空間減半。
寬廣與狹窄
考慮兩種請求協助除錯程式的方式:
- Q1:「為什麼我的程式碼無法運作?」
- Q2:「為什麼這個迴圈在 Python 3.12 上,當清單有 10 個項目時,卻只印出 9 個項目?」
將空間分割為區域
將大問題拆解為區域
當一個空間大到無法直接搜尋時,你可以劃分它:將其分割為互不重疊的區域,這些區域合起來涵蓋整個空間。回答一個子問題,意味著選取其中一個區域,並忽略其餘部分。
假設問題是「上個季度營收為何下降?」答案空間非常龐大。將其劃分:(a) 客戶數量減少,(b) 相同客戶消費減少,(c) 定價或計費變更,(d) 資料錯誤。這四個區域涵蓋了整個空間且互不重疊。每個區域都是一個你可以獨立處理的較小問題。
一個好的劃分具備兩個直接借鑒自幾何學的性質:這些區域覆蓋整個空間(沒有遺漏),且它們是互斥的(沒有重複計算)。若遺漏了空間的一部分,真正的答案可能就隱藏在缺口之中;若區域之間有重疊,則會浪費精力在同一塊領土上搜尋兩次。
每個子問題將你的注意力收束到一個區域。一旦回答它,你就排除了該區域之外的一切:這是一種大幅且低成本的搜尋空間縮減。
乾淨的劃分
某城市提出問題:「為什麼緊急應變反應時間正在上升?」
一位分析師建議將其拆解為:(a) 通話到派遣人員的時間變長,(b) 人員派遣後抵達現場的時間變長,以及 (c) 人員完成任務並釋放的時間變長。
每個需求都切分空間
作為半平面的約束
想像答案空間是一個平坦的平面,每個點都是一個候選答案。約束就是一個需求,& 每個需求在平面上畫出一條線 & 只保留其中一側。在幾何學中,這個被保留的側面稱為半平面。
「低於十五美元」是一條線;保留便宜的那一側。「步行可達」是第二條線;保留較近的那一側。「現在營業中」是第三條。你每增加一個需求,就是多一次切割。
滿足所有需求的答案,位於所有保留側面的交集中。將足夠多的半平面取交集,你會得到一個小的有界區域:一個整齊的區域,裡面包含唯一正確的答案。
兩種失敗模式
約束不足(切分太少):區域保持無界。它會延伸至無限遠,因此無限多個模糊的答案都「符合」條件。「給我一個好點子」就是無界的。你得到的是雜訊,因為沒有任何東西被排除在外。
約束過剩(切分太多,或相互矛盾):區域變為空集。這些半平面沒有共同點,因此沒有任何答案符合條件。「一個既是偶數又是奇數的數字」將空間切割至無物。
一個良定義的問題位於這兩者之間:有足夠的約束來界定區域,但不至於多到彼此矛盾並使區域變空。
有界、無界、空集
一位經理向設計師要求「一個標誌」。後來他們要求「一個標誌,必須是單個字母、單色、在 16 像素下可用,且同時使用至少四種顏色」。
最佳切割將空間一分为二
二分搜尋:每個是/否問題將空間減半
有些問題是是非題。從幾何角度來看,一個是非題畫出一條線,並告訴你答案在哪一側:它一筆就丟棄整個區域。
最佳的是能將空間切成兩等份的是/否問題,因為無論得到哪個答案,你都恰好排除了剩餘的一半。不斷問「它在上半部嗎?」,空間便會以幾何級數的速度迅速收斂。
這就是二分搜尋。從 N 個候選開始。提出一個好的問題後,剩餘 N/2 個。兩次後,剩餘 N/4。經過 k 次提問後,剩餘 N / 2^k。當只剩下一個候選時便完成,因此你需要找到最小的 k,使得 2^k 至少為 N。
這個最小的 k 是 log2(N) 的上整數(ceil)。對於一千個候選:2^9 = 512(不夠)& 2^10 = 1024(足夠),因此 log2(1000) 約為 9.97,你需要 10 個問題。十億個候選呢?十億的 log2 約為 30。二分法的力量如此強大,從一千增加到十億,僅需多問約二十個問題。
提問的啟示:一個精準的是/否問題,在將剩餘空間均勻分割時價值最大。一個偏頗的問題若只能排除極小部分,便浪費了這次提問機會。
確保找到目標
你正在玩一個猜數遊戲。某人從 1 到 1000 中選取一個整數。你只能提問是/否問題,且你以最佳策略進行(每個問題都將剩餘候選盡可能均勻分割)。
當答案變得廉價,切割便顯得珍貴
提問即是工作
將這四個部分結合起來。一個問題開啟了一個空間。分解將其劃分。約束條件將其切割為有界的可行區域。好的「是/否」問題將其減半。這些每一個都是在尋找答案之前縮小搜尋範圍的行為。
在歷史的大部分時間裡,答案才是昂貴的部分。你需要付費請專家、進行實驗、翻閱檔案。因此,我們重視那些能產出答案的人。
這種平衡已經被顛覆。自動化系統現在能以極低的成本,批量生成大量看似合理的回答。當回答變得廉價且充裕時,再多產出一個已不再是成就。真正稀缺的,是知道哪一個回答值得擁有:這是一項提問的技能,而非產出回答的技能。
從幾何學的角度來看:機器會樂意提供空間中的任何一點。你所增加的價值,在於繪製那些將空間切割至「好答案必然存在」之特定區域的約束條件。若約束不足,你將淹沒在看似合理的雜訊中(一個無界區域);若約束過多,則什麼都得不到(一個空區域)。提出恰當的切割,使區域大小剛好合適,才是那項稀缺的、屬人的技能。
因此,槓桿點不在於「獲得一個答案」,而在於「提出約束條件,使答案空間小到足以讓其中的任何一點都值得擁有」。
價值轉移之處
分析師現在可以在幾分鐘內,以幾乎零成本生成一百份策略草稿。
問題幾何學:總結
你學到了什麼
問題不是對單一答案的請求。它是一個空間,包含各種可能的答案,而提問的藝術就是縮小這個空間的藝術:
- 搜尋空間: 每個問題都開啟了一組候選答案。精準的問題開啟一個小集合;模糊的問題則開啟一個龐大集合,讓你在其中漫無目的地遊蕩。
- 分解即劃分: 將一個大空間分割成互不重疊且完全覆蓋該空間的區域;每個子問題將你引導至其中一個區域。
- 約束即邊界: 每個需求都是一個半平面;答案位於它們的交集之中。切割過少會留下無界區域(無限的模糊答案);相互矛盾的切割則會留下空區域(無解)。
- 二分法縮小範圍: 一個精心設計的是/否問題,能將搜尋空間一分为二。要在 1 到 1000 之間鎖定一個數字,需要 ceil(log2(1000)) = 10 個問題;而鎖定十億個數字,也只需要大約 30 個問題。
而其中的回報在於:當自動化系統讓獲取答案變得廉價時,稀缺的技能不再是「生產答案」,而是提出能將空間切割至唯一值得擁有之區域的約束條件。學會畫出這些切割線,你便能將漫無邊際的漫遊式搜尋,轉化為短小精悍的搜尋過程。