在下是一個(gè)碼農(nóng),也號(hào)稱是一個(gè)老濕,平生閱碼農(nóng)無數(shù)(吹牛的 ^-^)。經(jīng)由大量的案例,我能夠理解了為什么很多碼農(nóng)學(xué)了很多年Linux,還是感覺沒有掌握要領(lǐng),仍然內(nèi)心崩潰,最終對(duì)Linux吐血而亡,正所謂:人世間最大的痛苦,莫過于,碼農(nóng)落花有意,而Linux流水無情.......
在這個(gè)2018農(nóng)歷七夕之夜,我決定寫一點(diǎn)什么,來緬懷很多童鞋在Linux世界里逝去的青春,撫慰你內(nèi)心的失落、彷徨、迷茫乃至絕望。
很多為L(zhǎng)inux吐血而亡的程序員都犯了一個(gè)通病,那就是一開始就陷入無窮無盡的細(xì)節(jié),比如一開始就陷入源代碼情景分析。情景分析這樣的書,無疑是好書,但是你把《新華字典》從第一個(gè)單詞,背到最后一個(gè)單詞,你仍然寫不出一篇作文。
若言琴上有琴聲,放在匣中何不鳴?
若言聲在指頭上,何不于君指上聽?
《琴詩》
蘇軾
我建議的學(xué)習(xí)方法是,反復(fù)迭代螺旋上升法。如下圖:
下面我們來論述學(xué)習(xí)Linux內(nèi)核的各個(gè)階段
第一階段: 先形成整體輪廓,比如對(duì)Linux的進(jìn)程、內(nèi)存、I/O、驅(qū)動(dòng)模型有一些基本的認(rèn)識(shí),開始寫一些簡(jiǎn)單的內(nèi)核模塊,比如hello-world模塊、globalmem、globalfifo這樣的字符驅(qū)動(dòng),你一定要?jiǎng)邮?。這個(gè)時(shí)候你可以看的書是《Linux內(nèi)核設(shè)計(jì)與實(shí)現(xiàn)》,還有驅(qū)動(dòng)的書。
第二階段:從事具體的工作,在某個(gè)子系統(tǒng)(無論是進(jìn)程、內(nèi)存、IO還是驅(qū)動(dòng))從事工作,加新的功能,修bug,發(fā)patch,加深對(duì)知識(shí)的理解。這階段你如果有興趣,也有耐心,可以讀《深入理解Linux內(nèi)核》、《深入Linux內(nèi)核架構(gòu)》這樣的書,不過懶得看也沒有關(guān)系,因?yàn)槟愎ぷ鞯臅r(shí)候,會(huì)自然而然地自己進(jìn)行代碼分析。
第三階段(回歸第一階段):你已經(jīng)工作了一段時(shí)間,寫了一些代碼,修復(fù)了一些bug,提交了一些patch,然后你重新回來迭代整體的知識(shí)框架,搞清楚各個(gè)子系統(tǒng)內(nèi)在的聯(lián)系。這階段你如果有興趣可以讀《深入理解Linux內(nèi)核》、《深入Linux內(nèi)核架構(gòu)》這樣的書,不過懶得看也沒有關(guān)系,因?yàn)槟愕墓ぷ髯屇阕约河辛朔治龅哪芰Α?/p>
第四階段(回歸第二階段):從事具體的工作,在某個(gè)子系統(tǒng)(無論是進(jìn)程、內(nèi)存、IO還是驅(qū)動(dòng))從事工作,加新的功能,修bug,發(fā)patch,加深對(duì)知識(shí)的理解。這階段你如果有興趣可以讀《深入理解Linux內(nèi)核》、《深入Linux內(nèi)核架構(gòu)》這樣的書,不過懶得看也沒有關(guān)系,因?yàn)槟愕纳钊氲墓ぷ鳎瑫?huì)讓你自己具備了理清脈絡(luò)和深入細(xì)節(jié)的能力。
接下來怎么辦?不停地循環(huán)!生命不息,循環(huán)不止??!兩情若是久長(zhǎng)時(shí),又豈在朝朝暮暮。
你千萬不要倒著學(xué),先跑進(jìn)去細(xì)節(jié),跑進(jìn)去一行行,總共2000萬行地?cái)]代碼,這樣量太大,整體性太弱,各個(gè)組件的關(guān)聯(lián)很難建立。且中間無法用前期的成就感,來催生后期學(xué)習(xí)的動(dòng)力,只會(huì)強(qiáng)擼灰飛煙滅。你不從外圍看Linux,橫著看,豎著看,你是看不到Linux的真面目的。
橫看成嶺側(cè)成峰,遠(yuǎn)近高低各不同。
不識(shí)廬山真面目,只緣身在此山中。
據(jù)我個(gè)人所知,也有極少量的人,一開始就以情景分析的方法,逐行解釋代碼,最后也學(xué)有所成,但是這樣的人,都具有非凡的毅力,不是一般人可以去模仿的。
一般的人,類似我這樣的懶惰分子,需要用整體帶動(dòng)部分的方法。正如我們看一個(gè)別人的.c文件,你不可能傻到從第一行讀到最后一行。你肯定是先搞清楚這個(gè).c的整體功能,對(duì)外接口API,再深入到static的內(nèi)部函數(shù),由外及內(nèi),繼而由內(nèi)及外。
下面我們用一個(gè)球來比如Linux,最外圈的球是整體的Linux,球內(nèi)的小球是Linux的某個(gè)組件。最開始你這樣看Linux:
接下來你把其中的某些子系統(tǒng)放大,整個(gè)Linux這個(gè)氣球也隨著變大:
隨著掌握的越多,這個(gè)球越來越大:
然后,某個(gè)領(lǐng)域成為你的專業(yè)領(lǐng)域(比如你文件系統(tǒng)牛逼,比如你內(nèi)存優(yōu)化牛逼),這個(gè)球里面這個(gè)專業(yè)領(lǐng)域就凸起了:
-
內(nèi)核
+關(guān)注
關(guān)注
3文章
1372瀏覽量
40290 -
Linux
+關(guān)注
關(guān)注
87文章
11304瀏覽量
209518 -
源代碼
+關(guān)注
關(guān)注
96文章
2945瀏覽量
66748
原文標(biāo)題:宋寶華: 迭代螺旋法——關(guān)于Linux學(xué)習(xí)方法的血淚建議
文章出處:【微信號(hào):LinuxDev,微信公眾號(hào):Linux閱碼場(chǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論