偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

如何閱讀一份源代碼?

新聞
我從業(yè)這些年泛讀、精讀過(guò)的項(xiàng)目源碼不算少了,陸陸續(xù)續(xù)的也寫(xiě)了一些代碼分析的文章,本文中就簡(jiǎn)單總結(jié)一下我的方法。

閱讀源代碼的能力算是程序員的一種底層基礎(chǔ)能力之一,這個(gè)能力之所以重要,原因在于:

  • 不可避免的需要閱讀或者接手他人的項(xiàng)目。比如調(diào)研一個(gè)開(kāi)源項(xiàng)目,比如接手一個(gè)其他人的項(xiàng)目。
  • 閱讀優(yōu)秀的項(xiàng)目源碼是學(xué)習(xí)他人優(yōu)秀經(jīng)驗(yàn)的重要途徑之一,這一點(diǎn)我自己深有體會(huì)。

然而,讀代碼比寫(xiě)代碼還是更難一些,原因在于“寫(xiě)代碼是在表達(dá)自己,讀代碼是在理解別人”。因?yàn)槊鎸?duì)的項(xiàng)目多,項(xiàng)目的作者有各自的風(fēng)格,理解起來(lái)需要花費(fèi)不少的精力。

[[260278]]

我從業(yè)這些年泛讀、精讀過(guò)的項(xiàng)目源碼不算少了,陸陸續(xù)續(xù)的也寫(xiě)了一些代碼分析的文章,本文中就簡(jiǎn)單總結(jié)一下我的方法。

先跑起來(lái)

開(kāi)始閱讀一份項(xiàng)目源碼的***步,是先讓這個(gè)項(xiàng)目能夠通過(guò)你自己編譯通過(guò)并且順利跑起來(lái)。這一點(diǎn)尤其重要。

有的項(xiàng)目比較復(fù)雜,依賴的組件多,搭建起一個(gè)調(diào)試環(huán)境并不容易,所以并不見(jiàn)得是所有項(xiàng)目都能順利的跑起來(lái)。如果能自己編譯跑起來(lái),那么后面講到的情景分析、加上調(diào)試代碼、調(diào)試等等才有展開(kāi)的基礎(chǔ)。

就我的經(jīng)驗(yàn)而言,一個(gè)項(xiàng)目代碼,是否能順利的搭建調(diào)試環(huán)境,效率大不一樣。

跑起來(lái)之后,又要盡量的精簡(jiǎn)自己的環(huán)境,減少調(diào)試過(guò)程中的干擾信息。比如,Nginx使用多進(jìn)程的方式處理請(qǐng)求,為了調(diào)試跟蹤Nginx的行為,我經(jīng)常把worker數(shù)量設(shè)置為1個(gè),這樣調(diào)試的時(shí)候就知道待跟蹤的是哪個(gè)進(jìn)程了。

總而言之,跑起來(lái)之后的調(diào)試效率能提升很多,而在跑起來(lái)的前提之下又要盡量精簡(jiǎn)環(huán)境。

調(diào)試手段

調(diào)試手段,大體分為以下兩種:

  • 加調(diào)試語(yǔ)句。為了做到這一點(diǎn),你需要先了解項(xiàng)目如何加調(diào)試日志,可能需要修改項(xiàng)目的日志級(jí)別支持輸出一些在調(diào)試級(jí)別的日志,等等。
  • 斷點(diǎn)調(diào)試。并不是所有項(xiàng)目代碼,跑起來(lái)之后都自帶調(diào)試信息能夠斷點(diǎn)調(diào)試的。所以在自己的調(diào)試環(huán)境里需要先確定這一點(diǎn)。比如一些C相關(guān)的項(xiàng)目,基本都是”./configure & make”來(lái)編譯,但是makefile中的編譯flags使用了O2之類的優(yōu)化選項(xiàng),此時(shí)需要自己先手動(dòng)修改成”-O0 -g”,即編譯生成的二進(jìn)制中不優(yōu)化且?guī)险{(diào)試信息。

總之,在能夠搭建自己的調(diào)試環(huán)境之后,還需要想辦法確定一下如何加上調(diào)試日志以及斷點(diǎn)調(diào)試。

使用順手的工具

好的工具會(huì)讓你事半功倍,這一點(diǎn)應(yīng)該很多人都同意。

我閱讀Go代碼的時(shí)候,喜歡使用IDEA,這個(gè)IDE工具可以***的做到以下幾點(diǎn):

符號(hào)的定位、跳轉(zhuǎn)、查找符號(hào)被引用的地方。

左邊能夠展開(kāi)一個(gè)源碼文件中的所有符號(hào)。

反之,很多人推崇的VSCode,我?guī)状螄L試使用用來(lái)閱讀Go和C類代碼,都覺(jué)得不夠順手,查找符號(hào)能力不行、也沒(méi)有地方可以看到一個(gè)文件中出現(xiàn)的符號(hào)。

