這篇文章源自讀者對博主「老賀」部落格的留言互動。面對主動思考、提出深度問題的初學者,老賀表現出極大的興趣與鼓勵。完整對話可參考《C語言及程序設計實踐參考——n=a!+b!+c!》一文的二樓評論。
有位讀者嘗試優化程式碼,但發現程式碼行數反而增加了,便發問:「老師,這樣還能提高效率嗎?」
老賀首先肯定了提問者的主動思考,指出這在實體課學生中並不多見。隨後從多維度剖析「效率」的本質:
多數情況下,效率指計算機執行效率,分為時間效率(執行耗時越少越好)和空間效率(運行佔用記憶體越少越好),其中時間效率最受關注。關鍵在於:源代碼行數多少,並非決定時間效率的關鍵。只要最終生成的目標代碼讓計算機執行的操作少,從時間角度自然就快。
計算機系統由「計算機」與「人」共同構成。在人力成本日益上升的今天,人的效率往往更值錢。對於不算太複雜的問題,或計算機效率雖低但足以滿足需求的場景,開發人員無需為計算機效率過度投入人力。只有系統中最關鍵的「瓶頸」部分,才值得耗費大量人力與頂尖智慧去追極致的計算機效率。這也是許多初級程序員體會不到學習算法必要性的原因——儘管優秀的初級程序員,算法素養無時不刻在發揮作用。
讀者的方案雖提高了計算機效率,卻降低了人的效率;更嚴重的是,算法複雜化導致出錯概率大增。任何工程都應遵循「簡單即是美」的法則。
老賀最後指出:作為學習者,這種「人力低效率」恰恰從學習角度是最高效率的,對訓練思維價值極大。勉勵讀者繼續保持思考與質疑的習慣。