Ⅰ 如何閱讀源代碼
最近有做源碼閱讀的事情,覺得有些費盡,做了一些思考。 一個大項目的源代碼,不要過份詳細的閱讀。大項目,其代碼量基本上是可以嚇死人的。過份的關注細節,常常會拘泥於細節,而忽略了整體框架。當你能夠看清框架的時候,亦花費了太多的時間。 因此,閱讀一個大項目的源代碼,其目的不在於欣賞代碼細節,而在於迅速看清項目整體框架的大概面貌:都有那些模塊,這些模塊是幹嘛的(不關心具體怎麼干),模塊之間的通訊機制大概是怎樣的,然後在考慮子模塊,通常只要掌握兩級子模塊就夠了。花上1,2天的時間掌握這一切,就達到了閱讀大項目源碼的目的。因為一旦你掌握了框架,你就可以按照這個框架實現這個項目,雖然和原項目全然不同,但是完成的需求卻是一樣的。 在軟體中,架構才是本質。 也許你指望詳細閱讀大項目源代碼能看到高質量的代碼,但是,大項目通常都是團隊的勞動成果,每個人的不同水平造就了代碼質量的高高低低,一個人在不同時間不同環境的代碼質量也是不同的。要指望在大片源碼面前找到高質量,簡直是天方夜譚。 也許你要從閱讀源碼中掌握某項技術細節,比如bsp,又或者換裝,那麼,最好的建議是查找相關的技術文檔以及文檔上所附帶的sample code,這種sample code一般不會附帶任何干擾,簡潔得只是為了證明該技術而存在的。如果沒有這些東西,而只能從大項目源碼中找的話,你提前先了解了框架,能更快的查找和定位到表達該技術的文件。但是通常都會比較不幸,因為你為了明白這一技術,通常要先理解混入其中的另一技術。 最後談談怎樣才能閱讀到高質量的源代碼。何謂高質量?是指演算法出人一表(比如某種o(1)的排序法)?還是採用了極端深奧的語言特性將某實現完美表達(比如模板的靈活運用)?無論是哪種,最好的來源是書,如《STL詳解》,或者《inside XX》這樣的東西。書的作者通常就是這些高質量代碼的作者,他會帶領你探索這些源碼背後的真相。
Ⅱ 如何提高自己閱讀代碼的能力
理解
1
我們可以用拼圖這樣的游戲,來做一個比喻。一地的碎片,你如何將他們盡快的拼在一起?
1.尋找邊角的塊(除了四邊都是凹凸的塊之外,其他有一到兩條邊是直線的塊,會少得多,也更容易辨認與拼接。)
2.將碎塊按大的色塊分類,從一次查找,變成二次查找。
3.一開始碎塊最多的時候,是最困難的時候,需要足夠的耐心、細心,以及一點點的運氣。
4.如果你的記憶力足夠的好,碰到的碎塊能夠在腦子里留下一定的印象,那麼有助於你快速找到匹配的碎塊。
5.經驗能夠幫助你提高效率,熟能生巧。
2
回到代碼閱讀,我們來做一個類比:
1.尋找代碼中最明顯的入手處,比如main函數,core文件夾,model、view、controller的三種大類等等。
2.從理解文件夾、文件名開始,而不是一上來就埋頭進入源代碼之中。
3.一個好的全文搜索工具,能夠幫你找到相關的代碼與片段,漸漸的,看起來一團亂麻的代碼,就會顯現出各種可以被理解的關聯出來。
4.記憶力總是有用的,在腦子里繪出整個系統的架構,並且補充越來越的,越來越清晰的細節。
5.一樣是熟能生巧。
3
相比拼圖,代碼閱讀還要容易一些,你不需要理解全部的代碼,有一個大致的理解以後,就可以先放過一些不太重要的細節。
END
引用較為相關的一段在下面,供參考
1
知其所以然
有一句俗語叫做:「知其然,更要知其所以然」。用在任何學習科目上,幾乎都是恰當的。本章叫做《理解開源項目》,而之前的4個小節,可以說都是屬於「知其然」的功夫。如何才能知其所以然呢?
2
所以然包括哪些內容?
往大了說,整個這份文檔,希望幫助讀者達到的,就是能夠對於開源軟體「知其所以然」。這樣才算是真正提高了軟體開發的能力。因此,我們可以將「架構決策」、「代碼風格」、「領域知識」、「編程技巧」等等內容,都算作是所以然的一部分。
3
架構決策
通過深入閱讀和分析源代碼,理解整個項目,為何像這樣,而不是那樣做架構設計。其間蘊含著項目作者的經驗和智慧,理解了這個,將是一種巨大的收獲。
4
代碼風格
每一種語言、每一個社區、每一個開發者群體,甚至每一個開源項目,都有其獨特的代碼風格,這種風格,有其背後的合理性,也有很多是來源於某種開 發哲學的思 考。理解一種代碼風格,就是理解一種思考的模式,一種思想的體系。能夠多了解一些不同種類的代碼風格,對於提高軟體開發能力,將有很大的幫助。
5
領域知識
有些代碼不容易看懂,很重要的一個原因,是這個項目所涉及的領域,我們沒有什麼深入的了解。多年的程序員經驗告訴我,要做好某一個行業的軟體, 一定要成為 某一個行業的內行。甚至要比那個本行業的業內人士,更加精通。因此,一個優秀的程序員,通常是能夠跟你聊多個不同行業的話題的。強大到你幾乎無法分別他的 是不是業內人士。因此,通過理解開源項目,進而理解相關的領域知識,會有很多收獲。
6
編程技巧
閱讀優秀的開源項目的代碼,有時候很像是看一本好書。細細品味,慢慢的體會。我們會發現一點一滴的「妙處」。這些妙處凝聚了程序員的巧思妙想,能夠體會得越多,對我們的幫助也就越大。
7
個人偏好
開源作者也是普通人,他們有很多觀點和取捨,未必能夠說服他人,只能算是他們自己的偏好。而他們將自己的偏好表達在代碼里,有些時候,我們能夠 很容易理解 (因為我們也是這樣想的)。有些時候,我們就會感覺很不解,而且,常常會發生的一類故事就是:某某大牛寫了一個開源項目,另一個大牛有感覺不爽的地方。提 了意見建議,人家又不肯改。結果,這另外一個大牛,就一怒之下,另起爐灶,寫了一個新的開源項目。
8
歷史原因
有一篇很有意思的文章,解釋了《為什麼Vim使用HJKL鍵作為方向鍵 》,其實原因很簡單。當Bill Joy創建Vi文本編輯器時,他使用的機器機器是ADM-3A終端機,這機器就是把HJKL鍵作為方向鍵的。
Ⅲ 我有閱讀障礙症,讀文章很吃力,對我的學習也造成了影響,怎麼解決
有些人對生疏的語句就是這樣,你常練習就會好的,相信你平時說話和讀文章的時候肯定不一樣!
Ⅳ 學編程很吃力怎麼辦
萬事開頭難。編程要靠理解的。同時要加強上機操作的。加油吧。
Ⅳ 如何有效地閱讀PyTorch的源代碼
最近剛開始使用theano, 經驗不多,連個基本的模型都跑不通,於是去看了下Keras,源碼比較簡潔,可以當作theano的示例教程來看,感受如下:
文檔看似很全,每個layer是幹啥的,每個參數是啥都寫了,但是不去讀代碼,實際很多人是無法從文檔理解其具體用法的。這點看issue里的討論里可以看出。同樣,example似乎很多,而且都能直接run,還都是real world的數據集,看似很好,但是實際上,對於新手,如果需要的模型跟example里的不完全一樣,不容易搞懂到底需要把輸入輸出的數據搞成啥格式。舉個例子,example都是做的classification的,沒有做sequence labeling的例子,如果想拿來做個pos tagging,不知道數據如何組織。當然,這些其實花一天讀下代碼或者好好翻翻issue討論就可以解決了,但我相信不少人不會去認真讀代碼或者看討論,而是直接換個工具。我感覺目前的doc只有懂了代碼的人才能看懂,不懂得看文檔還是沒啥用。
2.項目很簡單所以開發者不多,但是很活躍,每天都有新東西加進去。今天增加了一個新的分支後端可以用theano或者tensorflow了,不過貌似由於不支持scan,backend用tensorflow的沒實現recurrent layer。他們也意識到文檔的問題,覺得需要為小白用戶多加點tutorial而不是光給develop看。
我沒用過其他的framework,僅說keras拿來學習theano基本用法,很不錯
庫本身的代碼,比較簡單易讀,我作為python菜鳥,也能看懂。目前model有sequential和grapgh兩種,前者並不是指recurrent而是說網路是一層層堆的(也包括recurrent).其他的主要概念包括layer,regularizer, optimizer,objective都分離開。layer用於build每層的輸出函數,model會用最後一層的輸出,根據objective和每個layer的regularizer來確定最終的cost,然後在update時用optimizer來更新參數。把這四個看下加上model里的fit函數,就會用theano啦。很多模型都能cover,seq2seq這種也有現成的可用。建議不要光看example,多看看github上的 issues討論,實在找不到,直接提問。效率方面,我不懂theano怎麼優化,感覺keras的這種封裝,沒什麼成本,跟自己用原生theano是一樣的。當然,theano本身就好慢啊。。估計是我不懂用吧。。
用於測試函數式返回的數值是否有錯。如果有錯,該函數返回
Ⅵ 我覺得學習很吃力很累怎麼辦··
調整好自己的心態,勞逸結合,根據自身安排好學習和休息的時間。以最好的狀態來面對學習。 一定會有壓力的,有壓力不是一件壞事 ,可是使你有更足的動力來克服學習中遇到的困難,這一點你要自己學會調節,你要明白,爸媽無論怎麼說你,初衷都是希望你能好不懂的地方,不要怕丟臉,一定要找老師或者同學問清楚。 所有的問題都是一點一點積累起來的,現在你不問 ,以後問題就會堆積如山,讓你無從下手。所以,你要及時弄清不明白的地方,不然你會後悔的。
至於附加題,相信你在弄明白你不懂的地方,加上你聰明的頭腦,就OK了!
愛默生說,偉大人物最明顯的標識,就是他具有堅韌不拔的精神,不管環境變化到何種程度,他的初衷和希望,仍然不會有絲毫的改變,而終至克服障礙,達到所期望的目的。 那為何 堅韌不拔 呢? 在我看來,有兩個含義 一是:堅定 ,二是:堅忍。
Ⅶ 為什麼以及如何閱讀源碼
對於這些問題,說到底主要是因為經驗不夠,而經驗主要從項目實踐中積累,所以招聘單位一般都會限定工作時間大於 3 年,因為這些人的項目經驗相對較豐富,項目中遇到的場景相對較多。
工作經驗的積累來自於年限與實踐,然而看源碼可以擴展我們的思路,這是變相增加我們經驗的不錯方法。雖然不能短時間內通過時間積累經驗,但是可以通過學習開源框架、開源項目來獲取。
另外進職場後一般都要先熟悉現有系統,如果有文檔還好,沒文檔的話就得自己去翻代碼研究。如果大家之前對閱讀源碼有經驗,那麼在研究新系統的代碼邏輯時就不會那麼費勁了。
Ⅷ 怎樣提高閱讀源代碼的效率
1、一邊閱讀代碼一邊寫注釋。這是我用過的最好的方法,對代碼理解得更深入,看一些重要代碼或者特別難懂的代碼時挺有用。更何況,注釋也是一種文檔嘛。
2、一邊閱讀代碼一邊繪制UML。這個方法適用於類之間的關系較復雜和調用層次較深的情況,我一般都是先繪制順序圖,然後為順序圖中的類繪制關系圖。
3、通過Debug來跟蹤程序的主要執行過程,這樣就可以分清主次了,閱讀的時候更有針對性。
4、類的快速閱讀。先弄清楚它在繼承鏈中的位置,看看它的內部狀態,也就是成員變數,一般來說,類的對外介面都是對成員變數的訪問、加工、代理等,然後看看它的對外介面,也就是公有成員函數,識別核心的一個或多個函數,這時候你應該可以大概了解這個類的職責或作用了。可能這個類是某個設計模式中的一個組成部分,所以,設計模式的掌握對代碼的快速閱讀也是很有幫助的。
5、帶著問題去閱讀。比如想了解android中的消息機制,那麼看看Looper、Handler、MessegeQueue這幾個類就可以了,其他的不要去看,要不然就跑題了。
Ⅸ 我閱讀速度很慢,理解能力差怎麼辦
我的語文高考成績128,我有一個很深的體會就是---背誦,不要一看就說我胡說,記憶好的句子,不是名人名言啊,就是讀的文章中的寫得優美的或是很有哲理的,就記下來,這樣久而久之,你會在不知不覺中提高自己的文學素養,對文字就敏感起來,當然,這真的是一個長久的過程,就看你能不能堅持了,再說,還沒上初三,時間足夠了。
Ⅹ 做英語閱讀很吃力怎麼辦
1、擴大詞彙量,培養詞義推斷理解能力。
詞彙是語言的三大要素之一,是閱讀的基礎,
近幾年的閱讀短文的詞彙量都在2200個單詞左右,就要求學生不但要積累足夠的詞彙量,而且要學會構詞法(轉化、派生、合成)來豐富自身的詞彙量;常見詞綴有:①表反義的前綴詞dis-, im-, un-,in-等,例如:disappear,disagree, impossible,unvisible, inexpensive,unable等;②加後綴轉化為形容詞有:-able, -sive, -less,-ful等,例如:reasonable, unknowable, effective等;③名詞加ly或y轉化為形容詞,如month→monthly,year→yearly, salt→salty等;④「non-」表示「沒有」「否定」之意,如non-stop,non-sleep,non-recyclable等;⑤「over-」表示「超過、超額、超量」之意,如:overwork,oversleep等。
加強訓練,讓學生學會根據構詞法(根據詞根、前綴、後綴等推斷出生詞的詞義)、上下文(例子、定義、對比、同義詞、反義詞、語境)、邏輯關系等方法來推斷生詞的詞義。
2、提高閱讀速度
首先要克服不良的閱讀習慣:一次一個單詞,用手指著讀,一遇到生詞就停下來,「聲讀」(小聲朗讀或心裡默讀)等等,加強限時閱讀訓練。
3、加強訓練,培養學生剖析結構,分析解讀長難句能力。近年來,高考閱讀的長句、難句的數量逐年增多,大大地加大了學生閱讀難度,影響閱讀速度和效果。這些句子結構復雜、修飾語疊綴、信息容量大,有時一個句子占幾行甚至一個自然段。其實,這類句子並不可怕,只要善於理清其基本結構和各語段之間的關系,在分層理解內容的基礎上整合全句語義,難句也就迎刃而解。
4、選好閱讀材料,擴大閱讀量,豐富學生英語文化背景知識
近幾年絕大多數高考閱讀材料是介紹英語國家的文化、人文、生活、人生觀、科普、習俗、歷史、人物等。學生除了看懂文章外,具備一定的背景知識也極為重要,它是閱讀理解的催化劑。因為語言是文化的載體,話語不能脫離文化背景而獨立存在。文化背景知識的獲取,除了教材課文閱讀外,更多的是通過課外閱讀英文讀物,而課外閱讀材料的選取要注意以下二個方面:①、體裁多樣,題材廣泛,包含記敘文、應用文、議論文。涉及人文、歷史、生活、人生觀、習俗、科普等,趨向現代化、生活化、知識化,突出實用性與時代性、趣味性。②、盡量選用原汁原味的英文讀物,而且這些讀物應具有一定的生詞量(具有一定的生詞量的英文讀物是今後高考選材的一種趨勢)。