一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

高效學(xué)習(xí)開源項(xiàng)目的五大步驟!

 leo_qiu的書館 2018-07-07
作者|李運(yùn)華
編輯|小智
如何對(duì)待開源?

得益于開源運(yùn)動(dòng)的蓬勃發(fā)展,眾多技術(shù)頂尖的公司、團(tuán)隊(duì)或者個(gè)人通過開源的方式向技術(shù)社區(qū)貢獻(xiàn)了許多優(yōu)秀的開源項(xiàng)目,一方面大大促進(jìn)了整體技術(shù)的發(fā)展,另一方面大大減輕了中小公司和團(tuán)隊(duì)在技術(shù)方面的投入壓力,讓團(tuán)隊(duì)能夠更加聚焦于業(yè)務(wù)。

開源項(xiàng)目對(duì)團(tuán)隊(duì)和業(yè)務(wù)有很大好處,但對(duì)于技術(shù)人員來(lái)說(shuō),如果只是簡(jiǎn)單的采取“拿來(lái)主義”,那就變成一個(gè)陷阱:看似很快的用開源項(xiàng)目實(shí)現(xiàn)了需求,但自己的技術(shù)水平并沒有什么提升;甚至可能出現(xiàn)看起來(lái)用了很多開源項(xiàng)目,知道很多項(xiàng)目名稱,但技術(shù)水平止步不前的窘境。

因此,對(duì)于開源項(xiàng)目,不能簡(jiǎn)單的采取“拿來(lái)主義”,而要比較深入的去學(xué)習(xí)開源項(xiàng)目,做到“知其然,知其所以然”,一方面是為了更好地應(yīng)用這些開源項(xiàng)目,另一方面也是為了通過學(xué)習(xí)優(yōu)秀的開源項(xiàng)目來(lái)提升自己的能力。

很多技術(shù)同學(xué)確實(shí)也想深入學(xué)習(xí)一些業(yè)界成熟和優(yōu)秀的開源項(xiàng)目,例如 Nginx、Redis、Netty 等,但是在具體實(shí)踐的時(shí)候,常常因?yàn)橐恍┎徽_的觀點(diǎn)而誤入歧途,例如:

  • 只有開發(fā)這些開源項(xiàng)目的人才能真正理解,我沒法參與這個(gè)項(xiàng)目開發(fā),因此我很難深入理解。

  • 我的項(xiàng)目沒有用 Redis,不用的話很難深入理解。

  • 數(shù)據(jù)結(jié)構(gòu)和算法很重要,所以我只要研究其數(shù)據(jù)結(jié)構(gòu)和算法就夠了,例如 Nginx 用的紅黑樹。

  • “Talk is cheap, show me the code”,一頭扎進(jìn)源碼逐行閱讀。

這些觀點(diǎn)要么讓自己望而生畏從而輕易放棄,要么讓自己浪費(fèi)大量時(shí)間而沒有多大收獲。那究竟要怎樣做才是正確的呢?下面我結(jié)合自己的經(jīng)驗(yàn)談?wù)勎覍?duì)如何學(xué)習(xí)開源項(xiàng)目的看法。

首先,需要樹立正確的觀念:不管你是什么身份,都可以從開源項(xiàng)目中學(xué)到很多東西。

例如,要理解 Redis 的網(wǎng)絡(luò)模型,我們不需要成為 Redis 的開發(fā)者,也不需要一定要用到 Redis,只要具備一定的網(wǎng)絡(luò)編程基礎(chǔ),再通過閱讀 Redis 的源碼,都可以學(xué)習(xí) Redis 這種單進(jìn)程的 Reactor 模型。

其次,不要只盯著數(shù)據(jù)結(jié)構(gòu)和算法,事實(shí)上這兩點(diǎn)在學(xué)習(xí)開源項(xiàng)目的時(shí)候并沒有那么重要。

例如,Nginx 使用紅黑樹來(lái)管理定時(shí)器,對(duì)于絕大部分人來(lái)說(shuō),只要知道這點(diǎn)就夠了,并不需要去研究 Nginx 實(shí)現(xiàn)紅黑樹的源碼是如何寫的,除非你需要修改這部分,但我認(rèn)為極少人會(huì)有這個(gè)需求。

第三,采取自頂向下的學(xué)習(xí)方法,源碼不是第一步,而是最后一步。

不要一上來(lái)就去看源碼,而是要基本掌握了功能、原理、關(guān)鍵設(shè)計(jì)之后再去看源碼,看源碼的主要目的是為了學(xué)習(xí)其代碼的寫作方式,以及關(guān)鍵技術(shù)的實(shí)現(xiàn)。

