🎯 什麼情境該想到我

當你遇到一個「沒解過、想不到解法」的新問題時。

⚙️ 怎麼用

「不會解 X?先解一個你會解、且和 X 相似的問題。」

  1. 問:這題讓我想到什麼解過的問題? 找出結構相似之處(資料形狀、操作、目標)。
  2. 借用那個問題的解法骨架,再針對差異調整。
  3. 善用既有模式:設計模式、演算法策略、資料結構——把新問題對應到已知模式(見 工具-演算法設計策略、設計模式)。
  4. 若找不到直接類比,先解一個更簡單的相似版本,再往上加。

★ 書中的定義:類比有「整題」和「局部」兩種

《像程式設計師一樣思考》對類比的定義是:目前問題與已經解過的問題之間的相似之處,可以被利用來幫助解決目前的問題。相似有不同程度:

程度例子怎麼用
整題相同書中的「狐狸、鵝、玉米」過河謎題和一個密碼鎖問題,本質上是同一題直接套解法
只有一部分相同兩個完全不同的數字處理問題,唯一共通點是都需要超過內建浮點數的精度只把「處理精度」那一塊的解法搬過來

多數類比是第二種。所以找類比的問法不是「這整題像什麼」,而是「這題的哪一個部分我以前處理過?」

★ 為什麼它最難練:你需要一個「解法庫」

書說辨識類比是最能提升解題速度的方法,也是最難培養的——因為你得先有足夠多自己解過的題目,才有東西可以類比。

書特別警告一條捷徑:找一段相似的程式碼來改。問題在於:

  1. 你沒有自己完成解法,就沒有真正理解它;很難正確修改一段你不完全理解的程式。
  2. 每個你自己寫成功的程式,都會成為未來的類比來源;現在越依賴別人的程式碼,未來就越依賴。

這個警告在 AI 生成程式碼的時代更貼切:直接接受 AI 給的解法而不理解,等於放棄累積自己的解法庫。

★ 程式設計中最常用的類比來源

你遇到的問題可以類比到的已知問題
「找出兩個版本的設定差在哪」最長公共子序列(diff 演算法)
「任務之間有先後依賴,排出執行順序」拓撲排序(見 拓撲排序)
「限制每個使用者每秒的請求數」權杖桶(見 工具-限流器設計)
「多個服務要對某件事達成一致」共識問題(見 工具-線性一致性與共識)
「很多來源的資料要合併且去重」合併排序的 merge 步驟 + 雜湊集合
「在一大堆可能中找最佳組合」背包問題 → 動態規劃(見 動態規劃)

★ 驗證類比:找出「不一樣的地方」

借來解法之後,要明確列出兩題的差異,逐一檢查每個差異會不會讓解法失效:

  • 限流器類比權杖桶 → 差異:分散式,多台機器要共享桶 → 單機版解法不夠,需要共享儲存。
  • 任務排程類比拓撲排序 → 差異:依賴可能有環 → 拓撲排序要能偵測環並回報。

🧪 我實際套用的紀錄

  • 2026-07-15:(待填)

⚠️ 注意

  • 類比是起點不是終點;相似不等於相同,要驗證借來的解法對這題真的成立。

🔗 相關工具