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

面對(duì)枯燥的源碼,如何才能看得下去?

開(kāi)發(fā) 后端
一個(gè)軟件開(kāi)發(fā)人員,工作到了一定的年限(一般是3、4年左右),如果他還沒(méi)學(xué)會(huì)閱讀源碼,那么他就會(huì)遇到瓶頸。因?yàn)榈搅诉@個(gè)時(shí)候的開(kāi)發(fā),他應(yīng)該不僅僅只會(huì)做那些 CURD 的業(yè)務(wù)邏輯,而應(yīng)該會(huì)根據(jù)公司的實(shí)際情況去寫(xiě)框架。

 一個(gè)軟件開(kāi)發(fā)人員,工作到了一定的年限(一般是3、4年左右),如果他還沒(méi)學(xué)會(huì)閱讀源碼,那么他就會(huì)遇到瓶頸。因?yàn)榈搅诉@個(gè)時(shí)候的開(kāi)發(fā),他應(yīng)該不僅僅只會(huì)做那些 CURD 的業(yè)務(wù)邏輯,而應(yīng)該會(huì)根據(jù)公司的實(shí)際情況去寫(xiě)框架。

而基本上沒(méi)有誰(shuí)能像天才一樣從零寫(xiě)出一個(gè)框架,很多人寫(xiě)框架其實(shí)都是從模仿開(kāi)始的。而你要模仿,那么你首先得看得懂框架源碼才行。所以說(shuō)閱讀源碼才顯得那么重要。

我在工作一兩年的時(shí)候有嘗試去看過(guò) JDK 的源碼,那時(shí)候感覺(jué)就跟看天書(shū)一樣,看一點(diǎn)都覺(jué)得痛苦。一直到工作三年左右,因?yàn)橥露荚诳丛创a,我也開(kāi)始看一些源碼。

我看的***個(gè)框架的源碼是 dubbo,雖然說(shuō)沒(méi)有完全搞懂它。但是通過(guò)閱讀 dubbo 源碼,我弄懂了 JDK 的 SPI 機(jī)制,知道 SPI 在框架開(kāi)發(fā)中的作用。一直到最近閱讀公司的一個(gè)網(wǎng)關(guān)框架,我才慢慢有一點(diǎn)閱讀源碼的經(jīng)驗(yàn)和套路。正好趁熱打鐵,把這些經(jīng)驗(yàn)寫(xiě)下來(lái),希望你們也能早日踏上源碼閱讀之路。

搜索網(wǎng)上資料

閱讀一個(gè)框架的源碼,最基礎(chǔ)的操作肯定是掃一遍網(wǎng)上的各種分析文章。通過(guò)這個(gè)操作,你可以對(duì)這個(gè)框架有個(gè)大致的了解。站在巨人的肩膀上,少走許多彎路。但如果你看的項(xiàng)目是公司內(nèi)部的框架,那么你只能找公司內(nèi)部的文檔了,更甚者,有些連文檔都沒(méi)有。那么你可以略過(guò)這一步。

掃一遍源碼

當(dāng)你拿到框架的源碼的時(shí)候,你可以大致把源碼的每個(gè)包,以及每個(gè)包下面的文件掃讀一遍。掃讀并不需要你弄清楚每一行代碼的意思,只需要讓你知道源碼每一部分的作用。

如果一個(gè)開(kāi)源框架足夠標(biāo)準(zhǔn),那么他的命名是非常語(yǔ)義化的。所以我們掃讀的時(shí)候,通過(guò)包名、文件名就可以判斷出這個(gè)包是用來(lái)干嘛的。

例如 util 包是工具類,那我們可以直接跳過(guò)。vo 包是存放實(shí)體模型的,同樣可以跳過(guò)。protocol 包是存放協(xié)議相關(guān)的等等。通過(guò)這么一個(gè)步驟,你會(huì)對(duì)整個(gè)項(xiàng)目有一個(gè)基本的印象,知道這個(gè)項(xiàng)目大概有哪些東西,哪些相對(duì)比較重要。

找到入口

閱讀任何一個(gè)框架的源碼,首先就是要找到框架的入口。通過(guò)上面掃讀源碼,你應(yīng)該能夠發(fā)現(xiàn)一些入口的跡象,例如對(duì)于 Dubbo 來(lái)說(shuō),你會(huì)發(fā)現(xiàn)它有一個(gè)名為 dubbo-demo 的子模塊,那么我們肯定重點(diǎn)看它。

進(jìn)一步發(fā)掘需求你會(huì)發(fā)現(xiàn)它的入口就是 dubbo-demo 中的 Provider 類、Consumer 類。我們可以直接接運(yùn)行這兩個(gè)類的 main 方法,并一步步跟蹤代碼的執(zhí)行情況。

通讀源碼

找到入口之后,下一步就是通讀所有源碼了,就是把源碼的每個(gè)文件每一行都看一遍。在這個(gè)階段不求完全弄懂細(xì)致的業(yè)務(wù)邏輯,但是要形成一個(gè)大概的框架,知道這個(gè)框架是如何設(shè)計(jì)的,有哪些大致的模塊,這些模塊是如何設(shè)計(jì)的。

在通讀源碼這個(gè)階段是最枯燥無(wú)味的,也是最容易放棄的。一方面因?yàn)樵创a實(shí)在過(guò)于多,另一方面因?yàn)闆](méi)有一個(gè)目標(biāo),所以看著看著心里沒(méi)有底,所以容易放棄。我一開(kāi)始也是如此,但之后我想出了一個(gè)比較好的辦法,通過(guò)數(shù)字化的方式讓自己知道閱讀進(jìn)度。這樣自己就不會(huì)覺(jué)得心里沒(méi)底,不知道要多久才能看完了。

