如果說有什么事物能夠使男程序員心中的父愛完全覺醒,那我想一定是投身于自己創(chuàng)建的開源項(xiàng)目中去了。在和熊譜翔、黃東旭等儲(chǔ)多開源大神的接觸中,我可以明顯感到他們對(duì)于自身開源項(xiàng)目的那份執(zhí)著與熱愛。雖然說貝佐斯、蓋茨等IT巨頭創(chuàng)始人都能在公司走上正軌后卸任CEO,完成華麗轉(zhuǎn)身,但是為了維護(hù)自己的開源項(xiàng)目,程序員們往往都是從一而終,從不始亂終棄。
不過這也帶來了一個(gè)衍生的問題,那就是開源項(xiàng)目尤其是由初創(chuàng)團(tuán)隊(duì)建立的開源項(xiàng)目到底如何賺錢,怎么保持持續(xù)活力?我們看到之前Linux的創(chuàng)始人林納斯就吐槽說現(xiàn)在的社區(qū)幾乎靠他們這一代年過50的老年程序員維系,年輕人似乎不喜歡內(nèi)核編程,甚至還有不少大學(xué)及企業(yè)只熱衷于在內(nèi)核中“注水”去刷KPI,真不知道再過20年Linux會(huì)路向何方,可見即使是頂級(jí)的開源項(xiàng)目也有著自己的隱憂,更遑論其它小眾的開源項(xiàng)目了。

