优秀架构师是如何学习开源项目的?
優(yōu)秀架構(gòu)師是如何學(xué)習(xí)開源項(xiàng)目的?
一、前言
大家好,我是架構(gòu)師楊波,大家都叫我波波老師。
波波可以說是一個(gè)不折不扣的開源愛好者,在一線企業(yè)工作時(shí),波波就花費(fèi)大量的時(shí)間和精力,研究和學(xué)習(xí)開源代碼。即便現(xiàn)在轉(zhuǎn)入技術(shù)培訓(xùn)行業(yè),波波仍然會(huì)花大量時(shí)間,研究github上的開源項(xiàng)目。另外,波波業(yè)余時(shí)間也開發(fā)一些開源小項(xiàng)目。可以這樣說,波波今天之所以能夠成長(zhǎng)為一個(gè)資深軟件架構(gòu)師,開源項(xiàng)目對(duì)我的幫助是非常大的。
近年,波波在極客時(shí)間上輸出一些技術(shù)課程,這些課程大部分都是基于開源項(xiàng)目開發(fā)的。輸出過程中,經(jīng)常有學(xué)員會(huì)問我該如何高效學(xué)習(xí)開源項(xiàng)目的問題。為了解答學(xué)員的疑問,基于自己這十幾年來學(xué)習(xí)開源項(xiàng)目的經(jīng)驗(yàn),我總結(jié)出了學(xué)習(xí)開源項(xiàng)目的一個(gè)方法論。這個(gè)方法論包括6個(gè)層次和8大方法,下面是這個(gè)方法論的一個(gè)總結(jié)表格:
上面的表格中的內(nèi)容很多,可能一下子看不明白,不用著急,波波后面會(huì)依次講解每一種方法。而且在每一種方法中,我都會(huì)給出項(xiàng)目案例,其中還包括行業(yè)優(yōu)秀的工程師/架構(gòu)師,學(xué)習(xí)開源項(xiàng)目的一些方法和思路。
二、方法
方法1 ~ 直接看源碼
我們先來看第一層的方法1,如下表所示:
方法1很好理解,就是直接看源碼,當(dāng)然也包括看文檔,還有跑跑樣例代碼。
如果項(xiàng)目代碼本身比較簡(jiǎn)單,完全可以直接看代碼。舉個(gè)例子,波波最近正在開發(fā)一門《分布式系統(tǒng)案例課》,期間需要深入研究一下一致性Hash算法。于是,我就在github上找了一個(gè)項(xiàng)目[鏈接見上圖]~一個(gè)用Java開發(fā)的一致性Hash算法的演示項(xiàng)目。這個(gè)項(xiàng)目比較簡(jiǎn)單,源代碼就沒有幾個(gè),當(dāng)然直接看代碼,再跑跑樣例就可以理解了。
方法1一般是沒有直接產(chǎn)出的。當(dāng)然,在工作或?qū)W習(xí)中,最好還是帶著實(shí)際問題去看代碼,理解了代碼再回頭來解決實(shí)際問題,相當(dāng)于有一個(gè)產(chǎn)出。這樣可以形成一個(gè)閉環(huán),提升學(xué)習(xí)效果。如果你沒有問題,直接純看代碼學(xué)習(xí),效果會(huì)差很多。
方法1處在第1層,最簡(jiǎn)單,學(xué)習(xí)效果一般,能學(xué)到的主要就是源代碼閱讀能力。為了和后面的方法做比較,我把方法1的學(xué)習(xí)效果假定為1~2,作為一個(gè)基準(zhǔn)學(xué)習(xí)效果。
方法2 ~ 整理源代碼
方法2叫整理源代碼,它更進(jìn)一步到第2層,如下表所示:
怎么理解呢方法2呢?其實(shí)它指的是將開源項(xiàng)目的源代碼統(tǒng)統(tǒng)整理一遍,包括將包名都改掉,并且編譯、測(cè)試和運(yùn)行通過。
方法2是波波研究開源項(xiàng)目代碼的習(xí)慣。舉個(gè)例子,前段時(shí)間我要學(xué)習(xí)一下Spring Boot項(xiàng)目開發(fā),于是我就在github上找到了一個(gè)叫spring-petclinic(寵物醫(yī)院)的項(xiàng)目[鏈接見上圖]。spring-petclinic是一個(gè)經(jīng)典的Spring框架演示項(xiàng)目,它正好有一個(gè)Spring Boot的版本。為了深入學(xué)習(xí)這個(gè)項(xiàng)目,我把它的整個(gè)源碼都整理了一遍,包括將包名全部改成com.spring2go,有些地方的代碼還做了調(diào)整和簡(jiǎn)化。然后,我把項(xiàng)目調(diào)試運(yùn)行通過。最后,我還把整理過的代碼放在了我的github/spring2go站點(diǎn)上[鏈接見上圖]。
如果你不對(duì)外輸出分享的話,方法2一般也是沒有直接產(chǎn)出的。通過方法2,你可以獲得細(xì)粒度的源碼閱讀和調(diào)試技能,因?yàn)槟惚仨氁恍行姓泶a,包括單元測(cè)試,并且還要調(diào)試運(yùn)行通過。這個(gè)做法比簡(jiǎn)單看代碼的粒度肯定更細(xì),學(xué)習(xí)效果也更好,可以算2~3的效果。當(dāng)然,方法2耗費(fèi)時(shí)間也更多。
方法3 ~ 整理+輸出分享
方法3叫整理+輸出分享,它更進(jìn)一步到第3層,如下表所示:
方法3是指在方法2整理過源代碼的基礎(chǔ)上,總結(jié)梳理出源碼分析或者架構(gòu)設(shè)計(jì)類的文檔或PPT或視頻,在公司或者社區(qū)分享。
方法3也是波波閱讀開源項(xiàng)目代碼的習(xí)慣,之前在企業(yè)是這樣,現(xiàn)在做課程輸出也是這樣。舉個(gè)例子,波波前段時(shí)間要重溫一下Spring Cloud微服務(wù)技術(shù)棧,于是我就在github上找到一個(gè)叫spring-petclinic-microservices的項(xiàng)目[鏈接見上圖],它是spring-petclinic項(xiàng)目的微服務(wù)版。為了深入學(xué)習(xí)這個(gè)項(xiàng)目,我先用方法2,把整個(gè)項(xiàng)目的源碼整理了一遍,并輸出在我的github/spring2go站點(diǎn)上[鏈接見上圖]。然后,我自己錄制了一個(gè)視頻課程,名稱《Spring Cloud微服務(wù)應(yīng)用》,并且把整個(gè)視頻分享在我的B站空間上[鏈接見上圖]。這個(gè)工作做完,我不僅加深了對(duì)Spring Cloud相關(guān)技術(shù)棧和框架的理解,同時(shí)還產(chǎn)出了兩樣?xùn)|西,一個(gè)項(xiàng)目源碼+一個(gè)視頻課程,這兩樣?xùn)|西最后變成了我的個(gè)人積累和沉淀。
再舉一個(gè)方法3的例子。我之前在拍拍貸擔(dān)任技術(shù)總監(jiān)的時(shí)候,期間招聘了一些應(yīng)屆畢業(yè)生。作為培訓(xùn)和個(gè)人學(xué)習(xí)習(xí)慣培養(yǎng)的一部分,我要求他們每月寫一篇源碼分析或者技術(shù)學(xué)習(xí)類文章,并且發(fā)表在團(tuán)隊(duì)的技術(shù)博客上[鏈接見上圖],并且這些文章輸出是計(jì)入績(jī)效考核的。我認(rèn)為,早期對(duì)工程師的定期輸出習(xí)慣的培養(yǎng)是非常重要的。
方法3一般是有產(chǎn)出的,它的學(xué)習(xí)效果比方法2還要好,可以達(dá)到3~5的學(xué)習(xí)效果。因?yàn)槟阌挟a(chǎn)出并且分享以后,就有機(jī)會(huì)獲得學(xué)習(xí)效果的反饋。這種反饋甚至是可以量化的,比方說github上項(xiàng)目的stars或者是issues,還有B站上視頻的點(diǎn)擊量、點(diǎn)贊數(shù)和評(píng)論等。這些反饋非常寶貴,可以幫助你優(yōu)化改進(jìn)你的學(xué)習(xí)。即便你只是在公司內(nèi)部分享,同事一般也會(huì)給你反饋。另外,方法3不僅可以提升你的技術(shù)技能,同時(shí)可以提升你的整理、輸出和分享技能,甚至還有內(nèi)容制作技能。比方說,通過B站視頻課程輸出,波波就初步掌握了視頻制作和編輯技能。這種內(nèi)容制作和輸出技能,在當(dāng)下社會(huì)同樣重要。
下面再講兩個(gè)來自YouTube,通過輸出分享提升個(gè)人技能的例子。這兩個(gè)例子和開源并不直接相關(guān),但是同樣值得參考借鑒。
第一個(gè)例子來自一個(gè)叫Dylan Israel的美國人,他在Youtube上的頻道就叫Dylan Israel,主要內(nèi)容是關(guān)于如何自學(xué)編程的。他本人不是科班出身,完全通過自學(xué)編程掌握技術(shù)。他主要通過美國的Code Cademy和FreeCodeCamp等站點(diǎn)學(xué)習(xí)技術(shù),每次學(xué)習(xí)一門課程或技術(shù),他就把自己學(xué)習(xí)的過程,以live coding(現(xiàn)場(chǎng)編程)的方式,制作成視頻,并分享在YouTube的個(gè)人頻道上。目前他在企業(yè)上班,年薪大致在美金6位數(shù),業(yè)余時(shí)間繼續(xù)搞他的Youtube頻道,既通過視頻輸出提升自己的技能,同時(shí)也分享編程技能。目前他的YouTube頻道有74.4k訂閱,也是不錯(cuò)的。
第二個(gè)例子來自一個(gè)叫Caleb Curry的美國人,他在Youtube上的頻道就叫Caleb Curry,主要內(nèi)容是關(guān)于編程語言學(xué)習(xí)的。Caleb學(xué)習(xí)編程語言的方式,就是每學(xué)習(xí)一種語言,就輸出一門該語言的視頻課程,并分享在YouTube上,也就是通過視頻輸出來提升學(xué)習(xí)效率。通過這種方式,經(jīng)過超過6年的持續(xù)輸出,他目前已經(jīng)掌握了幾乎所有主流的編程語言,包括Python/Java/C/C#/C++/JavaScript/SQL等。同時(shí),他在YouTube上的視頻內(nèi)容也變成了他的個(gè)人資產(chǎn)積累。目前,他的YouTube頻道有超過225k訂閱,在技術(shù)領(lǐng)域,這個(gè)訂閱量已經(jīng)比較牛逼了。
方法4 ~ 開發(fā)克隆版
下面是方法4,叫開發(fā)克隆版,它同樣在第3層,如下表所示:
方法4指的是開發(fā)原項(xiàng)目的克隆版,這個(gè)和書籍翻譯有點(diǎn)類似,比方說,原項(xiàng)目是用go語言開發(fā)的,我就克隆出一個(gè)Java語言版,并且分享到開源社區(qū)。
方法4也是波波使用過的方法,學(xué)習(xí)效果也很不錯(cuò),當(dāng)然耗費(fèi)時(shí)間也更多。比方說,波波去年在極客時(shí)間上輸出了一門課程《Spring Boot與Kubernetes云原生微服務(wù)實(shí)踐》,為了開發(fā)這門課程,我在github上找到了一個(gè)叫Staffjoy的項(xiàng)目[鏈接見上圖]。Staffjoy是一個(gè)工時(shí)排班(scheduling)應(yīng)用,原來是一家創(chuàng)業(yè)公司的SaaS產(chǎn)品,后來公司關(guān)閉就把項(xiàng)目給開源了。這個(gè)項(xiàng)目是用go語言開發(fā)的,采用微服務(wù)架構(gòu),總體質(zhì)量還不錯(cuò)(畢竟是創(chuàng)業(yè)公司面向企業(yè)的項(xiàng)目)。于是,我花了近2.5個(gè)月的時(shí)間,深入研究了這個(gè)項(xiàng)目的源碼,并且用Java/Spring技術(shù)對(duì)這個(gè)項(xiàng)目進(jìn)行了克隆(也適當(dāng)做了調(diào)整和簡(jiǎn)化),最后開源在我的github/spring2go站點(diǎn)上[鏈接見上圖]。通過這次克隆,波波不僅進(jìn)一步學(xué)習(xí)了Spring和微服務(wù)等技術(shù),同時(shí)還產(chǎn)出了一個(gè)課程產(chǎn)品,當(dāng)前在極客時(shí)間上已經(jīng)有超過6k的訂閱量。
方法4的例子還有很多。比方說,業(yè)界知名的開源消息隊(duì)列Kafka,就有不少克隆版。其中有一個(gè)叫jafka[鏈接見上圖],它是在6~7年前,由一個(gè)叫Andy Liu的搜狐架構(gòu)師開發(fā)的,波波6~7年前也學(xué)習(xí)過他的這個(gè)項(xiàng)目。因?yàn)镵afka是Scala寫的,Andy Liu的就把它克隆成Java版,所以取名就叫jafka。Kafka本身還是比較復(fù)雜的,深入理解它的源碼并不容易,但是Andy Liu通過克隆的方式去學(xué)習(xí)kafka,同時(shí)還產(chǎn)出了一個(gè)jafka,可以認(rèn)為他已經(jīng)完全深入理解和吸收了Kafka的源碼和設(shè)計(jì)。
還有一個(gè)項(xiàng)目叫jocko[鏈接參考上圖],它是Kafka的golang語言克隆版(不是簡(jiǎn)單克隆,還做了簡(jiǎn)化和優(yōu)化),是由一個(gè)叫Travis Jeffery的老外開發(fā)的。jocko這個(gè)項(xiàng)目比較成功,目前在github上有3.9k星,在業(yè)界有不少公司在用。也就是說,通過jocko克隆項(xiàng)目,Travis Jeffery不僅深入理解了Kafka的源碼和設(shè)計(jì),還給社區(qū)貢獻(xiàn)了價(jià)值。
另外,波波早年也曾嘗試開發(fā)過Kafak的簡(jiǎn)化版,起名叫Luxun[鏈接參考上圖]。雖然這個(gè)項(xiàng)目沒有持續(xù)下去,但是經(jīng)過這次克隆,波波也已經(jīng)深入理解了Kafka的源碼和設(shè)計(jì)(早期0.7版本)。
方法4一定有克隆版產(chǎn)出,放在github上可以獲得社區(qū)反饋。通過對(duì)知名的、高質(zhì)量的開源項(xiàng)目進(jìn)行模仿克隆,不僅可以提升源碼閱讀的能力,同時(shí)可以快速提升技術(shù)和項(xiàng)目開發(fā)技能。總體上,方法4的學(xué)習(xí)效果可以達(dá)到5~10的水平。如果大家平時(shí)在公司沒有機(jī)會(huì)接觸到高質(zhì)量/高價(jià)值的項(xiàng)目,那么方法4,是波波推薦大家學(xué)習(xí)的一種方法。當(dāng)然,具體去克隆項(xiàng)目的時(shí)候,你要量力而行,選擇適合自己當(dāng)前技能水平的開源項(xiàng)目,因?yàn)榇蟛糠殖晒Φ拈_源項(xiàng)目都非常復(fù)雜。
方法5 ~生產(chǎn)化落地
方法5叫生產(chǎn)化落地,它更進(jìn)一步,達(dá)到第4層,如下表所示:
方法5指的是在整理開源項(xiàng)目代碼和輸出分享的基礎(chǔ)上,再在企業(yè)生產(chǎn)級(jí)項(xiàng)目中進(jìn)行落地,項(xiàng)目要承擔(dān)實(shí)際業(yè)務(wù)流量。后續(xù)根據(jù)業(yè)務(wù)需要,對(duì)項(xiàng)目進(jìn)行進(jìn)一步定制優(yōu)化。甚至還可以再進(jìn)一步,在完全吸收開源項(xiàng)目的基礎(chǔ)上,進(jìn)行創(chuàng)新自研。
方法5的學(xué)習(xí)效果是非常好的,通過這個(gè)方法學(xué)到的東西,是在企業(yè)里頭真刀真槍落地過的。一般通過企業(yè)級(jí)實(shí)戰(zhàn)項(xiàng)目獲得的經(jīng)驗(yàn),都會(huì)令你終生難忘。波波之前在企業(yè)工作的過程中,多次采用方法5,落地過很多重要項(xiàng)目。
其中一個(gè)是攜程的Zuul網(wǎng)關(guān)項(xiàng)目。記得在2013年左右的時(shí)候,攜程就啟動(dòng)了無線優(yōu)先(Mobile First)戰(zhàn)略,在業(yè)務(wù)上獲得了巨大成功。但是剛開始,攜程的無線API是一個(gè)耦合的單體服務(wù),前面是沒有網(wǎng)關(guān),直接對(duì)外暴露服務(wù)的。為了支持無線API的解耦拆分,我當(dāng)時(shí)主導(dǎo)了攜程無線API網(wǎng)關(guān)的研發(fā)工作。那段時(shí)間,我曾經(jīng)一度是Netflix開源文化的重度粉絲,花了大量時(shí)間研究Netflix的開源項(xiàng)目,其中包括Zuul網(wǎng)關(guān)。經(jīng)過調(diào)研,我發(fā)現(xiàn)Zuul網(wǎng)關(guān)可以引入攜程,解決無線API解耦拆分的問題。于是,我花了大致半個(gè)月的時(shí)間,把Netflix Zuul網(wǎng)關(guān)源碼都整理了一遍(Zuul網(wǎng)關(guān)的源碼其實(shí)并不復(fù)雜,整理過的源碼可以參考上圖的鏈接),單元測(cè)試全部跑通,然后在技術(shù)部門做了關(guān)于Zuul網(wǎng)關(guān)的技術(shù)分享。之后,我們團(tuán)隊(duì)就立項(xiàng),正式啟動(dòng)將Zuul網(wǎng)關(guān)引入攜程,并且最終在生產(chǎn)上成功落地下來。后續(xù)實(shí)踐證明,Zuul網(wǎng)關(guān)為攜程無線API的解耦拆分,還有攜程后臺(tái)的微服務(wù)化,都立下了汗馬功勞。當(dāng)然,在生產(chǎn)落地的過程中,根據(jù)攜程的具體業(yè)務(wù)需要,我們對(duì)Zuul網(wǎng)關(guān)的源碼(包括過濾器),都進(jìn)行了深度定制。記得當(dāng)時(shí)我們還專門開發(fā)了一個(gè)TCP版的Zuul網(wǎng)關(guān),因?yàn)閿y程老的無線App是基于TCP協(xié)議定制的。經(jīng)過這次大項(xiàng)目,我不僅深入理解了Zuul網(wǎng)關(guān)的設(shè)計(jì)和代碼,同時(shí)提升了生產(chǎn)級(jí)項(xiàng)目的落地能力。當(dāng)然,我還給攜程貢獻(xiàn)了一個(gè)非常有價(jià)值的產(chǎn)品,這個(gè)產(chǎn)品目前還是攜程的核心基礎(chǔ)服務(wù),承載超過每日百億級(jí)的API流量。
關(guān)于攜程Zuul網(wǎng)關(guān)的項(xiàng)目經(jīng)驗(yàn),我后來總結(jié)在了《微服務(wù)架構(gòu)實(shí)踐160講》這門課程當(dāng)中。目前,這門課在極客時(shí)間上的訂閱量已經(jīng)過萬。
類似的例子還有很多。比方說,當(dāng)時(shí)為了解決攜程微服務(wù)不穩(wěn)定的問題,我還主導(dǎo)引入了Netflix的Hystrix開源限流熔斷組件。由于當(dāng)時(shí)攜程的大部分微服務(wù)還是基于微軟.Net技術(shù)棧的,但原版的Hystrix是基于Java的,為了能夠落地,我還是先把Hystrix的源碼整理+輸出/分享后,再帶領(lǐng)團(tuán)隊(duì)研發(fā)了基于.Net版本的CHystrix產(chǎn)品[鏈接參考上圖],也獲得較大成功。
另外在拍拍貸的時(shí)候,在吸收了Kafka等主流消息隊(duì)列設(shè)計(jì)思想的基礎(chǔ)上,我?guī)ьI(lǐng)團(tuán)隊(duì)研發(fā)了輕量級(jí)的PMQ消息系統(tǒng),為拍拍貸系統(tǒng)的解耦拆分和微服務(wù)化,打下了堅(jiān)實(shí)基礎(chǔ)。PMQ是一個(gè)在吸收開源項(xiàng)目設(shè)計(jì)思路的基礎(chǔ)上,完全創(chuàng)新自研的產(chǎn)品。關(guān)于PMQ這個(gè)產(chǎn)品的設(shè)計(jì)和實(shí)踐經(jīng)驗(yàn),我已經(jīng)輸出在《分布式系統(tǒng)案例》這門新課中。該課程剛剛在極客時(shí)間平臺(tái)上發(fā)布,上線不到一周,已經(jīng)有超過2千訂閱。
另外還有一個(gè)案例值得一提。我在攜程時(shí)有一個(gè)同事叫黃杰,他是專注監(jiān)控領(lǐng)域的。在攜程的時(shí)候,他曾參與研發(fā)了攜程第一代的日志/調(diào)用鏈/Metrics監(jiān)控系統(tǒng)。后來他去了餓么嗎,在餓了么又落地了一整套應(yīng)用監(jiān)控系統(tǒng),具體項(xiàng)目的細(xì)節(jié)可以參考他在QCon上的ppt分享[鏈接見上圖]。他的路子也是不斷吸收并生產(chǎn)化開源項(xiàng)目,他專門研究監(jiān)控領(lǐng)域的項(xiàng)目,包括像CAT/OpenTSDB/InfluxDB還有Promethues等。他把這些主流開源項(xiàng)目的源碼都逐個(gè)研究透,然后找機(jī)會(huì)生產(chǎn)化,再不斷定制打磨。去年他還開源了自己的監(jiān)控產(chǎn)品,叫LinDB。到現(xiàn)在,黃杰已經(jīng)在監(jiān)控領(lǐng)域打磨積累了近6年,可以毫不夸張的說,他已經(jīng)是國內(nèi)應(yīng)用監(jiān)控領(lǐng)域的頂級(jí)技術(shù)專家了。
生產(chǎn)化落地的學(xué)習(xí)效果是毋庸置疑的,如果有機(jī)會(huì)承擔(dān)公司級(jí)的核心項(xiàng)目,那么對(duì)你的能力鍛煉是全方位的,包括項(xiàng)目實(shí)戰(zhàn)落地能力,企業(yè)級(jí)源碼閱讀和定制能力等等。而且生產(chǎn)化落地一定有價(jià)值輸出,也一定會(huì)有用戶反饋(內(nèi)部或者外部的),有反饋就有持續(xù)改進(jìn)的機(jī)會(huì)。總之,生產(chǎn)化落地的學(xué)習(xí)效果可以>10,當(dāng)然,具體大小要看項(xiàng)目在企業(yè)中的關(guān)鍵程度。
方法6 ~ 開發(fā)知識(shí)產(chǎn)品
方法6叫開發(fā)知識(shí)產(chǎn)品,它同樣在第四層,見下表:
方法6指的是,在將開源項(xiàng)目代碼基本吸收的基礎(chǔ)上,開發(fā)出應(yīng)用演示項(xiàng)目(或者克隆項(xiàng)目),并制作成知識(shí)付費(fèi)產(chǎn)品(包括書籍或視頻等),發(fā)布到知識(shí)付費(fèi)平臺(tái)。
方法6是波波近年在探索的一種方法。比方說,對(duì)于前面方法4中提到的Staffjoy項(xiàng)目,在克隆和開源輸出的基礎(chǔ)上,我又設(shè)計(jì)和制作了一門叫《Spring Boot 與 Kubernetes 云原生微服務(wù)實(shí)踐》的課程,講解如何基于Spring Boot和Kubernetes等技術(shù),開發(fā)一個(gè)小規(guī)模的微服務(wù)應(yīng)用。這門課程已經(jīng)在極客時(shí)間平臺(tái)上輸出。這個(gè)工作做完,波波不僅在github上分享和沉淀了一個(gè)項(xiàng)目(目前有超過1k星),而且還輸出和沉淀了一個(gè)知識(shí)付費(fèi)產(chǎn)品(目前有超過6k的訂購)。同時(shí),在輸出的過程中,波波還初步掌握了知識(shí)付費(fèi)產(chǎn)品的設(shè)計(jì)和開發(fā)技能,另外還初步接觸了市場(chǎng)研究、客服,還有營(yíng)銷推廣等技術(shù)之外的新領(lǐng)域。
方法6還有一個(gè)比較有意思的案例,是一個(gè)叫新峰商城的開源項(xiàng)目[鏈接見上圖],它是一個(gè)叫13的高級(jí)工程師開發(fā)的。這是一個(gè)用SpringBoot開發(fā)的網(wǎng)上商城演示項(xiàng)目。作者不僅輸出了一個(gè)可供學(xué)習(xí)的開源項(xiàng)目,同時(shí)還輸出了兩個(gè)知識(shí)產(chǎn)品,一個(gè)是基于這個(gè)項(xiàng)目寫了一本付費(fèi)教程,發(fā)布在掘金小冊(cè)平臺(tái)上,目前已有9百多人購買;另外一個(gè)是他還基于這個(gè)項(xiàng)目開發(fā)了一個(gè)付費(fèi)視頻教程,發(fā)布在CSDN學(xué)院上,目前已經(jīng)有超過萬人學(xué)習(xí)(注意這個(gè)不是實(shí)際購買量)。從這些項(xiàng)目和內(nèi)容輸出可以看出,13不僅是一個(gè)具有技術(shù)研發(fā)能力,還是一個(gè)有產(chǎn)品和商業(yè)化頭腦的工程師。
方法6有知識(shí)產(chǎn)品輸出,可以獲得商業(yè)用戶的反饋,根據(jù)反饋可以持續(xù)改進(jìn)學(xué)習(xí)。在知識(shí)產(chǎn)品輸出的過程中,作者不僅要主導(dǎo)產(chǎn)品的設(shè)計(jì)和開發(fā),還要參與市場(chǎng)調(diào)研、客服和推廣等活動(dòng),幾乎可以看作是一種小規(guī)模的創(chuàng)業(yè)活動(dòng)。這個(gè)過程對(duì)作者的能力鍛煉也是全方位的,除了技術(shù)和項(xiàng)目開發(fā)能力,還包括知識(shí)產(chǎn)品的設(shè)計(jì)和開發(fā)能力,還有市場(chǎng)調(diào)研、客服和營(yíng)銷推廣等技能。當(dāng)然,還可以獲得一定的行業(yè)影響力。總體上,方法6的學(xué)習(xí)效果也是>10的。
方法7 ~ 開發(fā)自己的開源項(xiàng)目
方法7叫開發(fā)自己的開源項(xiàng)目,它屬于高級(jí)方法,達(dá)到第5層,如下表所示:
方法7指的是,在吸收開源項(xiàng)目+企業(yè)實(shí)踐落地的基礎(chǔ)上,沉淀出自己的開源項(xiàng)目,并持續(xù)推動(dòng)開源社區(qū)建設(shè)。
方法7的案例在歐美國家很普遍,在國內(nèi)還不是很多,但是已經(jīng)有一些冒芽案例。這些案例中的項(xiàng)目,主要由國內(nèi)一些優(yōu)秀的工程師/架構(gòu)師推動(dòng)。
第一個(gè)案例是宋順開發(fā)的Apollo微服務(wù)配置中心項(xiàng)目[鏈接見上圖],這個(gè)項(xiàng)目目前在github上已經(jīng)有超過2萬多顆星,是一個(gè)非常成功的基礎(chǔ)中間件類項(xiàng)目。我的《微服務(wù)架構(gòu)實(shí)踐160講》課程中,也專門有一章是講Apollo的。Apollo是經(jīng)過攜程大規(guī)模生產(chǎn)實(shí)踐落地出來的,宋順是這個(gè)項(xiàng)目的主要開發(fā)者,也是這個(gè)項(xiàng)目的開源社區(qū)的主要維護(hù)者。因?yàn)锳pollo項(xiàng)目,宋順不僅全面提升了項(xiàng)目開發(fā)技能,同時(shí)也提升了行業(yè)影響力,目前他已經(jīng)從攜程跳到螞蟻金服去工作。
第二個(gè)案例是吳晟開發(fā)的Skywalking應(yīng)用性能監(jiān)控項(xiàng)目[鏈接見上圖],目前這個(gè)項(xiàng)目在github上有超過13.8k星,也是非常成功的。吳晟玩技術(shù)的路子有點(diǎn)花,他之前是OneAPM的工程師,在吸收了OneAPM產(chǎn)品的一些設(shè)計(jì)思路的基礎(chǔ)上,他在業(yè)余時(shí)間開發(fā)和開源了Skywalking APM。之后,吳晟跳槽去了華為,期間他還把Skywalking推到了Apache,成了Apache基金會(huì)的一個(gè)項(xiàng)目。近幾年,吳晟又玩到國外去了,加入了一家叫Tetrate的云原生技術(shù)公司,繼續(xù)推進(jìn)他的Skywalking項(xiàng)目。吳晟年齡并不大,背景也不是特別突出(有興趣可以看他在github上的個(gè)人簡(jiǎn)歷,鏈接見上圖),不過他對(duì)開源技術(shù)充滿激情,也比較會(huì)玩技術(shù)。
第三個(gè)案例是LinDB[鏈接見上圖],就是方法5中提到的黃杰的開源產(chǎn)品。LinDB是一個(gè)類似InfluxDB的時(shí)間序列監(jiān)控產(chǎn)品,但是支持分布式的,目前LinDB在github上有近1.5k星。黃杰目前已經(jīng)從餓了么跳去字節(jié)跳動(dòng)工作,仍然專注于他熱衷的應(yīng)用監(jiān)控領(lǐng)域。
上面這幾個(gè)工程師/架構(gòu)師都是國內(nèi)開源領(lǐng)域的佼佼者,他們都是在吸收開源項(xiàng)目+企業(yè)實(shí)踐落地的基礎(chǔ)上,沉淀出自己的開源項(xiàng)目,并不斷推進(jìn)開源社區(qū)的建設(shè)。這幾個(gè)人在國內(nèi)互聯(lián)網(wǎng)行業(yè)已經(jīng)產(chǎn)生了不小的影響力(影響力指數(shù)基本上可以用github上星的數(shù)量來衡量),他們找工作一般也不需要投簡(jiǎn)歷,因?yàn)間ithub上的項(xiàng)目就是他們最好的簡(jiǎn)歷,除了大量的獵頭,很多大廠的HR甚至?xí)鲃?dòng)去"勾搭"他們。
如果你對(duì)開源技術(shù)充滿熱情,技術(shù)功底也不錯(cuò),但是覺得目前企業(yè)中的項(xiàng)目挑戰(zhàn)性還不夠,那么方法7是波波推薦你嘗試的方法。當(dāng)然,方法7對(duì)你的技術(shù)和開發(fā)能力的要求非常高,時(shí)間精力的投入也非常大,所以也要量力而行。
方法7有產(chǎn)品價(jià)值輸出,有社區(qū)反饋,根據(jù)反饋可以持續(xù)改進(jìn)。它不僅可以提升你的技術(shù)和項(xiàng)目開發(fā)技能,也可以鍛煉你的開源和社區(qū)運(yùn)營(yíng)技能。另外,成功的開源項(xiàng)目可以給社區(qū)貢獻(xiàn)價(jià)值,同時(shí)大大提升你的行業(yè)影響力。總體上,方法7的學(xué)習(xí)效果也是>10的。
方法8 ~ 商業(yè)化自己的開源項(xiàng)目
方法8叫商業(yè)化自己的開源項(xiàng)目,它處在頂層第六層,見下表所示:
方法8指的是,在自己的開源產(chǎn)品的基礎(chǔ)上,持續(xù)推進(jìn)社區(qū)生態(tài)建設(shè),并逐步走上商業(yè)化服務(wù)的道路,甚至開創(chuàng)一個(gè)公司。
方法8對(duì)大部分開發(fā)者來說是遙不可及的,國內(nèi)外能走到這一步的頂級(jí)工程師/架構(gòu)師也寥寥可數(shù)。考慮到方法8非常難,我這里只是簡(jiǎn)單舉幾個(gè)經(jīng)典案例,這些案例的創(chuàng)始人都是從開源項(xiàng)目開始,然后不斷打磨優(yōu)化產(chǎn)品,持續(xù)投入社區(qū)生態(tài)建設(shè),并最終走上商業(yè)化的道路。
第一個(gè)案例是TiDB,一個(gè)開源的分布式NewSQL數(shù)據(jù)庫,作者是國內(nèi)的黃東旭,他也是著名開源項(xiàng)目codis的主要作者。目前,TiDB已經(jīng)走上企業(yè)服務(wù)道路,背后公司是PingCAP,黃東旭是CEO。2018.9月PingCAT獲得C輪5千萬美金的融資。
第二個(gè)案例是業(yè)界知名的Kafka開源消息隊(duì)列,主要作者是三個(gè)人,一個(gè)美國人Jay Kreps+一個(gè)中國人Jun Rao+一個(gè)印度人Neha Narkhede,是一個(gè)很有意思的三人組合。Kafka大致是在2011年初,從Linkedin落地后開源出來。2014年底,三個(gè)作者從Linkedin出來,成立了一個(gè)叫Confluent的公司,專注kafka的社區(qū)推廣和商業(yè)化。2019.1月,Confluent獲得D輪1.25億美金融資,公司估值25億美金左右。
第三個(gè)案例是Sentry異常日志監(jiān)控開源項(xiàng)目,和這個(gè)項(xiàng)目對(duì)應(yīng)的公司就叫Sentry,兩個(gè)創(chuàng)始人分別是David Cramer和Chris Jennings。原來兩人都是美國Disqus公司的軟件工程師,他們從一個(gè)異常日志監(jiān)控小工具做起,不斷打磨積累,后來做成SaaS服務(wù)公司,走上商業(yè)化道路。經(jīng)過近10年的積累,目前Sentry公司有近100人團(tuán)隊(duì)規(guī)模。2019.9月,Sentry獲得C輪4千萬美金融資。
方法8有開源和商業(yè)化的產(chǎn)品輸出,同時(shí)完全和企業(yè)級(jí)客戶閉環(huán),可以說是開源學(xué)習(xí)的終極方法。通過方法8,創(chuàng)始人可以同時(shí)獲得產(chǎn)品化和商業(yè)化技能,社區(qū)生態(tài)建設(shè)技能,還有技術(shù)領(lǐng)導(dǎo)力等全方位的技能,可以說,方法8的總體學(xué)習(xí)效果超過100。
三、要點(diǎn)心得
好,上面我把學(xué)習(xí)開源的8種方法(包括6個(gè)層次),給大家全都介紹完了,下面我來做一個(gè)要點(diǎn)心得總結(jié)。盡管上面的內(nèi)容很多,但是這些要點(diǎn)才是需要大家take away(記住帶走)的,見下圖:
首先第一點(diǎn)是輸入要有輸出,學(xué)習(xí)要有產(chǎn)出。不管你學(xué)哪種技術(shù),或者學(xué)哪個(gè)開源項(xiàng)目,最終都要有個(gè)產(chǎn)出。這個(gè)產(chǎn)出可以是一個(gè)ppt+一次技術(shù)分享、也可以是一篇文章或一個(gè)視頻教程,當(dāng)然也可以是一個(gè)落地的企業(yè)項(xiàng)目,等等。沒有產(chǎn)出的學(xué)習(xí),一般效果都比較差。
其次是閉環(huán)反饋+持續(xù)改進(jìn)。精益創(chuàng)業(yè)(Lean Startup)提出了一個(gè)方法論,叫構(gòu)建(Build)->測(cè)量(Measure)->學(xué)習(xí)(Learn)環(huán),見上圖所示,這個(gè)環(huán)主要是用于指導(dǎo)快速產(chǎn)品開發(fā)和創(chuàng)業(yè)的。如果把這個(gè)環(huán)順時(shí)針旋轉(zhuǎn)約45度,就變成了學(xué)習(xí)(Learn)->構(gòu)建(Build)->測(cè)量(Measure)環(huán)。也就是說,你要學(xué)點(diǎn)什么東西,一定要構(gòu)造產(chǎn)出點(diǎn)什么東西,然后要找用戶用你的這個(gè)東西,之后你就可以根據(jù)用戶的反饋改進(jìn)你的學(xué)習(xí),從而形成一個(gè)正向的、可以持續(xù)改進(jìn)的循環(huán)。一般用戶越多,反饋就越多,學(xué)習(xí)效果也就越好。最好你能夠量化你的學(xué)習(xí)效果,比方說github上星的數(shù)量,或者B站上視頻的點(diǎn)擊/獲贊量等。
第三、有個(gè)哲學(xué)家曾經(jīng)說過:“如果你要真正理解某人或者某事,那么就嘗試去改變他/他/它”。學(xué)習(xí)開源項(xiàng)目也是一樣的,如果你不曾親自動(dòng)手去修改過開源項(xiàng)目的代碼(包括定制擴(kuò)展或者克隆等),那么你不可能真正深入理解一個(gè)開源項(xiàng)目。
第四,大家都是學(xué)習(xí)愛好者,平時(shí)都會(huì)花大量時(shí)間進(jìn)行學(xué)習(xí)。既然投入了時(shí)間,那么一定要讓你的投入產(chǎn)生比最大化,說白了是要一舉要多得。波波就是這樣的,一旦下定決心投入時(shí)間精力去學(xué)習(xí)某個(gè)東西,那么一定要有價(jià)值產(chǎn)出,這個(gè)產(chǎn)出一定要變成自己的個(gè)人沉淀積累,并且這個(gè)產(chǎn)出最好要能貢獻(xiàn)社區(qū)(對(duì)社區(qū)有價(jià)值),然后能提升自己的影響力,最后能真正的學(xué)到東西。當(dāng)你養(yǎng)成以投入產(chǎn)出比的視角去看待學(xué)習(xí)以后,你就會(huì)對(duì)你的學(xué)習(xí)投入慎之又慎,不會(huì)輕易投入價(jià)值小的學(xué)習(xí)方式。
最后要強(qiáng)調(diào)一點(diǎn),不管是學(xué)技術(shù),學(xué)英語,做開源,還是做視頻課程,都遵循所謂的復(fù)利曲線,如上圖所示。在復(fù)利曲線的底部,成本線以下的那條成長(zhǎng)線很平很長(zhǎng),只有到達(dá)拐點(diǎn),成長(zhǎng)線才會(huì)呈指數(shù)級(jí)上升。比方說,波波投入技術(shù)領(lǐng)域已經(jīng)超過15年,只是在最近幾年,才隱約感覺快到拐點(diǎn)附近了。另外波波發(fā)現(xiàn),在YouTube上做視頻輸出的比較成功的大V,平均積累周期是5~6年,才會(huì)出現(xiàn)拐點(diǎn),訂閱量呈現(xiàn)快速增長(zhǎng)。對(duì)于方法8提到的從開源到商業(yè)公司的案例,底部的成長(zhǎng)線更長(zhǎng),一般周期需要超過10,才可能盈利甚至上市。
所以,如果你想今年學(xué)個(gè)什么技術(shù),明年就想成為技術(shù)大牛的,那么波波勸你不要學(xué)技術(shù),去炒股炒房子或者買彩票,同樣的時(shí)間周期,可能成功概率會(huì)更大:)
四、我的新課程
最后,如果你對(duì)分布式系統(tǒng)設(shè)計(jì)感興趣,那么我向你隆重推薦波波的新課《分布式系統(tǒng)案例課》,這門課程已經(jīng)在極客時(shí)間上推出。
通過這門課的學(xué)習(xí),你將獲得4點(diǎn)收獲:
本文內(nèi)容《優(yōu)秀架構(gòu)師是如何學(xué)習(xí)開源項(xiàng)目的?》,也是新課程最后一章[架構(gòu)師成長(zhǎng)之道]的一部分。
下面是新課程的宣傳海報(bào)和詳細(xì)大綱,歡迎關(guān)注!
總結(jié)
以上是生活随笔為你收集整理的优秀架构师是如何学习开源项目的?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 对于女生来说,软件测试和前端,学哪一个更
- 下一篇: 哪类人适合学软件测试?零基础能学测试吗?