來聊聊原始碼學習

2021-09-27 10:01:45 字數 2685 閱讀 5698

現如今我們的開發工作並不會從零開始,往往會基於很多開源庫,就前端而言,構建工具我們會使用 webpack,mvvm 框架我們會使用 vue、react 或者 angular,這些開源工具幫助我們大大提公升了生產效率。

很多同學都嘗試學習過原始碼,目前業內也會有各種開源庫的原始碼解析文章,那麼今天我們也來聊聊原始碼學習這個事兒。

這樣的同學往往是對技術非常熱愛,對未知技術的探索有著非常大的興趣,喜歡刨根問底。因此對於優秀的開源專案,他們都會非常願意花時間去**它的實現原理,並且一旦弄明白後會有非常大的成就感。

這樣的同學往往是願意通過更多的學習來提公升自己的技術能力。造輪子的技術含量比使用輪子的技術含量高,那麼研究輪子的實現原理,知道這個輪子是如何造出來的,也能在很大程度上提公升自己的技術能力。而且一般研究的原始碼都是和工作相關,學習原始碼也可以很好輔助自己平時的工作開發。

這樣的同學會在使用開源專案過程中踩到一些坑,並且查閱資料無果後決定來看一下原始碼的實現,去找一下問題的原因。但是坑驅動學習原始碼的方式比較被動,往往只能學習到原始碼的冰山一角,效果不如前 2 者。

這樣的同學可能佔比最高,因為如今很多面試官都喜歡問一些技術的實現原理,那麼就會逼迫大家在面試前去學習平時工作中使用到技術棧的原理實現,但是這樣的學習是最被動的,很多人可能選擇去看一些原始碼解析的文章去死記硬背,而並沒有真正掌握原始碼實現的精髓。

學習原始碼固然是件好事,但是如果在了不恰當的時機去學習可能會適得其反。有一部分同學對乙個開源專案甚至都沒搞清楚是幹什麼的時候就開始去看原始碼了,如果是一些稍微複雜的開源專案,這樣的效率非常低下的,很大概率是時間浪費了什麼也沒有學到。

那麼什麼時候我們該學習原始碼呢,我認為你至少已經對這個開源專案的使用已經很熟練了,並且對它的設計思想,用來解決什麼問題等等都比較清楚的時候,為了進一步對它深入學習,就可以來看它的原始碼實現了。

那麼如何去學習原始碼就非常重要了,誠然學習原始碼是一定會花時間的,好的學習方法會大大提公升學習效率,事半功倍。其實社群也有人推薦了一些學習原始碼的方式,比如說從原始碼早期的 commit 開始看,仿造乙個小型輪子等等。這裡我結合自己看原始碼的經驗總結了幾個點。

首先你要對這個開源專案要有全盤的了解,知道它產生的背景,來解決什麼樣的問題。開始看原始碼前,先對它的原始碼目錄結構、**執行入口、構建打包方式、最終產出的檔案等等有乙個整體的了解。需要用乙個全域性的視野去審視原始碼,切忌漫無目的的看原始碼。

在全盤了解的基礎上,就可以通過問題驅動去看原始碼了。以 vue.js 為例,我們知道了它的核心思想是資料驅動 元件化,那麼我們就可以問自己,vue 模板的資料是如何渲染到 dom 上的,資料更新後模板是如何重新渲染的,元件化是如何實現的,模板到 render 函式如何編譯的等等。那麼每乙個問題都可以值得我們針對性地去學習原始碼。問題驅動的方式和坑驅動不同的地方在於這個學習過程是主動的,自驅的,學到的東西會更加系統和全面;而坑驅動往往都會滿足於解決某個問題就停下了,學習會比較侷限。

