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