獨(dú)家深度 | 那些年我做開源和自研走過的彎路和經(jīng)驗(yàn)

作者:阿里云數(shù)據(jù)庫OLAP產(chǎn)品部——韓述
工作十年,一直專注于技術(shù)研發(fā)。一路走來,既參與過從第一行代碼寫起的純自研的項(xiàng)目,也做過基于開源產(chǎn)品擴(kuò)展慢慢轉(zhuǎn)型成自研的項(xiàng)目,還負(fù)責(zé)過開源社區(qū)的管理和維護(hù)。
輾轉(zhuǎn)折騰的過程中,有幸以各種不同角色(小白用戶、開發(fā)者、維護(hù)者、管理員)參與過數(shù)個(gè)頂級(jí)開源項(xiàng)目Nginx、K8s、Postgres等的開發(fā)和維護(hù)。尤其是近幾年一直在做開源結(jié)合自研類型的基礎(chǔ)平臺(tái)類項(xiàng)目,走過一些彎路,踩過很多坑,也總結(jié)了一些經(jīng)驗(yàn),本文將重點(diǎn)分享開源結(jié)合自研項(xiàng)目的一些經(jīng)驗(yàn)。

優(yōu)秀而歷經(jīng)考驗(yàn)的Base Code,包括附屬的周邊生態(tài)
源源不斷更新的Feature,Bugfix以及它們背后的tester們
世界通行的人才圈子,良性的競爭和循環(huán)

定義問題:確定公司的業(yè)務(wù)目前已經(jīng)或者未來即將遇到的問題,只有明確了問題,才有解決的必要,也就有了目標(biāo),這是所有后續(xù)一切行動(dòng)的基礎(chǔ)。
開源選型:通過一系列方法,包括并不限于查閱資料、試用、閱讀源碼、找人打聽等等各種手段對(duì)比選擇一款最match之前定義的問題,并且符合公司和業(yè)務(wù)未來發(fā)展情況的Base產(chǎn)品。
源碼掌控:很多時(shí)候,上面兩條都由項(xiàng)目的Leader代勞了,開發(fā)同學(xué)遇到的最大挑戰(zhàn)往往是,開源代碼動(dòng)輒幾十萬幾百萬行,如何熟悉和上手掌握是一個(gè)很大的挑戰(zhàn)。借用一句傳說中的俗語,改不改得動(dòng)。
與一般通用的僅僅使用開源項(xiàng)目不同,更多需要考慮的是后續(xù)的二次開發(fā),以及持續(xù)的維護(hù)擴(kuò)展。我們不僅僅是選擇一個(gè)開源項(xiàng)目,更重要的是要選擇一個(gè)優(yōu)秀的框架,我們需要基于這個(gè)框架向前演進(jìn),所以源碼的質(zhì)量,架構(gòu)的先進(jìn)性就會(huì)很大程度上影響我們的傾向。 舉一個(gè)具體例子,對(duì)于Web服務(wù)器的選型,Nginx VS Apache。從流行度上看,Apache的使用規(guī)模和生態(tài)是遠(yuǎn)大于Nginx的,但是Nginx是基于Linux2.6以上內(nèi)核的異步多路復(fù)用架構(gòu)設(shè)計(jì)的,而Apache是多進(jìn)程模型。簡單來說,Nginx可以輕松應(yīng)對(duì)百萬連接,而Apache則顯得老邁了(訪問量一大就容易遇到瓶頸)。所以全世界TOP級(jí)別的公司幾乎清一色是Nginx系。 一定要先定義問題,再做選型。只有問題定義清楚了,才能去想對(duì)應(yīng)解決問題的方案,整個(gè)動(dòng)作才能不變形。我遇到過的重大失敗的項(xiàng)目,很多都是,先選定了一個(gè)開源產(chǎn)品,然后才來丈量業(yè)務(wù),對(duì)著已經(jīng)選定的產(chǎn)品挖掘問題。 這無異于碰運(yùn)氣,運(yùn)氣好,找到一些場景去解決了。運(yùn)氣不好,你選擇的開源產(chǎn)品或者技術(shù)路線根本不適合公司或者業(yè)務(wù)的情況,你就死掉了。就好比醫(yī)生看病,肯定是首先看癥狀確定你哪里有問題,然后選擇合適的藥去醫(yī)治,而不可能先預(yù)設(shè)好要用的藥,再來找有沒有對(duì)應(yīng)的病。



非必要的情況下盡量保持開源架構(gòu)的目錄和文件結(jié)構(gòu)
盡量避免重命名文件、函數(shù)、變量,而是以新增的方式代替
大規(guī)模的修改是可以的,但是盡量以增加的方式,比如增加文件、函數(shù)、邏輯,而不是把原來大段的文件、函數(shù)、邏輯刪除掉
大部分的開源都是設(shè)計(jì)了擴(kuò)展能力的,結(jié)合擴(kuò)展能力輔以內(nèi)核中增加少量代碼配合。而不是簡單暴力的大段重構(gòu)
對(duì)代碼的小修改盡量保留原有的邏輯,而不是刪掉重寫