例如,Redis 的 RDB 持久化模式“會(huì)將當(dāng)前內(nèi)存中的數(shù)據(jù)庫(kù)快照保存到磁盤文件中”,那這里所謂的“數(shù)據(jù)庫(kù)快照”到底是怎么做的呢?在 Linux 平臺(tái)上其實(shí)就是 fork 一個(gè)子進(jìn)程來(lái)保存就可以了;那為何 fork 子進(jìn)程就生成了數(shù)據(jù)庫(kù)快照了呢?這又和 Linux 的父子進(jìn)程機(jī)制以及 copy-on-write 技術(shù)相關(guān)了。

通過這種方式,既能夠快速掌握系統(tǒng)設(shè)計(jì)的關(guān)鍵點(diǎn)(Redis 的 RDB 模式),又能夠掌握具體的編程技巧(內(nèi)存快照)。

接下來(lái)我詳細(xì)談?wù)劇白皂斚蛳隆钡膶W(xué)習(xí)方法和步驟。

第一步:安裝

很多人看到“安裝”這個(gè)步驟都可能會(huì)覺得有點(diǎn)不以為然:“不就是對(duì)照手冊(cè)執(zhí)行一下命令么,沒什么技術(shù)含量,用的時(shí)候裝一下就可以了”。事實(shí)上,安裝步驟遠(yuǎn)遠(yuǎn)不止這么簡(jiǎn)單,通過具體的安裝過程,你可以獲取到如下一些關(guān)鍵信息:

這個(gè)系統(tǒng)的依賴組件,而依賴的組件是系統(tǒng)設(shè)計(jì)和實(shí)現(xiàn)的基礎(chǔ)

以 Nginx 為例,源碼安裝 Nginx 依賴的庫(kù)有 pcre、pcre-devel、openssl、openssl-devel、zlib,光從名字上看都能夠了解一些信息,例如 openssl 可能和 https 有關(guān),zlib 可能和壓縮有關(guān)。

再以 Memcache 為例,最大的依賴就是 libevent,而根據(jù) libevent 是一個(gè)高性能的網(wǎng)絡(luò)庫(kù),我們就能大概推測(cè) Memcache 的網(wǎng)絡(luò)實(shí)現(xiàn)應(yīng)該是 Reactor 模型的。

安裝目錄也能夠提供一些使用和運(yùn)行的基本信息

例如,Nginx 安裝完成后,目錄如下:

這個(gè)目錄提供的信息有:conf 是存放配置文件的,logs 是存放日志的,sbin 是運(yùn)行程序,但是 html 是什么呢?這個(gè)疑問會(huì)促使你繼續(xù)去研究和學(xué)習(xí)。

再來(lái)看看 Redis,安裝完成后,目錄下只有一個(gè) bin 目錄,具體如下:

我相信大部分人看到這目錄都會(huì)感到有點(diǎn)驚訝:這也太簡(jiǎn)單了吧,尤其是與 Nginx 相比!因此也會(huì)自然而然的有一些疑問,例如 Redis 如何配置?Redis 日志保存在哪里?這些疑問同樣會(huì)促使你繼續(xù)去研究和學(xué)習(xí),帶著問題去學(xué)習(xí)效率是最高的。

系統(tǒng)提供了哪些工具方便我們使用

同樣以 Redis 為例,你可以看到 redis-benchmark、redis-check-aof 等程序,從名字能夠大概猜出這些工具的基本使用場(chǎng)景,而這些工具在后面故障定位和處理、性能測(cè)試等場(chǎng)景可能非常方便。

第二步:運(yùn)行

安裝完成后,我們需要真正將系統(tǒng)運(yùn)行起來(lái),運(yùn)行系統(tǒng)的時(shí)候有兩個(gè)地方要特別關(guān)注:命令行和配置文件,它們主要提供了兩個(gè)非常關(guān)鍵的信息:系統(tǒng)具備哪些能力和系統(tǒng)將會(huì)如何運(yùn)行。這些信息是我們窺視系統(tǒng)內(nèi)部運(yùn)行機(jī)制和原理的一扇窗口。

例如,下面是 Memcache 的啟動(dòng)參數(shù)一部分:

通過這幾個(gè)啟動(dòng)參數(shù),你可以獲取如下一些信息:

  • Memcache 支持 UNIX socket 通信和 TCP 通信。

  • Memcache 可以指定內(nèi)存大小。

  • lock memory 看起來(lái)和內(nèi)存有關(guān),但具體是什么意思?配置和不配置有什么區(qū)別么?

