一句話總結
「一點一滴地積累,別放過任何小知識,多寫代碼,多除錯,多閱讀源碼——沒有捷徑,只有腳踏實地。」
三大支柱
1. 知識積累:建立完整知識圖譜
- 語法層:每個關鍵字、運算子、前置處理指令的標準語義
- 標準庫層:
<stdio.h>/<stdlib.h>/<string.h>/<math.h>/<time.h> 核心函式簽名、回傳值、錯誤碼
- 系統層:記憶體佈局(代碼/資料/堆/棧)、呼叫慣例、連結器符號解析、ELF/PE 格式
- 工具層:編譯器選項、建置腳本、除錯指令、靜態/動態分析工具
做法:維護個人 Wiki/筆記庫,每遇到新知識點、踩過的坑、優化技巧即時記錄,定期複習整理。
2. 刻意練習:代碼量與質量雙重保證
| 練習類型 | 頻率 | 目標 |
| 語法/API 熟悉度 | 每日 30 分鐘 | 手寫常用函式、資料結構操作不查文檔 |
| 演算法題 | 每週 3-5 題 | LeetCode Medium 獨立 AC、分析時空複雜度 |
| 系統程式小專案 | 每月 1 個 | 從需求到交付:Shell、HTTP Server、Log 分析器、資料庫 |
| 源碼閱讀 | 每週 1 模組 | 精讀 Redis/SQLite/Nginx/Linux Kernel 核心路徑 |
| Code Review | 每次提交 | 自審 + 互審,關注正確性/效能/可讀性/安全性 |
3. 細節掌控:魔鬼在細節中
- 邊界條件:空輸入、最大值、最小值、NULL 指標、零長度、除零
- 資源管理:每個
malloc 有 free、每個 fopen 有 fclose、每個 lock 有 unlock
- 未定義行為:有符號整數溢位、釋放後使用、雙重釋放、未初始化讀取、序列點違規
- 效能細節:快取友善存取、分支預測、函式內聯、避免虛假共享
- 安全意識:緩衝區溢位、格式化字串漏洞、整數截斷、競爭條件
進階心法:從「會用」到「懂原理」
- 編譯器視角:理解原始碼 → AST → IR → 組合語言 → 機器碼的轉換
- 連結器視角:符號表、重定位、靜態/動態連結、動態載入器
- 作業系統視角:行程虛擬記憶體、系統呼叫、中斷、排程器、檔案系統
- 硬體視角:CPU 流水線、快取層級、分支預測器、記憶體一致性模型、SIMD
避免的三大陷阱
| 陷阱 | 表現 | 破解 |
| 教程地獄 | 看完 10 個教程還是寫不出代碼 | 合上教程,打開編輯器,從 Hello World 開始重寫 |
| 收藏癖 | 收藏 100 個 GitHub repo、50 本 PDF、200 個網址 | 刪除收藏,只保留當前正在啃的 1 本書、1 個專案 |
| 完美主義 | 第一行代碼就想寫得像庫作者一樣優雅 | 先寫出能跑的醜代碼,再重構、優化、加測試、寫文檔 |
里程碑自我檢測
- [ ] 能在紙上手寫完整的鏈結串列反轉、合併排序、快速排序
- [ ] 能解釋
int *p; *p = 10; 為什麼會 segmentation fault
- [ ] 能用 GDB 定位 heap-use-after-free、stack-buffer-overflow
- [ ] 能閱讀並理解
malloc、pthread_mutex_lock、epoll_wait 的實作邏輯
- [ ] 完成過一個 3000+ 行、有測試、有文檔、跑過 CI 的 C 專案
「C 語言很小,但計算機系統很大。學好 C,不是背誦語法,而是透過 C 這扇窗,看清計算機系統的全貌。」