放棄自研而采用高版本的開源對(duì)應(yīng)的實(shí)現(xiàn)。對(duì)于曾經(jīng)開源沒有的能力或者優(yōu)化點(diǎn),當(dāng)時(shí)是通過自研實(shí)現(xiàn)的,而可能過了1,2年,開源也有了,這種情況就可以做合并同列項(xiàng)。相應(yīng)的自研模塊可以完成歷史使命光榮退役,改用開源在高版本中的類似能力替代。
把自研的模塊和優(yōu)化回饋開源社區(qū)。有些自研團(tuán)隊(duì),會(huì)對(duì)自己研發(fā)的代碼嚴(yán)格保密,作為構(gòu)筑競爭力的保證,這樣做其實(shí)不是最佳的,適當(dāng)?shù)膶⒁呀?jīng)成熟的代碼回饋給開源社區(qū)既是有利于全世界的用戶們,也是對(duì)自己最好的解脫,實(shí)實(shí)在在是一個(gè)雙贏的局面。可以放下包袱投入下一階段的攻堅(jiān)。真正的壁壘,不是造一個(gè)火箭保密藏起來,而是始終有引領(lǐng)下一代潮流的能力,永遠(yuǎn)超越過去的自己更快、更好、更先進(jìn)。
砍掉一些價(jià)值不大,卻又嚴(yán)重破壞和開源一致性的模塊和優(yōu)化。在過熱期,很容易上很多KPI產(chǎn)物的項(xiàng)目,遺留很多低價(jià)值能力,實(shí)際效果微小,遠(yuǎn)不值得為之維護(hù)一份特殊的邏輯,一定要堅(jiān)定的砍掉,輕裝上陣。

業(yè)務(wù)規(guī)模:最典型的可能是就是K8s,別看開源的K8s如火如荼,事實(shí)上超過幾千的個(gè)節(jié)點(diǎn)的大集群,也沒怎么玩過,而今天的中國,已經(jīng)有很多企業(yè)需要管理數(shù)萬節(jié)點(diǎn),這就需要自研的時(shí)候,針對(duì)集群規(guī)模進(jìn)行大量優(yōu)化,甚至于重構(gòu),以支撐規(guī)模。
穩(wěn)定性:可能對(duì)于很多開源產(chǎn)品來說,99.99%的保證已經(jīng)不錯(cuò)了,但是如果恰好你的業(yè)務(wù),或者你所在的公司至少需要99.9999%,別小看只是多了2個(gè)數(shù)字而已,很可能從架構(gòu),到整體設(shè)計(jì),都需要一次飛躍,才能達(dá)到。雖然實(shí)現(xiàn)困難,可是一旦成功,反而將成為一項(xiàng)先進(jìn)的核心技術(shù)優(yōu)勢,輕易難以撼動(dòng)。
性能優(yōu)化:對(duì)于很多商業(yè)產(chǎn)品來說,性能有時(shí)候可能有著遠(yuǎn)遠(yuǎn)超越成本降低的意義。比如你打開一個(gè)網(wǎng)頁,是1秒加載完成還是2秒完成加載,其意義可能遠(yuǎn)超50%成本節(jié)約,因?yàn)榭赡苋种坏娜嗽?秒之后會(huì)選擇關(guān)閉網(wǎng)頁不等加載了。流失掉這些客戶的損失是無可估量和難以彌補(bǔ)的,那么優(yōu)化這些性能,哪怕每快那么一點(diǎn)點(diǎn),都將意義重大。這里面就很容易催生技術(shù)的革新。
我們經(jīng)常聽到一些成功的人在介紹自己的時(shí)候會(huì)很謙虛的說,自己只是站在巨人的肩膀上,才摘到了一些成果而已。

然而事實(shí)上,真相是:
有一半的人看了一眼巨人,覺得沒什么了不起,于是開始在巨人的旁邊重新挖地基、蓋房子,要與巨人爭高,結(jié)果只是又重復(fù)造了一個(gè)輪子。
剩下的人中,又有一半,沒有找對(duì)肩膀的方向,迷失在了向上爬的路上。此時(shí)只剩下不到四分之一的人了。
然而,在爬上巨人肩膀的人中又有一半直接就地躺倒,他們也沒錯(cuò),因?yàn)橐呀?jīng)是十之一二的佼佼者了,更何況每前進(jìn)一步風(fēng)險(xiǎn)就愈增加一分。
果然,在剩下的人中,又有一半在嘗試站起來的過程中,沒有站穩(wěn),反而摔了下去,功虧一簣。
那些成功在巨人肩膀上站穩(wěn)的人們,都看到了遠(yuǎn)處美麗的風(fēng)景,不過大部分都只是流連于此。
最后,只有那不到 1% 的人能夠不流連于前方的美景,他們倔犟而又堅(jiān)定的仰起頭,望向更高的地方,那里才是他們的心之所向,最終向上伸出了手。
確實(shí),只是簡簡單單的站在巨人的肩膀上,摘了一些果實(shí)而已,看上去很容易。


深度 | 阿里云李飛飛:中國數(shù)據(jù)庫的時(shí)與勢

專訪阿里云王偉民:一站式全鏈路,阿里云向云原生數(shù)據(jù)庫2.0躍遷
點(diǎn)擊“閱讀原文”
了解阿里云數(shù)據(jù)庫產(chǎn)品家族更多信息