我的方法是給我的 IDE 裝一個(gè)代碼統(tǒng)計(jì)插件:Statistics。這個(gè)插件能夠統(tǒng)計(jì)項(xiàng)目中的源碼行數(shù)。例如下面是我統(tǒng)計(jì) dubbo 項(xiàng)目源碼的截圖,它會(huì)列出每個(gè) java 文件的源碼行數(shù),以及總共的行數(shù)。

從上面的截圖我們可以看到 dubbo 項(xiàng)目里,源碼的行數(shù)有 11 萬(wàn)行。這樣一來(lái),自己心理也有個(gè)大致的預(yù)期了。接下來(lái),我會(huì)把這些數(shù)據(jù)拷貝出來(lái),放在一個(gè) Excel 表格里,就像下面這樣子:

在 Excel 表格中,我只會(huì)存放每個(gè)源碼文件的名字、其源碼行數(shù)、源碼行數(shù)占比。接下來(lái)我會(huì)按著入口,一個(gè)個(gè)去看源文件,把每個(gè)方法看過(guò)一遍,看過(guò)的方法我會(huì)寫(xiě)一個(gè)注釋,例如:csy mark,并寫(xiě)上我的注釋。

當(dāng)我把一個(gè)文件都看過(guò)之后,我會(huì)把 Excel 表格中對(duì)應(yīng)的文件最右邊一列,寫(xiě)上其百分比。***我會(huì)在下邊有一行,統(tǒng)計(jì)我所看完文件的百分比。

我每看完一個(gè)方法,我就寫(xiě)一個(gè) csy done 來(lái)鼓勵(lì)下自己。每看完一個(gè)文件,我就在 Excel 中把它標(biāo)記為完成,最下邊的已讀百分比也會(huì)跟著不斷升高。通過(guò)這種方式,我讓枯燥無(wú)味的源碼閱讀,有些一點(diǎn)趣味,有了一些目標(biāo)。

通讀源碼是最枯燥的,最容易沒(méi)有方向和目標(biāo)的。有了數(shù)字化的記錄,你可以知道自己現(xiàn)在的進(jìn)度是怎么樣,看了多少的源碼。很多時(shí)候我們看了很久,發(fā)覺(jué)沒(méi)什么進(jìn)度的樣子,又不想看了。

這時(shí)候你可以給自己定一個(gè)目標(biāo),例如:一天看完 5% 的源碼就可以休息。那當(dāng)你想偷懶的時(shí)候,看看 Excel 下方的已讀百分比,還沒(méi)到 5%,繼續(xù)看吧。

這種方式對(duì)于我來(lái)說(shuō),還是有一定作用的。但對(duì)于你們不知道有沒(méi)有作用,你們可以嘗試一下。如果有用的話,就來(lái)評(píng)論告訴我吧。

梳理框架

在通讀源碼的過(guò)程中,你就會(huì)對(duì)框架有許多新的認(rèn)識(shí),會(huì)知道這個(gè)框架大致分為哪幾個(gè)部分,每個(gè)部分的作用是什么,這個(gè)模塊用了什么設(shè)計(jì)理念等等。

如果說(shuō)上個(gè)階段是通讀源碼,那么這個(gè)階段就是要把你在通讀源碼過(guò)程中的收獲整理出來(lái)。在整理的過(guò)程中,你肯定會(huì)有更多的疑問(wèn),你會(huì)不斷地細(xì)化,不斷地精讀。

批判性思考

通過(guò)了上面幾個(gè)階段,你會(huì)發(fā)現(xiàn)你對(duì)這個(gè)框架有了整體的認(rèn)識(shí),并且對(duì)每個(gè)模塊的實(shí)現(xiàn)細(xì)節(jié)都有了比較深刻的認(rèn)識(shí)。這個(gè)時(shí)候,你可以想一想為什么它要這么做,這么做有什么好處,那能用另一種方式做得更好嗎?

總結(jié)

上面幾個(gè)階段是我閱讀幾個(gè)框架源碼之后的一些體會(huì),相信會(huì)是一個(gè)不錯(cuò)的源碼閱讀指南。如果你有更好的源碼閱讀經(jīng)驗(yàn)或方法,歡迎留言與我交流。

責(zé)任編輯:龐桂玉 來(lái)源: Java技術(shù)棧
相關(guān)推薦

2024-10-11 12:37:12

2013-01-05 09:44:30

年終總結(jié)項(xiàng)目管理

2022-08-16 21:01:56

runAsyncreload數(shù)據(jù)

2021-12-29 11:51:15

Linux 內(nèi)核源碼Linux 系統(tǒng)

2022-06-06 08:02:21

ahooks架構(gòu)hooks

2020-03-17 19:39:50

區(qū)塊鏈區(qū)塊鏈技術(shù)

2015-12-24 18:07:18

創(chuàng)業(yè)改變世界技術(shù)創(chuàng)業(yè)

2024-12-18 18:53:48

2017-11-03 22:23:30

劉磊

2017-06-18 16:01:57

2009-09-25 15:15:17

算法

2020-02-21 09:58:55

復(fù)工疫情互聯(lián)網(wǎng)企業(yè)

2018-12-05 16:00:32

MongoDB數(shù)據(jù)庫(kù)NoSQL

2011-10-25 10:07:54

2021-12-06 07:09:45

數(shù)據(jù)業(yè)務(wù)語(yǔ)言

2021-02-26 07:56:31

數(shù)據(jù)業(yè)務(wù)Sql

2011-10-25 09:58:01

2016-09-22 13:42:45

用友

2013-03-15 10:35:17

編程語(yǔ)言編程笑話
點(diǎn)贊
收藏

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