第 0 條:不拘泥細節
- 縮進、行長、命名風格(除宏全大寫)不強制統一,目標是易讀。
- 反對匈牙利記法(C++ 類型系統已足夠)。
- 反對單入口單出口(異常 + 確定性析構已過時)。
第 1 條:最高警告級別乾淨編譯
- 警告視為錯誤;第三方庫用屏蔽包裹;未用參數省略名字;未用變量用表達式語句消除警告。
- 變量必須初始化;所有分支有返回或斷言;有/無符號混用預先轉換,盡量避免無符號。
第 2 條:自動化構建系統
一鍵/一條命令構建整個系統(Daily Build 是心跳)。
第 3 條:版本控制系統
無 VCS 如盲騎瞎馬。
第 4 條:投入代碼審查
亮代碼、讀代碼、投影牆上集體評審,熟悉項目最佳途徑。
第 5 條:單一緊湊職責
單一職責原則(SRP)。realloc、basic_string 違反典例。嘗試用一句話描述模塊功能,做不到則重設計。
第 6 條:正確、簡單、清晰優先
- KISS 原則:正確 > 速度,簡單 > 複雜,清晰 > 機巧,安全 > 不安全。
- 代碼寫給人看,順便給機器跑。
- 避免冷僻語言特性,慎用運算符重載、匿名變量;善用重構。
第 7 條:知曉何時考慮可伸縮性
線性複雜度為分水嶺:避免超線性算法;優先優化算法複雜度而非微優化。特定領域可突破 O(N log N) 排序下限。
第 8 條:不成熟優化是萬惡之源
讓正確程序變快,比讓快程序變正確容易得多。——Knuth
第 9 條:不成熟劣化同樣可惡
- 能傳引用卻傳值;能用前綴
++ 卻用後綴;構造函數用賦值而非初始化列表。
- 區分優化與劣化需扎實基本功(研讀 Effective/Exceptional C++ 系列)。
第 10 條:極小化全局/共享數據
- 全局數據導致名字污染 + 遠程耦合;單例同樣有耦合問題。
- 多線程下共享數據需序列化;變量越少越好(含局部變量)。
第 11 條:信息隱藏
類不公開數據(數值聚合 struct 除外),不返回內部指針/引用,通過抽象獲得不變式檢查能力。
第 12 條:懂得並發編程
- 參考平台同步原語;用自設計抽象封裝平台原語;確保類型線程安全。
第 13 條:資源由對象擁有(RAII + 智能指針)
- 確定性析構是 RAII 基石;析構/釋放/swap 必須不拋異常。
- 避免一行分配多資源:
Fun(shared_ptr(new Widget), shared_ptr(new Widget)) 不安全;應分兩行構造再傳遞。