拒絕背鍋!39 歲失業(yè)后,我寫出了一個(gè)超一萬億使用量的數(shù)據(jù)庫SQLite
當(dāng)前位置:點(diǎn)晴教程→知識(shí)管理交流
→『 技術(shù)文檔交流 』
1992 年,31 歲的 D. Richard Hipp 在 Hwaci. 公司負(fù)責(zé)技術(shù)開發(fā),他的專項(xiàng)團(tuán)隊(duì)中有一個(gè)客戶是巴斯鋼鐵廠,負(fù)責(zé)為 DDG-79 Oscar Austin 號(hào)開發(fā)軟件——那是一艘龐大、復(fù)雜、隨時(shí)都會(huì)出毛病的戰(zhàn)艦。 當(dāng)時(shí)的數(shù)據(jù)庫 Informix 運(yùn)行得并不好,有時(shí)候服務(wù)器會(huì)宕機(jī),導(dǎo)致應(yīng)用程序無法運(yùn)行。船員雙擊這款軟件后會(huì)彈出對(duì)話框報(bào)錯(cuò):“無法連接到數(shù)據(jù)庫服務(wù)器”,而負(fù)責(zé)此項(xiàng)目的 Richard 團(tuán)隊(duì)對(duì)此無可奈何,因?yàn)樗麄儫o權(quán)控制數(shù)據(jù)庫服務(wù)器。 Richard 之所以被選中,是因?yàn)樗騺硪阅芙鉀Q難題而聞名?!邦^頂著技術(shù)團(tuán)隊(duì)的名號(hào),出的問題還是要由我們背鍋,畢竟對(duì)話框這塊可是我們負(fù)責(zé)的。”Richard 說道。 Richard 團(tuán)隊(duì)的思路是哪怕在戰(zhàn)斗中受損,整個(gè)船舶系統(tǒng)也應(yīng)該能夠正常工作,因此數(shù)據(jù)庫必須可靠。事實(shí)上,他們做的事情很簡單,就是把數(shù)據(jù)讀入 RAM——不做事務(wù)處理、不做任何類似的操作,只是把數(shù)據(jù)拉入內(nèi)存。 這給了 Richard 這樣的領(lǐng)悟:我們?yōu)槭裁捶堑眯枰?wù)器?為什我不能直接從磁盤驅(qū)動(dòng)器上把數(shù)據(jù)提取出來?這樣如果計(jì)算機(jī)運(yùn)行狀態(tài)良好,它就能運(yùn)行應(yīng)用程序,整個(gè)流程中不再存在可能導(dǎo)致失敗的依賴項(xiàng)。 但四處打探后,他發(fā)現(xiàn)當(dāng)時(shí)根本就沒有能做到這一點(diǎn)的 SQL 數(shù)據(jù)庫引擎。之后,Richard 的一位同事提醒道:
Richard 回應(yīng)了,但并沒有立馬動(dòng)手。2000 年左右,公司資金中斷,當(dāng)時(shí)恰逢紐特·金里奇和比爾·克林頓就國會(huì)預(yù)算案發(fā)生了爭執(zhí),導(dǎo)致所有政府合同都被取消了,Richard 被迫失業(yè)了好幾個(gè)月。 “閑著也是閑著,正好來寫那個(gè)數(shù)據(jù)庫引擎。”就這樣,Richard 開始了 SQLite 的研發(fā)。 2000 年時(shí),人們主要使用撥號(hào)上網(wǎng),只有 1% 的美國家庭擁有網(wǎng)絡(luò)帶寬,因此 Richard 不像現(xiàn)在的人們那樣可以谷歌搜索學(xué)會(huì)構(gòu)建數(shù)據(jù)庫。 但他根據(jù)自己先前的編譯器構(gòu)建經(jīng)驗(yàn)制定了一項(xiàng)清晰的計(jì)劃:如果把每一條 SQL 語句視為一個(gè)程序,那自己的任務(wù)就是把這些程序編譯成某種可執(zhí)行的代碼。 因此,Richard 編寫了一套能夠?qū)嶋H運(yùn)行查詢的字節(jié)碼引擎,之后又編寫了一款編譯器,用于將 SQL 轉(zhuǎn)換成相應(yīng)的字節(jié)碼。就這樣,SQLite 誕生了。 可惜它并沒有在 Richard 當(dāng)時(shí)從事的戰(zhàn)艦項(xiàng)目上發(fā)揮作用,因?yàn)槟莻€(gè)項(xiàng)目被關(guān)閉了。后來項(xiàng)目重啟,Richard 嘗試把 SQLite 引入其中進(jìn)行測試。不過遺憾的是客戶堅(jiān)持使用 Informix?!暗故强梢岳斫?,但 Informix 在開發(fā)方面的使用感受真的很差?!盧ichard 說道。 為了不浪費(fèi),Richard 把它放在了互聯(lián)網(wǎng)上,于是有更多人開始使用?!爱?dāng)時(shí)還沒有 Twitter 之類的東西,但已經(jīng)有帖子說‘哇,我在自己的 Palm Pilot PDA 設(shè)備上運(yùn)行 SQL 數(shù)據(jù)庫啦!’不開玩笑,這樣的事情當(dāng)時(shí)確實(shí)吸引到很多人的關(guān)注,這也激勵(lì)著我繼續(xù)做研究和開發(fā)。”Richard 表示。 “我最早開始編寫 SQLite 的時(shí)候,曾經(jīng)到處搜尋,想要看看有沒有關(guān)于如何編寫 SQL 數(shù)據(jù)庫引擎的參考資料??晌沂裁炊紱]找到,所以只能邊做邊學(xué)邊發(fā)明。這是個(gè)完全由自己摸索出來的路徑。”Richard 說道。 大部分理論都是由麻省理工學(xué)院、哈佛大學(xué)、劍橋大學(xué)或者伯克利大學(xué)的研究小組提出的,而如果大家沒上過這些學(xué)校,就很可能完全沒聽說過這些理論,更沒有靠譜的方式能夠查詢相關(guān)資料。 但奇怪的是,如果回頭看看 Postgres 使用的火山模型和 SQLite 曾經(jīng)使用的字節(jié)碼模型,就會(huì)發(fā)現(xiàn)大家都不約而同選擇了類似的方向。這些方案雖然從宏觀來講起點(diǎn)各不相同,但大家在如何提高速度表現(xiàn)方面卻意見統(tǒng)一,所以 Richard 認(rèn)為這也是對(duì)理論的一種印證,兩條獨(dú)立的開發(fā)路徑得出了同樣的答案。 例如,Richard 就從來沒聽說過覆蓋索引。只是在一場位于德國的 PHP 大會(huì)上,他見到了 MySQL 初創(chuàng)團(tuán)隊(duì)成員之一的 David Axmark,Axmark 解釋了 MySQL 是如何實(shí)現(xiàn)覆蓋索引的。Richard 想,“哇哦,這個(gè)想法簡直天才!”于是在回途的飛機(jī)上就開始為 SQLite 編寫覆蓋索引。 “其實(shí)我只是在到處借鑒。”Richard 說道,人們會(huì)分享自己的心得,有人會(huì)主動(dòng)找他:
之后它就成了 SQLite 的一部分。這就是邊做邊學(xué)邊發(fā)明的好處。 SQLite 開發(fā)出來的頭一兩年,Richard 忙于推進(jìn)他的數(shù)據(jù)庫項(xiàng)目。突然,有一天他接到了當(dāng)時(shí)科技巨頭摩托羅拉打來的電話。
當(dāng)時(shí) Richard 的內(nèi)心一陣狂跳——居然還能靠做開源軟件賺錢?真有這樣的事?我該定多少錢?怎么辦怎么辦……Richard 四下搜索,想出了幾種定價(jià)策略。摩托羅拉當(dāng)時(shí)還有改進(jìn)要求,需要適應(yīng)手機(jī)硬件,于是 Richard 報(bào)了 8 萬美元左右?!霸诋?dāng)時(shí)的我看來,那數(shù)字簡直就是在明搶,可以說貴得離譜?!?/p> 后來,Richard 又找來三位前同事一起做這個(gè)項(xiàng)目,而這就是 SQLite 項(xiàng)目起飛的原點(diǎn)。 而真正讓 SQLite 走上成功道路的是諾基亞手機(jī)的操作系統(tǒng)塞班。塞班打電話希望 Richard 在感恩節(jié)那天能飛一趟倫敦總部。去了之后,Richard 才發(fā)現(xiàn),塞班之前已經(jīng)搞了一場大規(guī)模的招標(biāo),從中挑選出塞班系統(tǒng)的數(shù)據(jù)庫引擎。 當(dāng)時(shí)參加選拔的大約有 10 種不同的數(shù)據(jù)庫引擎,其中有兩款是開源項(xiàng)目,另外七款屬于專有產(chǎn)品。塞班在數(shù)據(jù)集上運(yùn)行了這些引擎,想看看哪種最適合自己的需求,最后 SQLite 順利勝出。塞班還給了其他九家調(diào)整的機(jī)會(huì),但最后又是 SQLite 贏了。 Richard 過去后,塞班的人對(duì) SQLite 大加贊賞,同時(shí)又提出了一些改進(jìn)要求。之后,雙方簽訂了合同,由 Richard 負(fù)責(zé)做相應(yīng)的開發(fā)。 當(dāng)時(shí) Richard 幾人真的是盡心盡力,Richard 本人差不多是全職在做這方面工作了。 但是,后來塞班的人告訴他們:“不好意思,你得想辦法提高巴士因子?!彼麄冇X得 SQLite 的巴士因子不夠……所以希望建立一個(gè) SQLite 聯(lián)盟,讓更多人參與進(jìn)來以保證項(xiàng)目長期存續(xù)。 注:所謂巴士因子,就是說一支團(tuán)隊(duì)里有多少成員意外被巴士撞了(或者受其他偶發(fā)因素影響而無法繼續(xù)工作),才會(huì)導(dǎo)致項(xiàng)目陷入停滯。 接到需求后,Richard 開始推動(dòng)這項(xiàng)重要工作,但他其實(shí)也不知道該怎么做。后來,當(dāng)時(shí) Mozilla 基金會(huì)的負(fù)責(zé)人 Michell Baker 聽到了風(fēng)聲,主動(dòng)給他打電話說:“Richard,你的做法有問題,讓我來告訴你怎么建立一個(gè)聯(lián)盟?!?/p> Baker 制定了規(guī)則,強(qiáng)調(diào)“開發(fā)者必須掌控一切,開發(fā)者的決定就是最終決定。對(duì)于批準(zhǔn)哪些內(nèi)容加入項(xiàng)目,其他人沒有投票權(quán)。企業(yè)參與者只有享受成果和貢獻(xiàn)資金的榮譽(yù)頭銜,但決定還是要由你自己掌握?!彼龑?duì)此非常堅(jiān)定,而且對(duì)我可以說是知無不言、言無不盡。 Baker 是律師出身,我問她“那要怎么吸引人們加入?得設(shè)置怎樣的激勵(lì)措施?”她回答道,“別擔(dān)心,人們肯定會(huì)加入的。只要按我的辦法來,Mozilla 首先就會(huì)成為創(chuàng)始成員之一。”而在聯(lián)盟計(jì)劃公布后,果然吸引到了 Mozilla、塞班和 Adobe 的支持,各方共同成立了 SQLite 聯(lián)盟。 值得一提的是,SQLite 的版權(quán)聲明中還有一條:Open-Source, not Open-Contribution(開源,但是并不開放代碼貢獻(xiàn))。因此,至今 SQLite 項(xiàng)目總共只有三位開發(fā)人員 D. Richard Hipp、Dan Kennedy 和 Joe Mistachkin。 構(gòu)建智能手機(jī)這樣的嵌入式開發(fā)是個(gè)緩慢的過程,需要長時(shí)間的迭代循環(huán),更需要花時(shí)間等待各種功能在原型設(shè)計(jì)中一一體現(xiàn),人們只能在看起來跟成品完全不同的“坯子”上進(jìn)行開發(fā)。 谷歌聯(lián)系了 Richard,當(dāng)時(shí)的搜索巨頭還跟手機(jī)或者嵌入式開發(fā)牽不上半點(diǎn)關(guān)系。 2005 年左右,Richard 幾人正在跟 Android 開會(huì),那時(shí)候這款如今聲名大噪的操作系統(tǒng)還沒真正出現(xiàn),當(dāng)時(shí)也沒有 iPhone。那時(shí)候的手機(jī)下方是完整的 QEWRTY 全鍵盤,上方則是個(gè)較小的顯示窗口。 Richard 團(tuán)隊(duì)使用 SQLite 進(jìn)行調(diào)試:端連著手機(jī),另一端在工作站上運(yùn)行調(diào)試器。“這種感覺挺神奇的。其他人都不會(huì)干,而當(dāng)我們把手機(jī)接入調(diào)試器時(shí),電話響了。這位同事看了一眼說,‘哦,是我老婆,我得接個(gè)電話,不好意思?!译x開了房間,留他慢慢跟妻子聊天?!?/p> 當(dāng)時(shí) Richard 雖然表面上不露聲色,但腦袋里卻炸開了鍋?!拔覀兙尤辉诮又簿W(wǎng)絡(luò)的手機(jī)上調(diào)試應(yīng)用程序,而且完全不耽誤正常通話,這真是太令人震驚了。無論是摩托羅拉、塞班還是諾基亞,當(dāng)時(shí)都沒人能做到這一點(diǎn)。就在那個(gè)瞬間,我就知道 Android 絕對(duì)會(huì)大獲成功?!?/p> 不過幸福之后,煩惱也會(huì)隨之而來。 “我們曾經(jīng)天真地宣傳,SQLite 從不出錯(cuò),至少不會(huì)搞出嚴(yán)重的 bug。但 Android 證明我們還是太過年輕、有時(shí)幼稚。我以前真的以為能編寫出沒有 bug 的軟件,可一旦軟件被發(fā)布到數(shù)百萬臺(tái)設(shè)備上時(shí),引發(fā)的 bug 數(shù)量絕對(duì)會(huì)多到難以想象?!盧ichard 回憶道。 當(dāng)時(shí)還在為航空電子設(shè)備制造商 Rockwell Collins 工作的 Richard,了解到了 DO-178B 的概念,他意識(shí)到其中最有價(jià)值、最關(guān)鍵的理念之一,就是要求實(shí)現(xiàn) 100% 的 MCDC 測試覆蓋率。 注:MCDC,指的是確定代碼修改條件的決策覆蓋率。也就是說測試必須保證所生成二進(jìn)制代碼中的每個(gè)分支操作至少跑通一次。 受到啟發(fā)后的 Richard 決定通過編寫測試讓 SQLite 也達(dá)到 100% 的 MCDC 覆蓋率,而這花了他整整一年的時(shí)間,每周要工作 60 個(gè)小時(shí)。 “這項(xiàng)工作相當(dāng)相當(dāng)艱苦,我每天要干 12 個(gè)小時(shí)。這段經(jīng)歷真的讓我感到厭倦,而且相信大家都聽過一句老生常談:我們用前 95% 的預(yù)算干完了 95% 的工作,再用另外 95% 的預(yù)算做完最后 5%。實(shí)際情況確實(shí)如此,把測試覆蓋率推到 90% 甚至 95% 都很容易,可最后這 5% 則是難而又難,我花了大約一年時(shí)間才達(dá)成這個(gè)目標(biāo)?!盧ichard 回憶時(shí)說道。 對(duì)于典型的發(fā)布周期,他們要運(yùn)行十億級(jí)別的測試,大約有 10 萬個(gè)不同的測試用例。他們的第一項(xiàng)測試是用 TCL 編寫的,真正 100% 覆蓋的 MCDC 測試名叫 TH3,屬于專有成果。Richard 本來希望把這些測試出售給航空電子設(shè)備制造商賺點(diǎn)錢,但一份都沒賣出去。 團(tuán)隊(duì)有一個(gè)叫 SQL 邏輯測試的工具,目的是設(shè)法讓每種數(shù)據(jù)庫引擎都出現(xiàn)段錯(cuò)誤,其中也包括 SQLite?!拔覀兏惚肋^ Oracle,包括 Oracle 的商用版本。我們搞崩過 DB2,嘗試把我們能接觸到的所有數(shù)據(jù)庫并努力把它搞崩。”Richard 提到,唯一的例外就是 Postgres,它的穩(wěn)定性給 Richard 留下了非常深刻的印象。 總之,提高測試覆蓋率成了一項(xiàng)深遠(yuǎn)影響的決策,Richard 團(tuán)隊(duì)在接下來的八、九年里再也沒遇到過任何 bug。 SQLite 基本上全都是 Richard 親自動(dòng)手開發(fā)的依賴項(xiàng)。除了 C 編譯器和 libc 之類的現(xiàn)成方案,他甚至構(gòu)建了自己的源代碼控制系統(tǒng)和 bug 跟蹤器??傊?,Richard 的項(xiàng)目都由他來掌握。 “人們?nèi)ケ嘲眯谢蛲讲?,表面上看是種自由,但實(shí)際上途中到底如何取決于他們的背包準(zhǔn)備得是否充足。因此,他們討論的自由其實(shí)就是自己到底為此付出了多少心力?!盧ichard 說道,“所以當(dāng)我們編寫自己的項(xiàng)目時(shí),肯定可以享受其中的自由、不再受到其他人的約束。畢竟我們不依賴于不同供應(yīng)商直接提供的現(xiàn)成方法。” 就像當(dāng)初選擇使用本來開源的 Berkeley DB 作為 SQLite v2 版本的存儲(chǔ)引擎的話,當(dāng)它被賣給甲骨文、成了雙源專有模型后,本來理想的情況就變得相當(dāng)被動(dòng)。 SQLite 中的解析器生成器 Lemon 是多年之前 Richard 親手編寫的?!懊慨?dāng)我需要一些無法從 Yacc 或者 GNU Bison 處獲得的新型語言功能時(shí),由于擁有對(duì)解析器生成器的掌控權(quán),我可以隨時(shí)調(diào)整 SQLite 的版本控制系統(tǒng)并做出自己想要的調(diào)整?!?/p> 他最初使用 CSV,因?yàn)?2000 年那會(huì)兒每個(gè)項(xiàng)目都在使用 CVS, 而進(jìn)入 2000 年代中期后則需要更好的系統(tǒng)。Richard 先后研究了 Git、Mercurial,又回顧了自己的需求,突然發(fā)現(xiàn)“得自己寫一個(gè)才行”。于是 Richard 編寫了自己的版本控制系統(tǒng),而現(xiàn)在它本身也成了獨(dú)立的項(xiàng)目,而且效果非常好。 “因?yàn)槭亲约河H力親為,所以它能夠充分滿足我的需求,可以跟一切原有、現(xiàn)有及未來將要出現(xiàn)的工作場景相契合?!盧ichard 說道,“這種自己動(dòng)手方式能把命運(yùn)把握在自己指尖,以擺脫第三方的方式真正擁抱自由?!?/p> 原文鏈接: https://corecursive.com/066-sqlite-with-richard-hipp/ 該文章在 2024/8/19 18:35:19 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |