「學院派」誤讀的真相
指責 C++「學院派、鑽細節、忽視工程」者,**真實意思是:C++ 陰暗角落太多,社群推崇角落把握,C++0x 演進脫離實際開發者需求**。
但 Bjarne 早期原則:**「不要陷入對完美性的固執追求」** —— C++ 從未追求理論純粹。
社群細節崇拜的形成邏輯
- 用戶實際需求驅動:STL
for_each 難用 → 強烈需求內建 foreach
- 語言缺失迫使挖掘角落:C++98 無 lambda、無內建 foreach、無 concepts
- 社群 N 次嘗試:Boost.Foreach (CUJ 2003 版難用) → 終極版 (挖標準角落實現)
- C++09 內建後無縫遷移:正則替換即可,無升級負擔
**結論:所謂「鑽細節」,大多源於用戶需求在語言缺失下的無奈突圍。**
經典案例二:Traits 與 Concepts
- Traits 本質:C++98 靜態分發技術,因無 Concepts 而生
- 自然形態:C++20 Concepts 才是靜態分發的正確表達
- 權衡:不用 Traits → 無靜態分發 → 效率/表達力損失;用 Traits → 增加語言複雜性
經典案例三:模板元編程 (TMP)
- 日常開發者八輩子不用直接寫 TMP
- 但間接受益:Boost 子庫、TR1/TR2/標準庫組件 (type_traits、variant、optional、coroutine 支持) 全賴 TMP
- 學習建議:不用學 TMP 細節,**只需會用其支撐的庫組件**
核心洞見:黑暗角落技術幾乎全在庫開發中
STL Traits、TMP、SFINAE、Concepts、模塊、協程框架 —— **全為了開發更好的庫**。難道你不想用更好的庫?
「更好的庫」爭議:複雜性代價 vs 表達力收益
- Doug Lea 建議:項目堅持單一範式
- 作者策略:主風格統一 (OB) + 局部封裝輔助風格 + 僅用經驗模式混用
- **關鍵:複雜性封裝於庫層,業務層見簡潔接口**
結語
C++ 「學院派」爭論**誤把「用戶需求在語言缺失下的突圍」當成「理論自嗨」**。歷史證明:foreach → Concepts、Traits → Concepts、TMP → 標準庫組件,每個「黑暗角落技術」最終都轉化為**更優雅的語言特性或更強大的庫**。對應用開發者:**擁抱現代庫,封裝複雜性,用簡潔接口表達業務意圖** —— 這才是駕馭 C++ 的正道。