還有一個(gè)現(xiàn)象也特別值得我們注意,那就是很多開源項(xiàng)目承擔(dān)了巨大的責(zé)任,不過其營收卻非常慘淡。熟悉信息安全方面的讀者肯定知道,很多安全檢測(cè)所找到的漏洞都來自于開源項(xiàng)目 OpenSSL,這個(gè)實(shí)現(xiàn)SSL安全加密的C代碼庫,承載了全球17%的加密流量,不過令人震驚的是這個(gè)項(xiàng)目每年卻僅能收到2000美元的捐款。
將心比心像筆者這樣經(jīng)常寫文章的程序員也會(huì)極力維護(hù)自己的文字,雖然也有夢(mèng)想建立一個(gè)開源項(xiàng)目,但是開源到底意味著什么我卻根本沒有能力思考清楚,不過最近我在無意聽到一個(gè)名為CoRecursive的播客,并在其中聽到了Richard Hipp親身介紹SQLite成長過程中,初創(chuàng)人員口述的心路歷程頗令人觸動(dòng),Richard在訪談中所做的表述非常真實(shí)坦率,接下來就對(duì)原文(https://corecursive.com/066-sqlite-with-richard-hipp/)進(jìn)行了簡譯,與大家共享SQLite不為人知的故事。
無處不在的Sqlite
SQLite目前正在成為世界的核心基礎(chǔ)設(shè)施,變得無處不在。SQLite存在于網(wǎng)絡(luò)瀏覽器中,存在于手機(jī)中,存在于汽車中,甚至存在于飛機(jī)中。Sqlite幾乎壟斷了社交軟件,不管是iMessages還是微信、WhatsApp,消息存儲(chǔ)引擎都是SQLite,哪怕只是在計(jì)算機(jī)上簡單的查找*.db文件,你也會(huì)驚訝于為什么電腦中會(huì)存在這么多的Sqlite 數(shù)據(jù)庫,它是世界上裝機(jī)最多的數(shù)據(jù)庫,沒有之一。從Richard 的分享中我們看到,SQLite的誕生最早源于他對(duì)Informix的失望。
目前的信息系統(tǒng)像是一艘大且復(fù)雜的巨輪,假如行駛過程中出現(xiàn)管道破裂,那么船員通過關(guān)閉管道一側(cè)的閥門來隔離損壞,隨后還需要打開其他地方的閥門以將工作流體恢復(fù)到下游的其他系統(tǒng)中,這樣操作的話它們就不會(huì)造成重大損失。但想找到這些閥門卻越來越復(fù)雜,拆了東墻補(bǔ)西墻的情況筆筆皆是。像Informix這樣的傳統(tǒng)數(shù)據(jù)庫和這樣一艘巨輪的情況非常相似,雖然程序員按照操作手冊(cè)去維護(hù)系統(tǒng)可以解決問題,但是手冊(cè)卻越來越厚,查閱手冊(cè)所需要的時(shí)間更是越來越長。
P or NP這是個(gè)問題
一般咱們程序員在設(shè)計(jì)系統(tǒng)時(shí),往往都會(huì)在性能可以接受的情況下,先尋求快速的近似解,而不會(huì)考慮做極致的優(yōu)化,雖然程序員們?cè)噲D編寫代碼來解決問題,但卻很少真正深入的分析問題。
在創(chuàng)立SQLite之前,Richard正在領(lǐng)導(dǎo)一個(gè)致力于極致技術(shù)優(yōu)化的團(tuán)隊(duì),但他們使用的數(shù)據(jù)庫產(chǎn)品Informix卻沒有獲得團(tuán)隊(duì)的一致認(rèn)可。一旦數(shù)據(jù)庫宕機(jī),應(yīng)用程序就無法運(yùn)行,由于一般的應(yīng)用開發(fā)者對(duì)數(shù)據(jù)庫服務(wù)器沒有太多控制權(quán),但卻對(duì)應(yīng)用的可用性承擔(dān)絕對(duì)責(zé)任,因此經(jīng)常有程序員因?yàn)閿?shù)據(jù)的問題而背鍋。
Richard的團(tuán)隊(duì)開始用原認(rèn)知來分析這樣的問題,他們一連問了三個(gè)問題,為什么我們需要專門的服務(wù)器?為什么不直接從磁盤中讀取數(shù)據(jù)?為什么不能盡量減輕數(shù)據(jù)庫服務(wù)的依賴項(xiàng)?環(huán)顧四周,Richard發(fā)現(xiàn)幾乎每個(gè)數(shù)據(jù)庫產(chǎn)品都附帶了一個(gè)龐大的產(chǎn)品線,一個(gè)個(gè)近似解堆砌的結(jié)果就是變得異常的低效臃腫。這也讓Richard萌生了自己寫一個(gè)輕量級(jí)數(shù)據(jù)庫的想法。
初版本的誕生
2000 年的時(shí)候,網(wǎng)民們大多還只能選擇用電話撥號(hào)的方式上網(wǎng),即使在美國家庭擁有寬帶普及率也就只有1%。Richard在創(chuàng)立SQLite之初并沒有谷歌等神器來幫忙,只能靠自己動(dòng)手豐衣足食。在最初的版本中,Richard將每個(gè)SQL語句視為一個(gè)程序,他們實(shí)際上構(gòu)建了一個(gè)編譯器,將SQL語句轉(zhuǎn)化成了可執(zhí)行的匯編代碼,這其實(shí)就是最早的SQLite了。后來Richard的團(tuán)隊(duì)將SQLite發(fā)布在互聯(lián)網(wǎng)上,出乎他們的意料,很多人開始使用這個(gè)并不成熟的輕量級(jí)數(shù)據(jù)庫產(chǎn)品,并給出了熱情洋溢的評(píng)價(jià)與反饋,可能恰恰就是這些最初的鼓勵(lì),SQLite正式開啟了開源之路。
從摩托羅拉到諾基亞-Sqlite連獲大單
在SQLite誕生一年以后,Richard接到了摩托羅拉的電話,當(dāng)時(shí)摩托羅拉正在設(shè)計(jì)一個(gè)新的手機(jī)操作系統(tǒng),他們希望SQLite成為其手機(jī)上的數(shù)據(jù)庫引擎。收到邀請(qǐng)后,Richard立刻給出了肯定的答復(fù)。
經(jīng)過團(tuán)隊(duì)內(nèi)部的協(xié)商,Richard最終給出了8萬美元的報(bào)價(jià)。雖然按照實(shí)際的工作量來說,這錢不多,但對(duì)于當(dāng)時(shí)那個(gè)正在開源方面苦苦找尋方向的初創(chuàng)團(tuán)隊(duì)來講,第一桶金的價(jià)值根本無法用金錢衡量。
在順利完成摩托羅拉的項(xiàng)目之后,美國在線(AOL)也開始與Richard接觸,美國在線與Richard一道,完成了CD當(dāng)中的數(shù)據(jù)庫需求。
接下來是諾基亞的Symbian OS團(tuán)隊(duì),在諾基亞的選型中,SQLite打敗了其它10個(gè)數(shù)據(jù)庫引擎,成為了最終的勝出者。后續(xù)在接連得到Mozilla和Adobe的支持后,他們和Symbian共同組成了SQLite聯(lián)盟,這也為SQLite后續(xù)發(fā)展壯大添磚加瓦。
當(dāng)然SQLite能有今天的成就,最關(guān)鍵的一點(diǎn)在于他們?cè)谝苿?dòng)互聯(lián)網(wǎng)上的眼光非常超前,早在2005年,Richard就開始與Android的開發(fā)人員進(jìn)行了溝通,要知道3年之后Android被谷歌以4億美元收購后才真正在業(yè)界揚(yáng)名。不僅如此他們還為黑莓與IPhone,Windows Mobile都進(jìn)行了適配工作,這種押注賽道而非單品的風(fēng)格也值得我們學(xué)習(xí)。
可能是由于同性相吸,在全面進(jìn)行了驗(yàn)證工作后,SQLite團(tuán)隊(duì)選擇全力支持同樣也是開源項(xiàng)目的Android,因?yàn)镽ichard的團(tuán)隊(duì)完全可以在Android的Linux環(huán)境下用GDB調(diào)試SQLite,這個(gè)吸引力太大了。
升華-航空標(biāo)準(zhǔn)的嚴(yán)格測(cè)試
在經(jīng)歷了一段頗為順利的發(fā)展期之后,Richard和他的團(tuán)隊(duì)開始四處吹噓 SQLite是一款不存在任何錯(cuò)誤可能性的數(shù)據(jù)庫,不過在為航天公司羅克韋爾柯林斯工作的時(shí)候,Richard開始明白消費(fèi)級(jí)電子與航空技術(shù)對(duì)于基礎(chǔ)軟件的要求,完全不可同日而語。
羅克韋爾柯林斯向Richard介紹了 DO-178B 標(biāo)準(zhǔn)的概念,由于筆者并沒有在網(wǎng)上查到這項(xiàng)航空產(chǎn)品質(zhì)量標(biāo)準(zhǔn)的原文,所以下面就只能引用訪談原文中的大多介紹了,與許多質(zhì)量標(biāo)準(zhǔn)不同,DO-178B可讀性很強(qiáng),雖然也有一些官話套話,但只要遵守這個(gè)標(biāo)準(zhǔn)就可以真正提高軟件的質(zhì)量,雖然這是一本要花費(fèi)幾百美元卻還很薄的書,但Richard認(rèn)為這筆錢花得很值,達(dá)到航空標(biāo)準(zhǔn)的關(guān)鍵在于100% 的 MCDC 測(cè)試覆蓋率。
按照筆者的理解MCDC實(shí)際是一個(gè)形式化驗(yàn)證的過程,有點(diǎn)類似于操作系統(tǒng)SEL4的概念,這個(gè)驗(yàn)證標(biāo)準(zhǔn)不但要覆蓋所有的分支,還要覆蓋達(dá)到分支前所有可達(dá)的路徑,比如代碼執(zhí)行到第4個(gè)分支之前可以有1-2-3、3-2-1、3-1-2等等可達(dá)路徑,那么驗(yàn)證就要100% 覆蓋上述所有執(zhí)行路徑,而且這個(gè)覆蓋還要以匯編語言為基準(zhǔn)進(jìn)行。
Richard的團(tuán)隊(duì)用了整整一年996的代價(jià),完成了數(shù)十億個(gè)測(cè)試用例,才最終完成MCDC的工作。不過完成了這項(xiàng)工作后,SQLite也升級(jí)了,沒有重大錯(cuò)誤不再是一句空談的口號(hào)。
第一性構(gòu)建原則
個(gè)人認(rèn)為SQLite能夠成功最重要的原因還是在于,Richard團(tuán)隊(duì)使用第一性來構(gòu)建產(chǎn)品,隨著產(chǎn)品的不斷迭代,Richard總是自己動(dòng)手去實(shí)現(xiàn)算法,而不是從網(wǎng)上照搬原有的解決方案。就如Richard所說,在實(shí)際工作中,學(xué)校里學(xué)習(xí)的數(shù)據(jù)結(jié)構(gòu)知識(shí)可能早就忘光了,不過在SQLite用到B+樹的時(shí)候,Richard直接抄起《The Art of Computer Programming》,翻到搜索的章節(jié),找到B+樹的偽代碼,學(xué)習(xí)相關(guān)思想然后動(dòng)手實(shí)現(xiàn),光是這份執(zhí)著就值得我們學(xué)習(xí)。
給開源開發(fā)者的建議
現(xiàn)在的SQLite已經(jīng)是一個(gè)可以自我生長的完整生態(tài)了,Richard 的數(shù)據(jù)庫是世界上使用最多的數(shù)據(jù)庫,從某些方面來說,它是SQLite甚至是部署最廣泛的軟件模塊。
最初的SQLite僅僅源于一個(gè)不需要實(shí)體服務(wù)器,直接與磁盤交互的瘋狂想法,如果你當(dāng)時(shí)去問任何數(shù)據(jù)庫方面的專家,得到的結(jié)論都會(huì)是這種方案永遠(yuǎn)行不通。不過幸運(yùn)的是,Richard當(dāng)時(shí)不認(rèn)識(shí)任何專家,后來自己還成了專家,可以說開源最需要的是對(duì)夢(mèng)想的執(zhí)著,而不是理性的分析,這也是對(duì)我最大的啟發(fā)。

