設(shè)計(jì)中的平凡與非平凡:從理論到工程實(shí)踐)
1. 從一次代碼評(píng)審的尷尬對(duì)話說(shuō)起“這個(gè)解是平凡的沒(méi)什么好討論的?!?在一次算法設(shè)計(jì)的內(nèi)部評(píng)審會(huì)上一位資深同事指著白板上我寫的一行推導(dǎo)輕描淡寫地說(shuō)了這么一句。當(dāng)時(shí)我剛?cè)胄胁痪媚槨班А钡匾幌戮图t了心里既困惑又有點(diǎn)不服氣我花了半天時(shí)間推導(dǎo)出來(lái)的結(jié)果怎么就成了“平凡”的它明明不簡(jiǎn)單啊后來(lái)我才明白在數(shù)學(xué)和理論計(jì)算機(jī)科學(xué)的世界里“平凡”與“非平凡”有著非常特定且嚴(yán)謹(jǐn)?shù)暮x我那次的推導(dǎo)確實(shí)落入了一個(gè)顯而易見(jiàn)的、無(wú)需過(guò)多思考的套路。這次經(jīng)歷讓我對(duì)這兩個(gè)術(shù)語(yǔ)產(chǎn)生了濃厚的興趣?!捌椒病迸c“非平凡”這對(duì)看似普通的形容詞卻是貫穿數(shù)學(xué)、物理學(xué)、計(jì)算機(jī)科學(xué)乃至工程學(xué)領(lǐng)域的基石性概念。它們不僅僅是描述“簡(jiǎn)單”與“復(fù)雜”的詞匯更是衡量問(wèn)題深度、解決方案價(jià)值以及理論重要性的標(biāo)尺。理解它們能幫助我們?cè)诿鎸?duì)復(fù)雜系統(tǒng)時(shí)快速抓住核心矛盾避開(kāi)那些顯而易見(jiàn)的“坑”直指真正需要攻堅(jiān)的“非平凡”部分。無(wú)論是設(shè)計(jì)一個(gè)算法分析一個(gè)系統(tǒng)還是理解一個(gè)理論學(xué)會(huì)區(qū)分“平凡解”和“非平凡解”是從業(yè)者從“執(zhí)行者”邁向“設(shè)計(jì)者”和“思考者”的關(guān)鍵一步。2. “平凡”與“非平凡”的精確畫像不止于字面在專業(yè)語(yǔ)境下這兩個(gè)詞的定義遠(yuǎn)比日常用語(yǔ)精確和狹窄。它們的核心在于判斷一個(gè)結(jié)論或?qū)ο笫欠瘛耙蕾囉谔囟ńY(jié)構(gòu)的深層性質(zhì)”。2.1 何為“平凡”四種典型場(chǎng)景“平凡”通常指那些在任何情況下都成立或者無(wú)需利用所討論對(duì)象的具體、特殊性質(zhì)就能得出的結(jié)論。它往往意味著“默認(rèn)成立”、“顯而易見(jiàn)”或“缺乏信息量”。場(chǎng)景一定義或公理直接衍生的結(jié)果這是最典型的平凡案例。例如在群論中任何群都包含單位元。如果你證明了一個(gè)群有單位元這個(gè)證明是平凡的因?yàn)樗苯觼?lái)自群的定義本身。再比如在編程中一個(gè)返回true的函數(shù)永遠(yuǎn)返回true這個(gè)行為是平凡的因?yàn)樗鼪](méi)有執(zhí)行任何有意義的邏輯判斷。場(chǎng)景二邊界條件或退化情況當(dāng)參數(shù)取某些特殊值時(shí)問(wèn)題會(huì)退化到失去一般性研究?jī)r(jià)值的簡(jiǎn)單狀態(tài)。例如在研究一元二次方程ax2 bx c 0的根時(shí)如果系數(shù)a 0方程就退化為一次方程其求解是平凡的直接得到x -c/b假設(shè)b ≠ 0。在討論算法復(fù)雜度時(shí)輸入規(guī)模n1的情況往往是平凡的因?yàn)樗鼰o(wú)法體現(xiàn)算法隨規(guī)模增長(zhǎng)的行為。場(chǎng)景三對(duì)所有對(duì)象都成立的通用屬性如果一個(gè)命題對(duì)某個(gè)集合中的“所有”元素都成立且證明不依賴于元素的任何特性那么它對(duì)其中任何一個(gè)特定元素的證明可能就是平凡的。例如證明“所有整數(shù)與0相加都等于其本身”這個(gè)結(jié)論是平凡的是加法定義的一部分。場(chǎng)景四空真陳述在邏輯上如果一個(gè)前提條件為假那么整個(gè)條件語(yǔ)句“如果P則Q”自動(dòng)為真這被稱為“空真”。例如“如果12那么太陽(yáng)從西邊出來(lái)”這個(gè)陳述在邏輯上是真的但它的真是平凡的因?yàn)榍疤嵊啦怀闪ⅰT诔绦蝌?yàn)證中證明一個(gè)永遠(yuǎn)不會(huì)被執(zhí)行到的代碼路徑的屬性也屬于此類。2.2 何為“非平凡”價(jià)值的所在相反“非平凡”則指那些結(jié)論的成立必須依賴于研究對(duì)象非顯然的、內(nèi)在的、特定的結(jié)構(gòu)或性質(zhì)。證明一個(gè)非平凡的結(jié)論通常需要巧妙的構(gòu)思、深入的分析或復(fù)雜的計(jì)算它能揭示對(duì)象更深層次的規(guī)律。數(shù)學(xué)中的非平凡費(fèi)馬大定理斷言當(dāng)整數(shù)n 2時(shí)方程x^n y^n z^n沒(méi)有正整數(shù)解。這個(gè)陳述本身是非平凡的而安德魯·懷爾斯長(zhǎng)達(dá)百頁(yè)的證明更是非平凡中的巔峰它深刻聯(lián)系了橢圓曲線和模形式這兩個(gè)看似遙遠(yuǎn)的數(shù)學(xué)領(lǐng)域。計(jì)算機(jī)科學(xué)中的非平凡P vs NP 問(wèn)題就是一個(gè)典型的非平凡問(wèn)題。它問(wèn)的是“所有容易驗(yàn)證解的問(wèn)題是否也容易找到解”這個(gè)問(wèn)題的答案未知但無(wú)論答案是什么其證明都將是極度非平凡的將徹底改變我們對(duì)計(jì)算本質(zhì)的理解。工程中的非平凡設(shè)計(jì)一個(gè)能在各種網(wǎng)絡(luò)延遲、丟包和異構(gòu)設(shè)備環(huán)境下穩(wěn)定高效傳輸數(shù)據(jù)的協(xié)議如TCP的擁塞控制算法是非平凡的。它不能簡(jiǎn)單地通過(guò)“發(fā)送數(shù)據(jù)包”這種平凡方式解決而需要一套精巧的、適應(yīng)動(dòng)態(tài)環(huán)境的反饋機(jī)制。注意“平凡”不等于“無(wú)用”。在系統(tǒng)設(shè)計(jì)中確保平凡情況的正確處理是穩(wěn)定性的基礎(chǔ)。但研究的重點(diǎn)和創(chuàng)新的價(jià)值通常在于攻克非平凡的部分。3. 實(shí)戰(zhàn)辨析在算法與系統(tǒng)設(shè)計(jì)中的具體應(yīng)用理論需要落地。在日常開(kāi)發(fā)和系統(tǒng)設(shè)計(jì)中我們?nèi)绾芜\(yùn)用這對(duì)概念來(lái)提升工作效率和設(shè)計(jì)質(zhì)量呢3.1 算法設(shè)計(jì)中的“平凡”與“非平凡”案例假設(shè)我們需要為一個(gè)社交網(wǎng)絡(luò)設(shè)計(jì)一個(gè)“可能認(rèn)識(shí)的人”推薦算法。平凡低價(jià)值的方案方案A共同好友數(shù)直接推薦用戶A和用戶B的共同好友數(shù)量最多的那些人。這很平凡因?yàn)樗焕昧俗畋韺?、最直接的關(guān)系數(shù)據(jù)沒(méi)有考慮關(guān)系的強(qiáng)度、互動(dòng)頻率、社區(qū)結(jié)構(gòu)等。實(shí)現(xiàn)簡(jiǎn)單但效果容易遇到瓶頸可能總是推薦同一批活躍用戶。方案B隨機(jī)推薦從非好友中隨機(jī)選取。這更加平凡幾乎不包含任何有效信息。非平凡高價(jià)值的探索方向方案C基于圖嵌入的相似度將整個(gè)社交網(wǎng)絡(luò)視為一個(gè)圖使用 Node2Vec 或 GraphSAGE 等算法將每個(gè)用戶映射到一個(gè)低維向量空間。在這個(gè)空間中向量距離近的用戶被認(rèn)為具有相似的網(wǎng)絡(luò)結(jié)構(gòu)特征即使他們沒(méi)有直接共同好友也可能屬于同一社區(qū)或有相似的興趣圈。這里的“非平凡”在于算法學(xué)習(xí)到了網(wǎng)絡(luò)深層的、非顯然的結(jié)構(gòu)模式。方案D結(jié)合多模態(tài)行為不僅考慮好友關(guān)系還融合用戶的點(diǎn)贊、評(píng)論、分享、共現(xiàn)于同一群組、職業(yè)信息、內(nèi)容興趣標(biāo)簽等多維度數(shù)據(jù)使用深度學(xué)習(xí)模型如多任務(wù)學(xué)習(xí)、Transformer進(jìn)行聯(lián)合表征學(xué)習(xí)。其非平凡性在于處理了異構(gòu)數(shù)據(jù)并建模了復(fù)雜的、非線性的用戶交互模式。在算法評(píng)審時(shí)我們可以這樣提問(wèn)“這個(gè)算法的核心洞察是什么它是否僅僅利用了平凡的、顯而易見(jiàn)的信息它的提升是來(lái)自更復(fù)雜的模型可能只是過(guò)擬合還是真正捕捉到了數(shù)據(jù)中非平凡的模式” 這能幫助我們避免陷入“為復(fù)雜而復(fù)雜”的陷阱確保復(fù)雜性帶來(lái)了非平凡的價(jià)值。3.2 系統(tǒng)架構(gòu)中的“平凡解”與“根本解”在處理系統(tǒng)故障或設(shè)計(jì)架構(gòu)時(shí)區(qū)分“平凡解”臨時(shí)打補(bǔ)丁和“根本解”非平凡的重構(gòu)至關(guān)重要。場(chǎng)景一個(gè)微服務(wù)頻繁超時(shí)。平凡解快速止血增加該服務(wù)的超時(shí)閾值配置。重啟該服務(wù)的實(shí)例。為該服務(wù)分配更多的CPU和內(nèi)存資源。 這些措施操作簡(jiǎn)單、見(jiàn)效快但通常不觸及問(wèn)題的根本。它們可能掩蓋了真正的瓶頸如糟糕的算法、低效的數(shù)據(jù)庫(kù)查詢、不合理的服務(wù)依賴鏈等。非平凡解根治問(wèn)題根因分析通過(guò)全鏈路追蹤發(fā)現(xiàn)超時(shí)是因?yàn)橐粋€(gè)深度嵌套的循環(huán)查詢?cè)跀?shù)據(jù)量增長(zhǎng)后指數(shù)級(jí)變慢。架構(gòu)審視發(fā)現(xiàn)服務(wù)間的調(diào)用鏈設(shè)計(jì)成了深度的同步串行調(diào)用延遲被層層疊加。根本解決優(yōu)化查詢引入緩存將循環(huán)查詢改為批量查詢或優(yōu)化數(shù)據(jù)庫(kù)索引。架構(gòu)重構(gòu)將同步調(diào)用改為異步消息驅(qū)動(dòng)對(duì)非關(guān)鍵路徑進(jìn)行解耦或引入回壓機(jī)制和斷路器模式防止級(jí)聯(lián)失敗。容量規(guī)劃基于業(yè)務(wù)增長(zhǎng)模型進(jìn)行非平凡的容量預(yù)測(cè)和彈性設(shè)計(jì)。這里的“非平凡”體現(xiàn)在解決方案需要深入理解業(yè)務(wù)邏輯、數(shù)據(jù)流和技術(shù)棧的相互作用進(jìn)行有創(chuàng)見(jiàn)的重新設(shè)計(jì)而不是進(jìn)行參數(shù)調(diào)整式的簡(jiǎn)單操作。4. 從理論到實(shí)踐如何培養(yǎng)識(shí)別“非平凡”問(wèn)題的能力識(shí)別“非平凡”問(wèn)題是進(jìn)行深度工作和創(chuàng)新的前提。這種能力可以通過(guò)有意識(shí)的訓(xùn)練來(lái)培養(yǎng)。4.1 建立“第一性原理”思考習(xí)慣遇到問(wèn)題時(shí)不要滿足于第一個(gè)想到的、最直接的往往是平凡的解決方案。追問(wèn)下去“這個(gè)問(wèn)題的本質(zhì)約束是什么”“現(xiàn)有的標(biāo)準(zhǔn)解法平凡解是基于哪些假設(shè)這些假設(shè)在當(dāng)前場(chǎng)景下是否依然成立”“如果拋開(kāi)所有現(xiàn)有實(shí)現(xiàn)從最根本的物理/數(shù)學(xué)/邏輯原理出發(fā)這個(gè)問(wèn)題應(yīng)該怎么解決”例如在優(yōu)化一個(gè)文件下載服務(wù)時(shí)平凡思路是升級(jí)帶寬、用更快的硬盤。但從第一性原理思考下載的本質(zhì)是數(shù)據(jù)移動(dòng)。那么能否減少需要移動(dòng)的數(shù)據(jù)量這就引向了非平凡的思路更高效的壓縮算法、差異更新只傳輸變化部分、利用P2P技術(shù)讓用戶間共享數(shù)據(jù)等。4.2 進(jìn)行“問(wèn)題分解”與“平凡性過(guò)濾”將復(fù)雜問(wèn)題分解為多個(gè)子問(wèn)題然后對(duì)每個(gè)子問(wèn)題評(píng)估其“平凡性”。分解例如設(shè)計(jì)一個(gè)推薦系統(tǒng)可分解為“用戶表征”、“物品表征”、“匹配算法”、“排序策略”、“去重和多樣性控制”等子模塊。過(guò)濾評(píng)估每個(gè)子模塊??赡馨l(fā)現(xiàn)“物品表征”在現(xiàn)有業(yè)務(wù)中已有成熟方案相對(duì)平凡而“如何在新用戶冷啟動(dòng)時(shí)進(jìn)行精準(zhǔn)匹配”是當(dāng)前最大的痛點(diǎn)非平凡。聚焦將主要的研究和工程資源投入到那些被識(shí)別為“非平凡”的子問(wèn)題上。這能極大提升資源利用效率。4.3 在代碼與設(shè)計(jì)中尋找“壞味道”一些代碼和設(shè)計(jì)模式本身就在暗示“這里可能隱藏著平凡的處理掩蓋了非平凡的需求”。巨大的switch-case或if-else鏈這通常意味著業(yè)務(wù)邏輯被平鋪直敘地編碼沒(méi)有抽象出更本質(zhì)的規(guī)則或模型。重構(gòu)方向可能是使用策略模式、查找表、或規(guī)則引擎。充斥著硬編碼的數(shù)字和字符串這些“魔法值”往往是特定場(chǎng)景下的平凡解。追問(wèn)它們代表的含義可能會(huì)抽象出配置項(xiàng)、枚舉類型或更復(fù)雜的業(yè)務(wù)對(duì)象。一個(gè)函數(shù)或類做了太多事情高內(nèi)聚的模塊如果功能混雜很可能是因?yàn)殚_(kāi)發(fā)者沒(méi)有識(shí)別出其中非平凡的核心抽象而將許多平凡操作與之耦合。通過(guò)重新劃分職責(zé)可以分離出核心的非平凡邏輯。過(guò)度依賴全局狀態(tài)或副作用這讓系統(tǒng)的行為變得難以推理因?yàn)槿魏尾糠侄伎赡鼙黄椒驳匦薷?。推?dòng)狀態(tài)局部化和顯式傳遞可以暴露出數(shù)據(jù)流的非平凡依賴關(guān)系。4.4 實(shí)踐練習(xí)從平凡描述中挖掘非平凡問(wèn)題試著完成以下轉(zhuǎn)換練習(xí)平凡描述“我們需要一個(gè)更快的數(shù)據(jù)庫(kù)?!狈瞧椒矄?wèn)題“我們的業(yè)務(wù)查詢模式在數(shù)據(jù)量超過(guò)千萬(wàn)級(jí)后從以點(diǎn)查為主變成了需要頻繁進(jìn)行多表關(guān)聯(lián)分析和時(shí)間范圍掃描?,F(xiàn)有數(shù)據(jù)庫(kù)的索引策略和執(zhí)行引擎對(duì)此類混合負(fù)載的優(yōu)化不足。我們需要一種能高效處理OLTP和特定OLAP模式混合負(fù)載的數(shù)據(jù)存儲(chǔ)與計(jì)算方案?!逼椒裁枋觥癆PP首頁(yè)加載太慢?!狈瞧椒矄?wèn)題“首頁(yè)依賴的5個(gè)微服務(wù)接口存在同步串行調(diào)用且其中‘個(gè)性化推薦’服務(wù)響應(yīng)延遲P99高達(dá)2秒是瓶頸。此外首屏靜態(tài)資源未有效利用HTTP/2推送導(dǎo)致多次RTT。我們需要解決服務(wù)間延遲并重構(gòu)前端資源加載鏈路?!蓖ㄟ^(guò)這種方式我們把一個(gè)模糊的、指向平凡解決方案升級(jí)硬件、優(yōu)化代碼的抱怨轉(zhuǎn)化為了一個(gè)清晰的、需要非平凡架構(gòu)或算法改進(jìn)的具體問(wèn)題。5. 誤區(qū)警示避免對(duì)“平凡”與“非平凡”的誤用在追求“非平凡”的過(guò)程中也要警惕幾個(gè)常見(jiàn)的誤區(qū)。誤區(qū)一鄙視“平凡”工作這是新手容易犯的錯(cuò)誤。認(rèn)為只有高深的算法、宏大的架構(gòu)才是“非平凡”的而編寫清晰的接口、設(shè)計(jì)合理的數(shù)據(jù)庫(kù)表結(jié)構(gòu)、編寫完善的單元測(cè)試是“平凡”的不屑于做好。實(shí)際上系統(tǒng)的可靠性正是建立在大量正確實(shí)現(xiàn)的“平凡”組件之上。一個(gè)非平凡的算法如果被平凡的邊界條件Bug所破壞將毫無(wú)價(jià)值。扎實(shí)做好平凡工作是非平凡創(chuàng)新得以立足的基石。誤區(qū)二為了“非平凡”而過(guò)度復(fù)雜這是另一個(gè)極端。有些工程師熱衷于引入最前沿、最復(fù)雜的技術(shù)只是為了證明自己解決了“非平凡”問(wèn)題而不考慮實(shí)際需求。例如明明一個(gè)簡(jiǎn)單的關(guān)系數(shù)據(jù)庫(kù)加緩存就能滿足需求非要引入一套復(fù)雜的流處理和圖數(shù)據(jù)庫(kù)大大增加了系統(tǒng)的維護(hù)成本和故障風(fēng)險(xiǎn)。判斷一個(gè)方案是否真正“非平凡”要看它是否解決了用“平凡”手段無(wú)法解決或解決不好的核心矛盾而不是看它用了多少時(shí)髦的技術(shù)棧。誤區(qū)三混淆“困難”與“非平凡”一個(gè)任務(wù)可能因?yàn)楣ぞ卟皇臁⑽臋n缺失、環(huán)境詭異而變得非?!袄щy”但其解決方案可能依然是“平凡”的——比如按照標(biāo)準(zhǔn)流程配置一個(gè)復(fù)雜的開(kāi)源軟件。反之一個(gè)“非平凡”的問(wèn)題可能在你理解其精髓后解決起來(lái)思路清晰并不一定特別困難?!胺瞧椒病标P(guān)乎問(wèn)題的本質(zhì)和解決方案的洞察力而“困難”通常關(guān)乎執(zhí)行過(guò)程中的障礙和成本。誤區(qū)四忽視領(lǐng)域的上下文一個(gè)結(jié)論在某個(gè)領(lǐng)域是平凡的在另一個(gè)領(lǐng)域可能是非平凡的。例如在實(shí)數(shù)域中任何數(shù)乘以零等于零這是平凡的。但在研究某些特殊的代數(shù)結(jié)構(gòu)如環(huán)的零因子時(shí)探討“是否存在兩個(gè)非零元素相乘等于零”就是一個(gè)非平凡的問(wèn)題。因此在討論時(shí)必須明確當(dāng)前的理論框架和問(wèn)題域。在我個(gè)人的工程實(shí)踐中我逐漸養(yǎng)成一個(gè)習(xí)慣在評(píng)審任何設(shè)計(jì)方案或解決難題的初期都會(huì)和團(tuán)隊(duì)一起先花時(shí)間界定哪些部分是“平凡的”我們可以用標(biāo)準(zhǔn)模式或現(xiàn)有經(jīng)驗(yàn)快速搞定哪些部分是“非平凡的”需要我們集中智慧、深入調(diào)研、創(chuàng)造性解決。這個(gè)簡(jiǎn)單的儀式能極大地統(tǒng)一團(tuán)隊(duì)認(rèn)知避免在平凡細(xì)節(jié)上過(guò)度爭(zhēng)論從而把寶貴的注意力資源精準(zhǔn)地投入到真正值得攻堅(jiān)的非平凡挑戰(zhàn)上。這或許就是這對(duì)古老數(shù)學(xué)術(shù)語(yǔ)帶給現(xiàn)代工程師最實(shí)用的智慧。