C\C++類的代碼,在嘗試各種工具之后,還是使用Vim+Ctags+Cscope來(lái)寫(xiě)C、C++代碼。

情景分析

假如有了前面的基礎(chǔ),已經(jīng)能夠讓項(xiàng)目順利在自己的調(diào)試環(huán)境跑起來(lái)了,那么就可以對(duì)項(xiàng)目代碼進(jìn)行情景分析了。

所謂的“情景分析”,我的理解就是自己構(gòu)造一些情景,然后通過(guò)加斷點(diǎn)、調(diào)試語(yǔ)句等分析在這些場(chǎng)景下的行為。

以我自己為例,在寫(xiě)《Lua設(shè)計(jì)與實(shí)現(xiàn)》時(shí),講解到Lua虛擬機(jī)指令的解釋和執(zhí)行過(guò)程中,需要針對(duì)每個(gè)指令做分析,此時(shí)用的就是情景分析的方法。我會(huì)模擬出來(lái)使用該指令的Lua腳本代碼,然后在程序里斷點(diǎn)調(diào)試這些場(chǎng)景下的行為。

我慣用的做法,是在某個(gè)重要的入口函數(shù)上面加上斷點(diǎn),然后構(gòu)造觸發(fā)場(chǎng)景的調(diào)試代碼,當(dāng)代碼在斷點(diǎn)處停下,通過(guò)查看堆棧、變量值等等來(lái)觀察代碼的行為。

情景分析的好處在于:不會(huì)在一個(gè)項(xiàng)目中大海撈針?biāo)频牟檎?,而是能夠把?wèn)題縮小到一個(gè)范圍內(nèi)展開(kāi)來(lái)理解。

“情景分析”這一概念不是我想出來(lái)的名詞,比如有這么幾本分析代碼的書(shū)籍,如:《Linux內(nèi)核源代碼情景分析》,《Windows內(nèi)核情景分析》。

利用好測(cè)試用例

好的項(xiàng)目都會(huì)自帶不少用例,這類型的例子有:etcd、google出品的幾個(gè)開(kāi)源項(xiàng)目。

如果測(cè)試用例寫(xiě)的很仔細(xì),那么很值得好好去研究一下。原因在于:測(cè)試用例往往是針對(duì)某個(gè)單一的場(chǎng)景,獨(dú)自構(gòu)造出一些數(shù)據(jù)來(lái)對(duì)程序的流程進(jìn)行驗(yàn)證。所以,其實(shí)跟前面的“情景分析”一樣,都是讓你從大的項(xiàng)目轉(zhuǎn)而關(guān)注具體某個(gè)場(chǎng)景的手段之一。

厘清核心數(shù)據(jù)結(jié)構(gòu)之間的關(guān)系

雖然說(shuō)“程序設(shè)計(jì)=算法+數(shù)據(jù)結(jié)構(gòu)”,然后我實(shí)際中的體會(huì),數(shù)據(jù)結(jié)構(gòu)更加重要。

因?yàn)榻Y(jié)構(gòu)定義了一個(gè)程序的架構(gòu),結(jié)構(gòu)定下來(lái)了才有具體的實(shí)現(xiàn)。

Linus說(shuō): “爛程序員關(guān)心的是代碼。好程序員關(guān)心的是數(shù)據(jù)結(jié)構(gòu)和它們之間的關(guān)系。”

