關於如何閱讀源碼的一點心得

 

1、前言設計模式

平常交流過程當中,常常會被問到爲什麼要閱讀源碼和如何閱讀源碼的問題,本文從做者的角度來寫下對這兩個問題的理解,但願你們共同探討,共同進步。微信

本文內容:多線程

  • 爲什麼要閱讀源碼,閱讀源碼能給咱們帶來什麼?架構

  • 如何閱讀源碼,閱讀源碼有什麼技巧?併發

2、爲什麼要閱讀源碼

咱們在作項目時候通常會遇到下面的問題:框架

  • 問題一是不知道如何去設計,好比剛入職場時,來一個需求需作概要設計,不知如何下手,不得不去看當前系統相似需求是如何設計的,而後仿照去設計。工具

  • 問題二是設計的時候,考慮問題不周全,相比職場新手,這類人對一個需求依靠本身的經驗已經可以拿出一個概要設計,可是設計中常常會遺漏一些異常細節,好比使用多線程有界隊列執行任務,遇到機器宕機了,若是隊列裏面的任務不存盤的話,那麼機器下次啓動時候這些任務就丟失了。學習

對於這些問題,說到底主要是由於經驗不夠,而經驗主要從項目實踐中積累,因此招聘單位通常都會限定工做時間大於 3 年,由於這些人的項目經驗相對較豐富,項目中遇到的場景相對較多。spa

工做經驗的積累來自於年限與實踐,然而看源碼能夠擴展咱們的思路,這是變相增長咱們經驗的不錯方法。線程

雖然不能短期內經過時間積累經驗,可是能夠經過學習開源框架、開源項目來獲取。

  • 另外進職場後通常都要先熟悉現有系統,若是有文檔還好,沒文檔的話就得本身去翻代碼研究。

    若是你們以前對閱讀源碼有經驗,那麼在研究新系統的代碼邏輯時就不會那麼費勁了。

  • 還有一點就是當你使用框架或者工具作開發時,若是你對它的實現有所瞭解,就能最大化的減小出故障的可能。

    好比並發隊列 ArrayBlockingQueue 裏面元素入隊有個 offer 和 put 方法,雖然某個時間點你知道使用 offer 方法時,當隊列滿了就會丟棄要入隊的元素,以後 offer 方法會返回 false,而不會阻塞當前線程;

    使用 put 方法時當隊列滿了,則會掛起當前線程,直到隊列有空閒元素,入隊成功後才返回。

    可是人是善忘的,當你一段時間不使用,就會忘記他們的區別,這時當你使用時,需進入 offer 和 put 的源碼看他們的實現。

    進入 offer 方法一看,哦,原來隊列滿後直接返回了 false;進入 put 方法一看,哦,原來隊列滿後,直接使用條件變量的 await 方法掛起了當前線程;知道了他們的區別,你就能夠根據本身的需求來選擇了。

看源碼最大的好處是能夠開闊思惟,提高架構設計能力。有些東西僅靠書本和本身思考是很難學到的,必須經過看源碼,看別人如何設計,而後思考爲什麼這樣設計才能獲取。

能力的提升不在於你寫了多少代碼,作了多少項目,而在於給你一個業務場景時,你是否能拿出幾種靠譜的解決方案,而且說出各自的優缺點。

而如何才能拿出來,一來靠經驗,二來靠概括總結,而看源碼能夠快速增長你的經驗。

3、如何閱讀源碼

那麼如何閱讀源碼呢?

在你看某一個框架的源碼前,先去 Google 查找這個開源框架的官方介紹,經過資料看看該框架有幾個模塊,各個模塊是作什麼的,之間是什麼聯繫,每一個模塊都有哪些核心類,在閱讀源碼時能夠着重看這些類

而後對哪一個模塊感興趣就去寫個小 demo,先了解下這個模塊的具體做用,而後在 debug 進入看具體實現,

在 debug 過程當中第一遍是蜻蜓點水,簡略的看下調用邏輯,都用了哪些類;

第二遍需有重點的 debug,看看這些類擔任了架構圖裏的哪些功能,使用了哪些設計模式?

若是第二遍有感受了,便大體知道了總體代碼的功能實現,可是對總體代碼結構還不是很清晰,畢竟代碼裏面多個類來回調用,很容易迷失當前斷點的來處。

那麼你能夠進行第三遍 debug,這時候你最好把主要類的調用時序圖、以及類圖結構畫出來,等畫好後,在對着時序圖分析調用流程,就能夠清楚的知道類之間的調用關係,經過類圖就能夠知道類的功能、以及相互之間的依賴關係了。

另外開源框架裏面每一個功能類或者方法通常都有註釋,這些註釋是一手的好資料,好比 JUC 包裏的一些併發組件的註釋,就已經提供了它們的設計原理和使用場景。

另外閱讀源碼時,最好畫出時序圖和類圖,由於人老是善忘的,若是隔一段時間後你在去看以前看過的源碼,雖然有些印象,但當你想去看某個模塊的邏輯時,又需根據 demo 再從頭 debug 了,而若是有了這倆圖,就能夠從時序圖或者類圖裏面直接找,而且看一眼時序圖就知道整個模塊的脈絡了。

還有查框架使用說明最好去官網查,雖然是英文,可是看久了就行了,畢竟還有 Google 翻譯吶!

固然研究代碼時不必定非要 debug 三遍,其實這裏說的是三種掌握程度,若是你 debug 一遍就能掌握,那天然更好啦。

 

4、總結

本文談了本身關於閱讀源碼的一些心得體會,歡迎你們來共同探討閱讀源碼的更佳方案,讓你們閱讀源碼不在是難事。

歡迎關注微信公衆號:shoshana

相關文章
相關標籤/搜索