歡迎光臨
每天分享高質量文章

迭代螺旋法——關於Linux學習方法的血淚建議

在下是一個碼農,也號稱是一個老濕,平生閱碼農無數(吹牛的 ^-^)。經由大量的案例,我能夠理解了為什麼很多碼農學了很多年Linux,還是感覺沒有掌握要領,仍然內心崩潰,最終對Linux吐血而亡,正所謂:人世間最大的痛苦,莫過於,碼農落花有意,而Linux流水無情…….


在這個2018農曆七夕之夜,我決定寫一點什麼,來緬懷很多童鞋在Linux世界里逝去的青春,撫慰你內心的失落、彷徨、迷茫乃至絕望。


很多為Linux吐血而亡的程式員都犯了一個通病,那就是一開始就陷入無窮無盡的細節,比如一開始就陷入原始碼情景分析。情景分析這樣的書,無疑是好書,但是你把《新華字典》從第一個單詞,背到最後一個單詞,你仍然寫不出一篇作文。

若言琴上有琴聲,放在匣中何不鳴?

若言聲在指頭上,何不於君指上聽?


《琴詩》

蘇軾


我建議的學習方法是,反覆迭代螺旋上升法。如下圖:

下麵我們來論述學習Linux內核的各個階段

  1. 第一階段: 先形成整體輪廓,比如對Linux的行程、記憶體、I/O、驅動模型有一些基本的認識,開始寫一些簡單的內核模塊,比如hello-world模塊、globalmem、globalfifo這樣的字符驅動,你一定要動手。這個時候你可以看的書是《Linux內核設計與實現》,還有驅動的書。

  2. 第二階段:從事具體的工作,在某個子系統(無論是行程、記憶體、IO還是驅動)從事工作,加新的功能,修bug,發patch,加深對知識的理解。這階段你如果有興趣,也有耐心,可以讀《深入理解Linux內核》、《深入Linux內核架構》這樣的書,不過懶得看也沒有關係,因為你工作的時候,會自然而然地自己進行代碼分析。

  3. 第三階段(回歸第一階段):你已經工作了一段時間,寫了一些代碼,修複了一些bug,提交了一些patch,然後你重新回來迭代整體的知識框架,搞清楚各個子系統內在的聯繫。這階段你如果有興趣可以讀《深入理解Linux內核》、《深入Linux內核架構》這樣的書,不過懶得看也沒有關係,因為你的工作讓你自己有了分析的能力。

  4. 第四階段(回歸第二階段):從事具體的工作,在某個子系統(無論是行程、記憶體、IO還是驅動)從事工作,加新的功能,修bug,發patch,加深對知識的理解。這階段你如果有興趣可以讀《深入理解Linux內核》、《深入Linux內核架構》這樣的書,不過懶得看也沒有關係,因為你的深入的工作,會讓你自己具備了理清脈絡和深入細節的能力。

接下來怎麼辦?不停地迴圈!生命不息,迴圈不止!!兩情若是久長時,又豈在朝朝暮暮。


你千萬不要倒著學,先跑進去細節,跑進去一行行,總共2000萬行地擼代碼,這樣量太大,整體性太弱,各個組件的關聯很難建立。且中間無法用前期的成就感,來催生後期學習的動力,只會強擼灰飛煙滅。你不從外圍看Linux,橫著看,豎著看,你是看不到Linux的真面目的。

據我個人所知,也有極少量的人,一開始就以情景分析的方法,逐行解釋代碼,最後也學有所成,但是這樣的人,都具有非凡的毅力,不是一般人可以去模仿的。


一般的人,類似我這樣的懶惰分子,需要用整體帶動部分的方法。正如我們看一個別人的.c檔案,你不可能傻到從第一行讀到最後一行。你肯定是先搞清楚這個.c的整體功能,對外接口API,再深入到static的內部函式,由外及內,繼而由內及外。


下麵我們用一個球來比如Linux,最外圈的球是整體的Linux,球內的小球是Linux的某個組件。最開始你這樣看Linux:

接下來你把其中的某些子系統放大,整個Linux這個氣球也隨著變大:
隨著掌握的越多,這個球越來越大:
然後,某個領域成為你的專業領域(比如你檔案系統牛逼,比如你記憶體優化牛逼),這個球裡面這個專業領域就凸起了:

我不是大神,我只是屌絲,但是我愛你們!


願你的球球越來越大!

願你的球球越來越大!!

願你的球球越來越大!!!

你的球有多大,你的世界就有多大。

赞(0)

分享創造快樂