通常情況下,如果我們將每個(gè)命令行參數(shù)和配置項(xiàng)的作用和原理都全部掌握清楚了的話,基本上對(duì)系統(tǒng)已經(jīng)很熟悉了。我的一個(gè)習(xí)慣是不管三七二十一,先把所有的配置項(xiàng)全部研究一遍,包括配置項(xiàng)的原理、作用、影響,并且嘗試去修改配置項(xiàng)然后看看系統(tǒng)會(huì)有什么變化。例如,將 Memcache 的“--conn-limit”改為 1 后,查看多個(gè)連接請(qǐng)求時(shí) Memecache 會(huì)返回什么錯(cuò)誤、記錄什么日志等。

第三步:原理研究

完成前兩個(gè)步驟后,我們對(duì)系統(tǒng)已經(jīng)有了初步的感覺和理解,此時(shí)可以更進(jìn)一步去研究其原理。其實(shí)在研究命令行和配置項(xiàng)的時(shí)候已經(jīng)涉及一部分原理了,但是還不系統(tǒng),因此我們要專門針對(duì)原理進(jìn)行系統(tǒng)性的研究。這里的關(guān)鍵就是“系統(tǒng)性”三個(gè)字,怎么才算系統(tǒng)性呢?主要體現(xiàn)在如下幾個(gè)方面:

關(guān)鍵特性的基本實(shí)現(xiàn)原理

每個(gè)流行的開源項(xiàng)目之所以能夠受到大眾的歡迎,肯定是有一些賣點(diǎn)的,常見的有高性能、高可用、可擴(kuò)展等特性,那到底這些項(xiàng)目是如何做到其所宣稱的那么牛的呢?這些牛 X 的技術(shù)實(shí)現(xiàn)就是我們要學(xué)習(xí)的地方。

例如,Memcache 的高性能具體是怎么做到的呢?首先是基于 libevent 實(shí)現(xiàn)了高性能的網(wǎng)絡(luò)模型,其次是內(nèi)存管理 Slab Allocator 機(jī)制。為了徹底理解 Memcache 的高性能網(wǎng)絡(luò)模型,我們需要掌握很多知識(shí):多路復(fù)用、Linux epoll、Reactor 模型、多線程等,通過研究 Memcache 的高性能網(wǎng)絡(luò)模型,我們能夠?qū)W習(xí)一個(gè)具體的項(xiàng)目中如何將這些東西全部串起來(lái)實(shí)現(xiàn)了高性能。

再以 React 為例,Virtual DOM 的實(shí)現(xiàn)原理是什么、為何要實(shí)現(xiàn) Virtual DOM、React 是如何構(gòu)建 Virtual DOM 樹、Virtual DOM 與 DOM 什么關(guān)系等,通過研究學(xué)習(xí) Virtual DOM,即使不使用 React,我們也能夠?qū)W習(xí)如何寫出高性能的前端的代碼。

優(yōu)缺點(diǎn)對(duì)比分析

這是我想特別強(qiáng)調(diào)的一點(diǎn),只有清楚掌握技術(shù)方案的優(yōu)缺點(diǎn)后才算真正的掌握這門技術(shù),也只有掌握了技術(shù)方案的優(yōu)缺點(diǎn)后才能在架構(gòu)設(shè)計(jì)的時(shí)候做出合理的選擇。

優(yōu)缺點(diǎn)主要通過對(duì)比來(lái)分析,即:我們將兩個(gè)類似的系統(tǒng)進(jìn)行對(duì)比,看看它們的實(shí)現(xiàn)差異,以及不同的實(shí)現(xiàn)優(yōu)缺點(diǎn)都是什么。典型的對(duì)比有 Memcache 和 Redis,例如(僅舉例說(shuō)明,實(shí)際上對(duì)比的點(diǎn)很多),Memcache 用多線程,Redis 用單進(jìn)程,各有什么優(yōu)缺點(diǎn)?Memcache 和 Redis 的集群方式,各有什么優(yōu)缺點(diǎn)?即使是 Redis 自身,我們也可以對(duì)比 RDB 和 AOF 兩種模式的優(yōu)缺點(diǎn)。

