> For the complete documentation index, see [llms.txt](https://weekly-essay.mikey.wang/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://weekly-essay.mikey.wang/zh-hant/2022/w01-a-path-to-solving-complex-problems.md).

# W01-複雜問題的解決路徑

週五晚上和雲飛聊到電商PC站裡的一個比較刁鑽的問題。想到之前寫過一篇博客專門闡述過這個事情，於是打開了塵封五年的博客站。

多年未見，有些親切和羞澀。當時工作比較閒，一心向往互聯網，閒暇時間搞了個博客，喜歡賣弄一些我以為是高深但其實只是小巧的技術點。翻看一陣，我戲稱，現在很難沉下心去寫這類東西了，做事情只會考慮能不能賺錢。

要說現在還能讓我有些小自豪的，應該就是當時申請的域名了。少有人知道有一個.wang的頂級域名，而我恰好姓王。所以，我有一個與我英文名一模一樣的域名，全球唯一，不必102，一直https。

言歸正傳，開頭提到的那個刁鑽問題給現在的我帶來一些新的啟發。

先說說是一個怎樣的問題。京東的PC站首頁，凹凸的作品，看著已經有三四年沒有過大迭代了。裡面藏著很多歷久彌新的東西，比如屏幕左邊那個經典的品類選擇區。當你的鼠標hover某個一級菜單時，會在臨側聯動展示二級菜單。所以鼠標滑過一級菜單列表時，二級菜單一定會跟著滑過的菜單實時變化。而有趣的是，當你把鼠標移動到某個二級菜單時，路徑中掠過的數個一級菜單並沒有觸發二級切換，你會穩穩的選到你想要的二級品類。

乍一看很AI，是一個比較複雜的問題。如果說這是一個通過鼠標移動路徑實時分析，進而判斷用戶真實操作意圖的問題，應該會有不少人會順著這個思路去找方案。

事實上，對需求進行分析和歸納後，就會把需求轉化為如何判斷一個點在三角形內的問題。一圖勝千言，當選擇“一級導航1”時，此時鼠標在圖示三角形內劃過，去選擇某個二級菜單時，就可以對掠過的一級菜單不做聯動響應，或者延遲切換。

![](https://km.sankuai.com/api/file/cdn/1270932134/1494009598?contentType=1\&isNewContent=true\&isNewContent=false)

至於如何判斷一個點在三角形內，方法有很多，比較經典的解法是用向量叉乘來判斷。程序裡實現向量的基礎運算比較簡單，只是一些加減乘除的組合。

問題就是這樣，下面是一些新的思考。我把這個實現需求的過程分成了四個階段。

首先，是需求具象化。需求需要澄清與拆解，儘可能地具象化。

其次，對拆解後的需求進行“翻譯”，將需求轉化成問題，這是一個領域化、模型化的過程。比如在軟件工程裡，就是把需求映射到一個可計算、可編程的模型。現在來看，這個過程比後邊的“怎麼做”更為關鍵。如何把需求轉換到“判斷一個點在三角形內”的問題，這種“翻譯”能力應該是工程師的一種高階素養。

接下來，就是怎麼做的問題了。上一步的輸出是模型，這個模型可以是數學模型、物理模型，或者統計學模型等，我們需要做的就是連接不同的學科和領域。比如，不知道如何判斷點在三角形內就去找數學好的同學。一個大規模的複雜問題，可能涉及到多個領域，所以這是資源網絡化的過程 。

最後，是實施過程，我們大部分的時間都在做實施、做工程，包括模塊化和標準化等一切工程手段，是相對擅長的部分。
