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