如何閱讀別人的程式碼?
經過這幾年的程式設計學習,我認為想要提升編碼水平的最佳途徑就是多看、多寫,然而閱讀別人的程式碼也確實是快速提升程式碼水平的一個技巧。在今天的文章中,我將與大家探討如何閱讀別人編寫的程式碼。
我要明確地表述這種方式的好處:
1.如果大家希望能顯著提升程式設計技能,則需要閱讀其他人的程式碼。
2.如果大家願意一試,相信我,這絕對能夠帶來相當直觀的提升效果。
如果您還沒有,請別猶豫,馬上嘗試吧。
一、讀什麼程式碼?
這個問題非常重要,但同時也難以解答。我無法簡單告訴大家應該閱讀哪些程式碼,因為要根據個人條件而定。但我接下來,會給出一些巨集觀層面的指導意見。
1.閱讀相關性高的程式碼
最好的起點就是閱讀您正在使用的外掛或者庫中的程式碼。
您喜愛的WordPress外掛程式碼。
您經常使用的Ruby gem程式碼。
您不斷重複使用的jQuery外掛程式碼。
這些都是良好的學習素材。由於已經熟悉其公共API,因此瞭解其內部工作原理會變得更加簡單。另外,作為程式碼使用者,大家也可以為專案新增文件、實現新功能或者以其它方式作出貢獻。
2.閱讀令您印象深刻的程式碼
我還記得自己第一次看到280 Slides時的感受,用“印象深刻”這個詞來形容絕對不誇張。接著我就去了解該站點的驅動程式碼源自開源Cappuccino專案,之後我將這些知識牢記心中,並在我以後的道路也受益很多。相信在大家的從業經歷中,也一定會見到過令您印象深刻的程式碼,如果,它屬於開源專案,請務必認真研究並將其融入自己的應用開發當中。
3.閱讀您所尊敬的人編寫的程式碼
閱讀您所尊敬的人編寫的程式碼
如果大家已經擁有一定開源軟體編寫經歷,那麼無疑已經結識了不少值得膜拜的大牛。我們可以認真閱讀他們編寫的程式碼,並在讚歎之餘藉此充實自己的頭腦。當然,即使沒有,想要找到理想的學習物件也絕非難事。
4.閱讀您能夠切實理解的程式碼
很多有冒險精神的朋友,可能更喜歡直接投身於Ruby on Rails、Drupal或者jQuery等大型專案當中。但我個人的建議,是大家最好能先從易於理解的程式碼入手。
大型專案的活動元件太多,大家可能掙扎於概念當中而無法快速汲取經驗。這種混亂會導致沮喪,甚至在理解當中消磨了自己的學習熱情。這時如果先挑選小型專案進行閱讀,會讓您能夠立刻掌握業務邏輯,並專注於研究其中的技術細節。
二、如何閱讀
說到這裡,新的問題來了——我們該如何閱讀程式碼?我擁有比較豐富的閱讀程式碼的經驗,所以下面我要與大家分享自己的一點心得。
閱讀程式碼,應該是既需要廣度也需要深度
廣度:看的是程式碼的整體架構,比如模組劃分與組織,設計模式的運用等等
深度:挑選自己感興趣的模組,深入理解學習他的具體實現
1.著眼於巨集觀
假設大家已經瞭解了所要閱讀程式碼的巨集觀作用。如果還沒有,那我建議大家通過網站、教程、文件乃至其它來源先弄清手頭這些程式碼的基本用處。
我認為第一步應該是著眼於專案結構。根據您所選擇的實際程式碼庫規模,這第一步的實際強度也有所區別,不過一般來講應該不會耗費太多時間。
程式設計組織結構
首先,關注檔案結構。大家可以使用TextMate等擁有資料夾層級檢視的編輯器作為輔助手段。上圖所示即為一份清晰的Twitter Ruby gem檢視。
這一步的目的是熟悉原始碼。瞭解哪些檔案包含/要求/載入其它檔案,主體程式碼在哪裡,是否使用了名稱空間等等。瞭解了這些基本情況下,開始深入細節。
2.記錄下您的發現
閱讀程式碼不應該是一種被動的行為。我建議大家隨時新增評論,記錄下您的假設並總結您理解中的程式流程。您第一次閱讀後的結論可能類似下面這種形式:
- 我認為這個函式被呼叫後的初始化
- 甚至這個方程做什麼?
- 第17行後很確定這個變數失去了範圍
而在理解了整個程序後,您可以清理掉這些評論,或者寫下更有意義且更為準確的意見。
3.進行測試
希望您選定的專案擁有測試套件。如果沒有,大家可以直接跳過此章節(或者另選一個包含測試套件的專案)。
將測試作為程式碼閱讀起點非常重要,因為其中記錄了程式碼所應完成的既定目標。而且無論程式碼質量多高,檢視測試結果都能幫助我們更清晰地理解原程式設計師的意圖。在閱讀時,確保測試套件能夠正常執行,這將保證您當前的開發環境配置正確。
4.執行、變更、再執行
誰說閱讀程式碼就沒法動手參與?大家可以嘗試改動現有專案再重新調整,從而真正理解其設計思路。大家不妨新增一項小功能,或者設定更為廣泛的日誌記錄機制,從而輸出各個階段的程式碼。如此一來,我們的閱讀過程就更像是參與一場冒險,而非面對一本晦澀的小說。相信我,這種方法非常有效。
5.重複再重複
在讀完一套程式碼庫後,選擇另一套繼續進行。您閱讀過的程式碼越多,您的學習速度就越快,並越能夠享受這種愉快的學習方式。
三、從哪裡入手
GitHub
我個人的閱讀程式碼旅程始於GitHub。找個適合自己的專案,馬上開始學習——GitHub是一座巨大的寶庫,感謝開源精神讓我們擁有如此珍貴的資源可供利用!