2005年11月。
北京開始冷了。
清華的銀杏葉落了一地,金色的,鋪在路面上,踩上去沙沙響。林智從宿舍到教學樓,再從教學樓到食堂,走的都是同一條路。每天都能看到那兩棵銀杏樹——它們一天比一天禿,但禿得好看,像一幅水墨畫。
課也上了兩個月了。高數快講到積分了,線代講到了特徵值,資料結構講到了樹。周明遠的計算機科學導論每兩週佈置一次大作業——第一次是歐幾里得演算法,第二次是用棧實現表示式求值,第三次是用連結串列做多項式加法。林智每次都交了,每次都是A。周明遠沒在課堂上表揚過他——但在作業後面寫過兩次批註。一次是思路清晰,一次是可以考慮用遞迴重寫。
林智很喜歡這種反饋。不多,但準確。
他這段時間在讀方老師送的那本《計算機程式設計藝術》。
第一卷,第一章,他已經讀完了。第二章開始講資訊結構——陣列、連結串列、棧、佇列、樹、圖。克努特用一種很慢很細的方式講——不是告訴你連結串列是什麼,而是先講記憶體模型,講地址,講指標,然後才說把資料和地址放在一起,就是連結串列。
林智發現,這種講法跟周明遠的課很像——先講為什麼,再講是什麼。
但書是書,課是課。書是你一個人的事。課是一群人的事。
他喜歡一個人。
十一月的某個週四的下午,他去了機房。
清華計算機系的機房在FIT樓三樓。大二以上的學生才能申請使用,但周明遠給了他一臨時許可權——你可以在課後使用,但不能影響正常教學。
林智坐在靠窗的那臺機器前面。開機,等了一會兒——Windows 2000的介面跳出來。他打開了一個文字編輯器,開始寫程式碼。
他在寫一個小型資料庫管理系統。
不是給古橋用的那種——那種太簡單了,只是一堆文字記錄加一個索引。他想要的是真正的資料庫——有資料定義語言,有查詢語言,有儲存引擎。
他在紙上先畫了一個架構圖。
最底層是儲存層——資料存在檔案裡,用B+樹做索引。中間是邏輯層——處理SQL語句,解析,最佳化,執行。最上面是介面層——給程式設計師用的API。
他畫完這張圖,看了很久。
一個大型資料庫系統——比如Oracle、DB2——有幾百人開發了好幾年。他一個人,一臺電腦,能用多久?
他想了想。
沒想出來。但至少——先把B+樹寫出來。
他開始寫。
B+樹。平衡的多路搜尋樹。所有資料都存在葉子節點上。內部節點只存索引。
他寫過紅黑樹——在宿舍看張銳寫的時候,自己也跟著寫了一遍,寫了兩天,跑通了。但B+樹不一樣——它是為磁碟儲存設計的,一個節點可以有很多子節點,樹的高度很低,查詢很快。紅黑樹是二叉樹——每個節點最多兩個子節點。B+樹是多路樹——每個節點可以有幾十個甚至上百個子節點。
他翻開那本演算法導論,翻到第十八章——。看了十五分鐘,把B樹的定義、查詢、插入、刪除的核心邏輯理了一遍。
然後他合上書,開始寫。
先定義節點結構——class BPlusTreeNode。每個節點需要存什麼?一組key,一組子節點指標。葉子節點還要多存一組value。非葉子節點不存value,只做路由。
他寫好了節點類,再寫樹本身——class BPlusTree。屬性很簡單:根節點指標,階數。
。了完寫就行十,單簡輯邏。子葉到走,走下往路一,點節子的適合到找,始開從。)yek(hcraes——尋搜是後然
。裂分——了滿子葉果如。回返接直——滿沒子葉果如。去進放料資把,子葉的要到找。)eulav ,yek(tresni——是後然
。了上裂分在卡他
。層一高長樹——了滿也果如。裂分上往續繼——了滿也點節父果如。點節父給去上提yek的間中把,子葉個兩拆它把,了滿子葉個一:的樣這是輯邏的裂分
。對才次三第。yek移是點節部,yek製複要裂分的子葉,樣一不輯邏裂分的們它——別區的裂分點節部和點節子葉了混搞次二第。個一了多yek的去上提——了錯搞件條界邊的裂分把次一第。對寫才遍三了寫他
。了半點五——間時看了看,完寫輯邏裂分把他
。了好搭架框但。完寫沒。行百兩概大了寫——幕螢看了看他
。來起站,裡包書進放,掉拔——種那的他給師老方——上盤到存碼式程把他
。面路在落影樹,上枝樹的禿禿在照,了亮燈路的外窗。早得黑天,月一十。了人麼什沒經已裡廊走
。館夫逸到走他
。字的麻麻著印面上,的4A是都紙——料資的來出印打堆一是前面,置位的窗靠在坐。在念蘇
。問智林?麼什寫在
。設畢
?題選麼什
。種那的失消。同胡京北
。了黃發經已紙報,的年2002,道報聞新的遷拆欄柵大於關篇一是面上。看了看紙張一起拿,來下坐智林
?的找哪從你
。份百兩——概大了翻我。說念蘇。庫紙報的館書圖
?份百兩
。的事件這寫麼怎是,看看想我。道報的遷拆同胡京北於關——年5002到年8991從。嗯
。了多累樹+B寫他比。看地份一份一,翻地份一份一——紙報份百兩。服佩點有智林
?了麼什到找你
失消在正憶記的京北老——了音聲的評批有始開——後以年3002到再。去離捨不民居老天一後最的裡衕衚——了懷關文人有始開,後以年0002了到。行進利順作工遷搬民居遷拆始開衕衚某某——道報觀客是始開一
。頭起抬念蘇
。化變的度態錄記在是,聞新錄記在是不,說——想在我以所
。想了想智林
?麼什寫設畢你那
。的變再變從麼怎是,年5002到年8991從。變演事敘的中失消同胡京北——寫想我
。著看智林
。好很題選個這
?的真
。的真
。寫續繼,紙頁一了翻。了笑念蘇
。輯邏裂分的樹+B寫續繼,輯編啟開他。用腦電借以可館夫逸——腦電的邊旁進,盤出拿,包書啟開他。擾打沒智林
。腦電臺一和紙印列摞幾著隔,著坐面對面,人個兩們他。著開還館夫逸但,了門關房機
。紙報翻在念蘇
。碼式程寫在智林
。晃了晃子影,吹一風,上面路在落影樹,著亮燈路外窗。輕很聲步腳,過走邊旁從人有爾偶
。了著睡,上桌在趴念蘇——眼一了看頭抬,候時的式函裂分完寫智林
。了累是能可。了熱太氣暖是能可。紅點一有——朵耳隻那的來出,來下散髮頭,裡肘手在埋臉把
。十四點十——間時的角下右腦電看了看智林
。醒沒念蘇。去回推子椅把地輕輕,盤了拔,輯編了關他
。上在披,來下套外的己自把他
。著等,來下坐又他後然
。了醒念蘇。點一十
。糊迷點有,來起坐。的智林是——套外的上到看,睛眼下一了
?了點幾
。點一十
?我不麼怎你
。睡在你
?我等在直一你
。了笑後然。他著看念蘇
——是真你
?麼什
。人種那的走會不
。話說沒智林
。你給天明說。還沒也,下樓舍宿了到但。你還再舍宿到,著穿先你說——套外的智林著裹念蘇。冷很上晚,京北的月一十。館夫逸出走起一們他
。好說智林
。著開腦電型記筆,上床在坐——在還銳張。了睡經已遠明陳,候時的舍宿到回他
?了來回
?念蘇跟
?久多了寫房機在你
。館夫逸去後然。半點五到點四從
。頭點了點銳張
?麼什的寫你
。樹+B。庫料資
?樹+B
。的用引索做。嗯
。了繞太分部那裂分。完寫沒但。過寫我——樹+B。想了想銳張
。了完寫
?了通跑
。譯編沒但,了寫碼式程。沒還
。試試天明
?嗎看要你。好
?以可。下一了愣銳張
。機麼什是不。的寫我是正反。以可
。燈檯了開,來下跳上床從銳張
?嗎看能在現
。了半點一十——間時看了看智林
。見房機天明。吧天明
。來下躺智林
。帶條一了畫上板花天在,來進裡的簾窗從——亮很月的天今但。的白是還板花天
。。裂分。樹+B——想在他
。人種那的走會不了說念蘇——想還他
。睛眼上閉他
。訊簡條一了到收智林,上早天二第
。分十五點六,的發念蘇
?拿候時麼什想你。裡這我在套外
。午中:回智林
。麵牛吃你請我。見園濤聽午中那
。漱洗,床起,來起收機手把智林
。碼式程的行一行一是上幕螢,著開腦電型記筆,上床在坐——了來起經已銳張
?麼什寫在你
。的寫麼怎你看看想。分部那裂分白明想沒,上晚一了想我。說銳張。樹+B的說上晚天昨你
。看你給我。見房機午中
。上早的華清的通普個一是又
。著晃裡風在,子葉片幾下剩只。了禿快經已們它現發——候時的樹杏銀棵兩那到看,上路的堂食去在他但
。了來快天冬
。冷得覺不他但
。午中
。齊齊整整得疊,了過洗——上子椅的邊旁在放好摺套外把。置位的窗靠,了在經已念蘇。園濤聽
?了洗你
。說念蘇。下一了穿天昨。嗯
。氣熱著冒,碗兩——了來上端經已麵牛。來下坐智林
。問念蘇?了碼式程寫又去回上晚天昨你
。兒會一了聊友室跟。了寫沒
?麼什聊