在你了解了什么是“系統(tǒng)性”后,我來(lái)介紹一下原理研究的手段,主要有三種:

  • 通讀項(xiàng)目的設(shè)計(jì)文檔:例如 Kafka 的設(shè)計(jì)文檔,基本涵蓋了消息隊(duì)列設(shè)計(jì)的關(guān)鍵決策部分;Disruptor 的設(shè)計(jì)白皮書,詳細(xì)的闡述了 Java 單機(jī)高性能的設(shè)計(jì)技巧。

  • 閱讀網(wǎng)上已有的分析文檔:通常情況下比較熱門的開源項(xiàng)目,都已經(jīng)有非常多的分析文檔了,我們可以站在前人的基礎(chǔ)上,避免大量的重復(fù)投入。但需要注意的是,由于經(jīng)驗(yàn)、水平、關(guān)注點(diǎn)等差異,不同的人分析的結(jié)論可能有差異,甚至有的是錯(cuò)誤的,因此不能完全參照。一個(gè)比較好的方式就是多方對(duì)照,也就是說(shuō)看很多篇分析文檔,比較它們的內(nèi)容共同點(diǎn)和差異點(diǎn)。

  • Demo 驗(yàn)證:如果有些技術(shù)點(diǎn)難以查到資料,自己又不確定,則可以真正去寫 Demo 進(jìn)行驗(yàn)證,通過打印一些日志或者調(diào)試,能清晰的理解具體的細(xì)節(jié)。例如,寫一個(gè)簡(jiǎn)單的分配內(nèi)存程序,然后通過日志和命令行(jmap、jstat、jstack 等)來(lái)查看 Java 虛擬機(jī)垃圾回收時(shí)的具體表現(xiàn)。

第四步:測(cè)試

通常情況下,如果你真的準(zhǔn)備在實(shí)際項(xiàng)目中使用某個(gè)開源項(xiàng)目的話,必須進(jìn)行測(cè)試。有的同學(xué)可能會(huì)說(shuō),網(wǎng)上的分析和測(cè)試文檔很多,直接找一篇看就可以了?如果只是自己學(xué)習(xí)和研究,這樣做是可以的,因?yàn)闃?gòu)建完整的測(cè)試用例既需要耗費(fèi)較多時(shí)間,又需要較多機(jī)器資源,如果每個(gè)項(xiàng)目都這么做的話,投入成本有點(diǎn)大;但如果是要在實(shí)踐項(xiàng)目中使用,必須自己進(jìn)行測(cè)試,因?yàn)榫W(wǎng)上搜的測(cè)試結(jié)果,不一定與自己的業(yè)務(wù)場(chǎng)景很契合,如果簡(jiǎn)單參考別人的測(cè)試結(jié)果,很可能會(huì)得出錯(cuò)誤的結(jié)論。例如,開源系統(tǒng)的版本不同,測(cè)試結(jié)果可能差異較大。同樣是 K-V 存儲(chǔ),別人測(cè)試的 value 是 128 字節(jié),而你的場(chǎng)景 value 都達(dá)到了 128K 字節(jié),兩者的測(cè)試結(jié)果也差異很大,不能簡(jiǎn)單照搬。

測(cè)試階段需要特別強(qiáng)調(diào)的一點(diǎn)就是:測(cè)試一定要在原理研究之后做,不能安裝完成立馬就測(cè)試! 原因在于如果對(duì)系統(tǒng)不熟悉,很可能出現(xiàn)命令行、配置參數(shù)沒用對(duì),或者運(yùn)行模式選擇不對(duì),導(dǎo)致沒有根據(jù)業(yè)務(wù)的特點(diǎn)搭建正確的環(huán)境、沒有設(shè)計(jì)合理的測(cè)試用例,從而使得最終的測(cè)試結(jié)果得出了錯(cuò)誤結(jié)論,誤導(dǎo)了設(shè)計(jì)決策。曾經(jīng)有團(tuán)隊(duì)安裝完成 MySQL 5.1 后就進(jìn)行性能測(cè)試,測(cè)試結(jié)果出來(lái)讓人大跌眼鏡,經(jīng)過定位才發(fā)現(xiàn) innodb_buffer_pool_size 使用的是默認(rèn)值 8M。

第五步:源碼研究

源碼研究的主要目的是學(xué)習(xí)原理背后的具體編碼如何實(shí)現(xiàn),通過學(xué)習(xí)這些技巧來(lái)提升我們自己的技術(shù)能力。例如 Redis 的 RDB 快照、Nginx 的多 Reactor 模型、Disruptor 如何使用 volatile 以及 CAS 來(lái)做無(wú)鎖設(shè)計(jì)、Netty 的 Zero-Copy 等,這些技巧都很精巧,掌握后能夠大大提升自己的編碼能力。

