思索了這兩個問題良久,也去知乎找了一些相關話題的問答,但並沒有標準答案。所以,我這裡也只是記錄一些我對此的看法,也許會隨著 RTFSC 閱歷的豐富而發生變化,我會記錄更新於 github.com/mzlogin/rtf…。
意義
在我看來,閱讀原始碼的意義在於學習優秀的「套路」。
這裡的「套路」所指範圍很廣,大到架構設計,小到可取的命名風格,還有設計模式、實現某類功能使用到的資料結構和演算法等等。所謂高手,其實就是能比大部分人更早更快地掌握套路並熟練運用之人。
埋頭在自己的天地裡耕芸固然也能逐漸進步和成長,但總會有時候會遇到一些場景,你苦思良久也無法做出良好的設計,總會有一些時候,糾結如何為一個變數命名讓你停下飛速敲擊的手指。這些令你為難的場景,先賢們也許早就遇到過,並且給出了優雅的解決方案。看優秀的原始碼的時候,將這樣的場景與對應的方案收入囊中,或者僅僅在腦中留下一個印象也好,以便在需要的時候,你的武器庫裡總能掏出一把稱手的傢伙來。
一些方法
不應該這樣
不應該漫無目的地隨手拿起一分原始碼,試圖去通讀。這一方面會過目即忘無所收穫,另一方面會枯燥得讓你迅速從著手到放棄。學習的方式有很多種,閱讀原始碼並不一定是最適合你當前的情況的。
應該這樣
精心挑選要閱讀的原始碼專案。
這最好是與你的程式語言、你的工作內容、你的興趣所在相關的,這樣才能更切實地感受到閱讀原始碼給你帶來的益處,更有動力繼續。
如果你想學習的知識點有官方文件,先看文件再看原始碼。
直接從原始碼著手,搞清楚原理固然是好,但是原始碼有可能是難啃的,先熟悉官方提供給所有人看的文件,能較為平滑地對這方面的知識先有個大概的瞭解,然後再結合原始碼去深入。
提出具體的問題,然後帶著問題到原始碼中找答案。
比如在使用 Toast 的過程中,你可能會想到一些問題:
Toast.makeText(...).show()
時發生了什麼?Toast 能不能在非 UI 執行緒呼叫?能不能自定義 Toast 佈局?諸如此類。在原始碼中探尋完你想要的答案,你的目的也就達到了。從一些共性層面入手。
大部分的程式裡都會使用到的東西,比如執行緒模型、UI 組織結構、任務排程方式等等。針對某一個方面去了解,比漫無目的要有效率得多。
最好能夠編譯執行起來。
如果一份程式碼你只能看不能跑,那可能讀到一些地方你只能猜這個地方的資料值和跳轉結構是怎麼樣的,而很有可能你猜的是錯的。但如果你能編譯執行,那在需要的時候你可以修改,加日誌等等來更好地觀察和驗證你的想法,得到正確的理解。
做一些筆記。
一方面是將你的學習成果保留下來,方便隨時查閱,畢竟只憑腦子記憶是不靠譜的;另一方面在學習的過程中,也能幫助理解。
原始連結:閱讀原始碼的意義與方法
假如你對我的文章感興趣,可以關注我的微信公眾號 isprogrammer 隨時閱讀更多內容。