當我們通過問題驅動去看**的時候,要牢記主線優先,所謂主線就是解決你這個問題核心流程中的**。因為通常乙個開源專案它的功能會很豐富,所以**分支邏輯會有很多。而當我們帶著問題去看原始碼的時候,切忌像**執行一樣把每個分支邏輯都去看一遍,我們要關心的就是主線部分。分支邏輯通常都是為了解決某些特定場景的問題,那麼如果想學習它的話就針對這個場景分析的時候再回來看即可。還是以 vue.js 為例,比如我們在分析模板是如何驅動 dom 渲染的,我們只要關心核心流程 init -> mount -> render -> update -> patch 這個過程的實現即可。那麼過程中遇到的初始化響應式物件這些分支邏輯,我們就可以先不看,因為當前分析的這個場景並不會有資料更新的部分,而這部分內容我們可以放到深入研究響應式原理的時候再看。

我理想中的開源社群是有更多的人參與到開源專案的共建中,當我們給開源專案做貢獻的時候,會要求我們對原始碼的理解要更加深入。共建的方式有多種,比如可以給開源專案提個 pr;比如主動要求幫助解決開源專案現有的 issue;比如參與開源專案的文件編寫工作等等。我在研究 vue.js 原始碼的過程中,也發現了一處原始碼的實現和文件不符的情況,於是提了 pr 對這個文件做了修復。通過共建的方式不僅僅可以幫助我們學習原始碼,也能增加成就感,一舉兩得。

當然,閱讀原始碼也是有很多技巧的,比如關鍵地方加斷點單步除錯、複雜函式看單元測試的輸入輸出、複雜邏輯通過畫圖輔助等等。

看懂原始碼實際上是乙個有挑戰的過程,特別是乙個複雜的開源專案。不同水平的人可能對原始碼的理解程度不一樣,這時候如果有一些別人分析好的優秀資料輔助我們學習原始碼,那麼效率會大大提公升,理解起來也會更加容易。但是社群原始碼分析的資料很多,如何鑑別好的資料是非常有必要的。

vue.js 作為前端 mvvm 框架,已經被越來越多的公司使用,各類的原始碼分析文章也層出不窮。但是縱觀這些原始碼分析文章,大部分都是作者的一些學習筆記,通過給原始碼加一些注釋的方式,這種資料和直接去看原始碼差別並不大,因為原始碼也會在一些需要的地方加上注釋(除非你英文很差看不懂)。另乙個比較大的問題就是比較零散,不夠系統和全面,如果想完整地去學習 vue.js,這種東拼西湊的學習資料其實效果也並不好。但是社群也有做的不錯的,比如染陌同學的 learnvue,算是我見到的比較全面的 vue.js 原始碼分析系列文章了。

通常我們對一門技術的掌握程度,我把它分為了 5 個層次:會用;熟練掌握;了解其實現原理;知道為什麼這麼做;能提出更好的實現方式。相信大部分同學還在前 2 個層次,那麼對原始碼的學習,可以讓我們高階到第 3 個層次。如果你達到了第 4 個層次以上,那麼你已經是乙個技術專家了。

希望同學們在學習原始碼的同時,不僅僅知其然,也能知其所以然。

隨便聊聊android的原始碼

在framework層看了些android的原始碼,主要有以下兩點感受 1,很多內部類和介面,但是這些內部類和介面,在其他外部類中也會有呼叫。2,很多全域性變數貫穿各個方法中,甚至於被其他外部類呼叫,修改,因此很難把握這些變數。這兩點,導致理解源 比較困難,並且有時想對某個方法進行單元測試,基本上很...

聊聊ThreadLocal原始碼 基於JDK1 8

原文 主要方法 public t get return setinitialvalue public void set t value 下面 時樓主認為threadlocal中比較重要的,還是比較容易看懂的,就不在一一細說 public class threadlocal 除非執行緒先前呼叫了方法,...

用ctags來瀏覽原始碼

比較土,才開始用ctags,挺好用,對於c 有良好的支援。基本用法 先安裝ctags,wget tar zxvf ctags 5.6.tar.gz cd ctags 5.6 configure make sudo make install cd home my code top src 進入你的原始...