過早優化
出自 MBA智库百科(https://wiki.mbalib.com/)
目錄 |
過早優化 (Knuth's optimization principle)又稱“克努特優化原則”最早由電腦科學家高德納提出。在《goto語句的結構化編程》論文中,他寫到[1]:
“程式員們浪費大量時間去思考或者擔心他們程式中非關鍵部分速度。而在考慮調試和維護時,這些所謂提高效率做法實際上十分不妥。我們應該放棄小效率點,並且要在97%時間提醒自己,過早優化是萬惡之源,而且連那關鍵3%也不能夠放過。”
優化是一個褒義詞,涵義積極正面。甚至於,很多人不加思考地追求最優化。但“差之毫釐,謬以千里”,將優化絕對化,不管何時何地都追求最優化,會反受其害。
例如,前置思考中提到,恐龍等頂級掠食者,為高居食物鏈頂端,演化方向較為單一,追求長得更大、更有力量、跑得更快、爪牙更鋒利,讓少數幾個性狀逼近生理極限,使自己沒有天敵。
如此一來,其他多數性狀都喪失發展機會。這在生物學界,被稱為“演化單行道”,甚至是“演化死衚衕”。錶面上看起來很強大,但實際上很脆弱。
也就是說,最優是最優,但環境一變卻因為無法適應,導致種族滅絕。可以說,片面追求最優化,是“撿了芝麻,丟了西瓜”。凡事利弊兼具,過早片面優化,可能帶來災難。
過早優化的啟示[1]
避免過早優化,不是說不要優化,僅僅是說“不要過早”優化。也就是說,優化之前要判斷是否是優化時機。
做一個類比,就好像我們畫畫,先畫輪廓、草圖,然後填入細節,一步步臻於完美。這有嚴格優先順序順序。
如果剛畫幾筆,就開始優化細節,很可能這個局部畫得很好,達到局部最優,但整體結構編排不當,產生結構性缺陷,最後畫作質量平平,可能就淪為平庸之作。
類似的,寫一篇文章,首先考慮的是中心思想、整體框架,其次是段落編排、起承轉合,最後才是文字潤色、咬文嚼字,如果顛倒這個順序,也屬於過早優化。
要優化,不要過早優化,核心在於優化目標設定。
過早優化,其實是在追求“局部最優解”,意即:把其中一部分做到極致,再做另一部分。陷阱在於,劃分部分方法可能失之隨意、整體失當,容易導致局部優化對整體影響不可控。
適時優化,其實是在追求“全局最優解”,意即:優化整體表現。劃分方式往往是,從整體到部分、從抽象到具體,先驗證邏輯,再補充細節,這樣就不容易鎖死在局部高峰,更有條件登上整體高峰。
換一種說法是,在沒有找到影響整體最優最重要幾個因素前,不要過早把資源投放到次要甚至完全不重要因素優化上。
高德納最早提出過早優化概念,就是因為洞察到,程式員在錯誤方向和時間點浪費太多時間。對此,有一個類比說,還沒有寫完程式,你就開始考慮它的性能問題,這樣的軟體好比姑娘還沒有成年卻已經嫁人了。
事實上,只有通過測量並找出真正存在問題地方,才需要開啟優化。
類似的,在商業領域、管理領域等,先推出最小可用品,獲得真實數據反饋,明確自己所開發產品或者解決方案,真正符合市場需要,才不會在錯誤開發方向浪費過多資源。
值得註意的是,分辨什麼是局部高峰、什麼是整體高峰,富有挑戰。
也就意味著,可能要反覆試錯,常走下坡路,這需要科學方法和足夠耐心。如果一個人不能延遲滿足,只能接受走上坡路有序愉悅,不能接受走下坡路混亂痛苦,就容易掉入過早優化陷阱。