因此,在閱讀一份代碼時(shí),厘清核心的數(shù)據(jù)結(jié)構(gòu)之間的關(guān)系尤其重要。這個(gè)時(shí)候,需要使用一些工具來(lái)畫(huà)一下這些結(jié)構(gòu)之間的關(guān)系,我的源碼分析類博客中有很多這樣的例子,比如《Leveldb代碼閱讀筆記》、《Etcd存儲(chǔ)的實(shí)現(xiàn)》等等。

需要說(shuō)明的是,情景分析、厘清核心數(shù)據(jù)結(jié)構(gòu)這兩步并沒(méi)有嚴(yán)格的順序關(guān)系,不見(jiàn)得是先做某事再做某事,而是交互進(jìn)行的。

比如,你如果現(xiàn)在剛接手某個(gè)項(xiàng)目,需要簡(jiǎn)單的了解一下項(xiàng)目,可以先閱讀代碼了解都有哪些核心數(shù)據(jù)結(jié)構(gòu)。理解了之后,如果不清楚某些情景下的流程,可以使用情景分析法??偠灾惶孢M(jìn)行直到解答你的疑問(wèn)為止。

多問(wèn)自己幾個(gè)問(wèn)題

學(xué)習(xí)的過(guò)程中離不開(kāi)交互。

如果閱讀代碼只是輸入(Input),那么還需要有輸出(Output)。只有簡(jiǎn)單的輸入好比喂東西給你吃,而只有更好的消化才能變?yōu)樽约旱臓I(yíng)養(yǎng),而輸出就是更好消化知識(shí)的重要手段。

其實(shí)這個(gè)思想很常見(jiàn),比如學(xué)生上課(Input)了需要做練習(xí)作業(yè)(Output),比如學(xué)了算法(Input)需要自己編碼練習(xí)(Output),等等。簡(jiǎn)而言之,輸出是學(xué)習(xí)過(guò)程中的一種及時(shí)反饋,質(zhì)量越高學(xué)習(xí)效率越高。

輸出的手段有很多,在閱讀代碼時(shí),比較建議的是自己能夠多問(wèn)自己一些問(wèn)題,比如:

為什么選擇這個(gè)數(shù)據(jù)結(jié)構(gòu)來(lái)描述這個(gè)問(wèn)題?類似的場(chǎng)景下,其他項(xiàng)目是怎么設(shè)計(jì)的?都有哪些數(shù)據(jù)結(jié)構(gòu)做這樣的事情?

如果由我來(lái)設(shè)計(jì)這樣的項(xiàng)目,我會(huì)怎么做?

等等等等。越是主動(dòng)積極的思考,就越有更好的輸出,輸出質(zhì)量與學(xué)習(xí)質(zhì)量成正比關(guān)系。

寫(xiě)自己的代碼閱讀筆記

我從開(kāi)始寫(xiě)博客,就是寫(xiě)不少各種項(xiàng)目的代碼解讀類文章,網(wǎng)名“codedump”也源于想把“code內(nèi)部的實(shí)現(xiàn)原理dump出來(lái)”之意。

前面提到學(xué)習(xí)質(zhì)量與輸出質(zhì)量成正比關(guān)系,這是我自己的深刻體會(huì)。也因?yàn)槿绱?,所以才要?jiān)持閱讀源碼之后寫(xiě)自己的分析類筆記。

寫(xiě)這類筆記,有以下幾個(gè)需要注意的地方。

雖然是筆記,但是要想象著在向一個(gè)不太熟悉這個(gè)項(xiàng)目的人講解原理,或者想象一下是幾個(gè)月甚至幾年后的自己回頭來(lái)看這個(gè)文章。在這種情況下,會(huì)盡量的把語(yǔ)言組織好,循循善誘的解釋。