通常情況下,不建議通讀所有源碼,因?yàn)橄胝莆彰啃写a的含義和作用還是非常耗費(fèi)時(shí)間的,尤其是 MySQL、Nginx 這種規(guī)模的項(xiàng)目,即使是他們的開發(fā)人員,都不一定每個(gè)人都掌握了所有代碼。帶著明確目的去研究源碼,做到有的放矢,才能事半功倍,這也是源碼研究要放在最后的原因。

對(duì)于一些基礎(chǔ)庫(kù),除了閱讀源碼外,還可以自己寫個(gè) Demo 調(diào)用基礎(chǔ)庫(kù)完成一些簡(jiǎn)單的功能,然后通過調(diào)試來(lái)看具體的調(diào)用棧,通過調(diào)用棧來(lái)理解基礎(chǔ)庫(kù)的處理邏輯和過程,這比單純看代碼去理解邏輯要高效一些。例如,下面是 Netty 4.1 版本的 telnet 服務(wù)器樣例調(diào)試的堆棧,通過堆棧我們可以看到完整的調(diào)用棧:

時(shí)間分配

前面介紹的“自頂向下”5 個(gè)步驟,完整執(zhí)行下來(lái)需要花費(fèi)較長(zhǎng)時(shí)間,而時(shí)間又是大部分技術(shù)人員比較稀缺的資源。很多人在學(xué)習(xí)技術(shù)的時(shí)候都會(huì)反饋說(shuō)時(shí)間不夠,版本進(jìn)度很緊,很難有大量的時(shí)間進(jìn)行學(xué)習(xí),但如果不學(xué)習(xí)感覺自己又很難提升?面對(duì)這種兩難問題,具體該如何做呢?

通常情況下,以上 5 個(gè)步驟的前 3 個(gè)步驟,不管是已經(jīng)成為架構(gòu)師的技術(shù)人員,還是立志成為架構(gòu)師的技術(shù)人員,在研究開源項(xiàng)目的時(shí)候都必不可少;第四步可以在準(zhǔn)備采用開源項(xiàng)目的時(shí)候才實(shí)施,第五步可以根據(jù)你的時(shí)間來(lái)進(jìn)行靈活安排。這里的“靈活安排”不是說(shuō)省略不去做,而是在自己有一定時(shí)間和精力的時(shí)候做,因?yàn)橹挥羞@樣才能真正理解和學(xué)到具體的技術(shù)。

如果感覺自己時(shí)間和精力不夠,與其蜻蜓點(diǎn)水每個(gè)開源項(xiàng)目都去簡(jiǎn)單了解一下,還不如集中精力將一個(gè)開源項(xiàng)目研究通透,就算是每個(gè)季度只學(xué)習(xí)一個(gè)開源項(xiàng)目,積累幾年后這個(gè)數(shù)量也是很客觀的;而且一旦你將一個(gè)項(xiàng)目研究透以后,再去研究其他類似項(xiàng)目,你會(huì)發(fā)現(xiàn)自己學(xué)習(xí)的非??欤?yàn)楣残缘牟糠帜阋呀?jīng)都掌握了,只需要掌握新項(xiàng)目差異的部分即可。


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    欧美日韩无卡一区二区| 在线观看国产成人av天堂野外| 中国日韩一级黄色大片| 精品国产成人av一区二区三区| 色婷婷日本视频在线观看| 色无极东京热男人的天堂| 久热99中文字幕视频在线| 免费在线观看激情小视频| 91亚洲国产成人久久精品麻豆| 国产成人精品一区二区在线看| 国语久精品在视频在线观看| 九九九热视频最新在线| 国产精品一区二区三区激情| 日韩免费成人福利在线| 亚洲熟妇av一区二区三区色堂| 精品人妻一区二区三区免费看| 99久久精品午夜一区二区| 日韩成人动作片在线观看 | 国产精品美女午夜视频| 国产精品丝袜美腿一区二区| 麻豆国产精品一区二区三区| 久热人妻中文字幕一区二区| 精品人妻一区二区三区四区久久| 亚洲精品黄色片中文字幕| 中文字幕高清不卡一区| 欧美国产日本免费不卡| 久久国产亚洲精品成人| 人妻巨大乳一二三区麻豆| 亚洲最大福利在线观看| 久久精品国产99国产免费| 国产农村妇女成人精品| 亚洲精品偷拍一区二区三区| 日本免费一级黄色录像| 中文字幕日韩无套内射| 成人午夜视频在线播放| 欧美日韩国产精品黄片| av中文字幕一区二区三区在线| 亚洲综合激情另类专区老铁性 | 国产成人精品在线一区二区三区| 精品欧美在线观看国产| 日本高清二区视频久二区|