核心心法:編程是手藝,唯有「做中學」
「多上機操作,多實踐,多編程,多幫幫別人調試程序也是很必要的,因為別人犯的錯誤很有可能就是你下次犯的錯誤,多幫別人調試程序可以增加對程序錯誤的分析能力,最後自己編程序的時候會很快。多看算法,多寫代碼,學好數據結構。」
四大鐵律具體落地指南
1. 多上機操作 — 拒絕「眼過千遍,手不敲一次」
- **每個知識點必寫測試**:學 `malloc` → 寫 `test_malloc.c` 驗證成功/失敗/對齊/釋放。學 `qsort` → 寫整數/結構體/字串排序測試。
- **每日一碼**:GitHub Contributions 保持綠格,哪怕只有 1 個函式重構、1 個警告修復。
- **環境固化**:VS Code + GCC/Clang + CMake + GDB/LLDB + Sanitizer,配置一次,終身受用。
2. 多實踐 — 從「寫對」到「寫好」到「寫快」
| 階段 | 目標 | 里程碑專案建議 |
| 入門 (0-2 月) | 語法無誤、能跑通 OJ 入門題 | 猜數字、簡易計算機、學生成績管理 (檔案 I/O) |
| 進階 (2-6 月) | 資料結構手寫、記憶體無洩漏、模組化 | 動態陣列/鏈表/雜湊/堆/紅黑樹/跳表庫、簡易 Shell (解析管道/重導向/內建命令) |
| 工程化 (6-12 月) | CMake 多模組、單元測試、CI、Sanitizer、靜態分析 | HTTP Server (epoll/kqueue/IOCP)、記憶體分配器 (slab/arena)、解釋器 (Lua/JS 子集)、KV 引擎 (LSM/B+樹) |
| 系統級 (1-3 年) | 並行無鎖、核心模組、效能調優、規格書實作 | Linux 核心模組、eBPF 程式、用戶態網路棧 (DPDK)、資料庫存儲引擎 |
3. 多幫人除錯 — 最高效的「被動練習」
- **Stack Overflow / GitHub Issues / 實驗室師弟妹 / 公司同事** — 看報錯、猜假設、加日誌、跑測試、定位根因、給補丁。
- **建立個人「Bug 圖鑑」**:分類標籤 (UB、越界、洩漏、死鎖、競態、ABI、鏈接、編譯器 Bug) — 遇新類型必記、舊類型必複習。
- **輸出教學文/影片**:「為什麼 `a[i] = i++` 是 UB」、「如何用 AddressSanitizer 3 分鐘定位 heap-use-after-free」 — 教會別人,自己最懂。
4. 多看算法、多寫代碼、學好資料結構 — 內功心法
- **演算法模板庫化**:二分、雙指針、滑動窗口、拓撲排序、Dijkstra、KMP、Manacher、線段樹、BIT、並查集 — 寫成泛型 C 介面 (`void*` + 比較函式),隨時可用。
- **閱讀頂級開源實作**:
Redis: `sds.c` (動態字串)、`dict.c` (漸進式 rehash)、`skiplist.c` (跳表)
nginx: `ngx_array.c`、`ngx_rbtree.c`、`ngx_hash.c`、`ngx_pool.c` (記憶體池)
Linux: `list.h` (無侵入鏈表)、`rb_tree.c`、`idr.c` (ID 分配器)
SQLite: `btree.c` (B+樹)、`pager.c` (頁面快取)
- **刷題策略**:LeetCode Hot 100 → 標籤專項 (雙指針/滑動窗口/單調棧/動態規劃/位運算) → 週賽/雙周賽 (C 語言提交) — **目標不是 AC 數,而是「寫出生產級代碼:無警告、無洩漏、邊界全覆蓋、註釋清晰、可測試」**。
避坑指南:這些「勤奮」其實在浪費時間
| 偽勤奮 | 真功夫 |
| 背誦語法/關鍵字/標準庫函式簽名 | 查手冊、寫測試、遇到才記、建立片段庫 |
| 抄寫教材範例不改參數、不加斷點、不看記憶體 | 刻意破壞、觀察崩潰、用 Sanitizer、畫記憶體圖 |
| 只刷簡單題、只用 `vector`/`string` 避開指標 | 硬寫指標版、手動管理記憶體、對比效能、分析組語 |
| 獨自閉門造車、不讀源碼、不參與 Code Review | 提 PR 給開源專案、接受嚴苛 Review、學習項目風格指南 |
給堅持者的承諾
堅持「四大鐵律」滿 1 年,**你將擁有**:
✅ 任意資料結構手寫能力
✅ 記憶體/UB/並發 Bug 直覺定位力
✅ 閱讀 Linux/Redis/nginx 核心代碼無障礙
✅ 系統級專案架構與效能調優經驗
✅ 面試大廠系統崗/嵌入式崗/基礎設施崗核心競爭力
**沒有捷徑,只有腳步聲。** 現在,打開編輯器,寫下今天的第一行代碼。