複雜性來源三分法
- 本質複雜性:問題領域固有難度 (並發、分散式、即時約束...)
- 語言本質複雜性:為解決本質問題而引入的必要特性 (模板、RAII、多態...)
- 非本質複雜性:歷史包袱、語法殘留、兼容性妥協、過度設計
C++ 擁有龐大的第三類。若移除它們,連反對者也難找理由拒絕 C++。
學習者的兩大誤區
誤區一:底層機制 ≠ 語意意圖
知曉 vtable 佈局、名稱修飾、堆疊框架,卻不懂虛函數解決什麼問題、何時該用多態。本末倒置。
誤區二:書驅動的全覆蓋式學習
- 技術書涵蓋所有語言特性,但實際工程僅用 20% 甚至更少
- 新手在真正用 C++ 前,先啃一疊語言書 — 極低投資報酬比
為什麼會有這種學習態度?
- 書害的:作者為了完整性/頁數/銷量,堆砌底層細節,忽略場景意圖
- 場景覆蓋率極低:書中場景總和 < 20% 實戰高頻場景
最佳實踐路徑:避短揚長
雖無法消除複雜性,但可系統性避開:
- 核心 20% 精通:類別/物件、RAII、STL 容器/演算法/迭代器、智慧指標、移動語意、基本模板
- 場景驅動學習:遇到問題 → 學最小解法 → 理解原理 → 內化模式
- 建立禁用清單:舊式轉型、巨集、裸指標擁有權、手工記憶體管理、複雜模板元編程 (除非庫作者)
- 工具輔助:靜態分析、Sanitizers、格式化、現代 CMake — 讓工具攔截非本質錯誤
給學習者的具體建議
- 先寫出能跑的程式,再精進
- 閱讀 Effective C++、C++ Core Guidelines 而非語言參考手冊
- 參與代碼審查,觀察資深者如何用簡單特性解決複雜問題
- 定期清理知識庫:遺忘罕用特性,騰出認知頻寬給核心模式
結語
C++ 複雜性不會消失,但我們的認知負載可控。識別本質、避開非本質、場景驅動、工具賦能 — 這是普通開發者駕馭 C++ 複雜性、產出高質量軟體的唯一可行之道。