盡量避免大段的貼代碼。我認(rèn)為在這類文章中,大段貼上代碼有點(diǎn)自欺欺人:就是看上去自己懂了,其實(shí)并不見(jiàn)得。如果真要解釋某段代碼,可以使用偽代碼或者縮減代碼的方式。記?。翰灰云燮廴耍娴亩?。如果真的想在代碼上加上自己的注釋,我有一個(gè)建議是fork出來(lái)一份該項(xiàng)目某個(gè)版本的代碼,提交到自己的github上,上面隨時(shí)可以加上自己的注釋并且保存提交。比如我自己注釋的etcd 3.1.10代碼:etcd-3.1.10-codedump,類似的我閱讀的其他項(xiàng)目都會(huì)在github上fork出一個(gè)帶上codedump后綴的項(xiàng)目。

多畫(huà)圖,一圖勝千言,使用圖形展示代碼流程、數(shù)據(jù)結(jié)構(gòu)之間的關(guān)系。我最近才發(fā)現(xiàn)畫(huà)圖能力也是很重要的能力,自己在從頭學(xué)習(xí)如何使用圖像來(lái)表達(dá)自己的想法。

寫(xiě)作是很重要的基礎(chǔ)能力,我一個(gè)朋友最近教育我,大體的意思是說(shuō):如果你在某方面的能力很強(qiáng),如果再加上寫(xiě)作好、英語(yǔ)好,那么將極大放大你在這方面的能力。而類似寫(xiě)作、英語(yǔ)這樣的底層基礎(chǔ)能力,不是一撮而就的,需要長(zhǎng)時(shí)間保持練習(xí)才可以。而寫(xiě)博客,對(duì)于技術(shù)人員而言,就是一種很好的鍛煉寫(xiě)作的手段。

總結(jié)

以上是我簡(jiǎn)單總結(jié)的一些閱讀源碼時(shí)候的手段和注意方法,大體而言有那么幾點(diǎn)吧:

只有更好的輸出才能更好的消化知識(shí),所謂的搭建調(diào)試環(huán)境、情景分析、多問(wèn)自己?jiǎn)栴}、寫(xiě)代碼閱讀筆記等都是圍繞輸出來(lái)展開(kāi)的??偠灾?,不能像一條死魚(yú)一樣指望著光靠看代碼就能完全理解它的原理,需要想辦法跟它互動(dòng)起來(lái)。

寫(xiě)作是人的基礎(chǔ)硬實(shí)力之一,不僅鍛煉自己表達(dá)能力,還能幫助整理自己的思路。對(duì)程序員而言鍛煉寫(xiě)作能力的手段之一就是寫(xiě)博客,越早開(kāi)始鍛煉越好。

***,如同任何可以習(xí)得的技能一般,閱讀代碼這種能力也需要長(zhǎng)時(shí)間、大量的反復(fù)練習(xí),下一次就從自己感興趣的項(xiàng)目開(kāi)始鍛煉自己的這種技能吧。

責(zé)任編輯:未麗燕 來(lái)源: codedump.info
相關(guān)推薦

2016-10-11 16:28:11

源代碼

2023-03-21 09:44:34

模型AI

2022-04-29 08:48:25

開(kāi)源

2024-03-20 12:44:35

AI訓(xùn)練

2025-02-28 09:09:44

2025-07-03 09:28:44

架構(gòu)群消息開(kāi)發(fā)

2015-11-30 08:57:07

源代碼閱讀程序員

2015-11-30 11:01:07

程序員閱讀源代碼

2013-05-23 13:32:30

編程攻誠(chéng)獅工程師

2014-08-28 15:21:03

Linux面試

2012-07-11 23:26:10

bug測(cè)試

2011-05-25 16:59:20

前端工程師

2020-06-01 15:04:44

甲骨文自治數(shù)據(jù)庫(kù)

2023-05-19 06:53:58

GPT分析報(bào)告

2022-05-13 09:04:20

Python網(wǎng)絡(luò)爬蟲(chóng)JS逆向問(wèn)題

2024-11-07 08:50:56

用戶分析分類維度標(biāo)簽

2019-12-03 10:28:53

編程語(yǔ)言PythonJava

2016-08-24 16:55:18

DevOps結(jié)構(gòu)清單

2023-09-29 22:41:26

Kubernetes云原生

2018-05-03 07:06:21

開(kāi)發(fā)規(guī)范iOS
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)